@chainlink/ccip-cli 0.0.0 → 0.90.2
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/LICENSE +21 -0
- package/README.md +238 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/manual-exec.d.ts +56 -0
- package/dist/commands/manual-exec.d.ts.map +1 -0
- package/dist/commands/manual-exec.js +405 -0
- package/dist/commands/manual-exec.js.map +1 -0
- package/dist/commands/parse.d.ts +9 -0
- package/dist/commands/parse.d.ts.map +1 -0
- package/dist/commands/parse.js +47 -0
- package/dist/commands/parse.js.map +1 -0
- package/dist/commands/send.d.ts +80 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +258 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/show.d.ts +18 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +112 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/supported-tokens.d.ts +37 -0
- package/dist/commands/supported-tokens.d.ts.map +1 -0
- package/dist/commands/supported-tokens.js +214 -0
- package/dist/commands/supported-tokens.js.map +1 -0
- package/dist/commands/types.d.ts +7 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +6 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/utils.d.ts +40 -0
- package/dist/commands/utils.d.ts.map +1 -0
- package/dist/commands/utils.js +330 -0
- package/dist/commands/utils.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/aptos.d.ts +15 -0
- package/dist/providers/aptos.d.ts.map +1 -0
- package/dist/providers/aptos.js +74 -0
- package/dist/providers/aptos.js.map +1 -0
- package/dist/providers/evm.d.ts +2 -0
- package/dist/providers/evm.d.ts.map +1 -0
- package/dist/providers/evm.js +42 -0
- package/dist/providers/evm.js.map +1 -0
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +104 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/solana.d.ts +13 -0
- package/dist/providers/solana.d.ts.map +1 -0
- package/dist/providers/solana.js +79 -0
- package/dist/providers/solana.js.map +1 -0
- package/package.json +57 -8
- package/src/commands/index.ts +1 -0
- package/src/commands/manual-exec.ts +468 -0
- package/src/commands/parse.ts +52 -0
- package/src/commands/send.ts +316 -0
- package/src/commands/show.ts +151 -0
- package/src/commands/supported-tokens.ts +245 -0
- package/src/commands/types.ts +6 -0
- package/src/commands/utils.ts +404 -0
- package/src/index.ts +70 -0
- package/src/providers/aptos.ts +100 -0
- package/src/providers/evm.ts +48 -0
- package/src/providers/index.ts +141 -0
- package/src/providers/solana.ts +93 -0
- package/tsconfig.json +18 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { type InferredOptionTypes } from 'yargs';
|
|
3
|
+
declare const globalOpts: {
|
|
4
|
+
readonly rpcs: {
|
|
5
|
+
readonly type: "array";
|
|
6
|
+
readonly alias: "r";
|
|
7
|
+
readonly describe: "List of RPC endpoint URLs, ws[s] or http[s]";
|
|
8
|
+
readonly string: true;
|
|
9
|
+
};
|
|
10
|
+
readonly 'rpcs-file': {
|
|
11
|
+
readonly type: "string";
|
|
12
|
+
readonly default: "./.env";
|
|
13
|
+
readonly describe: "File containing a list of RPCs endpoints to use";
|
|
14
|
+
};
|
|
15
|
+
readonly format: {
|
|
16
|
+
readonly alias: "f";
|
|
17
|
+
readonly describe: "Output to console format: pretty tables, node's console.log or JSON";
|
|
18
|
+
readonly choices: ("log" | "pretty" | "json")[];
|
|
19
|
+
readonly default: "pretty";
|
|
20
|
+
};
|
|
21
|
+
readonly verbose: {
|
|
22
|
+
readonly alias: "v";
|
|
23
|
+
readonly describe: "enable debug logging";
|
|
24
|
+
readonly type: "boolean";
|
|
25
|
+
};
|
|
26
|
+
readonly page: {
|
|
27
|
+
readonly type: "number";
|
|
28
|
+
readonly describe: "getLogs page/range size";
|
|
29
|
+
readonly default: 10000;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export type GlobalOpts = InferredOptionTypes<typeof globalOpts>;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAWvD,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BN,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,UAAU,CAAC,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import util from 'node:util';
|
|
3
|
+
import yargs, {} from 'yargs';
|
|
4
|
+
import { hideBin } from 'yargs/helpers';
|
|
5
|
+
import { Format } from "./commands/index.js";
|
|
6
|
+
util.inspect.defaultOptions.depth = 6; // print down to tokenAmounts in requests
|
|
7
|
+
// generate:nofail
|
|
8
|
+
// `const VERSION = '${require('./package.json').version}-${require('child_process').execSync('git rev-parse --short HEAD').toString().trim()}'`
|
|
9
|
+
const VERSION = '0.90.2-e2dea99';
|
|
10
|
+
// generate:end
|
|
11
|
+
const globalOpts = {
|
|
12
|
+
rpcs: {
|
|
13
|
+
type: 'array',
|
|
14
|
+
alias: 'r',
|
|
15
|
+
describe: 'List of RPC endpoint URLs, ws[s] or http[s]',
|
|
16
|
+
string: true,
|
|
17
|
+
},
|
|
18
|
+
'rpcs-file': {
|
|
19
|
+
type: 'string',
|
|
20
|
+
default: './.env',
|
|
21
|
+
describe: 'File containing a list of RPCs endpoints to use',
|
|
22
|
+
// demandOption: true,
|
|
23
|
+
},
|
|
24
|
+
format: {
|
|
25
|
+
alias: 'f',
|
|
26
|
+
describe: "Output to console format: pretty tables, node's console.log or JSON",
|
|
27
|
+
choices: Object.values(Format),
|
|
28
|
+
default: Format.pretty,
|
|
29
|
+
},
|
|
30
|
+
verbose: {
|
|
31
|
+
alias: 'v',
|
|
32
|
+
describe: 'enable debug logging',
|
|
33
|
+
type: 'boolean',
|
|
34
|
+
},
|
|
35
|
+
page: {
|
|
36
|
+
type: 'number',
|
|
37
|
+
describe: 'getLogs page/range size',
|
|
38
|
+
default: 10_000,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
async function main() {
|
|
42
|
+
await yargs(hideBin(process.argv))
|
|
43
|
+
.scriptName(process.env.CLI_NAME || 'ccip-cli')
|
|
44
|
+
.env('CCIP')
|
|
45
|
+
.options(globalOpts)
|
|
46
|
+
.middleware((argv) => {
|
|
47
|
+
if (!argv.verbose) {
|
|
48
|
+
console.debug = () => { };
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
.commandDir('commands', {
|
|
52
|
+
extensions: [new URL(import.meta.url).pathname.split('.').pop()],
|
|
53
|
+
exclude: /\.test\.[tj]s$/,
|
|
54
|
+
})
|
|
55
|
+
.demandCommand()
|
|
56
|
+
.strict()
|
|
57
|
+
.help()
|
|
58
|
+
.version(VERSION)
|
|
59
|
+
.alias({ h: 'help', V: 'version' })
|
|
60
|
+
.parse();
|
|
61
|
+
}
|
|
62
|
+
await main();
|
|
63
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,KAAK,EAAE,EAA4B,MAAM,OAAO,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,CAAA,CAAC,yCAAyC;AAC/E,kBAAkB;AAClB,gJAAgJ;AAChJ,MAAM,OAAO,GAAG,gBAAgB,CAAA;AAChC,eAAe;AAEf,MAAM,UAAU,GAAG;IACjB,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,6CAA6C;QACvD,MAAM,EAAE,IAAI;KACb;IACD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,iDAAiD;QAC3D,sBAAsB;KACvB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,qEAAqE;QAC/E,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;KACvB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,sBAAsB;QAChC,IAAI,EAAE,SAAS;KAChB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,yBAAyB;QACnC,OAAO,EAAE,MAAM;KAChB;CACO,CAAA;AAIV,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC/B,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,UAAU,CAAC;SAC9C,GAAG,CAAC,MAAM,CAAC;SACX,OAAO,CAAC,UAAU,CAAC;SACnB,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC,CAAC;SACD,UAAU,CAAC,UAAU,EAAE;QACtB,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;QACjE,OAAO,EAAE,gBAAgB;KAC1B,CAAC;SACD,aAAa,EAAE;SACf,MAAM,EAAE;SACR,IAAI,EAAE;SACN,OAAO,CAAC,OAAO,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;SAClC,KAAK,EAAE,CAAA;AACZ,CAAC;AAED,MAAM,IAAI,EAAE,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type AccountAddress, type AnyRawTransaction, AccountAuthenticatorEd25519, Ed25519PublicKey, Ed25519Signature } from '@aptos-labs/ts-sdk';
|
|
2
|
+
import AptosLedger from '@ledgerhq/hw-app-aptos';
|
|
3
|
+
import { type BytesLike } from 'ethers';
|
|
4
|
+
export declare class AptosLedgerSigner {
|
|
5
|
+
derivationPath: string;
|
|
6
|
+
readonly client: AptosLedger.default;
|
|
7
|
+
readonly publicKey: Ed25519PublicKey;
|
|
8
|
+
readonly accountAddress: AccountAddress;
|
|
9
|
+
private constructor();
|
|
10
|
+
static create(derivationPath: string): Promise<AptosLedgerSigner>;
|
|
11
|
+
signTransactionWithAuthenticator(txn: AnyRawTransaction): Promise<AccountAuthenticatorEd25519>;
|
|
12
|
+
sign(message: BytesLike): Promise<Ed25519Signature>;
|
|
13
|
+
close(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=aptos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aptos.d.ts","sourceRoot":"","sources":["../../src/providers/aptos.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EAEtB,2BAA2B,EAG3B,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,WAAW,MAAM,wBAAwB,CAAA;AAEhD,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,QAAQ,CAAA;AAK1D,qBAAa,iBAAiB;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAA;IACpC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAA;IACpC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;IAEvC,OAAO;WAcM,MAAM,CAAC,cAAc,EAAE,MAAM;IAQpC,gCAAgC,CAAC,GAAG,EAAE,iBAAiB;IAQvD,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAWnD,KAAK;CAGZ"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import util from 'node:util';
|
|
3
|
+
import { Account, AccountAuthenticatorEd25519, AuthenticationKey, Ed25519PrivateKey, Ed25519PublicKey, Ed25519Signature, generateSigningMessageForTransaction, } from '@aptos-labs/ts-sdk';
|
|
4
|
+
import { AptosChain } from '@chainlink/ccip-sdk';
|
|
5
|
+
import AptosLedger from '@ledgerhq/hw-app-aptos';
|
|
6
|
+
import HIDTransport from '@ledgerhq/hw-transport-node-hid';
|
|
7
|
+
import { getBytes, hexlify } from 'ethers';
|
|
8
|
+
// A LedgerSigner object represents a signer for a private key on a Ledger hardware wallet.
|
|
9
|
+
// This object is initialized alongside a LedgerClient connection, and can be used to sign
|
|
10
|
+
// transactions via a ledger hardware wallet.
|
|
11
|
+
export class AptosLedgerSigner /*implements AptosAsyncAccount*/ {
|
|
12
|
+
derivationPath;
|
|
13
|
+
client;
|
|
14
|
+
publicKey;
|
|
15
|
+
accountAddress;
|
|
16
|
+
constructor(ledgerClient, derivationPath, publicKey) {
|
|
17
|
+
this.client = ledgerClient;
|
|
18
|
+
this.derivationPath = derivationPath;
|
|
19
|
+
this.publicKey = new Ed25519PublicKey(publicKey);
|
|
20
|
+
const authKey = AuthenticationKey.fromPublicKey({
|
|
21
|
+
publicKey: this.publicKey,
|
|
22
|
+
});
|
|
23
|
+
this.accountAddress = authKey.derivedAddress();
|
|
24
|
+
}
|
|
25
|
+
static async create(derivationPath) {
|
|
26
|
+
const transport = await HIDTransport.default.create();
|
|
27
|
+
const client = new AptosLedger.default(transport);
|
|
28
|
+
const { publicKey } = await client.getAddress(derivationPath);
|
|
29
|
+
return new AptosLedgerSigner(client, derivationPath, publicKey);
|
|
30
|
+
}
|
|
31
|
+
// Prompts user to sign associated transaction on their Ledger hardware wallet.
|
|
32
|
+
async signTransactionWithAuthenticator(txn) {
|
|
33
|
+
const signingMessage = generateSigningMessageForTransaction(txn);
|
|
34
|
+
const signature = await this.sign(signingMessage);
|
|
35
|
+
return new AccountAuthenticatorEd25519(this.publicKey, signature);
|
|
36
|
+
}
|
|
37
|
+
// Sign a message - returns just the signature
|
|
38
|
+
async sign(message) {
|
|
39
|
+
const messageBytes = getBytes(message);
|
|
40
|
+
// This line prompts the user to sign the transaction on their Ledger hardware wallet
|
|
41
|
+
const { signature } = await this.client.signTransaction(this.derivationPath, Buffer.from(messageBytes));
|
|
42
|
+
return new Ed25519Signature(signature);
|
|
43
|
+
}
|
|
44
|
+
// Terminates the LedgerClient connection.
|
|
45
|
+
async close() {
|
|
46
|
+
await this.client.transport.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
AptosChain.getWallet = async function loadAptosWallet({ wallet: walletOpt }) {
|
|
50
|
+
if (!walletOpt)
|
|
51
|
+
walletOpt = process.env['USER_KEY'] || process.env['OWNER_KEY'];
|
|
52
|
+
if (typeof walletOpt !== 'string')
|
|
53
|
+
throw new Error(`Invalid wallet option: ${util.inspect(walletOpt)}`);
|
|
54
|
+
if ((walletOpt ?? '').startsWith('ledger')) {
|
|
55
|
+
let derivationPath = walletOpt.split(':')[1];
|
|
56
|
+
if (!derivationPath)
|
|
57
|
+
derivationPath = "m/44'/637'/0'/0'/0'";
|
|
58
|
+
else if (!isNaN(Number(derivationPath)))
|
|
59
|
+
derivationPath = `m/44'/637'/${derivationPath}'/0'/0'`;
|
|
60
|
+
const signer = await AptosLedgerSigner.create(derivationPath);
|
|
61
|
+
console.info('Ledger connected:', signer.accountAddress.toStringLong(), ', derivationPath:', signer.derivationPath);
|
|
62
|
+
return signer;
|
|
63
|
+
}
|
|
64
|
+
else if (existsSync(walletOpt)) {
|
|
65
|
+
walletOpt = hexlify(readFileSync(walletOpt, 'utf8').trim());
|
|
66
|
+
}
|
|
67
|
+
if (walletOpt) {
|
|
68
|
+
return Account.fromPrivateKey({
|
|
69
|
+
privateKey: new Ed25519PrivateKey(walletOpt, false),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
throw new Error('Wallet not specified');
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=aptos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aptos.js","sourceRoot":"","sources":["../../src/providers/aptos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../src/providers/evm.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import util from 'util';
|
|
4
|
+
import { EVMChain } from '@chainlink/ccip-sdk';
|
|
5
|
+
import { LedgerSigner } from '@ethers-ext/signer-ledger';
|
|
6
|
+
import { password } from '@inquirer/prompts';
|
|
7
|
+
import HIDTransport from '@ledgerhq/hw-transport-node-hid';
|
|
8
|
+
import { BaseWallet, SigningKey, Wallet } from 'ethers';
|
|
9
|
+
// monkey-patch @ethers-ext/signer-ledger to preserve path when `.connect`ing provider
|
|
10
|
+
Object.assign(LedgerSigner.prototype, {
|
|
11
|
+
connect: function (provider) {
|
|
12
|
+
return new LedgerSigner(HIDTransport, provider, this.path);
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Overwrite EVMChain.getWallet to support reading private key from file, env var or Ledger
|
|
17
|
+
* @param provider - provider instance to be connected to signers
|
|
18
|
+
* @param opts - wallet options (as passed to yargs argv)
|
|
19
|
+
* @returns Promise to Signer instance
|
|
20
|
+
*/
|
|
21
|
+
EVMChain.getWallet = async function loadEvmWallet(provider, { wallet: walletOpt }) {
|
|
22
|
+
if (!walletOpt)
|
|
23
|
+
walletOpt = process.env['USER_KEY'] || process.env['OWNER_KEY'];
|
|
24
|
+
if (typeof walletOpt !== 'string')
|
|
25
|
+
throw new Error(`Invalid wallet option: ${util.inspect(walletOpt)}`);
|
|
26
|
+
if ((walletOpt ?? '').startsWith('ledger')) {
|
|
27
|
+
let derivationPath = walletOpt.split(':')[1];
|
|
28
|
+
if (derivationPath && !isNaN(Number(derivationPath)))
|
|
29
|
+
derivationPath = `m/44'/60'/${derivationPath}'/0/0`;
|
|
30
|
+
const ledger = new LedgerSigner(HIDTransport, provider, derivationPath);
|
|
31
|
+
console.info('Ledger connected:', await ledger.getAddress(), ', derivationPath:', ledger.path);
|
|
32
|
+
return ledger;
|
|
33
|
+
}
|
|
34
|
+
if (existsSync(walletOpt)) {
|
|
35
|
+
let pw = process.env['USER_KEY_PASSWORD'];
|
|
36
|
+
if (!pw)
|
|
37
|
+
pw = await password({ message: 'Enter password for json wallet' });
|
|
38
|
+
return (await Wallet.fromEncryptedJson(await readFile(walletOpt, 'utf8'), pw)).connect(provider);
|
|
39
|
+
}
|
|
40
|
+
return new BaseWallet(new SigningKey((walletOpt.startsWith('0x') ? '' : '0x') + walletOpt), provider);
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=evm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.js","sourceRoot":"","sources":["../../src/providers/evm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,YAAY,MAAM,iCAAiC,CAAA;AAC1D,OAAO,EAA8B,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEnF,sFAAsF;AACtF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE;IACpC,OAAO,EAAE,UAA8B,QAA0B;QAC/D,OAAO,IAAI,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5D,CAAC;CACF,CAAC,CAAA;AAEF;;;;;GAKG;AACH,QAAQ,CAAC,SAAS,GAAG,KAAK,UAAU,aAAa,CAC/C,QAAkB,EAClB,EAAE,MAAM,EAAE,SAAS,EAAwB;IAE3C,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC/E,IAAI,OAAO,SAAS,KAAK,QAAQ;QAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IACtE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,IAAI,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5C,IAAI,cAAc,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAClD,cAAc,GAAG,aAAa,cAAc,OAAO,CAAA;QACrD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAA;QACvE,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,MAAM,CAAC,UAAU,EAAE,EAAE,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QAC9F,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;QACzC,IAAI,CAAC,EAAE;YAAE,EAAE,GAAG,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAA;QAC3E,OAAO,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAClG,CAAC;IACD,OAAO,IAAI,UAAU,CACnB,IAAI,UAAU,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,EACpE,QAAQ,CACT,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ChainGetter, type ChainTransaction } from '@chainlink/ccip-sdk/src/index.ts';
|
|
2
|
+
import './aptos.ts';
|
|
3
|
+
import './evm.ts';
|
|
4
|
+
import './solana.ts';
|
|
5
|
+
export declare function fetchChainsFromRpcs(argv: {
|
|
6
|
+
rpcs?: string[];
|
|
7
|
+
'rpcs-file'?: string;
|
|
8
|
+
}, txHash?: undefined, destroy?: Promise<unknown>): ChainGetter;
|
|
9
|
+
export declare function fetchChainsFromRpcs(argv: {
|
|
10
|
+
rpcs?: string[];
|
|
11
|
+
'rpcs-file'?: string;
|
|
12
|
+
}, txHash: string, destroy?: Promise<unknown>): [ChainGetter, Promise<ChainTransaction>];
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAGtB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,YAAY,CAAA;AACnB,OAAO,UAAU,CAAA;AACjB,OAAO,aAAa,CAAA;AA6BpB,wBAAgB,mBAAmB,CACjC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/C,MAAM,CAAC,EAAE,SAAS,EAClB,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GACzB,WAAW,CAAA;AACd,wBAAgB,mBAAmB,CACjC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/C,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GACzB,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { networkInfo, supportedChains, } from '@chainlink/ccip-sdk';
|
|
3
|
+
import "./aptos.js";
|
|
4
|
+
import "./evm.js";
|
|
5
|
+
import "./solana.js";
|
|
6
|
+
const RPCS_RE = /\b(?:http|ws)s?:\/\/[\w/\\@&?%~#.,;:=+-]+/;
|
|
7
|
+
async function collectEndpoints({ rpcs, 'rpcs-file': rpcsFile, }) {
|
|
8
|
+
const endpoints = new Set(rpcs || []);
|
|
9
|
+
for (const [env, val] of Object.entries(process.env)) {
|
|
10
|
+
if (env.startsWith('RPC_') && val && RPCS_RE.test(val))
|
|
11
|
+
endpoints.add(val);
|
|
12
|
+
}
|
|
13
|
+
if (rpcsFile) {
|
|
14
|
+
try {
|
|
15
|
+
const fileContent = await readFile(rpcsFile, 'utf8');
|
|
16
|
+
for (const line of fileContent.toString().split(/(?:\r\n|\r|\n)/g)) {
|
|
17
|
+
const match = line.match(RPCS_RE);
|
|
18
|
+
if (match)
|
|
19
|
+
endpoints.add(match[0]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
console.debug('Error reading RPCs file', error);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return endpoints;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Receives a list of rpcs and/or rpcs file, and loads them all concurrently
|
|
30
|
+
* Returns a ChainGetter function and optinoally a ChainTransaction promise
|
|
31
|
+
* @param argv - Options containing rpcs (list) and/or rpcs file
|
|
32
|
+
* @param txHash - Optional txHash to fetch concurrently; causes the function to return a [ChainGetter, Promise<ChainTransaction>]
|
|
33
|
+
* @param destroy - A promise to signal when to stop fetching chains
|
|
34
|
+
* @returns a ChainGetter (alone if no txHash was provided), or a tuple of [ChainGetter, Promise<ChainTransaction>]
|
|
35
|
+
*/
|
|
36
|
+
export function fetchChainsFromRpcs(argv, txHash, destroy) {
|
|
37
|
+
const chains = {};
|
|
38
|
+
const chainsCbs = {};
|
|
39
|
+
let finished = false;
|
|
40
|
+
const txs = [];
|
|
41
|
+
const init$ = collectEndpoints(argv).then((endpoints) => {
|
|
42
|
+
const pendingPromises = [];
|
|
43
|
+
let txFound = false;
|
|
44
|
+
for (const C of Object.values(supportedChains)) {
|
|
45
|
+
for (const url of endpoints) {
|
|
46
|
+
const chain$ = C.fromUrl(url);
|
|
47
|
+
if (txHash) {
|
|
48
|
+
const tx$ = chain$.then((chain) => chain.getTransaction(txHash));
|
|
49
|
+
void tx$.then(({ chain }) => {
|
|
50
|
+
if (txFound)
|
|
51
|
+
return;
|
|
52
|
+
txFound = true;
|
|
53
|
+
// in case tx is found, prefer it over any previously found chain
|
|
54
|
+
chains[chain.network.name] = chain$;
|
|
55
|
+
delete chainsCbs[chain.network.name];
|
|
56
|
+
}, () => { });
|
|
57
|
+
txs.push(tx$);
|
|
58
|
+
}
|
|
59
|
+
pendingPromises.push(chain$.then((chain) => {
|
|
60
|
+
if (chain.network.name in chains && !(chain.network.name in chainsCbs))
|
|
61
|
+
return chain.destroy?.(); // lost race
|
|
62
|
+
void destroy?.finally(() => {
|
|
63
|
+
void chain.destroy?.(); // cleanup
|
|
64
|
+
});
|
|
65
|
+
if (!(chain.network.name in chains)) {
|
|
66
|
+
chains[chain.network.name] = Promise.resolve(chain);
|
|
67
|
+
}
|
|
68
|
+
else if (chain.network.name in chainsCbs) {
|
|
69
|
+
const [resolve] = chainsCbs[chain.network.name];
|
|
70
|
+
resolve(chain);
|
|
71
|
+
}
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const res = Promise.allSettled(pendingPromises);
|
|
76
|
+
void (destroy ? Promise.race([res, destroy]) : res).finally(() => {
|
|
77
|
+
finished = true;
|
|
78
|
+
Object.entries(chainsCbs).forEach(([name, [_, reject]]) => reject(new Error(`No provider/chain found for network=${name}`)));
|
|
79
|
+
});
|
|
80
|
+
return Promise.any(txs);
|
|
81
|
+
});
|
|
82
|
+
const chainGetter = async (idOrSelectorOrName) => {
|
|
83
|
+
const network = networkInfo(idOrSelectorOrName);
|
|
84
|
+
if (network.name in chains)
|
|
85
|
+
return chains[network.name];
|
|
86
|
+
if (finished)
|
|
87
|
+
throw new Error(`No provider/chain found for network=${network.name}`);
|
|
88
|
+
chains[network.name] = new Promise((resolve, reject) => {
|
|
89
|
+
chainsCbs[network.name] = [resolve, reject];
|
|
90
|
+
});
|
|
91
|
+
void chains[network.name].finally(() => {
|
|
92
|
+
delete chainsCbs[network.name];
|
|
93
|
+
});
|
|
94
|
+
return chains[network.name];
|
|
95
|
+
};
|
|
96
|
+
if (txHash) {
|
|
97
|
+
return [chainGetter, init$];
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
void init$.catch(() => { });
|
|
101
|
+
return chainGetter;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import SolanaLedger from '@ledgerhq/hw-app-solana';
|
|
2
|
+
import { type VersionedTransaction, Keypair, PublicKey, Transaction } from '@solana/web3.js';
|
|
3
|
+
export declare class LedgerSolanaWallet {
|
|
4
|
+
publicKey: PublicKey;
|
|
5
|
+
wallet: SolanaLedger.default;
|
|
6
|
+
path: string;
|
|
7
|
+
private constructor();
|
|
8
|
+
static create(path: string): Promise<LedgerSolanaWallet>;
|
|
9
|
+
signTransaction<T extends Transaction | VersionedTransaction>(tx: T): Promise<T>;
|
|
10
|
+
signAllTransactions<T extends Transaction | VersionedTransaction>(txs: T[]): Promise<T[]>;
|
|
11
|
+
get payer(): Keypair;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=solana.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/providers/solana.ts"],"names":[],"mappings":"AAKA,OAAO,YAAY,MAAM,yBAAyB,CAAA;AAElD,OAAO,EAGL,KAAK,oBAAoB,EACzB,OAAO,EACP,SAAS,EACT,WAAW,EACZ,MAAM,iBAAiB,CAAA;AAIxB,qBAAa,kBAAkB;IAC7B,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,YAAY,CAAC,OAAO,CAAA;IAC5B,IAAI,EAAE,MAAM,CAAA;IAEZ,OAAO;WAMM,MAAM,CAAC,IAAI,EAAE,MAAM;IAc1B,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,oBAAoB,EAAE,EAAE,EAAE,CAAC;IAenE,mBAAmB,CAAC,CAAC,SAAS,WAAW,GAAG,oBAAoB,EAAE,GAAG,EAAE,CAAC,EAAE;IAShF,IAAI,KAAK,IAAI,OAAO,CAEnB;CACF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import util from 'node:util';
|
|
3
|
+
import { SolanaChain } from '@chainlink/ccip-sdk';
|
|
4
|
+
import { Wallet as SolanaWallet } from '@coral-xyz/anchor';
|
|
5
|
+
import SolanaLedger from '@ledgerhq/hw-app-solana';
|
|
6
|
+
import HIDTransport from '@ledgerhq/hw-transport-node-hid';
|
|
7
|
+
import { Keypair, PublicKey, Transaction, } from '@solana/web3.js';
|
|
8
|
+
import bs58 from 'bs58';
|
|
9
|
+
import { getBytes, hexlify } from 'ethers';
|
|
10
|
+
export class LedgerSolanaWallet {
|
|
11
|
+
publicKey;
|
|
12
|
+
wallet;
|
|
13
|
+
path;
|
|
14
|
+
constructor(solanaLW, pubKey, path) {
|
|
15
|
+
this.wallet = solanaLW;
|
|
16
|
+
this.publicKey = pubKey;
|
|
17
|
+
this.path = path;
|
|
18
|
+
}
|
|
19
|
+
static async create(path) {
|
|
20
|
+
try {
|
|
21
|
+
const transport = await HIDTransport.default.create();
|
|
22
|
+
const solana = new SolanaLedger.default(transport);
|
|
23
|
+
const { address } = await solana.getAddress(path, false);
|
|
24
|
+
const pubkey = new PublicKey(address);
|
|
25
|
+
console.info('Ledger connected:', pubkey.toBase58(), `, derivationPath:`, path);
|
|
26
|
+
return new LedgerSolanaWallet(solana, pubkey, path);
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
console.error('Ledger: Could not access ledger. Is it unlocked and Solana app open?');
|
|
30
|
+
throw e;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async signTransaction(tx) {
|
|
34
|
+
console.debug('Ledger: Request to sign message from', this.publicKey.toBase58());
|
|
35
|
+
// serializeMessage on v0, serialize on v1
|
|
36
|
+
let msg;
|
|
37
|
+
if (tx instanceof Transaction) {
|
|
38
|
+
msg = tx.compileMessage();
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
msg = tx.message;
|
|
42
|
+
}
|
|
43
|
+
const { signature } = await this.wallet.signTransaction(this.path, Buffer.from(msg.serialize()));
|
|
44
|
+
tx.addSignature(this.publicKey, signature);
|
|
45
|
+
return tx;
|
|
46
|
+
}
|
|
47
|
+
async signAllTransactions(txs) {
|
|
48
|
+
console.info('Signing multiple transactions with Ledger');
|
|
49
|
+
const signedTxs = [];
|
|
50
|
+
for (const tx of txs) {
|
|
51
|
+
signedTxs.push(await this.signTransaction(tx));
|
|
52
|
+
}
|
|
53
|
+
return signedTxs;
|
|
54
|
+
}
|
|
55
|
+
get payer() {
|
|
56
|
+
throw new Error('Payer method not available on Ledger');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
SolanaChain.getWallet = async function loadSolanaWallet({ wallet: walletOpt, } = {}) {
|
|
60
|
+
if (!walletOpt)
|
|
61
|
+
walletOpt = process.env['USER_KEY'] || process.env['OWNER_KEY'] || '~/.config/solana/id.json';
|
|
62
|
+
let wallet;
|
|
63
|
+
if (typeof walletOpt !== 'string')
|
|
64
|
+
throw new Error(`Invalid wallet option: ${util.inspect(walletOpt)}`);
|
|
65
|
+
wallet = walletOpt;
|
|
66
|
+
if (walletOpt === 'ledger' || walletOpt.startsWith('ledger:')) {
|
|
67
|
+
let derivationPath = walletOpt.split(':')[1];
|
|
68
|
+
if (!derivationPath)
|
|
69
|
+
derivationPath = "44'/501'/0'";
|
|
70
|
+
else if (!isNaN(Number(derivationPath)))
|
|
71
|
+
derivationPath = `44'/501'/${derivationPath}'`;
|
|
72
|
+
return (await LedgerSolanaWallet.create(derivationPath));
|
|
73
|
+
}
|
|
74
|
+
else if (existsSync(walletOpt)) {
|
|
75
|
+
wallet = hexlify(new Uint8Array(JSON.parse(readFileSync(walletOpt, 'utf8'))));
|
|
76
|
+
}
|
|
77
|
+
return new SolanaWallet(Keypair.fromSecretKey(wallet.startsWith('0x') ? getBytes(wallet) : bs58.decode(wallet)));
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=solana.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana.js","sourceRoot":"","sources":["../../src/providers/solana.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,58 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
"name": "@chainlink/ccip-cli",
|
|
3
|
+
"version": "0.90.2",
|
|
4
|
+
"description": "CCIP Command Line Interface, based on @chainlink/ccip-sdk",
|
|
5
|
+
"author": "Chainlink devs",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": "git://github.com/smartcontractkit/ccip-tools-ts.git",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"bin": "dist/index.js",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"test": "node --test",
|
|
12
|
+
"lint": "prettier --check ./src && eslint ./src",
|
|
13
|
+
"lint:fix": "prettier --write ./src && eslint --fix ./src",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"check": "npm run lint && npm run typecheck",
|
|
16
|
+
"build": "npm run clean && tsc -p ./tsconfig.build.json && npm run patch-dist",
|
|
17
|
+
"patch-dist": "chmod +x ./dist/index.js && find ./dist -type f -name \"*.js\" -exec sed -i.bkp 's|@chainlink/ccip-sdk/src/.*\\.ts|@chainlink/ccip-sdk|g' {} + && find ./dist -type f -name \"*.bkp\" -delete",
|
|
18
|
+
"start": "./ccip-cli",
|
|
19
|
+
"clean": "rm -rfv ./dist",
|
|
20
|
+
"prepare": "npm run build"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"src",
|
|
25
|
+
"tsconfig.json",
|
|
26
|
+
"!**/*.test.*",
|
|
27
|
+
"!**/__tests__",
|
|
28
|
+
"!**/__mocks__"
|
|
29
|
+
],
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@eslint/js": "^9.39.1",
|
|
32
|
+
"@types/node": "24.10.1",
|
|
33
|
+
"@types/yargs": "17.0.35",
|
|
34
|
+
"eslint": "^9.39.1",
|
|
35
|
+
"eslint-config-prettier": "10.1.8",
|
|
36
|
+
"eslint-import-resolver-typescript": "4.4.4",
|
|
37
|
+
"eslint-plugin-import": "^2.32.0",
|
|
38
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
39
|
+
"prettier": "^3.7.1",
|
|
40
|
+
"tsx": "4.20.6",
|
|
41
|
+
"typescript": "5.9.3",
|
|
42
|
+
"typescript-eslint": "8.47.0"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@aptos-labs/ts-sdk": "^5.1.5",
|
|
46
|
+
"@chainlink/ccip-sdk": "^0.90.0",
|
|
47
|
+
"@coral-xyz/anchor": "^0.29.0",
|
|
48
|
+
"@ethers-ext/signer-ledger": "^6.0.0-beta.1",
|
|
49
|
+
"@inquirer/prompts": "8.0.1",
|
|
50
|
+
"@ledgerhq/hw-app-aptos": "^6.34.9",
|
|
51
|
+
"@ledgerhq/hw-app-solana": "^7.6.0",
|
|
52
|
+
"@ledgerhq/hw-transport-node-hid": "^6.29.14",
|
|
53
|
+
"@solana/web3.js": "^1.98.4",
|
|
54
|
+
"bs58": "^6.0.0",
|
|
55
|
+
"ethers": "6.15.0",
|
|
56
|
+
"yargs": "18.0.0"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Format } from './types.ts'
|