@hyperlane-xyz/core 5.12.0-ccip.2 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/contracts/PackageVersioned.sol +1 -1
  2. package/contracts/hooks/aggregation/StaticAggregationHook.sol +25 -0
  3. package/contracts/hooks/warp-route/RateLimitedHook.sol +54 -17
  4. package/contracts/test/ERC20Test.sol +147 -0
  5. package/contracts/token/HypERC20.sol +7 -2
  6. package/contracts/token/HypERC20Collateral.sol +7 -2
  7. package/contracts/token/HypNative.sol +6 -2
  8. package/contracts/token/extensions/FastHypERC20.sol +2 -1
  9. package/contracts/token/extensions/FastHypERC20Collateral.sol +2 -1
  10. package/contracts/token/extensions/HypERC4626.sol +2 -1
  11. package/contracts/token/extensions/HypERC4626Collateral.sol +2 -1
  12. package/contracts/token/extensions/HypERC4626OwnerCollateral.sol +2 -1
  13. package/contracts/token/extensions/HypFiatToken.sol +2 -1
  14. package/contracts/token/extensions/HypXERC20.sol +2 -1
  15. package/contracts/token/extensions/HypXERC20Lockbox.sol +8 -1
  16. package/contracts/token/libs/FastTokenRouter.sol +2 -1
  17. package/contracts/token/libs/FungibleTokenRouter.sol +32 -0
  18. package/contracts/token/libs/TokenRouter.sol +31 -3
  19. package/dist/buildArtifact.js +1 -1
  20. package/dist/buildArtifact.json +1 -1
  21. package/dist/contracts/hooks/warp-route/RateLimitedHook.d.ts +46 -31
  22. package/dist/contracts/hooks/warp-route/RateLimitedHook.d.ts.map +1 -1
  23. package/dist/contracts/test/ERC20Test.sol/XERC20VSTest.d.ts +894 -0
  24. package/dist/contracts/test/ERC20Test.sol/XERC20VSTest.d.ts.map +1 -0
  25. package/dist/contracts/test/ERC20Test.sol/XERC20VSTest.js +2 -0
  26. package/dist/contracts/test/ERC20Test.sol/XERC20VSTest.js.map +1 -0
  27. package/dist/contracts/test/ERC20Test.sol/index.d.ts +1 -0
  28. package/dist/contracts/test/ERC20Test.sol/index.d.ts.map +1 -1
  29. package/dist/contracts/token/HypERC20.d.ts +16 -1
  30. package/dist/contracts/token/HypERC20.d.ts.map +1 -1
  31. package/dist/contracts/token/HypERC20Collateral.d.ts +16 -1
  32. package/dist/contracts/token/HypERC20Collateral.d.ts.map +1 -1
  33. package/dist/contracts/token/HypNative.d.ts +16 -1
  34. package/dist/contracts/token/HypNative.d.ts.map +1 -1
  35. package/dist/contracts/token/extensions/FastHypERC20.d.ts +16 -1
  36. package/dist/contracts/token/extensions/FastHypERC20.d.ts.map +1 -1
  37. package/dist/contracts/token/extensions/FastHypERC20Collateral.d.ts +16 -1
  38. package/dist/contracts/token/extensions/FastHypERC20Collateral.d.ts.map +1 -1
  39. package/dist/contracts/token/extensions/HypERC4626.d.ts +16 -1
  40. package/dist/contracts/token/extensions/HypERC4626.d.ts.map +1 -1
  41. package/dist/contracts/token/extensions/HypERC4626Collateral.d.ts +16 -1
  42. package/dist/contracts/token/extensions/HypERC4626Collateral.d.ts.map +1 -1
  43. package/dist/contracts/token/extensions/HypERC4626OwnerCollateral.d.ts +16 -1
  44. package/dist/contracts/token/extensions/HypERC4626OwnerCollateral.d.ts.map +1 -1
  45. package/dist/contracts/token/extensions/HypFiatToken.d.ts +16 -1
  46. package/dist/contracts/token/extensions/HypFiatToken.d.ts.map +1 -1
  47. package/dist/contracts/token/extensions/HypXERC20.d.ts +16 -1
  48. package/dist/contracts/token/extensions/HypXERC20.d.ts.map +1 -1
  49. package/dist/contracts/token/extensions/HypXERC20Lockbox.d.ts +16 -1
  50. package/dist/contracts/token/extensions/HypXERC20Lockbox.d.ts.map +1 -1
  51. package/dist/contracts/token/extensions/index.d.ts +0 -1
  52. package/dist/contracts/token/extensions/index.d.ts.map +1 -1
  53. package/dist/contracts/token/libs/FastTokenRouter.d.ts +16 -1
  54. package/dist/contracts/token/libs/FastTokenRouter.d.ts.map +1 -1
  55. package/dist/contracts/token/{extensions/HypNativeScaled.d.ts → libs/FungibleTokenRouter.d.ts} +41 -70
  56. package/dist/contracts/token/libs/FungibleTokenRouter.d.ts.map +1 -0
  57. package/dist/contracts/token/libs/FungibleTokenRouter.js +2 -0
  58. package/dist/contracts/token/libs/FungibleTokenRouter.js.map +1 -0
  59. package/dist/contracts/token/libs/index.d.ts +1 -0
  60. package/dist/contracts/token/libs/index.d.ts.map +1 -1
  61. package/dist/factories/contracts/AttributeCheckpointFraud__factory.d.ts +1 -1
  62. package/dist/factories/contracts/AttributeCheckpointFraud__factory.js +1 -1
  63. package/dist/factories/contracts/CheckpointFraudProofs__factory.d.ts +1 -1
  64. package/dist/factories/contracts/CheckpointFraudProofs__factory.js +1 -1
  65. package/dist/factories/contracts/Mailbox__factory.d.ts +1 -1
  66. package/dist/factories/contracts/Mailbox__factory.js +1 -1
  67. package/dist/factories/contracts/avs/ECDSAStakeRegistry__factory.d.ts +1 -1
  68. package/dist/factories/contracts/avs/ECDSAStakeRegistry__factory.js +1 -1
  69. package/dist/factories/contracts/avs/HyperlaneServiceManager__factory.d.ts +1 -1
  70. package/dist/factories/contracts/avs/HyperlaneServiceManager__factory.js +1 -1
  71. package/dist/factories/contracts/hooks/ArbL2ToL1Hook__factory.d.ts +1 -1
  72. package/dist/factories/contracts/hooks/ArbL2ToL1Hook__factory.js +1 -1
  73. package/dist/factories/contracts/hooks/CCIPHook__factory.d.ts +1 -1
  74. package/dist/factories/contracts/hooks/CCIPHook__factory.js +1 -1
  75. package/dist/factories/contracts/hooks/DefaultHook__factory.d.ts +1 -1
  76. package/dist/factories/contracts/hooks/DefaultHook__factory.js +1 -1
  77. package/dist/factories/contracts/hooks/MerkleTreeHook__factory.d.ts +1 -1
  78. package/dist/factories/contracts/hooks/MerkleTreeHook__factory.js +1 -1
  79. package/dist/factories/contracts/hooks/OPL2ToL1Hook__factory.d.ts +1 -1
  80. package/dist/factories/contracts/hooks/OPL2ToL1Hook__factory.js +1 -1
  81. package/dist/factories/contracts/hooks/OPStackHook__factory.d.ts +1 -1
  82. package/dist/factories/contracts/hooks/OPStackHook__factory.js +1 -1
  83. package/dist/factories/contracts/hooks/PausableHook__factory.d.ts +1 -1
  84. package/dist/factories/contracts/hooks/PausableHook__factory.js +1 -1
  85. package/dist/factories/contracts/hooks/PolygonPosHook__factory.d.ts +1 -1
  86. package/dist/factories/contracts/hooks/PolygonPosHook__factory.js +1 -1
  87. package/dist/factories/contracts/hooks/ProtocolFee__factory.d.ts +1 -1
  88. package/dist/factories/contracts/hooks/ProtocolFee__factory.js +1 -1
  89. package/dist/factories/contracts/hooks/aggregation/ERC5164Hook__factory.d.ts +1 -1
  90. package/dist/factories/contracts/hooks/aggregation/ERC5164Hook__factory.js +1 -1
  91. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHookFactory__factory.d.ts +1 -1
  92. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHookFactory__factory.d.ts.map +1 -1
  93. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHookFactory__factory.js +1 -1
  94. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHookFactory__factory.js.map +1 -1
  95. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHook__factory.d.ts +1 -1
  96. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHook__factory.d.ts.map +1 -1
  97. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHook__factory.js +1 -1
  98. package/dist/factories/contracts/hooks/aggregation/StaticAggregationHook__factory.js.map +1 -1
  99. package/dist/factories/contracts/hooks/igp/InterchainGasPaymaster__factory.d.ts +1 -1
  100. package/dist/factories/contracts/hooks/igp/InterchainGasPaymaster__factory.js +1 -1
  101. package/dist/factories/contracts/hooks/igp/StorageGasOracle__factory.d.ts +1 -1
  102. package/dist/factories/contracts/hooks/igp/StorageGasOracle__factory.js +1 -1
  103. package/dist/factories/contracts/hooks/layer-zero/LayerZeroV1Hook__factory.d.ts +1 -1
  104. package/dist/factories/contracts/hooks/layer-zero/LayerZeroV1Hook__factory.js +1 -1
  105. package/dist/factories/contracts/hooks/layer-zero/LayerZeroV2Hook__factory.d.ts +1 -1
  106. package/dist/factories/contracts/hooks/layer-zero/LayerZeroV2Hook__factory.js +1 -1
  107. package/dist/factories/contracts/hooks/routing/AmountRoutingHook__factory.d.ts +1 -1
  108. package/dist/factories/contracts/hooks/routing/AmountRoutingHook__factory.js +1 -1
  109. package/dist/factories/contracts/hooks/routing/DestinationRecipientRoutingHook__factory.d.ts +1 -1
  110. package/dist/factories/contracts/hooks/routing/DestinationRecipientRoutingHook__factory.js +1 -1
  111. package/dist/factories/contracts/hooks/routing/DomainRoutingHook__factory.d.ts +1 -1
  112. package/dist/factories/contracts/hooks/routing/DomainRoutingHook__factory.js +1 -1
  113. package/dist/factories/contracts/hooks/routing/FallbackDomainRoutingHook__factory.d.ts +1 -1
  114. package/dist/factories/contracts/hooks/routing/FallbackDomainRoutingHook__factory.js +1 -1
  115. package/dist/factories/contracts/hooks/warp-route/RateLimitedHook__factory.d.ts +23 -9
  116. package/dist/factories/contracts/hooks/warp-route/RateLimitedHook__factory.d.ts.map +1 -1
  117. package/dist/factories/contracts/hooks/warp-route/RateLimitedHook__factory.js +29 -11
  118. package/dist/factories/contracts/hooks/warp-route/RateLimitedHook__factory.js.map +1 -1
  119. package/dist/factories/contracts/isms/NoopIsm__factory.d.ts +1 -1
  120. package/dist/factories/contracts/isms/NoopIsm__factory.js +1 -1
  121. package/dist/factories/contracts/isms/PausableIsm__factory.d.ts +1 -1
  122. package/dist/factories/contracts/isms/PausableIsm__factory.js +1 -1
  123. package/dist/factories/contracts/isms/TrustedRelayerIsm__factory.d.ts +1 -1
  124. package/dist/factories/contracts/isms/TrustedRelayerIsm__factory.js +1 -1
  125. package/dist/factories/contracts/isms/aggregation/StaticAggregationIsmFactory__factory.d.ts +1 -1
  126. package/dist/factories/contracts/isms/aggregation/StaticAggregationIsmFactory__factory.js +1 -1
  127. package/dist/factories/contracts/isms/aggregation/StaticAggregationIsm__factory.d.ts +1 -1
  128. package/dist/factories/contracts/isms/aggregation/StaticAggregationIsm__factory.js +1 -1
  129. package/dist/factories/contracts/isms/aggregation/StorageAggregationIsm.sol/StorageAggregationIsmFactory__factory.d.ts +1 -1
  130. package/dist/factories/contracts/isms/aggregation/StorageAggregationIsm.sol/StorageAggregationIsmFactory__factory.js +1 -1
  131. package/dist/factories/contracts/isms/aggregation/StorageAggregationIsm.sol/StorageAggregationIsm__factory.d.ts +1 -1
  132. package/dist/factories/contracts/isms/aggregation/StorageAggregationIsm.sol/StorageAggregationIsm__factory.js +1 -1
  133. package/dist/factories/contracts/isms/hook/ArbL2ToL1Ism__factory.d.ts +1 -1
  134. package/dist/factories/contracts/isms/hook/ArbL2ToL1Ism__factory.js +1 -1
  135. package/dist/factories/contracts/isms/hook/CCIPIsm__factory.d.ts +1 -1
  136. package/dist/factories/contracts/isms/hook/CCIPIsm__factory.js +1 -1
  137. package/dist/factories/contracts/isms/hook/ERC5164Ism__factory.d.ts +1 -1
  138. package/dist/factories/contracts/isms/hook/ERC5164Ism__factory.js +1 -1
  139. package/dist/factories/contracts/isms/hook/OPL2ToL1Ism__factory.d.ts +1 -1
  140. package/dist/factories/contracts/isms/hook/OPL2ToL1Ism__factory.js +1 -1
  141. package/dist/factories/contracts/isms/hook/OPStackIsm__factory.d.ts +1 -1
  142. package/dist/factories/contracts/isms/hook/OPStackIsm__factory.js +1 -1
  143. package/dist/factories/contracts/isms/hook/PolygonPosIsm__factory.d.ts +1 -1
  144. package/dist/factories/contracts/isms/hook/PolygonPosIsm__factory.js +1 -1
  145. package/dist/factories/contracts/isms/hook/layer-zero/LayerZeroV2Ism__factory.d.ts +1 -1
  146. package/dist/factories/contracts/isms/hook/layer-zero/LayerZeroV2Ism__factory.js +1 -1
  147. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.d.ts +1 -1
  148. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.js +1 -1
  149. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.d.ts +1 -1
  150. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.js +1 -1
  151. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.d.ts +1 -1
  152. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.js +1 -1
  153. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.d.ts +1 -1
  154. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.js +1 -1
  155. package/dist/factories/contracts/isms/multisig/StorageMultisigIsm.sol/StorageMerkleRootMultisigIsmFactory__factory.d.ts +1 -1
  156. package/dist/factories/contracts/isms/multisig/StorageMultisigIsm.sol/StorageMerkleRootMultisigIsmFactory__factory.js +1 -1
  157. package/dist/factories/contracts/isms/multisig/StorageMultisigIsm.sol/StorageMerkleRootMultisigIsm__factory.d.ts +1 -1
  158. package/dist/factories/contracts/isms/multisig/StorageMultisigIsm.sol/StorageMerkleRootMultisigIsm__factory.js +1 -1
  159. package/dist/factories/contracts/isms/multisig/StorageMultisigIsm.sol/StorageMessageIdMultisigIsmFactory__factory.d.ts +1 -1
  160. package/dist/factories/contracts/isms/multisig/StorageMultisigIsm.sol/StorageMessageIdMultisigIsmFactory__factory.js +1 -1
  161. package/dist/factories/contracts/isms/multisig/StorageMultisigIsm.sol/StorageMessageIdMultisigIsm__factory.d.ts +1 -1
  162. package/dist/factories/contracts/isms/multisig/StorageMultisigIsm.sol/StorageMessageIdMultisigIsm__factory.js +1 -1
  163. package/dist/factories/contracts/isms/multisig/ValidatorAnnounce__factory.d.ts +1 -1
  164. package/dist/factories/contracts/isms/multisig/ValidatorAnnounce__factory.js +1 -1
  165. package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMerkleRootWeightedMultisigIsmFactory__factory.d.ts +1 -1
  166. package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMerkleRootWeightedMultisigIsmFactory__factory.js +1 -1
  167. package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMerkleRootWeightedMultisigIsm__factory.d.ts +1 -1
  168. package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMerkleRootWeightedMultisigIsm__factory.js +1 -1
  169. package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMessageIdWeightedMultisigIsmFactory__factory.d.ts +1 -1
  170. package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMessageIdWeightedMultisigIsmFactory__factory.js +1 -1
  171. package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMessageIdWeightedMultisigIsm__factory.d.ts +1 -1
  172. package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMessageIdWeightedMultisigIsm__factory.js +1 -1
  173. package/dist/factories/contracts/isms/routing/DefaultFallbackRoutingIsm__factory.d.ts +1 -1
  174. package/dist/factories/contracts/isms/routing/DefaultFallbackRoutingIsm__factory.js +1 -1
  175. package/dist/factories/contracts/isms/routing/DomainRoutingIsmFactory.sol/DomainRoutingIsmFactory__factory.d.ts +1 -1
  176. package/dist/factories/contracts/isms/routing/DomainRoutingIsmFactory.sol/DomainRoutingIsmFactory__factory.js +1 -1
  177. package/dist/factories/contracts/isms/routing/DomainRoutingIsm__factory.d.ts +1 -1
  178. package/dist/factories/contracts/isms/routing/DomainRoutingIsm__factory.js +1 -1
  179. package/dist/factories/contracts/isms/routing/InterchainAccountIsm__factory.d.ts +1 -1
  180. package/dist/factories/contracts/isms/routing/InterchainAccountIsm__factory.js +1 -1
  181. package/dist/factories/contracts/isms/warp-route/AmountRoutingIsm__factory.d.ts +1 -1
  182. package/dist/factories/contracts/isms/warp-route/AmountRoutingIsm__factory.js +1 -1
  183. package/dist/factories/contracts/isms/warp-route/RateLimitedIsm__factory.d.ts +1 -1
  184. package/dist/factories/contracts/isms/warp-route/RateLimitedIsm__factory.js +1 -1
  185. package/dist/factories/contracts/middleware/InterchainAccountRouter__factory.d.ts +1 -1
  186. package/dist/factories/contracts/middleware/InterchainAccountRouter__factory.js +1 -1
  187. package/dist/factories/contracts/middleware/InterchainQueryRouter__factory.d.ts +1 -1
  188. package/dist/factories/contracts/middleware/InterchainQueryRouter__factory.js +1 -1
  189. package/dist/factories/contracts/middleware/liquidity-layer/LiquidityLayerRouter__factory.d.ts +1 -1
  190. package/dist/factories/contracts/middleware/liquidity-layer/LiquidityLayerRouter__factory.js +1 -1
  191. package/dist/factories/contracts/middleware/liquidity-layer/adapters/CircleBridgeAdapter__factory.d.ts +1 -1
  192. package/dist/factories/contracts/middleware/liquidity-layer/adapters/CircleBridgeAdapter__factory.js +1 -1
  193. package/dist/factories/contracts/middleware/liquidity-layer/adapters/PortalAdapter__factory.d.ts +1 -1
  194. package/dist/factories/contracts/middleware/liquidity-layer/adapters/PortalAdapter__factory.js +1 -1
  195. package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.d.ts +1 -1
  196. package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.js +1 -1
  197. package/dist/factories/contracts/mock/MockMailbox__factory.d.ts +1 -1
  198. package/dist/factories/contracts/mock/MockMailbox__factory.js +1 -1
  199. package/dist/factories/contracts/test/ERC20Test.sol/ERC20Test__factory.d.ts +1 -1
  200. package/dist/factories/contracts/test/ERC20Test.sol/ERC20Test__factory.js +1 -1
  201. package/dist/factories/contracts/test/ERC20Test.sol/FiatTokenTest__factory.d.ts +1 -1
  202. package/dist/factories/contracts/test/ERC20Test.sol/FiatTokenTest__factory.js +1 -1
  203. package/dist/factories/contracts/test/ERC20Test.sol/XERC20LockboxTest__factory.d.ts +1 -1
  204. package/dist/factories/contracts/test/ERC20Test.sol/XERC20LockboxTest__factory.js +1 -1
  205. package/dist/factories/contracts/test/ERC20Test.sol/XERC20Test__factory.d.ts +1 -1
  206. package/dist/factories/contracts/test/ERC20Test.sol/XERC20Test__factory.js +1 -1
  207. package/dist/factories/contracts/test/ERC20Test.sol/XERC20VSTest__factory.d.ts +595 -0
  208. package/dist/factories/contracts/test/ERC20Test.sol/XERC20VSTest__factory.d.ts.map +1 -0
  209. package/dist/factories/contracts/test/ERC20Test.sol/XERC20VSTest__factory.js +788 -0
  210. package/dist/factories/contracts/test/ERC20Test.sol/XERC20VSTest__factory.js.map +1 -0
  211. package/dist/factories/contracts/test/ERC20Test.sol/index.d.ts +1 -0
  212. package/dist/factories/contracts/test/ERC20Test.sol/index.d.ts.map +1 -1
  213. package/dist/factories/contracts/test/ERC20Test.sol/index.js +1 -0
  214. package/dist/factories/contracts/test/ERC20Test.sol/index.js.map +1 -1
  215. package/dist/factories/contracts/test/TestGasRouter__factory.d.ts +1 -1
  216. package/dist/factories/contracts/test/TestGasRouter__factory.js +1 -1
  217. package/dist/factories/contracts/test/TestInterchainGasPaymaster__factory.d.ts +1 -1
  218. package/dist/factories/contracts/test/TestInterchainGasPaymaster__factory.js +1 -1
  219. package/dist/factories/contracts/test/TestMailbox__factory.d.ts +1 -1
  220. package/dist/factories/contracts/test/TestMailbox__factory.js +1 -1
  221. package/dist/factories/contracts/test/TestMerkleTreeHook__factory.d.ts +1 -1
  222. package/dist/factories/contracts/test/TestMerkleTreeHook__factory.js +1 -1
  223. package/dist/factories/contracts/test/TestPostDispatchHook__factory.d.ts +1 -1
  224. package/dist/factories/contracts/test/TestPostDispatchHook__factory.js +1 -1
  225. package/dist/factories/contracts/test/TestQuerySender__factory.d.ts +1 -1
  226. package/dist/factories/contracts/test/TestQuerySender__factory.js +1 -1
  227. package/dist/factories/contracts/test/TestQuery__factory.d.ts +1 -1
  228. package/dist/factories/contracts/test/TestQuery__factory.js +1 -1
  229. package/dist/factories/contracts/test/TestRemoteChallenger__factory.d.ts +1 -1
  230. package/dist/factories/contracts/test/TestRemoteChallenger__factory.js +1 -1
  231. package/dist/factories/contracts/test/TestRouter__factory.d.ts +1 -1
  232. package/dist/factories/contracts/test/TestRouter__factory.js +1 -1
  233. package/dist/factories/contracts/test/TestSendReceiver__factory.d.ts +1 -1
  234. package/dist/factories/contracts/test/TestSendReceiver__factory.js +1 -1
  235. package/dist/factories/contracts/test/avs/TestHyperlaneServiceManager__factory.d.ts +1 -1
  236. package/dist/factories/contracts/test/avs/TestHyperlaneServiceManager__factory.js +1 -1
  237. package/dist/factories/contracts/token/HypERC20Collateral__factory.d.ts +18 -4
  238. package/dist/factories/contracts/token/HypERC20Collateral__factory.d.ts.map +1 -1
  239. package/dist/factories/contracts/token/HypERC20Collateral__factory.js +24 -6
  240. package/dist/factories/contracts/token/HypERC20Collateral__factory.js.map +1 -1
  241. package/dist/factories/contracts/token/HypERC20__factory.d.ts +17 -3
  242. package/dist/factories/contracts/token/HypERC20__factory.d.ts.map +1 -1
  243. package/dist/factories/contracts/token/HypERC20__factory.js +23 -5
  244. package/dist/factories/contracts/token/HypERC20__factory.js.map +1 -1
  245. package/dist/factories/contracts/token/HypERC721Collateral__factory.d.ts +1 -1
  246. package/dist/factories/contracts/token/HypERC721Collateral__factory.d.ts.map +1 -1
  247. package/dist/factories/contracts/token/HypERC721Collateral__factory.js +1 -1
  248. package/dist/factories/contracts/token/HypERC721Collateral__factory.js.map +1 -1
  249. package/dist/factories/contracts/token/HypERC721__factory.d.ts +1 -1
  250. package/dist/factories/contracts/token/HypERC721__factory.d.ts.map +1 -1
  251. package/dist/factories/contracts/token/HypERC721__factory.js +1 -1
  252. package/dist/factories/contracts/token/HypERC721__factory.js.map +1 -1
  253. package/dist/factories/contracts/token/HypNative__factory.d.ts +18 -4
  254. package/dist/factories/contracts/token/HypNative__factory.d.ts.map +1 -1
  255. package/dist/factories/contracts/token/HypNative__factory.js +24 -6
  256. package/dist/factories/contracts/token/HypNative__factory.js.map +1 -1
  257. package/dist/factories/contracts/token/extensions/FastHypERC20Collateral__factory.d.ts +18 -4
  258. package/dist/factories/contracts/token/extensions/FastHypERC20Collateral__factory.d.ts.map +1 -1
  259. package/dist/factories/contracts/token/extensions/FastHypERC20Collateral__factory.js +24 -6
  260. package/dist/factories/contracts/token/extensions/FastHypERC20Collateral__factory.js.map +1 -1
  261. package/dist/factories/contracts/token/extensions/FastHypERC20__factory.d.ts +17 -3
  262. package/dist/factories/contracts/token/extensions/FastHypERC20__factory.d.ts.map +1 -1
  263. package/dist/factories/contracts/token/extensions/FastHypERC20__factory.js +23 -5
  264. package/dist/factories/contracts/token/extensions/FastHypERC20__factory.js.map +1 -1
  265. package/dist/factories/contracts/token/extensions/HypERC4626Collateral__factory.d.ts +18 -4
  266. package/dist/factories/contracts/token/extensions/HypERC4626Collateral__factory.d.ts.map +1 -1
  267. package/dist/factories/contracts/token/extensions/HypERC4626Collateral__factory.js +24 -6
  268. package/dist/factories/contracts/token/extensions/HypERC4626Collateral__factory.js.map +1 -1
  269. package/dist/factories/contracts/token/extensions/HypERC4626OwnerCollateral__factory.d.ts +18 -4
  270. package/dist/factories/contracts/token/extensions/HypERC4626OwnerCollateral__factory.d.ts.map +1 -1
  271. package/dist/factories/contracts/token/extensions/HypERC4626OwnerCollateral__factory.js +24 -6
  272. package/dist/factories/contracts/token/extensions/HypERC4626OwnerCollateral__factory.js.map +1 -1
  273. package/dist/factories/contracts/token/extensions/HypERC4626__factory.d.ts +17 -3
  274. package/dist/factories/contracts/token/extensions/HypERC4626__factory.d.ts.map +1 -1
  275. package/dist/factories/contracts/token/extensions/HypERC4626__factory.js +23 -5
  276. package/dist/factories/contracts/token/extensions/HypERC4626__factory.js.map +1 -1
  277. package/dist/factories/contracts/token/extensions/HypERC721URICollateral__factory.d.ts +1 -1
  278. package/dist/factories/contracts/token/extensions/HypERC721URICollateral__factory.d.ts.map +1 -1
  279. package/dist/factories/contracts/token/extensions/HypERC721URICollateral__factory.js +1 -1
  280. package/dist/factories/contracts/token/extensions/HypERC721URICollateral__factory.js.map +1 -1
  281. package/dist/factories/contracts/token/extensions/HypERC721URIStorage__factory.d.ts +1 -1
  282. package/dist/factories/contracts/token/extensions/HypERC721URIStorage__factory.d.ts.map +1 -1
  283. package/dist/factories/contracts/token/extensions/HypERC721URIStorage__factory.js +1 -1
  284. package/dist/factories/contracts/token/extensions/HypERC721URIStorage__factory.js.map +1 -1
  285. package/dist/factories/contracts/token/extensions/HypFiatToken__factory.d.ts +18 -4
  286. package/dist/factories/contracts/token/extensions/HypFiatToken__factory.d.ts.map +1 -1
  287. package/dist/factories/contracts/token/extensions/HypFiatToken__factory.js +24 -6
  288. package/dist/factories/contracts/token/extensions/HypFiatToken__factory.js.map +1 -1
  289. package/dist/factories/contracts/token/extensions/HypXERC20Lockbox__factory.d.ts +18 -4
  290. package/dist/factories/contracts/token/extensions/HypXERC20Lockbox__factory.d.ts.map +1 -1
  291. package/dist/factories/contracts/token/extensions/HypXERC20Lockbox__factory.js +24 -6
  292. package/dist/factories/contracts/token/extensions/HypXERC20Lockbox__factory.js.map +1 -1
  293. package/dist/factories/contracts/token/extensions/HypXERC20__factory.d.ts +18 -4
  294. package/dist/factories/contracts/token/extensions/HypXERC20__factory.d.ts.map +1 -1
  295. package/dist/factories/contracts/token/extensions/HypXERC20__factory.js +24 -6
  296. package/dist/factories/contracts/token/extensions/HypXERC20__factory.js.map +1 -1
  297. package/dist/factories/contracts/token/extensions/WHypERC4626__factory.d.ts +1 -1
  298. package/dist/factories/contracts/token/extensions/WHypERC4626__factory.js +1 -1
  299. package/dist/factories/contracts/token/extensions/index.d.ts +0 -1
  300. package/dist/factories/contracts/token/extensions/index.d.ts.map +1 -1
  301. package/dist/factories/contracts/token/extensions/index.js +0 -1
  302. package/dist/factories/contracts/token/extensions/index.js.map +1 -1
  303. package/dist/factories/contracts/token/libs/FastTokenRouter__factory.d.ts +10 -0
  304. package/dist/factories/contracts/token/libs/FastTokenRouter__factory.d.ts.map +1 -1
  305. package/dist/factories/contracts/token/libs/FastTokenRouter__factory.js +13 -0
  306. package/dist/factories/contracts/token/libs/FastTokenRouter__factory.js.map +1 -1
  307. package/dist/factories/contracts/token/libs/FungibleTokenRouter__factory.d.ts +432 -0
  308. package/dist/factories/contracts/token/libs/FungibleTokenRouter__factory.d.ts.map +1 -0
  309. package/dist/factories/contracts/token/libs/FungibleTokenRouter__factory.js +565 -0
  310. package/dist/factories/contracts/token/libs/FungibleTokenRouter__factory.js.map +1 -0
  311. package/dist/factories/contracts/token/libs/index.d.ts +1 -0
  312. package/dist/factories/contracts/token/libs/index.d.ts.map +1 -1
  313. package/dist/factories/contracts/token/libs/index.js +1 -0
  314. package/dist/factories/contracts/token/libs/index.js.map +1 -1
  315. package/dist/index.d.ts +4 -2
  316. package/dist/index.d.ts.map +1 -1
  317. package/dist/index.js +2 -1
  318. package/dist/index.js.map +1 -1
  319. package/package.json +2 -2
  320. package/contracts/token/extensions/HypNativeScaled.sol +0 -78
  321. package/dist/contracts/token/extensions/HypNativeScaled.d.ts.map +0 -1
  322. package/dist/contracts/token/extensions/HypNativeScaled.js +0 -2
  323. package/dist/contracts/token/extensions/HypNativeScaled.js.map +0 -1
  324. package/dist/factories/contracts/token/extensions/HypNativeScaled__factory.d.ts +0 -492
  325. package/dist/factories/contracts/token/extensions/HypNativeScaled__factory.d.ts.map +0 -1
  326. package/dist/factories/contracts/token/extensions/HypNativeScaled__factory.js +0 -650
  327. package/dist/factories/contracts/token/extensions/HypNativeScaled__factory.js.map +0 -1
