@w3lib/solana-batch-call 0.0.0-stage → 0.1.0

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 (49) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +169 -2
  4. package/dist/address.d.ts +14 -0
  5. package/dist/address.d.ts.map +1 -0
  6. package/dist/address.js +81 -0
  7. package/dist/address.js.map +1 -0
  8. package/dist/client.d.ts +96 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +575 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/constants.d.ts +21 -0
  13. package/dist/constants.d.ts.map +1 -0
  14. package/dist/constants.js +35 -0
  15. package/dist/constants.js.map +1 -0
  16. package/dist/index.d.ts +9 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +9 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/layout.d.ts +55 -0
  21. package/dist/layout.d.ts.map +1 -0
  22. package/dist/layout.js +177 -0
  23. package/dist/layout.js.map +1 -0
  24. package/dist/rpc.d.ts +59 -0
  25. package/dist/rpc.d.ts.map +1 -0
  26. package/dist/rpc.js +295 -0
  27. package/dist/rpc.js.map +1 -0
  28. package/dist/shortcuts.d.ts +60 -0
  29. package/dist/shortcuts.d.ts.map +1 -0
  30. package/dist/shortcuts.js +136 -0
  31. package/dist/shortcuts.js.map +1 -0
  32. package/dist/source.d.ts +35 -0
  33. package/dist/source.d.ts.map +1 -0
  34. package/dist/source.js +126 -0
  35. package/dist/source.js.map +1 -0
  36. package/dist/types.d.ts +104 -0
  37. package/dist/types.d.ts.map +1 -0
  38. package/dist/types.js +2 -0
  39. package/dist/types.js.map +1 -0
  40. package/package.json +56 -3
  41. package/src/address.ts +92 -0
  42. package/src/client.ts +753 -0
  43. package/src/constants.ts +41 -0
  44. package/src/index.ts +54 -0
  45. package/src/layout.ts +238 -0
  46. package/src/rpc.ts +349 -0
  47. package/src/shortcuts.ts +173 -0
  48. package/src/source.ts +151 -0
  49. package/src/types.ts +108 -0
