@hyperlane-xyz/cli 3.10.1-beta1 → 3.11.1-alpha.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 (174) hide show
  1. package/dist/cli.js +15 -5
  2. package/dist/cli.js.map +1 -1
  3. package/dist/src/avs/config.d.ts +11 -0
  4. package/dist/src/avs/config.d.ts.map +1 -0
  5. package/dist/src/avs/config.js +10 -0
  6. package/dist/src/avs/config.js.map +1 -0
  7. package/dist/src/avs/stakeRegistry.d.ts +20 -0
  8. package/dist/src/avs/stakeRegistry.d.ts.map +1 -0
  9. package/dist/src/avs/stakeRegistry.js +92 -0
  10. package/dist/src/avs/stakeRegistry.js.map +1 -0
  11. package/dist/src/commands/avs.d.ts +12 -0
  12. package/dist/src/commands/avs.d.ts.map +1 -0
  13. package/dist/src/commands/avs.js +62 -0
  14. package/dist/src/commands/avs.js.map +1 -0
  15. package/dist/src/commands/chains.d.ts.map +1 -1
  16. package/dist/src/commands/chains.js +40 -34
  17. package/dist/src/commands/chains.js.map +1 -1
  18. package/dist/src/commands/config.d.ts.map +1 -1
  19. package/dist/src/commands/config.js +41 -82
  20. package/dist/src/commands/config.js.map +1 -1
  21. package/dist/src/commands/deploy.d.ts +0 -6
  22. package/dist/src/commands/deploy.d.ts.map +1 -1
  23. package/dist/src/commands/deploy.js +28 -79
  24. package/dist/src/commands/deploy.js.map +1 -1
  25. package/dist/src/commands/hook.d.ts +6 -1
  26. package/dist/src/commands/hook.d.ts.map +1 -1
  27. package/dist/src/commands/hook.js +6 -14
  28. package/dist/src/commands/hook.js.map +1 -1
  29. package/dist/src/commands/ism.d.ts +6 -1
  30. package/dist/src/commands/ism.d.ts.map +1 -1
  31. package/dist/src/commands/ism.js +5 -13
  32. package/dist/src/commands/ism.js.map +1 -1
  33. package/dist/src/commands/options.d.ts +6 -33
  34. package/dist/src/commands/options.d.ts.map +1 -1
  35. package/dist/src/commands/options.js +42 -41
  36. package/dist/src/commands/options.js.map +1 -1
  37. package/dist/src/commands/send.d.ts +7 -1
  38. package/dist/src/commands/send.d.ts.map +1 -1
  39. package/dist/src/commands/send.js +23 -58
  40. package/dist/src/commands/send.js.map +1 -1
  41. package/dist/src/commands/signCommands.d.ts +3 -0
  42. package/dist/src/commands/signCommands.d.ts.map +1 -0
  43. package/dist/src/commands/signCommands.js +11 -0
  44. package/dist/src/commands/signCommands.js.map +1 -0
  45. package/dist/src/commands/status.d.ts +5 -2
  46. package/dist/src/commands/status.d.ts.map +1 -1
  47. package/dist/src/commands/status.js +6 -15
  48. package/dist/src/commands/status.js.map +1 -1
  49. package/dist/src/config/chain.d.ts +5 -7
  50. package/dist/src/config/chain.d.ts.map +1 -1
  51. package/dist/src/config/chain.js +37 -48
  52. package/dist/src/config/chain.js.map +1 -1
  53. package/dist/src/config/chain.test.js +1 -5
  54. package/dist/src/config/chain.test.js.map +1 -1
  55. package/dist/src/config/hooks.d.ts +7 -8
  56. package/dist/src/config/hooks.d.ts.map +1 -1
  57. package/dist/src/config/hooks.js +18 -20
  58. package/dist/src/config/hooks.js.map +1 -1
  59. package/dist/src/config/ism.d.ts +3 -4
  60. package/dist/src/config/ism.d.ts.map +1 -1
  61. package/dist/src/config/ism.js +3 -5
  62. package/dist/src/config/ism.js.map +1 -1
  63. package/dist/src/config/multisig.d.ts +3 -4
  64. package/dist/src/config/multisig.d.ts.map +1 -1
  65. package/dist/src/config/multisig.js +5 -7
  66. package/dist/src/config/multisig.js.map +1 -1
  67. package/dist/src/config/warp.d.ts +6 -36
  68. package/dist/src/config/warp.d.ts.map +1 -1
  69. package/dist/src/config/warp.js +16 -13
  70. package/dist/src/config/warp.js.map +1 -1
  71. package/dist/src/consts.d.ts +1 -0
  72. package/dist/src/consts.d.ts.map +1 -1
  73. package/dist/src/consts.js +1 -0
  74. package/dist/src/consts.js.map +1 -1
  75. package/dist/src/context/context.d.ts +14 -0
  76. package/dist/src/context/context.d.ts.map +1 -0
  77. package/dist/src/context/context.js +104 -0
  78. package/dist/src/context/context.js.map +1 -0
  79. package/dist/src/context/types.d.ts +32 -0
  80. package/dist/src/context/types.d.ts.map +1 -0
  81. package/dist/src/context/types.js +2 -0
  82. package/dist/src/context/types.js.map +1 -0
  83. package/dist/src/deploy/agent.d.ts +6 -5
  84. package/dist/src/deploy/agent.d.ts.map +1 -1
  85. package/dist/src/deploy/agent.js +4 -6
  86. package/dist/src/deploy/agent.js.map +1 -1
  87. package/dist/src/deploy/core.d.ts +4 -7
  88. package/dist/src/deploy/core.d.ts.map +1 -1
  89. package/dist/src/deploy/core.js +61 -73
  90. package/dist/src/deploy/core.js.map +1 -1
  91. package/dist/src/deploy/dry-run.d.ts +1 -2
  92. package/dist/src/deploy/dry-run.d.ts.map +1 -1
  93. package/dist/src/deploy/dry-run.js.map +1 -1
  94. package/dist/src/deploy/utils.d.ts +9 -11
  95. package/dist/src/deploy/utils.d.ts.map +1 -1
  96. package/dist/src/deploy/utils.js +13 -11
  97. package/dist/src/deploy/utils.js.map +1 -1
  98. package/dist/src/deploy/warp.d.ts +3 -7
  99. package/dist/src/deploy/warp.d.ts.map +1 -1
  100. package/dist/src/deploy/warp.js +28 -64
  101. package/dist/src/deploy/warp.js.map +1 -1
  102. package/dist/src/hook/read.d.ts +4 -5
  103. package/dist/src/hook/read.d.ts.map +1 -1
  104. package/dist/src/hook/read.js +8 -12
  105. package/dist/src/hook/read.js.map +1 -1
  106. package/dist/src/ism/read.d.ts +4 -5
  107. package/dist/src/ism/read.d.ts.map +1 -1
  108. package/dist/src/ism/read.js +8 -12
  109. package/dist/src/ism/read.js.map +1 -1
  110. package/dist/src/registry/MergedRegistry.d.ts +35 -0
  111. package/dist/src/registry/MergedRegistry.d.ts.map +1 -0
  112. package/dist/src/registry/MergedRegistry.js +83 -0
  113. package/dist/src/registry/MergedRegistry.js.map +1 -0
  114. package/dist/src/send/message.d.ts +3 -4
  115. package/dist/src/send/message.d.ts.map +1 -1
  116. package/dist/src/send/message.js +14 -19
  117. package/dist/src/send/message.js.map +1 -1
  118. package/dist/src/send/transfer.d.ts +3 -6
  119. package/dist/src/send/transfer.d.ts.map +1 -1
  120. package/dist/src/send/transfer.js +26 -41
  121. package/dist/src/send/transfer.js.map +1 -1
  122. package/dist/src/status/message.d.ts +3 -4
  123. package/dist/src/status/message.d.ts.map +1 -1
  124. package/dist/src/status/message.js +5 -12
  125. package/dist/src/status/message.js.map +1 -1
  126. package/dist/src/utils/chains.d.ts +3 -2
  127. package/dist/src/utils/chains.d.ts.map +1 -1
  128. package/dist/src/utils/chains.js +29 -15
  129. package/dist/src/utils/chains.js.map +1 -1
  130. package/dist/src/utils/files.d.ts +1 -7
  131. package/dist/src/utils/files.d.ts.map +1 -1
  132. package/dist/src/utils/files.js +10 -27
  133. package/dist/src/utils/files.js.map +1 -1
  134. package/dist/src/utils/keys.d.ts +15 -4
  135. package/dist/src/utils/keys.d.ts.map +1 -1
  136. package/dist/src/utils/keys.js +11 -16
  137. package/dist/src/utils/keys.js.map +1 -1
  138. package/dist/src/utils/tokens.d.ts +3 -0
  139. package/dist/src/utils/tokens.d.ts.map +1 -0
  140. package/dist/src/utils/tokens.js +14 -0
  141. package/dist/src/utils/tokens.js.map +1 -0
  142. package/dist/src/utils/version-check.d.ts.map +1 -1
  143. package/dist/src/utils/version-check.js +5 -0
  144. package/dist/src/utils/version-check.js.map +1 -1
  145. package/dist/src/version.d.ts +1 -1
  146. package/dist/src/version.d.ts.map +1 -1
  147. package/dist/src/version.js +1 -1
  148. package/dist/src/version.js.map +1 -1
  149. package/examples/chain-config.yaml +38 -46
  150. package/examples/warp-route-deployment.yaml +2 -4
  151. package/package.json +5 -4
  152. package/dist/src/config/artifacts.d.ts +0 -16
  153. package/dist/src/config/artifacts.d.ts.map +0 -1
  154. package/dist/src/config/artifacts.js +0 -48
  155. package/dist/src/config/artifacts.js.map +0 -1
  156. package/dist/src/context.d.ts +0 -64
  157. package/dist/src/context.d.ts.map +0 -1
  158. package/dist/src/context.js +0 -113
  159. package/dist/src/context.js.map +0 -1
  160. package/dist/src/context.test.d.ts +0 -2
  161. package/dist/src/context.test.d.ts.map +0 -1
  162. package/dist/src/context.test.js +0 -21
  163. package/dist/src/context.test.js.map +0 -1
  164. package/dist/src/utils/fork.d.ts +0 -37
  165. package/dist/src/utils/fork.d.ts.map +0 -1
  166. package/dist/src/utils/fork.js +0 -91
  167. package/dist/src/utils/fork.js.map +0 -1
  168. package/examples/anvil-chains.yaml +0 -22
  169. package/examples/dry-run/anvil-chains.yaml +0 -17
  170. package/examples/dry-run/ism.yaml +0 -8
  171. package/examples/dry-run/warp-route-deployment.yaml +0 -4
  172. package/examples/fork/anvil-chains.yaml +0 -21
  173. package/examples/fork/ism.yaml +0 -9
  174. package/examples/fork/warp-route-deployment.yaml +0 -34
