@hyperlane-xyz/core 3.11.0-beta-0 → 3.11.1

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 (346) hide show
  1. package/contracts/client/MailboxClient.sol +39 -0
  2. package/contracts/hooks/warp-route/RateLimitedHook.sol +58 -0
  3. package/contracts/interfaces/hooks/IPostDispatchHook.sol +2 -1
  4. package/contracts/isms/TrustedRelayerIsm.sol +27 -0
  5. package/contracts/isms/warp-route/RateLimitedIsm.sol +53 -0
  6. package/contracts/libs/RateLimited.sol +107 -0
  7. package/contracts/test/ERC20Test.sol +38 -0
  8. package/contracts/test/TestPostDispatchHook.sol +11 -7
  9. package/contracts/token/HypNative.sol +9 -1
  10. package/contracts/token/{HypERC20CollateralVaultDeposit.sol → extensions/HypERC20CollateralVaultDeposit.sol} +1 -1
  11. package/contracts/token/extensions/HypFiatTokenCollateral.sol +32 -0
  12. package/contracts/token/extensions/HypNativeScaled.sol +8 -1
  13. package/contracts/token/extensions/HypXERC20Collateral.sol +26 -0
  14. package/contracts/token/interfaces/IFiatToken.sol +24 -0
  15. package/contracts/token/interfaces/IXERC20.sol +24 -0
  16. package/contracts/token/libs/TokenRouter.sol +63 -7
  17. package/dist/buildArtifact.d.ts +1 -0
  18. package/dist/buildArtifact.js +2 -0
  19. package/{buildArtifact.json → dist/buildArtifact.json} +1 -1
  20. package/dist/contracts/hooks/index.d.ts +2 -0
  21. package/dist/contracts/hooks/index.d.ts.map +1 -1
  22. package/dist/contracts/hooks/warp-route/RateLimitedHook.d.ts +521 -0
  23. package/dist/contracts/hooks/warp-route/RateLimitedHook.d.ts.map +1 -0
  24. package/dist/contracts/hooks/warp-route/RateLimitedHook.js +2 -0
  25. package/dist/contracts/hooks/warp-route/RateLimitedHook.js.map +1 -0
  26. package/dist/contracts/hooks/warp-route/index.d.ts +2 -0
  27. package/dist/contracts/hooks/warp-route/index.d.ts.map +1 -0
  28. package/dist/contracts/hooks/warp-route/index.js +2 -0
  29. package/dist/contracts/hooks/warp-route/index.js.map +1 -0
  30. package/dist/contracts/isms/TrustedRelayerIsm.d.ts +95 -0
  31. package/dist/contracts/isms/TrustedRelayerIsm.d.ts.map +1 -0
  32. package/dist/contracts/isms/TrustedRelayerIsm.js +2 -0
  33. package/dist/contracts/isms/TrustedRelayerIsm.js.map +1 -0
  34. package/dist/contracts/isms/index.d.ts +3 -0
  35. package/dist/contracts/isms/index.d.ts.map +1 -1
  36. package/dist/contracts/isms/warp-route/RateLimitedIsm.d.ts +491 -0
  37. package/dist/contracts/isms/warp-route/RateLimitedIsm.d.ts.map +1 -0
  38. package/dist/contracts/isms/warp-route/RateLimitedIsm.js +2 -0
  39. package/dist/contracts/isms/warp-route/RateLimitedIsm.js.map +1 -0
  40. package/dist/contracts/isms/warp-route/index.d.ts +2 -0
  41. package/dist/contracts/isms/warp-route/index.d.ts.map +1 -0
  42. package/dist/contracts/isms/warp-route/index.js +2 -0
  43. package/dist/contracts/isms/warp-route/index.js.map +1 -0
  44. package/dist/contracts/libs/RateLimited.d.ts +304 -0
  45. package/dist/contracts/libs/RateLimited.d.ts.map +1 -0
  46. package/dist/contracts/libs/RateLimited.js +2 -0
  47. package/dist/contracts/libs/RateLimited.js.map +1 -0
  48. package/dist/contracts/libs/index.d.ts +1 -0
  49. package/dist/contracts/libs/index.d.ts.map +1 -1
  50. package/dist/contracts/test/{ERC20Test.d.ts → ERC20Test.sol/ERC20Test.d.ts} +1 -1
  51. package/dist/contracts/test/ERC20Test.sol/ERC20Test.d.ts.map +1 -0
  52. package/dist/contracts/test/ERC20Test.sol/ERC20Test.js.map +1 -0
  53. package/dist/contracts/test/ERC20Test.sol/FiatTokenTest.d.ts +423 -0
  54. package/dist/contracts/test/ERC20Test.sol/FiatTokenTest.d.ts.map +1 -0
  55. package/dist/contracts/test/ERC20Test.sol/FiatTokenTest.js +2 -0
  56. package/dist/contracts/test/ERC20Test.sol/FiatTokenTest.js.map +1 -0
  57. package/dist/contracts/test/ERC20Test.sol/XERC20Test.d.ts +423 -0
  58. package/dist/contracts/test/ERC20Test.sol/XERC20Test.d.ts.map +1 -0
  59. package/dist/contracts/test/ERC20Test.sol/XERC20Test.js +2 -0
  60. package/dist/contracts/test/ERC20Test.sol/XERC20Test.js.map +1 -0
  61. package/dist/contracts/test/ERC20Test.sol/index.d.ts +4 -0
  62. package/dist/contracts/test/ERC20Test.sol/index.d.ts.map +1 -0
  63. package/dist/contracts/test/ERC20Test.sol/index.js +2 -0
  64. package/dist/contracts/test/ERC20Test.sol/index.js.map +1 -0
  65. package/dist/contracts/test/TestPostDispatchHook.d.ts +20 -1
  66. package/dist/contracts/test/TestPostDispatchHook.d.ts.map +1 -1
  67. package/dist/contracts/test/index.d.ts +2 -1
  68. package/dist/contracts/test/index.d.ts.map +1 -1
  69. package/dist/contracts/token/HypERC20.d.ts +9 -8
  70. package/dist/contracts/token/HypERC20.d.ts.map +1 -1
  71. package/dist/contracts/token/HypERC20Collateral.d.ts +9 -8
  72. package/dist/contracts/token/HypERC20Collateral.d.ts.map +1 -1
  73. package/dist/contracts/token/HypERC721.d.ts +9 -8
  74. package/dist/contracts/token/HypERC721.d.ts.map +1 -1
  75. package/dist/contracts/token/HypERC721Collateral.d.ts +9 -8
  76. package/dist/contracts/token/HypERC721Collateral.d.ts.map +1 -1
  77. package/dist/contracts/token/HypNative.d.ts +9 -8
  78. package/dist/contracts/token/HypNative.d.ts.map +1 -1
  79. package/dist/contracts/token/extensions/FastHypERC20.d.ts +9 -8
  80. package/dist/contracts/token/extensions/FastHypERC20.d.ts.map +1 -1
  81. package/dist/contracts/token/extensions/FastHypERC20Collateral.d.ts +9 -8
  82. package/dist/contracts/token/extensions/FastHypERC20Collateral.d.ts.map +1 -1
  83. package/dist/contracts/token/{HypERC20CollateralVaultDeposit.d.ts → extensions/HypERC20CollateralVaultDeposit.d.ts} +10 -9
  84. package/dist/contracts/token/extensions/HypERC20CollateralVaultDeposit.d.ts.map +1 -0
  85. package/dist/contracts/token/extensions/HypERC20CollateralVaultDeposit.js.map +1 -0
  86. package/dist/contracts/token/extensions/HypERC721URICollateral.d.ts +9 -8
  87. package/dist/contracts/token/extensions/HypERC721URICollateral.d.ts.map +1 -1
  88. package/dist/contracts/token/extensions/HypERC721URIStorage.d.ts +9 -8
  89. package/dist/contracts/token/extensions/HypERC721URIStorage.d.ts.map +1 -1
  90. package/dist/contracts/token/extensions/HypFiatTokenCollateral.d.ts +646 -0
  91. package/dist/contracts/token/extensions/HypFiatTokenCollateral.d.ts.map +1 -0
  92. package/dist/contracts/token/extensions/HypFiatTokenCollateral.js +2 -0
  93. package/dist/contracts/token/extensions/HypFiatTokenCollateral.js.map +1 -0
  94. package/dist/contracts/token/extensions/HypNativeScaled.d.ts +9 -8
  95. package/dist/contracts/token/extensions/HypNativeScaled.d.ts.map +1 -1
  96. package/dist/contracts/token/extensions/HypXERC20Collateral.d.ts +646 -0
  97. package/dist/contracts/token/extensions/HypXERC20Collateral.d.ts.map +1 -0
  98. package/dist/contracts/token/extensions/HypXERC20Collateral.js +2 -0
  99. package/dist/contracts/token/extensions/HypXERC20Collateral.js.map +1 -0
  100. package/dist/contracts/token/extensions/index.d.ts +3 -0
  101. package/dist/contracts/token/extensions/index.d.ts.map +1 -1
  102. package/dist/contracts/token/index.d.ts +2 -1
  103. package/dist/contracts/token/index.d.ts.map +1 -1
  104. package/dist/contracts/token/interfaces/IFiatToken.d.ts +269 -0
  105. package/dist/contracts/token/interfaces/IFiatToken.d.ts.map +1 -0
  106. package/dist/contracts/token/interfaces/IFiatToken.js +2 -0
  107. package/dist/contracts/token/interfaces/IFiatToken.js.map +1 -0
  108. package/dist/contracts/token/interfaces/IXERC20.d.ts +269 -0
  109. package/dist/contracts/token/interfaces/IXERC20.d.ts.map +1 -0
  110. package/dist/contracts/token/interfaces/IXERC20.js +2 -0
  111. package/dist/contracts/token/interfaces/IXERC20.js.map +1 -0
  112. package/dist/contracts/token/interfaces/index.d.ts +3 -0
  113. package/dist/contracts/token/interfaces/index.d.ts.map +1 -0
  114. package/dist/contracts/token/interfaces/index.js +2 -0
  115. package/dist/contracts/token/interfaces/index.js.map +1 -0
  116. package/dist/contracts/token/libs/FastTokenRouter.d.ts +9 -8
  117. package/dist/contracts/token/libs/FastTokenRouter.d.ts.map +1 -1
  118. package/dist/contracts/token/libs/TokenRouter.d.ts +9 -8
  119. package/dist/contracts/token/libs/TokenRouter.d.ts.map +1 -1
  120. package/dist/factories/contracts/Mailbox__factory.d.ts +1 -1
  121. package/dist/factories/contracts/Mailbox__factory.js +1 -1
  122. package/dist/factories/contracts/hooks/MerkleTreeHook__factory.d.ts +1 -1
  123. package/dist/factories/contracts/hooks/MerkleTreeHook__factory.js +1 -1
  124. package/dist/factories/contracts/hooks/OPStackHook__factory.d.ts +1 -1
  125. package/dist/factories/contracts/hooks/OPStackHook__factory.js +1 -1
  126. package/dist/factories/contracts/hooks/PausableHook__factory.d.ts +1 -1
  127. package/dist/factories/contracts/hooks/PausableHook__factory.js +1 -1
  128. package/dist/factories/contracts/hooks/ProtocolFee__factory.d.ts +1 -1
  129. package/dist/factories/contracts/hooks/ProtocolFee__factory.js +1 -1
  130. package/dist/factories/contracts/hooks/aggregation/ERC5164Hook__factory.d.ts +1 -1
  131. package/dist/factories/contracts/hooks/aggregation/ERC5164Hook__factory.js +1 -1
  132. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHookFactory__factory.d.ts +1 -1
  133. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHookFactory__factory.js +1 -1
  134. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHook__factory.d.ts +1 -1
  135. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHook__factory.js +1 -1
  136. package/dist/factories/contracts/hooks/igp/InterchainGasPaymaster__factory.d.ts +1 -1
  137. package/dist/factories/contracts/hooks/igp/InterchainGasPaymaster__factory.js +1 -1
  138. package/dist/factories/contracts/hooks/index.d.ts +1 -0
  139. package/dist/factories/contracts/hooks/index.d.ts.map +1 -1
  140. package/dist/factories/contracts/hooks/index.js +1 -0
  141. package/dist/factories/contracts/hooks/index.js.map +1 -1
  142. package/dist/factories/contracts/hooks/layer-zero/LayerZeroV1Hook__factory.d.ts +1 -1
  143. package/dist/factories/contracts/hooks/layer-zero/LayerZeroV1Hook__factory.js +1 -1
  144. package/dist/factories/contracts/hooks/layer-zero/LayerZeroV2Hook__factory.d.ts +1 -1
  145. package/dist/factories/contracts/hooks/layer-zero/LayerZeroV2Hook__factory.js +1 -1
  146. package/dist/factories/contracts/hooks/routing/DestinationRecipientRoutingHook__factory.d.ts +1 -1
  147. package/dist/factories/contracts/hooks/routing/DestinationRecipientRoutingHook__factory.js +1 -1
  148. package/dist/factories/contracts/hooks/routing/DomainRoutingHook__factory.d.ts +1 -1
  149. package/dist/factories/contracts/hooks/routing/DomainRoutingHook__factory.js +1 -1
  150. package/dist/factories/contracts/hooks/routing/FallbackDomainRoutingHook__factory.d.ts +1 -1
  151. package/dist/factories/contracts/hooks/routing/FallbackDomainRoutingHook__factory.js +1 -1
  152. package/dist/factories/contracts/hooks/warp-route/RateLimitedHook__factory.d.ts +329 -0
  153. package/dist/factories/contracts/hooks/warp-route/RateLimitedHook__factory.d.ts.map +1 -0
  154. package/dist/factories/contracts/hooks/warp-route/RateLimitedHook__factory.js +442 -0
  155. package/dist/factories/contracts/hooks/warp-route/RateLimitedHook__factory.js.map +1 -0
  156. package/dist/factories/contracts/hooks/warp-route/index.d.ts +2 -0
  157. package/dist/factories/contracts/hooks/warp-route/index.d.ts.map +1 -0
  158. package/dist/factories/contracts/hooks/warp-route/index.js +5 -0
  159. package/dist/factories/contracts/hooks/warp-route/index.js.map +1 -0
  160. package/dist/factories/contracts/isms/TrustedRelayerIsm__factory.d.ts +81 -0
  161. package/dist/factories/contracts/isms/TrustedRelayerIsm__factory.d.ts.map +1 -0
  162. package/dist/factories/contracts/isms/TrustedRelayerIsm__factory.js +118 -0
  163. package/dist/factories/contracts/isms/TrustedRelayerIsm__factory.js.map +1 -0
  164. package/dist/factories/contracts/isms/index.d.ts +2 -0
  165. package/dist/factories/contracts/isms/index.d.ts.map +1 -1
  166. package/dist/factories/contracts/isms/index.js +2 -0
  167. package/dist/factories/contracts/isms/index.js.map +1 -1
  168. package/dist/factories/contracts/isms/multisig/ValidatorAnnounce__factory.d.ts +1 -1
  169. package/dist/factories/contracts/isms/multisig/ValidatorAnnounce__factory.js +1 -1
  170. package/dist/factories/contracts/isms/routing/DefaultFallbackRoutingIsm__factory.d.ts +1 -1
  171. package/dist/factories/contracts/isms/routing/DefaultFallbackRoutingIsm__factory.js +1 -1
  172. package/dist/factories/contracts/isms/routing/DomainRoutingIsmFactory.sol/DomainRoutingIsmFactory__factory.d.ts +1 -1
  173. package/dist/factories/contracts/isms/routing/DomainRoutingIsmFactory.sol/DomainRoutingIsmFactory__factory.js +1 -1
  174. package/dist/factories/contracts/isms/routing/InterchainAccountIsm__factory.d.ts +1 -1
  175. package/dist/factories/contracts/isms/routing/InterchainAccountIsm__factory.js +1 -1
  176. package/dist/factories/contracts/isms/warp-route/RateLimitedIsm__factory.d.ts +301 -0
  177. package/dist/factories/contracts/isms/warp-route/RateLimitedIsm__factory.d.ts.map +1 -0
  178. package/dist/factories/contracts/isms/warp-route/RateLimitedIsm__factory.js +405 -0
  179. package/dist/factories/contracts/isms/warp-route/RateLimitedIsm__factory.js.map +1 -0
  180. package/dist/factories/contracts/isms/warp-route/index.d.ts +2 -0
  181. package/dist/factories/contracts/isms/warp-route/index.d.ts.map +1 -0
  182. package/dist/factories/contracts/isms/warp-route/index.js +5 -0
  183. package/dist/factories/contracts/isms/warp-route/index.js.map +1 -0
  184. package/dist/factories/contracts/libs/RateLimited__factory.d.ts +195 -0
  185. package/dist/factories/contracts/libs/RateLimited__factory.d.ts.map +1 -0
  186. package/dist/factories/contracts/libs/RateLimited__factory.js +266 -0
  187. package/dist/factories/contracts/libs/RateLimited__factory.js.map +1 -0
  188. package/dist/factories/contracts/libs/index.d.ts +1 -0
  189. package/dist/factories/contracts/libs/index.d.ts.map +1 -1
  190. package/dist/factories/contracts/libs/index.js +1 -0
  191. package/dist/factories/contracts/libs/index.js.map +1 -1
  192. package/dist/factories/contracts/middleware/InterchainAccountRouter__factory.d.ts +1 -1
  193. package/dist/factories/contracts/middleware/InterchainAccountRouter__factory.js +1 -1
  194. package/dist/factories/contracts/middleware/InterchainQueryRouter__factory.d.ts +1 -1
  195. package/dist/factories/contracts/middleware/InterchainQueryRouter__factory.js +1 -1
  196. package/dist/factories/contracts/middleware/liquidity-layer/LiquidityLayerRouter__factory.d.ts +1 -1
  197. package/dist/factories/contracts/middleware/liquidity-layer/LiquidityLayerRouter__factory.js +1 -1
  198. package/dist/factories/contracts/middleware/liquidity-layer/adapters/CircleBridgeAdapter__factory.d.ts +1 -1
  199. package/dist/factories/contracts/middleware/liquidity-layer/adapters/CircleBridgeAdapter__factory.js +1 -1
  200. package/dist/factories/contracts/middleware/liquidity-layer/adapters/PortalAdapter__factory.d.ts +1 -1
  201. package/dist/factories/contracts/middleware/liquidity-layer/adapters/PortalAdapter__factory.js +1 -1
  202. package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.d.ts +1 -1
  203. package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.d.ts.map +1 -1
  204. package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.js +1 -1
  205. package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.js.map +1 -1
  206. package/dist/factories/contracts/mock/MockMailbox__factory.d.ts +1 -1
  207. package/dist/factories/contracts/mock/MockMailbox__factory.d.ts.map +1 -1
  208. package/dist/factories/contracts/mock/MockMailbox__factory.js +1 -1
  209. package/dist/factories/contracts/mock/MockMailbox__factory.js.map +1 -1
  210. package/dist/factories/contracts/test/{ERC20Test__factory.d.ts → ERC20Test.sol/ERC20Test__factory.d.ts} +2 -2
  211. package/dist/factories/contracts/test/ERC20Test.sol/ERC20Test__factory.d.ts.map +1 -0
  212. package/dist/factories/contracts/test/{ERC20Test__factory.js → ERC20Test.sol/ERC20Test__factory.js} +1 -1
  213. package/dist/factories/contracts/test/ERC20Test.sol/ERC20Test__factory.js.map +1 -0
  214. package/dist/factories/contracts/test/ERC20Test.sol/FiatTokenTest__factory.d.ts +309 -0
  215. package/dist/factories/contracts/test/ERC20Test.sol/FiatTokenTest__factory.d.ts.map +1 -0
  216. package/dist/factories/contracts/test/ERC20Test.sol/FiatTokenTest__factory.js +416 -0
  217. package/dist/factories/contracts/test/ERC20Test.sol/FiatTokenTest__factory.js.map +1 -0
  218. package/dist/factories/contracts/test/ERC20Test.sol/XERC20Test__factory.d.ts +309 -0
  219. package/dist/factories/contracts/test/ERC20Test.sol/XERC20Test__factory.d.ts.map +1 -0
  220. package/dist/factories/contracts/test/ERC20Test.sol/XERC20Test__factory.js +415 -0
  221. package/dist/factories/contracts/test/ERC20Test.sol/XERC20Test__factory.js.map +1 -0
  222. package/dist/factories/contracts/test/ERC20Test.sol/index.d.ts +4 -0
  223. package/dist/factories/contracts/test/ERC20Test.sol/index.d.ts.map +1 -0
  224. package/dist/factories/contracts/test/ERC20Test.sol/index.js +7 -0
  225. package/dist/factories/contracts/test/ERC20Test.sol/index.js.map +1 -0
  226. package/dist/factories/contracts/test/TestGasRouter__factory.d.ts +1 -1
  227. package/dist/factories/contracts/test/TestGasRouter__factory.js +1 -1
  228. package/dist/factories/contracts/test/TestInterchainGasPaymaster__factory.d.ts +1 -1
  229. package/dist/factories/contracts/test/TestInterchainGasPaymaster__factory.js +1 -1
  230. package/dist/factories/contracts/test/TestMailbox__factory.d.ts +1 -1
  231. package/dist/factories/contracts/test/TestMailbox__factory.js +1 -1
  232. package/dist/factories/contracts/test/TestMerkleTreeHook__factory.d.ts +1 -1
  233. package/dist/factories/contracts/test/TestMerkleTreeHook__factory.js +1 -1
  234. package/dist/factories/contracts/test/TestPostDispatchHook__factory.d.ts +15 -1
  235. package/dist/factories/contracts/test/TestPostDispatchHook__factory.d.ts.map +1 -1
  236. package/dist/factories/contracts/test/TestPostDispatchHook__factory.js +20 -1
  237. package/dist/factories/contracts/test/TestPostDispatchHook__factory.js.map +1 -1
  238. package/dist/factories/contracts/test/TestQuerySender__factory.d.ts +1 -1
  239. package/dist/factories/contracts/test/TestQuerySender__factory.js +1 -1
  240. package/dist/factories/contracts/test/TestQuery__factory.d.ts +1 -1
  241. package/dist/factories/contracts/test/TestQuery__factory.js +1 -1
  242. package/dist/factories/contracts/test/TestRouter__factory.d.ts +1 -1
  243. package/dist/factories/contracts/test/TestRouter__factory.js +1 -1
  244. package/dist/factories/contracts/test/TestSendReceiver__factory.d.ts +1 -1
  245. package/dist/factories/contracts/test/TestSendReceiver__factory.js +1 -1
  246. package/dist/factories/contracts/test/index.d.ts +1 -1
  247. package/dist/factories/contracts/test/index.d.ts.map +1 -1
  248. package/dist/factories/contracts/test/index.js +1 -1
  249. package/dist/factories/contracts/test/index.js.map +1 -1
  250. package/dist/factories/contracts/token/HypERC20Collateral__factory.d.ts +31 -1
  251. package/dist/factories/contracts/token/HypERC20Collateral__factory.d.ts.map +1 -1
  252. package/dist/factories/contracts/token/HypERC20Collateral__factory.js +40 -1
  253. package/dist/factories/contracts/token/HypERC20Collateral__factory.js.map +1 -1
  254. package/dist/factories/contracts/token/HypERC20__factory.d.ts +31 -1
  255. package/dist/factories/contracts/token/HypERC20__factory.d.ts.map +1 -1
  256. package/dist/factories/contracts/token/HypERC20__factory.js +40 -1
  257. package/dist/factories/contracts/token/HypERC20__factory.js.map +1 -1
  258. package/dist/factories/contracts/token/HypERC721Collateral__factory.d.ts +31 -1
  259. package/dist/factories/contracts/token/HypERC721Collateral__factory.d.ts.map +1 -1
  260. package/dist/factories/contracts/token/HypERC721Collateral__factory.js +40 -1
  261. package/dist/factories/contracts/token/HypERC721Collateral__factory.js.map +1 -1
  262. package/dist/factories/contracts/token/HypERC721__factory.d.ts +31 -1
  263. package/dist/factories/contracts/token/HypERC721__factory.d.ts.map +1 -1
  264. package/dist/factories/contracts/token/HypERC721__factory.js +40 -1
  265. package/dist/factories/contracts/token/HypERC721__factory.js.map +1 -1
  266. package/dist/factories/contracts/token/HypNative__factory.d.ts +31 -1
  267. package/dist/factories/contracts/token/HypNative__factory.d.ts.map +1 -1
  268. package/dist/factories/contracts/token/HypNative__factory.js +40 -1
  269. package/dist/factories/contracts/token/HypNative__factory.js.map +1 -1
  270. package/dist/factories/contracts/token/extensions/FastHypERC20Collateral__factory.d.ts +31 -1
  271. package/dist/factories/contracts/token/extensions/FastHypERC20Collateral__factory.d.ts.map +1 -1
  272. package/dist/factories/contracts/token/extensions/FastHypERC20Collateral__factory.js +40 -1
  273. package/dist/factories/contracts/token/extensions/FastHypERC20Collateral__factory.js.map +1 -1
  274. package/dist/factories/contracts/token/extensions/FastHypERC20__factory.d.ts +31 -1
  275. package/dist/factories/contracts/token/extensions/FastHypERC20__factory.d.ts.map +1 -1
  276. package/dist/factories/contracts/token/extensions/FastHypERC20__factory.js +40 -1
  277. package/dist/factories/contracts/token/extensions/FastHypERC20__factory.js.map +1 -1
  278. package/dist/factories/contracts/token/extensions/HypERC20CollateralVaultDeposit__factory.d.ts +470 -0
  279. package/dist/factories/contracts/token/extensions/HypERC20CollateralVaultDeposit__factory.d.ts.map +1 -0
  280. package/dist/factories/contracts/token/extensions/HypERC20CollateralVaultDeposit__factory.js +621 -0
  281. package/dist/factories/contracts/token/extensions/HypERC20CollateralVaultDeposit__factory.js.map +1 -0
  282. package/dist/factories/contracts/token/extensions/HypERC721URICollateral__factory.d.ts +31 -1
  283. package/dist/factories/contracts/token/extensions/HypERC721URICollateral__factory.d.ts.map +1 -1
  284. package/dist/factories/contracts/token/extensions/HypERC721URICollateral__factory.js +40 -1
  285. package/dist/factories/contracts/token/extensions/HypERC721URICollateral__factory.js.map +1 -1
  286. package/dist/factories/contracts/token/extensions/HypERC721URIStorage__factory.d.ts +31 -1
  287. package/dist/factories/contracts/token/extensions/HypERC721URIStorage__factory.d.ts.map +1 -1
  288. package/dist/factories/contracts/token/extensions/HypERC721URIStorage__factory.js +40 -1
  289. package/dist/factories/contracts/token/extensions/HypERC721URIStorage__factory.js.map +1 -1
  290. package/dist/factories/contracts/token/extensions/HypFiatTokenCollateral__factory.d.ts +429 -0
  291. package/dist/factories/contracts/token/extensions/HypFiatTokenCollateral__factory.d.ts.map +1 -0
  292. package/dist/factories/contracts/token/extensions/HypFiatTokenCollateral__factory.js +569 -0
  293. package/dist/factories/contracts/token/extensions/HypFiatTokenCollateral__factory.js.map +1 -0
  294. package/dist/factories/contracts/token/extensions/HypNativeScaled__factory.d.ts +31 -1
  295. package/dist/factories/contracts/token/extensions/HypNativeScaled__factory.d.ts.map +1 -1
  296. package/dist/factories/contracts/token/extensions/HypNativeScaled__factory.js +40 -1
  297. package/dist/factories/contracts/token/extensions/HypNativeScaled__factory.js.map +1 -1
  298. package/dist/factories/contracts/token/extensions/HypXERC20Collateral__factory.d.ts +429 -0
  299. package/dist/factories/contracts/token/extensions/HypXERC20Collateral__factory.d.ts.map +1 -0
  300. package/dist/factories/contracts/token/extensions/HypXERC20Collateral__factory.js +569 -0
  301. package/dist/factories/contracts/token/extensions/HypXERC20Collateral__factory.js.map +1 -0
  302. package/dist/factories/contracts/token/extensions/index.d.ts +3 -0
  303. package/dist/factories/contracts/token/extensions/index.d.ts.map +1 -1
  304. package/dist/factories/contracts/token/extensions/index.js +3 -0
  305. package/dist/factories/contracts/token/extensions/index.js.map +1 -1
  306. package/dist/factories/contracts/token/index.d.ts +1 -1
  307. package/dist/factories/contracts/token/index.d.ts.map +1 -1
  308. package/dist/factories/contracts/token/index.js +1 -1
  309. package/dist/factories/contracts/token/index.js.map +1 -1
  310. package/dist/factories/contracts/token/interfaces/IFiatToken__factory.d.ts +177 -0
  311. package/dist/factories/contracts/token/interfaces/IFiatToken__factory.d.ts.map +1 -0
  312. package/dist/factories/contracts/token/interfaces/IFiatToken__factory.js +236 -0
  313. package/dist/factories/contracts/token/interfaces/IFiatToken__factory.js.map +1 -0
  314. package/dist/factories/contracts/token/interfaces/IXERC20__factory.d.ts +177 -0
  315. package/dist/factories/contracts/token/interfaces/IXERC20__factory.d.ts.map +1 -0
  316. package/dist/factories/contracts/token/interfaces/IXERC20__factory.js +235 -0
  317. package/dist/factories/contracts/token/interfaces/IXERC20__factory.js.map +1 -0
  318. package/dist/factories/contracts/token/interfaces/index.d.ts +3 -0
  319. package/dist/factories/contracts/token/interfaces/index.d.ts.map +1 -0
  320. package/dist/factories/contracts/token/interfaces/index.js +6 -0
  321. package/dist/factories/contracts/token/interfaces/index.js.map +1 -0
  322. package/dist/factories/contracts/token/libs/FastTokenRouter__factory.d.ts +30 -0
  323. package/dist/factories/contracts/token/libs/FastTokenRouter__factory.d.ts.map +1 -1
  324. package/dist/factories/contracts/token/libs/FastTokenRouter__factory.js +39 -0
  325. package/dist/factories/contracts/token/libs/FastTokenRouter__factory.js.map +1 -1
  326. package/dist/factories/contracts/token/libs/TokenRouter__factory.d.ts +30 -0
  327. package/dist/factories/contracts/token/libs/TokenRouter__factory.d.ts.map +1 -1
  328. package/dist/factories/contracts/token/libs/TokenRouter__factory.js +39 -0
  329. package/dist/factories/contracts/token/libs/TokenRouter__factory.js.map +1 -1
  330. package/dist/index.d.ts +24 -4
  331. package/dist/index.d.ts.map +1 -1
  332. package/dist/index.js +12 -2
  333. package/dist/index.js.map +1 -1
  334. package/package.json +6 -6
  335. package/dist/contracts/test/ERC20Test.d.ts.map +0 -1
  336. package/dist/contracts/test/ERC20Test.js.map +0 -1
  337. package/dist/contracts/token/HypERC20CollateralVaultDeposit.d.ts.map +0 -1
  338. package/dist/contracts/token/HypERC20CollateralVaultDeposit.js.map +0 -1
  339. package/dist/factories/contracts/test/ERC20Test__factory.d.ts.map +0 -1
  340. package/dist/factories/contracts/test/ERC20Test__factory.js.map +0 -1
  341. package/dist/factories/contracts/token/HypERC20CollateralVaultDeposit__factory.d.ts +0 -440
  342. package/dist/factories/contracts/token/HypERC20CollateralVaultDeposit__factory.d.ts.map +0 -1
  343. package/dist/factories/contracts/token/HypERC20CollateralVaultDeposit__factory.js +0 -582
  344. package/dist/factories/contracts/token/HypERC20CollateralVaultDeposit__factory.js.map +0 -1
  345. /package/dist/contracts/test/{ERC20Test.js → ERC20Test.sol/ERC20Test.js} +0 -0
  346. /package/dist/contracts/token/{HypERC20CollateralVaultDeposit.js → extensions/HypERC20CollateralVaultDeposit.js} +0 -0
