@hyperlane-xyz/cli 3.1.9 → 3.2.0-alpha

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 (228) hide show
  1. package/README.md +6 -1
  2. package/dist/cli.d.ts +1 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +27 -3
  5. package/dist/cli.js.map +1 -1
  6. package/dist/env.d.ts +2 -0
  7. package/dist/env.d.ts.map +1 -0
  8. package/dist/env.js +14 -0
  9. package/dist/env.js.map +1 -0
  10. package/dist/src/avs/config.d.ts +11 -0
  11. package/dist/src/avs/config.d.ts.map +1 -0
  12. package/dist/src/avs/config.js +10 -0
  13. package/dist/src/avs/config.js.map +1 -0
  14. package/dist/src/avs/stakeRegistry.d.ts +19 -0
  15. package/dist/src/avs/stakeRegistry.d.ts.map +1 -0
  16. package/dist/src/avs/stakeRegistry.js +94 -0
  17. package/dist/src/avs/stakeRegistry.js.map +1 -0
  18. package/dist/src/commands/avs.d.ts +12 -0
  19. package/dist/src/commands/avs.d.ts.map +1 -0
  20. package/dist/src/commands/avs.js +58 -0
  21. package/dist/src/commands/avs.js.map +1 -0
  22. package/dist/src/commands/chains.d.ts.map +1 -1
  23. package/dist/src/commands/chains.js +46 -27
  24. package/dist/src/commands/chains.js.map +1 -1
  25. package/dist/src/commands/config.js +74 -85
  26. package/dist/src/commands/config.js.map +1 -1
  27. package/dist/src/commands/deploy.d.ts.map +1 -1
  28. package/dist/src/commands/deploy.js +58 -91
  29. package/dist/src/commands/deploy.js.map +1 -1
  30. package/dist/src/commands/hook.d.ts +12 -0
  31. package/dist/src/commands/hook.d.ts.map +1 -0
  32. package/dist/src/commands/hook.js +34 -0
  33. package/dist/src/commands/hook.js.map +1 -0
  34. package/dist/src/commands/ism.d.ts +12 -0
  35. package/dist/src/commands/ism.d.ts.map +1 -0
  36. package/dist/src/commands/ism.js +36 -0
  37. package/dist/src/commands/ism.js.map +1 -0
  38. package/dist/src/commands/options.d.ts +19 -7
  39. package/dist/src/commands/options.d.ts.map +1 -1
  40. package/dist/src/commands/options.js +90 -27
  41. package/dist/src/commands/options.js.map +1 -1
  42. package/dist/src/commands/send.d.ts +14 -1
  43. package/dist/src/commands/send.d.ts.map +1 -1
  44. package/dist/src/commands/send.js +32 -55
  45. package/dist/src/commands/send.js.map +1 -1
  46. package/dist/src/commands/signCommands.d.ts +3 -0
  47. package/dist/src/commands/signCommands.d.ts.map +1 -0
  48. package/dist/src/commands/signCommands.js +11 -0
  49. package/dist/src/commands/signCommands.js.map +1 -0
  50. package/dist/src/commands/status.d.ts +5 -2
  51. package/dist/src/commands/status.d.ts.map +1 -1
  52. package/dist/src/commands/status.js +9 -19
  53. package/dist/src/commands/status.js.map +1 -1
  54. package/dist/src/config/chain.d.ts +5 -7
  55. package/dist/src/config/chain.d.ts.map +1 -1
  56. package/dist/src/config/chain.js +94 -64
  57. package/dist/src/config/chain.js.map +1 -1
  58. package/dist/src/config/chain.test.d.ts +2 -0
  59. package/dist/src/config/chain.test.d.ts.map +1 -0
  60. package/dist/src/config/chain.test.js +9 -0
  61. package/dist/src/config/chain.test.js.map +1 -0
  62. package/dist/src/config/hooks.d.ts +91 -214
  63. package/dist/src/config/hooks.d.ts.map +1 -1
  64. package/dist/src/config/hooks.js +218 -122
  65. package/dist/src/config/hooks.js.map +1 -1
  66. package/dist/src/config/ism.d.ts +74 -0
  67. package/dist/src/config/ism.d.ts.map +1 -0
  68. package/dist/src/config/ism.js +223 -0
  69. package/dist/src/config/ism.js.map +1 -0
  70. package/dist/src/config/multisig.d.ts +4 -14
  71. package/dist/src/config/multisig.d.ts.map +1 -1
  72. package/dist/src/config/multisig.js +35 -29
  73. package/dist/src/config/multisig.js.map +1 -1
  74. package/dist/src/config/warp.d.ts +7 -180
  75. package/dist/src/config/warp.d.ts.map +1 -1
  76. package/dist/src/config/warp.js +55 -62
  77. package/dist/src/config/warp.js.map +1 -1
  78. package/dist/src/consts.d.ts +1 -0
  79. package/dist/src/consts.d.ts.map +1 -1
  80. package/dist/src/consts.js +1 -0
  81. package/dist/src/consts.js.map +1 -1
  82. package/dist/src/context/context.d.ts +14 -0
  83. package/dist/src/context/context.d.ts.map +1 -0
  84. package/dist/src/context/context.js +108 -0
  85. package/dist/src/context/context.js.map +1 -0
  86. package/dist/src/context/types.d.ts +33 -0
  87. package/dist/src/context/types.d.ts.map +1 -0
  88. package/dist/src/context/types.js.map +1 -0
  89. package/dist/src/deploy/agent.d.ts +6 -4
  90. package/dist/src/deploy/agent.d.ts.map +1 -1
  91. package/dist/src/deploy/agent.js +10 -24
  92. package/dist/src/deploy/agent.js.map +1 -1
  93. package/dist/src/deploy/core.d.ts +10 -7
  94. package/dist/src/deploy/core.d.ts.map +1 -1
  95. package/dist/src/deploy/core.js +156 -160
  96. package/dist/src/deploy/core.js.map +1 -1
  97. package/dist/src/deploy/dry-run.d.ts +19 -0
  98. package/dist/src/deploy/dry-run.d.ts.map +1 -0
  99. package/dist/src/deploy/dry-run.js +45 -0
  100. package/dist/src/deploy/dry-run.js.map +1 -0
  101. package/dist/src/deploy/utils.d.ts +15 -8
  102. package/dist/src/deploy/utils.d.ts.map +1 -1
  103. package/dist/src/deploy/utils.js +60 -11
  104. package/dist/src/deploy/utils.js.map +1 -1
  105. package/dist/src/deploy/warp.d.ts +4 -7
  106. package/dist/src/deploy/warp.d.ts.map +1 -1
  107. package/dist/src/deploy/warp.js +131 -169
  108. package/dist/src/deploy/warp.js.map +1 -1
  109. package/dist/src/hook/read.d.ts +13 -0
  110. package/dist/src/hook/read.d.ts.map +1 -0
  111. package/dist/src/hook/read.js +25 -0
  112. package/dist/src/hook/read.js.map +1 -0
  113. package/dist/src/ism/read.d.ts +13 -0
  114. package/dist/src/ism/read.d.ts.map +1 -0
  115. package/dist/src/ism/read.js +25 -0
  116. package/dist/src/ism/read.js.map +1 -0
  117. package/dist/src/logger.d.ts +17 -0
  118. package/dist/src/logger.d.ts.map +1 -0
  119. package/dist/src/logger.js +32 -0
  120. package/dist/src/logger.js.map +1 -0
  121. package/dist/src/registry/MergedRegistry.d.ts +35 -0
  122. package/dist/src/registry/MergedRegistry.d.ts.map +1 -0
  123. package/dist/src/registry/MergedRegistry.js +83 -0
  124. package/dist/src/registry/MergedRegistry.js.map +1 -0
  125. package/dist/src/send/message.d.ts +7 -6
  126. package/dist/src/send/message.d.ts.map +1 -1
  127. package/dist/src/send/message.js +40 -22
  128. package/dist/src/send/message.js.map +1 -1
  129. package/dist/src/send/transfer.d.ts +8 -10
  130. package/dist/src/send/transfer.d.ts.map +1 -1
  131. package/dist/src/send/transfer.js +68 -70
  132. package/dist/src/send/transfer.js.map +1 -1
  133. package/dist/src/status/message.d.ts +7 -5
  134. package/dist/src/status/message.d.ts.map +1 -1
  135. package/dist/src/status/message.js +25 -12
  136. package/dist/src/status/message.js.map +1 -1
  137. package/dist/src/submit/submit.d.ts +5 -0
  138. package/dist/src/submit/submit.d.ts.map +1 -0
  139. package/dist/src/submit/submit.js +30 -0
  140. package/dist/src/submit/submit.js.map +1 -0
  141. package/dist/src/submit/types.d.ts +18 -0
  142. package/dist/src/submit/types.d.ts.map +1 -0
  143. package/dist/src/submit/types.js +2 -0
  144. package/dist/src/{deploy → submit}/types.js.map +1 -1
  145. package/dist/src/tests/deployTestErc20.d.ts +2 -0
  146. package/dist/src/tests/deployTestErc20.d.ts.map +1 -0
  147. package/dist/src/tests/deployTestErc20.js +26 -0
  148. package/dist/src/tests/deployTestErc20.js.map +1 -0
  149. package/dist/src/tests/hooks.test.d.ts +2 -0
  150. package/dist/src/tests/hooks.test.d.ts.map +1 -0
  151. package/dist/src/tests/hooks.test.js +83 -0
  152. package/dist/src/tests/hooks.test.js.map +1 -0
  153. package/dist/src/tests/ism.test.d.ts +2 -0
  154. package/dist/src/tests/ism.test.d.ts.map +1 -0
  155. package/dist/src/tests/ism.test.js +76 -0
  156. package/dist/src/tests/ism.test.js.map +1 -0
  157. package/dist/src/tests/multisig.test.d.ts +2 -0
  158. package/dist/src/tests/multisig.test.d.ts.map +1 -0
  159. package/dist/src/tests/multisig.test.js +34 -0
  160. package/dist/src/tests/multisig.test.js.map +1 -0
  161. package/dist/src/utils/balances.d.ts +2 -4
  162. package/dist/src/utils/balances.d.ts.map +1 -1
  163. package/dist/src/utils/balances.js +8 -12
  164. package/dist/src/utils/balances.js.map +1 -1
  165. package/dist/src/utils/chains.d.ts +3 -2
  166. package/dist/src/utils/chains.d.ts.map +1 -1
  167. package/dist/src/utils/chains.js +42 -23
  168. package/dist/src/utils/chains.js.map +1 -1
  169. package/dist/src/utils/env.d.ts +6 -0
  170. package/dist/src/utils/env.d.ts.map +1 -0
  171. package/dist/src/utils/env.js +9 -0
  172. package/dist/src/utils/env.js.map +1 -0
  173. package/dist/src/utils/files.d.ts +7 -4
  174. package/dist/src/utils/files.d.ts.map +1 -1
  175. package/dist/src/utils/files.js +52 -29
  176. package/dist/src/utils/files.js.map +1 -1
  177. package/dist/src/utils/keys.d.ts +28 -1
  178. package/dist/src/utils/keys.d.ts.map +1 -1
  179. package/dist/src/utils/keys.js +65 -6
  180. package/dist/src/utils/keys.js.map +1 -1
  181. package/dist/src/utils/time.d.ts.map +1 -1
  182. package/dist/src/utils/time.js +8 -1
  183. package/dist/src/utils/time.js.map +1 -1
  184. package/dist/src/utils/time.test.d.ts +2 -0
  185. package/dist/src/utils/time.test.d.ts.map +1 -0
  186. package/dist/src/utils/time.test.js +9 -0
  187. package/dist/src/utils/time.test.js.map +1 -0
  188. package/dist/src/utils/tokens.d.ts +3 -0
  189. package/dist/src/utils/tokens.d.ts.map +1 -0
  190. package/dist/src/utils/tokens.js +14 -0
  191. package/dist/src/utils/tokens.js.map +1 -0
  192. package/dist/src/utils/version-check.d.ts +2 -0
  193. package/dist/src/utils/version-check.d.ts.map +1 -0
  194. package/dist/src/utils/version-check.js +15 -0
  195. package/dist/src/utils/version-check.js.map +1 -0
  196. package/dist/src/version.d.ts +2 -0
  197. package/dist/src/version.d.ts.map +1 -0
  198. package/dist/src/version.js +2 -0
  199. package/dist/src/version.js.map +1 -0
  200. package/examples/chain-config.yaml +38 -40
  201. package/examples/contract-artifacts.yaml +4 -4
  202. package/examples/hooks.yaml +66 -0
  203. package/examples/ism-advanced.yaml +33 -0
  204. package/examples/{multisig-ism.yaml → ism.yaml} +0 -8
  205. package/examples/warp-route-deployment.yaml +32 -0
  206. package/package.json +27 -14
  207. package/dist/logger.d.ts +0 -13
  208. package/dist/logger.d.ts.map +0 -1
  209. package/dist/logger.js +0 -44
  210. package/dist/logger.js.map +0 -1
  211. package/dist/src/config/artifacts.d.ts +0 -3
  212. package/dist/src/config/artifacts.d.ts.map +0 -1
  213. package/dist/src/config/artifacts.js +0 -18
  214. package/dist/src/config/artifacts.js.map +0 -1
  215. package/dist/src/context.d.ts +0 -388
  216. package/dist/src/context.d.ts.map +0 -1
  217. package/dist/src/context.js +0 -30
  218. package/dist/src/context.js.map +0 -1
  219. package/dist/src/deploy/TestRecipientDeployer.d.ts +0 -20
  220. package/dist/src/deploy/TestRecipientDeployer.d.ts.map +0 -1
  221. package/dist/src/deploy/TestRecipientDeployer.js +0 -36
  222. package/dist/src/deploy/TestRecipientDeployer.js.map +0 -1
  223. package/dist/src/deploy/types.d.ts +0 -21
  224. package/dist/src/deploy/types.d.ts.map +0 -1
  225. package/examples/anvil-chains.yaml +0 -22
  226. package/examples/hook-config.yaml +0 -18
  227. package/examples/warp-tokens.yaml +0 -26
  228. /package/dist/src/{deploy → context}/types.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/ism/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAiC,MAAM,sBAAsB,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD;;GAEG;AACH,wBAAsB,aAAa,CAAC,EAClC,OAAO,EACP,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE;IACD,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhB"}
