@w3lib/evm-batch-call 0.1.0 → 0.2.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 (63) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +103 -12
  3. package/dist/call.d.ts +8 -2
  4. package/dist/call.d.ts.map +1 -1
  5. package/dist/call.js +25 -1
  6. package/dist/call.js.map +1 -1
  7. package/dist/chains.d.ts +13 -0
  8. package/dist/chains.d.ts.map +1 -0
  9. package/dist/chains.js +35 -0
  10. package/dist/chains.js.map +1 -0
  11. package/dist/detect.d.ts +23 -0
  12. package/dist/detect.d.ts.map +1 -0
  13. package/dist/detect.js +178 -0
  14. package/dist/detect.js.map +1 -0
  15. package/dist/erc20.d.ts +83 -7
  16. package/dist/erc20.d.ts.map +1 -1
  17. package/dist/erc20.js +36 -5
  18. package/dist/erc20.js.map +1 -1
  19. package/dist/fallback.d.ts +2 -0
  20. package/dist/fallback.d.ts.map +1 -1
  21. package/dist/fallback.js +6 -18
  22. package/dist/fallback.js.map +1 -1
  23. package/dist/index.d.ts +7 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +6 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/nft.d.ts +71 -0
  28. package/dist/nft.d.ts.map +1 -0
  29. package/dist/nft.js +194 -0
  30. package/dist/nft.js.map +1 -0
  31. package/dist/provider.d.ts +93 -12
  32. package/dist/provider.d.ts.map +1 -1
  33. package/dist/provider.js +306 -48
  34. package/dist/provider.js.map +1 -1
  35. package/dist/shortcuts.d.ts +95 -0
  36. package/dist/shortcuts.d.ts.map +1 -0
  37. package/dist/shortcuts.js +175 -0
  38. package/dist/shortcuts.js.map +1 -0
  39. package/dist/source.d.ts +21 -1
  40. package/dist/source.d.ts.map +1 -1
  41. package/dist/source.js +96 -3
  42. package/dist/source.js.map +1 -1
  43. package/dist/tron.d.ts +6 -0
  44. package/dist/tron.d.ts.map +1 -1
  45. package/dist/tron.js +16 -1
  46. package/dist/tron.js.map +1 -1
  47. package/dist/util.d.ts +6 -0
  48. package/dist/util.d.ts.map +1 -0
  49. package/dist/util.js +20 -0
  50. package/dist/util.js.map +1 -0
  51. package/package.json +3 -2
  52. package/src/call.ts +32 -3
  53. package/src/chains.ts +46 -0
  54. package/src/detect.ts +193 -0
  55. package/src/erc20.ts +111 -9
  56. package/src/fallback.ts +7 -20
  57. package/src/index.ts +55 -4
  58. package/src/nft.ts +298 -0
  59. package/src/provider.ts +416 -54
  60. package/src/shortcuts.ts +256 -0
  61. package/src/source.ts +102 -3
  62. package/src/tron.ts +21 -2
  63. package/src/util.ts +20 -0
package/dist/erc20.d.ts CHANGED
@@ -14,14 +14,90 @@ export interface Erc20Contract extends Contract {
14
14
  transfer: Method<[to: string, amount: bigint | string | number], boolean>;
15
15
  transferFrom: Method<[from: string, to: string, amount: bigint | string | number], boolean>;
16
16
  }
