@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
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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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"}
|