@@ -7,5 +7,5 @@ pragma solidity >=0.6.11;
7
7
  **/
8
8
  abstract contract PackageVersioned {
9
9
  // GENERATED CODE - DO NOT EDIT
10
- string public constant PACKAGE_VERSION = "5.12.0-ccip.1";
10
+ string public constant PACKAGE_VERSION = "6.0.0";
11
11
  }
@@ -13,11 +13,23 @@ pragma solidity >=0.8.0;
13
13
  @@@@@@@@@ @@@@@@@@@
14
14
  @@@@@@@@@ @@@@@@@@*/
15
15
 
16
+ // ============ Internal Imports ============
17
+ import {StandardHookMetadata} from "../libs/StandardHookMetadata.sol";
18
+ import {Message} from "../../libs/Message.sol";
19
+ import {TypeCasts} from "../../libs/TypeCasts.sol";
16
20
  import {AbstractPostDispatchHook} from "../libs/AbstractPostDispatchHook.sol";
17
21
  import {IPostDispatchHook} from "../../interfaces/hooks/IPostDispatchHook.sol";
18
22
  import {MetaProxy} from "../../libs/MetaProxy.sol";
19
23
 
24
+ // ============ External Imports ============
25
+ import {Address} from "@openzeppelin/contracts/utils/Address.sol";
26
+
20
27
  contract StaticAggregationHook is AbstractPostDispatchHook {
28
+ using Message for bytes;
29
+ using TypeCasts for bytes32;
30
+ using StandardHookMetadata for bytes;
31
+ using Address for address payable;
32
+
21
33
  // ============ External functions ============
22
34
 
23
35
  /// @inheritdoc IPostDispatchHook
@@ -32,16 +44,29 @@ contract StaticAggregationHook is AbstractPostDispatchHook {
32
44
  ) internal override {
33
45
  address[] memory _hooks = hooks(message);
34
46
  uint256 count = _hooks.length;
47
+ uint256 valueRemaining = msg.value;
35
48
  for (uint256 i = 0; i < count; i++) {
36
49
  uint256 quote = IPostDispatchHook(_hooks[i]).quoteDispatch(
37
50
  metadata,
38
51
  message
39
52
  );
53
+ require(
54
+ valueRemaining >= quote,
55
+ "StaticAggregationHook: insufficient value"
56
+ );
40
57
 
41
58
  IPostDispatchHook(_hooks[i]).postDispatch{value: quote}(
42
59
  metadata,
43
60
  message
44
61
  );
62
+
63
+ valueRemaining -= quote;
64
+ }
65
+
66
+ if (valueRemaining > 0) {
67
+ payable(metadata.refundAddress(message.senderAddress())).sendValue(
68
+ valueRemaining
69
+ );
45
70
  }
46
71
  }
47
72
 
@@ -1,18 +1,47 @@
1
- // SPDX-License-Identifier: MIT
1
+ // SPDX-License-Identifier: MIT OR Apache-2.0
2
2
  pragma solidity >=0.8.0;
3
3
 
4
+ /*@@@@@@@ @@@@@@@@@
5
+ @@@@@@@@@ @@@@@@@@@
6
+ @@@@@@@@@ @@@@@@@@@
7
+ @@@@@@@@@ @@@@@@@@@
8
+ @@@@@@@@@@@@@@@@@@@@@@@@@
9
+ @@@@@ HYPERLANE @@@@@@@
10
+ @@@@@@@@@@@@@@@@@@@@@@@@@
11
+ @@@@@@@@@ @@@@@@@@@
12
+ @@@@@@@@@ @@@@@@@@@
13
+ @@@@@@@@@ @@@@@@@@@
14
+ @@@@@@@@@ @@@@@@@@*/
15
+
16
+ // ============ Internal Imports ============
4
17
  import {MailboxClient} from "contracts/client/MailboxClient.sol";
5
18
  import {IPostDispatchHook} from "contracts/interfaces/hooks/IPostDispatchHook.sol";
6
19
  import {Message} from "contracts/libs/Message.sol";
7
20
  import {TokenMessage} from "contracts/token/libs/TokenMessage.sol";
8
21
  import {RateLimited} from "contracts/libs/RateLimited.sol";
22
+ import {AbstractPostDispatchHook} from "../libs/AbstractPostDispatchHook.sol";
9
23
 
10
- contract RateLimitedHook is IPostDispatchHook, MailboxClient, RateLimited {
24
+ /*
25
+ * @title RateLimitedHook
26
+ * @author Abacus Works
27
+ * @notice A hook that rate limits the volume of token transfers to a destination using a bucket fill algorithm
28
+ */
29
+ contract RateLimitedHook is
30
+ AbstractPostDispatchHook,
31
+ MailboxClient,
32
+ RateLimited
33
+ {
11
34
  using Message for bytes;
12
35
  using TokenMessage for bytes;
13
36
 
37
+ /// @notice The address that is authorized to call this hook
38
+ address public immutable sender;
39
+ /// @notice A mapping of message IDs to whether they have been validated
14
40
  mapping(bytes32 messageId => bool validated) public messageValidated;
15
41
 
42
+ // ============ Modifiers ============
43
+
44
+ /// @notice Ensures that the message has not been validated yet
16
45
  modifier validateMessageOnce(bytes calldata _message) {
17
46
  bytes32 messageId = _message.id();
18
47
  require(!messageValidated[messageId], "MessageAlreadyValidated");
@@ -20,40 +49,48 @@ contract RateLimitedHook is IPostDispatchHook, MailboxClient, RateLimited {
20
49
  messageValidated[messageId] = true;
21
50
  }
22
51
 
52
+ /// @notice Ensures that the message was sent by the authorized sender
53
+ modifier onlySender(bytes calldata _message) {
54
+ require(_message.senderAddress() == sender, "InvalidSender");
55
+ _;
56
+ }
57
+
58
+ // ============ Constructor ============
59
+
23
60
  constructor(
24
61
  address _mailbox,
25
- uint256 _maxCapacity
26
- ) MailboxClient(_mailbox) RateLimited(_maxCapacity) {}
62
+ uint256 _maxCapacity,
63
+ address _sender
64
+ ) MailboxClient(_mailbox) RateLimited(_maxCapacity) {
65
+ require(_sender != address(0), "InvalidSender");
66
+ sender = _sender;
67
+ }
68
+
69
+ // ============ External Functions ============
27
70
 
28
71
  /// @inheritdoc IPostDispatchHook
29
72
  function hookType() external pure returns (uint8) {
30
73
  return uint8(IPostDispatchHook.Types.RATE_LIMITED);
31
74
  }
32
75
 
33
- /// @inheritdoc IPostDispatchHook
34
- function supportsMetadata(bytes calldata) external pure returns (bool) {
35
- return false;
36
- }
76
+ // ============ Internal Functions ============
37
77
 
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 postDispatch(
78
+ /// @inheritdoc AbstractPostDispatchHook
79
+ function _postDispatch(
43
80
  bytes calldata,
44
81
  bytes calldata _message
45
- ) external payable validateMessageOnce(_message) {
82
+ ) internal override onlySender(_message) validateMessageOnce(_message) {
46
83
  require(_isLatestDispatched(_message.id()), "InvalidDispatchedMessage");
47
84
 
48
85
  uint256 newAmount = _message.body().amount();
49
86
  validateAndConsumeFilledLevel(newAmount);
50
87
  }
51
88
 
52
- /// @inheritdoc IPostDispatchHook
53
- function quoteDispatch(
89
+ /// @inheritdoc AbstractPostDispatchHook
90
+ function _quoteDispatch(
54
91
  bytes calldata,
55
92
  bytes calldata
56
- ) external pure returns (uint256) {
93
+ ) internal pure override returns (uint256) {
57
94
  return 0;
58
95
  }
59
96
  }
@@ -3,9 +3,11 @@ pragma solidity >=0.8.0;
3
3
 
4
4
  import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
5
5
  import "@openzeppelin/contracts/access/Ownable.sol";
6
+ import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
6
7
 
7
8
  import "../token/interfaces/IXERC20Lockbox.sol";
8
9
  import "../token/interfaces/IXERC20.sol";
10
+ import "../token/interfaces/IXERC20VS.sol";
9
11
  import "../token/interfaces/IFiatToken.sol";
10
12
 
11
13
  contract ERC20Test is ERC20 {
@@ -109,6 +111,151 @@ contract XERC20Test is ERC20Test, Ownable, IXERC20 {
109
111
  }
110
112
  }
111
113
 
114
+ contract XERC20VSTest is ERC20Test, Ownable, IXERC20VS {
115
+ event ConfigurationChanged(
116
+ address indexed bridge,
117
+ uint112 bufferCap,
118
+ uint128 rateLimitPerSecond
119
+ );
120
+
121
+ mapping(address bridge => RateLimitMidPoint bridgeRateLimit)
122
+ internal _rateLimits;
123
+
124
+ constructor(
125
+ string memory name,
126
+ string memory symbol,
127
+ uint256 totalSupply,
128
+ uint8 __decimals
129
+ ) ERC20Test(name, symbol, totalSupply, __decimals) Ownable() {
130
+ _transferOwnership(msg.sender);
131
+ }
132
+
133
+ function initialize() external {
134
+ _transferOwnership(msg.sender);
135
+ }
136
+
137
+ function owner() public view override(Ownable) returns (address) {
138
+ return Ownable.owner();
139
+ }
140
+
141
+ function lockbox() external view override returns (address) {
142
+ return address(0);
143
+ }
144
+
145
+ function rateLimits(
146
+ address _bridge
147
+ ) external view override returns (RateLimitMidPoint memory _rateLimit) {
148
+ return _rateLimits[_bridge];
149
+ }
150
+
151
+ function mintingMaxLimitOf(
152
+ address _bridge
153
+ ) external view returns (uint256) {
154
+ return _rateLimits[_bridge].bufferCap;
155
+ }
156
+
157
+ function burningMaxLimitOf(
158
+ address _bridge
159
+ ) external view returns (uint256) {
160
+ return _rateLimits[_bridge].bufferCap;
161
+ }
162
+
163
+ function burningCurrentLimitOf(
164
+ address _bridge
165
+ ) external view returns (uint256) {
166
+ return _rateLimits[_bridge].bufferCap - _buffer(_rateLimits[_bridge]);
167
+ }
168
+
169
+ function mintingCurrentLimitOf(
170
+ address _bridge
171
+ ) external view returns (uint256) {
172
+ return _buffer(_rateLimits[_bridge]);
173
+ }
174
+
175
+ function mint(address account, uint256 amount) public override {
176
+ _mint(account, amount);
177
+ }
178
+
179
+ function burn(address account, uint256 amount) public override {
180
+ _burn(account, amount);
181
+ }
182
+
183
+ function setBufferCap(
184
+ address _bridge,
185
+ uint256 _newBufferCap
186
+ ) external override {}
187
+
188
+ function setRateLimitPerSecond(
189
+ address _bridge,
190
+ uint128 _newRateLimitPerSecond
191
+ ) external override {}
192
+
193
+ function addBridge(
194
+ RateLimitMidPointInfo memory rateLimit
195
+ ) external onlyOwner {
196
+ _rateLimits[rateLimit.bridge] = RateLimitMidPoint({
197
+ bufferCap: rateLimit.bufferCap,
198
+ lastBufferUsedTime: uint32(block.timestamp),
199
+ bufferStored: uint112(rateLimit.bufferCap / 2),
200
+ midPoint: uint112(rateLimit.bufferCap / 2),
201
+ rateLimitPerSecond: rateLimit.rateLimitPerSecond
202
+ });
203
+
204
+ emit ConfigurationChanged(
205
+ rateLimit.bridge,
206
+ rateLimit.bufferCap,
207
+ rateLimit.rateLimitPerSecond
208
+ );
209
+ }
210
+
211
+ function removeBridge(address _bridge) external override {
212
+ delete _rateLimits[_bridge];
213
+ }
214
+
215
+ function _buffer(
216
+ RateLimitMidPoint storage limit
217
+ ) internal view returns (uint256) {
218
+ uint256 elapsed;
219
+ unchecked {
220
+ elapsed = uint32(block.timestamp) - limit.lastBufferUsedTime;
221
+ }
222
+
223
+ uint256 accrued = uint256(limit.rateLimitPerSecond) * elapsed;
224
+ if (limit.bufferStored < limit.midPoint) {
225
+ return
226
+ Math.min(
227
+ uint256(limit.bufferStored) + accrued,
228
+ uint256(limit.midPoint)
229
+ );
230
+ } else if (limit.bufferStored > limit.midPoint) {
231
+ /// past midpoint so subtract accrued off bufferStored back down to midpoint
232
+
233
+ /// second part of if statement will not be evaluated if first part is true
234
+ if (
235
+ accrued > limit.bufferStored ||
236
+ limit.bufferStored - accrued < limit.midPoint
237
+ ) {
238
+ /// if accrued is more than buffer stored, subtracting will underflow,
239
+ /// and we are at the midpoint, so return that
240
+ return limit.midPoint;
241
+ } else {
242
+ return limit.bufferStored - accrued;
243
+ }
244
+ } else {
245
+ /// no change
246
+ return limit.bufferStored;
247
+ }
248
+ }
249
+
250
+ function rateLimitPerSecond(address from) public view returns (uint256) {
251
+ return _rateLimits[from].rateLimitPerSecond;
252
+ }
253
+
254
+ function bufferCap(address from) public view returns (uint256) {
255
+ return _rateLimits[from].bufferCap;
256
+ }
257
+ }
258
+
112
259
  contract XERC20LockboxTest is IXERC20Lockbox {
113
260
  IXERC20 public immutable XERC20;
114
261
  IERC20 public immutable ERC20;
@@ -2,6 +2,7 @@
2
2
  pragma solidity >=0.8.0;
3
3
 
4
4
  import {TokenRouter} from "./libs/TokenRouter.sol";
5
+ import {FungibleTokenRouter} from "./libs/FungibleTokenRouter.sol";
5
6
 
6
7
  import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
7
8
 
@@ -10,10 +11,14 @@ import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/
10
11
  * @author Abacus Works
11
12
  * @dev Supply on each chain is not constant but the aggregate supply across all chains is.
12
13
  */
13
- contract HypERC20 is ERC20Upgradeable, TokenRouter {
14
+ contract HypERC20 is ERC20Upgradeable, FungibleTokenRouter {
14
15
  uint8 private immutable _decimals;
15
16
 
16
- constructor(uint8 __decimals, address _mailbox) TokenRouter(_mailbox) {
17
+ constructor(
18
+ uint8 __decimals,
19
+ uint256 _scale,
20
+ address _mailbox
21
+ ) FungibleTokenRouter(_scale, _mailbox) {
17
22
  _decimals = __decimals;
18
23
  }
19
24
 
@@ -15,6 +15,7 @@ pragma solidity >=0.8.0;
15
15
 
16
16
  // ============ Internal Imports ============
17
17
  import {TokenRouter} from "./libs/TokenRouter.sol";
18
+ import {FungibleTokenRouter} from "./libs/FungibleTokenRouter.sol";
18
19
  import {TokenMessage} from "./libs/TokenMessage.sol";
19
20
  import {MailboxClient} from "../client/MailboxClient.sol";
20
21
 
@@ -27,7 +28,7 @@ import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
27
28
  * @title Hyperlane ERC20 Token Collateral that wraps an existing ERC20 with remote transfer functionality.
28
29
  * @author Abacus Works
29
30
  */
30
- contract HypERC20Collateral is TokenRouter {
31
+ contract HypERC20Collateral is FungibleTokenRouter {
31
32
  using SafeERC20 for IERC20;
32
33
 
33
34
  IERC20 public immutable wrappedToken;
@@ -36,7 +37,11 @@ contract HypERC20Collateral is TokenRouter {
36
37
  * @notice Constructor
37
38
  * @param erc20 Address of the token to keep as collateral
38
39
  */
39
- constructor(address erc20, address _mailbox) TokenRouter(_mailbox) {
40
+ constructor(
41
+ address erc20,
42
+ uint256 _scale,
43
+ address _mailbox
44
+ ) FungibleTokenRouter(_scale, _mailbox) {
40
45
  require(Address.isContract(erc20), "HypERC20Collateral: invalid token");
41
46
  wrappedToken = IERC20(erc20);
42
47
  }
@@ -2,6 +2,7 @@
2
2
  pragma solidity >=0.8.0;
3
3
 
4
4
  import {TokenRouter} from "./libs/TokenRouter.sol";
5
+ import {FungibleTokenRouter} from "./libs/FungibleTokenRouter.sol";
5
6
  import {TokenMessage} from "./libs/TokenMessage.sol";
6
7
  import {Address} from "@openzeppelin/contracts/utils/Address.sol";
7
8
 
@@ -10,7 +11,7 @@ import {Address} from "@openzeppelin/contracts/utils/Address.sol";
10
11
  * @author Abacus Works
11
12
  * @dev Supply on each chain is not constant but the aggregate supply across all chains is.
12
13
  */
13
- contract HypNative is TokenRouter {
14
+ contract HypNative is FungibleTokenRouter {
14
15
  /**
15
16
  * @dev Emitted when native tokens are donated to the contract.
16
17
  * @param sender The address of the sender.
@@ -18,7 +19,10 @@ contract HypNative is TokenRouter {
18
19
  */
19
20
  event Donation(address indexed sender, uint256 amount);
20
21
 
21
- constructor(address _mailbox) TokenRouter(_mailbox) {}
22
+ constructor(
23
+ uint256 _scale,
24
+ address _mailbox
25
+ ) FungibleTokenRouter(_scale, _mailbox) {}
22
26
 
23
27
  /**
24
28
  * @notice Initializes the Hyperlane router
@@ -15,8 +15,9 @@ import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/
15
15
  contract FastHypERC20 is FastTokenRouter, HypERC20 {
16
16
  constructor(
17
17
  uint8 __decimals,
18
+ uint256 _scale,
18
19
  address _mailbox
19
- ) HypERC20(__decimals, _mailbox) {}
20
+ ) HypERC20(__decimals, _scale, _mailbox) {}
20
21
 
21
22
  /**
22
23
  * @dev delegates transfer logic to `_transferTo`.
@@ -21,8 +21,9 @@ contract FastHypERC20Collateral is FastTokenRouter, HypERC20Collateral {
21
21
  */
22
22
  constructor(
23
23
  address erc20,
24
+ uint256 _scale,
24
25
  address _mailbox
25
- ) HypERC20Collateral(erc20, _mailbox) {}
26
+ ) HypERC20Collateral(erc20, _scale, _mailbox) {}
26
27
 
27
28
  /**
28
29
  * @dev delegates transfer logic to `_transferTo`.
@@ -44,9 +44,10 @@ contract HypERC4626 is HypERC20 {
44
44
 
45
45
  constructor(
46
46
  uint8 _decimals,
47
+ uint256 _scale,
47
48
  address _mailbox,
48
49
  uint32 _collateralDomain
49
- ) HypERC20(_decimals, _mailbox) {
50
+ ) HypERC20(_decimals, _scale, _mailbox) {
50
51
  collateralDomain = _collateralDomain;
51
52
  exchangeRate = 1e10;
52
53
  _disableInitializers();
@@ -42,8 +42,9 @@ contract HypERC4626Collateral is HypERC20Collateral {
42
42
 
43
43
  constructor(
44
44
  ERC4626 _vault,
45
+ uint256 _scale,
45
46
  address _mailbox
46
- ) HypERC20Collateral(_vault.asset(), _mailbox) {
47
+ ) HypERC20Collateral(_vault.asset(), _scale, _mailbox) {
47
48
  vault = _vault;
48
49
  }
49
50
 
@@ -37,8 +37,9 @@ contract HypERC4626OwnerCollateral is HypERC20Collateral {
37
37
 
38
38
  constructor(
39
39
  ERC4626 _vault,
40
+ uint256 _scale,
40
41
  address _mailbox
41
- ) HypERC20Collateral(_vault.asset(), _mailbox) {
42
+ ) HypERC20Collateral(_vault.asset(), _scale, _mailbox) {
42
43
  vault = _vault;
43
44
  }
44
45
 
@@ -8,8 +8,9 @@ import {HypERC20Collateral} from "../HypERC20Collateral.sol";
8
8
  contract HypFiatToken is HypERC20Collateral {
9
9
  constructor(
10
10
  address _fiatToken,
11
+ uint256 _scale,
11
12
  address _mailbox
12
- ) HypERC20Collateral(_fiatToken, _mailbox) {}
13
+ ) HypERC20Collateral(_fiatToken, _scale, _mailbox) {}
13
14
 
14
15
  function _transferFromSender(
15
16
  uint256 _amount
@@ -7,8 +7,9 @@ import {HypERC20Collateral} from "../HypERC20Collateral.sol";
7
7
  contract HypXERC20 is HypERC20Collateral {
8
8
  constructor(
9
9
  address _xerc20,
10
+ uint256 _scale,
10
11
  address _mailbox
11
- ) HypERC20Collateral(_xerc20, _mailbox) {
12
+ ) HypERC20Collateral(_xerc20, _scale, _mailbox) {
12
13
  _disableInitializers();
13
14
  }
14
15
 
@@ -13,8 +13,15 @@ contract HypXERC20Lockbox is HypERC20Collateral {
13
13
 
14
14
  constructor(
15
15
  address _lockbox,
16
+ uint256 _scale,
16
17
  address _mailbox
17
- ) HypERC20Collateral(address(IXERC20Lockbox(_lockbox).ERC20()), _mailbox) {
18
+ )
19
+ HypERC20Collateral(
20
+ address(IXERC20Lockbox(_lockbox).ERC20()),
21
+ _scale,
22
+ _mailbox
23
+ )
24
+ {
18
25
  lockbox = IXERC20Lockbox(_lockbox);
19
26
  xERC20 = lockbox.XERC20();
20
27
  approveLockbox();
@@ -5,12 +5,13 @@ import {TypeCasts} from "../../libs/TypeCasts.sol";
5
5
 
6
6
  import {TokenMessage} from "./TokenMessage.sol";
7
7
  import {TokenRouter} from "./TokenRouter.sol";
8
+ import {FungibleTokenRouter} from "./FungibleTokenRouter.sol";
8
9
 
9
10
  /**
10
11
  * @title Common FastTokenRouter functionality for ERC20 Tokens with remote transfer support.
11
12
  * @author Abacus Works
12
13
  */
13
- abstract contract FastTokenRouter is TokenRouter {
14
+ abstract contract FastTokenRouter is FungibleTokenRouter {
14
15
  using TypeCasts for bytes32;
15
16
  using TokenMessage for bytes;
16
17
 
@@ -0,0 +1,32 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity >=0.8.0;
3
+
4
+ import {TokenRouter} from "./TokenRouter.sol";
5
+
6
+ abstract contract FungibleTokenRouter is TokenRouter {
7
+ uint256 public immutable scale;
8
+
9
+ constructor(uint256 _scale, address _mailbox) TokenRouter(_mailbox) {
10
+ scale = _scale;
11
+ }
12
+
13
+ /**
14
+ * @dev Scales local amount to message amount (up by scale factor).
15
+ * @inheritdoc TokenRouter
16
+ */
17
+ function _outboundAmount(
18
+ uint256 _localAmount
19
+ ) internal view virtual override returns (uint256 _messageAmount) {
20
+ _messageAmount = _localAmount * scale;
21
+ }
22
+
23
+ /**
24
+ * @dev Scales message amount to local amount (down by scale factor).
25
+ * @inheritdoc TokenRouter
26
+ */
27
+ function _inboundAmount(
28
+ uint256 _messageAmount
29
+ ) internal view virtual override returns (uint256 _localAmount) {
30
+ _localAmount = _messageAmount / scale;
31
+ }
32
+ }
@@ -116,9 +116,11 @@ abstract contract TokenRouter is GasRouter {
116
116
  address _hook
117
117
  ) internal virtual returns (bytes32 messageId) {
118
118
  bytes memory _tokenMetadata = _transferFromSender(_amountOrId);
119
+
120
+ uint256 outboundAmount = _outboundAmount(_amountOrId);
119
121
  bytes memory _tokenMessage = TokenMessage.format(
120
122
  _recipient,
121
- _amountOrId,
123
+ outboundAmount,
122
124
  _tokenMetadata
123
125
  );
124
126
 
@@ -130,7 +132,29 @@ abstract contract TokenRouter is GasRouter {
130
132
  _hook
131
133
  );
132
134
 
133
- emit SentTransferRemote(_destination, _recipient, _amountOrId);
135
+ emit SentTransferRemote(_destination, _recipient, outboundAmount);
136
+ }
137
+
138
+ /**
139
+ * @dev Should return the amount of tokens to be encoded in the message amount (eg for scaling `_localAmount`).
140
+ * @param _localAmount The amount of tokens transferred on this chain in local denomination.
141
+ * @return _messageAmount The amount of tokens to be encoded in the message body.
142
+ */
143
+ function _outboundAmount(
144
+ uint256 _localAmount
145
+ ) internal view virtual returns (uint256 _messageAmount) {
146
+ _messageAmount = _localAmount;
147
+ }
148
+
149
+ /**
150
+ * @dev Should return the amount of tokens to be decoded from the message amount.
151
+ * @param _messageAmount The amount of tokens received in the message body.
152
+ * @return _localAmount The amount of tokens to be transferred on this chain in local denomination.
153
+ */
154
+ function _inboundAmount(
155
+ uint256 _messageAmount
156
+ ) internal view virtual returns (uint256 _localAmount) {
157
+ _localAmount = _messageAmount;
134
158
  }
135
159
 
136
160
  /**
@@ -179,7 +203,11 @@ abstract contract TokenRouter is GasRouter {
179
203
  bytes32 recipient = _message.recipient();
180
204
  uint256 amount = _message.amount();
181
205
  bytes calldata metadata = _message.metadata();
182
- _transferTo(recipient.bytes32ToAddress(), amount, metadata);
206
+ _transferTo(
207
+ recipient.bytes32ToAddress(),
208
+ _inboundAmount(amount),
209
+ metadata
210
+ );
183
211
  emit ReceivedTransferRemote(_origin, recipient, amount);
184
212
  }
185
213