@hyperlane-xyz/cli 1.4.2-beta0

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 (90) hide show
  1. package/README.md +57 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +38 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/src/commands/chains.d.ts +6 -0
  7. package/dist/src/commands/chains.d.ts.map +1 -0
  8. package/dist/src/commands/chains.js +59 -0
  9. package/dist/src/commands/chains.js.map +1 -0
  10. package/dist/src/commands/config.d.ts +6 -0
  11. package/dist/src/commands/config.d.ts.map +1 -0
  12. package/dist/src/commands/config.js +94 -0
  13. package/dist/src/commands/config.js.map +1 -0
  14. package/dist/src/commands/deploy.d.ts +6 -0
  15. package/dist/src/commands/deploy.d.ts.map +1 -0
  16. package/dist/src/commands/deploy.js +72 -0
  17. package/dist/src/commands/deploy.js.map +1 -0
  18. package/dist/src/commands/options.d.ts +6 -0
  19. package/dist/src/commands/options.d.ts.map +1 -0
  20. package/dist/src/commands/options.js +19 -0
  21. package/dist/src/commands/options.js.map +1 -0
  22. package/dist/src/commands/send.d.ts +6 -0
  23. package/dist/src/commands/send.d.ts.map +1 -0
  24. package/dist/src/commands/send.js +110 -0
  25. package/dist/src/commands/send.js.map +1 -0
  26. package/dist/src/configs.d.ts +284 -0
  27. package/dist/src/configs.d.ts.map +1 -0
  28. package/dist/src/configs.js +110 -0
  29. package/dist/src/configs.js.map +1 -0
  30. package/dist/src/consts.d.ts +4 -0
  31. package/dist/src/consts.d.ts.map +1 -0
  32. package/dist/src/consts.js +4 -0
  33. package/dist/src/consts.js.map +1 -0
  34. package/dist/src/context.d.ts +373 -0
  35. package/dist/src/context.d.ts.map +1 -0
  36. package/dist/src/context.js +24 -0
  37. package/dist/src/context.js.map +1 -0
  38. package/dist/src/deploy/TestRecipientDeployer.d.ts +20 -0
  39. package/dist/src/deploy/TestRecipientDeployer.d.ts.map +1 -0
  40. package/dist/src/deploy/TestRecipientDeployer.js +35 -0
  41. package/dist/src/deploy/TestRecipientDeployer.js.map +1 -0
  42. package/dist/src/deploy/core.d.ts +6 -0
  43. package/dist/src/deploy/core.d.ts.map +1 -0
  44. package/dist/src/deploy/core.js +264 -0
  45. package/dist/src/deploy/core.js.map +1 -0
  46. package/dist/src/deploy/types.d.ts +21 -0
  47. package/dist/src/deploy/types.d.ts.map +1 -0
  48. package/dist/src/deploy/types.js +2 -0
  49. package/dist/src/deploy/types.js.map +1 -0
  50. package/dist/src/deploy/utils.d.ts +10 -0
  51. package/dist/src/deploy/utils.d.ts.map +1 -0
  52. package/dist/src/deploy/utils.js +24 -0
  53. package/dist/src/deploy/utils.js.map +1 -0
  54. package/dist/src/deploy/warp.d.ts +8 -0
  55. package/dist/src/deploy/warp.d.ts.map +1 -0
  56. package/dist/src/deploy/warp.js +230 -0
  57. package/dist/src/deploy/warp.js.map +1 -0
  58. package/dist/src/logger.d.ts +12 -0
  59. package/dist/src/logger.d.ts.map +1 -0
  60. package/dist/src/logger.js +25 -0
  61. package/dist/src/logger.js.map +1 -0
  62. package/dist/src/send/message.d.ts +10 -0
  63. package/dist/src/send/message.d.ts.map +1 -0
  64. package/dist/src/send/message.js +66 -0
  65. package/dist/src/send/message.js.map +1 -0
  66. package/dist/src/send/transfer.d.ts +14 -0
  67. package/dist/src/send/transfer.d.ts.map +1 -0
  68. package/dist/src/send/transfer.js +95 -0
  69. package/dist/src/send/transfer.js.map +1 -0
  70. package/dist/src/utils/balances.d.ts +6 -0
  71. package/dist/src/utils/balances.d.ts.map +1 -0
  72. package/dist/src/utils/balances.js +23 -0
  73. package/dist/src/utils/balances.js.map +1 -0
  74. package/dist/src/utils/files.d.ts +19 -0
  75. package/dist/src/utils/files.d.ts.map +1 -0
  76. package/dist/src/utils/files.js +100 -0
  77. package/dist/src/utils/files.js.map +1 -0
  78. package/dist/src/utils/keys.d.ts +4 -0
  79. package/dist/src/utils/keys.d.ts.map +1 -0
  80. package/dist/src/utils/keys.js +17 -0
  81. package/dist/src/utils/keys.js.map +1 -0
  82. package/dist/src/utils/time.d.ts +2 -0
  83. package/dist/src/utils/time.d.ts.map +1 -0
  84. package/dist/src/utils/time.js +5 -0
  85. package/dist/src/utils/time.js.map +1 -0
  86. package/examples/chain-config.yaml +44 -0
  87. package/examples/contract-artifacts.yaml +20 -0
  88. package/examples/multisig-ism.yaml +20 -0
  89. package/examples/warp-tokens.yaml +23 -0
  90. package/package.json +57 -0