package/dist/cli.js CHANGED
@@ -2,14 +2,16 @@
2
2
  import chalk from 'chalk';
3
3
  import yargs from 'yargs';
4
4
  import './env.js';
5
+ import { avsCommand } from './src/commands/avs.js';
5
6
  import { chainsCommand } from './src/commands/chains.js';
6
7
  import { configCommand } from './src/commands/config.js';
7
8
  import { deployCommand } from './src/commands/deploy.js';
8
9
  import { hookCommand } from './src/commands/hook.js';
9
10
  import { ismCommand } from './src/commands/ism.js';
10
- import { logFormatCommandOption, logLevelCommandOption, } from './src/commands/options.js';
11
+ import { keyCommandOption, logFormatCommandOption, logLevelCommandOption, overrideRegistryUriCommandOption, registryUriCommandOption, skipConfirmationOption, } from './src/commands/options.js';
11
12
  import { sendCommand } from './src/commands/send.js';
12
13
  import { statusCommand } from './src/commands/status.js';
14
+ import { contextMiddleware } from './src/context/context.js';
13
15
  import { configureLogger, errorRed } from './src/logger.js';
14
16
  import { checkVersion } from './src/utils/version-check.js';
15
17
  import { VERSION } from './src/version.js';
@@ -22,10 +24,18 @@ try {
22
24
  .scriptName('hyperlane')
23
25
  .option('log', logFormatCommandOption)
24
26
  .option('verbosity', logLevelCommandOption)
25
- .global(['log', 'verbosity'])
26
- .middleware((argv) => {
27
- configureLogger(argv.log, argv.verbosity);
28
- })
27
+ .option('registry', registryUriCommandOption)
28
+ .option('overrides', overrideRegistryUriCommandOption)
29
+ .option('key', keyCommandOption)
30
+ .option('yes', skipConfirmationOption)
31
+ .global(['log', 'verbosity', 'registry', 'overrides', 'yes'])
32
+ .middleware([
33
+ (argv) => {
34
+ configureLogger(argv.log, argv.verbosity);
35
+ },
36
+ contextMiddleware,
37
+ ])
38
+ .command(avsCommand)
29
39
  .command(chainsCommand)
30
40
  .command(configCommand)
31
41
  .command(deployCommand)
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,mBAAmB;AACnB,MAAM,oBAAoB,GAAG,iCAAiC,CAAC;AAE/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAEjE,MAAM,YAAY,EAAE,CAAC;AAErB,IAAI,CAAC;IACH,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC/B,UAAU,CAAC,WAAW,CAAC;SACvB,MAAM,CAAC,KAAK,EAAE,sBAAsB,CAAC;SACrC,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;SAC1C,MAAM,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;SAC5B,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;QACnB,eAAe,CAAC,IAAI,CAAC,GAAgB,EAAE,IAAI,CAAC,SAAqB,CAAC,CAAC;IACrE,CAAC,CAAC;SACD,OAAO,CAAC,aAAa,CAAC;SACtB,OAAO,CAAC,aAAa,CAAC;SACtB,OAAO,CAAC,aAAa,CAAC;SACtB,OAAO,CAAC,WAAW,CAAC;SACpB,OAAO,CAAC,UAAU,CAAC;SACnB,OAAO,CAAC,WAAW,CAAC;SACpB,OAAO,CAAC,aAAa,CAAC;SACtB,OAAO,CAAC,OAAO,CAAC;SAChB,aAAa,EAAE;SACf,MAAM,EAAE;SACR,IAAI,EAAE;SACN,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACxB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAAE,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,GAAG;YAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC,IAAI,CAAC;AACZ,CAAC;AAAC,OAAO,KAAU,EAAE,CAAC;IACpB,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ChainMap } from '@hyperlane-xyz/sdk';
2
+ import { Address } from '@hyperlane-xyz/utils';
3
+ interface AVSContracts {
4
+ avsDirectory: Address;
5
+ proxyAdmin: Address;
6
+ ecdsaStakeRegistry: Address;
7
+ hyperlaneServiceManager: Address;
8
+ }
9
+ export declare const avsAddresses: ChainMap<AVSContracts>;
10
+ export {};
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/avs/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,UAAU,YAAY;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAGD,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,YAAY,CAO/C,CAAC"}
@@ -0,0 +1,10 @@
1
+ // TODO: move to registry
2
+ export const avsAddresses = {
3
+ holesky: {
4
+ avsDirectory: '0x055733000064333CaDDbC92763c58BF0192fFeBf',
5
+ proxyAdmin: '0x6e7b29cb2a7617405b4d30c6f84bbd51b4bb4be8',
6
+ ecdsaStakeRegistry: '0x275aCcCa81cAD931dC6fB6E49ED233Bc99Bed4A7',
7
+ hyperlaneServiceManager: '0x16B710b86CAd07E6F1C531861a16F5feC29dba37',
8
+ },
9
+ };
10
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/avs/config.ts"],"names":[],"mappings":"AAUA,yBAAyB;AACzB,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,OAAO,EAAE;QACP,YAAY,EAAE,4CAA4C;QAC1D,UAAU,EAAE,4CAA4C;QACxD,kBAAkB,EAAE,4CAA4C;QAChE,uBAAuB,EAAE,4CAA4C;KACtE;CACF,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { BigNumberish } from 'ethers';
2
+ import { BytesLike } from 'ethers/lib/utils.js';
3
+ import { ChainName } from '@hyperlane-xyz/sdk';
4
+ import { WriteCommandContext } from '../context/types.js';
5
+ export type SignatureWithSaltAndExpiryStruct = {
6
+ signature: BytesLike;
7
+ salt: BytesLike;
8
+ expiry: BigNumberish;
9
+ };
10
+ export declare function registerOperatorWithSignature({ context, chain, operatorKeyPath, }: {
11
+ context: WriteCommandContext;
12
+ chain: ChainName;
13
+ operatorKeyPath: string;
14
+ }): Promise<void>;
15
+ export declare function deregisterOperator({ context, chain, operatorKeyPath, }: {
16
+ context: WriteCommandContext;
17
+ chain: ChainName;
18
+ operatorKeyPath: string;
19
+ }): Promise<void>;
20
+ //# sourceMappingURL=stakeRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stakeRegistry.d.ts","sourceRoot":"","sources":["../../../src/avs/stakeRegistry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAyB,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,SAAS,EAA4B,MAAM,qBAAqB,CAAC;AAG1E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAO1D,MAAM,MAAM,gCAAgC,GAAG;IAC7C,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,wBAAsB,6BAA6B,CAAC,EAClD,OAAO,EACP,KAAK,EACL,eAAe,GAChB,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB,iBAiDA;AAED,wBAAsB,kBAAkB,CAAC,EACvC,OAAO,EACP,KAAK,EACL,eAAe,GAChB,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB,iBA+BA"}
@@ -0,0 +1,92 @@
1
+ import { password } from '@inquirer/prompts';
2
+ import { ethers, utils } from 'ethers';
3
+ import { joinSignature, keccak256 } from 'ethers/lib/utils.js';
4
+ import { ECDSAStakeRegistry__factory } from '@hyperlane-xyz/core';
5
+ import { addressToBytes32 } from '@hyperlane-xyz/utils';
6
+ import { MINIMUM_AVS_GAS } from '../consts.js';
7
+ import { runPreflightChecksForChains } from '../deploy/utils.js';
8
+ import { log, logBlue } from '../logger.js';
9
+ import { readFileAtPath, resolvePath } from '../utils/files.js';
10
+ import { avsAddresses } from './config.js';
11
+ export async function registerOperatorWithSignature({ context, chain, operatorKeyPath, }) {
12
+ const { multiProvider, signer } = context;
13
+ await runPreflightChecksForChains({
14
+ context,
15
+ chains: [chain],
16
+ minGas: MINIMUM_AVS_GAS,
17
+ });
18
+ const provider = multiProvider.getProvider(chain);
19
+ const connectedSigner = signer.connect(provider);
20
+ // Read the encrypted JSON key from the file
21
+ const encryptedJson = readFileAtPath(resolvePath(operatorKeyPath));
22
+ const keyFilePassword = await password({
23
+ mask: '*',
24
+ message: 'Enter the password for the operator key file: ',
25
+ });
26
+ const operator = await ethers.Wallet.fromEncryptedJson(encryptedJson, keyFilePassword);
27
+ const stakeRegistryAddress = avsAddresses[chain].ecdsaStakeRegistry;
28
+ const ecdsaStakeRegistry = ECDSAStakeRegistry__factory.connect(stakeRegistryAddress, connectedSigner);
29
+ const domainId = multiProvider.getDomainId(chain);
30
+ const operatorSignature = await getOperatorSignature(domainId, avsAddresses[chain].hyperlaneServiceManager, avsAddresses[chain].avsDirectory, operator);
31
+ log(`Registering operator ${operator.address} with signature on ${chain}...`);
32
+ await multiProvider.handleTx(chain, ecdsaStakeRegistry.registerOperatorWithSignature(operator.address, operatorSignature));
33
+ logBlue(`Operator ${operator.address} registered to Hyperlane AVS`);
34
+ }
35
+ export async function deregisterOperator({ context, chain, operatorKeyPath, }) {
36
+ const { multiProvider } = context;
37
+ // Read the encrypted JSON key from the file
38
+ const encryptedJson = readFileAtPath(resolvePath(operatorKeyPath));
39
+ const keyFilePassword = await password({
40
+ mask: '*',
41
+ message: 'Enter the password for the operator key file: ',
42
+ });
43
+ const operatorAsSigner = await ethers.Wallet.fromEncryptedJson(encryptedJson, keyFilePassword);
44
+ const provider = multiProvider.getProvider(chain);
45
+ const connectedSigner = operatorAsSigner.connect(provider);
46
+ const stakeRegistryAddress = avsAddresses[chain].ecdsaStakeRegistry;
47
+ const ecdsaStakeRegistry = ECDSAStakeRegistry__factory.connect(stakeRegistryAddress, connectedSigner);
48
+ log(`Deregistering operator ${operatorAsSigner.address} on ${chain}...`);
49
+ await multiProvider.handleTx(chain, ecdsaStakeRegistry.deregisterOperator());
50
+ logBlue(`Operator ${operatorAsSigner.address} deregistered from Hyperlane AVS`);
51
+ }
52
+ async function getOperatorSignature(domain, serviceManager, avsDirectory, operator) {
53
+ const operatorRegistrationTypehash = keccak256(ethers.utils.toUtf8Bytes('OperatorAVSRegistration(address operator,address avs,bytes32 salt,uint256 expiry)'));
54
+ const salt = utils.hexZeroPad(utils.randomBytes(32), 32);
55
+ // give a expiry timestamp 1 week from now
56
+ const expiry = utils.hexZeroPad(utils.hexlify(Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 7), 32);
57
+ const structHash = keccak256(ethers.utils.solidityPack(['bytes32', 'bytes32', 'bytes32', 'bytes32', 'bytes32'], [
58
+ operatorRegistrationTypehash,
59
+ addressToBytes32(operator.address),
60
+ addressToBytes32(serviceManager),
61
+ salt,
62
+ expiry,
63
+ ]));
64
+ const domainSeparator = getDomainSeparator(domain, avsDirectory);
65
+ const signingHash = ethers.utils.keccak256(ethers.utils.solidityPack(['bytes', 'bytes32', 'bytes32'], [ethers.utils.toUtf8Bytes('\x19\x01'), domainSeparator, structHash]));
66
+ // Eigenlayer's AVSDirectory expects the signature over raw signed hash instead of EIP-191 compatible toEthSignedMessageHash
67
+ // see https://github.com/Layr-Labs/eigenlayer-contracts/blob/ef2ea4a7459884f381057aa9bbcd29c7148cfb63/src/contracts/libraries/EIP1271SignatureUtils.sol#L22
68
+ const signature = operator
69
+ ._signingKey()
70
+ .signDigest(ethers.utils.arrayify(signingHash));
71
+ return {
72
+ signature: joinSignature(signature),
73
+ salt,
74
+ expiry,
75
+ };
76
+ }
77
+ function getDomainSeparator(domain, avsDirectory) {
78
+ if (!avsDirectory) {
79
+ throw new Error('Invalid domain for operator to the AVS, currently only Ethereum Mainnet and Holesky are supported.');
80
+ }
81
+ const domainTypehash = keccak256(ethers.utils.toUtf8Bytes('EIP712Domain(string name,uint256 chainId,address verifyingContract)'));
82
+ const domainBN = utils.hexZeroPad(utils.hexlify(domain), 32);
83
+ const eigenlayerDigest = keccak256(ethers.utils.toUtf8Bytes('EigenLayer'));
84
+ const domainSeparator = keccak256(ethers.utils.solidityPack(['bytes32', 'bytes32', 'bytes32', 'bytes32'], [
85
+ domainTypehash,
86
+ eigenlayerDigest,
87
+ domainBN,
88
+ addressToBytes32(avsDirectory),
89
+ ]));
90
+ return domainSeparator;
91
+ }
92
+ //# sourceMappingURL=stakeRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stakeRegistry.js","sourceRoot":"","sources":["../../../src/avs/stakeRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { CommandModule, Options } from 'yargs';
2
+ /**
3
+ * Parent command
4
+ */
5
+ export declare const avsCommand: CommandModule;
6
+ /**
7
+ * Registration command
8
+ */
9
+ export declare const registrationOptions: {
10
+ [k: string]: Options;
11
+ };
12
+ //# sourceMappingURL=avs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avs.d.ts","sourceRoot":"","sources":["../../../src/commands/avs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAW/C;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,aAUxB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAYvD,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { deregisterOperator, registerOperatorWithSignature, } from '../avs/stakeRegistry.js';
2
+ import { log } from '../logger.js';
3
+ /**
4
+ * Parent command
5
+ */
6
+ export const avsCommand = {
7
+ command: 'avs',
8
+ describe: 'Interact with the Hyperlane AVS',
9
+ builder: (yargs) => yargs
10
+ .command(registerCommand)
11
+ .command(deregisterCommand)
12
+ .version(false)
13
+ .demandCommand(),
14
+ handler: () => log('Command required'),
15
+ };
16
+ /**
17
+ * Registration command
18
+ */
19
+ export const registrationOptions = {
20
+ chain: {
21
+ type: 'string',
22
+ description: 'Chain to interact with the AVS on',
23
+ demandOption: true,
24
+ choices: ['holesky', 'ethereum'],
25
+ },
26
+ operatorKeyPath: {
27
+ type: 'string',
28
+ description: 'Path to the operator key file',
29
+ demandOption: true,
30
+ },
31
+ };
32
+ const registerCommand = {
33
+ command: 'register',
34
+ describe: 'Register operator with the AVS',
35
+ builder: {
36
+ ...registrationOptions,
37
+ },
38
+ handler: async ({ context, chain, operatorKeyPath }) => {
39
+ await registerOperatorWithSignature({
40
+ context,
41
+ chain,
42
+ operatorKeyPath,
43
+ });
44
+ process.exit(0);
45
+ },
46
+ };
47
+ const deregisterCommand = {
48
+ command: 'deregister',
49
+ describe: 'Deregister yourself with the AVS',
50
+ builder: {
51
+ ...registrationOptions,
52
+ },
53
+ handler: async ({ context, chain, operatorKeyPath }) => {
54
+ await deregisterOperator({
55
+ context,
56
+ chain,
57
+ operatorKeyPath,
58
+ });
59
+ process.exit(0);
60
+ },
61
+ };
62
+ //# sourceMappingURL=avs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avs.js","sourceRoot":"","sources":["../../../src/commands/avs.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,kBAAkB,EAClB,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAkB;IACvC,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,iCAAiC;IAC3C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,eAAe,CAAC;SACxB,OAAO,CAAC,iBAAiB,CAAC;SAC1B,OAAO,CAAC,KAAK,CAAC;SACd,aAAa,EAAE;IACpB,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC;CACvC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA6B;IAC3D,KAAK,EAAE;QACL,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mCAAmC;QAChD,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;KACjC;IACD,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,+BAA+B;QAC5C,YAAY,EAAE,IAAI;KACnB;CACF,CAAC;AAEF,MAAM,eAAe,GAGhB;IACH,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,gCAAgC;IAC1C,OAAO,EAAE;QACP,GAAG,mBAAmB;KACvB;IACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE;QACrD,MAAM,6BAA6B,CAAC;YAClC,OAAO;YACP,KAAK;YACL,eAAe;SAChB,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,MAAM,iBAAiB,GAGlB;IACH,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,kCAAkC;IAC5C,OAAO,EAAE;QACP,GAAG,mBAAmB;KACvB;IACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE;QACrD,MAAM,kBAAkB,CAAC;YACvB,OAAO;YACP,KAAK;YACL,eAAe;SAChB,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../../src/commands/chains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAatC;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,aAU3B,CAAC"}
1
+ {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../../src/commands/chains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAQtC;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,aAU3B,CAAC"}
@@ -1,11 +1,11 @@
1
- import { Chains, chainMetadata, hyperlaneContractAddresses, hyperlaneEnvironments, } from '@hyperlane-xyz/sdk';
2
1
  import { log, logBlue, logGray, logTable } from '../logger.js';
2
+ const ChainTypes = ['mainnet', 'testnet'];
3
3
  /**
4
4
  * Parent command
5
5
  */
6
6
  export const chainsCommand = {
7
7
  command: 'chains',
8
- describe: 'View information about core Hyperlane chains',
8
+ describe: 'View information about Hyperlane chains in a registry',
9
9
  builder: (yargs) => yargs
10
10
  .command(listCommand)
11
11
  .command(addressesCommand)
@@ -18,33 +18,39 @@ export const chainsCommand = {
18
18
  */
19
19
  const listCommand = {
20
20
  command: 'list',
21
- describe: 'List all core chains included in the Hyperlane SDK',
22
- builder: (yargs) => yargs.option('environment', {
23
- alias: 'e',
24
- describe: 'Specify the environment to list chains for',
25
- choices: ['mainnet', 'testnet'],
26
- }),
27
- handler: (args) => {
28
- const environment = args.environment;
29
- const serializer = (env) => Object.keys(hyperlaneEnvironments[env]).reduce((result, chain) => {
30
- const { chainId, displayName } = chainMetadata[chain];
31
- result[chain] = {
32
- 'Display Name': displayName,
33
- 'Chain Id': chainId,
34
- };
35
- return result;
36
- }, {});
37
- const logChainsForEnv = (env) => {
38
- logBlue(`\nHyperlane core ${env} chains:`);
21
+ describe: 'List all chains included in a registry',
22
+ builder: {
23
+ type: {
24
+ describe: 'Specify the type of chains',
25
+ choices: ChainTypes,
26
+ },
27
+ },
28
+ handler: async ({ type, context }) => {
29
+ const logChainsForType = (type) => {
30
+ logBlue(`\nHyperlane ${type} chains:`);
39
31
  logGray('------------------------------');
40
- logTable(serializer(env));
32
+ const chains = Object.values(context.chainMetadata).filter((c) => {
33
+ if (type === 'mainnet')
34
+ return !c.isTestnet;
35
+ else
36
+ return !!c.isTestnet;
37
+ });
38
+ const tableData = chains.reduce((result, chain) => {
39
+ const { chainId, displayName } = chain;
40
+ result[chain.name] = {
41
+ 'Display Name': displayName,
42
+ 'Chain Id': chainId,
43
+ };
44
+ return result;
45
+ }, {});
46
+ logTable(tableData);
41
47
  };
42
- if (environment) {
43
- logChainsForEnv(environment);
48
+ if (type) {
49
+ logChainsForType(type);
44
50
  }
45
51
  else {
46
- logChainsForEnv('mainnet');
47
- logChainsForEnv('testnet');
52
+ logChainsForType('mainnet');
53
+ logChainsForType('testnet');
48
54
  }
49
55
  },
50
56
  };
@@ -54,25 +60,25 @@ const listCommand = {
54
60
  const addressesCommand = {
55
61
  command: 'addresses',
56
62
  describe: 'Display the addresses of core Hyperlane contracts',
57
- builder: (yargs) => yargs.options({
63
+ builder: {
58
64
  name: {
59
65
  type: 'string',
60
66
  description: 'Chain to display addresses for',
61
- choices: Object.values(Chains),
62
67
  alias: 'chain',
63
68
  },
64
- }),
65
- handler: (args) => {
66
- const name = args.name;
67
- if (name && hyperlaneContractAddresses[name]) {
69
+ },
70
+ handler: async ({ name, context }) => {
71
+ if (name) {
72
+ const result = await context.registry.getChainAddresses(name);
68
73
  logBlue('Hyperlane contract addresses for:', name);
69
74
  logGray('---------------------------------');
70
- log(JSON.stringify(hyperlaneContractAddresses[name], null, 2));
75
+ log(JSON.stringify(result, null, 2));
71
76
  }
72
77
  else {
73
- logBlue('Hyperlane core contract addresses:');
78
+ const result = await context.registry.getAddresses();
79
+ logBlue('Hyperlane contract addresses:');
74
80
  logGray('----------------------------------');
75
- log(JSON.stringify(hyperlaneContractAddresses, null, 2));
81
+ log(JSON.stringify(result, null, 2));
76
82
  }
77
83
  },
78
84
  };
@@ -1 +1 @@
1
- {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../src/commands/chains.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,MAAM,EAGN,aAAa,EACb,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,8CAA8C;IACxD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,WAAW,CAAC;SACpB,OAAO,CAAC,gBAAgB,CAAC;SACzB,OAAO,CAAC,KAAK,CAAC;SACd,aAAa,EAAE;IACpB,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC;CACvC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,GAAkB;IACjC,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,oDAAoD;IAC9D,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE;QAC1B,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,4CAA4C;QACtD,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;KAChC,CAAC;IACJ,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QAChB,MAAM,WAAW,GAAG,IAAI,CAAC,WAA+C,CAAC;QAEzE,MAAM,UAAU,GAAG,CAAC,GAAyB,EAAE,EAAE,CAC/C,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACpE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,GAAG;gBACd,cAAc,EAAE,WAAW;gBAC3B,UAAU,EAAE,OAAO;aACpB,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC,EAAE,EAAE,CAAC,CAAC;QAET,MAAM,eAAe,GAAG,CAAC,GAAyB,EAAE,EAAE;YACpD,OAAO,CAAC,oBAAoB,GAAG,UAAU,CAAC,CAAC;YAC3C,OAAO,CAAC,gCAAgC,CAAC,CAAC;YAC1C,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,IAAI,WAAW,EAAE,CAAC;YAChB,eAAe,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,GAAkB;IACtC,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,mDAAmD;IAC7D,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK,CAAC,OAAO,CAAC;QACZ,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,gCAAgC;YAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YAC9B,KAAK,EAAE,OAAO;SACf;KACF,CAAC;IACJ,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAiC,CAAC;QACpD,IAAI,IAAI,IAAI,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,mCAAmC,EAAE,IAAI,CAAC,CAAC;YACnD,OAAO,CAAC,mCAAmC,CAAC,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,oCAAoC,CAAC,CAAC;YAC9C,OAAO,CAAC,oCAAoC,CAAC,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,0BAA0B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../src/commands/chains.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAsBtC;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,aAU3B,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAkBtC;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,aAU3B,CAAC"}
@@ -4,7 +4,7 @@ import { createIsmConfigMap, readIsmConfig } from '../config/ism.js';
4
4
  import { createMultisigConfig, readMultisigConfig, } from '../config/multisig.js';
5
5
  import { createWarpRouteDeployConfig, readWarpRouteDeployConfig, } from '../config/warp.js';
6
6
  import { log, logGreen } from '../logger.js';
7
- import { chainsCommandOption, fileFormatOption, outputFileOption, } from './options.js';
7
+ import { inputFileOption, outputFileOption } from './options.js';
8
8
  /**
9
9
  * Parent command
10
10
  */
@@ -36,40 +36,28 @@ const createCommand = {
36
36
  const createChainConfigCommand = {
37
37
  command: 'chain',
38
38
  describe: 'Create a new, minimal Hyperlane chain config (aka chain metadata)',
39
- builder: (yargs) => yargs.options({
40
- output: outputFileOption('./configs/chains.yaml'),
41
- format: fileFormatOption,
42
- }),
43
- handler: async (argv) => {
44
- const format = argv.format;
45
- const outPath = argv.output;
46
- await createChainConfig({ format, outPath });
39
+ handler: async ({ context }) => {
40
+ await createChainConfig({ context });
47
41
  process.exit(0);
48
42
  },
49
43
  };
50
44
  const createIsmConfigCommand = {
51
45
  command: 'ism',
52
46
  describe: 'Create a basic or advanced ISM config for a validator set',
53
- builder: (yargs) => yargs.options({
54
- output: outputFileOption('./configs/ism.yaml'),
55
- format: fileFormatOption,
56
- chains: chainsCommandOption,
47
+ builder: {
48
+ out: outputFileOption('./configs/ism.yaml'),
57
49
  advanced: {
58
50
  type: 'boolean',
59
51
  describe: 'Create an advanced ISM configuration',
60
52
  default: false,
61
53
  },
62
- }),
63
- handler: async (argv) => {
64
- const format = argv.format;
65
- const outPath = argv.output;
66
- const chainConfigPath = argv.chains;
67
- const isAdvanced = argv.advanced;
68
- if (isAdvanced) {
69
- await createIsmConfigMap({ format, outPath, chainConfigPath });
54
+ },
55
+ handler: async ({ context, out, advanced }) => {
56
+ if (advanced) {
57
+ await createIsmConfigMap({ context, outPath: out });
70
58
  }
71
59
  else {
72
- await createMultisigConfig({ format, outPath, chainConfigPath });
60
+ await createMultisigConfig({ context, outPath: out });
73
61
  }
74
62
  process.exit(0);
75
63
  },
@@ -77,32 +65,22 @@ const createIsmConfigCommand = {
77
65
  const createHookConfigCommand = {
78
66
  command: 'hooks',
79
67
  describe: 'Create a new hooks config (required & default)',
80
- builder: (yargs) => yargs.options({
81
- output: outputFileOption('./configs/hooks.yaml'),
82
- format: fileFormatOption,
83
- chains: chainsCommandOption,
84
- }),
85
- handler: async (argv) => {
86
- const format = argv.format;
87
- const outPath = argv.output;
88
- const chainConfigPath = argv.chains;
89
- await createHooksConfigMap({ format, outPath, chainConfigPath });
68
+ builder: {
69
+ out: outputFileOption('./configs/hooks.yaml'),
70
+ },
71
+ handler: async ({ context, out }) => {
72
+ await createHooksConfigMap({ context, outPath: out });
90
73
  process.exit(0);
91
74
  },
92
75
  };
93
76
  const createWarpRouteDeployConfigCommand = {
94
77
  command: 'warp',
95
78
  describe: 'Create a new Warp Route deployment config',
96
- builder: (yargs) => yargs.options({
97
- output: outputFileOption('./configs/warp-route-deployment.yaml'),
98
- format: fileFormatOption,
99
- chains: chainsCommandOption,
100
- }),
101
- handler: async (argv) => {
102
- const format = argv.format;
103
- const outPath = argv.output;
104
- const chainConfigPath = argv.chains;
105
- await createWarpRouteDeployConfig({ format, outPath, chainConfigPath });
79
+ builder: {
80
+ out: outputFileOption('./configs/warp-route-deployment.yaml'),
81
+ },
82
+ handler: async ({ context, out }) => {
83
+ await createWarpRouteDeployConfig({ context, outPath: out });
106
84
  process.exit(0);
107
85
  },
108
86
  };
@@ -123,32 +101,23 @@ const validateCommand = {
123
101
  };
124
102
  const validateChainCommand = {
125
103
  command: 'chain',
126
- describe: 'Validate a chain config in a YAML or JSON file',
127
- builder: (yargs) => yargs.options({
128
- path: {
129
- type: 'string',
130
- description: 'Input file path',
131
- demandOption: true,
132
- },
133
- }),
134
- handler: async (argv) => {
135
- const path = argv.path;
104
+ describe: 'Validate a chain config file',
105
+ builder: {
106
+ path: inputFileOption,
107
+ },
108
+ handler: async ({ path }) => {
136
109
  readChainConfigs(path);
110
+ logGreen(`All chain configs in ${path} are valid`);
137
111
  process.exit(0);
138
112
  },
139
113
  };
140
114
  const validateIsmCommand = {
141
115
  command: 'ism',
142
- describe: 'Validate the basic ISM config in a YAML or JSON file',
143
- builder: (yargs) => yargs.options({
144
- path: {
145
- type: 'string',
146
- description: 'Input file path',
147
- demandOption: true,
148
- },
149
- }),
150
- handler: async (argv) => {
151
- const path = argv.path;
116
+ describe: 'Validate the basic ISM config file',
117
+ builder: {
118
+ path: inputFileOption,
119
+ },
120
+ handler: async ({ path }) => {
152
121
  readMultisigConfig(path);
153
122
  logGreen('Config is valid');
154
123
  process.exit(0);
@@ -156,16 +125,11 @@ const validateIsmCommand = {
156
125
  };
157
126
  const validateIsmAdvancedCommand = {
158
127
  command: 'ism-advanced',
159
- describe: 'Validate the advanced ISM config in a YAML or JSON file',
160
- builder: (yargs) => yargs.options({
161
- path: {
162
- type: 'string',
163
- description: 'Input file path',
164
- demandOption: true,
165
- },
166
- }),
167
- handler: async (argv) => {
168
- const path = argv.path;
128
+ describe: 'Validate the advanced ISM config file',
129
+ builder: {
130
+ path: inputFileOption,
131
+ },
132
+ handler: async ({ path }) => {
169
133
  readIsmConfig(path);
170
134
  logGreen('Config is valid');
171
135
  process.exit(0);
@@ -173,16 +137,11 @@ const validateIsmAdvancedCommand = {
173
137
  };
174
138
  const validateWarpCommand = {
175
139
  command: 'warp',
176
- describe: 'Validate a Warp Route config in a YAML or JSON file',
177
- builder: (yargs) => yargs.options({
178
- path: {
179
- type: 'string',
180
- description: 'Input file path',
181
- demandOption: true,
182
- },
183
- }),
184
- handler: async (argv) => {
185
- const path = argv.path;
140
+ describe: 'Validate a Warp Route deployment config file',
141
+ builder: {
142
+ path: inputFileOption,
143
+ },
144
+ handler: async ({ path }) => {
186
145
  readWarpRouteDeployConfig(path);
187
146
  logGreen('Config is valid');
188
147
  process.exit(0);