@@ -92,6 +92,10 @@ abstract contract MailboxClient is OwnableUpgradeable {
92
92
  return mailbox.latestDispatchedId() == id;
93
93
  }
94
94
 
95
+ function _isDelivered(bytes32 id) internal view returns (bool) {
96
+ return mailbox.delivered(id);
97
+ }
98
+
95
99
  function _metadata(
96
100
  uint32 /*_destinationDomain*/
97
101
  ) internal view virtual returns (bytes memory) {
@@ -123,6 +127,24 @@ abstract contract MailboxClient is OwnableUpgradeable {
123
127
  );
124
128
  }
125
129
 
130
+ function _dispatch(
131
+ uint32 _destinationDomain,
132
+ bytes32 _recipient,
133
+ uint256 _value,
134
+ bytes memory _messageBody,
135
+ bytes memory _hookMetadata,
136
+ IPostDispatchHook _hook
137
+ ) internal virtual returns (bytes32) {
138
+ return
139
+ mailbox.dispatch{value: _value}(
140
+ _destinationDomain,
141
+ _recipient,
142
+ _messageBody,
143
+ _hookMetadata,
144
+ _hook
145
+ );
146
+ }
147
+
126
148
  function _quoteDispatch(
127
149
  uint32 _destinationDomain,
128
150
  bytes32 _recipient,
@@ -137,4 +159,21 @@ abstract contract MailboxClient is OwnableUpgradeable {
137
159
  hook
138
160
  );
139
161
  }
