@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.
- package/README.md +57 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +38 -0
- package/dist/cli.js.map +1 -0
- package/dist/src/commands/chains.d.ts +6 -0
- package/dist/src/commands/chains.d.ts.map +1 -0
- package/dist/src/commands/chains.js +59 -0
- package/dist/src/commands/chains.js.map +1 -0
- package/dist/src/commands/config.d.ts +6 -0
- package/dist/src/commands/config.d.ts.map +1 -0
- package/dist/src/commands/config.js +94 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/deploy.d.ts +6 -0
- package/dist/src/commands/deploy.d.ts.map +1 -0
- package/dist/src/commands/deploy.js +72 -0
- package/dist/src/commands/deploy.js.map +1 -0
- package/dist/src/commands/options.d.ts +6 -0
- package/dist/src/commands/options.d.ts.map +1 -0
- package/dist/src/commands/options.js +19 -0
- package/dist/src/commands/options.js.map +1 -0
- package/dist/src/commands/send.d.ts +6 -0
- package/dist/src/commands/send.d.ts.map +1 -0
- package/dist/src/commands/send.js +110 -0
- package/dist/src/commands/send.js.map +1 -0
- package/dist/src/configs.d.ts +284 -0
- package/dist/src/configs.d.ts.map +1 -0
- package/dist/src/configs.js +110 -0
- package/dist/src/configs.js.map +1 -0
- package/dist/src/consts.d.ts +4 -0
- package/dist/src/consts.d.ts.map +1 -0
- package/dist/src/consts.js +4 -0
- package/dist/src/consts.js.map +1 -0
- package/dist/src/context.d.ts +373 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +24 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/deploy/TestRecipientDeployer.d.ts +20 -0
- package/dist/src/deploy/TestRecipientDeployer.d.ts.map +1 -0
- package/dist/src/deploy/TestRecipientDeployer.js +35 -0
- package/dist/src/deploy/TestRecipientDeployer.js.map +1 -0
- package/dist/src/deploy/core.d.ts +6 -0
- package/dist/src/deploy/core.d.ts.map +1 -0
- package/dist/src/deploy/core.js +264 -0
- package/dist/src/deploy/core.js.map +1 -0
- package/dist/src/deploy/types.d.ts +21 -0
- package/dist/src/deploy/types.d.ts.map +1 -0
- package/dist/src/deploy/types.js +2 -0
- package/dist/src/deploy/types.js.map +1 -0
- package/dist/src/deploy/utils.d.ts +10 -0
- package/dist/src/deploy/utils.d.ts.map +1 -0
- package/dist/src/deploy/utils.js +24 -0
- package/dist/src/deploy/utils.js.map +1 -0
- package/dist/src/deploy/warp.d.ts +8 -0
- package/dist/src/deploy/warp.d.ts.map +1 -0
- package/dist/src/deploy/warp.js +230 -0
- package/dist/src/deploy/warp.js.map +1 -0
- package/dist/src/logger.d.ts +12 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +25 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/send/message.d.ts +10 -0
- package/dist/src/send/message.d.ts.map +1 -0
- package/dist/src/send/message.js +66 -0
- package/dist/src/send/message.js.map +1 -0
- package/dist/src/send/transfer.d.ts +14 -0
- package/dist/src/send/transfer.d.ts.map +1 -0
- package/dist/src/send/transfer.js +95 -0
- package/dist/src/send/transfer.js.map +1 -0
- package/dist/src/utils/balances.d.ts +6 -0
- package/dist/src/utils/balances.d.ts.map +1 -0
- package/dist/src/utils/balances.js +23 -0
- package/dist/src/utils/balances.js.map +1 -0
- package/dist/src/utils/files.d.ts +19 -0
- package/dist/src/utils/files.d.ts.map +1 -0
- package/dist/src/utils/files.js +100 -0
- package/dist/src/utils/files.js.map +1 -0
- package/dist/src/utils/keys.d.ts +4 -0
- package/dist/src/utils/keys.d.ts.map +1 -0
- package/dist/src/utils/keys.js +17 -0
- package/dist/src/utils/keys.js.map +1 -0
- package/dist/src/utils/time.d.ts +2 -0
- package/dist/src/utils/time.d.ts.map +1 -0
- package/dist/src/utils/time.js +5 -0
- package/dist/src/utils/time.js.map +1 -0
- package/examples/chain-config.yaml +44 -0
- package/examples/contract-artifacts.yaml +20 -0
- package/examples/multisig-ism.yaml +20 -0
- package/examples/warp-tokens.yaml +23 -0
- 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":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EACL,cAAc,EACd,WAAW,EACX,2BAA2B,GAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAGL,aAAa,GAEd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAS,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,yDAAyD;AACzD,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EACrC,GAAG,EACH,eAAe,EACf,iBAAiB,EACjB,MAAM,EACN,WAAW,EACX,aAAa,EACb,GAAG,EACH,SAAS,EACT,OAAO,GAWR;IACC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,kBAAkB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,iBAAiB;QACjC,CAAC,CAAC,uBAAuB,CAAC,iBAAiB,CAAC;QAC5C,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,kBAAkB,CACtB,aAAa,EACb,MAAM,EACN,MAAM,EACN,aAAa,EACb,GAAG,CAAC,QAAQ,EAAE,CACf,CAAC;IACF,MAAM,kBAAkB,CAAC;QACvB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,aAAa;QACb,MAAM;QACN,aAAa,EAAE,yBAAyB;KACzC,CAAC,CAAC;IAEH,MAAM,KAAK,CAAC,OAAO,CACjB,eAAe,CAAC;QACd,MAAM;QACN,WAAW;QACX,aAAa;QACb,GAAG;QACH,SAAS;QACT,MAAM;QACN,aAAa;QACb,SAAS;KACV,CAAC,EACF,OAAO,GAAG,IAAI,EACd,gDAAgD,CACjD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,EAC7B,MAAM,EACN,WAAW,EACX,aAAa,EACb,GAAG,EACH,SAAS,EACT,aAAa,EACb,MAAM,EACN,SAAS,GAUV;IACC,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAChD,SAAS,KAAT,SAAS,GAAK,aAAa,EAAC;IAE5B,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAElE,MAAM,IAAI,GAAG,aAAa,CAAC,gBAAgB,CACzC,mBAAmB,EACnB,aAAa,CACd,CAAC;IAEF,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACpE,IAAI,YAAY,EAAE;QAChB,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACrE,IAAI,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;YACpB,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC1D,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;SACxB;KACF;SAAM;QACL,sCAAsC;QACtC,qCAAqC;QACrC,wBAAwB;QACxB,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;KACH;IAED,MAAM,GAAG,GAAG,IAAI,WAAW,CACzB;QACE,CAAC,MAAM,CAAC,EAAE;YACR,MAAM,EAAE,2BAA2B,CAAC,OAAO,CACzC,aAAa,EACb,eAAe,CAChB;SACF;KACF,EACD,aAAa,CACd,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,qBAAqB,MAAM,OAAO,SAAS,OAAO,WAAW,GAAG,CAAC,CAAC;IAC1E,OAAO,CAAC,eAAe,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAErC,MAAM,cAAc,GAAG,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9E,MAAM,CAAC,WAAW,KAAK,cAAc,CAAC,CAAC;IAEvC,OAAO,IAAI,EAAE;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,SAAS;YAAE,MAAM;QACrB,GAAG,CAAC,sDAAsD,CAAC,CAAC;QAC5D,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KACzB;IAED,QAAQ,CAAC,qCAAqC,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAAsB,EACtB,QAAmC;IAEnC,IAAI;QACF,MAAM,QAAQ,GAAG,2BAA2B,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;QACnD,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC;YAAE,OAAO,YAAY,CAAC;;YACzD,OAAO,IAAI,CAAC;KAClB;IAAC,OAAO,KAAK,EAAE;QACd,mCAAmC;QACnC,OAAO,IAAI,CAAC;KACb;AACH,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAAA,wBAAgB,uBAAuB,WAGtC"}
|
|
@@ -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
|