17
- export interface TokenInfo {
18
- address: string;
19
- /** 读取失败(如 symbol 是 bytes32 的老代币)时为 null */
20
- symbol: string | null;
21
- name: string | null;
17
+ /** allowances() / getAllowances() 的单项结果 */
18
+ export interface TokenAllowance {
19
+ token: string;
20
+ spender: string;
21
+ /** 主币不需要授权,视为无限额度 */
22
+ native: boolean;
23
+ /** 授权额度(最小单位的十进制字符串) */
24
+ allowance: string;
22
25
  decimals: number;
26
+ /** 按 decimals 换算后的额度 */
27
+ formatted: string;
28
+ /** 额度 ≥ uint96 最大值时为 true(覆盖 MaxUint256,以及 UNI / COMP 等把额度截断为 uint96 的代币) */
29
+ unlimited: boolean;
30
+ success: boolean;
31
+ }
32
+ /** unlimited 的判定阈值:uint96 最大值 */
33
+ export declare const UNLIMITED_ALLOWANCE_THRESHOLD: bigint;
34
+ declare const MAX_UINT256: bigint;
35
+ export { MAX_UINT256 };
36
+ /** tokens() / getTokens() 可选的字段 */
37
+ export type TokenField = 'name' | 'symbol' | 'decimals' | 'totalSupply';
38
+ /** 不指定 fields 时返回的字段 */
39
+ export declare const DEFAULT_TOKEN_FIELDS: readonly ["name", "symbol", "decimals"];
40
+ export type DefaultTokenField = (typeof DEFAULT_TOKEN_FIELDS)[number];
41
+ interface TokenFieldTypes {
42
+ name: string | null;
43
+ symbol: string | null;
44
+ decimals: number | null;
45
+ /** 最小单位的十进制字符串 */
46
+ totalSupply: string | null;
23
47
  }
24
- /** 常见的主币占位地址:多数聚合器用 0xeeee…eeee,部分协议用零地址 */
48
+ /**
49
+ * tokens() / getTokens() 的单项结果,只包含请求的字段(读取失败的字段为 null)。
50
+ * 请求 totalSupply 时额外带 totalSupplyFormatted(按 decimals 换算)。
51
+ */
52
+ export type TokenDetails<F extends TokenField = DefaultTokenField> = {
53
+ address: string;
54
+ /** 是否是主币占位地址(信息来自内置链信息表 / nativeSymbol 等配置) */
55
+ native: boolean;
56
+ /** 请求的字段都读到时为 true(主币没有 totalSupply,不计入) */
57
+ success: boolean;
58
+ } & {
59
+ [K in F]: TokenFieldTypes[K];
60
+ } & ('totalSupply' extends F ? {
61
+ totalSupplyFormatted: string | null;
62
+ } : unknown);
63
+ /** 主币占位地址(多数聚合器、钱包的约定),传给 balances() 时按主币处理 */
64
+ export declare const NATIVE_TOKEN = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
65
+ /** balances() 默认视为主币的地址:0xeeee…eeee 和零地址 */
25
66
  export declare const DEFAULT_NATIVE_TOKENS: readonly string[];
26
- export {};
67
+ /** balances() 的代币参数:地址,或带已知 decimals 的对象(跳过 decimals 查询) */
68
+ export type BalanceToken = string | {
69
+ address: string;
70
+ decimals?: number;
71
+ };
72
+ export interface TokenBalance {
73
+ /** 传入的代币地址(原样) */
74
+ token: string;
75
+ /** 是否按主币查询 */
76
+ native: boolean;
77
+ /** 原始余额(最小单位)的十进制字符串,如 "1234500000";需要计算时用 BigInt(balance) */
78
+ balance: string;
79
+ decimals: number;
80
+ /** 按 decimals 换算后的十进制字符串,如 "1234.5";整数不带小数点 */
81
+ formatted: string;
82
+ /** 仅在 symbol: true 时返回;读取失败或主币 symbol 未知时为 null */
83
+ symbol?: string | null;
84
+ /** 余额和 decimals 都查到时为 true;失败时 balance、formatted 都为 "0" */
85
+ success: boolean;
86
+ }
87
+ /**
88
+ * 按精度格式化:formatAmount(1234500000n, 6) === '1234.5',formatAmount(10n ** 18n, 18) === '1'。
89
+ * 不做四舍五入,保留全部有效小数位。
90
+ */
91
+ export declare function formatAmount(value: bigint, decimals: number): string;
92
+ interface TokenMeta {
93
+ decimals?: number;
94
+ symbol?: string;
95
+ name?: string;
96
+ /** NFT 集合标准(nftCollections 识别后缓存);null 表示确认不是 ERC721 / ERC1155 */
97
+ standard?: 'ERC721' | 'ERC1155' | null;
98
+ }
99
+ export declare function getCachedTokenMeta(chainId: number, token: string): TokenMeta;
100
+ export declare function setCachedTokenMeta(chainId: number, token: string, meta: TokenMeta): void;
101
+ /** 测试用:清空 decimals / symbol 缓存 */
102
+ export declare function resetDecimalsCache(): void;
27
103
  //# sourceMappingURL=erc20.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"erc20.d.ts","sourceRoot":"","sources":["../src/erc20.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE1D,eAAO,MAAM,SAAS,2hBAUZ,CAAA;AAEV,KAAK,MAAM,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;AAEjH,+CAA+C;AAC/C,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACxB,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC/B,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;IAC1C,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;IAC3D,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,CAAA;IAC7E,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,CAAA;IACzE,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,CAAA;CAC5F;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,4CAA4C;AAC5C,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAGlD,CAAA"}
1
+ {"version":3,"file":"erc20.d.ts","sourceRoot":"","sources":["../src/erc20.ts"],"names":[],"mappings":"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"}
package/dist/erc20.js CHANGED
@@ -9,9 +9,40 @@ export const ERC20_ABI = [
9
9
  'function transfer(address to, uint256 amount) returns (bool)',
10
10
  'function transferFrom(address from, address to, uint256 amount) returns (bool)',
11
11
  ];
12
- /** 常见的主币占位地址:多数聚合器用 0xeeee…eeee,部分协议用零地址 */
13
- export const DEFAULT_NATIVE_TOKENS = [
14
- '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
15
- '0x0000000000000000000000000000000000000000',
16
- ];
12
+ /** unlimited 的判定阈值:uint96 最大值 */
13
+ export const UNLIMITED_ALLOWANCE_THRESHOLD = 2n ** 96n - 1n;
14
+ const MAX_UINT256 = 2n ** 256n - 1n;
15
+ export { MAX_UINT256 };
16
+ /** 不指定 fields 时返回的字段 */
17
+ export const DEFAULT_TOKEN_FIELDS = ['name', 'symbol', 'decimals'];
18
+ /** 主币占位地址(多数聚合器、钱包的约定),传给 balances() 时按主币处理 */
19
+ export const NATIVE_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
20
+ /** balances() 默认视为主币的地址:0xeeee…eeee 和零地址 */
21
+ export const DEFAULT_NATIVE_TOKENS = [NATIVE_TOKEN, '0x0000000000000000000000000000000000000000'];
22
+ /**
23
+ * 按精度格式化:formatAmount(1234500000n, 6) === '1234.5',formatAmount(10n ** 18n, 18) === '1'。
24
+ * 不做四舍五入,保留全部有效小数位。
25
+ */
26
+ export function formatAmount(value, decimals) {
27
+ const negative = value < 0n;
28
+ const digits = (negative ? -value : value).toString().padStart(decimals + 1, '0');
29
+ const whole = digits.slice(0, digits.length - decimals);
30
+ const fraction = digits.slice(digits.length - decimals).replace(/0+$/, '');
31
+ return `${negative ? '-' : ''}${whole}${fraction ? `.${fraction}` : ''}`;
32
+ }
33
+ const tokenMetaCache = new Map();
34
+ export function getCachedTokenMeta(chainId, token) {
35
+ return tokenMetaCache.get(`${chainId}:${token.toLowerCase()}`) ?? {};
36
+ }
37
+ export function setCachedTokenMeta(chainId, token, meta) {
38
+ if (Object.keys(meta).length === 0) {
39
+ return; // 没有新数据(如查询失败)时不写入空条目
40
+ }
41
+ const key = `${chainId}:${token.toLowerCase()}`;
42
+ tokenMetaCache.set(key, { ...tokenMetaCache.get(key), ...meta });
43
+ }
44
+ /** 测试用:清空 decimals / symbol 缓存 */
45
+ export function resetDecimalsCache() {
46
+ tokenMetaCache.clear();
47
+ }
17
48
  //# sourceMappingURL=erc20.js.map
package/dist/erc20.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"erc20.js","sourceRoot":"","sources":["../src/erc20.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,uCAAuC;IACvC,yCAAyC;IACzC,0CAA0C;IAC1C,+CAA+C;IAC/C,0DAA0D;IAC1D,2EAA2E;IAC3E,kEAAkE;IAClE,8DAA8D;IAC9D,gFAAgF;CACxE,CAAA;AAyBV,4CAA4C;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACtD,4CAA4C;IAC5C,4CAA4C;CAC7C,CAAA"}
1
+ {"version":3,"file":"erc20.js","sourceRoot":"","sources":["../src/erc20.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,uCAAuC;IACvC,yCAAyC;IACzC,0CAA0C;IAC1C,+CAA+C;IAC/C,0DAA0D;IAC1D,2EAA2E;IAC3E,kEAAkE;IAClE,8DAA8D;IAC9D,gFAAgF;CACxE,CAAA;AAiCV,iCAAiC;AACjC,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,CAAA;AAE3D,MAAM,WAAW,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAA;AAEnC,OAAO,EAAE,WAAW,EAAE,CAAA;AAKtB,wBAAwB;AACxB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAA0C,CAAA;AAwB3G,+CAA+C;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAA;AAExE,4CAA4C;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAsB,CAAC,YAAY,EAAE,4CAA4C,CAAC,CAAA;AAqBpH;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,QAAgB;IAC1D,MAAM,QAAQ,GAAG,KAAK,GAAG,EAAE,CAAA;IAC3B,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;IACjF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC1E,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AAC1E,CAAC;AAWD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAqB,CAAA;AAEnD,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,KAAa;IAC/D,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,KAAa,EAAE,IAAe;IAChF,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAM,CAAC,sBAAsB;IAC/B,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAA;IAC/C,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;AAClE,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,kBAAkB;IAChC,cAAc,CAAC,KAAK,EAAE,CAAA;AACxB,CAAC"}
@@ -19,5 +19,7 @@ export declare class FallbackRpc implements EthersLikeProvider {
19
19
  get nodes(): readonly EthersLikeProvider[];
20
20
  call(tx: TransactionRequest): Promise<string>;
21
21
  getBalance(address: Parameters<EthersLikeProvider['getBalance']>[0], blockTag?: Parameters<EthersLikeProvider['getBalance']>[1]): Promise<bigint>;
22
+ /** 按节点顺序探测 chainId(节点需实现 getChainId,见 detect.ts) */
23
+ getChainId(): Promise<number>;
22
24
  }
23
25
  //# sourceMappingURL=fallback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,kBAAkB,EAAE,MAAM,QAAQ,CAAA;AAEzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAGxD,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;GAMG;AACH,qBAAa,WAAY,YAAW,kBAAkB;;gBAMxC,KAAK,EAAE,kBAAkB,EAAE,EAAE,OAAO,GAAE,eAAoB;IAUtE,IAAI,KAAK,IAAI,SAAS,kBAAkB,EAAE,CAEzC;IAED,IAAI,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7C,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CA+BlJ"}
1
+ {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,kBAAkB,EAAE,MAAM,QAAQ,CAAA;AAEzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAKxD,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;GAMG;AACH,qBAAa,WAAY,YAAW,kBAAkB;;gBAMxC,KAAK,EAAE,kBAAkB,EAAE,EAAE,OAAO,GAAE,eAAoB;IAUtE,IAAI,KAAK,IAAI,SAAS,kBAAkB,EAAE,CAEzC;IAED,IAAI,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7C,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjJ,oDAAoD;IACpD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;CA+B9B"}
package/dist/fallback.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import { isError } from 'ethers';
2
+ import { detectChainIdOf } from './detect.js';
2
3
  import { isExecutionError } from './errors.js';
4
+ import { withTimeout } from './util.js';
3
5
  /**
4
6
  * 多节点故障切换:按顺序使用节点,出错或超时换下一个;出错的节点在 cooldown 内排到最后。
5
7
  *
@@ -30,6 +32,10 @@ export class FallbackRpc {
30
32
  getBalance(address, blockTag) {
31
33
  return this.#run((node) => node.getBalance(address, blockTag));
32
34
  }
35
+ /** 按节点顺序探测 chainId(节点需实现 getChainId,见 detect.ts) */
36
+ getChainId() {
37
+ return this.#run((node) => detectChainIdOf(node));
38
+ }
33
39
  async #run(fn) {
34
40
  let lastError;
35
41
  for (const index of this.#order()) {
@@ -65,22 +71,4 @@ function isDeterministic(err) {
65
71
  isError(err, 'ACTION_REJECTED') ||
66
72
  isError(err, 'NUMERIC_FAULT'));
67
73
  }
68
- class TimeoutError extends Error {
69
- constructor(ms) {
70
- super(`RPC request timed out after ${ms}ms`);
71
- this.name = 'TimeoutError';
72
- }
73
- }
74
- function withTimeout(promise, ms) {
75
- if (!Number.isFinite(ms) || ms <= 0) {
76
- return promise;
77
- }
78
- let timer;
79
- return Promise.race([
80
- promise,
81
- new Promise((_, reject) => {
82
- timer = setTimeout(() => reject(new TimeoutError(ms)), ms);
83
- }),
84
- ]).finally(() => clearTimeout(timer));
85
- }
86
74
  //# sourceMappingURL=fallback.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fallback.js","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fallback.js","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,14 @@
1
1
  export { Contract, bindCall, type BoundMethod, type ContractAbi, type ContractRunner } from './contract.js';
2
- export { DEFAULT_NATIVE_TOKENS, ERC20_ABI, type Erc20Contract, type TokenInfo } from './erc20.js';
3
- export { Provider, type ProviderConfig, type CallInput, type CallResults, type ProviderSource, type TryCallResults, type StaticCallItem, type StaticCallOverrides, type StaticCallResult, } from './provider.js';
2
+ export { getAllowances, getBalances, getErc1155Balances, getNftBalances, getNftCollections, getNftOwners, getNftTokenUris, getTokens, type GetBalancesOptions, type GetNftCollectionsOptions, type GetNftTokenUrisOptions, type GetTokensOptions, type ShortcutOptions, type ShortcutProviderOptions, } from './shortcuts.js';
3
+ export { DEFAULT_NFT_COLLECTION_FIELDS, ERC1155_ABI, ERC721_ABI, type DefaultNftCollectionField, type Erc1155Balance, type NftBalance, type NftCollection, type NftCollectionField, type NftCollectionsOptions, type NftItem, type NftOwner, type NftStandard, type NftTokenUri, type NftTokenUriOptions, } from './nft.js';
4
+ export { NATIVE_CURRENCIES, getNativeCurrency, type NativeCurrency } from './chains.js';
5
+ export { clearChainIdCache, detectChainId } from './detect.js';
6
+ export { DEFAULT_NATIVE_TOKENS, ERC20_ABI, NATIVE_TOKEN, formatAmount, type BalanceToken, type Erc20Contract, type TokenBalance, type TokenAllowance, MAX_UINT256, UNLIMITED_ALLOWANCE_THRESHOLD, DEFAULT_TOKEN_FIELDS, type DefaultTokenField, type TokenDetails, type TokenField, } from './erc20.js';
7
+ export { Provider, type BalancesOptions, type CallInput, type CallResults, type ProviderConfig, type ProviderSource, type StaticCallItem, type StaticCallOverrides, type StaticCallResult, type TokensOptions, type TryCallResults, } from './provider.js';
4
8
  export { TRON_CHAIN_ID, TronProvider, isTronAddress, toEvmAddress, toTronAddress, type TronProviderOptions, type TronRequest, type TronWebLike, } from './tron.js';
5
9
  export { CallFailedError, decodeRevertReason, isExecutionError } from './errors.js';
6
10
  export { FallbackRpc, type FallbackOptions } from './fallback.js';
7
- export { getDefaultRpcUrls, isTronChain, type SourceOptions } from './source.js';
11
+ export { ChainCheckedProvider, getDefaultRpcUrls, isTronChain, type SourceOptions } from './source.js';
8
12
  export { DEFAULT_RPC_URLS, DEFAULT_TRON_HOSTS } from './rpcNodes.js';
9
13
  export { MULTICALL3_ADDRESS, getMulticall3, type Multicall } from './multicall.js';
10
14
  export type { BlockTag, CallOverrides, EthersLikeProvider } from './aggregate.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAC3G,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AACjG,OAAO,EACL,QAAQ,EACR,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAClF,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACjF,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAC3G,OAAO,EACL,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,6BAA6B,EAC7B,WAAW,EACX,UAAU,EACV,KAAK,yBAAyB,EAC9B,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AACvF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,WAAW,EACX,6BAA6B,EAC7B,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,QAAQ,EACR,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AACtG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAClF,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACjF,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
package/dist/index.js CHANGED
@@ -1,10 +1,14 @@
1
1
  export { Contract, bindCall } from './contract.js';
2
- export { DEFAULT_NATIVE_TOKENS, ERC20_ABI } from './erc20.js';
2
+ export { getAllowances, getBalances, getErc1155Balances, getNftBalances, getNftCollections, getNftOwners, getNftTokenUris, getTokens, } from './shortcuts.js';
3
+ export { DEFAULT_NFT_COLLECTION_FIELDS, ERC1155_ABI, ERC721_ABI, } from './nft.js';
4
+ export { NATIVE_CURRENCIES, getNativeCurrency } from './chains.js';
5
+ export { clearChainIdCache, detectChainId } from './detect.js';
6
+ export { DEFAULT_NATIVE_TOKENS, ERC20_ABI, NATIVE_TOKEN, formatAmount, MAX_UINT256, UNLIMITED_ALLOWANCE_THRESHOLD, DEFAULT_TOKEN_FIELDS, } from './erc20.js';
3
7
  export { Provider, } from './provider.js';
4
8
  export { TRON_CHAIN_ID, TronProvider, isTronAddress, toEvmAddress, toTronAddress, } from './tron.js';
5
9
  export { CallFailedError, decodeRevertReason, isExecutionError } from './errors.js';
6
10
  export { FallbackRpc } from './fallback.js';
7
- export { getDefaultRpcUrls, isTronChain } from './source.js';
11
+ export { ChainCheckedProvider, getDefaultRpcUrls, isTronChain } from './source.js';
8
12
  export { DEFAULT_RPC_URLS, DEFAULT_TRON_HOSTS } from './rpcNodes.js';
9
13
  export { MULTICALL3_ADDRESS, getMulticall3 } from './multicall.js';
10
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAA2D,MAAM,eAAe,CAAA;AAC3G,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAsC,MAAM,YAAY,CAAA;AACjG,OAAO,EACL,QAAQ,GAST,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,GAId,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,WAAW,EAAwB,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAA;AAChF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAA2D,MAAM,eAAe,CAAA;AAC3G,OAAO,EACL,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,SAAS,GAOV,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,6BAA6B,EAC7B,WAAW,EACX,UAAU,GAYX,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAuB,MAAM,aAAa,CAAA;AACvF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,YAAY,EACZ,YAAY,EAKZ,WAAW,EACX,6BAA6B,EAC7B,oBAAoB,GAIrB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,QAAQ,GAWT,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,GAId,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,WAAW,EAAwB,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAA;AACtG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAA"}
package/dist/nft.d.ts ADDED
@@ -0,0 +1,71 @@
1
+ import type { CallOverrides } from './aggregate.js';
2
+ import type { Provider } from './provider.js';
3
+ export declare const ERC721_ABI: readonly ["function name() view returns (string)", "function symbol() view returns (string)", "function totalSupply() view returns (uint256)", "function balanceOf(address owner) view returns (uint256)", "function ownerOf(uint256 tokenId) view returns (address)", "function tokenURI(uint256 tokenId) view returns (string)", "function supportsInterface(bytes4 interfaceId) view returns (bool)"];
4
+ export declare const ERC1155_ABI: readonly ["function balanceOf(address account, uint256 id) view returns (uint256)", "function uri(uint256 id) view returns (string)", "function supportsInterface(bytes4 interfaceId) view returns (bool)"];
5
+ export type NftStandard = 'ERC721' | 'ERC1155';
6
+ /** 某个集合里的一个 NFT */
7
+ export interface NftItem {
8
+ contract: string;
9
+ tokenId: bigint | string | number;
10
+ }
11
+ export interface NftOwner {
12
+ contract: string;
13
+ /** 十进制字符串 */
14
+ tokenId: string;
15
+ /** 持有人地址(Tron 链上为 T 开头的地址);不存在 / 已销毁 / 非 ERC721 时为 null */
16
+ owner: string | null;
17
+ success: boolean;
18
+ }
19
+ export interface NftBalance {
20
+ contract: string;
21
+ /** 持有数量(十进制字符串) */
22
+ balance: string;
23
+ success: boolean;
24
+ }
25
+ export interface Erc1155Balance {
26
+ contract: string;
27
+ tokenId: string;
28
+ balance: string;
29
+ success: boolean;
30
+ }
31
+ export interface NftTokenUri {
32
+ contract: string;
33
+ tokenId: string;
34
+ /** ERC721 tokenURI 或 ERC1155 uri(已替换 {id},配置了 ipfsGateway 时 ipfs:// 已转换);读取失败为 null */
35
+ uri: string | null;
36
+ success: boolean;
37
+ }
38
+ export interface NftTokenUriOptions extends CallOverrides {
39
+ /** 把 ipfs://xxx 转成 `${ipfsGateway}xxx`,如 'https://ipfs.io/ipfs/'。默认不转换 */
40
+ ipfsGateway?: string;
41
+ }
42
+ /** nftCollections() / getNftCollections() 可选的字段 */
43
+ export type NftCollectionField = 'standard' | 'name' | 'symbol' | 'totalSupply';
44
+ export declare const DEFAULT_NFT_COLLECTION_FIELDS: readonly ["standard", "name", "symbol"];
45
+ export type DefaultNftCollectionField = (typeof DEFAULT_NFT_COLLECTION_FIELDS)[number];
46
+ interface NftCollectionFieldTypes {
47
+ /** 通过 ERC165 supportsInterface 识别;都不支持时为 null */
48
+ standard: NftStandard | null;
49
+ name: string | null;
50
+ symbol: string | null;
51
+ /** 十进制字符串;需要合约实现 totalSupply(ERC721Enumerable 等) */
52
+ totalSupply: string | null;
53
+ }
54
+ export type NftCollection<F extends NftCollectionField = DefaultNftCollectionField> = {
55
+ address: string;
56
+ /** 请求的字段都读到时为 true */
57
+ success: boolean;
58
+ } & {
59
+ [K in F]: NftCollectionFieldTypes[K];
60
+ };
61
+ export interface NftCollectionsOptions<F extends NftCollectionField = DefaultNftCollectionField> extends CallOverrides {
62
+ /** 要返回的字段,默认 ['standard', 'name', 'symbol'] */
63
+ fields?: readonly F[];
64
+ }
65
+ export declare function nftOwners(provider: Provider, items: readonly NftItem[], overrides?: CallOverrides): Promise<NftOwner[]>;
66
+ export declare function nftBalances(provider: Provider, owner: string, collections: readonly string[], overrides?: CallOverrides): Promise<NftBalance[]>;
67
+ export declare function erc1155Balances(provider: Provider, owner: string, items: readonly NftItem[], overrides?: CallOverrides): Promise<Erc1155Balance[]>;
68
+ export declare function nftTokenUris(provider: Provider, items: readonly NftItem[], options?: NftTokenUriOptions): Promise<NftTokenUri[]>;
69
+ export declare function nftCollections<F extends NftCollectionField = DefaultNftCollectionField>(provider: Provider, collections: readonly string[], options?: NftCollectionsOptions<F>): Promise<NftCollection<F>[]>;
70
+ export {};
71
+ //# sourceMappingURL=nft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nft.d.ts","sourceRoot":"","sources":["../src/nft.ts"],"names":[],"mappings":"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"}
package/dist/nft.js ADDED
@@ -0,0 +1,194 @@
1
+ import { asStringOrBytes32 } from './call.js';
2
+ import { getCachedTokenMeta, setCachedTokenMeta } from './erc20.js';
3
+ import { isTronChain } from './source.js';
4
+ import { toTronAddress } from './tron.js';
5
+ export const ERC721_ABI = [
6
+ 'function name() view returns (string)',
7
+ 'function symbol() view returns (string)',
8
+ 'function totalSupply() view returns (uint256)',
9
+ 'function balanceOf(address owner) view returns (uint256)',
10
+ 'function ownerOf(uint256 tokenId) view returns (address)',
11
+ 'function tokenURI(uint256 tokenId) view returns (string)',
12
+ 'function supportsInterface(bytes4 interfaceId) view returns (bool)',
13
+ ];
14
+ export const ERC1155_ABI = [
15
+ 'function balanceOf(address account, uint256 id) view returns (uint256)',
16
+ 'function uri(uint256 id) view returns (string)',
17
+ 'function supportsInterface(bytes4 interfaceId) view returns (bool)',
18
+ ];
19
+ /** ERC165 接口 ID */
20
+ const ERC721_INTERFACE_ID = '0x80ac58cd';
21
+ const ERC1155_INTERFACE_ID = '0xd9b67a26';
22
+ export const DEFAULT_NFT_COLLECTION_FIELDS = ['standard', 'name', 'symbol'];
23
+ function tokenIdString(tokenId) {
24
+ return BigInt(tokenId).toString();
25
+ }
26
+ /** 把 tokenId 规范成 BigInt;非法 tokenId 返回 null(对应项失败,不影响整批) */
27
+ function parseTokenId(tokenId) {
28
+ try {
29
+ return BigInt(tokenId);
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ /** ERC1155 uri 规范:{id} 替换为 64 位小写十六进制(不带 0x) */
36
+ function expandUri(uri, tokenId, gateway) {
37
+ const expanded = uri.replace(/\{id\}/g, tokenId.toString(16).padStart(64, '0'));
38
+ if (gateway && expanded.startsWith('ipfs://')) {
39
+ return gateway + expanded.slice('ipfs://'.length).replace(/^ipfs\//, '');
40
+ }
41
+ return expanded;
42
+ }
43
+ export async function nftOwners(provider, items, overrides) {
44
+ // Tron 上返回 T 开头的地址,方便与 tronWeb.defaultAddress.base58 等直接比较
45
+ const tron = isTronChain(await provider.getChainId());
46
+ const ids = items.map((item) => parseTokenId(item.tokenId));
47
+ const calls = items.flatMap((item, i) => (ids[i] === null ? [] : [provider.contract(item.contract, ERC721_ABI).ownerOf(ids[i])]));
48
+ const results = calls.length ? await provider.tryAll(calls, overrides) : [];
49
+ let j = 0;
50
+ return items.map((item, i) => {
51
+ const raw = ids[i] === null ? null : (results[j++] ?? null);
52
+ const owner = raw !== null && tron ? toTronAddress(raw) : raw;
53
+ return { contract: item.contract, tokenId: ids[i] === null ? String(item.tokenId) : tokenIdString(item.tokenId), owner, success: owner !== null };
54
+ });
55
+ }
56
+ export async function nftBalances(provider, owner, collections, overrides) {
57
+ const calls = collections.map((contract) => provider.contract(contract, ERC721_ABI).balanceOf(owner));
58
+ const results = calls.length ? await provider.tryAll(calls, overrides) : [];
59
+ return collections.map((contract, i) => {
60
+ const balance = results[i] ?? null;
61
+ return { contract, balance: balance === null ? '0' : balance.toString(), success: balance !== null };
62
+ });
63
+ }
64
+ export async function erc1155Balances(provider, owner, items, overrides) {
65
+ const ids = items.map((item) => parseTokenId(item.tokenId));
66
+ const calls = items.flatMap((item, i) => ids[i] === null ? [] : [provider.contract(item.contract, ERC1155_ABI).balanceOf(owner, ids[i])]);
67
+ const results = calls.length ? await provider.tryAll(calls, overrides) : [];
68
+ let j = 0;
69
+ return items.map((item, i) => {
70
+ const balance = ids[i] === null ? null : (results[j++] ?? null);
71
+ return {
72
+ contract: item.contract,
73
+ tokenId: ids[i] === null ? String(item.tokenId) : tokenIdString(item.tokenId),
74
+ balance: balance === null ? '0' : balance.toString(),
75
+ success: balance !== null,
76
+ };
77
+ });
78
+ }
79
+ export async function nftTokenUris(provider, items, options = {}) {
80
+ const { ipfsGateway, ...overrides } = options;
81
+ const chainId = await provider.getChainId();
82
+ const ids = items.map((item) => parseTokenId(item.tokenId));
83
+ // 集合标准已知时只发对应的调用;未知时 tokenURI 和 uri 都发,并在同一批里用 ERC165 识别标准(每个集合一次)、缓存下来
84
+ const calls = [];
85
+ const detect = new Map();
86
+ const plan = items.map((item, i) => {
87
+ const id = ids[i];
88
+ if (id === null || id === undefined) {
89
+ return { tokenUri: -1, uri: -1 };
90
+ }
91
+ const standard = getCachedTokenMeta(chainId, item.contract).standard;
92
+ const key = item.contract.toLowerCase();
93
+ if (standard === undefined && !detect.has(key)) {
94
+ const nft = provider.contract(item.contract, ERC721_ABI);
95
+ detect.set(key, {
96
+ erc721: calls.push(nft.supportsInterface(ERC721_INTERFACE_ID)) - 1,
97
+ erc1155: calls.push(nft.supportsInterface(ERC1155_INTERFACE_ID)) - 1,
98
+ });
99
+ }
100
+ const tokenUri = standard === 'ERC1155' ? -1 : calls.push(provider.contract(item.contract, ERC721_ABI).tokenURI(id)) - 1;
101
+ const uri = standard === 'ERC721' ? -1 : calls.push(provider.contract(item.contract, ERC1155_ABI).uri(id)) - 1;
102
+ return { tokenUri, uri };
103
+ });
104
+ const results = calls.length ? await provider.tryAll(calls, overrides) : [];
105
+ const detected = new Map();
106
+ for (const [key, index] of detect) {
107
+ const is721 = results[index.erc721] ?? null;
108
+ const is1155 = results[index.erc1155] ?? null;
109
+ const standard = is721 ? 'ERC721' : is1155 ? 'ERC1155' : null;
110
+ detected.set(key, standard);
111
+ // 两个调用都成功(返回 false)才缓存“不是 NFT”,失败可能只是暂时的
112
+ if (standard !== null || (is721 !== null && is1155 !== null)) {
113
+ setCachedTokenMeta(chainId, key, { standard });
114
+ }
115
+ }
116
+ return items.map((item, i) => {
117
+ const id = ids[i];
118
+ const { tokenUri, uri } = plan[i];
119
+ const fromTokenUri = tokenUri === -1 ? null : (results[tokenUri] ?? null);
120
+ const fromUri = uri === -1 ? null : (results[uri] ?? null);
121
+ // 标准识别出来时以对应的方法为准;否则取成功的那个(空字符串也是有效结果,如尚未设置 baseURI)
122
+ const standard = detected.get(item.contract.toLowerCase());
123
+ const raw = standard === 'ERC1155' ? fromUri : standard === 'ERC721' ? fromTokenUri : (fromTokenUri ?? fromUri);
124
+ return {
125
+ contract: item.contract,
126
+ tokenId: id === null || id === undefined ? String(item.tokenId) : id.toString(),
127
+ uri: raw === null || id === null || id === undefined ? null : expandUri(raw, id, ipfsGateway),
128
+ success: raw !== null,
129
+ };
130
+ });
131
+ }
132
+ export async function nftCollections(provider, collections, options = {}) {
133
+ const { fields = DEFAULT_NFT_COLLECTION_FIELDS, ...overrides } = options;
134
+ const wanted = new Set(fields);
135
+ const chainId = await provider.getChainId();
136
+ const calls = [];
137
+ const plan = collections.map((address) => {
138
+ const meta = getCachedTokenMeta(chainId, address);
139
+ const nft = provider.contract(address, ERC721_ABI);
140
+ const index = {};
141
+ if (wanted.has('standard') && meta.standard === undefined) {
142
+ index.erc721 = calls.push(nft.supportsInterface(ERC721_INTERFACE_ID)) - 1;
143
+ index.erc1155 = calls.push(nft.supportsInterface(ERC1155_INTERFACE_ID)) - 1;
144
+ }
145
+ if (wanted.has('name') && meta.name === undefined) {
146
+ index.name = calls.push(asStringOrBytes32(nft.name())) - 1;
147
+ }
148
+ if (wanted.has('symbol') && meta.symbol === undefined) {
149
+ index.symbol = calls.push(asStringOrBytes32(nft.symbol())) - 1;
150
+ }
151
+ if (wanted.has('totalSupply')) {
152
+ index.totalSupply = calls.push(nft.totalSupply()) - 1;
153
+ }
154
+ return { address, meta, index };
155
+ });
156
+ const results = calls.length ? await provider.tryAll(calls, overrides) : [];
157
+ const read = (i) => (i === undefined ? null : (results[i] ?? null));
158
+ return plan.map(({ address, meta, index }) => {
159
+ let standard = meta.standard;
160
+ if (standard === undefined && index.erc721 !== undefined) {
161
+ const is721 = read(index.erc721);
162
+ const is1155 = read(index.erc1155);
163
+ standard = is721 ? 'ERC721' : is1155 ? 'ERC1155' : null;
164
+ // 两个调用都成功(返回 false)才缓存“不是 NFT”,失败可能只是暂时的
165
+ if (standard !== null || (is721 !== null && is1155 !== null)) {
166
+ setCachedTokenMeta(chainId, address, { standard });
167
+ }
168
+ }
169
+ const name = meta.name ?? read(index.name);
170
+ const symbol = meta.symbol ?? read(index.symbol);
171
+ const totalSupply = read(index.totalSupply);
172
+ setCachedTokenMeta(chainId, address, {
173
+ ...(index.name !== undefined && name !== null ? { name } : {}),
174
+ ...(index.symbol !== undefined && symbol !== null ? { symbol } : {}),
175
+ });
176
+ const values = {
177
+ standard: standard ?? null,
178
+ name,
179
+ symbol,
180
+ totalSupply: totalSupply === null ? null : totalSupply.toString(),
181
+ };
182
+ const out = { address };
183
+ let success = true;
184
+ for (const field of fields) {
185
+ out[field] = values[field];
186
+ if (values[field] === null) {
187
+ success = false;
188
+ }
189
+ }
190
+ out.success = success;
191
+ return out;
192
+ });
193
+ }
194
+ //# sourceMappingURL=nft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nft.js","sourceRoot":"","sources":["../src/nft.ts"],"names":[],"mappings":"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"}