162
+
163
+ function _quoteDispatch(
164
+ uint32 _destinationDomain,
165
+ bytes32 _recipient,
166
+ bytes memory _messageBody,
167
+ bytes calldata _hookMetadata,
168
+ IPostDispatchHook _hook
169
+ ) internal view virtual returns (uint256) {
170
+ return
171
+ mailbox.quoteDispatch(
172
+ _destinationDomain,
173
+ _recipient,
174
+ _messageBody,
175
+ _hookMetadata,
176
+ _hook
177
+ );
178
+ }
140
179
  }
@@ -0,0 +1,58 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity >=0.8.0;
3
+ import {MailboxClient} from "contracts/client/MailboxClient.sol";
4
+ import {IPostDispatchHook} from "contracts/interfaces/hooks/IPostDispatchHook.sol";
5
+ import {Message} from "contracts/libs/Message.sol";
6
+ import {TokenMessage} from "contracts/token/libs/TokenMessage.sol";
7
+ import {RateLimited} from "contracts/libs/RateLimited.sol";
8
+
9
+ contract RateLimitedHook is IPostDispatchHook, MailboxClient, RateLimited {
10
+ using Message for bytes;
11
+ using TokenMessage for bytes;
12
+
13
+ mapping(bytes32 messageId => bool validated) public messageValidated;
14
+
15
+ modifier validateMessageOnce(bytes calldata _message) {
16
+ bytes32 messageId = _message.id();
17
+ require(!messageValidated[messageId], "MessageAlreadyValidated");
18
+ _;
19
+ messageValidated[messageId] = true;
20
+ }
21
+
22
+ constructor(
23
+ address _mailbox,
24
+ uint256 _maxCapacity
25
+ ) MailboxClient(_mailbox) RateLimited(_maxCapacity) {}
26
+
27
+ /// @inheritdoc IPostDispatchHook
28
+ function hookType() external pure returns (uint8) {
29
+ return uint8(IPostDispatchHook.Types.Rate_Limited_Hook);
30
+ }
31
+
32
+ /// @inheritdoc IPostDispatchHook
33
+ function supportsMetadata(bytes calldata) external pure returns (bool) {
34
+ return false;
35
+ }
36
+
37
+ /**
38
+ * Verify a message, rate limit, and increment the sender's limit.
39
+ * @dev ensures that this gets called by the Mailbox
40
+ */
41
+ function postDispatch(
42
+ bytes calldata,
43
+ bytes calldata _message
44
+ ) external payable validateMessageOnce(_message) {
45
+ require(_isLatestDispatched(_message.id()), "InvalidDispatchedMessage");
46
+
47
+ uint256 newAmount = _message.body().amount();
48
+ validateAndConsumeFilledLevel(newAmount);
49
+ }
50
+
51
+ /// @inheritdoc IPostDispatchHook
52
+ function quoteDispatch(
53
+ bytes calldata,
54
+ bytes calldata
55
+ ) external pure returns (uint256) {
56
+ return 0;
57
+ }
58
+ }
@@ -24,7 +24,8 @@ interface IPostDispatchHook {
24
24
  ID_AUTH_ISM,
25
25
  PAUSABLE,
26
26
  PROTOCOL_FEE,
27
- LAYER_ZERO_V1
27
+ LAYER_ZERO_V1,
28
+ Rate_Limited_Hook
28
29
  }