@@ -0,0 +1,25 @@
1
+ import chalk from 'chalk';
2
+ import debug from 'debug';
3
+ const HYPERLANE_NS = 'hyperlane';
4
+ // Default root logger for use in utils/scripts
5
+ export const logger = debug(HYPERLANE_NS);
6
+ export const error = debug(`${HYPERLANE_NS}:ERROR`);
7
+ export function createLogger(namespace, isError = false) {
8
+ return isError ? error.extend(namespace) : logger.extend(namespace);
9
+ }
10
+ // Ensure hyperlane logging is enabled
11
+ const activeNamespaces = debug.disable();
12
+ const otherNamespaces = activeNamespaces
13
+ .split(',')
14
+ .filter((ns) => ns.includes(HYPERLANE_NS));
15
+ const hypNamespaces = `${HYPERLANE_NS},${HYPERLANE_NS}:*`;
16
+ debug.enable(otherNamespaces ? `${otherNamespaces},${hypNamespaces}` : `${hypNamespaces}`);
17
+ // Colored logs directly to console
18
+ export const logBlue = (...args) => console.log(chalk.blue(...args));
19
+ export const logPink = (...args) => console.log(chalk.magentaBright(...args));
20
+ export const logGray = (...args) => console.log(chalk.gray(...args));
21
+ export const logGreen = (...args) => console.log(chalk.green(...args));
22
+ export const logRed = (...args) => console.log(chalk.red(...args));
23
+ export const errorRed = (...args) => console.error(chalk.red(...args));
24
+ export const log = (...args) => console.log(...args);
25
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,YAAY,GAAG,WAAW,CAAC;AAEjC,+CAA+C;AAC/C,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,OAAO,GAAG,KAAK;IAC7D,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACtE,CAAC;AAED,sCAAsC;AACtC,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;AACzC,MAAM,eAAe,GAAG,gBAAgB;KACrC,KAAK,CAAC,GAAG,CAAC;KACV,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;AAC7C,MAAM,aAAa,GAAG,GAAG,YAAY,IAAI,YAAY,IAAI,CAAC;AAC1D,KAAK,CAAC,MAAM,CACV,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,CAC7E,CAAC;AAEF,mCAAmC;AACnC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE,CACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { ChainName } from '@hyperlane-xyz/sdk';
2
+ export declare function sendTestMessage({ key, chainConfigPath, coreArtifactsPath, origin, destination, timeout, }: {
3
+ key: string;
4
+ chainConfigPath: string;
5
+ coreArtifactsPath: string;
6
+ origin: ChainName;
7
+ destination: ChainName;
8
+ timeout: number;
9
+ }): Promise<void>;
10
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/send/message.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EAMV,MAAM,oBAAoB,CAAC;AAa5B,wBAAsB,eAAe,CAAC,EACpC,GAAG,EACH,eAAe,EACf,iBAAiB,EACjB,MAAM,EACN,WAAW,EACX,OAAO,GACR,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,OAAO,EAAE,MAAM,CAAC;CACjB,iBAmBA"}
@@ -0,0 +1,66 @@
1
+ import { BigNumber } from 'ethers';
2
+ import { HyperlaneCore, HyperlaneIgp, } from '@hyperlane-xyz/sdk';
3
+ import { utils } from '@hyperlane-xyz/utils';
4
+ import { readDeploymentArtifacts } from '../configs.js';
5
+ import { MINIMUM_TEST_SEND_BALANCE } from '../consts.js';
6
+ import { getDeployerContext, getMergedContractAddresses } from '../context.js';
7
+ import { runPreflightChecks } from '../deploy/utils.js';
8
+ import { errorRed, log, logBlue, logGreen } from '../logger.js';
9
+ const GAS_AMOUNT = 300000;
10
+ // TODO improve the UX here by making params optional and
11
+ // prompting for missing values
12
+ export async function sendTestMessage({ key, chainConfigPath, coreArtifactsPath, origin, destination, timeout, }) {
13
+ const { signer, multiProvider } = getDeployerContext(key, chainConfigPath);
14
+ const artifacts = coreArtifactsPath
15
+ ? readDeploymentArtifacts(coreArtifactsPath)
16
+ : undefined;
17
+ await runPreflightChecks({
18
+ local: origin,
19
+ remotes: [destination],
20
+ multiProvider,
21
+ signer,
22
+ minBalanceWei: MINIMUM_TEST_SEND_BALANCE,
23
+ });
24
+ await utils.timeout(executeDelivery({ origin, destination, multiProvider, signer, artifacts }), timeout * 1000, 'Timed out waiting for messages to be delivered');
25
+ }
26
+ async function executeDelivery({ origin, destination, multiProvider, signer, artifacts, }) {
27
+ const mergedContractAddrs = getMergedContractAddresses(artifacts);
28
+ const core = HyperlaneCore.fromAddressesMap(mergedContractAddrs, multiProvider);
29
+ const mailbox = core.getContracts(origin).mailbox;
30
+ const igp = HyperlaneIgp.fromAddressesMap(mergedContractAddrs, multiProvider);
31
+ const igpContract = igp.getContracts(origin).defaultIsmInterchainGasPaymaster;
32
+ const destinationDomain = multiProvider.getDomainId(destination);
33
+ const signerAddress = await signer.getAddress();
34
+ let message;
35
+ try {
36
+ const recipient = mergedContractAddrs[destination].testRecipient;
37
+ if (!recipient) {
38
+ throw new Error(`Unable to find TestRecipient for ${destination}`);
39
+ }
40
+ log('Dispatching message');
41
+ const messageTx = await mailbox.dispatch(destinationDomain, utils.addressToBytes32(recipient), '0x48656c6c6f21');
42
+ const messageReceipt = await multiProvider.handleTx(origin, messageTx);
43
+ message = core.getDispatchedMessages(messageReceipt)[0];
44
+ logBlue(`Sent message from ${origin} to ${recipient} on ${destination}.`);
45
+ logBlue(`Message ID: ${message.id}`);
46
+ const value = await igp.quoteGasPaymentForDefaultIsmIgp(origin, destination, BigNumber.from(GAS_AMOUNT));
47
+ log(`Paying for gas with ${value} wei`);
48
+ const paymentTx = await igpContract.payForGas(message.id, destinationDomain, GAS_AMOUNT, signerAddress, { value });
49
+ await paymentTx.wait();
50
+ }
51
+ catch (e) {
52
+ errorRed(`Encountered error sending message from ${origin} to ${destination}`);
53
+ throw e;
54
+ }
55
+ while (true) {
56
+ const destination = multiProvider.getChainName(message.parsed.destination);
57
+ const mailbox = core.getContracts(destination).mailbox;
58
+ const delivered = await mailbox.delivered(message.id);
59
+ if (delivered)
60
+ break;
61
+ log('Waiting for message delivery on destination chain...');
62
+ await utils.sleep(5000);
63
+ }
64
+ logGreen('Message was delivered!');
65
+ }
66
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/send/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ChainName } from '@hyperlane-xyz/sdk';
2
+ import { types } from '@hyperlane-xyz/utils';
3
+ export declare function sendTestTransfer({ key, chainConfigPath, coreArtifactsPath, origin, destination, routerAddress, wei, recipient, timeout, }: {
4
+ key: string;
5
+ chainConfigPath: string;
6
+ coreArtifactsPath: string;
7
+ origin: ChainName;
8
+ destination: ChainName;
9
+ routerAddress: types.Address;
10
+ wei: string;
11
+ recipient?: string;
12
+ timeout: number;
13
+ }): Promise<void>;
14
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../src/send/transfer.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,SAAS,EAIV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAS,MAAM,sBAAsB,CAAC;AAWpD,wBAAsB,gBAAgB,CAAC,EACrC,GAAG,EACH,eAAe,EACf,iBAAiB,EACjB,MAAM,EACN,WAAW,EACX,aAAa,EACb,GAAG,EACH,SAAS,EACT,OAAO,GACR,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,KAAK,CAAC,OAAO,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,iBAmCA"}
@@ -0,0 +1,95 @@
1
+ import assert from 'assert';
2
+ import { ethers } from 'ethers';
3
+ import { ERC20__factory, HypERC20App, HypERC20Collateral__factory, } from '@hyperlane-xyz/hyperlane-token';
4
+ import { HyperlaneCore, } from '@hyperlane-xyz/sdk';
5
+ import { utils } from '@hyperlane-xyz/utils';
6
+ import { readDeploymentArtifacts } from '../configs.js';
7
+ import { MINIMUM_TEST_SEND_BALANCE } from '../consts.js';
8
+ import { getDeployerContext, getMergedContractAddresses } from '../context.js';
9
+ import { runPreflightChecks } from '../deploy/utils.js';
10
+ import { log, logBlue, logGreen } from '../logger.js';
11
+ import { assertTokenBalance } from '../utils/balances.js';
12
+ // TODO improve the UX here by making params optional and
13
+ // prompting for missing values
14
+ export async function sendTestTransfer({ key, chainConfigPath, coreArtifactsPath, origin, destination, routerAddress, wei, recipient, timeout, }) {
15
+ const { signer, multiProvider } = getDeployerContext(key, chainConfigPath);
16
+ const artifacts = coreArtifactsPath
17
+ ? readDeploymentArtifacts(coreArtifactsPath)
18
+ : undefined;
19
+ await assertTokenBalance(multiProvider, signer, origin, routerAddress, wei.toString());
20
+ await runPreflightChecks({
21
+ local: origin,
22
+ remotes: [destination],
23
+ multiProvider,
24
+ signer,
25
+ minBalanceWei: MINIMUM_TEST_SEND_BALANCE,
26
+ });
27
+ await utils.timeout(executeDelivery({
28
+ origin,
29
+ destination,
30
+ routerAddress,
31
+ wei,
32
+ recipient,
33
+ signer,
34
+ multiProvider,
35
+ artifacts,
36
+ }), timeout * 1000, 'Timed out waiting for messages to be delivered');
37
+ }
38
+ async function executeDelivery({ origin, destination, routerAddress, wei, recipient, multiProvider, signer, artifacts, }) {
39
+ const signerAddress = await signer.getAddress();
40
+ recipient || (recipient = signerAddress);
41
+ const mergedContractAddrs = getMergedContractAddresses(artifacts);
42
+ const core = HyperlaneCore.fromAddressesMap(mergedContractAddrs, multiProvider);
43
+ const provider = multiProvider.getProvider(origin);
44
+ const connectedSigner = signer.connect(provider);
45
+ const wrappedToken = await getWrappedToken(routerAddress, provider);
46
+ if (wrappedToken) {
47
+ const token = ERC20__factory.connect(wrappedToken, connectedSigner);
48
+ const approval = await token.allowance(signerAddress, routerAddress);
49
+ if (approval.lt(wei)) {
50
+ const approveTx = await token.approve(routerAddress, wei);
51
+ await approveTx.wait();
52
+ }
53
+ }
54
+ else {
55
+ // TODO finish support for other types
56
+ // See code in warp UI for an example
57
+ // Requires gas handling
58
+ throw new Error('Sorry, only HypERC20Collateral transfers are currently supported in the CLI');
59
+ }
60
+ const app = new HypERC20App({
61
+ [origin]: {
62
+ router: HypERC20Collateral__factory.connect(routerAddress, connectedSigner),
63
+ },
64
+ }, multiProvider);
65
+ const receipt = await app.transfer(origin, destination, recipient, wei);
66
+ const message = core.getDispatchedMessages(receipt)[0];
67
+ logBlue(`Sent message from ${origin} to ${recipient} on ${destination}.`);
68
+ logBlue(`Message ID: ${message.id}`);
69
+ const msgDestination = multiProvider.getChainName(message.parsed.destination);
70
+ assert(destination === msgDestination);
71
+ while (true) {
72
+ const mailbox = core.getContracts(destination).mailbox;
73
+ const delivered = await mailbox.delivered(message.id);
74
+ if (delivered)
75
+ break;
76
+ log('Waiting for message delivery on destination chain...');
77
+ await utils.sleep(5000);
78
+ }
79
+ logGreen(`Transfer sent to destination chain!`);
80
+ }
81
+ async function getWrappedToken(address, provider) {
82
+ try {
83
+ const contract = HypERC20Collateral__factory.connect(address, provider);
84
+ const wrappedToken = await contract.wrappedToken();
85
+ if (ethers.utils.isAddress(wrappedToken))
86
+ return wrappedToken;
87
+ else
88
+ return null;
89
+ }
90
+ catch (error) {
91
+ // Token isn't a HypERC20Collateral
92
+ return null;
93
+ }
94
+ }
95
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../src/send/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ethers } from 'ethers';
2
+ import { ChainName, MultiProvider } from '@hyperlane-xyz/sdk';
3
+ import { types } from '@hyperlane-xyz/utils';
4
+ export declare function assertNativeBalances(multiProvider: MultiProvider, signer: ethers.Signer, chains: ChainName[], minBalanceWei: string): Promise<void>;
5
+ export declare function assertTokenBalance(multiProvider: MultiProvider, signer: ethers.Signer, chain: ChainName, token: types.Address, minBalanceWei: string): Promise<void>;
6
+ //# sourceMappingURL=balances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balances.d.ts","sourceRoot":"","sources":["../../../src/utils/balances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,MAAM,EAAE,SAAS,EAAE,EACnB,aAAa,EAAE,MAAM,iBAgBtB;AAED,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,KAAK,CAAC,OAAO,EACpB,aAAa,EAAE,MAAM,iBAUtB"}
@@ -0,0 +1,23 @@
1
+ import { ethers } from 'ethers';
2
+ import { ERC20__factory } from '@hyperlane-xyz/hyperlane-token';
3
+ export async function assertNativeBalances(multiProvider, signer, chains, minBalanceWei) {
4
+ const address = await signer.getAddress();
5
+ const minBalance = ethers.utils.formatEther(minBalanceWei.toString());
6
+ await Promise.all(chains.map(async (chain) => {
7
+ const balanceWei = await multiProvider
8
+ .getProvider(chain)
9
+ .getBalance(address);
10
+ const balance = ethers.utils.formatEther(balanceWei);
11
+ if (balanceWei.lte(minBalanceWei))
12
+ throw new Error(`${address} has insufficient balance on ${chain}. At least ${minBalance} required but found ${balance.toString()} ETH`);
13
+ }));
14
+ }
15
+ export async function assertTokenBalance(multiProvider, signer, chain, token, minBalanceWei) {
16
+ const address = await signer.getAddress();
17
+ const provider = multiProvider.getProvider(chain);
18
+ const tokenContract = ERC20__factory.connect(token, provider);
19
+ const balanceWei = await tokenContract.balanceOf(address);
20
+ if (balanceWei.lte(minBalanceWei))
21
+ throw new Error(`${address} has insufficient balance on ${chain} for token ${token}. At least ${minBalanceWei} wei required but found ${balanceWei.toString()} wei`);
22
+ }
23
+ //# sourceMappingURL=balances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balances.js","sourceRoot":"","sources":["../../../src/utils/balances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIhE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,aAA4B,EAC5B,MAAqB,EACrB,MAAmB,EACnB,aAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtE,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACzB,MAAM,UAAU,GAAG,MAAM,aAAa;aACnC,WAAW,CAAC,KAAK,CAAC;aAClB,UAAU,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,gCAAgC,KAAK,cAAc,UAAU,uBAAuB,OAAO,CAAC,QAAQ,EAAE,MAAM,CACvH,CAAC;IACN,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,aAA4B,EAC5B,MAAqB,EACrB,KAAgB,EAChB,KAAoB,EACpB,aAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,gCAAgC,KAAK,cAAc,KAAK,cAAc,aAAa,2BAA2B,UAAU,CAAC,QAAQ,EAAE,MAAM,CACpJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type FileFormat = 'yaml' | 'json';
2
+ export declare function readFileAtPath(filepath: string): string;
3
+ export declare function writeFileAtPath(filepath: string, value: string): void;
4
+ export declare function readJson<T>(filepath: string): T;
5
+ export declare function tryReadJson<T>(filepath: string): T | null;
6
+ export declare function writeJson(filepath: string, obj: any): void;
7
+ export declare function mergeJson<T extends Record<string, any>>(filepath: string, obj: T): void;
8
+ export declare function readYaml<T>(filepath: string): T;
9
+ export declare function tryReadYamlAtPath<T>(filepath: string): T | null;
10
+ export declare function writeYaml(filepath: string, obj: any): void;
11
+ export declare function mergeYaml<T extends Record<string, any>>(filepath: string, obj: T): void;
12
+ export declare function readYamlOrJson<T>(filepath: string, format?: FileFormat): T;
13
+ export declare function writeYamlOrJson(filepath: string, obj: Record<string, any>, format?: FileFormat): any;
14
+ export declare function mergeYamlOrJson(filepath: string, obj: Record<string, any>, format?: FileFormat): any;
15
+ export declare function prepNewArtifactsFiles(outPath: string, files: Array<{
16
+ filename: string;
17
+ description: string;
18
+ }>): string[];
19
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/utils/files.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEzC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,UAK9C;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAM9D;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAE/C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAMzD;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,QAEnD;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACrD,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,CAAC,QAQP;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAE/C;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAM/D;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,QAEnD;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACrD,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,CAAC,QAQP;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,CAE1E;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxB,MAAM,CAAC,EAAE,UAAU,OAQpB;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxB,MAAM,CAAC,EAAE,UAAU,OAQpB;AAqBD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,YAYxD"}
@@ -0,0 +1,100 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { parse as yamlParse, stringify as yamlStringify } from 'yaml';
4
+ import { objMerge } from '@hyperlane-xyz/sdk';
5
+ import { logBlue } from '../logger.js';
6
+ import { getTimestampForFilename } from './time.js';
7
+ export function readFileAtPath(filepath) {
8
+ if (!fs.existsSync(filepath)) {
9
+ throw Error(`File doesn't exist at ${filepath}`);
10
+ }
11
+ return fs.readFileSync(filepath, 'utf8');
12
+ }
13
+ export function writeFileAtPath(filepath, value) {
14
+ const dirname = path.dirname(filepath);
15
+ if (!fs.existsSync(dirname)) {
16
+ fs.mkdirSync(dirname, { recursive: true });
17
+ }
18
+ fs.writeFileSync(filepath, value);
19
+ }
20
+ export function readJson(filepath) {
21
+ return JSON.parse(readFileAtPath(filepath));
22
+ }
23
+ export function tryReadJson(filepath) {
24
+ try {
25
+ return readJson(filepath);
26
+ }
27
+ catch (error) {
28
+ return null;
29
+ }
30
+ }
31
+ export function writeJson(filepath, obj) {
32
+ writeFileAtPath(filepath, JSON.stringify(obj, null, 2) + '\n');
33
+ }
34
+ export function mergeJson(filepath, obj) {
35
+ if (fs.existsSync(filepath)) {
36
+ const previous = readJson(filepath);
37
+ writeJson(filepath, objMerge(previous, obj));
38
+ }
39
+ else {
40
+ writeJson(filepath, obj);
41
+ }
42
+ }
43
+ export function readYaml(filepath) {
44
+ return yamlParse(readFileAtPath(filepath));
45
+ }
46
+ export function tryReadYamlAtPath(filepath) {
47
+ try {
48
+ return readYaml(filepath);
49
+ }
50
+ catch (error) {
51
+ return null;
52
+ }
53
+ }
54
+ export function writeYaml(filepath, obj) {
55
+ writeFileAtPath(filepath, yamlStringify(obj, null, 2) + '\n');
56
+ }
57
+ export function mergeYaml(filepath, obj) {
58
+ if (fs.existsSync(filepath)) {
59
+ const previous = readYaml(filepath);
60
+ writeYaml(filepath, objMerge(previous, obj));
61
+ }
62
+ else {
63
+ writeYaml(filepath, obj);
64
+ }
65
+ }
66
+ export function readYamlOrJson(filepath, format) {
67
+ return resolveYamlOrJson(filepath, readJson, readYaml, format);
68
+ }
69
+ export function writeYamlOrJson(filepath, obj, format) {
70
+ return resolveYamlOrJson(filepath, (f) => writeJson(f, obj), (f) => writeYaml(f, obj), format);
71
+ }
72
+ export function mergeYamlOrJson(filepath, obj, format) {
73
+ return resolveYamlOrJson(filepath, (f) => mergeJson(f, obj), (f) => mergeYaml(f, obj), format);
74
+ }
75
+ function resolveYamlOrJson(filepath, jsonFn, yamlFn, format) {
76
+ if (format === 'json' || filepath.endsWith('.json')) {
77
+ return jsonFn(filepath);
78
+ }
79
+ else if (format === 'yaml' ||
80
+ filepath.endsWith('.yaml') ||
81
+ filepath.endsWith('.yml')) {
82
+ return yamlFn(filepath);
83
+ }
84
+ else {
85
+ throw new Error(`Invalid file format for ${filepath}`);
86
+ }
87
+ }
88
+ export function prepNewArtifactsFiles(outPath, files) {
89
+ const timestamp = getTimestampForFilename();
90
+ const newPaths = [];
91
+ for (const file of files) {
92
+ const filePath = path.join(outPath, `${file.filename}-${timestamp}.json`);
93
+ // Write empty object to ensure permissions are okay
94
+ writeJson(filePath, {});
95
+ newPaths.push(filePath);
96
+ logBlue(`${file.description} will be written to ${filePath}`);
97
+ }
98
+ return newPaths;
99
+ }
100
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/utils/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ethers } from 'ethers';
2
+ export declare function keyToSigner(key: string): ethers.Wallet;
3
+ export declare function assertSigner(signer: ethers.Signer): void;
4
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/utils/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,iBAQtC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,QAGjD"}
@@ -0,0 +1,17 @@
1
+ import { ethers } from 'ethers';
2
+ export function keyToSigner(key) {
3
+ if (!key)
4
+ throw new Error('No key provided');
5
+ const formattedKey = key.trim().toLowerCase();
6
+ if (ethers.utils.isHexString(formattedKey))
7
+ return new ethers.Wallet(formattedKey);
8
+ else if (formattedKey.split(' ').length >= 6)
9
+ return ethers.Wallet.fromMnemonic(formattedKey);
10
+ else
11
+ throw new Error('Invalid key format');
12
+ }
13
+ export function assertSigner(signer) {
14
+ if (!signer || !ethers.Signer.isSigner(signer))
15
+ throw new Error('Signer is invalid');
16
+ }
17
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/utils/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC;QACxC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SACpC,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC;QAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;;QAC7C,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getTimestampForFilename(): string;
2
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAAA,wBAAgB,uBAAuB,WAGtC"}
@@ -0,0 +1,5 @@
1
+ export function getTimestampForFilename() {
2
+ const now = new Date();
3
+ return `${now.getFullYear()}-${now.getMonth()}-${now.getDate()}-${now.getHours()}-${now.getMinutes()}`;
4
+ }
5
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;AACzG,CAAC"}
@@ -0,0 +1,44 @@
1
+ # Configs for describing chain metadata for use in Hyperlane deployments or apps
2
+ # Consists of a map of chain names to metadata
3
+ # Schema here: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts
4
+ ---
5
+ mychainname:
6
+ # Required fields:
7
+ chainId: 1234567890 # Number: Use EIP-155 for EVM chains
8
+ domainId: 1234567890 # Number: Recommend matching chainId when possible
9
+ name: mychainname # String: Unique identifier for the chain, must match key above
10
+ protocol: ethereum # ProtocolType: Ethereum, Sealevel, etc.
11
+ rpcUrls: # Array: List of RPC configs
12
+ # Only http field is required
13
+ - http: https://mychain.com/rpc # String: HTTP URL of the RPC endpoint (preferably HTTPS)
14
+ # Others here are optional
15
+ pagination:
16
+ maxBlockRange: 1000 # Number
17
+ maxBlockAge: 1000 # Number
18
+ minBlockNumber: 1000 # Number
19
+ retry:
20
+ maxRequests: 5 # Number
21
+ baseRetryMs: 1000 # Number
22
+ # Optional fields, not required for Hyperlane deployments but useful for apps:
23
+ isTestnet: false # Boolean: Whether the chain is considered a testnet or a mainnet
24
+ blockExplorers: # Array: List of BlockExplorer configs
25
+ # Required fields:
26
+ - name: My Chain Explorer # String: Human-readable name for the explorer
27
+ url: https://mychain.com/explorer # String: Base URL for the explorer
28
+ apiUrl: https://mychain.com/api # String: Base URL for the explorer API
29
+ # Optional fields:
30
+ apiKey: myapikey # String: API key for the explorer (optional)
31
+ family: etherscan # ExplorerFamily: See ExplorerFamily for valid values
32
+ nativeToken:
33
+ name: Eth # String
34
+ symbol: ETH # String
35
+ decimals: 18 # Number
36
+ displayName: My Chain Name # String: Human-readable name of the chain
37
+ displayNameShort: My Chain # String: A shorter human-readable name
38
+ logoURI: https://mychain.com/logo.png # String: URI to a logo image for the chain
39
+ blocks:
40
+ confirmations: 12 # Number: Blocks to wait before considering a transaction confirmed
41
+ reorgPeriod: 100 # Number: Blocks before a transaction has a near-zero chance of reverting
42
+ estimateBlockTime: 15 # Number: Rough estimate of time per block in seconds
43
+ # transactionOverrides: # Object: Properties to include when forming transaction requests
44
+ # Any tx fields are allowed
@@ -0,0 +1,20 @@
1
+ # Artifacts representing contract addresses
2
+ # Typically not written by hand but generated as JSON by the deploy command
3
+ # Consists of a map of chain names to contract names to addresses
4
+ ---
5
+ mychainname:
6
+ storageGasOracle: '0xD9A9966E7dA9a7f0032bF449FB12696a638E673C'
7
+ validatorAnnounce: '0x9bBdef63594D5FFc2f370Fe52115DdFFe97Bc524'
8
+ proxyAdmin: '0x90f9a2E9eCe93516d65FdaB726a3c62F5960a1b9'
9
+ mailbox: '0x35231d4c2D8B8ADcB5617A638A0c4548684c7C70'
10
+ interchainGasPaymaster: '0x6cA0B6D22da47f091B7613223cD4BB03a2d77918'
11
+ defaultIsmInterchainGasPaymaster: '0x56f52c0A1ddcD557285f7CBc782D3d83096CE1Cc'
12
+ multisigIsm: '0x9bDE63104EE030d9De419EEd6bA7D14b86D6fE3f'
13
+ testRecipient: '0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35'
14
+ interchainAccountIsm: '0x5e8ee6840caa4f367aff1FF28aA36D5B1b836d35'
15
+ aggregationIsmFactory: '0xc864fa3B662613cA5051f41e157d0a997f9a5A87'
16
+ routingIsmFactory: '0x1fdfD1486b8339638C6b92f8a96D698D8182D2b1'
17
+ interchainQueryRouter: '0xA837e38C3F7D509DF3a7a0fCf65E3814DB6c2618'
18
+ interchainAccountRouter: '0x9521291A43ebA3aD3FD24d610F4b7F7543C8d761'
19
+ merkleRootMultisigIsmFactory: '0x82140b2ddAd4E4dd7e1D6757Fb5F9485c230B79d'
20
+ messageIdMultisigIsmFactory: '0x1079056da3EC7D55521F27e1E094015C0d39Cc65'
@@ -0,0 +1,20 @@
1
+ # A config for a multisig Interchain Security Module (ISM)
2
+ # Schema: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/ism/types.ts
3
+ # Module types:
4
+ # UNUSED : 0
5
+ # ROUTING : 1
6
+ # AGGREGATION : 2
7
+ # LEGACY_MULTISIG : 3
8
+ # MERKLE_ROOT_MULTISIG : 4
9
+ # MESSAGE_ID_MULTISIG : 5
10
+ ---
11
+ anvil1:
12
+ type: 3 # ModuleType.LEGACY_MULTISIG
13
+ threshold: 1 # Number: Signatures required to approve a message
14
+ validators: # Array: List of validator configs
15
+ - '0xa0ee7a142d267c1f36714e4a8f75612f20a79720'
16
+ anvil2:
17
+ type: 3
18
+ threshold: 1
19
+ validators:
20
+ - '0xa0ee7a142d267c1f36714e4a8f75612f20a79720'
@@ -0,0 +1,23 @@
1
+ # A config for a Warp Route deployment
2
+ # Typically used with the 'hyperlane deploy warp' command
3
+ # Token Types:
4
+ # synthetic
5
+ # syntheticUri
6
+ # collateral
7
+ # collateralUri
8
+ # native
9
+ ---
10
+ base:
11
+ chainName: anvil1
12
+ type: native
13
+ # address: 0x123... # Required for collateral types)
14
+ # isNft: true # If the token is an NFT (ERC721), set to true)
15
+ # owner: 0x123 # Optional owner address for synthetic token
16
+ # mailbox: 0x123 # Optional mailbox address route
17
+ # interchainGasPaymaster: 0x123 # Optional interchainGasPaymaster address
18
+ synthetics:
19
+ - chainName: anvil2
20
+ # You can optionally set the token metadata, otherwise the base token's will be used
21
+ # name: "MySyntheticToken"
22
+ # symbol: "MST"
23
+ # totalSupply: 10000000