@@ -0,0 +1,25 @@
1
+ import { EvmIsmReader } from '@hyperlane-xyz/sdk';
2
+ import { ProtocolType, stringifyObject } from '@hyperlane-xyz/utils';
3
+ import { log, logBlue, logRed } from '../logger.js';
4
+ import { resolveFileFormat, writeFileAtPath } from '../utils/files.js';
5
+ /**
6
+ * Read ISM config for a specified chain and address, logging or writing result to file.
7
+ */
8
+ export async function readIsmConfig({ context, chain, address, out, }) {
9
+ if (context.multiProvider.getProtocol(chain) === ProtocolType.Ethereum) {
10
+ const ismReader = new EvmIsmReader(context.multiProvider, chain);
11
+ const config = await ismReader.deriveIsmConfig(address);
12
+ const stringConfig = stringifyObject(config, resolveFileFormat(out), 2);
13
+ if (!out) {
14
+ logBlue(`ISM Config at ${address} on ${chain}:`);
15
+ log(stringConfig);
16
+ }
17
+ else {
18
+ writeFileAtPath(out, stringConfig + '\n');
19
+ logBlue(`ISM Config written to ${out}.`);
20
+ }
21
+ return;
22
+ }
23
+ logRed('Unsupported chain. Currently this command supports EVM chains only.');
24
+ }
25
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/ism/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAW,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG9E,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,OAAO,EACP,KAAK,EACL,OAAO,EACP,GAAG,GAMJ;IACC,IAAI,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,QAAQ,EAAE,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,iBAAiB,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC;YACjD,GAAG,CAAC,YAAY,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,yBAAyB,GAAG,GAAG,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,qEAAqE,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { ChalkInstance } from 'chalk';
2
+ import { pino } from 'pino';
3
+ import { LogFormat, LogLevel } from '@hyperlane-xyz/utils';
4
+ export declare function configureLogger(logFormat: LogFormat, logLevel: LogLevel): void;
5
+ export declare const log: (msg: string, ...args: any) => void;
6
+ export declare function logColor(level: pino.Level, chalkInstance: ChalkInstance, ...args: any): void;
7
+ export declare const logBlue: (...args: any) => void;
8
+ export declare const logPink: (...args: any) => void;
9
+ export declare const logGray: (...args: any) => void;
10
+ export declare const logGreen: (...args: any) => void;
11
+ export declare const logRed: (...args: any) => void;
12
+ export declare const logBoldUnderlinedRed: (...args: any) => void;
13
+ export declare const logTip: (...args: any) => void;
14
+ export declare const warnYellow: (...args: any) => void;
15
+ export declare const errorRed: (...args: any) => void;
16
+ export declare const logTable: (...args: any) => void;
17
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EACL,SAAS,EACT,QAAQ,EAKT,MAAM,sBAAsB,CAAC;AAI9B,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,QAKvE;AAED,eAAO,MAAM,GAAG,QAAS,MAAM,WAAW,GAAG,SAA8B,CAAC;AAE5E,wBAAgB,QAAQ,CACtB,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,aAAa,EAAE,aAAa,EAC5B,GAAG,IAAI,EAAE,GAAG,QASb;AACD,eAAO,MAAM,OAAO,YAAa,GAAG,SAA0C,CAAC;AAC/E,eAAO,MAAM,OAAO,YAAa,GAAG,SACY,CAAC;AACjD,eAAO,MAAM,OAAO,YAAa,GAAG,SAA0C,CAAC;AAC/E,eAAO,MAAM,QAAQ,YAAa,GAAG,SACG,CAAC;AACzC,eAAO,MAAM,MAAM,YAAa,GAAG,SAAyC,CAAC;AAC7E,eAAO,MAAM,oBAAoB,YAAa,GAAG,SACI,CAAC;AACtD,eAAO,MAAM,MAAM,YAAa,GAAG,SACQ,CAAC;AAC5C,eAAO,MAAM,UAAU,YAAa,GAAG,SACE,CAAC;AAC1C,eAAO,MAAM,QAAQ,YAAa,GAAG,SAA0C,CAAC;AAGhF,eAAO,MAAM,QAAQ,YAAa,GAAG,SAA2B,CAAC"}
@@ -0,0 +1,32 @@
1
+ import chalk from 'chalk';
2
+ import { LogFormat, LogLevel, configureRootLogger, getLogFormat, rootLogger, safelyAccessEnvVar, } from '@hyperlane-xyz/utils';
3
+ let logger = rootLogger;
4
+ export function configureLogger(logFormat, logLevel) {
5
+ logFormat =
6
+ logFormat || safelyAccessEnvVar('LOG_FORMAT', true) || LogFormat.Pretty;
7
+ logLevel = logLevel || safelyAccessEnvVar('LOG_LEVEL', true) || LogLevel.Info;
8
+ logger = configureRootLogger(logFormat, logLevel).child({ module: 'cli' });
9
+ }
10
+ export const log = (msg, ...args) => logger.info(msg, ...args);
11
+ export function logColor(level, chalkInstance, ...args) {
12
+ // Only use color when pretty is enabled
13
+ if (getLogFormat() === LogFormat.Pretty) {
14
+ logger[level](chalkInstance(...args));
15
+ }
16
+ else {
17
+ // @ts-ignore pino type more restrictive than pino's actual arg handling
18
+ logger[level](...args);
19
+ }
20
+ }
21
+ export const logBlue = (...args) => logColor('info', chalk.blue, ...args);
22
+ export const logPink = (...args) => logColor('info', chalk.magentaBright, ...args);
23
+ export const logGray = (...args) => logColor('info', chalk.gray, ...args);
24
+ export const logGreen = (...args) => logColor('info', chalk.green, ...args);
25
+ export const logRed = (...args) => logColor('info', chalk.red, ...args);
26
+ export const logBoldUnderlinedRed = (...args) => logColor('info', chalk.red.bold.underline, ...args);
27
+ export const logTip = (...args) => logColor('info', chalk.bgYellow, ...args);
28
+ export const warnYellow = (...args) => logColor('warn', chalk.yellow, ...args);
29
+ export const errorRed = (...args) => logColor('error', chalk.red, ...args);
30
+ // No support for table in pino so print directly to console
31
+ export const logTable = (...args) => console.table(...args);
32
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { Logger } from 'pino';
2
+ import { BaseRegistry, ChainAddresses, IRegistry, RegistryContent, RegistryType } from '@hyperlane-xyz/registry';
3
+ import { ChainMap, ChainMetadata, ChainName, WarpCoreConfig } from '@hyperlane-xyz/sdk';
4
+ export interface MergedRegistryOptions {
5
+ registryUris: Array<string>;
6
+ isDryRun?: boolean;
7
+ logger?: Logger;
8
+ }
9
+ export declare class MergedRegistry extends BaseRegistry implements IRegistry {
10
+ readonly type = RegistryType.Local;
11
+ readonly registries: Array<IRegistry>;
12
+ readonly isDryRun: boolean;
13
+ constructor({ registryUris, logger, isDryRun }: MergedRegistryOptions);
14
+ listRegistryContent(): Promise<RegistryContent>;
15
+ getChains(): Promise<Array<ChainName>>;
16
+ getMetadata(): Promise<ChainMap<ChainMetadata>>;
17
+ getChainMetadata(chainName: ChainName): Promise<ChainMetadata | null>;
18
+ getAddresses(): Promise<ChainMap<ChainAddresses>>;
19
+ getChainAddresses(chainName: ChainName): Promise<ChainAddresses | null>;
20
+ addChain(chain: {
21
+ chainName: ChainName;
22
+ metadata?: ChainMetadata;
23
+ addresses?: ChainAddresses;
24
+ }): Promise<void>;
25
+ updateChain(chain: {
26
+ chainName: ChainName;
27
+ metadata?: ChainMetadata;
28
+ addresses?: ChainAddresses;
29
+ }): Promise<void>;
30
+ removeChain(chain: ChainName): Promise<void>;
31
+ addWarpRoute(config: WarpCoreConfig): Promise<void>;
32
+ protected multiRegistryRead<R>(readFn: (registry: IRegistry) => Promise<R> | R): Promise<(Awaited<R> | Awaited<R>)[]>;
33
+ protected multiRegistryWrite(writeFn: (registry: IRegistry) => Promise<void>, logMsg: string): Promise<void>;
34
+ }
35
+ //# sourceMappingURL=MergedRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MergedRegistry.d.ts","sourceRoot":"","sources":["../../../src/registry/MergedRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EACL,YAAY,EACZ,cAAc,EAEd,SAAS,EACT,eAAe,EACf,YAAY,EACb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,QAAQ,EACR,aAAa,EACb,SAAS,EACT,cAAc,EACf,MAAM,oBAAoB,CAAC;AAQ5B,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,SAAS;IACnE,SAAgB,IAAI,sBAAsB;IAC1C,SAAgB,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7C,SAAgB,QAAQ,EAAE,OAAO,CAAC;gBAEtB,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,qBAAqB;IAkB/D,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC;IAU/C,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAItC,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAK/C,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIrE,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAKjD,iBAAiB,CACrB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI3B,QAAQ,CAAC,KAAK,EAAE;QACpB,SAAS,EAAE,SAAS,CAAC;QACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;QACzB,SAAS,CAAC,EAAE,cAAc,CAAC;KAC5B,GAAG,OAAO,CAAC,IAAI,CAAC;IAOX,WAAW,CAAC,KAAK,EAAE;QACvB,SAAS,EAAE,SAAS,CAAC;QACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;QACzB,SAAS,CAAC,EAAE,cAAc,CAAC;KAC5B,GAAG,OAAO,CAAC,IAAI,CAAC;IAOX,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD,SAAS,CAAC,iBAAiB,CAAC,CAAC,EAC3B,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;cAKjC,kBAAkB,CAChC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,EAC/C,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;CAuBjB"}
@@ -0,0 +1,83 @@
1
+ import { BaseRegistry, GithubRegistry, RegistryType, } from '@hyperlane-xyz/registry';
2
+ import { LocalRegistry } from '@hyperlane-xyz/registry/local';
3
+ import { isHttpsUrl, objKeys, objMerge, rootLogger, } from '@hyperlane-xyz/utils';
4
+ export class MergedRegistry extends BaseRegistry {
5
+ type = RegistryType.Local;
6
+ registries;
7
+ isDryRun;
8
+ constructor({ registryUris, logger, isDryRun }) {
9
+ logger ||= rootLogger.child({ module: 'MergedRegistry' });
10
+ super({ uri: '__merged_registry__', logger });
11
+ if (!registryUris.length)
12
+ throw new Error('At least one registry URI is required');
13
+ this.registries = registryUris.map((uri, index) => {
14
+ if (isHttpsUrl(uri)) {
15
+ return new GithubRegistry({ uri, logger: logger.child({ index }) });
16
+ }
17
+ else {
18
+ return new LocalRegistry({ uri, logger: logger.child({ index }) });
19
+ }
20
+ });
21
+ this.isDryRun = !!isDryRun;
22
+ }
23
+ async listRegistryContent() {
24
+ const results = await this.multiRegistryRead((r) => r.listRegistryContent());
25
+ return results.reduce((acc, content) => objMerge(acc, content), {
26
+ chains: {},
27
+ deployments: {},
28
+ });
29
+ }
30
+ async getChains() {
31
+ return objKeys(await this.getMetadata);
32
+ }
33
+ async getMetadata() {
34
+ const results = await this.multiRegistryRead((r) => r.getMetadata());
35
+ return results.reduce((acc, content) => objMerge(acc, content), {});
36
+ }
37
+ async getChainMetadata(chainName) {
38
+ return (await this.getMetadata())[chainName] || null;
39
+ }
40
+ async getAddresses() {
41
+ const results = await this.multiRegistryRead((r) => r.getAddresses());
42
+ return results.reduce((acc, content) => objMerge(acc, content), {});
43
+ }
44
+ async getChainAddresses(chainName) {
45
+ return (await this.getAddresses())[chainName] || null;
46
+ }
47
+ async addChain(chain) {
48
+ return this.multiRegistryWrite(async (registry) => await registry.addChain(chain), `adding chain ${chain.chainName}`);
49
+ }
50
+ async updateChain(chain) {
51
+ return this.multiRegistryWrite(async (registry) => await registry.updateChain(chain), `updating chain ${chain.chainName}`);
52
+ }
53
+ async removeChain(chain) {
54
+ return this.multiRegistryWrite(async (registry) => await registry.removeChain(chain), `removing chain ${chain}`);
55
+ }
56
+ async addWarpRoute(config) {
57
+ return this.multiRegistryWrite(async (registry) => await registry.addWarpRoute(config), 'adding warp route');
58
+ }
59
+ multiRegistryRead(readFn) {
60
+ return Promise.all(this.registries.map(readFn));
61
+ }
62
+ async multiRegistryWrite(writeFn, logMsg) {
63
+ if (this.isDryRun)
64
+ return;
65
+ for (const registry of this.registries) {
66
+ // TODO remove this when GithubRegistry supports write methods
67
+ if (registry.type === RegistryType.Github) {
68
+ this.logger.warn(`skipping ${logMsg} at ${registry.type} registry`);
69
+ continue;
70
+ }
71
+ try {
72
+ this.logger.info(`${logMsg} at ${registry.type} registry at ${registry.uri}`);
73
+ await writeFn(registry);
74
+ this.logger.info(`done ${logMsg} at ${registry.type} registry`);
75
+ }
76
+ catch (error) {
77
+ // To prevent loss of artifacts, MergedRegistry write methods are failure tolerant
78
+ this.logger.error(`failure ${logMsg} at ${registry.type} registry`, error);
79
+ }
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=MergedRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MergedRegistry.js","sourceRoot":"","sources":["../../../src/registry/MergedRegistry.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { ChainName } from '@hyperlane-xyz/sdk';
2
- export declare function sendTestMessage({ key, chainConfigPath, coreArtifactsPath, origin, destination, timeoutSec, skipWaitForDelivery, }: {
3
- key: string;
4
- chainConfigPath: string;
5
- coreArtifactsPath: string;
6
- origin: ChainName;
7
- destination: ChainName;
2
+ import { WriteCommandContext } from '../context/types.js';
3
+ export declare function sendTestMessage({ context, origin, destination, messageBody, timeoutSec, skipWaitForDelivery, selfRelay, }: {
4
+ context: WriteCommandContext;
5
+ origin?: ChainName;
6
+ destination?: ChainName;
7
+ messageBody: string;
8
8
  timeoutSec: number;
9
9
  skipWaitForDelivery: boolean;
10
+ selfRelay?: boolean;
10
11
  }): Promise<void>;
11
12
  //# sourceMappingURL=message.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/send/message.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EAIV,MAAM,oBAAoB,CAAC;AAgB5B,wBAAsB,eAAe,CAAC,EACpC,GAAG,EACH,eAAe,EACf,iBAAiB,EACjB,MAAM,EACN,WAAW,EACX,UAAU,EACV,mBAAmB,GACpB,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,iBAyBA"}
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/send/message.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAiB,MAAM,oBAAoB,CAAC;AAI9D,OAAO,EAAkB,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAK1E,wBAAsB,eAAe,CAAC,EACpC,OAAO,EACP,MAAM,EACN,WAAW,EACX,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,SAAS,GACV,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,iBAqCA"}
@@ -1,55 +1,73 @@
1
- import { HyperlaneCore, } from '@hyperlane-xyz/sdk';
1
+ import { ethers } from 'ethers';
2
+ import { HyperlaneCore } from '@hyperlane-xyz/sdk';
2
3
  import { addressToBytes32, timeout } from '@hyperlane-xyz/utils';
3
- import { errorRed, log, logBlue, logGreen } from '../../logger.js';
4
- import { readDeploymentArtifacts } from '../config/artifacts.js';
5
4
  import { MINIMUM_TEST_SEND_GAS } from '../consts.js';
6
- import { getContextWithSigner, getMergedContractAddresses, } from '../context.js';
7
5
  import { runPreflightChecks } from '../deploy/utils.js';
8
- const MESSAGE_BODY = '0x48656c6c6f21'; // Hello!'
9
- // TODO improve the UX here by making params optional and
10
- // prompting for missing values
11
- export async function sendTestMessage({ key, chainConfigPath, coreArtifactsPath, origin, destination, timeoutSec, skipWaitForDelivery, }) {
12
- const { signer, multiProvider } = getContextWithSigner(key, chainConfigPath);
13
- const coreArtifacts = coreArtifactsPath
14
- ? readDeploymentArtifacts(coreArtifactsPath)
15
- : undefined;
6
+ import { errorRed, log, logBlue, logGreen } from '../logger.js';
7
+ import { runSingleChainSelectionStep } from '../utils/chains.js';
8
+ export async function sendTestMessage({ context, origin, destination, messageBody, timeoutSec, skipWaitForDelivery, selfRelay, }) {
9
+ const { chainMetadata } = context;
10
+ if (!origin) {
11
+ origin = await runSingleChainSelectionStep(chainMetadata, 'Select the origin chain');
12
+ }
13
+ if (!destination) {
14
+ destination = await runSingleChainSelectionStep(chainMetadata, 'Select the destination chain');
15
+ }
16
16
  await runPreflightChecks({
17
+ context,
17
18
  origin,
18
19
  remotes: [destination],
19
- multiProvider,
20
- signer,
21
20
  minGas: MINIMUM_TEST_SEND_GAS,
21
+ chainsToGasCheck: [origin],
22
22
  });
23
23
  await timeout(executeDelivery({
24
+ context,
24
25
  origin,
25
26
  destination,
26
- multiProvider,
27
- coreArtifacts,
27
+ messageBody,
28
28
  skipWaitForDelivery,
29
+ selfRelay,
29
30
  }), timeoutSec * 1000, 'Timed out waiting for messages to be delivered');
30
31
  }
31
- async function executeDelivery({ origin, destination, multiProvider, coreArtifacts, skipWaitForDelivery, }) {
32
- const mergedContractAddrs = getMergedContractAddresses(coreArtifacts);
33
- const core = HyperlaneCore.fromAddressesMap(mergedContractAddrs, multiProvider);
32
+ async function executeDelivery({ context, origin, destination, messageBody, skipWaitForDelivery, selfRelay, }) {
33
+ const { registry, multiProvider } = context;
34
+ const chainAddresses = await registry.getAddresses();
35
+ const core = HyperlaneCore.fromAddressesMap(chainAddresses, multiProvider);
34
36
  const mailbox = core.getContracts(origin).mailbox;
37
+ let hook = chainAddresses[origin]?.customHook;
38
+ if (hook) {
39
+ logBlue(`Using custom hook ${hook} for ${origin} -> ${destination}`);
40
+ }
41
+ else {
42
+ hook = await mailbox.defaultHook();
43
+ logBlue(`Using default hook ${hook} for ${origin} -> ${destination}`);
44
+ }
35
45
  const destinationDomain = multiProvider.getDomainId(destination);
36
46
  let txReceipt;
37
47
  try {
38
- const recipient = mergedContractAddrs[destination].testRecipient;
48
+ const recipient = chainAddresses[destination].testRecipient;
39
49
  if (!recipient) {
40
50
  throw new Error(`Unable to find TestRecipient for ${destination}`);
41
51
  }
42
52
  const formattedRecipient = addressToBytes32(recipient);
43
53
  log('Getting gas quote');
44
- const value = await mailbox['quoteDispatch(uint32,bytes32,bytes)'](destinationDomain, formattedRecipient, MESSAGE_BODY);
54
+ const value = await mailbox['quoteDispatch(uint32,bytes32,bytes,bytes,address)'](destinationDomain, formattedRecipient, messageBody, ethers.utils.hexlify([]), hook);
45
55
  log(`Paying for gas with ${value} wei`);
46
56
  log('Dispatching message');
47
- const messageTx = await mailbox['dispatch(uint32,bytes32,bytes)'](destinationDomain, formattedRecipient, MESSAGE_BODY, { value });
57
+ const messageTx = await mailbox['dispatch(uint32,bytes32,bytes,bytes,address)'](destinationDomain, formattedRecipient, messageBody, ethers.utils.hexlify([]), hook, {
58
+ value,
59
+ });
48
60
  txReceipt = await multiProvider.handleTx(origin, messageTx);
49
61
  const message = core.getDispatchedMessages(txReceipt)[0];
50
62
  logBlue(`Sent message from ${origin} to ${recipient} on ${destination}.`);
51
63
  logBlue(`Message ID: ${message.id}`);
52
64
  log(`Message: ${JSON.stringify(message)}`);
65
+ if (selfRelay) {
66
+ log('Attempting self-relay of message');
67
+ await core.relayMessage(message);
68
+ logGreen('Message was self-relayed!');
69
+ return;
70
+ }
53
71
  }
54
72
  catch (e) {
55
73
  errorRed(`Encountered error sending message from ${origin} to ${destination}`);
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/send/message.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,aAAa,GAEd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,YAAY,GAAG,gBAAgB,CAAC,CAAC,UAAU;AAEjD,yDAAyD;AACzD,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,GAAG,EACH,eAAe,EACf,iBAAiB,EACjB,MAAM,EACN,WAAW,EACX,UAAU,EACV,mBAAmB,GASpB;IACC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC7E,MAAM,aAAa,GAAG,iBAAiB;QACrC,CAAC,CAAC,uBAAuB,CAAC,iBAAiB,CAAC;QAC5C,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,kBAAkB,CAAC;QACvB,MAAM;QACN,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,aAAa;QACb,MAAM;QACN,MAAM,EAAE,qBAAqB;KAC9B,CAAC,CAAC;IAEH,MAAM,OAAO,CACX,eAAe,CAAC;QACd,MAAM;QACN,WAAW;QACX,aAAa;QACb,aAAa;QACb,mBAAmB;KACpB,CAAC,EACF,UAAU,GAAG,IAAI,EACjB,gDAAgD,CACjD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,EAC7B,MAAM,EACN,WAAW,EACX,aAAa,EACb,aAAa,EACb,mBAAmB,GAOpB;IACC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,aAAa,CAAC,gBAAgB,CACzC,mBAAmB,EACnB,aAAa,CACd,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;IAElD,MAAM,iBAAiB,GAAG,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IACjE,IAAI,SAAiC,CAAC;IACtC,IAAI;QACF,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC;QACjE,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAC;SACpE;QACD,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAEvD,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,qCAAqC,CAAC,CAChE,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,CACb,CAAC;QACF,GAAG,CAAC,uBAAuB,KAAK,MAAM,CAAC,CAAC;QAExC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,gCAAgC,CAAC,CAC/D,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,EAAE,KAAK,EAAE,CACV,CAAC;QACF,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,qBAAqB,MAAM,OAAO,SAAS,OAAO,WAAW,GAAG,CAAC,CAAC;QAC1E,OAAO,CAAC,eAAe,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,GAAG,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;KAC5C;IAAC,OAAO,CAAC,EAAE;QACV,QAAQ,CACN,0CAA0C,MAAM,OAAO,WAAW,EAAE,CACrE,CAAC;QACF,MAAM,CAAC,CAAC;KACT;IAED,IAAI,mBAAmB;QAAE,OAAO;IAEhC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAC5D,sBAAsB;IACtB,MAAM,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACzD,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/send/message.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,14 @@
1
- import { ChainName, TokenType } from '@hyperlane-xyz/sdk';
2
- import { Address } from '@hyperlane-xyz/utils';
3
- export declare function sendTestTransfer({ key, chainConfigPath, coreArtifactsPath, origin, destination, routerAddress, tokenType, wei, recipient, timeoutSec, skipWaitForDelivery, }: {
4
- key: string;
5
- chainConfigPath: string;
6
- coreArtifactsPath: string;
7
- origin: ChainName;
8
- destination: ChainName;
9
- routerAddress: Address;
10
- tokenType: TokenType;
1
+ import { ChainName } from '@hyperlane-xyz/sdk';
2
+ import { WriteCommandContext } from '../context/types.js';
3
+ export declare function sendTestTransfer({ context, warpConfigPath, origin, destination, wei, recipient, timeoutSec, skipWaitForDelivery, selfRelay, }: {
4
+ context: WriteCommandContext;
5
+ warpConfigPath: string;
6
+ origin?: ChainName;
7
+ destination?: ChainName;
11
8
  wei: string;
12
9
  recipient?: string;
13
10
  timeoutSec: number;
14
11
  skipWaitForDelivery: boolean;
12
+ selfRelay?: boolean;
15
13
  }): Promise<void>;
16
14
  //# sourceMappingURL=transfer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../src/send/transfer.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,SAAS,EAMT,SAAS,EACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAW,MAAM,sBAAsB,CAAC;AAcxD,wBAAsB,gBAAgB,CAAC,EACrC,GAAG,EACH,eAAe,EACf,iBAAiB,EACjB,MAAM,EACN,WAAW,EACX,aAAa,EACb,SAAS,EACT,GAAG,EACH,SAAS,EACT,UAAU,EACV,mBAAmB,GACpB,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,EAAE,SAAS,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,iBA8CA"}
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../src/send/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAQV,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAM1D,wBAAsB,gBAAgB,CAAC,EACrC,OAAO,EACP,cAAc,EACd,MAAM,EACN,WAAW,EACX,GAAG,EACH,SAAS,EACT,UAAU,EACV,mBAAmB,EACnB,SAAS,GACV,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,iBAyCA"}
@@ -1,101 +1,99 @@
1
- import { BigNumber, ethers } from 'ethers';
2
- import { ERC20__factory, HypERC20Collateral__factory, } from '@hyperlane-xyz/core';
3
- import { EvmHypCollateralAdapter, HyperlaneCore, MultiProtocolProvider, TokenType, } from '@hyperlane-xyz/sdk';
1
+ import { HyperlaneCore, MultiProtocolProvider, ProviderType, TokenAmount, WarpCore, } from '@hyperlane-xyz/sdk';
4
2
  import { timeout } from '@hyperlane-xyz/utils';
5
- import { log, logBlue, logGreen } from '../../logger.js';
6
- import { readDeploymentArtifacts } from '../config/artifacts.js';
3
+ import { readWarpRouteConfig } from '../config/warp.js';
7
4
  import { MINIMUM_TEST_SEND_GAS } from '../consts.js';
8
- import { getContextWithSigner, getMergedContractAddresses, } from '../context.js';
9
5
  import { runPreflightChecks } from '../deploy/utils.js';
10
- import { assertNativeBalances, assertTokenBalance } from '../utils/balances.js';
11
- // TODO improve the UX here by making params optional and
12
- // prompting for missing values
13
- export async function sendTestTransfer({ key, chainConfigPath, coreArtifactsPath, origin, destination, routerAddress, tokenType, wei, recipient, timeoutSec, skipWaitForDelivery, }) {
14
- const { signer, multiProvider } = getContextWithSigner(key, chainConfigPath);
15
- const artifacts = coreArtifactsPath
16
- ? readDeploymentArtifacts(coreArtifactsPath)
17
- : undefined;
18
- if (tokenType === TokenType.collateral) {
19
- await assertTokenBalance(multiProvider, signer, origin, routerAddress, wei.toString());
6
+ import { logBlue, logGreen, logRed } from '../logger.js';
7
+ import { runSingleChainSelectionStep } from '../utils/chains.js';
8
+ import { runTokenSelectionStep } from '../utils/tokens.js';
9
+ export async function sendTestTransfer({ context, warpConfigPath, origin, destination, wei, recipient, timeoutSec, skipWaitForDelivery, selfRelay, }) {
10
+ const { chainMetadata } = context;
11
+ const warpCoreConfig = readWarpRouteConfig(warpConfigPath);
12
+ if (!origin) {
13
+ origin = await runSingleChainSelectionStep(chainMetadata, 'Select the origin chain');
20
14
  }
21
- else if (tokenType === TokenType.native) {
22
- await assertNativeBalances(multiProvider, signer, [origin], wei.toString());
23
- }
24
- else {
25
- throw new Error('Only collateral and native token types are currently supported in the CLI. For synthetic transfers, try the Warp UI.');
15
+ if (!destination) {
16
+ destination = await runSingleChainSelectionStep(chainMetadata, 'Select the destination chain');
26
17
  }
27
18
  await runPreflightChecks({
19
+ context,
28
20
  origin,
29
21
  remotes: [destination],
30
- multiProvider,
31
- signer,
32
22
  minGas: MINIMUM_TEST_SEND_GAS,
23
+ chainsToGasCheck: [origin],
33
24
  });
34
25
  await timeout(executeDelivery({
26
+ context,
35
27
  origin,
36
28
  destination,
37
- routerAddress,
38
- tokenType,
29
+ warpCoreConfig,
39
30
  wei,
40
31
  recipient,
41
- signer,
42
- multiProvider,
43
- artifacts,
44
32
  skipWaitForDelivery,
33
+ selfRelay,
45
34
  }), timeoutSec * 1000, 'Timed out waiting for messages to be delivered');
46
35
  }
47
- async function executeDelivery({ origin, destination, routerAddress, tokenType, wei, recipient, multiProvider, signer, artifacts, skipWaitForDelivery, }) {
36
+ async function executeDelivery({ context, origin, destination, warpCoreConfig, wei, recipient, skipWaitForDelivery, selfRelay, }) {
37
+ const { signer, multiProvider, registry } = context;
48
38
  const signerAddress = await signer.getAddress();
49
- recipient || (recipient = signerAddress);
50
- const mergedContractAddrs = getMergedContractAddresses(artifacts);
51
- const core = HyperlaneCore.fromAddressesMap(mergedContractAddrs, multiProvider);
39
+ recipient ||= signerAddress;
40
+ const chainAddresses = await registry.getAddresses();
41
+ const core = HyperlaneCore.fromAddressesMap(chainAddresses, multiProvider);
52
42
  const provider = multiProvider.getProvider(origin);
53
43
  const connectedSigner = signer.connect(provider);
54
- if (tokenType === TokenType.collateral) {
55
- const wrappedToken = await getWrappedToken(routerAddress, provider);
56
- const token = ERC20__factory.connect(wrappedToken, connectedSigner);
57
- const approval = await token.allowance(signerAddress, routerAddress);
58
- if (approval.lt(wei)) {
59
- const approveTx = await token.approve(routerAddress, wei);
60
- await approveTx.wait();
61
- }
44
+ const warpCore = WarpCore.FromConfig(MultiProtocolProvider.fromMultiProvider(multiProvider), warpCoreConfig);
45
+ let token;
46
+ const tokensForRoute = warpCore.getTokensForRoute(origin, destination);
47
+ if (tokensForRoute.length === 0) {
48
+ logRed(`No Warp Routes found from ${origin} to ${destination}`);
49
+ throw new Error('Error finding warp route');
62
50
  }
63
- // TODO move next section into MultiProtocolTokenApp when it exists
64
- const adapter = new EvmHypCollateralAdapter(origin, MultiProtocolProvider.fromMultiProvider(multiProvider), { token: routerAddress });
65
- const destinationDomain = multiProvider.getDomainId(destination);
66
- const gasPayment = await adapter.quoteGasPayment(destinationDomain);
67
- const txValue = tokenType === TokenType.native
68
- ? BigNumber.from(gasPayment).add(wei).toString()
69
- : gasPayment;
70
- const transferTx = await adapter.populateTransferRemoteTx({
71
- weiAmountOrId: wei,
72
- destination: destinationDomain,
73
- recipient,
74
- txValue,
51
+ else if (tokensForRoute.length === 1) {
52
+ token = tokensForRoute[0];
53
+ }
54
+ else {
55
+ logBlue(`Please select a token from the Warp config`);
56
+ const routerAddress = await runTokenSelectionStep(tokensForRoute);
57
+ token = warpCore.findToken(origin, routerAddress);
58
+ }
59
+ const senderAddress = await signer.getAddress();
60
+ const errors = await warpCore.validateTransfer({
61
+ originTokenAmount: token.amount(wei),
62
+ destination,
63
+ recipient: recipient ?? senderAddress,
64
+ sender: senderAddress,
65
+ });
66
+ if (errors) {
67
+ logRed('Error validating transfer', JSON.stringify(errors));
68
+ throw new Error('Error validating transfer');
69
+ }
70
+ const transferTxs = await warpCore.getTransferRemoteTxs({
71
+ originTokenAmount: new TokenAmount(wei, token),
72
+ destination,
73
+ sender: senderAddress,
74
+ recipient: recipient ?? senderAddress,
75
75
  });
76
- const txResponse = await connectedSigner.sendTransaction(transferTx);
77
- const txReceipt = await multiProvider.handleTx(origin, txResponse);
78
- const message = core.getDispatchedMessages(txReceipt)[0];
76
+ const txReceipts = [];
77
+ for (const tx of transferTxs) {
78
+ if (tx.type === ProviderType.EthersV5) {
79
+ const txResponse = await connectedSigner.sendTransaction(tx.transaction);
80
+ const txReceipt = await multiProvider.handleTx(origin, txResponse);
81
+ txReceipts.push(txReceipt);
82
+ }
83
+ }
84
+ const transferTxReceipt = txReceipts[txReceipts.length - 1];
85
+ const message = core.getDispatchedMessages(transferTxReceipt)[0];
79
86
  logBlue(`Sent message from ${origin} to ${recipient} on ${destination}.`);
80
87
  logBlue(`Message ID: ${message.id}`);
88
+ if (selfRelay) {
89
+ await core.relayMessage(message);
90
+ logGreen('Message was self-relayed!');
91
+ return;
92
+ }
81
93
  if (skipWaitForDelivery)
82
94
  return;
83
95
  // Max wait 10 minutes
84
- await core.waitForMessageProcessed(txReceipt, 10000, 60);
96
+ await core.waitForMessageProcessed(transferTxReceipt, 10000, 60);
85
97
  logGreen(`Transfer sent to destination chain!`);
86
98
  }
87
- async function getWrappedToken(address, provider) {
88
- try {
89
- const contract = HypERC20Collateral__factory.connect(address, provider);
90
- const wrappedToken = await contract.wrappedToken();
91
- if (ethers.utils.isAddress(wrappedToken))
92
- return wrappedToken;
93
- else
94
- throw new Error('Invalid wrapped token address');
95
- }
96
- catch (error) {
97
- log('Error getting wrapped token', error);
98
- throw new Error(`Could not get wrapped token from router address ${address}`);
99
- }
100
- }
101
99
  //# sourceMappingURL=transfer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../src/send/transfer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../src/send/transfer.ts"],"names":[],"mappings":"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"}