@metamask-previews/assets-controller 0.0.0-preview-903db2da → 0.0.0-preview-3ec2a74
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 +10 -0
- package/dist/AssetsController.cjs +1028 -61
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +229 -83
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +229 -83
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +1024 -59
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AbstractDataSource.cjs +103 -0
- package/dist/data-sources/AbstractDataSource.cjs.map +1 -0
- package/dist/data-sources/AbstractDataSource.d.cts +92 -0
- package/dist/data-sources/AbstractDataSource.d.cts.map +1 -0
- package/dist/data-sources/AbstractDataSource.d.mts +92 -0
- package/dist/data-sources/AbstractDataSource.d.mts.map +1 -0
- package/dist/data-sources/AbstractDataSource.mjs +99 -0
- package/dist/data-sources/AbstractDataSource.mjs.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.cjs +421 -0
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.d.cts +103 -0
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.d.mts +103 -0
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.mjs +416 -0
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -0
- package/dist/data-sources/BackendWebsocketDataSource.cjs +388 -0
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.cts +95 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.mts +95 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -0
- package/dist/data-sources/BackendWebsocketDataSource.mjs +383 -0
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -0
- package/dist/data-sources/PriceDataSource.cjs +350 -0
- package/dist/data-sources/PriceDataSource.cjs.map +1 -0
- package/dist/data-sources/PriceDataSource.d.cts +153 -0
- package/dist/data-sources/PriceDataSource.d.cts.map +1 -0
- package/dist/data-sources/PriceDataSource.d.mts +153 -0
- package/dist/data-sources/PriceDataSource.d.mts.map +1 -0
- package/dist/data-sources/PriceDataSource.mjs +346 -0
- package/dist/data-sources/PriceDataSource.mjs.map +1 -0
- package/dist/data-sources/RpcDataSource.cjs +410 -0
- package/dist/data-sources/RpcDataSource.cjs.map +1 -0
- package/dist/data-sources/RpcDataSource.d.cts +154 -0
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -0
- package/dist/data-sources/RpcDataSource.d.mts +154 -0
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -0
- package/dist/data-sources/RpcDataSource.mjs +405 -0
- package/dist/data-sources/RpcDataSource.mjs.map +1 -0
- package/dist/data-sources/SnapDataSource.cjs +734 -0
- package/dist/data-sources/SnapDataSource.cjs.map +1 -0
- package/dist/data-sources/SnapDataSource.d.cts +217 -0
- package/dist/data-sources/SnapDataSource.d.cts.map +1 -0
- package/dist/data-sources/SnapDataSource.d.mts +217 -0
- package/dist/data-sources/SnapDataSource.d.mts.map +1 -0
- package/dist/data-sources/SnapDataSource.mjs +723 -0
- package/dist/data-sources/SnapDataSource.mjs.map +1 -0
- package/dist/data-sources/TokenDataSource.cjs +179 -0
- package/dist/data-sources/TokenDataSource.cjs.map +1 -0
- package/dist/data-sources/TokenDataSource.d.cts +62 -0
- package/dist/data-sources/TokenDataSource.d.cts.map +1 -0
- package/dist/data-sources/TokenDataSource.d.mts +62 -0
- package/dist/data-sources/TokenDataSource.d.mts.map +1 -0
- package/dist/data-sources/TokenDataSource.mjs +175 -0
- package/dist/data-sources/TokenDataSource.mjs.map +1 -0
- package/dist/data-sources/index.cjs +62 -0
- package/dist/data-sources/index.cjs.map +1 -0
- package/dist/data-sources/index.d.cts +9 -0
- package/dist/data-sources/index.d.cts.map +1 -0
- package/dist/data-sources/index.d.mts +9 -0
- package/dist/data-sources/index.d.mts.map +1 -0
- package/dist/data-sources/index.mjs +23 -0
- package/dist/data-sources/index.mjs.map +1 -0
- package/dist/data-sources/initDataSources.cjs +199 -0
- package/dist/data-sources/initDataSources.cjs.map +1 -0
- package/dist/data-sources/initDataSources.d.cts +123 -0
- package/dist/data-sources/initDataSources.d.cts.map +1 -0
- package/dist/data-sources/initDataSources.d.mts +123 -0
- package/dist/data-sources/initDataSources.d.mts.map +1 -0
- package/dist/data-sources/initDataSources.mjs +194 -0
- package/dist/data-sources/initDataSources.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.cjs +638 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.cts +47 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.mts +47 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.mjs +632 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/index.cjs +8 -0
- package/dist/data-sources/rpc-datasource/clients/index.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/index.d.cts +3 -0
- package/dist/data-sources/rpc-datasource/clients/index.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/index.d.mts +3 -0
- package/dist/data-sources/rpc-datasource/clients/index.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/index.mjs +2 -0
- package/dist/data-sources/rpc-datasource/clients/index.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/index.cjs +9 -0
- package/dist/data-sources/rpc-datasource/index.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/index.d.cts +4 -0
- package/dist/data-sources/rpc-datasource/index.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/index.d.mts +4 -0
- package/dist/data-sources/rpc-datasource/index.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/index.mjs +3 -0
- package/dist/data-sources/rpc-datasource/index.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.cjs +167 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts +16 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts +16 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.mjs +163 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.cjs +173 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts +14 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts +14 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.mjs +169 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/index.cjs +8 -0
- package/dist/data-sources/rpc-datasource/services/index.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/index.d.cts +3 -0
- package/dist/data-sources/rpc-datasource/services/index.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/index.d.mts +3 -0
- package/dist/data-sources/rpc-datasource/services/index.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/index.mjs +3 -0
- package/dist/data-sources/rpc-datasource/services/index.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/assets.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/assets.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/assets.d.cts +53 -0
- package/dist/data-sources/rpc-datasource/types/assets.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/assets.d.mts +53 -0
- package/dist/data-sources/rpc-datasource/types/assets.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/assets.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/assets.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/config.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/config.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/config.d.cts +18 -0
- package/dist/data-sources/rpc-datasource/types/config.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/config.d.mts +18 -0
- package/dist/data-sources/rpc-datasource/types/config.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/config.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/config.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/core.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/core.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/core.d.cts +19 -0
- package/dist/data-sources/rpc-datasource/types/core.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/core.d.mts +19 -0
- package/dist/data-sources/rpc-datasource/types/core.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/core.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/core.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/index.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/index.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/index.d.cts +7 -0
- package/dist/data-sources/rpc-datasource/types/index.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/index.d.mts +7 -0
- package/dist/data-sources/rpc-datasource/types/index.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/index.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/index.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/multicall.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/multicall.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/multicall.d.cts +24 -0
- package/dist/data-sources/rpc-datasource/types/multicall.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/multicall.d.mts +24 -0
- package/dist/data-sources/rpc-datasource/types/multicall.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/multicall.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/multicall.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/services.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/services.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/services.d.cts +74 -0
- package/dist/data-sources/rpc-datasource/types/services.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/services.d.mts +74 -0
- package/dist/data-sources/rpc-datasource/types/services.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/services.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/services.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/state.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/state.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/state.d.cts +67 -0
- package/dist/data-sources/rpc-datasource/types/state.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/state.d.mts +67 -0
- package/dist/data-sources/rpc-datasource/types/state.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/state.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/state.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/batch.cjs +45 -0
- package/dist/data-sources/rpc-datasource/utils/batch.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/batch.d.cts +28 -0
- package/dist/data-sources/rpc-datasource/utils/batch.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/batch.d.mts +28 -0
- package/dist/data-sources/rpc-datasource/utils/batch.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/batch.mjs +40 -0
- package/dist/data-sources/rpc-datasource/utils/batch.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/index.cjs +7 -0
- package/dist/data-sources/rpc-datasource/utils/index.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/index.d.cts +2 -0
- package/dist/data-sources/rpc-datasource/utils/index.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/index.d.mts +2 -0
- package/dist/data-sources/rpc-datasource/utils/index.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/index.mjs +2 -0
- package/dist/data-sources/rpc-datasource/utils/index.mjs.map +1 -0
- package/dist/index.cjs +70 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +19 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +31 -0
- package/dist/index.mjs.map +1 -1
- package/dist/logger.cjs +7 -0
- package/dist/logger.cjs.map +1 -0
- package/dist/logger.d.cts +5 -0
- package/dist/logger.d.cts.map +1 -0
- package/dist/logger.d.mts +5 -0
- package/dist/logger.d.mts.map +1 -0
- package/dist/logger.mjs +4 -0
- package/dist/logger.mjs.map +1 -0
- package/dist/middlewares/DetectionMiddleware.cjs +101 -0
- package/dist/middlewares/DetectionMiddleware.cjs.map +1 -0
- package/dist/middlewares/DetectionMiddleware.d.cts +54 -0
- package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -0
- package/dist/middlewares/DetectionMiddleware.d.mts +54 -0
- package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -0
- package/dist/middlewares/DetectionMiddleware.mjs +97 -0
- package/dist/middlewares/DetectionMiddleware.mjs.map +1 -0
- package/dist/middlewares/index.cjs +6 -0
- package/dist/middlewares/index.cjs.map +1 -0
- package/dist/middlewares/index.d.cts +2 -0
- package/dist/middlewares/index.d.cts.map +1 -0
- package/dist/middlewares/index.d.mts +2 -0
- package/dist/middlewares/index.d.mts.map +1 -0
- package/dist/middlewares/index.mjs +2 -0
- package/dist/middlewares/index.mjs.map +1 -0
- package/dist/types.cjs +39 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +360 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +360 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +35 -0
- package/dist/types.mjs.map +1 -0
- package/dist/utils.cjs +28 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +13 -0
- package/dist/utils.d.cts.map +1 -0
- package/dist/utils.d.mts +13 -0
- package/dist/utils.d.mts.map +1 -0
- package/dist/utils.mjs +24 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +15 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalanceFetcher.mjs","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/BalanceFetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\nimport type { MulticallClient } from '../clients';\nimport type {\n AccountId,\n Address,\n AssetBalance,\n BalanceFetchOptions,\n BalanceFetchResult,\n BalanceOfRequest,\n BalanceOfResponse,\n ChainId,\n TokenFetchInfo,\n UserToken,\n UserTokensState,\n} from '../types';\nimport { reduceInBatchesSerially } from '../utils';\n\nconst ZERO_ADDRESS: Address =\n '0x0000000000000000000000000000000000000000' as Address;\n\nexport type BalanceFetcherConfig = {\n defaultBatchSize?: number;\n defaultTimeoutMs?: number;\n includeNativeByDefault?: boolean;\n};\n\nexport class BalanceFetcher {\n readonly #multicallClient: MulticallClient;\n\n readonly #config: Required<BalanceFetcherConfig>;\n\n #getUserTokensState: (() => UserTokensState) | undefined;\n\n constructor(multicallClient: MulticallClient, config?: BalanceFetcherConfig) {\n this.#multicallClient = multicallClient;\n this.#config = {\n defaultBatchSize: config?.defaultBatchSize ?? 300,\n defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,\n includeNativeByDefault: config?.includeNativeByDefault ?? true,\n };\n }\n\n setUserTokensStateGetter(getUserTokensState: () => UserTokensState): void {\n this.#getUserTokensState = getUserTokensState;\n }\n\n getTokensToFetch(\n chainId: ChainId,\n accountAddress: Address,\n ): TokenFetchInfo[] {\n const userTokensState = this.#getUserTokensState?.();\n\n if (!userTokensState) {\n return [];\n }\n\n const tokenMap = new Map<string, TokenFetchInfo>();\n\n const addToken = (token: UserToken): void => {\n const lowerAddress = token.address.toLowerCase();\n if (!tokenMap.has(lowerAddress)) {\n tokenMap.set(lowerAddress, {\n address: token.address,\n decimals: token.decimals,\n symbol: token.symbol,\n });\n }\n };\n\n const importedTokens =\n userTokensState.allTokens[chainId]?.[accountAddress] ?? [];\n for (const token of importedTokens) {\n addToken(token);\n }\n\n const detectedTokens =\n userTokensState.allDetectedTokens[chainId]?.[accountAddress] ?? [];\n for (const token of detectedTokens) {\n addToken(token);\n }\n\n return Array.from(tokenMap.values());\n }\n\n async fetchBalances(\n chainId: ChainId,\n accountId: AccountId,\n accountAddress: Address,\n options?: BalanceFetchOptions,\n ): Promise<BalanceFetchResult> {\n const tokens = this.getTokensToFetch(chainId, accountAddress);\n const tokenAddresses = tokens.map((token) => token.address);\n\n return this.fetchBalancesForTokens(\n chainId,\n accountId,\n accountAddress,\n tokenAddresses,\n options,\n tokens,\n );\n }\n\n async fetchBalancesForTokens(\n chainId: ChainId,\n accountId: AccountId,\n accountAddress: Address,\n tokenAddresses: Address[],\n options?: BalanceFetchOptions,\n tokenInfos?: TokenFetchInfo[],\n ): Promise<BalanceFetchResult> {\n const batchSize = options?.batchSize ?? this.#config.defaultBatchSize;\n const includeNative =\n options?.includeNative ?? this.#config.includeNativeByDefault;\n const timestamp = Date.now();\n\n const tokenInfoMap = new Map<string, TokenFetchInfo>();\n if (tokenInfos) {\n for (const info of tokenInfos) {\n tokenInfoMap.set(info.address.toLowerCase(), info);\n }\n }\n\n const balanceRequests: BalanceOfRequest[] = [];\n\n if (includeNative) {\n balanceRequests.push({\n tokenAddress: ZERO_ADDRESS,\n accountAddress,\n });\n }\n\n for (const tokenAddress of tokenAddresses) {\n balanceRequests.push({\n tokenAddress,\n accountAddress,\n });\n }\n\n if (balanceRequests.length === 0) {\n return {\n chainId,\n accountId,\n accountAddress,\n balances: [],\n failedAddresses: [],\n timestamp,\n };\n }\n\n type FetchAccumulator = {\n balances: AssetBalance[];\n failedAddresses: Address[];\n };\n\n const result = await reduceInBatchesSerially<\n BalanceOfRequest,\n FetchAccumulator\n >({\n values: balanceRequests,\n batchSize,\n initialResult: {\n balances: [],\n failedAddresses: [],\n },\n eachBatch: async (workingResult, batch) => {\n const responses = await this.#multicallClient.batchBalanceOf(\n chainId,\n batch,\n );\n\n return this.#processBalanceResponses(\n responses,\n workingResult as FetchAccumulator,\n chainId,\n accountId,\n timestamp,\n tokenInfoMap,\n );\n },\n });\n\n return {\n chainId,\n accountId,\n accountAddress,\n ...result,\n timestamp,\n };\n }\n\n #processBalanceResponses(\n responses: BalanceOfResponse[],\n accumulator: {\n balances: AssetBalance[];\n failedAddresses: Address[];\n },\n chainId: ChainId,\n accountId: AccountId,\n timestamp: number,\n tokenInfoMap: Map<string, TokenFetchInfo>,\n ): {\n balances: AssetBalance[];\n failedAddresses: Address[];\n } {\n const { balances, failedAddresses } = accumulator;\n\n for (const response of responses) {\n if (!response.success) {\n failedAddresses.push(response.tokenAddress);\n continue;\n }\n\n const balance = response.balance ?? '0';\n const tokenInfo = tokenInfoMap.get(response.tokenAddress.toLowerCase());\n const decimals = tokenInfo?.decimals ?? 18;\n const formattedBalance = this.#formatBalance(balance, decimals);\n\n const chainIdDecimal = parseInt(chainId, 16);\n const isNative =\n response.tokenAddress.toLowerCase() === ZERO_ADDRESS.toLowerCase();\n const assetId: CaipAssetType = isNative\n ? (`eip155:${chainIdDecimal}/slip44:60` as CaipAssetType)\n : (`eip155:${chainIdDecimal}/erc20:${response.tokenAddress.toLowerCase()}` as CaipAssetType);\n\n balances.push({\n assetId,\n accountId,\n chainId,\n balance,\n formattedBalance,\n decimals,\n timestamp,\n });\n }\n\n return { balances, failedAddresses };\n }\n\n #formatBalance(rawBalance: string, decimals: number): string {\n if (rawBalance === '0') {\n return '0';\n }\n\n try {\n const balanceBigInt = BigInt(rawBalance);\n const divisor = BigInt(10 ** decimals);\n\n const integerPart = balanceBigInt / divisor;\n const remainder = balanceBigInt % divisor;\n const fractionalStr = remainder.toString().padStart(decimals, '0');\n const trimmedFractional = fractionalStr.replace(/0+$/u, '');\n\n if (trimmedFractional === '') {\n return integerPart.toString();\n }\n\n return `${integerPart}.${trimmedFractional}`;\n } catch {\n return rawBalance;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _TokenDetector_instances, _TokenDetector_multicallClient, _TokenDetector_config, _TokenDetector_getTokenListState, _TokenDetector_processBalanceResponses, _TokenDetector_formatBalance, _TokenDetector_getTokenMetadata, _TokenDetector_createAsset;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.TokenDetector = void 0;
|
|
16
|
+
const utils_1 = require("../utils/index.cjs");
|
|
17
|
+
class TokenDetector {
|
|
18
|
+
constructor(multicallClient, config) {
|
|
19
|
+
_TokenDetector_instances.add(this);
|
|
20
|
+
_TokenDetector_multicallClient.set(this, void 0);
|
|
21
|
+
_TokenDetector_config.set(this, void 0);
|
|
22
|
+
_TokenDetector_getTokenListState.set(this, void 0);
|
|
23
|
+
__classPrivateFieldSet(this, _TokenDetector_multicallClient, multicallClient, "f");
|
|
24
|
+
__classPrivateFieldSet(this, _TokenDetector_config, {
|
|
25
|
+
defaultBatchSize: config?.defaultBatchSize ?? 300,
|
|
26
|
+
defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,
|
|
27
|
+
}, "f");
|
|
28
|
+
}
|
|
29
|
+
setTokenListStateGetter(getTokenListState) {
|
|
30
|
+
__classPrivateFieldSet(this, _TokenDetector_getTokenListState, getTokenListState, "f");
|
|
31
|
+
}
|
|
32
|
+
getTokensToCheck(chainId) {
|
|
33
|
+
const tokenListState = __classPrivateFieldGet(this, _TokenDetector_getTokenListState, "f")?.call(this);
|
|
34
|
+
if (!tokenListState) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const chainCacheEntry = tokenListState.tokensChainsCache[chainId];
|
|
38
|
+
const chainTokenList = chainCacheEntry?.data;
|
|
39
|
+
if (!chainTokenList) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
return Object.keys(chainTokenList);
|
|
43
|
+
}
|
|
44
|
+
async detectTokens(chainId, accountId, accountAddress, options) {
|
|
45
|
+
const batchSize = options?.batchSize ?? __classPrivateFieldGet(this, _TokenDetector_config, "f").defaultBatchSize;
|
|
46
|
+
const timestamp = Date.now();
|
|
47
|
+
const tokensToCheck = this.getTokensToCheck(chainId);
|
|
48
|
+
if (tokensToCheck.length === 0) {
|
|
49
|
+
return {
|
|
50
|
+
chainId,
|
|
51
|
+
accountId,
|
|
52
|
+
accountAddress,
|
|
53
|
+
detectedAssets: [],
|
|
54
|
+
detectedBalances: [],
|
|
55
|
+
zeroBalanceAddresses: [],
|
|
56
|
+
failedAddresses: [],
|
|
57
|
+
timestamp,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const balanceRequests = tokensToCheck.map((tokenAddress) => ({
|
|
61
|
+
tokenAddress,
|
|
62
|
+
accountAddress,
|
|
63
|
+
}));
|
|
64
|
+
const result = await (0, utils_1.reduceInBatchesSerially)({
|
|
65
|
+
values: balanceRequests,
|
|
66
|
+
batchSize,
|
|
67
|
+
initialResult: {
|
|
68
|
+
detectedAssets: [],
|
|
69
|
+
detectedBalances: [],
|
|
70
|
+
zeroBalanceAddresses: [],
|
|
71
|
+
failedAddresses: [],
|
|
72
|
+
},
|
|
73
|
+
eachBatch: async (workingResult, batch) => {
|
|
74
|
+
const responses = await __classPrivateFieldGet(this, _TokenDetector_multicallClient, "f").batchBalanceOf(chainId, batch);
|
|
75
|
+
return __classPrivateFieldGet(this, _TokenDetector_instances, "m", _TokenDetector_processBalanceResponses).call(this, responses, workingResult, chainId, accountId, timestamp);
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
chainId,
|
|
80
|
+
accountId,
|
|
81
|
+
accountAddress,
|
|
82
|
+
...result,
|
|
83
|
+
timestamp,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.TokenDetector = TokenDetector;
|
|
88
|
+
_TokenDetector_multicallClient = new WeakMap(), _TokenDetector_config = new WeakMap(), _TokenDetector_getTokenListState = new WeakMap(), _TokenDetector_instances = new WeakSet(), _TokenDetector_processBalanceResponses = function _TokenDetector_processBalanceResponses(responses, accumulator, chainId, accountId, timestamp) {
|
|
89
|
+
const { detectedAssets, detectedBalances, zeroBalanceAddresses, failedAddresses, } = accumulator;
|
|
90
|
+
for (const response of responses) {
|
|
91
|
+
if (!response.success) {
|
|
92
|
+
failedAddresses.push(response.tokenAddress);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const balance = response.balance ?? '0';
|
|
96
|
+
if (balance === '0' || balance === '') {
|
|
97
|
+
zeroBalanceAddresses.push(response.tokenAddress);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const tokenMetadata = __classPrivateFieldGet(this, _TokenDetector_instances, "m", _TokenDetector_getTokenMetadata).call(this, chainId, response.tokenAddress);
|
|
101
|
+
const asset = __classPrivateFieldGet(this, _TokenDetector_instances, "m", _TokenDetector_createAsset).call(this, chainId, response.tokenAddress, tokenMetadata);
|
|
102
|
+
detectedAssets.push(asset);
|
|
103
|
+
const decimals = tokenMetadata?.decimals ?? 18;
|
|
104
|
+
const formattedBalance = __classPrivateFieldGet(this, _TokenDetector_instances, "m", _TokenDetector_formatBalance).call(this, balance, decimals);
|
|
105
|
+
detectedBalances.push({
|
|
106
|
+
assetId: asset.assetId,
|
|
107
|
+
accountId,
|
|
108
|
+
chainId,
|
|
109
|
+
balance,
|
|
110
|
+
formattedBalance,
|
|
111
|
+
decimals,
|
|
112
|
+
timestamp,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
detectedAssets,
|
|
117
|
+
detectedBalances,
|
|
118
|
+
zeroBalanceAddresses,
|
|
119
|
+
failedAddresses,
|
|
120
|
+
};
|
|
121
|
+
}, _TokenDetector_formatBalance = function _TokenDetector_formatBalance(rawBalance, decimals) {
|
|
122
|
+
try {
|
|
123
|
+
const balanceBigInt = BigInt(rawBalance);
|
|
124
|
+
const divisor = BigInt(10 ** decimals);
|
|
125
|
+
const integerPart = balanceBigInt / divisor;
|
|
126
|
+
const remainder = balanceBigInt % divisor;
|
|
127
|
+
const fractionalStr = remainder.toString().padStart(decimals, '0');
|
|
128
|
+
const trimmedFractional = fractionalStr.replace(/0+$/u, '');
|
|
129
|
+
if (trimmedFractional === '') {
|
|
130
|
+
return integerPart.toString();
|
|
131
|
+
}
|
|
132
|
+
return `${integerPart}.${trimmedFractional}`;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return rawBalance;
|
|
136
|
+
}
|
|
137
|
+
}, _TokenDetector_getTokenMetadata = function _TokenDetector_getTokenMetadata(chainId, tokenAddress) {
|
|
138
|
+
const tokenListState = __classPrivateFieldGet(this, _TokenDetector_getTokenListState, "f")?.call(this);
|
|
139
|
+
if (!tokenListState) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
const chainCacheEntry = tokenListState.tokensChainsCache[chainId];
|
|
143
|
+
const chainTokenList = chainCacheEntry?.data;
|
|
144
|
+
if (!chainTokenList) {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
if (chainTokenList[tokenAddress]) {
|
|
148
|
+
return chainTokenList[tokenAddress];
|
|
149
|
+
}
|
|
150
|
+
const lowerAddress = tokenAddress.toLowerCase();
|
|
151
|
+
for (const [address, metadata] of Object.entries(chainTokenList)) {
|
|
152
|
+
if (address.toLowerCase() === lowerAddress) {
|
|
153
|
+
return metadata;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return undefined;
|
|
157
|
+
}, _TokenDetector_createAsset = function _TokenDetector_createAsset(chainId, tokenAddress, metadata) {
|
|
158
|
+
const chainIdDecimal = parseInt(chainId, 16);
|
|
159
|
+
const assetId = `eip155:${chainIdDecimal}/erc20:${tokenAddress.toLowerCase()}`;
|
|
160
|
+
return {
|
|
161
|
+
assetId,
|
|
162
|
+
chainId,
|
|
163
|
+
address: tokenAddress,
|
|
164
|
+
type: 'erc20',
|
|
165
|
+
symbol: metadata?.symbol,
|
|
166
|
+
name: metadata?.name,
|
|
167
|
+
decimals: metadata?.decimals,
|
|
168
|
+
image: metadata?.iconUrl,
|
|
169
|
+
isNative: false,
|
|
170
|
+
aggregators: metadata?.aggregators,
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
//# sourceMappingURL=TokenDetector.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenDetector.cjs","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/TokenDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\nimport type { MulticallClient } from '../clients';\nimport type {\n AccountId,\n Address,\n Asset,\n AssetBalance,\n BalanceOfRequest,\n BalanceOfResponse,\n ChainId,\n TokenDetectionOptions,\n TokenDetectionResult,\n TokenListEntry,\n TokenListState,\n} from '../types';\nimport { reduceInBatchesSerially } from '../utils';\n\nexport type TokenDetectorConfig = {\n defaultBatchSize?: number;\n defaultTimeoutMs?: number;\n};\n\nexport class TokenDetector {\n readonly #multicallClient: MulticallClient;\n\n readonly #config: Required<TokenDetectorConfig>;\n\n #getTokenListState: (() => TokenListState) | undefined;\n\n constructor(multicallClient: MulticallClient, config?: TokenDetectorConfig) {\n this.#multicallClient = multicallClient;\n this.#config = {\n defaultBatchSize: config?.defaultBatchSize ?? 300,\n defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,\n };\n }\n\n setTokenListStateGetter(getTokenListState: () => TokenListState): void {\n this.#getTokenListState = getTokenListState;\n }\n\n getTokensToCheck(chainId: ChainId): Address[] {\n const tokenListState = this.#getTokenListState?.();\n\n if (!tokenListState) {\n return [];\n }\n\n const chainCacheEntry = tokenListState.tokensChainsCache[chainId];\n const chainTokenList = chainCacheEntry?.data;\n\n if (!chainTokenList) {\n return [];\n }\n\n return Object.keys(chainTokenList) as Address[];\n }\n\n async detectTokens(\n chainId: ChainId,\n accountId: AccountId,\n accountAddress: Address,\n options?: TokenDetectionOptions,\n ): Promise<TokenDetectionResult> {\n const batchSize = options?.batchSize ?? this.#config.defaultBatchSize;\n const timestamp = Date.now();\n\n const tokensToCheck = this.getTokensToCheck(chainId);\n\n if (tokensToCheck.length === 0) {\n return {\n chainId,\n accountId,\n accountAddress,\n detectedAssets: [],\n detectedBalances: [],\n zeroBalanceAddresses: [],\n failedAddresses: [],\n timestamp,\n };\n }\n\n const balanceRequests: BalanceOfRequest[] = tokensToCheck.map(\n (tokenAddress) => ({\n tokenAddress,\n accountAddress,\n }),\n );\n\n type DetectionAccumulator = {\n detectedAssets: Asset[];\n detectedBalances: AssetBalance[];\n zeroBalanceAddresses: Address[];\n failedAddresses: Address[];\n };\n\n const result = await reduceInBatchesSerially<\n BalanceOfRequest,\n DetectionAccumulator\n >({\n values: balanceRequests,\n batchSize,\n initialResult: {\n detectedAssets: [],\n detectedBalances: [],\n zeroBalanceAddresses: [],\n failedAddresses: [],\n },\n eachBatch: async (workingResult, batch) => {\n const responses = await this.#multicallClient.batchBalanceOf(\n chainId,\n batch,\n );\n\n return this.#processBalanceResponses(\n responses,\n workingResult as DetectionAccumulator,\n chainId,\n accountId,\n timestamp,\n );\n },\n });\n\n return {\n chainId,\n accountId,\n accountAddress,\n ...result,\n timestamp,\n };\n }\n\n #processBalanceResponses(\n responses: BalanceOfResponse[],\n accumulator: {\n detectedAssets: Asset[];\n detectedBalances: AssetBalance[];\n zeroBalanceAddresses: Address[];\n failedAddresses: Address[];\n },\n chainId: ChainId,\n accountId: AccountId,\n timestamp: number,\n ): {\n detectedAssets: Asset[];\n detectedBalances: AssetBalance[];\n zeroBalanceAddresses: Address[];\n failedAddresses: Address[];\n } {\n const {\n detectedAssets,\n detectedBalances,\n zeroBalanceAddresses,\n failedAddresses,\n } = accumulator;\n\n for (const response of responses) {\n if (!response.success) {\n failedAddresses.push(response.tokenAddress);\n continue;\n }\n\n const balance = response.balance ?? '0';\n\n if (balance === '0' || balance === '') {\n zeroBalanceAddresses.push(response.tokenAddress);\n continue;\n }\n\n const tokenMetadata = this.#getTokenMetadata(\n chainId,\n response.tokenAddress,\n );\n\n const asset = this.#createAsset(\n chainId,\n response.tokenAddress,\n tokenMetadata,\n );\n detectedAssets.push(asset);\n\n const decimals = tokenMetadata?.decimals ?? 18;\n const formattedBalance = this.#formatBalance(balance, decimals);\n\n detectedBalances.push({\n assetId: asset.assetId,\n accountId,\n chainId,\n balance,\n formattedBalance,\n decimals,\n timestamp,\n });\n }\n\n return {\n detectedAssets,\n detectedBalances,\n zeroBalanceAddresses,\n failedAddresses,\n };\n }\n\n #formatBalance(rawBalance: string, decimals: number): string {\n try {\n const balanceBigInt = BigInt(rawBalance);\n const divisor = BigInt(10 ** decimals);\n\n const integerPart = balanceBigInt / divisor;\n const remainder = balanceBigInt % divisor;\n const fractionalStr = remainder.toString().padStart(decimals, '0');\n const trimmedFractional = fractionalStr.replace(/0+$/u, '');\n\n if (trimmedFractional === '') {\n return integerPart.toString();\n }\n\n return `${integerPart}.${trimmedFractional}`;\n } catch {\n return rawBalance;\n }\n }\n\n #getTokenMetadata(\n chainId: ChainId,\n tokenAddress: Address,\n ): TokenListEntry | undefined {\n const tokenListState = this.#getTokenListState?.();\n if (!tokenListState) {\n return undefined;\n }\n\n const chainCacheEntry = tokenListState.tokensChainsCache[chainId];\n const chainTokenList = chainCacheEntry?.data;\n if (!chainTokenList) {\n return undefined;\n }\n\n if (chainTokenList[tokenAddress]) {\n return chainTokenList[tokenAddress];\n }\n\n const lowerAddress = tokenAddress.toLowerCase();\n for (const [address, metadata] of Object.entries(chainTokenList)) {\n if (address.toLowerCase() === lowerAddress) {\n return metadata;\n }\n }\n\n return undefined;\n }\n\n #createAsset(\n chainId: ChainId,\n tokenAddress: Address,\n metadata: TokenListEntry | undefined,\n ): Asset {\n const chainIdDecimal = parseInt(chainId, 16);\n\n const assetId =\n `eip155:${chainIdDecimal}/erc20:${tokenAddress.toLowerCase()}` as CaipAssetType;\n\n return {\n assetId,\n chainId,\n address: tokenAddress,\n type: 'erc20',\n symbol: metadata?.symbol,\n name: metadata?.name,\n decimals: metadata?.decimals,\n image: metadata?.iconUrl,\n isNative: false,\n aggregators: metadata?.aggregators,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MulticallClient } from "../clients/index.cjs";
|
|
2
|
+
import type { AccountId, Address, ChainId, TokenDetectionOptions, TokenDetectionResult, TokenListState } from "../types/index.cjs";
|
|
3
|
+
export type TokenDetectorConfig = {
|
|
4
|
+
defaultBatchSize?: number;
|
|
5
|
+
defaultTimeoutMs?: number;
|
|
6
|
+
};
|
|
7
|
+
export declare class TokenDetector {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(multicallClient: MulticallClient, config?: TokenDetectorConfig);
|
|
10
|
+
setTokenListStateGetter(getTokenListState: () => TokenListState): void;
|
|
11
|
+
getTokensToCheck(chainId: ChainId): Address[];
|
|
12
|
+
detectTokens(chainId: ChainId, accountId: AccountId, accountAddress: Address, options?: TokenDetectionOptions): Promise<TokenDetectionResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=TokenDetector.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenDetector.d.cts","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/TokenDetector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,6BAAmB;AAClD,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EAKP,OAAO,EACP,qBAAqB,EACrB,oBAAoB,EAEpB,cAAc,EACf,2BAAiB;AAGlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,qBAAa,aAAa;;gBAOZ,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAQ1E,uBAAuB,CAAC,iBAAiB,EAAE,MAAM,cAAc,GAAG,IAAI;IAItE,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE;IAiBvC,YAAY,CAChB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;CAqNjC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MulticallClient } from "../clients/index.mjs";
|
|
2
|
+
import type { AccountId, Address, ChainId, TokenDetectionOptions, TokenDetectionResult, TokenListState } from "../types/index.mjs";
|
|
3
|
+
export type TokenDetectorConfig = {
|
|
4
|
+
defaultBatchSize?: number;
|
|
5
|
+
defaultTimeoutMs?: number;
|
|
6
|
+
};
|
|
7
|
+
export declare class TokenDetector {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(multicallClient: MulticallClient, config?: TokenDetectorConfig);
|
|
10
|
+
setTokenListStateGetter(getTokenListState: () => TokenListState): void;
|
|
11
|
+
getTokensToCheck(chainId: ChainId): Address[];
|
|
12
|
+
detectTokens(chainId: ChainId, accountId: AccountId, accountAddress: Address, options?: TokenDetectionOptions): Promise<TokenDetectionResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=TokenDetector.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenDetector.d.mts","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/TokenDetector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,6BAAmB;AAClD,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EAKP,OAAO,EACP,qBAAqB,EACrB,oBAAoB,EAEpB,cAAc,EACf,2BAAiB;AAGlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,qBAAa,aAAa;;gBAOZ,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAQ1E,uBAAuB,CAAC,iBAAiB,EAAE,MAAM,cAAc,GAAG,IAAI;IAItE,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE;IAiBvC,YAAY,CAChB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;CAqNjC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _TokenDetector_instances, _TokenDetector_multicallClient, _TokenDetector_config, _TokenDetector_getTokenListState, _TokenDetector_processBalanceResponses, _TokenDetector_formatBalance, _TokenDetector_getTokenMetadata, _TokenDetector_createAsset;
|
|
13
|
+
import { reduceInBatchesSerially } from "../utils/index.mjs";
|
|
14
|
+
export class TokenDetector {
|
|
15
|
+
constructor(multicallClient, config) {
|
|
16
|
+
_TokenDetector_instances.add(this);
|
|
17
|
+
_TokenDetector_multicallClient.set(this, void 0);
|
|
18
|
+
_TokenDetector_config.set(this, void 0);
|
|
19
|
+
_TokenDetector_getTokenListState.set(this, void 0);
|
|
20
|
+
__classPrivateFieldSet(this, _TokenDetector_multicallClient, multicallClient, "f");
|
|
21
|
+
__classPrivateFieldSet(this, _TokenDetector_config, {
|
|
22
|
+
defaultBatchSize: config?.defaultBatchSize ?? 300,
|
|
23
|
+
defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,
|
|
24
|
+
}, "f");
|
|
25
|
+
}
|
|
26
|
+
setTokenListStateGetter(getTokenListState) {
|
|
27
|
+
__classPrivateFieldSet(this, _TokenDetector_getTokenListState, getTokenListState, "f");
|
|
28
|
+
}
|
|
29
|
+
getTokensToCheck(chainId) {
|
|
30
|
+
const tokenListState = __classPrivateFieldGet(this, _TokenDetector_getTokenListState, "f")?.call(this);
|
|
31
|
+
if (!tokenListState) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
const chainCacheEntry = tokenListState.tokensChainsCache[chainId];
|
|
35
|
+
const chainTokenList = chainCacheEntry?.data;
|
|
36
|
+
if (!chainTokenList) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
return Object.keys(chainTokenList);
|
|
40
|
+
}
|
|
41
|
+
async detectTokens(chainId, accountId, accountAddress, options) {
|
|
42
|
+
const batchSize = options?.batchSize ?? __classPrivateFieldGet(this, _TokenDetector_config, "f").defaultBatchSize;
|
|
43
|
+
const timestamp = Date.now();
|
|
44
|
+
const tokensToCheck = this.getTokensToCheck(chainId);
|
|
45
|
+
if (tokensToCheck.length === 0) {
|
|
46
|
+
return {
|
|
47
|
+
chainId,
|
|
48
|
+
accountId,
|
|
49
|
+
accountAddress,
|
|
50
|
+
detectedAssets: [],
|
|
51
|
+
detectedBalances: [],
|
|
52
|
+
zeroBalanceAddresses: [],
|
|
53
|
+
failedAddresses: [],
|
|
54
|
+
timestamp,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const balanceRequests = tokensToCheck.map((tokenAddress) => ({
|
|
58
|
+
tokenAddress,
|
|
59
|
+
accountAddress,
|
|
60
|
+
}));
|
|
61
|
+
const result = await reduceInBatchesSerially({
|
|
62
|
+
values: balanceRequests,
|
|
63
|
+
batchSize,
|
|
64
|
+
initialResult: {
|
|
65
|
+
detectedAssets: [],
|
|
66
|
+
detectedBalances: [],
|
|
67
|
+
zeroBalanceAddresses: [],
|
|
68
|
+
failedAddresses: [],
|
|
69
|
+
},
|
|
70
|
+
eachBatch: async (workingResult, batch) => {
|
|
71
|
+
const responses = await __classPrivateFieldGet(this, _TokenDetector_multicallClient, "f").batchBalanceOf(chainId, batch);
|
|
72
|
+
return __classPrivateFieldGet(this, _TokenDetector_instances, "m", _TokenDetector_processBalanceResponses).call(this, responses, workingResult, chainId, accountId, timestamp);
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
chainId,
|
|
77
|
+
accountId,
|
|
78
|
+
accountAddress,
|
|
79
|
+
...result,
|
|
80
|
+
timestamp,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
_TokenDetector_multicallClient = new WeakMap(), _TokenDetector_config = new WeakMap(), _TokenDetector_getTokenListState = new WeakMap(), _TokenDetector_instances = new WeakSet(), _TokenDetector_processBalanceResponses = function _TokenDetector_processBalanceResponses(responses, accumulator, chainId, accountId, timestamp) {
|
|
85
|
+
const { detectedAssets, detectedBalances, zeroBalanceAddresses, failedAddresses, } = accumulator;
|
|
86
|
+
for (const response of responses) {
|
|
87
|
+
if (!response.success) {
|
|
88
|
+
failedAddresses.push(response.tokenAddress);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const balance = response.balance ?? '0';
|
|
92
|
+
if (balance === '0' || balance === '') {
|
|
93
|
+
zeroBalanceAddresses.push(response.tokenAddress);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const tokenMetadata = __classPrivateFieldGet(this, _TokenDetector_instances, "m", _TokenDetector_getTokenMetadata).call(this, chainId, response.tokenAddress);
|
|
97
|
+
const asset = __classPrivateFieldGet(this, _TokenDetector_instances, "m", _TokenDetector_createAsset).call(this, chainId, response.tokenAddress, tokenMetadata);
|
|
98
|
+
detectedAssets.push(asset);
|
|
99
|
+
const decimals = tokenMetadata?.decimals ?? 18;
|
|
100
|
+
const formattedBalance = __classPrivateFieldGet(this, _TokenDetector_instances, "m", _TokenDetector_formatBalance).call(this, balance, decimals);
|
|
101
|
+
detectedBalances.push({
|
|
102
|
+
assetId: asset.assetId,
|
|
103
|
+
accountId,
|
|
104
|
+
chainId,
|
|
105
|
+
balance,
|
|
106
|
+
formattedBalance,
|
|
107
|
+
decimals,
|
|
108
|
+
timestamp,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
detectedAssets,
|
|
113
|
+
detectedBalances,
|
|
114
|
+
zeroBalanceAddresses,
|
|
115
|
+
failedAddresses,
|
|
116
|
+
};
|
|
117
|
+
}, _TokenDetector_formatBalance = function _TokenDetector_formatBalance(rawBalance, decimals) {
|
|
118
|
+
try {
|
|
119
|
+
const balanceBigInt = BigInt(rawBalance);
|
|
120
|
+
const divisor = BigInt(10 ** decimals);
|
|
121
|
+
const integerPart = balanceBigInt / divisor;
|
|
122
|
+
const remainder = balanceBigInt % divisor;
|
|
123
|
+
const fractionalStr = remainder.toString().padStart(decimals, '0');
|
|
124
|
+
const trimmedFractional = fractionalStr.replace(/0+$/u, '');
|
|
125
|
+
if (trimmedFractional === '') {
|
|
126
|
+
return integerPart.toString();
|
|
127
|
+
}
|
|
128
|
+
return `${integerPart}.${trimmedFractional}`;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return rawBalance;
|
|
132
|
+
}
|
|
133
|
+
}, _TokenDetector_getTokenMetadata = function _TokenDetector_getTokenMetadata(chainId, tokenAddress) {
|
|
134
|
+
const tokenListState = __classPrivateFieldGet(this, _TokenDetector_getTokenListState, "f")?.call(this);
|
|
135
|
+
if (!tokenListState) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
const chainCacheEntry = tokenListState.tokensChainsCache[chainId];
|
|
139
|
+
const chainTokenList = chainCacheEntry?.data;
|
|
140
|
+
if (!chainTokenList) {
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
if (chainTokenList[tokenAddress]) {
|
|
144
|
+
return chainTokenList[tokenAddress];
|
|
145
|
+
}
|
|
146
|
+
const lowerAddress = tokenAddress.toLowerCase();
|
|
147
|
+
for (const [address, metadata] of Object.entries(chainTokenList)) {
|
|
148
|
+
if (address.toLowerCase() === lowerAddress) {
|
|
149
|
+
return metadata;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return undefined;
|
|
153
|
+
}, _TokenDetector_createAsset = function _TokenDetector_createAsset(chainId, tokenAddress, metadata) {
|
|
154
|
+
const chainIdDecimal = parseInt(chainId, 16);
|
|
155
|
+
const assetId = `eip155:${chainIdDecimal}/erc20:${tokenAddress.toLowerCase()}`;
|
|
156
|
+
return {
|
|
157
|
+
assetId,
|
|
158
|
+
chainId,
|
|
159
|
+
address: tokenAddress,
|
|
160
|
+
type: 'erc20',
|
|
161
|
+
symbol: metadata?.symbol,
|
|
162
|
+
name: metadata?.name,
|
|
163
|
+
decimals: metadata?.decimals,
|
|
164
|
+
image: metadata?.iconUrl,
|
|
165
|
+
isNative: false,
|
|
166
|
+
aggregators: metadata?.aggregators,
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=TokenDetector.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenDetector.mjs","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/TokenDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\nimport type { MulticallClient } from '../clients';\nimport type {\n AccountId,\n Address,\n Asset,\n AssetBalance,\n BalanceOfRequest,\n BalanceOfResponse,\n ChainId,\n TokenDetectionOptions,\n TokenDetectionResult,\n TokenListEntry,\n TokenListState,\n} from '../types';\nimport { reduceInBatchesSerially } from '../utils';\n\nexport type TokenDetectorConfig = {\n defaultBatchSize?: number;\n defaultTimeoutMs?: number;\n};\n\nexport class TokenDetector {\n readonly #multicallClient: MulticallClient;\n\n readonly #config: Required<TokenDetectorConfig>;\n\n #getTokenListState: (() => TokenListState) | undefined;\n\n constructor(multicallClient: MulticallClient, config?: TokenDetectorConfig) {\n this.#multicallClient = multicallClient;\n this.#config = {\n defaultBatchSize: config?.defaultBatchSize ?? 300,\n defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,\n };\n }\n\n setTokenListStateGetter(getTokenListState: () => TokenListState): void {\n this.#getTokenListState = getTokenListState;\n }\n\n getTokensToCheck(chainId: ChainId): Address[] {\n const tokenListState = this.#getTokenListState?.();\n\n if (!tokenListState) {\n return [];\n }\n\n const chainCacheEntry = tokenListState.tokensChainsCache[chainId];\n const chainTokenList = chainCacheEntry?.data;\n\n if (!chainTokenList) {\n return [];\n }\n\n return Object.keys(chainTokenList) as Address[];\n }\n\n async detectTokens(\n chainId: ChainId,\n accountId: AccountId,\n accountAddress: Address,\n options?: TokenDetectionOptions,\n ): Promise<TokenDetectionResult> {\n const batchSize = options?.batchSize ?? this.#config.defaultBatchSize;\n const timestamp = Date.now();\n\n const tokensToCheck = this.getTokensToCheck(chainId);\n\n if (tokensToCheck.length === 0) {\n return {\n chainId,\n accountId,\n accountAddress,\n detectedAssets: [],\n detectedBalances: [],\n zeroBalanceAddresses: [],\n failedAddresses: [],\n timestamp,\n };\n }\n\n const balanceRequests: BalanceOfRequest[] = tokensToCheck.map(\n (tokenAddress) => ({\n tokenAddress,\n accountAddress,\n }),\n );\n\n type DetectionAccumulator = {\n detectedAssets: Asset[];\n detectedBalances: AssetBalance[];\n zeroBalanceAddresses: Address[];\n failedAddresses: Address[];\n };\n\n const result = await reduceInBatchesSerially<\n BalanceOfRequest,\n DetectionAccumulator\n >({\n values: balanceRequests,\n batchSize,\n initialResult: {\n detectedAssets: [],\n detectedBalances: [],\n zeroBalanceAddresses: [],\n failedAddresses: [],\n },\n eachBatch: async (workingResult, batch) => {\n const responses = await this.#multicallClient.batchBalanceOf(\n chainId,\n batch,\n );\n\n return this.#processBalanceResponses(\n responses,\n workingResult as DetectionAccumulator,\n chainId,\n accountId,\n timestamp,\n );\n },\n });\n\n return {\n chainId,\n accountId,\n accountAddress,\n ...result,\n timestamp,\n };\n }\n\n #processBalanceResponses(\n responses: BalanceOfResponse[],\n accumulator: {\n detectedAssets: Asset[];\n detectedBalances: AssetBalance[];\n zeroBalanceAddresses: Address[];\n failedAddresses: Address[];\n },\n chainId: ChainId,\n accountId: AccountId,\n timestamp: number,\n ): {\n detectedAssets: Asset[];\n detectedBalances: AssetBalance[];\n zeroBalanceAddresses: Address[];\n failedAddresses: Address[];\n } {\n const {\n detectedAssets,\n detectedBalances,\n zeroBalanceAddresses,\n failedAddresses,\n } = accumulator;\n\n for (const response of responses) {\n if (!response.success) {\n failedAddresses.push(response.tokenAddress);\n continue;\n }\n\n const balance = response.balance ?? '0';\n\n if (balance === '0' || balance === '') {\n zeroBalanceAddresses.push(response.tokenAddress);\n continue;\n }\n\n const tokenMetadata = this.#getTokenMetadata(\n chainId,\n response.tokenAddress,\n );\n\n const asset = this.#createAsset(\n chainId,\n response.tokenAddress,\n tokenMetadata,\n );\n detectedAssets.push(asset);\n\n const decimals = tokenMetadata?.decimals ?? 18;\n const formattedBalance = this.#formatBalance(balance, decimals);\n\n detectedBalances.push({\n assetId: asset.assetId,\n accountId,\n chainId,\n balance,\n formattedBalance,\n decimals,\n timestamp,\n });\n }\n\n return {\n detectedAssets,\n detectedBalances,\n zeroBalanceAddresses,\n failedAddresses,\n };\n }\n\n #formatBalance(rawBalance: string, decimals: number): string {\n try {\n const balanceBigInt = BigInt(rawBalance);\n const divisor = BigInt(10 ** decimals);\n\n const integerPart = balanceBigInt / divisor;\n const remainder = balanceBigInt % divisor;\n const fractionalStr = remainder.toString().padStart(decimals, '0');\n const trimmedFractional = fractionalStr.replace(/0+$/u, '');\n\n if (trimmedFractional === '') {\n return integerPart.toString();\n }\n\n return `${integerPart}.${trimmedFractional}`;\n } catch {\n return rawBalance;\n }\n }\n\n #getTokenMetadata(\n chainId: ChainId,\n tokenAddress: Address,\n ): TokenListEntry | undefined {\n const tokenListState = this.#getTokenListState?.();\n if (!tokenListState) {\n return undefined;\n }\n\n const chainCacheEntry = tokenListState.tokensChainsCache[chainId];\n const chainTokenList = chainCacheEntry?.data;\n if (!chainTokenList) {\n return undefined;\n }\n\n if (chainTokenList[tokenAddress]) {\n return chainTokenList[tokenAddress];\n }\n\n const lowerAddress = tokenAddress.toLowerCase();\n for (const [address, metadata] of Object.entries(chainTokenList)) {\n if (address.toLowerCase() === lowerAddress) {\n return metadata;\n }\n }\n\n return undefined;\n }\n\n #createAsset(\n chainId: ChainId,\n tokenAddress: Address,\n metadata: TokenListEntry | undefined,\n ): Asset {\n const chainIdDecimal = parseInt(chainId, 16);\n\n const assetId =\n `eip155:${chainIdDecimal}/erc20:${tokenAddress.toLowerCase()}` as CaipAssetType;\n\n return {\n assetId,\n chainId,\n address: tokenAddress,\n type: 'erc20',\n symbol: metadata?.symbol,\n name: metadata?.name,\n decimals: metadata?.decimals,\n image: metadata?.iconUrl,\n isNative: false,\n aggregators: metadata?.aggregators,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BalanceFetcher = exports.TokenDetector = void 0;
|
|
4
|
+
var TokenDetector_1 = require("./TokenDetector.cjs");
|
|
5
|
+
Object.defineProperty(exports, "TokenDetector", { enumerable: true, get: function () { return TokenDetector_1.TokenDetector; } });
|
|
6
|
+
var BalanceFetcher_1 = require("./BalanceFetcher.cjs");
|
|
7
|
+
Object.defineProperty(exports, "BalanceFetcher", { enumerable: true, get: function () { return BalanceFetcher_1.BalanceFetcher; } });
|
|
8
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/index.ts"],"names":[],"mappings":";;;AAAA,qDAA0E;AAAjE,8GAAA,aAAa,OAAA;AACtB,uDAA6E;AAApE,gHAAA,cAAc,OAAA","sourcesContent":["export { TokenDetector, type TokenDetectorConfig } from './TokenDetector';\nexport { BalanceFetcher, type BalanceFetcherConfig } from './BalanceFetcher';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,4BAAwB;AAC1E,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,6BAAyB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,4BAAwB;AAC1E,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,6BAAyB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA4B,4BAAwB;AAC1E,OAAO,EAAE,cAAc,EAA6B,6BAAyB","sourcesContent":["export { TokenDetector, type TokenDetectorConfig } from './TokenDetector';\nexport { BalanceFetcher, type BalanceFetcherConfig } from './BalanceFetcher';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.cjs","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/types/assets.ts"],"names":[],"mappings":"","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\nimport type { AccountId, Address, AssetType, ChainId } from './core';\n\n/**\n * Core asset definition.\n */\nexport type Asset = {\n /** CAIP-19 asset identifier */\n assetId: CaipAssetType;\n /** Chain ID in hex format */\n chainId: ChainId;\n /** Contract address (zero address for native) */\n address: Address;\n /** Asset type */\n type: AssetType;\n /** Token symbol (e.g., \"ETH\", \"USDC\") */\n symbol?: string;\n /** Token name (e.g., \"Ethereum\", \"USD Coin\") */\n name?: string;\n /** Token decimals */\n decimals?: number;\n /** Logo image URL */\n image?: string;\n /** Whether this is the chain's native token */\n isNative: boolean;\n /** Spam detection flag */\n isSpam?: boolean;\n /** Verification status */\n verified?: boolean;\n /** Token list sources */\n aggregators?: string[];\n};\n\n/**\n * Asset balance for a specific account.\n */\nexport type AssetBalance = {\n /** CAIP-19 asset identifier */\n assetId: CaipAssetType;\n /** Account ID (UUID) */\n accountId: AccountId;\n /** Chain ID in hex format */\n chainId: ChainId;\n /** Raw balance as string (wei/smallest unit) */\n balance: string;\n /** Human-readable balance (balance / 10^decimals) */\n formattedBalance: string;\n /** Token decimals used for formatting */\n decimals: number;\n /** Block number when balance was fetched */\n blockNumber?: number;\n /** Timestamp when balance was fetched */\n timestamp: number;\n};\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { CaipAssetType } from "@metamask/utils";
|
|
2
|
+
import type { AccountId, Address, AssetType, ChainId } from "./core.cjs";
|
|
3
|
+
/**
|
|
4
|
+
* Core asset definition.
|
|
5
|
+
*/
|
|
6
|
+
export type Asset = {
|
|
7
|
+
/** CAIP-19 asset identifier */
|
|
8
|
+
assetId: CaipAssetType;
|
|
9
|
+
/** Chain ID in hex format */
|
|
10
|
+
chainId: ChainId;
|
|
11
|
+
/** Contract address (zero address for native) */
|
|
12
|
+
address: Address;
|
|
13
|
+
/** Asset type */
|
|
14
|
+
type: AssetType;
|
|
15
|
+
/** Token symbol (e.g., "ETH", "USDC") */
|
|
16
|
+
symbol?: string;
|
|
17
|
+
/** Token name (e.g., "Ethereum", "USD Coin") */
|
|
18
|
+
name?: string;
|
|
19
|
+
/** Token decimals */
|
|
20
|
+
decimals?: number;
|
|
21
|
+
/** Logo image URL */
|
|
22
|
+
image?: string;
|
|
23
|
+
/** Whether this is the chain's native token */
|
|
24
|
+
isNative: boolean;
|
|
25
|
+
/** Spam detection flag */
|
|
26
|
+
isSpam?: boolean;
|
|
27
|
+
/** Verification status */
|
|
28
|
+
verified?: boolean;
|
|
29
|
+
/** Token list sources */
|
|
30
|
+
aggregators?: string[];
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Asset balance for a specific account.
|
|
34
|
+
*/
|
|
35
|
+
export type AssetBalance = {
|
|
36
|
+
/** CAIP-19 asset identifier */
|
|
37
|
+
assetId: CaipAssetType;
|
|
38
|
+
/** Account ID (UUID) */
|
|
39
|
+
accountId: AccountId;
|
|
40
|
+
/** Chain ID in hex format */
|
|
41
|
+
chainId: ChainId;
|
|
42
|
+
/** Raw balance as string (wei/smallest unit) */
|
|
43
|
+
balance: string;
|
|
44
|
+
/** Human-readable balance (balance / 10^decimals) */
|
|
45
|
+
formattedBalance: string;
|
|
46
|
+
/** Token decimals used for formatting */
|
|
47
|
+
decimals: number;
|
|
48
|
+
/** Block number when balance was fetched */
|
|
49
|
+
blockNumber?: number;
|
|
50
|
+
/** Timestamp when balance was fetched */
|
|
51
|
+
timestamp: number;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=assets.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.d.cts","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/types/assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAe;AAErE;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,+BAA+B;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,+BAA+B;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,wBAAwB;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { CaipAssetType } from "@metamask/utils";
|
|
2
|
+
import type { AccountId, Address, AssetType, ChainId } from "./core.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* Core asset definition.
|
|
5
|
+
*/
|
|
6
|
+
export type Asset = {
|
|
7
|
+
/** CAIP-19 asset identifier */
|
|
8
|
+
assetId: CaipAssetType;
|
|
9
|
+
/** Chain ID in hex format */
|
|
10
|
+
chainId: ChainId;
|
|
11
|
+
/** Contract address (zero address for native) */
|
|
12
|
+
address: Address;
|
|
13
|
+
/** Asset type */
|
|
14
|
+
type: AssetType;
|
|
15
|
+
/** Token symbol (e.g., "ETH", "USDC") */
|
|
16
|
+
symbol?: string;
|
|
17
|
+
/** Token name (e.g., "Ethereum", "USD Coin") */
|
|
18
|
+
name?: string;
|
|
19
|
+
/** Token decimals */
|
|
20
|
+
decimals?: number;
|
|
21
|
+
/** Logo image URL */
|
|
22
|
+
image?: string;
|
|
23
|
+
/** Whether this is the chain's native token */
|
|
24
|
+
isNative: boolean;
|
|
25
|
+
/** Spam detection flag */
|
|
26
|
+
isSpam?: boolean;
|
|
27
|
+
/** Verification status */
|
|
28
|
+
verified?: boolean;
|
|
29
|
+
/** Token list sources */
|
|
30
|
+
aggregators?: string[];
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Asset balance for a specific account.
|
|
34
|
+
*/
|
|
35
|
+
export type AssetBalance = {
|
|
36
|
+
/** CAIP-19 asset identifier */
|
|
37
|
+
assetId: CaipAssetType;
|
|
38
|
+
/** Account ID (UUID) */
|
|
39
|
+
accountId: AccountId;
|
|
40
|
+
/** Chain ID in hex format */
|
|
41
|
+
chainId: ChainId;
|
|
42
|
+
/** Raw balance as string (wei/smallest unit) */
|
|
43
|
+
balance: string;
|
|
44
|
+
/** Human-readable balance (balance / 10^decimals) */
|
|
45
|
+
formattedBalance: string;
|
|
46
|
+
/** Token decimals used for formatting */
|
|
47
|
+
decimals: number;
|
|
48
|
+
/** Block number when balance was fetched */
|
|
49
|
+
blockNumber?: number;
|
|
50
|
+
/** Timestamp when balance was fetched */
|
|
51
|
+
timestamp: number;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=assets.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.d.mts","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/types/assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAe;AAErE;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,+BAA+B;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,+BAA+B;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,wBAAwB;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC"}
|