@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.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +238 -0
  3. package/dist/commands/index.d.ts +2 -0
  4. package/dist/commands/index.d.ts.map +1 -0
  5. package/dist/commands/index.js +2 -0
  6. package/dist/commands/index.js.map +1 -0
  7. package/dist/commands/manual-exec.d.ts +56 -0
  8. package/dist/commands/manual-exec.d.ts.map +1 -0
  9. package/dist/commands/manual-exec.js +405 -0
  10. package/dist/commands/manual-exec.js.map +1 -0
  11. package/dist/commands/parse.d.ts +9 -0
  12. package/dist/commands/parse.d.ts.map +1 -0
  13. package/dist/commands/parse.js +47 -0
  14. package/dist/commands/parse.js.map +1 -0
  15. package/dist/commands/send.d.ts +80 -0
  16. package/dist/commands/send.d.ts.map +1 -0
  17. package/dist/commands/send.js +258 -0
  18. package/dist/commands/send.js.map +1 -0
  19. package/dist/commands/show.d.ts +18 -0
  20. package/dist/commands/show.d.ts.map +1 -0
  21. package/dist/commands/show.js +112 -0
  22. package/dist/commands/show.js.map +1 -0
  23. package/dist/commands/supported-tokens.d.ts +37 -0
  24. package/dist/commands/supported-tokens.d.ts.map +1 -0
  25. package/dist/commands/supported-tokens.js +214 -0
  26. package/dist/commands/supported-tokens.js.map +1 -0
  27. package/dist/commands/types.d.ts +7 -0
  28. package/dist/commands/types.d.ts.map +1 -0
  29. package/dist/commands/types.js +6 -0
  30. package/dist/commands/types.js.map +1 -0
  31. package/dist/commands/utils.d.ts +40 -0
  32. package/dist/commands/utils.d.ts.map +1 -0
  33. package/dist/commands/utils.js +330 -0
  34. package/dist/commands/utils.js.map +1 -0
  35. package/dist/index.d.ts +34 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +63 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/providers/aptos.d.ts +15 -0
  40. package/dist/providers/aptos.d.ts.map +1 -0
  41. package/dist/providers/aptos.js +74 -0
  42. package/dist/providers/aptos.js.map +1 -0
  43. package/dist/providers/evm.d.ts +2 -0
  44. package/dist/providers/evm.d.ts.map +1 -0
  45. package/dist/providers/evm.js +42 -0
  46. package/dist/providers/evm.js.map +1 -0
  47. package/dist/providers/index.d.ts +13 -0
  48. package/dist/providers/index.d.ts.map +1 -0
  49. package/dist/providers/index.js +104 -0
  50. package/dist/providers/index.js.map +1 -0
  51. package/dist/providers/solana.d.ts +13 -0
  52. package/dist/providers/solana.d.ts.map +1 -0
  53. package/dist/providers/solana.js +79 -0
  54. package/dist/providers/solana.js.map +1 -0
  55. package/package.json +57 -8
  56. package/src/commands/index.ts +1 -0
  57. package/src/commands/manual-exec.ts +468 -0
  58. package/src/commands/parse.ts +52 -0
  59. package/src/commands/send.ts +316 -0
  60. package/src/commands/show.ts +151 -0
  61. package/src/commands/supported-tokens.ts +245 -0
  62. package/src/commands/types.ts +6 -0
  63. package/src/commands/utils.ts +404 -0
  64. package/src/index.ts +70 -0
  65. package/src/providers/aptos.ts +100 -0
  66. package/src/providers/evm.ts +48 -0
  67. package/src/providers/index.ts +141 -0
  68. package/src/providers/solana.ts +93 -0
  69. package/tsconfig.json +18 -0
