@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,258 @@
1
+ import { ChainFamily, bigIntReplacer, estimateExecGasForRequest, fetchCCIPRequestsInTx, getDataBytes, networkInfo, sourceToDestTokenAmounts, } from '@chainlink/ccip-sdk';
2
+ import { dataLength, formatUnits, toUtf8Bytes } from 'ethers';
3
+ import { Format } from "./types.js";
4
+ import { logParsedError, parseTokenAmounts, prettyRequest, withDateTimestamp } from "./utils.js";
5
+ import { fetchChainsFromRpcs } from "../providers/index.js";
6
+ export const command = 'send <source> <router> <dest>';
7
+ export const describe = 'Send a CCIP message from router on source to dest';
8
+ export const builder = (yargs) => yargs
9
+ .positional('source', {
10
+ type: 'string',
11
+ demandOption: true,
12
+ describe: 'source network, chainId or name',
13
+ example: 'ethereum-testnet-sepolia',
14
+ })
15
+ .positional('router', {
16
+ type: 'string',
17
+ demandOption: true,
18
+ describe: 'router contract address on source',
19
+ })
20
+ .positional('dest', {
21
+ type: 'string',
22
+ demandOption: true,
23
+ describe: 'destination network, chainId or name',
24
+ example: 'ethereum-testnet-sepolia-arbitrum-1',
25
+ })
26
+ .options({
27
+ receiver: {
28
+ alias: 'R',
29
+ type: 'string',
30
+ describe: 'Receiver of the message; defaults to the sender wallet address if same network family',
31
+ },
32
+ data: {
33
+ alias: 'd',
34
+ type: 'string',
35
+ describe: 'Data to send in the message (non-hex will be utf-8 encoded)',
36
+ example: '0x1234',
37
+ },
38
+ 'gas-limit': {
39
+ alias: ['L', 'compute-units'],
40
+ type: 'number',
41
+ describe: 'Gas limit for receiver callback execution; defaults to default configured on ramps',
42
+ default: 0,
43
+ },
44
+ 'estimate-gas-limit': {
45
+ type: 'number',
46
+ describe: 'Estimate gas limit for receiver callback execution; argument is a % margin to add to the estimate',
47
+ example: '10',
48
+ conflicts: 'gas-limit',
49
+ },
50
+ 'allow-out-of-order-exec': {
51
+ alias: 'ooo',
52
+ type: 'boolean',
53
+ describe: 'Allow execution of messages out of order (i.e. sender nonce not enforced, only v1.5+ lanes, mandatory for some dests)',
54
+ },
55
+ 'fee-token': {
56
+ type: 'string',
57
+ describe: 'Address or symbol of the fee token (e.g. LINK address on source); if not provided, will pay in native',
58
+ },
59
+ 'transfer-tokens': {
60
+ alias: 't',
61
+ type: 'array',
62
+ string: true,
63
+ describe: 'List of token amounts (on source) to transfer to the receiver',
64
+ example: '0xtoken=0.1',
65
+ },
66
+ wallet: {
67
+ alias: 'w',
68
+ type: 'string',
69
+ describe: 'Wallet to send transactions with; pass `ledger[:index_or_derivation]` to use Ledger USB hardware wallet, or private key in `USER_KEY` environment variable',
70
+ },
71
+ 'token-receiver': {
72
+ type: 'string',
73
+ describe: "Address of the Solana tokenReceiver (if different than program's receiver)",
74
+ },
75
+ account: {
76
+ type: 'array',
77
+ string: true,
78
+ describe: 'List of accounts needed by Solana receiver program; append `=rw` to specify account as writable; can be specified multiple times',
79
+ example: 'requiredPdaAddress=rw',
80
+ },
81
+ 'only-get-fee': {
82
+ type: 'boolean',
83
+ describe: 'Fetch and print the fee for the transaction, then exit',
84
+ },
85
+ 'only-estimate': {
86
+ type: 'boolean',
87
+ describe: 'Only estimate dest exec gasLimit',
88
+ },
89
+ 'approve-max': {
90
+ type: 'boolean',
91
+ describe: "Approve the maximum amount of tokens to transfer; default=false approves only what's needed",
92
+ },
93
+ })
94
+ .check(({ 'transfer-tokens': transferTokens }) => !transferTokens || transferTokens.every((t) => /^[^=]+=\d+(\.\d+)?$/.test(t)));
95
+ export async function handler(argv) {
96
+ let destroy;
97
+ const destroy$ = new Promise((resolve) => {
98
+ destroy = resolve;
99
+ });
100
+ return sendMessage(argv, destroy$)
101
+ .catch((err) => {
102
+ process.exitCode = 1;
103
+ if (!logParsedError(err))
104
+ console.error(err);
105
+ })
106
+ .finally(destroy);
107
+ }
108
+ async function sendMessage(argv, destroy) {
109
+ const sourceNetwork = networkInfo(argv.source);
110
+ const destNetwork = networkInfo(argv.dest);
111
+ const getChain = fetchChainsFromRpcs(argv, undefined, destroy);
112
+ const source = await getChain(sourceNetwork.name);
113
+ let data;
114
+ if (argv.data) {
115
+ try {
116
+ data = getDataBytes(argv.data);
117
+ }
118
+ catch (_) {
119
+ data = toUtf8Bytes(argv.data);
120
+ }
121
+ }
122
+ else {
123
+ data = '0x';
124
+ }
125
+ const tokenAmounts = argv.transferTokens?.length
126
+ ? await parseTokenAmounts(source, argv.transferTokens)
127
+ : [];
128
+ let receiver = argv.receiver;
129
+ let tokenReceiver;
130
+ let accounts, accountIsWritableBitmap = 0n;
131
+ if (destNetwork.family === ChainFamily.Solana) {
132
+ if (argv.tokenReceiver)
133
+ tokenReceiver = argv.tokenReceiver;
134
+ else if (!tokenAmounts.length) {
135
+ tokenReceiver = '11111111111111111111111111111111';
136
+ }
137
+ else if (!dataLength(data)) {
138
+ // sending tokens without data, i.e. not for a receiver contract
139
+ tokenReceiver = receiver;
140
+ receiver = '11111111111111111111111111111111';
141
+ }
142
+ else {
143
+ throw new Error('--token-receiver is required when sending tokens with data');
144
+ }
145
+ if (argv.account) {
146
+ accounts = argv.account.map((account, i) => {
147
+ if (account.endsWith('=rw')) {
148
+ accountIsWritableBitmap |= 1n << BigInt(i);
149
+ account = account.substring(0, account.length - 3);
150
+ }
151
+ return account;
152
+ });
153
+ }
154
+ else
155
+ accounts = [];
156
+ }
157
+ else if (argv.tokenReceiver || argv.account?.length) {
158
+ throw new Error('--token-receiver and --account intended only for Solana dest');
159
+ }
160
+ if (!receiver) {
161
+ if (sourceNetwork.family !== destNetwork.family)
162
+ throw new Error('--receiver is required when sending to a different chain family');
163
+ receiver = await source.getWalletAddress(argv); // send to self if same family
164
+ }
165
+ if (argv.estimateGasLimit != null || argv.onlyEstimate) {
166
+ // TODO: implement for all chain families
167
+ if (destNetwork.family !== ChainFamily.EVM)
168
+ throw new Error(`Estimating gasLimit supported only on EVM, got=${destNetwork.family}`);
169
+ const dest = (await getChain(destNetwork.chainSelector));
170
+ const onRamp = await source.getOnRampForRouter(argv.router, destNetwork.chainSelector);
171
+ const lane = {
172
+ sourceChainSelector: source.network.chainSelector,
173
+ destChainSelector: destNetwork.chainSelector,
174
+ onRamp,
175
+ version: (await source.typeAndVersion(onRamp))[1],
176
+ };
177
+ const destTokenAmounts = await sourceToDestTokenAmounts(source, destNetwork.chainSelector, onRamp, tokenAmounts);
178
+ const estimated = await estimateExecGasForRequest(source, dest, {
179
+ lane,
180
+ message: {
181
+ sender: await source.getWalletAddress(argv),
182
+ receiver,
183
+ data,
184
+ tokenAmounts: destTokenAmounts,
185
+ },
186
+ });
187
+ console.log('Estimated gasLimit:', estimated);
188
+ argv.gasLimit = Math.ceil(estimated * (1 + (argv.estimateGasLimit ?? 0) / 100));
189
+ if (argv.onlyEstimate)
190
+ return;
191
+ }
192
+ // `--allow-out-of-order-exec` forces EVMExtraArgsV2, which shouldn't work on v1.2 lanes;
193
+ // otherwise, fallsback to EVMExtraArgsV1 (compatible with v1.2 & v1.5)
194
+ const extraArgs = {
195
+ ...(argv.allowOutOfOrderExec != null || destNetwork.family !== ChainFamily.EVM
196
+ ? { allowOutOfOrderExecution: !!argv.allowOutOfOrderExec }
197
+ : {}),
198
+ ...(destNetwork.family === ChainFamily.Solana
199
+ ? { computeUnits: BigInt(argv.gasLimit) }
200
+ : { gasLimit: BigInt(argv.gasLimit) }),
201
+ ...(tokenReceiver ? { tokenReceiver } : {}),
202
+ ...(accounts ? { accounts, accountIsWritableBitmap } : {}),
203
+ };
204
+ let feeToken, feeTokenInfo;
205
+ if (argv.feeToken) {
206
+ try {
207
+ feeToken = source.constructor.getAddress(argv.feeToken);
208
+ feeTokenInfo = await source.getTokenInfo(feeToken);
209
+ }
210
+ catch (_) {
211
+ const feeTokens = await source.listFeeTokens(argv.router);
212
+ console.debug('supported feeTokens:', feeTokens);
213
+ for (const [token, info] of Object.entries(feeTokens)) {
214
+ if (info.symbol === 'UNKNOWN' || info.symbol !== argv.feeToken)
215
+ continue;
216
+ feeToken = token;
217
+ feeTokenInfo = info;
218
+ break;
219
+ }
220
+ if (!feeTokenInfo)
221
+ throw new Error(`Fee token "${argv.feeToken}" not found`);
222
+ }
223
+ }
224
+ else {
225
+ const nativeToken = await source.getNativeTokenForRouter(argv.router);
226
+ feeTokenInfo = await source.getTokenInfo(nativeToken);
227
+ }
228
+ const message = {
229
+ receiver,
230
+ data,
231
+ extraArgs: extraArgs,
232
+ feeToken, // feeToken==ZeroAddress means native
233
+ tokenAmounts,
234
+ };
235
+ // calculate fee
236
+ const fee = await source.getFee(argv.router, destNetwork.chainSelector, message);
237
+ console.info('Fee:', fee, '=', formatUnits(fee, feeTokenInfo.decimals), !argv.feeToken && feeTokenInfo.symbol.startsWith('W')
238
+ ? feeTokenInfo.symbol.substring(1)
239
+ : feeTokenInfo.symbol);
240
+ if (argv.onlyGetFee)
241
+ return;
242
+ const tx = await source.sendMessage(argv.router, destNetwork.chainSelector, { ...message, fee }, argv);
243
+ console.log('🚀 Sending message to', tokenReceiver || receiver, '@', destNetwork.name, ', tx =>', tx.hash);
244
+ // print CCIPRequest from tx receipt
245
+ const request = (await fetchCCIPRequestsInTx(tx))[0];
246
+ switch (argv.format) {
247
+ case Format.log:
248
+ console.log(`message ${request.log.index} =`, withDateTimestamp(request));
249
+ break;
250
+ case Format.pretty:
251
+ await prettyRequest(source, request);
252
+ break;
253
+ case Format.json:
254
+ console.info(JSON.stringify(request, bigIntReplacer, 2));
255
+ break;
256
+ }
257
+ }
258
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Argv } from 'yargs';
2
+ import type { GlobalOpts } from '../index.ts';
3
+ export declare const command: string[];
4
+ export declare const describe = "Show details of a CCIP request";
5
+ export declare const builder: (yargs: Argv) => Argv<import("yargs").Omit<{
6
+ "tx-hash": string;
7
+ }, "log-index" | "id-from-source"> & import("yargs").InferredOptionTypes<{
8
+ 'log-index': {
9
+ type: "number";
10
+ describe: string;
11
+ };
12
+ 'id-from-source': {
13
+ type: "string";
14
+ describe: string;
15
+ };
16
+ }>>;
17
+ export declare function handler(argv: Awaited<ReturnType<typeof builder>['argv']> & GlobalOpts): Promise<void>;
18
+ //# sourceMappingURL=show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAEjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAY7C,eAAO,MAAM,OAAO,UAAoC,CAAA;AACxD,eAAO,MAAM,QAAQ,mCAAmC,CAAA;AAExD,eAAO,MAAM,OAAO,GAAI,OAAO,IAAI;;;;;;;;;;;GAiB7B,CAAA;AAEN,wBAAsB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,iBAW3F"}
@@ -0,0 +1,112 @@
1
+ import util from 'util';
2
+ import { ChainFamily, bigIntReplacer, discoverOffRamp, fetchCCIPMessageById, fetchCCIPRequestsInTx, networkInfo, } from '@chainlink/ccip-sdk';
3
+ import { Format } from "./types.js";
4
+ import { logParsedError, prettyCommit, prettyReceipt, prettyRequest, selectRequest, withDateTimestamp, } from "./utils.js";
5
+ import { fetchChainsFromRpcs } from "../providers/index.js";
6
+ export const command = ['show <tx-hash>', '* <tx-hash>'];
7
+ export const describe = 'Show details of a CCIP request';
8
+ export const builder = (yargs) => yargs
9
+ .positional('tx-hash', {
10
+ type: 'string',
11
+ demandOption: true,
12
+ describe: 'transaction hash of the request (source) message',
13
+ })
14
+ .options({
15
+ 'log-index': {
16
+ type: 'number',
17
+ describe: 'Pre-select a message request by logIndex, if more than one in tx; by default, a selection menu is shown',
18
+ },
19
+ 'id-from-source': {
20
+ type: 'string',
21
+ describe: 'Search by messageId instead of txHash; requires specifying source network',
22
+ },
23
+ });
24
+ export async function handler(argv) {
25
+ let destroy;
26
+ const destroy$ = new Promise((resolve) => {
27
+ destroy = resolve;
28
+ });
29
+ return showRequests(argv, destroy$)
30
+ .catch((err) => {
31
+ process.exitCode = 1;
32
+ if (!logParsedError(err))
33
+ console.error(err);
34
+ })
35
+ .finally(destroy);
36
+ }
37
+ async function showRequests(argv, destroy) {
38
+ let source, getChain, tx, request;
39
+ // messageId not yet implemented for Solana
40
+ if (argv.idFromSource) {
41
+ getChain = fetchChainsFromRpcs(argv, undefined, destroy);
42
+ const sourceNetwork = networkInfo(argv.idFromSource);
43
+ if (sourceNetwork.family === ChainFamily.Solana) {
44
+ throw new Error(`Message ID search is not yet supported for Solana networks.\n` +
45
+ `Please use show with Solana transaction signature instead`);
46
+ }
47
+ source = await getChain(sourceNetwork.chainId);
48
+ request = await fetchCCIPMessageById(source, argv.txHash, argv);
49
+ }
50
+ else {
51
+ const [getChain_, tx$] = fetchChainsFromRpcs(argv, argv.txHash, destroy);
52
+ getChain = getChain_;
53
+ tx = await tx$;
54
+ source = tx.chain;
55
+ request = await selectRequest(await fetchCCIPRequestsInTx(tx), 'to know more', argv);
56
+ }
57
+ const offchainTokenData = await source.fetchOffchainTokenData(request);
58
+ switch (argv.format) {
59
+ case Format.log: {
60
+ console.log(`message ${request.log.index} =`, withDateTimestamp(request), '\nattestations =', offchainTokenData);
61
+ break;
62
+ }
63
+ case Format.pretty:
64
+ await prettyRequest(source, request, offchainTokenData);
65
+ break;
66
+ case Format.json:
67
+ console.info(JSON.stringify({ ...request, offchainTokenData }, bigIntReplacer, 2));
68
+ break;
69
+ }
70
+ if (request.tx.error)
71
+ throw new Error(`Request tx reverted: ${util.inspect(request.tx.error)}`);
72
+ const dest = await getChain(request.lane.destChainSelector);
73
+ const offRamp = await discoverOffRamp(source, dest, request.lane.onRamp);
74
+ const commitStore = await dest.getCommitStoreForOffRamp(offRamp);
75
+ const commit = await dest.fetchCommitReport(commitStore, request, argv);
76
+ switch (argv.format) {
77
+ case Format.log:
78
+ console.log('commit =', commit);
79
+ break;
80
+ case Format.pretty:
81
+ await prettyCommit(dest, commit, request);
82
+ break;
83
+ case Format.json:
84
+ console.info(JSON.stringify(commit, bigIntReplacer, 2));
85
+ break;
86
+ }
87
+ let found = false;
88
+ for await (const receipt of dest.fetchExecutionReceipts(offRamp, new Set([request.message.header.messageId]), {
89
+ startBlock: commit.log.blockNumber,
90
+ page: argv.page,
91
+ commit: commit.report,
92
+ })) {
93
+ switch (argv.format) {
94
+ case Format.log:
95
+ console.log('receipt =', withDateTimestamp(receipt));
96
+ break;
97
+ case Format.pretty:
98
+ if (!found)
99
+ console.info('Receipts (dest):');
100
+ prettyReceipt(receipt, request, receipt.log.tx?.from ??
101
+ (await dest.getTransaction(receipt.log.transactionHash).catch(() => null))?.from);
102
+ break;
103
+ case Format.json:
104
+ console.info(JSON.stringify(receipt, bigIntReplacer, 2));
105
+ break;
106
+ }
107
+ found = true;
108
+ }
109
+ if (!found)
110
+ console.warn(`No execution receipt found for request`);
111
+ }
112
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
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 type { Argv } from 'yargs';
26
+ import type { GlobalOpts } from '../index.ts';
27
+ export declare const command: string[];
28
+ export declare const describe = "List supported tokens in a given Router/OnRamp/TokenAdminRegistry, and/or show info about token/pool";
29
+ export declare const builder: (yargs: Argv) => Argv<{
30
+ source: string;
31
+ } & {
32
+ address: string;
33
+ } & {
34
+ token: string | undefined;
35
+ }>;
36
+ export declare function handler(argv: Awaited<ReturnType<typeof builder>['argv']> & GlobalOpts): Promise<void>;
37
+ //# sourceMappingURL=supported-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supported-tokens.d.ts","sourceRoot":"","sources":["../../src/commands/supported-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAUH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAIjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,eAAO,MAAM,OAAO,UAAoD,CAAA;AACxE,eAAO,MAAM,QAAQ,yGACmF,CAAA;AAExG,eAAO,MAAM,OAAO,GAAI,OAAO,IAAI;;;;;;EAkB7B,CAAA;AAEN,wBAAsB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,iBAW3F"}