@hyperlane-xyz/sdk 23.0.0 → 25.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 (221) hide show
  1. package/dist/block-explorer/utils.d.ts.map +1 -1
  2. package/dist/block-explorer/utils.js +1 -0
  3. package/dist/block-explorer/utils.js.map +1 -1
  4. package/dist/consts/igp.d.ts.map +1 -1
  5. package/dist/consts/igp.js +5 -0
  6. package/dist/consts/igp.js.map +1 -1
  7. package/dist/core/HyperlaneCoreDeployer.d.ts.map +1 -1
  8. package/dist/core/HyperlaneCoreDeployer.js +6 -2
  9. package/dist/core/HyperlaneCoreDeployer.js.map +1 -1
  10. package/dist/core/adapters/AleoCoreAdapter.d.ts +1 -0
  11. package/dist/core/adapters/AleoCoreAdapter.d.ts.map +1 -1
  12. package/dist/core/adapters/AleoCoreAdapter.js +7 -0
  13. package/dist/core/adapters/AleoCoreAdapter.js.map +1 -1
  14. package/dist/core/adapters/CosmNativeCoreAdapter.d.ts +1 -0
  15. package/dist/core/adapters/CosmNativeCoreAdapter.d.ts.map +1 -1
  16. package/dist/core/adapters/CosmNativeCoreAdapter.js +7 -0
  17. package/dist/core/adapters/CosmNativeCoreAdapter.js.map +1 -1
  18. package/dist/core/adapters/CosmWasmCoreAdapter.d.ts +1 -0
  19. package/dist/core/adapters/CosmWasmCoreAdapter.d.ts.map +1 -1
  20. package/dist/core/adapters/CosmWasmCoreAdapter.js +3 -0
  21. package/dist/core/adapters/CosmWasmCoreAdapter.js.map +1 -1
  22. package/dist/core/adapters/EvmCoreAdapter.d.ts +1 -0
  23. package/dist/core/adapters/EvmCoreAdapter.d.ts.map +1 -1
  24. package/dist/core/adapters/EvmCoreAdapter.js +4 -0
  25. package/dist/core/adapters/EvmCoreAdapter.js.map +1 -1
  26. package/dist/core/adapters/RadixCoreAdapter.d.ts +1 -0
  27. package/dist/core/adapters/RadixCoreAdapter.d.ts.map +1 -1
  28. package/dist/core/adapters/RadixCoreAdapter.js +7 -0
  29. package/dist/core/adapters/RadixCoreAdapter.js.map +1 -1
  30. package/dist/core/adapters/SealevelCoreAdapter.d.ts +1 -0
  31. package/dist/core/adapters/SealevelCoreAdapter.d.ts.map +1 -1
  32. package/dist/core/adapters/SealevelCoreAdapter.js +7 -0
  33. package/dist/core/adapters/SealevelCoreAdapter.js.map +1 -1
  34. package/dist/core/adapters/StarknetCoreAdapter.d.ts +1 -0
  35. package/dist/core/adapters/StarknetCoreAdapter.d.ts.map +1 -1
  36. package/dist/core/adapters/StarknetCoreAdapter.js +5 -0
  37. package/dist/core/adapters/StarknetCoreAdapter.js.map +1 -1
  38. package/dist/core/adapters/types.d.ts +7 -0
  39. package/dist/core/adapters/types.d.ts.map +1 -1
  40. package/dist/core/types.d.ts +154 -38
  41. package/dist/core/types.d.ts.map +1 -1
  42. package/dist/deploy/verify/BaseContractVerifier.d.ts.map +1 -1
  43. package/dist/deploy/verify/BaseContractVerifier.js +2 -1
  44. package/dist/deploy/verify/BaseContractVerifier.js.map +1 -1
  45. package/dist/deploy/verify/PostDeploymentContractVerifier.d.ts.map +1 -1
  46. package/dist/deploy/verify/PostDeploymentContractVerifier.js +2 -1
  47. package/dist/deploy/verify/PostDeploymentContractVerifier.js.map +1 -1
  48. package/dist/deploy/warp.js +3 -3
  49. package/dist/deploy/warp.js.map +1 -1
  50. package/dist/hook/EvmHookModule.hardhat-test.js +16 -10
  51. package/dist/hook/EvmHookModule.hardhat-test.js.map +1 -1
  52. package/dist/hook/EvmHookReader.d.ts.map +1 -1
  53. package/dist/hook/EvmHookReader.js +70 -32
  54. package/dist/hook/EvmHookReader.js.map +1 -1
  55. package/dist/hook/HyperlaneHookDeployer.d.ts.map +1 -1
  56. package/dist/hook/HyperlaneHookDeployer.js +14 -6
  57. package/dist/hook/HyperlaneHookDeployer.js.map +1 -1
  58. package/dist/hook/types.d.ts +318 -14
  59. package/dist/hook/types.d.ts.map +1 -1
  60. package/dist/hook/types.js +49 -0
  61. package/dist/hook/types.js.map +1 -1
  62. package/dist/ica/types.d.ts +52 -12
  63. package/dist/ica/types.d.ts.map +1 -1
  64. package/dist/index.d.ts +9 -6
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +9 -5
  67. package/dist/index.js.map +1 -1
  68. package/dist/ism/EvmIsmReader.d.ts.map +1 -1
  69. package/dist/ism/EvmIsmReader.js +9 -9
  70. package/dist/ism/EvmIsmReader.js.map +1 -1
  71. package/dist/ism/EvmIsmReader.test.js +13 -1
  72. package/dist/ism/EvmIsmReader.test.js.map +1 -1
  73. package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
  74. package/dist/ism/HyperlaneIsmFactory.js +2 -0
  75. package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
  76. package/dist/ism/types.d.ts +221 -1
  77. package/dist/ism/types.d.ts.map +1 -1
  78. package/dist/ism/types.js +49 -0
  79. package/dist/ism/types.js.map +1 -1
  80. package/dist/mailbox/serialization.js +2 -2
  81. package/dist/mailbox/serialization.js.map +1 -1
  82. package/dist/metadata/agentConfig.d.ts +150 -150
  83. package/dist/metadata/chainMetadataTypes.d.ts +73 -71
  84. package/dist/metadata/chainMetadataTypes.d.ts.map +1 -1
  85. package/dist/metadata/chainMetadataTypes.js +6 -8
  86. package/dist/metadata/chainMetadataTypes.js.map +1 -1
  87. package/dist/metadata/customZodTypes.d.ts +23 -0
  88. package/dist/metadata/customZodTypes.d.ts.map +1 -1
  89. package/dist/metadata/customZodTypes.js +33 -0
  90. package/dist/metadata/customZodTypes.js.map +1 -1
  91. package/dist/metadata/forwardCompatibleEnum.test.d.ts +2 -0
  92. package/dist/metadata/forwardCompatibleEnum.test.d.ts.map +1 -0
  93. package/dist/metadata/forwardCompatibleEnum.test.js +299 -0
  94. package/dist/metadata/forwardCompatibleEnum.test.js.map +1 -0
  95. package/dist/metadata/matchingList.d.ts +4 -4
  96. package/dist/metadata/warpRouteConfig.d.ts +10 -8
  97. package/dist/metadata/warpRouteConfig.d.ts.map +1 -1
  98. package/dist/providers/MultiProtocolProvider.d.ts.map +1 -1
  99. package/dist/providers/MultiProtocolProvider.js +4 -1
  100. package/dist/providers/MultiProtocolProvider.js.map +1 -1
  101. package/dist/providers/ProviderType.d.ts +9 -3
  102. package/dist/providers/ProviderType.d.ts.map +1 -1
  103. package/dist/providers/ProviderType.js +1 -1
  104. package/dist/providers/ProviderType.js.map +1 -1
  105. package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
  106. package/dist/providers/SmartProvider/SmartProvider.foundry-test.js +2 -1
  107. package/dist/providers/SmartProvider/SmartProvider.foundry-test.js.map +1 -1
  108. package/dist/providers/SmartProvider/SmartProvider.js +43 -7
  109. package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
  110. package/dist/providers/SmartProvider/SmartProvider.test.js +77 -28
  111. package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
  112. package/dist/providers/explorerHealthTest.d.ts.map +1 -1
  113. package/dist/providers/explorerHealthTest.js +1 -0
  114. package/dist/providers/explorerHealthTest.js.map +1 -1
  115. package/dist/providers/providerBuilders.d.ts +2 -3
  116. package/dist/providers/providerBuilders.d.ts.map +1 -1
  117. package/dist/providers/providerBuilders.js.map +1 -1
  118. package/dist/providers/rpcHealthTest.d.ts.map +1 -1
  119. package/dist/providers/rpcHealthTest.js +6 -2
  120. package/dist/providers/rpcHealthTest.js.map +1 -1
  121. package/dist/router/types.d.ts +78 -18
  122. package/dist/router/types.d.ts.map +1 -1
  123. package/dist/test/testUtils.d.ts +1 -1
  124. package/dist/test/testUtils.d.ts.map +1 -1
  125. package/dist/test/testUtils.js +1 -0
  126. package/dist/test/testUtils.js.map +1 -1
  127. package/dist/token/{EvmERC20WarpModule.d.ts → EvmWarpModule.d.ts} +5 -5
  128. package/dist/token/EvmWarpModule.d.ts.map +1 -0
  129. package/dist/token/EvmWarpModule.hardhat-test.d.ts +2 -0
  130. package/dist/token/EvmWarpModule.hardhat-test.d.ts.map +1 -0
  131. package/dist/token/{EvmERC20WarpModule.hardhat-test.js → EvmWarpModule.hardhat-test.js} +45 -45
  132. package/dist/token/EvmWarpModule.hardhat-test.js.map +1 -0
  133. package/dist/token/{EvmERC20WarpModule.js → EvmWarpModule.js} +22 -13
  134. package/dist/token/EvmWarpModule.js.map +1 -0
  135. package/dist/token/{EvmERC20WarpRouteReader.d.ts → EvmWarpRouteReader.d.ts} +5 -5
  136. package/dist/token/EvmWarpRouteReader.d.ts.map +1 -0
  137. package/dist/token/EvmWarpRouteReader.hardhat-test.d.ts +2 -0
  138. package/dist/token/EvmWarpRouteReader.hardhat-test.d.ts.map +1 -0
  139. package/dist/token/{EvmERC20WarpRouteReader.hardhat-test.js → EvmWarpRouteReader.hardhat-test.js} +4 -4
  140. package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -0
  141. package/dist/token/{EvmERC20WarpRouteReader.js → EvmWarpRouteReader.js} +7 -6
  142. package/dist/token/EvmWarpRouteReader.js.map +1 -0
  143. package/dist/token/EvmXERC20Module.d.ts +100 -0
  144. package/dist/token/EvmXERC20Module.d.ts.map +1 -0
  145. package/dist/token/EvmXERC20Module.js +234 -0
  146. package/dist/token/EvmXERC20Module.js.map +1 -0
  147. package/dist/token/EvmXERC20Module.test.d.ts +2 -0
  148. package/dist/token/EvmXERC20Module.test.d.ts.map +1 -0
  149. package/dist/token/EvmXERC20Module.test.js +262 -0
  150. package/dist/token/EvmXERC20Module.test.js.map +1 -0
  151. package/dist/token/EvmXERC20Reader.d.ts +51 -0
  152. package/dist/token/EvmXERC20Reader.d.ts.map +1 -0
  153. package/dist/token/EvmXERC20Reader.js +137 -0
  154. package/dist/token/EvmXERC20Reader.js.map +1 -0
  155. package/dist/token/Token.d.ts.map +1 -1
  156. package/dist/token/Token.js +5 -2
  157. package/dist/token/Token.js.map +1 -1
  158. package/dist/token/TokenStandard.d.ts +6 -6
  159. package/dist/token/TokenStandard.d.ts.map +1 -1
  160. package/dist/token/TokenStandard.js +1 -0
  161. package/dist/token/TokenStandard.js.map +1 -1
  162. package/dist/token/adapters/EvmTokenAdapter.d.ts +5 -4
  163. package/dist/token/adapters/EvmTokenAdapter.d.ts.map +1 -1
  164. package/dist/token/adapters/EvmTokenAdapter.js +10 -16
  165. package/dist/token/adapters/EvmTokenAdapter.js.map +1 -1
  166. package/dist/token/adapters/SealevelTokenAdapter.d.ts +3 -2
  167. package/dist/token/adapters/SealevelTokenAdapter.d.ts.map +1 -1
  168. package/dist/token/adapters/SealevelTokenAdapter.js +11 -12
  169. package/dist/token/adapters/SealevelTokenAdapter.js.map +1 -1
  170. package/dist/token/adapters/StarknetTokenAdapter.d.ts +5 -3
  171. package/dist/token/adapters/StarknetTokenAdapter.d.ts.map +1 -1
  172. package/dist/token/adapters/StarknetTokenAdapter.js +12 -13
  173. package/dist/token/adapters/StarknetTokenAdapter.js.map +1 -1
  174. package/dist/token/checker.d.ts +2 -1
  175. package/dist/token/checker.d.ts.map +1 -1
  176. package/dist/token/checker.js +7 -9
  177. package/dist/token/checker.js.map +1 -1
  178. package/dist/token/config.d.ts +3 -0
  179. package/dist/token/config.d.ts.map +1 -1
  180. package/dist/token/config.js +2 -0
  181. package/dist/token/config.js.map +1 -1
  182. package/dist/token/configUtils.d.ts.map +1 -1
  183. package/dist/token/configUtils.js +10 -2
  184. package/dist/token/configUtils.js.map +1 -1
  185. package/dist/token/contracts.d.ts.map +1 -1
  186. package/dist/token/contracts.js.map +1 -1
  187. package/dist/token/deploy.d.ts +2 -2
  188. package/dist/token/deploy.d.ts.map +1 -1
  189. package/dist/token/deploy.hardhat-test.js +4 -4
  190. package/dist/token/deploy.hardhat-test.js.map +1 -1
  191. package/dist/token/deploy.js.map +1 -1
  192. package/dist/token/nativeTokenMetadata.d.ts +2 -2
  193. package/dist/token/nativeTokenMetadata.d.ts.map +1 -1
  194. package/dist/token/nativeTokenMetadata.js.map +1 -1
  195. package/dist/token/types.d.ts +2389 -132
  196. package/dist/token/types.d.ts.map +1 -1
  197. package/dist/token/types.js +24 -6
  198. package/dist/token/types.js.map +1 -1
  199. package/dist/token/xerc20-abi.d.ts +27 -0
  200. package/dist/token/xerc20-abi.d.ts.map +1 -0
  201. package/dist/token/xerc20-abi.js +37 -0
  202. package/dist/token/xerc20-abi.js.map +1 -0
  203. package/dist/token/xerc20.d.ts +41 -2
  204. package/dist/token/xerc20.d.ts.map +1 -1
  205. package/dist/token/xerc20.js +187 -37
  206. package/dist/token/xerc20.js.map +1 -1
  207. package/package.json +10 -10
  208. package/dist/token/EvmERC20WarpModule.d.ts.map +0 -1
  209. package/dist/token/EvmERC20WarpModule.hardhat-test.d.ts +0 -2
  210. package/dist/token/EvmERC20WarpModule.hardhat-test.d.ts.map +0 -1
  211. package/dist/token/EvmERC20WarpModule.hardhat-test.js.map +0 -1
  212. package/dist/token/EvmERC20WarpModule.js.map +0 -1
  213. package/dist/token/EvmERC20WarpRouteReader.d.ts.map +0 -1
  214. package/dist/token/EvmERC20WarpRouteReader.hardhat-test.d.ts +0 -2
  215. package/dist/token/EvmERC20WarpRouteReader.hardhat-test.d.ts.map +0 -1
  216. package/dist/token/EvmERC20WarpRouteReader.hardhat-test.js.map +0 -1
  217. package/dist/token/EvmERC20WarpRouteReader.js.map +0 -1
  218. package/dist/utils/fetch.d.ts +0 -2
  219. package/dist/utils/fetch.d.ts.map +0 -1
  220. package/dist/utils/fetch.js +0 -12
  221. package/dist/utils/fetch.js.map +0 -1