29
30
 
30
31
  /**
@@ -0,0 +1,27 @@
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 {Message} from "../libs/Message.sol";
7
+ import {Mailbox} from "../Mailbox.sol";
8
+
9
+ contract TrustedRelayerIsm is IInterchainSecurityModule {
10
+ using Message for bytes;
11
+
12
+ uint8 public immutable moduleType = uint8(Types.NULL);
13
+ Mailbox public immutable mailbox;
14
+ address public immutable trustedRelayer;
15
+
16
+ constructor(address _mailbox, address _trustedRelayer) {
17
+ mailbox = Mailbox(_mailbox);
18
+ trustedRelayer = _trustedRelayer;
19
+ }
20
+
21
+ function verify(
22
+ bytes calldata,
23
+ bytes calldata message
24
+ ) external view returns (bool) {
25
+ return mailbox.processor(message.id()) == trustedRelayer;
26
+ }
27
+ }
@@ -0,0 +1,53 @@
1
+ // SPDX-License-Identifier: MIT OR Apache-2.0
2
+ pragma solidity >=0.8.0;
3
+
4
+ import {IMailbox} from "contracts/interfaces/IMailbox.sol";
5
+ import {MailboxClient} from "contracts/client/MailboxClient.sol";
6
+ import {RateLimited} from "contracts/libs/RateLimited.sol";
7
+ import {IInterchainSecurityModule} from "contracts/interfaces/IInterchainSecurityModule.sol";
8
+ import {Message} from "contracts/libs/Message.sol";
9
+ import {TokenMessage} from "contracts/token/libs/TokenMessage.sol";
10
+
11
+ contract RateLimitedIsm is
12
+ MailboxClient,
13
+ RateLimited,
14
+ IInterchainSecurityModule
15
+ {
16
+ using Message for bytes;
17
+ using TokenMessage for bytes;
18
+
19
+ mapping(bytes32 messageId => bool validated) public messageValidated;
20
+
21
+ modifier validateMessageOnce(bytes calldata _message) {
22
+ bytes32 messageId = _message.id();
23
+ require(!messageValidated[messageId], "MessageAlreadyValidated");
24
+ messageValidated[messageId] = true;
25
+ _;
26
+ }
27
+
28
+ constructor(
29
+ address _mailbox,
30
+ uint256 _maxCapacity
31
+ ) MailboxClient(_mailbox) RateLimited(_maxCapacity) {}
32
+
33
+ /// @inheritdoc IInterchainSecurityModule
34
+ function moduleType() external pure returns (uint8) {
35
+ return uint8(IInterchainSecurityModule.Types.UNUSED);
36
+ }
37
+
38
+ /**
39
+ * Verify a message, rate limit, and increment the sender's limit.
40
+ * @dev ensures that this gets called by the Mailbox
41
+ */
42
+ function verify(
43
+ bytes calldata,
44
+ bytes calldata _message
45
+ ) external validateMessageOnce(_message) returns (bool) {
46
+ require(_isDelivered(_message.id()), "InvalidDeliveredMessage");
47
+
48
+ uint256 newAmount = _message.body().amount();
49
+ validateAndConsumeFilledLevel(newAmount);
50
+
51
+ return true;
52
+ }
53
+ }
@@ -0,0 +1,107 @@
1
+ // SPDX-License-Identifier: MIT OR Apache-2.0
2
+ pragma solidity >=0.8.0;
3
+ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
4
+
5
+ /**
6
+ * @title RateLimited
7
+ * @notice A contract used to keep track of an address sender's token amount limits.
8
+ * @dev Implements a modified token bucket algorithm where the bucket is full in the beginning and gradually refills
9
+ * See: https://dev.to/satrobit/rate-limiting-using-the-token-bucket-algorithm-3cjh
10
+ **/
11
+ contract RateLimited is OwnableUpgradeable {
12
+ uint256 public constant DURATION = 1 days; // 86400
13
+ uint256 public filledLevel; /// @notice Current filled level
14
+ uint256 public refillRate; /// @notice Tokens per second refill rate
15
+ uint256 public lastUpdated; /// @notice Timestamp of the last time an action has been taken TODO prob can be uint40
16
+
17
+ event RateLimitSet(uint256 _oldCapacity, uint256 _newCapacity);
18
+
19
+ constructor(uint256 _capacity) {
20
+ _transferOwnership(msg.sender);
21
+ setRefillRate(_capacity);
22
+ filledLevel = _capacity;
23
+ }
24
+
25
+ error RateLimitExceeded(uint256 newLimit, uint256 targetLimit);
26
+
27
+ /**
28
+ * @return The max capacity where the bucket will no longer refill
29
+ */
30
+ function maxCapacity() public view returns (uint256) {
31
+ return refillRate * DURATION;
32
+ }
33
+
34
+ /**
35
+ * Calculates the refilled amount based on time and refill rate
36
+ *
37
+ * Consider an example where there is a 1e18 max token limit per day (86400s)
38
+ * If half of the tokens has been used, and half a day (43200s) has passed,
39
+ * then there should be a refill of 0.5e18
40
+ *
41
+ * To calculate:
42
+ * Refilled = Elapsed * RefilledRate
43
+ * Elapsed = timestamp - Limit.lastUpdated
44
+ * RefilledRate = Capacity / DURATION
45
+ *
46
+ * If half of the day (43200) has passed, then
47
+ * (86400 - 43200) * (1e18 / 86400) = 0.5e18
48
+ */
49
+ function calculateRefilledAmount() internal view returns (uint256) {
50
+ uint256 elapsed = block.timestamp - lastUpdated;
51
+ return elapsed * refillRate;
52
+ }
53
+
54
+ /**
55
+ * Calculates the adjusted fill level based on time
56
+ */
57
+ function calculateCurrentLevel() public view returns (uint256) {
58
+ uint256 _capacity = maxCapacity();
59
+ require(_capacity > 0, "RateLimitNotSet");
60
+
61
+ if (block.timestamp > lastUpdated + DURATION) {
62
+ // If last update is in the previous window, return the max capacity
63
+ return _capacity;
64
+ } else {
65
+ // If within the window, refill the capacity
66
+ uint256 replenishedLevel = filledLevel + calculateRefilledAmount();
67
+
68
+ // Only return _capacity, in the case where newCurrentCapcacity overflows
69
+ return replenishedLevel > _capacity ? _capacity : replenishedLevel;
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Sets the refill rate by giving a capacity
75
+ * @param _capacity new maximum capacity to set
76
+ */
77
+ function setRefillRate(
78
+ uint256 _capacity
79
+ ) public onlyOwner returns (uint256) {
80
+ uint256 _oldRefillRate = refillRate;
81
+ uint256 _newRefillRate = _capacity / DURATION;
82
+ refillRate = _newRefillRate;
83
+
84
+ emit RateLimitSet(_oldRefillRate, _newRefillRate);
85
+
86
+ return _newRefillRate;
87
+ }
88
+
89
+ /**
90
+ * Validate an amount and decreases the currentCapacity
91
+ * @param _newAmount The amount to consume the fill level
92
+ * @return The new filled level
93
+ */
94
+ function validateAndConsumeFilledLevel(
95
+ uint256 _newAmount
96
+ ) public returns (uint256) {
97
+ uint256 adjustedFilledLevel = calculateCurrentLevel();
98
+ require(_newAmount <= adjustedFilledLevel, "RateLimitExceeded");
99
+
100
+ // Reduce the filledLevel and update lastUpdated
101
+ uint256 _filledLevel = adjustedFilledLevel - _newAmount;
102
+ filledLevel = _filledLevel;
103
+ lastUpdated = block.timestamp;
104
+
105
+ return _filledLevel;
106
+ }
107
+ }
@@ -3,6 +3,9 @@ pragma solidity >=0.8.0;
3
3
 
4
4
  import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
5
5
 
6
+ import "../token/interfaces/IXERC20.sol";
7
+ import "../token/interfaces/IFiatToken.sol";
8
+
6
9
  contract ERC20Test is ERC20 {
7
10
  uint8 public immutable _decimals;
8
11
 
@@ -28,3 +31,38 @@ contract ERC20Test is ERC20 {
28
31
  _mint(account, amount);
29
32
  }
30
33
  }
34
+
35
+ contract FiatTokenTest is ERC20Test, IFiatToken {
36
+ constructor(
37
+ string memory name,
38
+ string memory symbol,
39
+ uint256 totalSupply,
40
+ uint8 __decimals
41
+ ) ERC20Test(name, symbol, totalSupply, __decimals) {}
42
+
43
+ function burn(uint256 amount) public override {
44
+ _burn(msg.sender, amount);
45
+ }
46
+
47
+ function mint(address account, uint256 amount) public returns (bool) {
48
+ _mint(account, amount);
49
+ return true;
50
+ }
51
+ }
52
+
53
+ contract XERC20Test is ERC20Test, IXERC20 {
54
+ constructor(
55
+ string memory name,
56
+ string memory symbol,
57
+ uint256 totalSupply,
58
+ uint8 __decimals
59
+ ) ERC20Test(name, symbol, totalSupply, __decimals) {}
60
+
61
+ function mint(address account, uint256 amount) public override {
62
+ _mint(account, amount);
63
+ }
64
+
65
+ function burn(address account, uint256 amount) public override {
66
+ _burn(account, amount);
67
+ }
68
+ }
@@ -1,15 +1,21 @@
1
1
  // SPDX-License-Identifier: MIT OR Apache-2.0
2
2
  pragma solidity >=0.8.0;
3
+ import {Message} from "../libs/Message.sol";
3
4
 
4
5
  import {IPostDispatchHook} from "../interfaces/hooks/IPostDispatchHook.sol";
5
6
  import {AbstractPostDispatchHook} from "../hooks/libs/AbstractPostDispatchHook.sol";
6
7
 
7
8
  contract TestPostDispatchHook is AbstractPostDispatchHook {
9
+ using Message for bytes;
10
+
8
11
  // ============ Public Storage ============
9
12
 
10
13
  // test fees for quoteDispatch
11
14
  uint256 public fee = 0;
12
15
 
16
+ // used to keep track of dispatched message
17
+ mapping(bytes32 messageId => bool dispatched) public messageDispatched;
18
+
13
19
  // ============ External Functions ============
14
20
 
15
21
  /// @inheritdoc IPostDispatchHook
@@ -29,16 +35,14 @@ contract TestPostDispatchHook is AbstractPostDispatchHook {
29
35
 
30
36
  // ============ Internal functions ============
31
37
  function _postDispatch(
32
- bytes calldata,
33
- /*metadata*/
34
- bytes calldata /*message*/
35
- ) internal pure override {
36
- // test - empty
38
+ bytes calldata /*metadata*/,
39
+ bytes calldata message
40
+ ) internal override {
41
+ messageDispatched[message.id()] = true;
37
42
  }
38
43
 
39
44
  function _quoteDispatch(
40
- bytes calldata,
41
- /*metadata*/
45
+ bytes calldata /*metadata*/,
42
46
  bytes calldata /*message*/
43
47
  ) internal view override returns (uint256) {
44
48
  return fee;
@@ -45,7 +45,15 @@ contract HypNative is TokenRouter {
45
45
  ) public payable virtual override returns (bytes32 messageId) {
46
46
  require(msg.value >= _amount, "Native: amount exceeds msg.value");
47
47
  uint256 gasPayment = msg.value - _amount;
48
- return _transferRemote(_destination, _recipient, _amount, gasPayment);
48
+ return
49
+ _transferRemote(
50
+ _destination,
51
+ _recipient,
52
+ _amount,
53
+ gasPayment,
54
+ bytes(""),
55
+ address(0)
56
+ );
49
57
  }
50
58
 
51
59
  function balanceOf(
@@ -1,7 +1,7 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity >=0.8.0;
3
3
  import "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol";
4
- import {HypERC20Collateral} from "./HypERC20Collateral.sol";
4
+ import {HypERC20Collateral} from "../HypERC20Collateral.sol";
5
5
 
6
6
  /**
7
7
  * @title Hyperlane ERC20 Token Collateral with deposits collateral to a vault
@@ -0,0 +1,32 @@
1
+ pragma solidity >=0.8.0;
2
+
3
+ import {IFiatToken} from "../interfaces/IFiatToken.sol";
4
+ import {HypERC20Collateral} from "../HypERC20Collateral.sol";
5
+
6
+ // see https://github.com/circlefin/stablecoin-evm/blob/master/doc/tokendesign.md#issuing-and-destroying-tokens
7
+ contract HypFiatTokenCollateral is HypERC20Collateral {
8
+ constructor(
9
+ address _fiatToken,
10
+ address _mailbox
11
+ ) HypERC20Collateral(_fiatToken, _mailbox) {}
12
+
13
+ function _transferFromSender(
14
+ uint256 _amount
15
+ ) internal override returns (bytes memory metadata) {
16
+ // transfer amount to address(this)
17
+ metadata = super._transferFromSender(_amount);
18
+ // burn amount of address(this) balance
19
+ IFiatToken(address(wrappedToken)).burn(_amount);
20
+ }
21
+
22
+ function _transferTo(
23
+ address _recipient,
24
+ uint256 _amount,
25
+ bytes calldata /*metadata*/
26
+ ) internal override {
27
+ require(
28
+ IFiatToken(address(wrappedToken)).mint(_recipient, _amount),
29
+ "FiatToken mint failed"
30
+ );
31
+ }
32
+ }
@@ -30,7 +30,14 @@ contract HypNativeScaled is HypNative {
30
30
  uint256 gasPayment = msg.value - _amount;
31
31
  uint256 scaledAmount = _amount / scale;
32
32
  return
33
- _transferRemote(_destination, _recipient, scaledAmount, gasPayment);
33
+ _transferRemote(
34
+ _destination,
35
+ _recipient,
36
+ scaledAmount,
37
+ gasPayment,
38
+ bytes(""),
39
+ address(0)
40
+ );
34
41
  }
35
42
 
36
43
  /**
@@ -0,0 +1,26 @@
1
+ pragma solidity >=0.8.0;
2
+
3
+ import {IXERC20} from "../interfaces/IXERC20.sol";
4
+ import {HypERC20Collateral} from "../HypERC20Collateral.sol";
5
+
6
+ contract HypXERC20Collateral is HypERC20Collateral {
7
+ constructor(
8
+ address _xerc20,
9
+ address _mailbox
10
+ ) HypERC20Collateral(_xerc20, _mailbox) {}
11
+
12
+ function _transferFromSender(
13
+ uint256 _amountOrId
14
+ ) internal override returns (bytes memory metadata) {
15
+ IXERC20(address(wrappedToken)).burn(msg.sender, _amountOrId);
16
+ return "";
17
+ }
18
+
19
+ function _transferTo(
20
+ address _recipient,
21
+ uint256 _amountOrId,
22
+ bytes calldata /*metadata*/
23
+ ) internal override {
24
+ IXERC20(address(wrappedToken)).mint(_recipient, _amountOrId);
25
+ }
26
+ }
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: UNLICENSED
2
+ pragma solidity >=0.8.0;
3
+
4
+ // adapted from https://github.com/circlefin/stablecoin-evm
5
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
6
+
7
+ interface IFiatToken is IERC20 {
8
+ /**
9
+ * @notice Allows a minter to burn some of its own tokens.
10
+ * @dev The caller must be a minter, must not be blacklisted, and the amount to burn
11
+ * should be less than or equal to the account's balance.
12
+ * @param _amount the amount of tokens to be burned.
13
+ */
14
+ function burn(uint256 _amount) external;
15
+
16
+ /**
17
+ * @notice Mints fiat tokens to an address.
18
+ * @param _to The address that will receive the minted tokens.
19
+ * @param _amount The amount of tokens to mint. Must be less than or equal
20
+ * to the minterAllowance of the caller.
21
+ * @return True if the operation was successful.
22
+ */
23
+ function mint(address _to, uint256 _amount) external returns (bool);
24
+ }
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: UNLICENSED
2
+ pragma solidity >=0.8.0;
3
+
4
+ // adapted from https://github.com/defi-wonderland/xERC20
5
+
6
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
7
+
8
+ interface IXERC20 is IERC20 {
9
+ /**
10
+ * @notice Mints tokens for a user
11
+ * @dev Can only be called by a minter
12
+ * @param _user The address of the user who needs tokens minted
13
+ * @param _amount The amount of tokens being minted
14
+ */
15
+ function mint(address _user, uint256 _amount) external;
16
+
17
+ /**
18
+ * @notice Burns tokens for a user
19
+ * @dev Can only be called by a minter
20
+ * @param _user The address of the user who needs tokens burned
21
+ * @param _amount The amount of tokens being burned
22
+ */
23
+ function burn(address _user, uint256 _amount) external;
24
+ }
@@ -1,6 +1,7 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity >=0.8.0;
3
3
 
4
+ import {IPostDispatchHook} from "../../interfaces/hooks/IPostDispatchHook.sol";
4
5
  import {GasRouter} from "../../client/GasRouter.sol";
5
6
  import {MailboxClient} from "../../client/MailboxClient.sol";
6
7
  import {TypeCasts} from "../../libs/TypeCasts.sol";
@@ -56,31 +57,86 @@ abstract contract TokenRouter is GasRouter {
56
57
  uint256 _amountOrId
57
58
  ) external payable virtual returns (bytes32 messageId) {
58
59
  return
59
- _transferRemote(_destination, _recipient, _amountOrId, msg.value);
60
+ _transferRemote(
61
+ _destination,
62
+ _recipient,
63
+ _amountOrId,
64
+ msg.value,
65
+ bytes(""),
66
+ address(0)
67
+ );
68
+ }
69
+
70
+ /**
71
+ * @notice Transfers `_amountOrId` token to `_recipient` on `_destination` domain with a specified hook
72
+ * @dev Delegates transfer logic to `_transferFromSender` implementation.
73
+ * @dev The metadata is the token metadata, and is DIFFERENT than the hook metadata.
74
+ * @dev Emits `SentTransferRemote` event on the origin chain.
75
+ * @param _destination The identifier of the destination chain.
76
+ * @param _recipient The address of the recipient on the destination chain.
77
+ * @param _amountOrId The amount or identifier of tokens to be sent to the remote recipient.
78
+ * @param _hookMetadata The metadata passed into the hook
79
+ * @param _hook The post dispatch hook to be called by the Mailbox
80
+ * @return messageId The identifier of the dispatched message.
81
+ */
82
+ function transferRemote(
83
+ uint32 _destination,
84
+ bytes32 _recipient,
85
+ uint256 _amountOrId,
86
+ bytes calldata _hookMetadata,
87
+ address _hook
88
+ ) external payable virtual returns (bytes32 messageId) {
89
+ return
90
+ _transferRemote(
91
+ _destination,
92
+ _recipient,
93
+ _amountOrId,
94
+ msg.value,
95
+ _hookMetadata,
96
+ _hook
97
+ );
60
98
  }
61
99
 
62
100
  /**
63
101
  * @notice Transfers `_amountOrId` token to `_recipient` on `_destination` domain.
64
102
  * @dev Delegates transfer logic to `_transferFromSender` implementation.
103
+ * @dev The metadata is the token metadata, and is DIFFERENT than the hook metadata.
65
104
  * @dev Emits `SentTransferRemote` event on the origin chain.
66
105
  * @param _destination The identifier of the destination chain.
67
106
  * @param _recipient The address of the recipient on the destination chain.
68
107
  * @param _amountOrId The amount or identifier of tokens to be sent to the remote recipient.
69
108
  * @param _gasPayment The amount of native token to pay for interchain gas.
109
+ * @param _hookMetadata The metadata passed into the hook
110
+ * @param _hook The post dispatch hook to be called by the Mailbox
70
111
  * @return messageId The identifier of the dispatched message.
71
112
  */
72
113
  function _transferRemote(
73
114
  uint32 _destination,
74
115
  bytes32 _recipient,
75
116
  uint256 _amountOrId,
76
- uint256 _gasPayment
117
+ uint256 _gasPayment,
118
+ bytes memory _hookMetadata,
119
+ address _hook
77
120
  ) internal returns (bytes32 messageId) {
78
121
  bytes memory metadata = _transferFromSender(_amountOrId);
79
- messageId = _dispatch(
80
- _destination,
81
- _gasPayment,
82
- TokenMessage.format(_recipient, _amountOrId, metadata)
83
- );
122
+
123
+ if (address(_hook) == address(0)) {
124
+ messageId = _dispatch(
125
+ _destination,
126
+ _gasPayment,
127
+ TokenMessage.format(_recipient, _amountOrId, metadata)
128
+ );
129
+ } else {
130
+ messageId = _dispatch(
131
+ _destination,
132
+ _recipient,
133
+ _gasPayment,
134
+ TokenMessage.format(_recipient, _amountOrId, metadata),
135
+ _hookMetadata,
136
+ IPostDispatchHook(_hook)
137
+ );
138
+ }
139
+
84
140
  emit SentTransferRemote(_destination, _recipient, _amountOrId);
85
141
  }
86
142
 
@@ -0,0 +1 @@
1
+ export const buildArtifact: any