@w3lib/evm-batch-call 0.1.0 → 0.3.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.
- package/CHANGELOG.md +43 -0
- package/README.md +194 -12
- package/dist/aggregate.d.ts +5 -2
- package/dist/aggregate.d.ts.map +1 -1
- package/dist/aggregate.js.map +1 -1
- package/dist/call.d.ts +8 -2
- package/dist/call.d.ts.map +1 -1
- package/dist/call.js +25 -1
- package/dist/call.js.map +1 -1
- package/dist/chains.d.ts +13 -0
- package/dist/chains.d.ts.map +1 -0
- package/dist/chains.js +35 -0
- package/dist/chains.js.map +1 -0
- package/dist/detect.d.ts +23 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +178 -0
- package/dist/detect.js.map +1 -0
- package/dist/erc20.d.ts +83 -7
- package/dist/erc20.d.ts.map +1 -1
- package/dist/erc20.js +36 -5
- package/dist/erc20.js.map +1 -1
- package/dist/fallback.d.ts +25 -0
- package/dist/fallback.d.ts.map +1 -1
- package/dist/fallback.js +123 -21
- package/dist/fallback.js.map +1 -1
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/nft.d.ts +71 -0
- package/dist/nft.d.ts.map +1 -0
- package/dist/nft.js +194 -0
- package/dist/nft.js.map +1 -0
- package/dist/owner.d.ts +136 -0
- package/dist/owner.d.ts.map +1 -0
- package/dist/owner.js +501 -0
- package/dist/owner.js.map +1 -0
- package/dist/provider.d.ts +112 -12
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +343 -48
- package/dist/provider.js.map +1 -1
- package/dist/scan.d.ts +59 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +245 -0
- package/dist/scan.js.map +1 -0
- package/dist/shortcuts.d.ts +113 -0
- package/dist/shortcuts.d.ts.map +1 -0
- package/dist/shortcuts.js +193 -0
- package/dist/shortcuts.js.map +1 -0
- package/dist/source.d.ts +23 -1
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +110 -3
- package/dist/source.js.map +1 -1
- package/dist/tron.d.ts +6 -0
- package/dist/tron.d.ts.map +1 -1
- package/dist/tron.js +16 -1
- package/dist/tron.js.map +1 -1
- package/dist/util.d.ts +6 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +20 -0
- package/dist/util.js.map +1 -0
- package/package.json +3 -2
- package/src/aggregate.ts +5 -2
- package/src/call.ts +32 -3
- package/src/chains.ts +46 -0
- package/src/detect.ts +193 -0
- package/src/erc20.ts +111 -9
- package/src/fallback.ts +127 -23
- package/src/index.ts +90 -4
- package/src/nft.ts +298 -0
- package/src/owner.ts +651 -0
- package/src/provider.ts +458 -54
- package/src/scan.ts +293 -0
- package/src/shortcuts.ts +278 -0
- package/src/source.ts +118 -3
- package/src/tron.ts +21 -2
- package/src/util.ts +20 -0
package/dist/index.js
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
export { Contract, bindCall } from './contract.js';
|
|
2
|
-
export {
|
|
2
|
+
export { getTransferScanState, keyValueScanStorage, memoryScanStorage, transferScan, } from './scan.js';
|
|
3
|
+
export { GetLogsError } from './fallback.js';
|
|
4
|
+
export { ALCHEMY_NETWORKS, COINGECKO_PLATFORMS, DEFILLAMA_CHAINS, alchemy, clearTokenListCache, coingeckoTokenList, combine, defaultTokenSource, defillamaPrices, firstAvailable, metamaskTokenList, nodereal, staticTokens, tokenList, } from './owner.js';
|
|
5
|
+
export { getAllowances, getBalances, getErc1155Balances, getNftBalances, getNftCollections, getNftOwners, getNftTokenUris, getOwnerTokens, getTokens, } from './shortcuts.js';
|
|
6
|
+
export { DEFAULT_NFT_COLLECTION_FIELDS, ERC1155_ABI, ERC721_ABI, } from './nft.js';
|
|
7
|
+
export { NATIVE_CURRENCIES, getNativeCurrency } from './chains.js';
|
|
8
|
+
export { clearChainIdCache, detectChainId } from './detect.js';
|
|
9
|
+
export { DEFAULT_NATIVE_TOKENS, ERC20_ABI, NATIVE_TOKEN, formatAmount, MAX_UINT256, UNLIMITED_ALLOWANCE_THRESHOLD, DEFAULT_TOKEN_FIELDS, } from './erc20.js';
|
|
3
10
|
export { Provider, } from './provider.js';
|
|
4
11
|
export { TRON_CHAIN_ID, TronProvider, isTronAddress, toEvmAddress, toTronAddress, } from './tron.js';
|
|
5
12
|
export { CallFailedError, decodeRevertReason, isExecutionError } from './errors.js';
|
|
6
13
|
export { FallbackRpc } from './fallback.js';
|
|
7
|
-
export { getDefaultRpcUrls, isTronChain } from './source.js';
|
|
14
|
+
export { ChainCheckedProvider, getDefaultRpcUrls, isTronChain } from './source.js';
|
|
8
15
|
export { DEFAULT_RPC_URLS, DEFAULT_TRON_HOSTS } from './rpcNodes.js';
|
|
9
16
|
export { MULTICALL3_ADDRESS, getMulticall3 } from './multicall.js';
|
|
10
17
|
//# 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,
|
|
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,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,GAIb,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,mBAAmB,EACnB,kBAAkB,EAClB,OAAO,EACP,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACZ,SAAS,GAQV,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,SAAS,GAQV,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":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAGnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAI7C,eAAO,MAAM,UAAU,0YAQb,CAAA;AAEV,eAAO,MAAM,WAAW,6MAId,CAAA;AAMV,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE9C,mBAAmB;AACnB,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;CAClC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa;IACb,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,uFAAuF;IACvF,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,mDAAmD;AACnD,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,CAAA;AAE/E,eAAO,MAAM,6BAA6B,yCAAkF,CAAA;AAE5H,MAAM,MAAM,yBAAyB,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtF,UAAU,uBAAuB;IAC/B,iDAAiD;IACjD,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAA;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,oDAAoD;IACpD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,kBAAkB,GAAG,yBAAyB,IAAI;IACpF,OAAO,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,OAAO,EAAE,OAAO,CAAA;CACjB,GAAG;KAAG,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC;CAAE,CAAA;AAE5C,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,kBAAkB,GAAG,yBAAyB,CAAE,SAAQ,aAAa;IACpH,+CAA+C;IAC/C,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,CAAA;CACtB;AAwBD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAY7H;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,SAAS,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC,CAOvB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,SAAS,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC,CAgB3B;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAwD1I;AAED,wBAAsB,cAAc,CAAC,CAAC,SAAS,kBAAkB,GAAG,yBAAyB,EAC3F,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,OAAO,GAAE,qBAAqB,CAAC,CAAC,CAAM,GACrC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAgE7B"}
|
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
|
package/dist/nft.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nft.js","sourceRoot":"","sources":["../src/nft.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAa,MAAM,WAAW,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,uCAAuC;IACvC,yCAAyC;IACzC,+CAA+C;IAC/C,0DAA0D;IAC1D,0DAA0D;IAC1D,0DAA0D;IAC1D,oEAAoE;CAC5D,CAAA;AAEV,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,wEAAwE;IACxE,gDAAgD;IAChD,oEAAoE;CAC5D,CAAA;AAEV,mBAAmB;AACnB,MAAM,mBAAmB,GAAG,YAAY,CAAA;AACxC,MAAM,oBAAoB,GAAG,YAAY,CAAA;AAiDzC,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAkD,CAAA;AAwB5H,SAAS,aAAa,CAAC,OAA2B;IAChD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;AACnC,CAAC;AAED,2DAA2D;AAC3D,SAAS,YAAY,CAAC,OAA2B;IAC/C,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,SAAS,SAAS,CAAC,GAAW,EAAE,OAAe,EAAE,OAAgB;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;IAC/E,IAAI,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,OAAO,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAC1E,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAkB,EAAE,KAAyB,EAAE,SAAyB;IACtG,2DAA2D;IAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;IACrD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAiC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxJ,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAS,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACnF,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAA;QAC3D,MAAM,KAAK,GAAG,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QAC7D,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,KAAK,IAAI,EAAE,CAAA;IACnJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAkB,EAClB,KAAa,EACb,WAA8B,EAC9B,SAAyB;IAEzB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAiC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAC5H,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAS,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACnF,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;QAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,EAAE,CAAA;IACtG,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAkB,EAClB,KAAa,EACb,KAAyB,EACzB,SAAyB;IAEzB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CACtC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAkC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CACvH,CAAA;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAS,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACnF,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAA;QAC/D,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7E,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;YACpD,OAAO,EAAE,OAAO,KAAK,IAAI;SAC1B,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAkB,EAAE,KAAyB,EAAE,UAA8B,EAAE;IAChH,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,CAAA;IAC7C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;IAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAE3D,wEAAwE;IACxE,MAAM,KAAK,GAAW,EAAE,CAAA;IACxB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA+C,CAAA;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAA;QAClC,CAAC;QACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAA;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;QACvC,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAiC,CAAC,CAAA;YAC/E,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACd,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC;gBAClE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC;aACrE,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,QAAQ,GACZ,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAiC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;QAChI,MAAM,GAAG,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAkC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;QACrI,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;IAC1B,CAAC,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAE3E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAA;IACtD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,KAAK,GAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAoB,IAAI,IAAI,CAAA;QAC/D,MAAM,MAAM,GAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAoB,IAAI,IAAI,CAAA;QACjE,MAAM,QAAQ,GAAuB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;QACjF,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QAC3B,yCAAyC;QACzC,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;YAC7D,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACjB,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAsC,CAAA;QACtE,MAAM,YAAY,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,OAAO,CAAC,QAAQ,CAAmB,IAAI,IAAI,CAAC,CAAA;QAC5F,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,OAAO,CAAC,GAAG,CAAmB,IAAI,IAAI,CAAC,CAAA;QAC7E,qDAAqD;QACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;QAC1D,MAAM,GAAG,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,CAAA;QAC/G,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE;YAC/E,GAAG,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,WAAW,CAAC;YAC7F,OAAO,EAAE,GAAG,KAAK,IAAI;SACtB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAkB,EAClB,WAA8B,EAC9B,UAAoC,EAAE;IAEtC,MAAM,EAAE,MAAM,GAAG,6BAAwD,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,CAAA;IACnG,MAAM,MAAM,GAAG,IAAI,GAAG,CAAqB,MAAM,CAAC,CAAA;IAClD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;IAE3C,MAAM,KAAK,GAAW,EAAE,CAAA;IACxB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAiC,CAAC,CAAA;QACzE,MAAM,KAAK,GAAsF,EAAE,CAAA;QACnG,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC1D,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAA;YACzE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAA;QAC7E,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAClD,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;QAC5D,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACtD,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;QAChE,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAA;QACvD,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACjC,CAAC,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3E,MAAM,IAAI,GAAG,CAAI,CAAqB,EAAY,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,OAAO,CAAC,CAAC,CAAc,IAAI,IAAI,CAAC,CAAC,CAAA;IAElH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3C,IAAI,QAAQ,GAAmC,IAAI,CAAC,QAAQ,CAAA;QAC5D,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzD,MAAM,KAAK,GAAG,IAAI,CAAU,KAAK,CAAC,MAAM,CAAC,CAAA;YACzC,MAAM,MAAM,GAAG,IAAI,CAAU,KAAK,CAAC,OAAO,CAAC,CAAA;YAC3C,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;YACvD,yCAAyC;YACzC,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC7D,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAS,KAAK,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAS,KAAK,CAAC,MAAM,CAAC,CAAA;QACxD,MAAM,WAAW,GAAG,IAAI,CAAS,KAAK,CAAC,WAAW,CAAC,CAAA;QACnD,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE;YACnC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC,CAAA;QAEF,MAAM,MAAM,GAAwC;YAClD,QAAQ,EAAE,QAAQ,IAAI,IAAI;YAC1B,IAAI;YACJ,MAAM;YACN,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE;SAClE,CAAA;QACD,MAAM,GAAG,GAA4B,EAAE,OAAO,EAAE,CAAA;QAChD,IAAI,OAAO,GAAG,IAAI,CAAA;QAClB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAC1B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC3B,OAAO,GAAG,KAAK,CAAA;YACjB,CAAC;QACH,CAAC;QACD,GAAG,CAAC,OAAO,GAAG,OAAO,CAAA;QACrB,OAAO,GAAuB,CAAA;IAChC,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/owner.d.ts
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { CallOverrides } from './aggregate.js';
|
|
2
|
+
import type { Provider } from './provider.js';
|
|
3
|
+
import { type TransferScanOptions } from './scan.js';
|
|
4
|
+
export interface DiscoveredToken {
|
|
5
|
+
address: string;
|
|
6
|
+
symbol?: string | null;
|
|
7
|
+
name?: string | null;
|
|
8
|
+
decimals?: number | null;
|
|
9
|
+
logo?: string | null;
|
|
10
|
+
}
|
|
11
|
+
export interface TokenSourceContext {
|
|
12
|
+
chainId: number;
|
|
13
|
+
owner: string;
|
|
14
|
+
fetch: typeof fetch;
|
|
15
|
+
/** 查询用的 Provider(扫描链上事件的来源会用到,如 transferScan) */
|
|
16
|
+
provider?: Provider;
|
|
17
|
+
}
|
|
18
|
+
export interface TokenSource {
|
|
19
|
+
/** 名称,出现在结果的 source 字段 */
|
|
20
|
+
readonly name: string;
|
|
21
|
+
/** 返回候选代币;不支持这条链时返回 null(firstAvailable 会接着试下一个来源) */
|
|
22
|
+
discover(ctx: TokenSourceContext): Promise<DiscoveredToken[] | null>;
|
|
23
|
+
}
|
|
24
|
+
export declare class HttpStatusError extends Error {
|
|
25
|
+
readonly status: number;
|
|
26
|
+
constructor(status: number, target: string);
|
|
27
|
+
}
|
|
28
|
+
/** 清空代币列表缓存 */
|
|
29
|
+
export declare function clearTokenListCache(): void;
|
|
30
|
+
/**
|
|
31
|
+
* MetaMask 钱包用来自动发现代币的列表(汇总多家来源,Ethereum 约 9500 个、BSC 约 2 万个)。
|
|
32
|
+
* minOccurrences:至少被几家来源收录(MetaMask 自己用 3),用来过滤垃圾币。
|
|
33
|
+
*
|
|
34
|
+
* 注意:这是 MetaMask 自己在用的接口,并非对外承诺的公开 API,可能随时限流或变更,建议与其他来源组合使用。
|
|
35
|
+
*/
|
|
36
|
+
export declare function metamaskTokenList(options?: {
|
|
37
|
+
minOccurrences?: number;
|
|
38
|
+
}): TokenSource;
|
|
39
|
+
/** CoinGecko 按链维护的代币列表:chainId → 平台 id(2026-10 实测可用) */
|
|
40
|
+
export declare const COINGECKO_PLATFORMS: Readonly<Record<number, string>>;
|
|
41
|
+
/** CoinGecko 代币列表(CoinGecko 收录的代币,Ethereum 约 6000 个、BSC 约 4500 个) */
|
|
42
|
+
export declare function coingeckoTokenList(): TokenSource;
|
|
43
|
+
/** 任意 Uniswap Token List 格式的列表(如 https://tokens.uniswap.org、PancakeSwap 列表、自己维护的列表) */
|
|
44
|
+
export declare function tokenList(url: string, options?: {
|
|
45
|
+
name?: string;
|
|
46
|
+
}): TokenSource;
|
|
47
|
+
/** 固定的代币列表(如之前发现过、存下来的代币) */
|
|
48
|
+
export declare function staticTokens(tokens: ReadonlyArray<string | DiscoveredToken>, options?: {
|
|
49
|
+
name?: string;
|
|
50
|
+
}): TokenSource;
|
|
51
|
+
/** Alchemy 各链的子域名(2026-10 实测存在) */
|
|
52
|
+
export declare const ALCHEMY_NETWORKS: Readonly<Record<number, string>>;
|
|
53
|
+
export interface IndexerSourceOptions {
|
|
54
|
+
/** API Key(必填;库里没有内置 Key) */
|
|
55
|
+
apiKey: string;
|
|
56
|
+
/** 按链覆盖请求地址(如代理或表里没有的链):{ [chainId]: url };其他链仍用默认地址 */
|
|
57
|
+
urls?: Readonly<Record<number, string>>;
|
|
58
|
+
/** 最多翻几页(每页 100 个代币),默认 20 */
|
|
59
|
+
maxPages?: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Alchemy `alchemy_getTokenBalances`:查到地址的全部历史持仓(不限于公开列表)。需要 Alchemy 的 API Key(有免费额度)。
|
|
63
|
+
*/
|
|
64
|
+
export declare function alchemy(options: IndexerSourceOptions): TokenSource;
|
|
65
|
+
/**
|
|
66
|
+
* NodeReal `nr_getTokenHoldings`:查到地址的全部历史持仓(仅 BSC、Ethereum)。需要 NodeReal 的 API Key(有免费额度)。
|
|
67
|
+
*/
|
|
68
|
+
export declare function nodereal(options: IndexerSourceOptions): TokenSource;
|
|
69
|
+
/** 按顺序尝试:前一个不支持这条链(返回 null)或出错时用下一个;全部出错时抛出最后一个错误 */
|
|
70
|
+
export declare function firstAvailable(...sources: TokenSource[]): TokenSource;
|
|
71
|
+
/**
|
|
72
|
+
* 合并多个来源(去重,先出现的元数据优先),如“公开列表 + 自己存下来的代币”。
|
|
73
|
+
* 单个来源出错不影响其他来源;全部出错时抛出第一个错误。
|
|
74
|
+
*/
|
|
75
|
+
export declare function combine(...sources: TokenSource[]): TokenSource;
|
|
76
|
+
/** 默认来源:MetaMask 列表(至少 3 家收录),不支持或不可用时用 CoinGecko 列表。都免费、不需要 Key */
|
|
77
|
+
export declare function defaultTokenSource(): TokenSource;
|
|
78
|
+
export interface PriceSourceContext {
|
|
79
|
+
chainId: number;
|
|
80
|
+
/** 代币地址(不含主币) */
|
|
81
|
+
tokens: readonly string[];
|
|
82
|
+
/** 主币 symbol(需要主币价格时);不需要时为 null */
|
|
83
|
+
nativeSymbol: string | null;
|
|
84
|
+
fetch: typeof fetch;
|
|
85
|
+
}
|
|
86
|
+
export interface PriceSource {
|
|
87
|
+
readonly name: string;
|
|
88
|
+
/** 返回 去重键(0x 地址小写)→ 美元价格;主币用键 'native'。没有价格的不返回 */
|
|
89
|
+
prices(ctx: PriceSourceContext): Promise<Map<string, number>>;
|
|
90
|
+
}
|
|
91
|
+
/** DefiLlama 的链标识:chainId → slug(2026-10 实测可用) */
|
|
92
|
+
export declare const DEFILLAMA_CHAINS: Readonly<Record<number, string>>;
|
|
93
|
+
/**
|
|
94
|
+
* DefiLlama 价格(免费、不需要 Key)。minConfidence:DefiLlama 给出的置信度下限(0~1),低于它视为没有价格,默认 0.9。
|
|
95
|
+
* 注意:流动性很差的代币价格可能虚高,展示总资产时建议配合 minUsd 或自己的价格源。
|
|
96
|
+
*/
|
|
97
|
+
export declare function defillamaPrices(options?: {
|
|
98
|
+
minConfidence?: number;
|
|
99
|
+
}): PriceSource;
|
|
100
|
+
export interface OwnerTokensOptions extends CallOverrides {
|
|
101
|
+
/** 代币来源,默认 defaultTokenSource()(MetaMask 列表 → CoinGecko 列表,免费免 Key) */
|
|
102
|
+
source?: TokenSource;
|
|
103
|
+
/** 查美元价格:true 用 DefiLlama,也可以传自己的 PriceSource。传了 minUsd 而没设置 prices 时自动用 DefiLlama */
|
|
104
|
+
prices?: boolean | PriceSource;
|
|
105
|
+
/** 只保留价值 ≥ minUsd 的代币(没有价格的代币也会被去掉;主币不受影响)。与 prices: false 同时使用会报错 */
|
|
106
|
+
minUsd?: number;
|
|
107
|
+
/** 第一项返回主币(用 Provider 的 nativeTokens 配置里的第一个地址查,默认 0xeeee…eeee;配置成 [] 时不返回)。默认 true */
|
|
108
|
+
includeNative?: boolean;
|
|
109
|
+
/** 自定义 fetch(代理等场景);默认全局 fetch */
|
|
110
|
+
fetch?: typeof fetch;
|
|
111
|
+
/**
|
|
112
|
+
* 增量扫描开关(默认关闭):开启后,额外合并“从第一次调用开始,该地址收到过的 ERC20 代币”(扫描 Transfer 事件),
|
|
113
|
+
* 用来补充代币列表里没有的新代币。传对象可以配置进度存储、回扫区块数等,见 TransferScanOptions
|
|
114
|
+
*/
|
|
115
|
+
scanTransfers?: boolean | TransferScanOptions;
|
|
116
|
+
}
|
|
117
|
+
export interface OwnedToken {
|
|
118
|
+
token: string;
|
|
119
|
+
native: boolean;
|
|
120
|
+
/** 余额(最小单位的十进制字符串),由 multicall 在链上核对 */
|
|
121
|
+
balance: string;
|
|
122
|
+
/** 精度,由 multicall 在链上核对(不使用来源给的值) */
|
|
123
|
+
decimals: number;
|
|
124
|
+
formatted: string;
|
|
125
|
+
symbol: string | null;
|
|
126
|
+
name: string | null;
|
|
127
|
+
logo: string | null;
|
|
128
|
+
/** 美元单价;未开启价格或没有价格时为 null */
|
|
129
|
+
price: number | null;
|
|
130
|
+
/** 美元价值(formatted × price) */
|
|
131
|
+
value: number | null;
|
|
132
|
+
/** 发现这个代币的来源(如 metamask / coingecko / alchemy);主币为 'native' */
|
|
133
|
+
source: string;
|
|
134
|
+
}
|
|
135
|
+
export declare function ownerTokens(provider: Provider, owner: string, options?: OwnerTokensOptions): Promise<OwnedToken[]>;
|
|
136
|
+
//# sourceMappingURL=owner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../src/owner.ts"],"names":[],"mappings":"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"}
|