package/dist/client.js ADDED
@@ -0,0 +1,575 @@
1
+ import { base64 } from '@scure/base';
2
+ import { getAssociatedTokenAddress, getMetadataAddress, isAddress } from './address.js';
3
+ import { NATIVE_MINT, SOL_DECIMALS, SYSTEM_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, clusterOfGenesis, } from './constants.js';
4
+ import { formatAmount, parseMetaplexMetadata, parseMint, parseTokenAccount } from './layout.js';
5
+ import { HttpError, RpcError } from './rpc.js';
6
+ import { NetworkMismatchError, resolveSource } from './source.js';
7
+ import { DEFAULT_TOKEN_FIELDS, } from './types.js';
8
+ const MAX_ACCOUNTS_PER_REQUEST = 100;
9
+ /** 同时进行的 getMultipleAccounts 请求数上限 */
10
+ const MAX_PARALLEL_ACCOUNT_REQUESTS = 3;
11
+ /** #fetchAccounts 里没能读到(节点问题)的账户 */
12
+ const FAILED = Symbol('failed');
13
+ /** 可以降级处理的错误:网络 / HTTP 错误、节点限制(限频、需要 Key 等)、节点不在期望的网络上;其他(参数错误、程序 bug)照常抛出 */
14
+ function isRecoverable(err) {
15
+ return err instanceof HttpError || (err instanceof RpcError && err.nodeFault) || err instanceof NetworkMismatchError;
16
+ }
17
+ /** 按 mint 汇总后精度 0、数量 1 的持仓视为 NFT(ownerTokens 与 ownerNfts 共用) */
18
+ function isNftHolding(holding) {
19
+ return holding.decimals === 0 && holding.amount === 1n;
20
+ }
21
+ const TOKEN_STANDARDS = [
22
+ 'NonFungible',
23
+ 'FungibleAsset',
24
+ 'Fungible',
25
+ 'NonFungibleEdition',
26
+ 'ProgrammableNonFungible',
27
+ 'ProgrammableNonFungibleEdition',
28
+ ];
29
+ // 代币信息缓存(按 网络 + mint):decimals / 所属程序不会变,永久缓存;
30
+ // name / symbol 来自可修改的元数据,缓存 1 小时。条目数有上限,超出时淘汰最早写入的
31
+ const NAME_TTL = 60 * 60 * 1000;
32
+ const MAX_CACHED_TOKENS = 50_000;
33
+ const tokenMetaCache = new Map();
34
+ let clientIds = 0;
35
+ /** 测试用:清空代币信息缓存 */
36
+ export function resetTokenMetaCache() {
37
+ tokenMetaCache.clear();
38
+ }
39
+ /**
40
+ * Solana 批量读取客户端。
41
+ *
42
+ * ```ts
43
+ * const sol = new SolanaClient() // 内置公共节点(mainnet)
44
+ * const sol = new SolanaClient('https://my-rpc.example') // 自己的节点
45
+ * const sol = new SolanaClient([connection, 'https://backup…']) // web3.js Connection + 备用节点
46
+ *
47
+ * await sol.balances(owner, [NATIVE_MINT, USDC])
48
+ * await sol.tokens([USDC, PYUSD], { fields: ['name', 'symbol', 'decimals', 'supply'] })
49
+ * ```
50
+ *
51
+ * 同一 tick 内发起的 RPC 调用会合并成一个 JSON-RPC 批量请求;账户读取按 100 个一组用 getMultipleAccounts。
52
+ */
53
+ export class SolanaClient {
54
+ transport;
55
+ #genesis;
56
+ #cluster;
57
+ #commitment;
58
+ #nativeMints;
59
+ #scopeId;
60
+ constructor(provider, config = {}) {
61
+ const resolved = resolveSource(provider, config.cluster ?? (provider === undefined ? 'mainnet' : undefined), config);
62
+ this.transport = resolved.transport;
63
+ this.#genesis = resolved.genesis;
64
+ this.#cluster = config.cluster ?? (provider === undefined ? 'mainnet' : undefined);
65
+ this.#commitment = config.commitment ?? 'confirmed';
66
+ this.#nativeMints = new Set(config.nativeMints ?? [NATIVE_MINT, SYSTEM_PROGRAM_ID]);
67
+ // 网络已知时按网络共享缓存;未知(自定义节点且没指定 cluster)时缓存只在本客户端内使用,避免不同网络串数据
68
+ this.#scopeId = this.#cluster ?? `client-${++clientIds}`;
69
+ }
70
+ /** 节点所在网络(按创世区块哈希识别);不是 mainnet / devnet / testnet 时为 null */
71
+ async getCluster() {
72
+ return this.#cluster ?? clusterOfGenesis(await this.#genesis());
73
+ }
74
+ /** 直接发 JSON-RPC 调用(同样参与自动合并与故障切换) */
75
+ request(method, params) {
76
+ return this.transport.request(method, params);
77
+ }
78
+ /**
79
+ * 批量读取账户(getMultipleAccounts,按 100 个一组,去重),结果与 addresses 一一对应。
80
+ * 账户不存在或地址非法时为 null。
81
+ */
82
+ async accounts(addresses) {
83
+ const fetched = await this.#fetchAccounts(addresses, false);
84
+ return addresses.map((address) => fetched.get(address) ?? null);
85
+ }
86
+ /**
87
+ * getMultipleAccounts:去重、按 100 个一组,最多同时 3 组(避免大批量时触发节点限频)。
88
+ * tolerant 为 true 时,某组因节点问题(网络、限频等)失败不抛错:该组标记为 FAILED,并且不再发后面的组(节点已经在限频了)。
89
+ */
90
+ async #fetchAccounts(addresses, tolerant) {
91
+ const unique = [...new Set(addresses.filter((a) => isAddress(a)))];
92
+ const chunks = [];
93
+ for (let i = 0; i < unique.length; i += MAX_ACCOUNTS_PER_REQUEST) {
94
+ chunks.push(unique.slice(i, i + MAX_ACCOUNTS_PER_REQUEST));
95
+ }
96
+ const result = new Map();
97
+ let aborted = false;
98
+ for (let i = 0; i < chunks.length; i += MAX_PARALLEL_ACCOUNT_REQUESTS) {
99
+ const wave = chunks.slice(i, i + MAX_PARALLEL_ACCOUNT_REQUESTS);
100
+ if (aborted) {
101
+ wave.flat().forEach((address) => result.set(address, FAILED));
102
+ continue;
103
+ }
104
+ await Promise.all(wave.map(async (chunk) => {
105
+ try {
106
+ const res = await this.transport.request('getMultipleAccounts', [
107
+ chunk,
108
+ { encoding: 'base64', commitment: this.#commitment },
109
+ ]);
110
+ chunk.forEach((address, j) => result.set(address, toAccountInfo(address, res?.value?.[j] ?? null)));
111
+ }
112
+ catch (err) {
113
+ if (!tolerant || !isRecoverable(err)) {
114
+ throw err;
115
+ }
116
+ aborted = true;
117
+ chunk.forEach((address) => result.set(address, FAILED));
118
+ }
119
+ }));
120
+ }
121
+ return result;
122
+ }
123
+ /** 批量查多个地址的 SOL 余额(一次 getMultipleAccounts;账户不存在视为 0) */
124
+ async solBalances(addresses) {
125
+ const accounts = await this.accounts(addresses);
126
+ return addresses.map((address, i) => {
127
+ if (!isAddress(address)) {
128
+ return { address, balance: '0', formatted: '0', success: false };
129
+ }
130
+ const lamports = accounts[i]?.lamports ?? 0n;
131
+ return { address, balance: lamports.toString(), formatted: formatAmount(lamports, SOL_DECIMALS), success: true };
132
+ });
133
+ }
134
+ /**
135
+ * 批量查余额(主币 SOL + SPL Token + Token-2022),返回原始余额、decimals 和换算后的数值。
136
+ *
137
+ * - 传 mints:本地推导 ATA,与主币账户、mint 账户一起用 getMultipleAccounts 一次读完,免费节点也能用
138
+ * - 不传 mints(或 scan: true):用 getTokenAccountsByOwner 扫描全部代币账户,返回所有余额大于 0 的代币
139
+ */
140
+ async balances(owner, mints, options = {}) {
141
+ if (!isAddress(owner)) {
142
+ throw new Error(`Invalid owner address: ${owner}`);
143
+ }
144
+ if (mints === undefined || options.scan) {
145
+ return this.#scanBalances(owner, mints, options.symbol ?? false);
146
+ }
147
+ return this.#ataBalances(owner, mints, options.symbol ?? false);
148
+ }
149
+ async #ataBalances(owner, mints, withSymbol) {
150
+ const scope = this.#scope();
151
+ const addresses = [];
152
+ const plan = mints.map((mint) => {
153
+ if (this.#nativeMints.has(mint)) {
154
+ return { mint, native: true, owner: addresses.push(owner) - 1 };
155
+ }
156
+ if (!isAddress(mint)) {
157
+ return { mint, native: false, invalid: true };
158
+ }
159
+ const meta = getMeta(scope, mint);
160
+ const needMint = meta.decimals === undefined || meta.tokenProgram === undefined || (withSymbol && meta.symbol === undefined);
161
+ const programs = meta.tokenProgram ? [meta.tokenProgram] : [TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID];
162
+ return {
163
+ mint,
164
+ native: false,
165
+ meta,
166
+ mintIndex: needMint ? addresses.push(mint) - 1 : -1,
167
+ metadataIndex: withSymbol && meta.symbol === undefined ? addresses.push(getMetadataAddress(mint)) - 1 : -1,
168
+ atas: programs.map((program) => ({ program, index: addresses.push(getAssociatedTokenAddress(owner, mint, program)) - 1 })),
169
+ };
170
+ });
171
+ const accounts = await this.accounts(addresses);
172
+ return plan.map((item) => {
173
+ if (item.native) {
174
+ const lamports = accounts[item.owner]?.lamports ?? 0n;
175
+ return withSymbolField({ token: item.mint, native: true, balance: lamports.toString(), decimals: SOL_DECIMALS, formatted: formatAmount(lamports, SOL_DECIMALS), tokenProgram: null, success: true }, withSymbol, 'SOL');
176
+ }
177
+ if ('invalid' in item) {
178
+ return withSymbolField({ token: item.mint, native: false, balance: '0', decimals: 0, formatted: '0', tokenProgram: null, success: false }, withSymbol, null);
179
+ }
180
+ const mintAccount = item.mintIndex === -1 ? null : (accounts[item.mintIndex] ?? null);
181
+ const meta = this.#learn(scope, item.mint, mintAccount, item.metadataIndex === -1 ? null : (accounts[item.metadataIndex] ?? null), item.metadataIndex !== -1 && item.mintIndex !== -1);
182
+ // 代币账户由哪个程序持有就是哪个;mint 账户的 owner 也能确定程序
183
+ let amount = 0n;
184
+ for (const ata of item.atas) {
185
+ const account = accounts[ata.index];
186
+ if (account && account.owner === ata.program) {
187
+ try {
188
+ amount = parseTokenAccount(account.data).amount;
189
+ if (meta.tokenProgram === undefined) {
190
+ setMeta(scope, item.mint, { tokenProgram: ata.program });
191
+ meta.tokenProgram = ata.program;
192
+ }
193
+ }
194
+ catch {
195
+ // 不是代币账户
196
+ }
197
+ }
198
+ }
199
+ if (meta.decimals === undefined) {
200
+ return withSymbolField({ token: item.mint, native: false, balance: '0', decimals: 0, formatted: '0', tokenProgram: meta.tokenProgram ?? null, success: false }, withSymbol, meta.symbol ?? null);
201
+ }
202
+ return withSymbolField({
203
+ token: item.mint,
204
+ native: false,
205
+ balance: amount.toString(),
206
+ decimals: meta.decimals,
207
+ formatted: formatAmount(amount, meta.decimals),
208
+ tokenProgram: meta.tokenProgram ?? null,
209
+ success: true,
210
+ }, withSymbol, meta.symbol ?? null);
211
+ });
212
+ }
213
+ /** 扫描持有人的 SOL 余额和全部代币账户(Token + Token-2022),同一代币的多个账户合计 */
214
+ async #scanHoldings(owner) {
215
+ const scope = this.#scope();
216
+ const [lamports, ...programs] = await Promise.all([
217
+ this.transport.request('getBalance', [owner, { commitment: this.#commitment }]),
218
+ ...[TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID].map((programId) => this.transport.request('getTokenAccountsByOwner', [
219
+ owner,
220
+ { programId },
221
+ { encoding: 'jsonParsed', commitment: this.#commitment },
222
+ ])),
223
+ ]);
224
+ const held = new Map();
225
+ [TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID].forEach((program, i) => {
226
+ for (const entry of programs[i]?.value ?? []) {
227
+ const info = entry.account?.data?.parsed?.info;
228
+ const mint = info?.mint;
229
+ const decimals = info?.tokenAmount?.decimals;
230
+ if (!mint || decimals === undefined) {
231
+ continue;
232
+ }
233
+ const prev = held.get(mint);
234
+ const amount = BigInt(info?.tokenAmount?.amount ?? '0');
235
+ held.set(mint, { amount: (prev?.amount ?? 0n) + amount, decimals, program, accounts: (prev?.accounts ?? 0) + 1 });
236
+ setMeta(scope, mint, { decimals, tokenProgram: program });
237
+ }
238
+ });
239
+ return { sol: BigInt(lamports.value), held };
240
+ }
241
+ /**
242
+ * 列出持有人拥有的全部代币(SOL 在第一位),带 name / symbol,适合做资产列表。
243
+ * 需要支持 getTokenAccountsByOwner 的节点(免费公共节点大多不支持)。
244
+ *
245
+ * - 默认不含 NFT(精度 0 且数量 1)和余额为 0 的代币账户(如已清空的 ATA),可用 includeNfts / includeZero 打开
246
+ * - accounts 是该代币的代币账户数量;大于 1 时余额为所有账户的合计
247
+ * - 顺序:SOL,然后 SPL Token 的代币,再然后 Token-2022 的代币(各自按节点返回的顺序;没有价格信息,不按价值排序)
248
+ */
249
+ async ownerTokens(owner, options = {}) {
250
+ if (!isAddress(owner)) {
251
+ throw new Error(`Invalid owner address: ${owner}`);
252
+ }
253
+ const { metadata = true, includeNative = true, includeZero = false, includeNfts = false } = options;
254
+ const scope = this.#scope();
255
+ const { sol, held } = await this.#scanHoldings(owner);
256
+ // Wrapped SOL 是独立的代币账户(需要 unwrap 才是 SOL),资产列表里单独列出(native: false)
257
+ const tokens = [...held].filter(([, h]) => (includeZero || h.amount > 0n) && (includeNfts || !isNftHolding(h)));
258
+ const failed = metadata ? await this.#loadMeta(scope, tokens.map(([mint]) => mint), true, true) : new Set();
259
+ const list = tokens.map(([mint, h]) => {
260
+ const item = {
261
+ token: mint,
262
+ native: false,
263
+ balance: h.amount.toString(),
264
+ decimals: h.decimals,
265
+ formatted: formatAmount(h.amount, h.decimals),
266
+ tokenProgram: h.program,
267
+ accounts: h.accounts,
268
+ success: true,
269
+ };
270
+ if (!metadata) {
271
+ return item;
272
+ }
273
+ const meta = getMeta(scope, mint);
274
+ const status = failed.has(mint) ? 'failed' : meta.name == null && meta.symbol == null ? 'missing' : 'ok';
275
+ return { ...item, name: meta.name ?? null, symbol: meta.symbol ?? null, metadataStatus: status };
276
+ });
277
+ if (includeNative) {
278
+ const sol_ = { token: NATIVE_MINT, native: true, balance: sol.toString(), decimals: SOL_DECIMALS, formatted: formatAmount(sol, SOL_DECIMALS), tokenProgram: null, accounts: 1, success: true };
279
+ list.unshift(metadata ? { ...sol_, name: 'Solana', symbol: 'SOL', metadataStatus: 'ok' } : sol_);
280
+ }
281
+ return list;
282
+ }
283
+ async #scanBalances(owner, mints, withSymbol) {
284
+ const scope = this.#scope();
285
+ const { sol, held } = await this.#scanHoldings(owner);
286
+ // Wrapped SOL(So111…112)默认按原生 SOL 处理:余额列表里只有一项 SOL,不再列出 wSOL 代币账户
287
+ const targets = mints ?? [NATIVE_MINT, ...[...held].filter(([mint, h]) => h.amount > 0n && !this.#nativeMints.has(mint)).map(([mint]) => mint)];
288
+ // 没持有的代币(拿不到 decimals)和缺 symbol 的代币:只读 mint / 元数据账户补上,不需要 ATA
289
+ await this.#loadMeta(scope, targets.filter((mint) => !this.#nativeMints.has(mint) && isAddress(mint)), withSymbol);
290
+ return targets.map((mint) => {
291
+ if (this.#nativeMints.has(mint)) {
292
+ return withSymbolField({ token: mint, native: true, balance: sol.toString(), decimals: SOL_DECIMALS, formatted: formatAmount(sol, SOL_DECIMALS), tokenProgram: null, success: true }, withSymbol, 'SOL');
293
+ }
294
+ const h = held.get(mint);
295
+ if (!h) {
296
+ // 没持有:余额为 0;decimals 来自 mint 账户(mint 不存在时 success 为 false)
297
+ const meta = getMeta(scope, mint);
298
+ return withSymbolField({ token: mint, native: false, balance: '0', decimals: meta.decimals ?? 0, formatted: '0', tokenProgram: meta.tokenProgram ?? null, success: meta.decimals !== undefined }, withSymbol, meta.symbol ?? null);
299
+ }
300
+ return withSymbolField({ token: mint, native: false, balance: h.amount.toString(), decimals: h.decimals, formatted: formatAmount(h.amount, h.decimals), tokenProgram: h.program, success: true }, withSymbol, getMeta(scope, mint).symbol ?? null);
301
+ });
302
+ }
303
+ /**
304
+ * 补齐 decimals / 所属程序(以及需要时的 symbol / name):只读缺的 mint 账户和元数据账户。
305
+ * tolerant 为 true 时节点问题不抛错,返回没能读到的 mint(这些代币的信息保持未知,不写缓存)。
306
+ */
307
+ async #loadMeta(scope, mints, withSymbol, tolerant = false) {
308
+ const plan = [...new Set(mints)].flatMap((mint) => {
309
+ const meta = getMeta(scope, mint);
310
+ const needSymbol = withSymbol && meta.symbol === undefined;
311
+ if (meta.decimals !== undefined && meta.tokenProgram !== undefined && !needSymbol) {
312
+ return [];
313
+ }
314
+ return [{ mint, metadata: needSymbol ? getMetadataAddress(mint) : null }];
315
+ });
316
+ const failed = new Set();
317
+ if (!plan.length) {
318
+ return failed;
319
+ }
320
+ const fetched = await this.#fetchAccounts(plan.flatMap(({ mint, metadata }) => (metadata ? [mint, metadata] : [mint])), tolerant);
321
+ for (const { mint, metadata } of plan) {
322
+ const mintAccount = fetched.get(mint);
323
+ const metadataAccount = metadata ? fetched.get(metadata) : null;
324
+ // mint 和元数据账户可能落在不同的请求里:任一个没读到都算失败,不能当成“没有元数据”缓存
325
+ if (mintAccount === FAILED || metadataAccount === FAILED) {
326
+ failed.add(mint);
327
+ continue;
328
+ }
329
+ this.#learn(scope, mint, mintAccount ?? null, metadataAccount ?? null, metadata !== null);
330
+ }
331
+ return failed;
332
+ }
333
+ /**
334
+ * 批量查代币详情(一次 getMultipleAccounts),可以选择返回哪些字段。
335
+ * name / symbol / uri 优先取 Token-2022 TokenMetadata 扩展,其次 Metaplex 元数据。
336
+ */
337
+ async tokens(mints, options = {}) {
338
+ const fields = (options.fields ?? DEFAULT_TOKEN_FIELDS);
339
+ const wanted = new Set(fields);
340
+ const scope = this.#scope();
341
+ const needsNames = wanted.has('name') || wanted.has('symbol') || wanted.has('uri');
342
+ const addresses = [];
343
+ const plan = mints.map((mint) => {
344
+ if (this.#nativeMints.has(mint) || !isAddress(mint)) {
345
+ return { mint, mintIndex: -1, metadataIndex: -1 };
346
+ }
347
+ const meta = getMeta(scope, mint);
348
+ // uri / supply / 权限不缓存,需要时总要读 mint;name / symbol 命中缓存时可以省掉元数据账户
349
+ const cachedOnly = !wanted.has('uri') &&
350
+ !wanted.has('supply') &&
351
+ !wanted.has('mintAuthority') &&
352
+ !wanted.has('freezeAuthority') &&
353
+ (!wanted.has('decimals') || meta.decimals !== undefined) &&
354
+ (!wanted.has('tokenProgram') || meta.tokenProgram !== undefined) &&
355
+ (!wanted.has('name') || meta.name !== undefined) &&
356
+ (!wanted.has('symbol') || meta.symbol !== undefined);
357
+ if (cachedOnly) {
358
+ return { mint, mintIndex: -1, metadataIndex: -1 };
359
+ }
360
+ const namesCached = (!wanted.has('name') || meta.name !== undefined) && (!wanted.has('symbol') || meta.symbol !== undefined) && !wanted.has('uri');
361
+ return {
362
+ mint,
363
+ mintIndex: addresses.push(mint) - 1,
364
+ metadataIndex: needsNames && !namesCached ? addresses.push(getMetadataAddress(mint)) - 1 : -1,
365
+ };
366
+ });
367
+ const accounts = addresses.length ? await this.accounts(addresses) : [];
368
+ return plan.map(({ mint, mintIndex, metadataIndex }) => {
369
+ const native = this.#nativeMints.has(mint);
370
+ const values = native
371
+ ? { exists: true, name: 'Solana', symbol: 'SOL', uri: null, decimals: SOL_DECIMALS, supply: null, tokenProgram: null, mintAuthority: null, freezeAuthority: null }
372
+ : this.#tokenValues(scope, mint, mintIndex === -1 ? null : (accounts[mintIndex] ?? null), metadataIndex === -1 ? null : (accounts[metadataIndex] ?? null), mintIndex !== -1, mintIndex !== -1 && metadataIndex !== -1);
373
+ const out = { address: mint, native };
374
+ let success = values.exists;
375
+ for (const field of fields) {
376
+ out[field] = values[field] ?? null;
377
+ // 权限为 null 表示没有权限,是有效值;主币没有 uri / supply / tokenProgram
378
+ const nullable = field === 'mintAuthority' || field === 'freezeAuthority' || (native && (field === 'uri' || field === 'supply' || field === 'tokenProgram'));
379
+ if (out[field] === null && !nullable) {
380
+ success = false;
381
+ }
382
+ }
383
+ if (wanted.has('supply')) {
384
+ const supply = values.supply;
385
+ const decimals = values.decimals;
386
+ out.supplyFormatted = supply === null || decimals === null ? null : formatAmount(BigInt(supply), decimals);
387
+ }
388
+ out.success = success;
389
+ return out;
390
+ });
391
+ }
392
+ #tokenValues(scope, mint, mintAccount, metadataAccount, fetchedMint, lookedForNames = false) {
393
+ const meta = this.#learn(scope, mint, mintAccount, metadataAccount, lookedForNames);
394
+ const info = mintAccount ? safeParseMint(mintAccount) : null;
395
+ const uri = info?.metadata?.uri ?? (metadataAccount ? (safeParseMetaplex(metadataAccount)?.uri ?? null) : null);
396
+ return {
397
+ // 读了 mint 账户就以它为准(不存在则 false);没读说明请求的字段全部命中缓存
398
+ exists: fetchedMint ? info !== null : true,
399
+ name: meta.name ?? null,
400
+ symbol: meta.symbol ?? null,
401
+ uri,
402
+ decimals: meta.decimals ?? null,
403
+ supply: info ? info.supply.toString() : null,
404
+ tokenProgram: meta.tokenProgram ?? null,
405
+ mintAuthority: info?.mintAuthority ?? null,
406
+ freezeAuthority: info?.freezeAuthority ?? null,
407
+ };
408
+ }
409
+ /** 批量查 NFT 元数据(Metaplex;Token-2022 NFT 取 TokenMetadata 扩展),一次 getMultipleAccounts */
410
+ async nfts(mints) {
411
+ const scope = this.#scope();
412
+ const addresses = [];
413
+ const plan = mints.map((mint) => isAddress(mint) ? { mint, metadataIndex: addresses.push(getMetadataAddress(mint)) - 1, mintIndex: addresses.push(mint) - 1 } : { mint, metadataIndex: -1, mintIndex: -1 });
414
+ const accounts = addresses.length ? await this.accounts(addresses) : [];
415
+ return plan.map(({ mint, metadataIndex, mintIndex }) => {
416
+ const metadataAccount = metadataIndex === -1 ? null : (accounts[metadataIndex] ?? null);
417
+ const mintAccount = mintIndex === -1 ? null : (accounts[mintIndex] ?? null);
418
+ this.#learn(scope, mint, mintAccount, metadataAccount, mintIndex !== -1);
419
+ const metaplex = metadataAccount ? safeParseMetaplex(metadataAccount) : null;
420
+ const ext = mintAccount ? (safeParseMint(mintAccount)?.metadata ?? null) : null;
421
+ if (!metaplex && !ext) {
422
+ return { mint, name: null, symbol: null, uri: null, collection: null, creators: [], sellerFeeBasisPoints: null, tokenStandard: null, isMutable: null, updateAuthority: null, success: false };
423
+ }
424
+ return {
425
+ mint,
426
+ name: ext?.name ?? metaplex?.name ?? null,
427
+ symbol: ext?.symbol ?? metaplex?.symbol ?? null,
428
+ uri: ext?.uri ?? metaplex?.uri ?? null,
429
+ collection: metaplex?.collection ?? null,
430
+ creators: metaplex?.creators ?? [],
431
+ sellerFeeBasisPoints: metaplex?.sellerFeeBasisPoints ?? null,
432
+ tokenStandard: metaplex?.tokenStandard == null ? null : (TOKEN_STANDARDS[metaplex.tokenStandard] ?? null),
433
+ isMutable: metaplex?.isMutable ?? null,
434
+ updateAuthority: metaplex?.updateAuthority ?? null,
435
+ success: true,
436
+ };
437
+ });
438
+ }
439
+ /** 批量查 NFT 持有人:getTokenLargestAccounts(合并成一个批量请求)+ 一次 getMultipleAccounts */
440
+ async nftOwners(mints) {
441
+ const largest = await Promise.all(mints.map((mint) => isAddress(mint)
442
+ ? this.transport
443
+ .request('getTokenLargestAccounts', [mint, { commitment: this.#commitment }])
444
+ .then((res) => res.value.find((a) => a.amount !== '0')?.address ?? null)
445
+ .catch((err) => {
446
+ // mint 不存在 / 不是代币:该项失败;节点问题照常抛出
447
+ if (err instanceof RpcError && !err.nodeFault)
448
+ return null;
449
+ throw err;
450
+ })
451
+ : Promise.resolve(null)));
452
+ const tokenAccounts = largest.filter((a) => a !== null);
453
+ const accounts = tokenAccounts.length ? await this.accounts(tokenAccounts) : [];
454
+ const byAddress = new Map(tokenAccounts.map((a, i) => [a, accounts[i] ?? null]));
455
+ return mints.map((mint, i) => {
456
+ const tokenAccount = largest[i] ?? null;
457
+ const account = tokenAccount ? byAddress.get(tokenAccount) : null;
458
+ let owner = null;
459
+ if (account) {
460
+ try {
461
+ owner = parseTokenAccount(account.data).owner;
462
+ }
463
+ catch {
464
+ owner = null;
465
+ }
466
+ }
467
+ return { mint, owner, tokenAccount: owner ? tokenAccount : null, success: owner !== null };
468
+ });
469
+ }
470
+ /** 查某地址持有的全部 NFT(扫描代币账户:数量 1、精度 0),再批量读元数据。需要支持 getTokenAccountsByOwner 的节点 */
471
+ async ownerNfts(owner) {
472
+ if (!isAddress(owner)) {
473
+ throw new Error(`Invalid owner address: ${owner}`);
474
+ }
475
+ const { held } = await this.#scanHoldings(owner);
476
+ const mints = [...held].filter(([, h]) => isNftHolding(h)).map(([mint]) => mint);
477
+ return mints.length ? (await this.nfts(mints)).filter((nft) => nft.success) : [];
478
+ }
479
+ #scope() {
480
+ return this.#scopeId;
481
+ }
482
+ /**
483
+ * 从 mint 账户 / 元数据账户里学到的信息写入缓存,返回合并后的结果。
484
+ * lookedForNames:本次同时读了 mint 和元数据账户,都没有 name / symbol 时记为“确认没有”(null),之后不再重查
485
+ */
486
+ #learn(scope, mint, mintAccount, metadataAccount, lookedForNames = false) {
487
+ const update = {};
488
+ const info = mintAccount ? safeParseMint(mintAccount) : null;
489
+ if (info && mintAccount) {
490
+ update.decimals = info.decimals;
491
+ update.tokenProgram = mintAccount.owner;
492
+ if (info.metadata) {
493
+ update.name = info.metadata.name;
494
+ update.symbol = info.metadata.symbol;
495
+ }
496
+ }
497
+ if (metadataAccount && update.name === undefined) {
498
+ const metaplex = safeParseMetaplex(metadataAccount);
499
+ if (metaplex) {
500
+ update.name = metaplex.name;
501
+ update.symbol = metaplex.symbol;
502
+ }
503
+ }
504
+ if (lookedForNames && info && update.name === undefined) {
505
+ update.name = null;
506
+ update.symbol = null;
507
+ }
508
+ setMeta(scope, mint, update);
509
+ return getMeta(scope, mint);
510
+ }
511
+ }
512
+ function toAccountInfo(address, raw) {
513
+ if (!raw) {
514
+ return null;
515
+ }
516
+ const encoded = Array.isArray(raw.data) ? raw.data[0] : raw.data;
517
+ return {
518
+ address,
519
+ lamports: BigInt(raw.lamports),
520
+ owner: raw.owner,
521
+ data: base64.decode(encoded),
522
+ executable: raw.executable,
523
+ };
524
+ }
525
+ function safeParseMint(account) {
526
+ if (account.owner !== TOKEN_PROGRAM_ID && account.owner !== TOKEN_2022_PROGRAM_ID) {
527
+ return null;
528
+ }
529
+ try {
530
+ return parseMint(account.data);
531
+ }
532
+ catch {
533
+ return null;
534
+ }
535
+ }
536
+ function safeParseMetaplex(account) {
537
+ try {
538
+ return parseMetaplexMetadata(account.data);
539
+ }
540
+ catch {
541
+ return null;
542
+ }
543
+ }
544
+ function getMeta(scope, mint) {
545
+ const cached = tokenMetaCache.get(`${scope}:${mint}`);
546
+ if (!cached) {
547
+ return {};
548
+ }
549
+ const { namesAt, ...meta } = cached;
550
+ if (namesAt === undefined || Date.now() - namesAt > NAME_TTL) {
551
+ delete meta.name;
552
+ delete meta.symbol;
553
+ }
554
+ return meta;
555
+ }
556
+ function setMeta(scope, mint, meta) {
557
+ const defined = Object.fromEntries(Object.entries(meta).filter(([, v]) => v !== undefined));
558
+ if (Object.keys(defined).length === 0) {
559
+ return;
560
+ }
561
+ if ('name' in defined || 'symbol' in defined) {
562
+ defined.namesAt = Date.now();
563
+ }
564
+ const key = `${scope}:${mint}`;
565
+ const merged = { ...tokenMetaCache.get(key), ...defined };
566
+ tokenMetaCache.delete(key); // 重新插入,保持“最近写入在后”的顺序
567
+ tokenMetaCache.set(key, merged);
568
+ if (tokenMetaCache.size > MAX_CACHED_TOKENS) {
569
+ tokenMetaCache.delete(tokenMetaCache.keys().next().value);
570
+ }
571
+ }
572
+ function withSymbolField(balance, withSymbol, symbol) {
573
+ return withSymbol ? { ...balance, symbol } : balance;
574
+ }
575
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare const SYSTEM_PROGRAM_ID = "11111111111111111111111111111111";
2
+ export declare const TOKEN_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
3
+ export declare const TOKEN_2022_PROGRAM_ID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
4
+ export declare const ASSOCIATED_TOKEN_PROGRAM_ID = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL";
5
+ export declare const METADATA_PROGRAM_ID = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s";
6
+ /** Wrapped SOL 的 mint,按惯例也用来表示原生 SOL */
7
+ export declare const NATIVE_MINT = "So11111111111111111111111111111111111111112";
8
+ /** 原生 SOL 的精度(lamports) */
9
+ export declare const SOL_DECIMALS = 9;
10
+ export type Cluster = 'mainnet' | 'devnet' | 'testnet';
11
+ /** 各网络的创世区块哈希(getGenesisHash),用于识别节点所在网络 */
12
+ export declare const GENESIS_HASHES: Readonly<Record<Cluster, string>>;
13
+ export declare function clusterOfGenesis(hash: string): Cluster | null;
14
+ /**
15
+ * 内置公共节点(按优先级排序,2026-10 实测):
16
+ * - publicnode:放行跨域、支持批量请求,但不支持 getTokenAccountsByOwner 等需要索引的方法
17
+ * - 官方节点:对带浏览器 Origin 的请求返回 403,只能在服务端使用
18
+ * 公共节点限频严,生产环境建议传入自己的节点(Helius / QuickNode / Triton 等)。
19
+ */
20
+ export declare const DEFAULT_RPC_URLS: Readonly<Record<Cluster, readonly string[]>>;
21
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,qCAAqC,CAAA;AACnE,eAAO,MAAM,gBAAgB,gDAAgD,CAAA;AAC7E,eAAO,MAAM,qBAAqB,gDAAgD,CAAA;AAClF,eAAO,MAAM,2BAA2B,iDAAiD,CAAA;AACzF,eAAO,MAAM,mBAAmB,gDAAgD,CAAA;AAEhF,wCAAwC;AACxC,eAAO,MAAM,WAAW,gDAAgD,CAAA;AAExE,2BAA2B;AAC3B,eAAO,MAAM,YAAY,IAAI,CAAA;AAE7B,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEtD,4CAA4C;AAC5C,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAI5D,CAAA;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAO7D;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC,CAIzE,CAAA"}