@@ -0,0 +1,100 @@
1
+ import { PopulatedTransaction } from 'ethers';
2
+ import { Address, ProtocolType } from '@hyperlane-xyz/utils';
3
+ import { HyperlaneModule, HyperlaneModuleParams } from '../core/AbstractHyperlaneModule.js';
4
+ import { MultiProtocolProvider } from '../providers/MultiProtocolProvider.js';
5
+ import { MultiProvider } from '../providers/MultiProvider.js';
6
+ import { AnnotatedEV5Transaction } from '../providers/ProviderType.js';
7
+ import { ChainName } from '../types.js';
8
+ import { EvmXERC20Reader, XERC20Limits, XERC20LimitsMap } from './EvmXERC20Reader.js';
9
+ import { XERC20Type } from './types.js';
10
+ /**
11
+ * Configuration for XERC20 limits management
12
+ */
13
+ export interface XERC20ModuleConfig {
14
+ type: XERC20Type;
15
+ limits: XERC20LimitsMap;
16
+ }
17
+ /**
18
+ * Addresses managed by the XERC20 module
19
+ */
20
+ export interface XERC20ModuleAddresses {
21
+ xERC20: Address;
22
+ warpRoute: Address;
23
+ }
24
+ /**
25
+ * Module for managing XERC20 mint/burn limits and bridges.
26
+ * Follows HyperlaneModule pattern with read() and update() methods.
27
+ * Supports both Standard XERC20 (setLimits) and Velodrome XERC20 (setBufferCap/addBridge/removeBridge).
28
+ */
29
+ export declare class EvmXERC20Module extends HyperlaneModule<ProtocolType.Ethereum, XERC20ModuleConfig, XERC20ModuleAddresses> {
30
+ protected readonly multiProvider: MultiProvider;
31
+ protected logger: import("pino").default.Logger<never>;
32
+ readonly reader: EvmXERC20Reader;
33
+ protected readonly multiProtocolProvider: MultiProtocolProvider;
34
+ readonly chainName: ChainName;
35
+ constructor(multiProvider: MultiProvider, args: HyperlaneModuleParams<XERC20ModuleConfig, XERC20ModuleAddresses>);
36
+ read(): Promise<XERC20ModuleConfig>;
37
+ /**
38
+ * Generate transactions to update XERC20 limits to match expected config.
39
+ * Detects drift and generates correction transactions.
40
+ */
41
+ update(expectedConfig: XERC20ModuleConfig): Promise<AnnotatedEV5Transaction[]>;
42
+ /**
43
+ * Detect drift between expected and actual configurations.
44
+ */
45
+ protected detectDriftFromConfigs(expected: XERC20ModuleConfig, actual: XERC20ModuleConfig): {
46
+ missingBridges: Address[];
47
+ extraBridges: Address[];
48
+ limitMismatches: Array<{
49
+ bridge: Address;
50
+ expected: XERC20Limits;
51
+ actual: XERC20Limits;
52
+ }>;
53
+ };
54
+ /**
55
+ * Get expected bridge addresses from config.
56
+ */
57
+ protected getExpectedBridges(): Address[];
58
+ /**
59
+ * Generate transactions to set limits for a bridge.
60
+ */
61
+ generateSetLimitsTxs(bridge: Address, limits: XERC20Limits): Promise<AnnotatedEV5Transaction[]>;
62
+ /**
63
+ * Generate transactions to add a bridge.
64
+ * For Standard XERC20, equivalent to setLimits.
65
+ * For Velodrome, uses addBridge function.
66
+ */
67
+ generateAddBridgeTxs(bridge: Address, limits: XERC20Limits): Promise<AnnotatedEV5Transaction[]>;
68
+ /**
69
+ * Generate transactions to remove a bridge (Velodrome only).
70
+ */
71
+ generateRemoveBridgeTxs(bridge: Address): Promise<AnnotatedEV5Transaction[]>;
72
+ protected annotateTransaction(tx: PopulatedTransaction, chainId: number, to: Address): AnnotatedEV5Transaction;
73
+ static fromWarpRouteConfig(multiProvider: MultiProvider, chain: ChainName, warpRouteConfig: {
74
+ type: string;
75
+ token: Address;
76
+ xERC20?: {
77
+ warpRouteLimits: {
78
+ type: string;
79
+ mint?: string;
80
+ burn?: string;
81
+ bufferCap?: string;
82
+ rateLimitPerSecond?: string;
83
+ };
84
+ extraBridges?: Array<{
85
+ lockbox: Address;
86
+ limits: {
87
+ type: string;
88
+ mint?: string;
89
+ burn?: string;
90
+ bufferCap?: string;
91
+ rateLimitPerSecond?: string;
92
+ };
93
+ }>;
94
+ };
95
+ }, warpRouteAddress: Address): Promise<{
96
+ module: EvmXERC20Module;
97
+ config: XERC20ModuleConfig;
98
+ }>;
99
+ }
100
+ //# sourceMappingURL=EvmXERC20Module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmXERC20Module.d.ts","sourceRoot":"","sources":["../../src/token/EvmXERC20Module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EACL,OAAO,EACP,YAAY,EAIb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,eAAe,EACf,qBAAqB,EACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EAGhB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,eAAe,CAClD,YAAY,CAAC,QAAQ,EACrB,kBAAkB,EAClB,qBAAqB,CACtB;IAOG,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa;IANjD,SAAS,CAAC,MAAM,uCAAmD;IACnE,SAAgB,MAAM,EAAE,eAAe,CAAC;IACxC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAChE,SAAgB,SAAS,EAAE,SAAS,CAAC;gBAGhB,aAAa,EAAE,aAAa,EAC/C,IAAI,EAAE,qBAAqB,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;IASlE,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAsBzC;;;OAGG;IACG,MAAM,CACV,cAAc,EAAE,kBAAkB,GACjC,OAAO,CAAC,uBAAuB,EAAE,CAAC;IA2CrC;;OAEG;IACH,SAAS,CAAC,sBAAsB,CAC9B,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,kBAAkB,GACzB;QACD,cAAc,EAAE,OAAO,EAAE,CAAC;QAC1B,YAAY,EAAE,OAAO,EAAE,CAAC;QACxB,eAAe,EAAE,KAAK,CAAC;YACrB,MAAM,EAAE,OAAO,CAAC;YAChB,QAAQ,EAAE,YAAY,CAAC;YACvB,MAAM,EAAE,YAAY,CAAC;SACtB,CAAC,CAAC;KACJ;IAgDD;;OAEG;IACH,SAAS,CAAC,kBAAkB,IAAI,OAAO,EAAE;IAIzC;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IA6CrC;;;;OAIG;IACG,oBAAoB,CACxB,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAuBrC;;OAEG;IACG,uBAAuB,CAC3B,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAcrC,SAAS,CAAC,mBAAmB,CAC3B,EAAE,EAAE,oBAAoB,EACxB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,OAAO,GACV,uBAAuB;WASb,mBAAmB,CAC9B,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,SAAS,EAChB,eAAe,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE;YACP,eAAe,EAAE;gBACf,IAAI,EAAE,MAAM,CAAC;gBACb,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,SAAS,CAAC,EAAE,MAAM,CAAC;gBACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;aAC7B,CAAC;YACF,YAAY,CAAC,EAAE,KAAK,CAAC;gBACnB,OAAO,EAAE,OAAO,CAAC;gBACjB,MAAM,EAAE;oBACN,IAAI,EAAE,MAAM,CAAC;oBACb,IAAI,CAAC,EAAE,MAAM,CAAC;oBACd,IAAI,CAAC,EAAE,MAAM,CAAC;oBACd,SAAS,CAAC,EAAE,MAAM,CAAC;oBACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;iBAC7B,CAAC;aACH,CAAC,CAAC;SACJ,CAAC;KACH,EACD,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAqFpE"}
@@ -0,0 +1,234 @@
1
+ import { HypXERC20Lockbox__factory } from '@hyperlane-xyz/core';
2
+ import { assert, normalizeAddress, rootLogger, } from '@hyperlane-xyz/utils';
3
+ import { HyperlaneModule, } from '../core/AbstractHyperlaneModule.js';
4
+ import { MultiProtocolProvider } from '../providers/MultiProtocolProvider.js';
5
+ import { EvmXERC20Reader, limitsAreZero, limitsMatch, } from './EvmXERC20Reader.js';
6
+ import { EvmXERC20Adapter, EvmXERC20VSAdapter, } from './adapters/EvmTokenAdapter.js';
7
+ import { TokenType } from './config.js';
8
+ import { XERC20Type } from './types.js';
9
+ /**
10
+ * Module for managing XERC20 mint/burn limits and bridges.
11
+ * Follows HyperlaneModule pattern with read() and update() methods.
12
+ * Supports both Standard XERC20 (setLimits) and Velodrome XERC20 (setBufferCap/addBridge/removeBridge).
13
+ */
14
+ export class EvmXERC20Module extends HyperlaneModule {
15
+ multiProvider;
16
+ logger = rootLogger.child({ module: 'EvmXERC20Module' });
17
+ reader;
18
+ multiProtocolProvider;
19
+ chainName;
20
+ constructor(multiProvider, args) {
21
+ super(args);
22
+ this.multiProvider = multiProvider;
23
+ this.chainName = this.multiProvider.getChainName(args.chain);
24
+ this.reader = new EvmXERC20Reader(multiProvider, args.chain);
25
+ this.multiProtocolProvider =
26
+ MultiProtocolProvider.fromMultiProvider(multiProvider);
27
+ }
28
+ async read() {
29
+ const type = await this.reader.deriveXERC20TokenType(this.args.addresses.xERC20);
30
+ let bridges = this.getExpectedBridges();
31
+ if (type === XERC20Type.Velo) {
32
+ const onChainBridges = await this.reader.readOnChainBridges(this.args.addresses.xERC20, type);
33
+ bridges = [...new Set([...bridges, ...onChainBridges])];
34
+ }
35
+ const limits = await this.reader.readLimits(this.args.addresses.xERC20, bridges, type);
36
+ return { type, limits };
37
+ }
38
+ /**
39
+ * Generate transactions to update XERC20 limits to match expected config.
40
+ * Detects drift and generates correction transactions.
41
+ */
42
+ async update(expectedConfig) {
43
+ const actualConfig = await this.read();
44
+ assert(expectedConfig.type === actualConfig.type, `XERC20 type mismatch: expected ${expectedConfig.type} but on-chain is ${actualConfig.type}`);
45
+ const transactions = [];
46
+ const { missingBridges, extraBridges, limitMismatches } = this.detectDriftFromConfigs(expectedConfig, actualConfig);
47
+ for (const bridge of missingBridges) {
48
+ const limits = expectedConfig.limits[bridge];
49
+ if (limits) {
50
+ const txs = await this.generateAddBridgeTxs(bridge, limits);
51
+ transactions.push(...txs);
52
+ }
53
+ }
54
+ for (const { bridge, expected } of limitMismatches) {
55
+ const txs = await this.generateSetLimitsTxs(bridge, expected);
56
+ transactions.push(...txs);
57
+ }
58
+ if (expectedConfig.type === XERC20Type.Velo) {
59
+ for (const bridge of extraBridges) {
60
+ const txs = await this.generateRemoveBridgeTxs(bridge);
61
+ transactions.push(...txs);
62
+ }
63
+ }
64
+ if (transactions.length > 0) {
65
+ this.logger.info(`Generated ${transactions.length} XERC20 correction txs: ` +
66
+ `${missingBridges.length} missing, ${limitMismatches.length} mismatches, ${extraBridges.length} extra`);
67
+ }
68
+ return transactions;
69
+ }
70
+ /**
71
+ * Detect drift between expected and actual configurations.
72
+ */
73
+ detectDriftFromConfigs(expected, actual) {
74
+ const missingBridges = [];
75
+ const limitMismatches = [];
76
+ const expectedBridges = Object.keys(expected.limits).map((addr) => normalizeAddress(addr));
77
+ const expectedBridgesSet = new Set(expectedBridges);
78
+ for (const [bridge, expectedLimits] of Object.entries(expected.limits)) {
79
+ const normalizedBridge = normalizeAddress(bridge);
80
+ const actualLimits = actual.limits[normalizedBridge] ?? actual.limits[bridge];
81
+ if (!actualLimits || limitsAreZero(actualLimits)) {
82
+ missingBridges.push(bridge);
83
+ continue;
84
+ }
85
+ if (!limitsMatch(expectedLimits, actualLimits)) {
86
+ limitMismatches.push({
87
+ bridge,
88
+ expected: expectedLimits,
89
+ actual: actualLimits,
90
+ });
91
+ }
92
+ }
93
+ let extraBridges = [];
94
+ if (expected.type === XERC20Type.Velo) {
95
+ extraBridges = Object.keys(actual.limits)
96
+ .filter((addr) => {
97
+ const normalized = normalizeAddress(addr);
98
+ return (!expectedBridgesSet.has(normalized) &&
99
+ !limitsAreZero(actual.limits[addr]));
100
+ })
101
+ .map((addr) => normalizeAddress(addr));
102
+ }
103
+ return { missingBridges, extraBridges, limitMismatches };
104
+ }
105
+ /**
106
+ * Get expected bridge addresses from config.
107
+ */
108
+ getExpectedBridges() {
109
+ return Object.keys(this.args.config.limits);
110
+ }
111
+ /**
112
+ * Generate transactions to set limits for a bridge.
113
+ */
114
+ async generateSetLimitsTxs(bridge, limits) {
115
+ const xERC20Address = this.args.addresses.xERC20;
116
+ const chainId = this.multiProvider.getEvmChainId(this.chainName);
117
+ const transactions = [];
118
+ if (limits.type === XERC20Type.Standard) {
119
+ const adapter = new EvmXERC20Adapter(this.chainName, this.multiProtocolProvider, { token: xERC20Address });
120
+ const tx = await adapter.populateSetLimitsTx(bridge, BigInt(limits.mint), BigInt(limits.burn));
121
+ transactions.push(this.annotateTransaction(tx, chainId, xERC20Address));
122
+ }
123
+ else {
124
+ const adapter = new EvmXERC20VSAdapter(this.chainName, this.multiProtocolProvider, { token: xERC20Address });
125
+ const bufferCapTx = await adapter.populateSetBufferCapTx(bridge, BigInt(limits.bufferCap));
126
+ transactions.push(this.annotateTransaction(bufferCapTx, chainId, xERC20Address));
127
+ const rateLimitTx = await adapter.populateSetRateLimitPerSecondTx(bridge, BigInt(limits.rateLimitPerSecond));
128
+ transactions.push(this.annotateTransaction(rateLimitTx, chainId, xERC20Address));
129
+ }
130
+ return transactions;
131
+ }
132
+ /**
133
+ * Generate transactions to add a bridge.
134
+ * For Standard XERC20, equivalent to setLimits.
135
+ * For Velodrome, uses addBridge function.
136
+ */
137
+ async generateAddBridgeTxs(bridge, limits) {
138
+ if (limits.type === XERC20Type.Standard) {
139
+ return this.generateSetLimitsTxs(bridge, limits);
140
+ }
141
+ const xERC20Address = this.args.addresses.xERC20;
142
+ const chainId = this.multiProvider.getEvmChainId(this.chainName);
143
+ const adapter = new EvmXERC20VSAdapter(this.chainName, this.multiProtocolProvider, { token: xERC20Address });
144
+ const tx = await adapter.populateAddBridgeTx(BigInt(limits.bufferCap), BigInt(limits.rateLimitPerSecond), bridge);
145
+ return [this.annotateTransaction(tx, chainId, xERC20Address)];
146
+ }
147
+ /**
148
+ * Generate transactions to remove a bridge (Velodrome only).
149
+ */
150
+ async generateRemoveBridgeTxs(bridge) {
151
+ const xERC20Address = this.args.addresses.xERC20;
152
+ const chainId = this.multiProvider.getEvmChainId(this.chainName);
153
+ const adapter = new EvmXERC20VSAdapter(this.chainName, this.multiProtocolProvider, { token: xERC20Address });
154
+ const tx = await adapter.populateRemoveBridgeTx(bridge);
155
+ return [this.annotateTransaction(tx, chainId, xERC20Address)];
156
+ }
157
+ annotateTransaction(tx, chainId, to) {
158
+ return {
159
+ ...tx,
160
+ chainId,
161
+ to,
162
+ annotation: `XERC20 limit update for ${to}`,
163
+ };
164
+ }
165
+ static async fromWarpRouteConfig(multiProvider, chain, warpRouteConfig, warpRouteAddress) {
166
+ assert(warpRouteConfig.type === TokenType.XERC20 ||
167
+ warpRouteConfig.type === TokenType.XERC20Lockbox, `Expected XERC20 or XERC20Lockbox token type, got ${warpRouteConfig.type}`);
168
+ let xERC20Address = warpRouteConfig.token;
169
+ if (warpRouteConfig.type === TokenType.XERC20Lockbox) {
170
+ const provider = multiProvider.getProvider(chain);
171
+ const hypXERC20Lockbox = HypXERC20Lockbox__factory.connect(warpRouteConfig.token, provider);
172
+ xERC20Address = await hypXERC20Lockbox.xERC20();
173
+ }
174
+ const limits = {};
175
+ const xERC20Config = warpRouteConfig.xERC20;
176
+ if (xERC20Config?.warpRouteLimits) {
177
+ const warpRouteLimits = xERC20Config.warpRouteLimits;
178
+ if (warpRouteLimits.type === XERC20Type.Standard) {
179
+ if (warpRouteLimits.mint != null && warpRouteLimits.burn != null) {
180
+ limits[warpRouteAddress] = {
181
+ type: XERC20Type.Standard,
182
+ mint: warpRouteLimits.mint,
183
+ burn: warpRouteLimits.burn,
184
+ };
185
+ }
186
+ }
187
+ else if (warpRouteLimits.type === XERC20Type.Velo) {
188
+ if (warpRouteLimits.bufferCap != null &&
189
+ warpRouteLimits.rateLimitPerSecond != null) {
190
+ limits[warpRouteAddress] = {
191
+ type: XERC20Type.Velo,
192
+ bufferCap: warpRouteLimits.bufferCap,
193
+ rateLimitPerSecond: warpRouteLimits.rateLimitPerSecond,
194
+ };
195
+ }
196
+ }
197
+ }
198
+ if (xERC20Config?.extraBridges) {
199
+ for (const extraBridge of xERC20Config.extraBridges) {
200
+ const { lockbox, limits: bridgeLimits } = extraBridge;
201
+ if (bridgeLimits.type === XERC20Type.Standard) {
202
+ if (bridgeLimits.mint != null && bridgeLimits.burn != null) {
203
+ limits[lockbox] = {
204
+ type: XERC20Type.Standard,
205
+ mint: bridgeLimits.mint,
206
+ burn: bridgeLimits.burn,
207
+ };
208
+ }
209
+ }
210
+ else if (bridgeLimits.type === XERC20Type.Velo) {
211
+ if (bridgeLimits.bufferCap != null &&
212
+ bridgeLimits.rateLimitPerSecond != null) {
213
+ limits[lockbox] = {
214
+ type: XERC20Type.Velo,
215
+ bufferCap: bridgeLimits.bufferCap,
216
+ rateLimitPerSecond: bridgeLimits.rateLimitPerSecond,
217
+ };
218
+ }
219
+ }
220
+ }
221
+ }
222
+ const type = xERC20Config?.warpRouteLimits?.type === XERC20Type.Velo
223
+ ? XERC20Type.Velo
224
+ : XERC20Type.Standard;
225
+ const config = { type, limits };
226
+ const module = new EvmXERC20Module(multiProvider, {
227
+ addresses: { xERC20: xERC20Address, warpRoute: warpRouteAddress },
228
+ chain,
229
+ config,
230
+ });
231
+ return { module, config };
232
+ }
233
+ }
234
+ //# sourceMappingURL=EvmXERC20Module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmXERC20Module.js","sourceRoot":"","sources":["../../src/token/EvmXERC20Module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=EvmXERC20Module.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmXERC20Module.test.d.ts","sourceRoot":"","sources":["../../src/token/EvmXERC20Module.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,262 @@
1
+ import { expect } from 'chai';
2
+ import sinon from 'sinon';
3
+ import { TestChainName } from '../consts/testChains.js';
4
+ import { MultiProvider } from '../providers/MultiProvider.js';
5
+ import { EvmXERC20Module } from './EvmXERC20Module.js';
6
+ import { EvmXERC20Reader, } from './EvmXERC20Reader.js';
7
+ import { TokenType } from './config.js';
8
+ import { XERC20Type } from './types.js';
9
+ const XERC20_ADDRESS = '0x1111111111111111111111111111111111111111';
10
+ const WARP_ROUTE_ADDRESS = '0x5555555555555555555555555555555555555555';
11
+ const BRIDGE_ADDRESS_1 = '0x2222222222222222222222222222222222222222';
12
+ const EXTRA_BRIDGE_ADDRESS = '0x4444444444444444444444444444444444444444';
13
+ describe('EvmXERC20Module', () => {
14
+ let multiProvider;
15
+ let sandbox;
16
+ const createStandardConfig = () => ({
17
+ type: XERC20Type.Standard,
18
+ limits: {
19
+ [WARP_ROUTE_ADDRESS]: {
20
+ type: XERC20Type.Standard,
21
+ mint: '1000000000000000000',
22
+ burn: '500000000000000000',
23
+ },
24
+ [EXTRA_BRIDGE_ADDRESS]: {
25
+ type: XERC20Type.Standard,
26
+ mint: '2000000000000000000',
27
+ burn: '1000000000000000000',
28
+ },
29
+ },
30
+ });
31
+ const createVeloConfig = () => ({
32
+ type: XERC20Type.Velo,
33
+ limits: {
34
+ [WARP_ROUTE_ADDRESS]: {
35
+ type: XERC20Type.Velo,
36
+ bufferCap: '1000000000000000000',
37
+ rateLimitPerSecond: '100000000000000000',
38
+ },
39
+ [EXTRA_BRIDGE_ADDRESS]: {
40
+ type: XERC20Type.Velo,
41
+ bufferCap: '2000000000000000000',
42
+ rateLimitPerSecond: '200000000000000000',
43
+ },
44
+ },
45
+ });
46
+ const createModule = (config) => {
47
+ return new EvmXERC20Module(multiProvider, {
48
+ addresses: {
49
+ xERC20: XERC20_ADDRESS,
50
+ warpRoute: WARP_ROUTE_ADDRESS,
51
+ },
52
+ chain: TestChainName.test1,
53
+ config,
54
+ });
55
+ };
56
+ beforeEach(() => {
57
+ sandbox = sinon.createSandbox();
58
+ multiProvider = MultiProvider.createTestMultiProvider();
59
+ });
60
+ afterEach(() => {
61
+ sandbox.restore();
62
+ });
63
+ describe('constructor', () => {
64
+ it('creates module with standard config', () => {
65
+ const config = createStandardConfig();
66
+ const module = createModule(config);
67
+ expect(module.chainName).to.equal(TestChainName.test1);
68
+ expect(module.reader).to.be.instanceOf(EvmXERC20Reader);
69
+ });
70
+ it('creates module with velodrome config', () => {
71
+ const config = createVeloConfig();
72
+ const module = createModule(config);
73
+ expect(module.chainName).to.equal(TestChainName.test1);
74
+ });
75
+ });
76
+ describe('generateSetLimitsTxs', () => {
77
+ it('generates setLimits tx for Standard XERC20', async () => {
78
+ const config = createStandardConfig();
79
+ const module = createModule(config);
80
+ const limits = {
81
+ type: XERC20Type.Standard,
82
+ mint: '1000000000000000000',
83
+ burn: '500000000000000000',
84
+ };
85
+ const txs = await module.generateSetLimitsTxs(BRIDGE_ADDRESS_1, limits);
86
+ expect(txs).to.have.lengthOf(1);
87
+ expect(txs[0].annotation).to.include('XERC20 limit update');
88
+ expect(txs[0].chainId).to.equal(multiProvider.getEvmChainId(TestChainName.test1));
89
+ });
90
+ it('generates bufferCap and rateLimitPerSecond txs for Velodrome XERC20', async () => {
91
+ const config = createVeloConfig();
92
+ const module = createModule(config);
93
+ const limits = {
94
+ type: XERC20Type.Velo,
95
+ bufferCap: '1000000000000000000',
96
+ rateLimitPerSecond: '100000000000000000',
97
+ };
98
+ const txs = await module.generateSetLimitsTxs(BRIDGE_ADDRESS_1, limits);
99
+ expect(txs).to.have.lengthOf(2);
100
+ expect(txs[0].annotation).to.include('XERC20 limit update');
101
+ expect(txs[1].annotation).to.include('XERC20 limit update');
102
+ });
103
+ });
104
+ describe('generateAddBridgeTxs', () => {
105
+ it('delegates to generateSetLimitsTxs for Standard XERC20', async () => {
106
+ const config = createStandardConfig();
107
+ const module = createModule(config);
108
+ const limits = {
109
+ type: XERC20Type.Standard,
110
+ mint: '1000000000000000000',
111
+ burn: '500000000000000000',
112
+ };
113
+ const txs = await module.generateAddBridgeTxs(BRIDGE_ADDRESS_1, limits);
114
+ expect(txs).to.have.lengthOf(1);
115
+ });
116
+ it('generates addBridge tx for Velodrome XERC20', async () => {
117
+ const config = createVeloConfig();
118
+ const module = createModule(config);
119
+ const limits = {
120
+ type: XERC20Type.Velo,
121
+ bufferCap: '1000000000000000000',
122
+ rateLimitPerSecond: '100000000000000000',
123
+ };
124
+ const txs = await module.generateAddBridgeTxs(BRIDGE_ADDRESS_1, limits);
125
+ expect(txs).to.have.lengthOf(1);
126
+ expect(txs[0].annotation).to.include('XERC20 limit update');
127
+ });
128
+ });
129
+ describe('generateRemoveBridgeTxs', () => {
130
+ it('generates removeBridge tx for Velodrome XERC20', async () => {
131
+ const config = createVeloConfig();
132
+ const module = createModule(config);
133
+ const txs = await module.generateRemoveBridgeTxs(BRIDGE_ADDRESS_1);
134
+ expect(txs).to.have.lengthOf(1);
135
+ expect(txs[0].annotation).to.include('XERC20 limit update');
136
+ });
137
+ });
138
+ describe('update', () => {
139
+ it('returns empty array when no drift detected', async () => {
140
+ const config = createStandardConfig();
141
+ const module = createModule(config);
142
+ sandbox
143
+ .stub(module.reader, 'deriveXERC20TokenType')
144
+ .resolves(XERC20Type.Standard);
145
+ sandbox.stub(module.reader, 'readLimits').resolves(config.limits);
146
+ const txs = await module.update(config);
147
+ expect(txs).to.have.lengthOf(0);
148
+ });
149
+ it('generates txs for missing bridges', async () => {
150
+ const config = createStandardConfig();
151
+ const module = createModule(config);
152
+ sandbox
153
+ .stub(module.reader, 'deriveXERC20TokenType')
154
+ .resolves(XERC20Type.Standard);
155
+ sandbox.stub(module.reader, 'readLimits').resolves({
156
+ [WARP_ROUTE_ADDRESS]: {
157
+ type: XERC20Type.Standard,
158
+ mint: '1000000000000000000',
159
+ burn: '500000000000000000',
160
+ },
161
+ });
162
+ const txs = await module.update(config);
163
+ expect(txs.length).to.be.greaterThan(0);
164
+ });
165
+ it('generates txs for limit mismatches', async () => {
166
+ const config = createStandardConfig();
167
+ const module = createModule(config);
168
+ sandbox
169
+ .stub(module.reader, 'deriveXERC20TokenType')
170
+ .resolves(XERC20Type.Standard);
171
+ sandbox.stub(module.reader, 'readLimits').resolves({
172
+ [WARP_ROUTE_ADDRESS]: {
173
+ type: XERC20Type.Standard,
174
+ mint: '999999999999999999',
175
+ burn: '500000000000000000',
176
+ },
177
+ [EXTRA_BRIDGE_ADDRESS]: {
178
+ type: XERC20Type.Standard,
179
+ mint: '2000000000000000000',
180
+ burn: '1000000000000000000',
181
+ },
182
+ });
183
+ const txs = await module.update(config);
184
+ expect(txs.length).to.be.greaterThan(0);
185
+ });
186
+ });
187
+ describe('fromWarpRouteConfig', () => {
188
+ it('creates module from standard warp route config', async () => {
189
+ const warpRouteConfig = {
190
+ type: TokenType.XERC20,
191
+ token: XERC20_ADDRESS,
192
+ xERC20: {
193
+ warpRouteLimits: {
194
+ type: XERC20Type.Standard,
195
+ mint: '1000000000000000000',
196
+ burn: '500000000000000000',
197
+ },
198
+ },
199
+ };
200
+ const { module, config } = await EvmXERC20Module.fromWarpRouteConfig(multiProvider, TestChainName.test1, warpRouteConfig, WARP_ROUTE_ADDRESS);
201
+ expect(module).to.be.instanceOf(EvmXERC20Module);
202
+ expect(config.type).to.equal(XERC20Type.Standard);
203
+ expect(config.limits[WARP_ROUTE_ADDRESS]).to.deep.equal({
204
+ type: XERC20Type.Standard,
205
+ mint: '1000000000000000000',
206
+ burn: '500000000000000000',
207
+ });
208
+ });
209
+ it('creates module from velodrome warp route config', async () => {
210
+ const warpRouteConfig = {
211
+ type: TokenType.XERC20,
212
+ token: XERC20_ADDRESS,
213
+ xERC20: {
214
+ warpRouteLimits: {
215
+ type: XERC20Type.Velo,
216
+ bufferCap: '1000000000000000000',
217
+ rateLimitPerSecond: '100000000000000000',
218
+ },
219
+ },
220
+ };
221
+ const { module, config } = await EvmXERC20Module.fromWarpRouteConfig(multiProvider, TestChainName.test1, warpRouteConfig, WARP_ROUTE_ADDRESS);
222
+ expect(module).to.be.instanceOf(EvmXERC20Module);
223
+ expect(config.type).to.equal(XERC20Type.Velo);
224
+ expect(config.limits[WARP_ROUTE_ADDRESS]).to.deep.equal({
225
+ type: XERC20Type.Velo,
226
+ bufferCap: '1000000000000000000',
227
+ rateLimitPerSecond: '100000000000000000',
228
+ });
229
+ });
230
+ it('includes extra bridges in config', async () => {
231
+ const warpRouteConfig = {
232
+ type: TokenType.XERC20,
233
+ token: XERC20_ADDRESS,
234
+ xERC20: {
235
+ warpRouteLimits: {
236
+ type: XERC20Type.Standard,
237
+ mint: '1000000000000000000',
238
+ burn: '500000000000000000',
239
+ },
240
+ extraBridges: [
241
+ {
242
+ lockbox: EXTRA_BRIDGE_ADDRESS,
243
+ limits: {
244
+ type: XERC20Type.Standard,
245
+ mint: '2000000000000000000',
246
+ burn: '1000000000000000000',
247
+ },
248
+ },
249
+ ],
250
+ },
251
+ };
252
+ const { config } = await EvmXERC20Module.fromWarpRouteConfig(multiProvider, TestChainName.test1, warpRouteConfig, WARP_ROUTE_ADDRESS);
253
+ expect(Object.keys(config.limits)).to.have.lengthOf(2);
254
+ expect(config.limits[EXTRA_BRIDGE_ADDRESS]).to.deep.equal({
255
+ type: XERC20Type.Standard,
256
+ mint: '2000000000000000000',
257
+ burn: '1000000000000000000',
258
+ });
259
+ });
260
+ });
261
+ });
262
+ //# sourceMappingURL=EvmXERC20Module.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmXERC20Module.test.js","sourceRoot":"","sources":["../../src/token/EvmXERC20Module.test.ts"],"names":[],"mappings":"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"}