@@ -0,0 +1,214 @@
1
+ /**
2
+ * CCIP Token Discovery Service
3
+ *
4
+ * Discovers and validates tokens that can be transferred between chains using Chainlink's CCIP.
5
+ * The service handles pagination, parallel processing, and comprehensive error collection.
6
+ *
7
+ * Architecture:
8
+ * 1. Chain & Contract Setup: Validates cross-chain paths and initializes core contracts
9
+ * 2. Token Discovery: Fetches all registered tokens with pagination
10
+ * 3. Support Validation: Checks token support for destination chain
11
+ * 4. Detail Collection: Gathers token and pool information in parallel
12
+ *
13
+ * Performance Considerations:
14
+ * - Uses batching to prevent RPC timeouts (configurable batch sizes)
15
+ * - Implements parallel processing with rate limiting
16
+ * - Memory-efficient token processing through pagination
17
+ *
18
+ * Error Handling:
19
+ * - Individual token failures don't halt the process
20
+ * - Errors are collected and reported comprehensively
21
+ * - Detailed error reporting for debugging
22
+ *
23
+ * @module supported-tokens
24
+ */
25
+ import { bigIntReplacer, networkInfo, } from '@chainlink/ccip-sdk';
26
+ import { search } from '@inquirer/prompts';
27
+ import { formatUnits } from 'ethers';
28
+ import { Format } from "./types.js";
29
+ import { formatDuration, logParsedError, prettyTable } from "./utils.js";
30
+ import { fetchChainsFromRpcs } from "../providers/index.js";
31
+ export const command = ['getSupportedTokens <source> <address> [token]'];
32
+ export const describe = 'List supported tokens in a given Router/OnRamp/TokenAdminRegistry, and/or show info about token/pool';
33
+ export const builder = (yargs) => yargs
34
+ .positional('source', {
35
+ type: 'string',
36
+ demandOption: true,
37
+ describe: 'source network, chainId or name',
38
+ example: 'ethereum-testnet-sepolia',
39
+ })
40
+ .positional('address', {
41
+ type: 'string',
42
+ demandOption: true,
43
+ describe: 'router/onramp/tokenAdminRegistry/tokenPool contract address on source',
44
+ })
45
+ .positional('token', {
46
+ type: 'string',
47
+ demandOption: false,
48
+ describe: 'If address is router/onramp/tokenAdminRegistry, token may be used to pre-select a token from the supported list',
49
+ });
50
+ export async function handler(argv) {
51
+ let destroy;
52
+ const destroy$ = new Promise((resolve) => {
53
+ destroy = resolve;
54
+ });
55
+ return getSupportedTokens(argv, destroy$)
56
+ .catch((err) => {
57
+ process.exitCode = 1;
58
+ if (!logParsedError(err))
59
+ console.error(err);
60
+ })
61
+ .finally(destroy);
62
+ }
63
+ async function getSupportedTokens(argv, destroy) {
64
+ const sourceNetwork = networkInfo(argv.source);
65
+ const getChain = fetchChainsFromRpcs(argv, undefined, destroy);
66
+ const source = await getChain(sourceNetwork.name);
67
+ let registry;
68
+ try {
69
+ registry = await source.getTokenAdminRegistryFor(argv.address);
70
+ }
71
+ catch (_) {
72
+ // ignore
73
+ }
74
+ let info, tokenPool, poolConfigs, registryConfig;
75
+ if (registry && !argv.token) {
76
+ const feeTokens = await source.listFeeTokens(argv.address);
77
+ switch (argv.format) {
78
+ case Format.pretty:
79
+ console.info('Fee Tokens:');
80
+ console.table(feeTokens);
81
+ break;
82
+ case Format.json:
83
+ console.log(JSON.stringify(feeTokens, null, 2));
84
+ break;
85
+ default:
86
+ console.log('feeTokens:', feeTokens);
87
+ }
88
+ // router + interactive list
89
+ info = await listTokens(source, registry, argv);
90
+ if (!info)
91
+ return; // format != pretty
92
+ registryConfig = await source.getRegistryTokenConfig(registry, info.token);
93
+ tokenPool = registryConfig.tokenPool;
94
+ if (!tokenPool)
95
+ throw new Error(`TokenPool not set in tokenAdminRegistry=${registry} for token=${info.token}`);
96
+ poolConfigs = await source.getTokenPoolConfigs(tokenPool);
97
+ }
98
+ else {
99
+ if (!argv.token) {
100
+ // tokenPool
101
+ tokenPool = argv.address;
102
+ poolConfigs = await source.getTokenPoolConfigs(tokenPool);
103
+ registry ??= await source.getTokenAdminRegistryFor(poolConfigs.router);
104
+ [info, registryConfig] = await Promise.all([
105
+ source.getTokenInfo(poolConfigs.token),
106
+ source.getRegistryTokenConfig(registry, poolConfigs.token),
107
+ ]);
108
+ }
109
+ else {
110
+ registry ??= await source.getTokenAdminRegistryFor(argv.address);
111
+ // router|ramp|registry + token
112
+ info = await source.getTokenInfo(argv.token);
113
+ registryConfig = await source.getRegistryTokenConfig(registry, argv.token);
114
+ tokenPool = registryConfig.tokenPool;
115
+ if (!tokenPool)
116
+ throw new Error(`TokenPool not set in tokenAdminRegistry=${registry} for token=${argv.token}`);
117
+ poolConfigs = await source.getTokenPoolConfigs(tokenPool);
118
+ }
119
+ if (argv.format === Format.json) {
120
+ console.log(JSON.stringify({ ...info, tokenPool, ...poolConfigs }, bigIntReplacer, 2));
121
+ return;
122
+ }
123
+ else if (argv.format === Format.log) {
124
+ console.log('Token:', poolConfigs.token, info);
125
+ console.log('Token Pool:', tokenPool);
126
+ console.log('Pool Configs:', poolConfigs);
127
+ return;
128
+ }
129
+ }
130
+ const remotes = await source.getTokenPoolRemotes(tokenPool);
131
+ prettyTable({
132
+ network: `${source.network.name} [${source.network.chainSelector}]`,
133
+ token: poolConfigs.token,
134
+ symbol: info.symbol,
135
+ name: info.name,
136
+ decimals: info.decimals,
137
+ tokenPool,
138
+ typeAndVersion: poolConfigs.typeAndVersion,
139
+ router: poolConfigs.router,
140
+ tokenAdminRegistry: registry,
141
+ administrator: registryConfig.administrator,
142
+ ...(registryConfig.pendingAdministrator && {
143
+ pendingAdministrator: registryConfig.pendingAdministrator,
144
+ }),
145
+ });
146
+ const remotesLen = Object.keys(remotes).length;
147
+ if (remotesLen > 0)
148
+ console.info('Remotes [', remotesLen, ']:');
149
+ for (const [network, remote] of Object.entries(remotes))
150
+ prettyTable({
151
+ remoteNetwork: `${network} [${networkInfo(network).chainSelector}]`,
152
+ remoteToken: remote.remoteToken,
153
+ remotePool: remote.remotePools,
154
+ inbound: prettyRateLimiter(remote.inboundRateLimiterState, info),
155
+ outbound: prettyRateLimiter(remote.outboundRateLimiterState, info),
156
+ });
157
+ }
158
+ async function listTokens(source, registry, argv) {
159
+ const tokens = await source.getSupportedTokens(registry);
160
+ const infos = [];
161
+ const batch = 500;
162
+ for (let i = 0; i < tokens.length; i += batch) {
163
+ const infos_ = (await Promise.all(tokens.slice(i, i + batch).map((token) => source.getTokenInfo(token).then((info) => {
164
+ const res = { token, ...info };
165
+ if (argv.format === Format.log) {
166
+ // Format.log prints out-of-order, as it fetches data, concurrently
167
+ console.info(token, '=', info);
168
+ }
169
+ return res;
170
+ }, (err) => {
171
+ console.debug(`getTokenInfo errored`, token, err);
172
+ })))).filter((e) => e !== undefined);
173
+ if (argv.format === Format.json) {
174
+ // Format.json keeps order, prints newline-separated objects
175
+ for (const info of infos_) {
176
+ console.log(JSON.stringify(info));
177
+ }
178
+ }
179
+ infos.push(...infos_);
180
+ }
181
+ if (argv.format !== Format.pretty)
182
+ return; // Format.pretty interactive search and details
183
+ return search({
184
+ message: 'Select a token to know more:',
185
+ pageSize: 20,
186
+ source: (term) => {
187
+ const filtered = infos.filter((info) => !term ||
188
+ `${info.token} ${info.symbol} ${info.name ?? ''} ${info.decimals}`
189
+ .toLowerCase()
190
+ .includes(term.toLowerCase()));
191
+ const symbolPad = Math.min(Math.max(...filtered.map(({ symbol }) => symbol.length)), 10);
192
+ const decimalsPad = Math.max(...filtered.map(({ decimals }) => decimals.toString().length));
193
+ return filtered.map((info, i) => ({
194
+ name: `${info.token}\t[${info.decimals.toString().padStart(decimalsPad)}] ${info.symbol.padEnd(symbolPad)}\t${info.name ?? ''}`,
195
+ value: info,
196
+ short: `${info.token} [${info.symbol}]`,
197
+ description: `${i + 1} / ${filtered.length} / ${tokens.length}`,
198
+ }));
199
+ },
200
+ });
201
+ }
202
+ function prettyRateLimiter(state, { decimals, symbol }) {
203
+ if (!state)
204
+ return null;
205
+ return {
206
+ capacity: formatUnits(state.capacity, decimals) + ' ' + symbol,
207
+ tokens: `${formatUnits(state.tokens, decimals)} (${Math.round((Number(state.tokens) / Number(state.capacity)) * 100)}%)`,
208
+ rate: `${formatUnits(state.rate, decimals)}/s (0-to-full in ${formatDuration(Number(state.capacity / state.rate))})`,
209
+ ...(state.tokens < state.capacity && {
210
+ timeToFull: formatDuration(Number(state.capacity - state.tokens) / Number(state.rate)),
211
+ }),
212
+ };
213
+ }
214
+ //# sourceMappingURL=supported-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supported-tokens.js","sourceRoot":"","sources":["../../src/commands/supported-tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const Format: {
2
+ readonly log: "log";
3
+ readonly pretty: "pretty";
4
+ readonly json: "json";
5
+ };
6
+ export type Format = (typeof Format)[keyof typeof Format];
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;CAIT,CAAA;AACV,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ export const Format = {
2
+ log: 'log',
3
+ pretty: 'pretty',
4
+ json: 'json',
5
+ };
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;CACJ,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { type CCIPCommit, type CCIPExecution, type CCIPRequest, type Chain, type Lane, type OffchainTokenData } from '@chainlink/ccip-sdk/src/index.ts';
2
+ export declare function selectRequest(requests: readonly CCIPRequest[], promptSuffix?: string, hints?: {
3
+ logIndex?: number;
4
+ }): Promise<CCIPRequest>;
5
+ export declare function withDateTimestamp<T extends {
6
+ readonly timestamp: number;
7
+ }>(obj: T): Omit<T, 'timestamp'> & {
8
+ timestamp: Date;
9
+ };
10
+ export declare function prettyLane(lane: Lane): void;
11
+ export declare function formatArray<T>(name: string, values: readonly T[]): Record<string, T>;
12
+ export declare function formatDuration(secs: number): string;
13
+ export declare function prettyRequest(source: Chain, request: CCIPRequest, offchainTokenData?: OffchainTokenData[]): Promise<void>;
14
+ export declare function prettyCommit(dest: Chain, commit: CCIPCommit, request: {
15
+ timestamp: number;
16
+ }): Promise<void>;
17
+ export declare function prettyTable(args: Record<string, unknown>, opts?: {
18
+ parseErrorKeys: string[];
19
+ spcount: number;
20
+ }): void;
21
+ export declare function prettyReceipt(receipt: CCIPExecution, request: {
22
+ timestamp: number;
23
+ }, origin?: string): void;
24
+ export declare function logParsedError(err: unknown): boolean;
25
+ /**
26
+ * Parse `--transfer-tokens token1=amount1 token2=amount2 ...` into `{ token, amount }[]`
27
+ **/
28
+ export declare function parseTokenAmounts(source: Chain, transferTokens: readonly string[]): Promise<{
29
+ token: string;
30
+ amount: bigint;
31
+ }[]>;
32
+ /**
33
+ * Yield resolved promises (like Promise.all), but as they resolve.
34
+ * Throws as soon as any promise rejects.
35
+ *
36
+ * @param promises - Promises to resolve
37
+ * @returns Resolved values as they resolve
38
+ **/
39
+ export declare function yieldResolved<T>(promises: readonly Promise<T>[]): AsyncGenerator<T>;
40
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/commands/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,KAAK,EAEV,KAAK,IAAI,EACT,KAAK,iBAAiB,EAIvB,MAAM,kCAAkC,CAAA;AAazC,wBAAsB,aAAa,CACjC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,OAAO,CAAC,WAAW,CAAC,CA2BtB;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACxE,GAAG,EAAE,CAAC,GACL,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG;IAAE,SAAS,EAAE,IAAI,CAAA;CAAE,CAE5C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,QAUpC;AAeD,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAGpF;AAqCD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,UAe1C;AAaD,wBAAsB,aAAa,CACjC,MAAM,EAAE,KAAK,EACb,OAAO,EAAE,WAAW,EACpB,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,iBAuExC;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,KAAK,EACX,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBAc/B;AA0DD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI;;;CAAiD,QAuBtD;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC9B,MAAM,CAAC,EAAE,MAAM,QAgBhB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAkBpD;AAED;;IAEI;AACJ,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,MAAM,EAAE;;;KASvF;AAED;;;;;;IAMI;AACJ,wBAAuB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAO1F"}
@@ -0,0 +1,330 @@
1
+ import { ExecutionState, networkInfo, supportedChains, } from '@chainlink/ccip-sdk';
2
+ import { select } from '@inquirer/prompts';
3
+ import { dataLength, formatUnits, getBytes, hexlify, isBytesLike, isHexString, parseUnits, toUtf8String, } from 'ethers';
4
+ export async function selectRequest(requests, promptSuffix, hints) {
5
+ if (hints?.logIndex != null)
6
+ requests = requests.filter((req) => req.log.index === hints.logIndex);
7
+ if (requests.length === 1)
8
+ return requests[0];
9
+ const answer = await select({
10
+ message: `${requests.length} messageIds found; select one${promptSuffix ? ' ' + promptSuffix : ''}`,
11
+ choices: [
12
+ ...requests.map((req, i) => ({
13
+ value: i,
14
+ name: `${req.log.index} => ${req.message.header.messageId}`,
15
+ description: `sender =\t\t${req.message.sender}
16
+ receiver =\t\t${req.message.receiver}
17
+ gasLimit =\t\t${req.message.gasLimit}
18
+ tokenTransfers =\t[${req.message.tokenAmounts.map((ta) => ('token' in ta ? ta.token : ta.destTokenAddress)).join(',')}]` +
19
+ ('lane' in req
20
+ ? `\ndestination =\t\t${networkInfo(req.lane.destChainSelector).name} [${networkInfo(req.lane.destChainSelector).chainId}]`
21
+ : ''),
22
+ })),
23
+ {
24
+ value: -1,
25
+ name: 'Exit',
26
+ description: 'Quit the application',
27
+ },
28
+ ],
29
+ });
30
+ if (answer < 0)
31
+ throw new Error('User requested exit');
32
+ return requests[answer];
33
+ }
34
+ export function withDateTimestamp(obj) {
35
+ return { ...obj, timestamp: new Date(obj.timestamp * 1e3) };
36
+ }
37
+ export function prettyLane(lane) {
38
+ console.info('Lane:');
39
+ const source = networkInfo(lane.sourceChainSelector), dest = networkInfo(lane.destChainSelector);
40
+ console.table({
41
+ name: { source: source.name, dest: dest.name },
42
+ chainId: { source: source.chainId, dest: dest.chainId },
43
+ chainSelector: { source: source.chainSelector, dest: dest.chainSelector },
44
+ 'onRamp/version': { source: lane.onRamp, dest: lane.version },
45
+ });
46
+ }
47
+ async function formatToken(source, ta) {
48
+ let token;
49
+ if ('token' in ta)
50
+ token = ta.token;
51
+ else {
52
+ token = await source.getTokenForTokenPool(ta.sourcePoolAddress);
53
+ }
54
+ const { symbol, decimals } = await source.getTokenInfo(token);
55
+ return `${formatUnits(ta.amount, decimals)} ${symbol}`;
56
+ }
57
+ export function formatArray(name, values) {
58
+ if (values.length <= 1)
59
+ return { [name]: values[0] };
60
+ return Object.fromEntries(values.map((v, i) => [`${name}[${i}]`, v]));
61
+ }
62
+ // join truthy property names, separated by a dot
63
+ function j(...args) {
64
+ return args.filter(Boolean).join('.');
65
+ }
66
+ function formatData(name, data, parseError = false) {
67
+ if (parseError) {
68
+ let parsed;
69
+ for (const chain of Object.values(supportedChains)) {
70
+ parsed = chain.parse?.(data);
71
+ if (parsed)
72
+ break;
73
+ }
74
+ if (parsed) {
75
+ const res = {};
76
+ for (const [key, error] of Object.entries(parsed)) {
77
+ if (isHexString(error))
78
+ Object.assign(res, formatData(j(name, key), error));
79
+ else
80
+ res[j(name, key)] = error;
81
+ }
82
+ return res;
83
+ }
84
+ }
85
+ if (!isHexString(data))
86
+ return { [name]: data };
87
+ const split = [];
88
+ if (data.length <= 66)
89
+ split.push(data);
90
+ else
91
+ for (let i = data.length; i > 2; i -= 64) {
92
+ split.unshift(data.substring(Math.max(i - 64, 0), i));
93
+ }
94
+ return formatArray(name, split);
95
+ }
96
+ function formatDate(timestamp) {
97
+ return new Date(timestamp * 1e3).toISOString().substring(0, 19).replace('T', ' ');
98
+ }
99
+ export function formatDuration(secs) {
100
+ if (secs < 0)
101
+ secs = -secs;
102
+ if (secs >= 3540 && Math.floor(secs) % 60 >= 50)
103
+ secs += 60 - (secs % 60); // round up 50+s
104
+ else if (secs >= 118 && Math.floor(secs) % 60 >= 58)
105
+ secs += 60 - (secs % 60); // round up 58+s
106
+ const time = {
107
+ d: Math.floor(secs / 86400),
108
+ h: Math.floor(secs / 3600) % 24,
109
+ m: Math.floor(secs / 60) % 60,
110
+ s: Math.floor(secs) % 60,
111
+ };
112
+ return Object.entries(time)
113
+ .filter((val) => val[1] !== 0)
114
+ .map(([key, val]) => `${val}${key}${key === 'd' ? ' ' : ''}`)
115
+ .join('');
116
+ }
117
+ function omit(obj, ...keys) {
118
+ const result = { ...obj };
119
+ for (const key of keys) {
120
+ delete result[key];
121
+ }
122
+ return result;
123
+ }
124
+ export async function prettyRequest(source, request, offchainTokenData) {
125
+ prettyLane(request.lane);
126
+ console.info('Request (source):');
127
+ let finalized;
128
+ try {
129
+ finalized = await source.getBlockTimestamp('finalized');
130
+ }
131
+ catch (_) {
132
+ // no finalized tag support
133
+ }
134
+ const nonce = Number(request.message.header.nonce);
135
+ const rest = omit(request.message, 'header', 'sender', 'receiver', 'tokenAmounts', 'data', 'feeToken', 'feeTokenAmount', 'sourceTokenData', 'sourceChainSelector', 'extraArgs', 'accounts');
136
+ prettyTable({
137
+ messageId: request.message.header.messageId,
138
+ ...(request.tx.from ? { origin: request.tx.from } : {}),
139
+ sender: request.message.sender,
140
+ receiver: request.message.receiver,
141
+ sequenceNumber: Number(request.message.header.sequenceNumber),
142
+ nonce: nonce === 0 ? '0 => allow out-of-order exec' : nonce,
143
+ ...('gasLimit' in request.message
144
+ ? { gasLimit: Number(request.message.gasLimit) }
145
+ : 'computeUnits' in request.message
146
+ ? { computeUnits: Number(request.message.computeUnits) }
147
+ : {}),
148
+ transactionHash: request.log.transactionHash,
149
+ logIndex: request.log.index,
150
+ blockNumber: request.log.blockNumber,
151
+ timestamp: `${formatDate(request.timestamp)} (${formatDuration(Date.now() / 1e3 - request.timestamp)} ago)`,
152
+ finalized: finalized &&
153
+ (finalized < request.timestamp
154
+ ? formatDuration(request.timestamp - finalized) + ' left'
155
+ : true),
156
+ fee: await formatToken(source, {
157
+ token: request.message.feeToken,
158
+ amount: request.message.feeTokenAmount,
159
+ }),
160
+ ...formatArray('tokens', await Promise.all(request.message.tokenAmounts.map(formatToken.bind(null, source)))),
161
+ ...(isBytesLike(request.message.data) &&
162
+ dataLength(request.message.data) > 0 &&
163
+ getBytes(request.message.data).every((b) => 32 <= b && b <= 126) // printable characters
164
+ ? { data: toUtf8String(request.message.data) }
165
+ : formatData('data', request.message.data)),
166
+ ...('accounts' in request.message ? formatArray('accounts', request.message.accounts) : {}),
167
+ ...rest,
168
+ });
169
+ if (!offchainTokenData?.length || offchainTokenData.every((d) => !d))
170
+ return;
171
+ console.info('Attestations:');
172
+ for (const attestation of offchainTokenData) {
173
+ const { _tag: type, ...rest } = attestation;
174
+ prettyTable({ type, ...rest });
175
+ }
176
+ }
177
+ export async function prettyCommit(dest, commit, request) {
178
+ console.info('Commit (dest):');
179
+ const timestamp = await dest.getBlockTimestamp(commit.log.blockNumber);
180
+ prettyTable({
181
+ merkleRoot: commit.report.merkleRoot,
182
+ min: Number(commit.report.minSeqNr),
183
+ max: Number(commit.report.maxSeqNr),
184
+ origin: commit.log.tx?.from ?? (await dest.getTransaction(commit.log.transactionHash)).from,
185
+ contract: commit.log.address,
186
+ transactionHash: commit.log.transactionHash,
187
+ blockNumber: commit.log.blockNumber,
188
+ timestamp: `${formatDate(timestamp)} (${formatDuration(timestamp - request.timestamp)} after request)`,
189
+ });
190
+ }
191
+ /**
192
+ * Add line breaks to a string to fit within a specified column width
193
+ * @param text - The input string to wrap
194
+ * @param maxWidth - Maximum column width before wrapping
195
+ * @param threshold - Percentage of maxWidth to look back for spaces (default 0.1 = 10%)
196
+ * @returns The wrapped string with line breaks inserted
197
+ */
198
+ function wrapText(text, maxWidth, threshold = 0.1) {
199
+ const lines = [];
200
+ // First split by existing line breaks
201
+ const existingLines = text.split('\n');
202
+ for (const line of existingLines) {
203
+ const words = line.split(' ');
204
+ let currentLine = '';
205
+ for (const word of words) {
206
+ const testLine = currentLine ? `${currentLine} ${word}` : word;
207
+ if (testLine.length <= maxWidth) {
208
+ currentLine = testLine;
209
+ }
210
+ else {
211
+ if (currentLine) {
212
+ lines.push(currentLine);
213
+ currentLine = word;
214
+ }
215
+ else {
216
+ // Word is longer than maxWidth, break it
217
+ const thresholdDistance = Math.floor(maxWidth * threshold);
218
+ let remaining = word;
219
+ while (remaining.length > maxWidth) {
220
+ let breakPoint = maxWidth;
221
+ // Look for a good break point within threshold distance
222
+ for (let i = maxWidth - thresholdDistance; i < maxWidth; i++) {
223
+ if (remaining[i] === '-' || remaining[i] === '_') {
224
+ breakPoint = i + 1;
225
+ break;
226
+ }
227
+ }
228
+ lines.push(remaining.substring(0, breakPoint));
229
+ remaining = remaining.substring(breakPoint);
230
+ }
231
+ currentLine = remaining;
232
+ }
233
+ }
234
+ }
235
+ if (currentLine) {
236
+ lines.push(currentLine);
237
+ }
238
+ }
239
+ return lines;
240
+ }
241
+ export function prettyTable(args, opts = { parseErrorKeys: ['returnData'], spcount: 0 }) {
242
+ const out = [];
243
+ for (const [key, value] of Object.entries(args)) {
244
+ if (isBytesLike(value)) {
245
+ let parseError;
246
+ if (opts.parseErrorKeys.includes(key))
247
+ parseError = true;
248
+ if (dataLength(value) <= 32 && !parseError)
249
+ out.push([key, value]);
250
+ else
251
+ out.push(...Object.entries(formatData(key, hexlify(value), parseError)));
252
+ }
253
+ else if (typeof value === 'string') {
254
+ out.push(...wrapText(value, Math.max(100, +(process.env.COLUMNS || 80) * 0.9)).map((l, i) => [!i ? key : ' '.repeat(opts.spcount++), l]));
255
+ }
256
+ else if (Array.isArray(value)) {
257
+ if (value.length <= 1)
258
+ out.push([key, value[0]]);
259
+ else
260
+ out.push(...value.map((v, i) => [`${key}[${i}]`, v]));
261
+ }
262
+ else if (value && typeof value === 'object') {
263
+ out.push(...Object.entries(value).map(([k, v]) => [`${key}.${k}`, v]));
264
+ }
265
+ else
266
+ out.push([key, value]);
267
+ }
268
+ return console.table(Object.fromEntries(out));
269
+ }
270
+ export function prettyReceipt(receipt, request, origin) {
271
+ prettyTable({
272
+ state: receipt.receipt.state === ExecutionState.Success ? '✅ success' : '❌ failed',
273
+ ...(receipt.receipt.state !== ExecutionState.Success ||
274
+ (receipt.receipt.returnData && receipt.receipt.returnData !== '0x')
275
+ ? { returnData: receipt.receipt.returnData }
276
+ : {}),
277
+ ...(receipt.receipt.gasUsed ? { gasUsed: Number(receipt.receipt.gasUsed) } : {}),
278
+ ...(origin ? { origin } : {}),
279
+ contract: receipt.log.address,
280
+ transactionHash: receipt.log.transactionHash,
281
+ logIndex: receipt.log.index,
282
+ blockNumber: receipt.log.blockNumber,
283
+ timestamp: `${formatDate(receipt.timestamp)} (${formatDuration(receipt.timestamp - request.timestamp)} after request)`,
284
+ });
285
+ }
286
+ export function logParsedError(err) {
287
+ for (const chain of Object.values(supportedChains)) {
288
+ const parsed = chain.parse?.(err);
289
+ if (!parsed)
290
+ continue;
291
+ const { method, Instruction: instruction, ...rest } = parsed;
292
+ if (method || instruction) {
293
+ console.error(`🛑 Failed to call "${(method || instruction)}"`, ...Object.entries(rest)
294
+ .map(([k, e]) => [`\n${k.substring(0, 1).toUpperCase()}${k.substring(1)} =`, e])
295
+ .flat(1));
296
+ }
297
+ else {
298
+ console.error('🛑 Error:', parsed);
299
+ }
300
+ return true;
301
+ }
302
+ return false;
303
+ }
304
+ /**
305
+ * Parse `--transfer-tokens token1=amount1 token2=amount2 ...` into `{ token, amount }[]`
306
+ **/
307
+ export async function parseTokenAmounts(source, transferTokens) {
308
+ return Promise.all(transferTokens.map(async (tokenAmount) => {
309
+ const [token, amount_] = tokenAmount.split('=');
310
+ const { decimals } = await source.getTokenInfo(token);
311
+ const amount = parseUnits(amount_, decimals);
312
+ return { token, amount };
313
+ }));
314
+ }
315
+ /**
316
+ * Yield resolved promises (like Promise.all), but as they resolve.
317
+ * Throws as soon as any promise rejects.
318
+ *
319
+ * @param promises - Promises to resolve
320
+ * @returns Resolved values as they resolve
321
+ **/
322
+ export async function* yieldResolved(promises) {
323
+ const map = new Map(promises.map((p) => [p, p.then((res) => [p, res])]));
324
+ while (map.size > 0) {
325
+ const [p, res] = await Promise.race(map.values());
326
+ map.delete(p);
327
+ yield res;
328
+ }
329
+ }
330
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/commands/utils.ts"],"names":[],"mappings":"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"}