@metamask-previews/assets-controller 0.0.0-preview-3ec2a74 → 0.0.0-preview-6ae8a59c
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 +5 -0
- package/dist/data-sources/RpcDataSource.cjs +415 -186
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +115 -30
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +115 -30
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +413 -185
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.mjs.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/index.cjs +4 -1
- package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/index.d.cts +5 -0
- package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/index.d.mts +5 -0
- package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/index.mjs +1 -0
- package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/BalanceFetcher.cjs +33 -3
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +68 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +68 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/BalanceFetcher.mjs +33 -3
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/TokenDetector.cjs +33 -3
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +66 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +66 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/TokenDetector.mjs +33 -3
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.cts +3 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.mts +3 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -0
- package/dist/data-sources/initDataSources.cjs +5 -1
- package/dist/data-sources/initDataSources.cjs.map +1 -1
- package/dist/data-sources/initDataSources.d.cts +15 -0
- package/dist/data-sources/initDataSources.d.cts.map +1 -1
- package/dist/data-sources/initDataSources.d.mts +15 -0
- package/dist/data-sources/initDataSources.d.mts.map +1 -1
- package/dist/data-sources/initDataSources.mjs +5 -1
- package/dist/data-sources/initDataSources.mjs.map +1 -1
- package/package.json +5 -2
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/index.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/index.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/index.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/index.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/index.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/index.d.cts +0 -4
- package/dist/data-sources/rpc-datasource/index.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/index.d.mts +0 -4
- package/dist/data-sources/rpc-datasource/index.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/index.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts +0 -16
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts +0 -16
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/TokenDetector.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts +0 -14
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts +0 -14
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/TokenDetector.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/index.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/index.d.cts +0 -3
- package/dist/data-sources/rpc-datasource/services/index.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/index.d.mts +0 -3
- package/dist/data-sources/rpc-datasource/services/index.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/index.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/assets.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/assets.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/assets.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/assets.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/config.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/config.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/config.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/config.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/core.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/core.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/core.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/core.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/index.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/index.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/index.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/index.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/multicall.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/multicall.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/multicall.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/multicall.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/services.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/services.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/services.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/services.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/state.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/state.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/state.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/state.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/batch.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/batch.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/batch.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/batch.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/index.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/index.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/index.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/index.mjs.map +0 -1
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/index.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/index.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.mjs +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalanceFetcher.cjs","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/BalanceFetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { StaticIntervalPollingControllerOnly } from '@metamask/polling-controller';\nimport 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 DEFAULT_BALANCE_INTERVAL = 30_000; // 30 seconds\n\nconst ZERO_ADDRESS: Address =\n '0x0000000000000000000000000000000000000000' as Address;\n\nexport type BalanceFetcherConfig = {\n defaultBatchSize?: number;\n defaultTimeoutMs?: number;\n includeNativeByDefault?: boolean;\n /** Polling interval in ms (default: 30s) */\n pollingInterval?: number;\n};\n\n/**\n * Polling input for BalanceFetcher - identifies what to poll for.\n */\nexport type BalancePollingInput = {\n /** Chain ID (hex format) */\n chainId: ChainId;\n /** Account ID */\n accountId: AccountId;\n /** Account address */\n accountAddress: Address;\n};\n\n/**\n * Callback type for balance updates.\n */\nexport type OnBalanceUpdateCallback = (result: BalanceFetchResult) => void;\n\n/**\n * BalanceFetcher - Fetches token balances via multicall.\n * Extends StaticIntervalPollingControllerOnly for built-in polling support.\n */\nexport class BalanceFetcher extends StaticIntervalPollingControllerOnly<BalancePollingInput>() {\n readonly #multicallClient: MulticallClient;\n\n readonly #config: Required<Omit<BalanceFetcherConfig, 'pollingInterval'>>;\n\n #getUserTokensState: (() => UserTokensState) | undefined;\n\n #onBalanceUpdate: OnBalanceUpdateCallback | undefined;\n\n constructor(multicallClient: MulticallClient, config?: BalanceFetcherConfig) {\n super();\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 // Set the polling interval\n this.setIntervalLength(config?.pollingInterval ?? DEFAULT_BALANCE_INTERVAL);\n }\n\n /**\n * Set the callback to receive balance updates during polling.\n *\n * @param callback - Function to call with balance results.\n */\n setOnBalanceUpdate(callback: OnBalanceUpdateCallback): void {\n this.#onBalanceUpdate = callback;\n }\n\n setUserTokensStateGetter(getUserTokensState: () => UserTokensState): void {\n this.#getUserTokensState = getUserTokensState;\n }\n\n /**\n * Execute a poll cycle (required by base class).\n * Fetches balances and calls the update callback.\n *\n * @param input - The polling input.\n */\n async _executePoll(input: BalancePollingInput): Promise<void> {\n const result = await this.fetchBalances(\n input.chainId,\n input.accountId,\n input.accountAddress,\n );\n\n if (this.#onBalanceUpdate && result.balances.length > 0) {\n this.#onBalanceUpdate(result);\n }\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,68 @@
|
|
|
1
|
+
import type { MulticallClient } from "../clients/index.cjs";
|
|
2
|
+
import type { AccountId, Address, BalanceFetchOptions, BalanceFetchResult, ChainId, TokenFetchInfo, UserTokensState } from "../types/index.cjs";
|
|
3
|
+
export type BalanceFetcherConfig = {
|
|
4
|
+
defaultBatchSize?: number;
|
|
5
|
+
defaultTimeoutMs?: number;
|
|
6
|
+
includeNativeByDefault?: boolean;
|
|
7
|
+
/** Polling interval in ms (default: 30s) */
|
|
8
|
+
pollingInterval?: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Polling input for BalanceFetcher - identifies what to poll for.
|
|
12
|
+
*/
|
|
13
|
+
export type BalancePollingInput = {
|
|
14
|
+
/** Chain ID (hex format) */
|
|
15
|
+
chainId: ChainId;
|
|
16
|
+
/** Account ID */
|
|
17
|
+
accountId: AccountId;
|
|
18
|
+
/** Account address */
|
|
19
|
+
accountAddress: Address;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Callback type for balance updates.
|
|
23
|
+
*/
|
|
24
|
+
export type OnBalanceUpdateCallback = (result: BalanceFetchResult) => void;
|
|
25
|
+
declare const BalanceFetcher_base: (abstract new (...args: any[]) => {
|
|
26
|
+
readonly "__#15@#intervalIds": Record<string, NodeJS.Timeout>;
|
|
27
|
+
"__#15@#intervalLength": number | undefined;
|
|
28
|
+
setIntervalLength(intervalLength: number): void;
|
|
29
|
+
getIntervalLength(): number | undefined;
|
|
30
|
+
_startPolling(input: BalancePollingInput): void;
|
|
31
|
+
_stopPollingByPollingTokenSetId(key: string): void;
|
|
32
|
+
readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
|
|
33
|
+
readonly "__#3@#callbacks": Map<string, Set<(input: BalancePollingInput) => void>>;
|
|
34
|
+
_executePoll(input: BalancePollingInput): Promise<void>;
|
|
35
|
+
startPolling(input: BalancePollingInput): string;
|
|
36
|
+
stopAllPolling(): void;
|
|
37
|
+
stopPollingByPollingToken(pollingToken: string): void; /** Account ID */
|
|
38
|
+
onPollingComplete(input: BalancePollingInput, callback: (input: BalancePollingInput) => void): void;
|
|
39
|
+
}) & {
|
|
40
|
+
new (): {};
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* BalanceFetcher - Fetches token balances via multicall.
|
|
44
|
+
* Extends StaticIntervalPollingControllerOnly for built-in polling support.
|
|
45
|
+
*/
|
|
46
|
+
export declare class BalanceFetcher extends BalanceFetcher_base {
|
|
47
|
+
#private;
|
|
48
|
+
constructor(multicallClient: MulticallClient, config?: BalanceFetcherConfig);
|
|
49
|
+
/**
|
|
50
|
+
* Set the callback to receive balance updates during polling.
|
|
51
|
+
*
|
|
52
|
+
* @param callback - Function to call with balance results.
|
|
53
|
+
*/
|
|
54
|
+
setOnBalanceUpdate(callback: OnBalanceUpdateCallback): void;
|
|
55
|
+
setUserTokensStateGetter(getUserTokensState: () => UserTokensState): void;
|
|
56
|
+
/**
|
|
57
|
+
* Execute a poll cycle (required by base class).
|
|
58
|
+
* Fetches balances and calls the update callback.
|
|
59
|
+
*
|
|
60
|
+
* @param input - The polling input.
|
|
61
|
+
*/
|
|
62
|
+
_executePoll(input: BalancePollingInput): Promise<void>;
|
|
63
|
+
getTokensToFetch(chainId: ChainId, accountAddress: Address): TokenFetchInfo[];
|
|
64
|
+
fetchBalances(chainId: ChainId, accountId: AccountId, accountAddress: Address, options?: BalanceFetchOptions): Promise<BalanceFetchResult>;
|
|
65
|
+
fetchBalancesForTokens(chainId: ChainId, accountId: AccountId, accountAddress: Address, tokenAddresses: Address[], options?: BalanceFetchOptions, tokenInfos?: TokenFetchInfo[]): Promise<BalanceFetchResult>;
|
|
66
|
+
}
|
|
67
|
+
export {};
|
|
68
|
+
//# sourceMappingURL=BalanceFetcher.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalanceFetcher.d.cts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/BalanceFetcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,6BAAmB;AAClD,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EAEP,mBAAmB,EACnB,kBAAkB,EAGlB,OAAO,EACP,cAAc,EAEd,eAAe,EAChB,2BAAiB;AAQlB,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;;;;;;;;;;;;;2DATzE,iBAAiB;;;;;AAWnB;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAA0D;;gBAShF,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,oBAAoB;IAa3E;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAI3D,wBAAwB,CAAC,kBAAkB,EAAE,MAAM,eAAe,GAAG,IAAI;IAIzE;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7D,gBAAgB,CACd,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,OAAO,GACtB,cAAc,EAAE;IAmCb,aAAa,CACjB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAcxB,sBAAsB,CAC1B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,cAAc,EAAE,OAAO,EAAE,EACzB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,UAAU,CAAC,EAAE,cAAc,EAAE,GAC5B,OAAO,CAAC,kBAAkB,CAAC;CAwJ/B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { MulticallClient } from "../clients/index.mjs";
|
|
2
|
+
import type { AccountId, Address, BalanceFetchOptions, BalanceFetchResult, ChainId, TokenFetchInfo, UserTokensState } from "../types/index.mjs";
|
|
3
|
+
export type BalanceFetcherConfig = {
|
|
4
|
+
defaultBatchSize?: number;
|
|
5
|
+
defaultTimeoutMs?: number;
|
|
6
|
+
includeNativeByDefault?: boolean;
|
|
7
|
+
/** Polling interval in ms (default: 30s) */
|
|
8
|
+
pollingInterval?: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Polling input for BalanceFetcher - identifies what to poll for.
|
|
12
|
+
*/
|
|
13
|
+
export type BalancePollingInput = {
|
|
14
|
+
/** Chain ID (hex format) */
|
|
15
|
+
chainId: ChainId;
|
|
16
|
+
/** Account ID */
|
|
17
|
+
accountId: AccountId;
|
|
18
|
+
/** Account address */
|
|
19
|
+
accountAddress: Address;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Callback type for balance updates.
|
|
23
|
+
*/
|
|
24
|
+
export type OnBalanceUpdateCallback = (result: BalanceFetchResult) => void;
|
|
25
|
+
declare const BalanceFetcher_base: (abstract new (...args: any[]) => {
|
|
26
|
+
readonly "__#15@#intervalIds": Record<string, NodeJS.Timeout>;
|
|
27
|
+
"__#15@#intervalLength": number | undefined;
|
|
28
|
+
setIntervalLength(intervalLength: number): void;
|
|
29
|
+
getIntervalLength(): number | undefined;
|
|
30
|
+
_startPolling(input: BalancePollingInput): void;
|
|
31
|
+
_stopPollingByPollingTokenSetId(key: string): void;
|
|
32
|
+
readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
|
|
33
|
+
readonly "__#3@#callbacks": Map<string, Set<(input: BalancePollingInput) => void>>;
|
|
34
|
+
_executePoll(input: BalancePollingInput): Promise<void>;
|
|
35
|
+
startPolling(input: BalancePollingInput): string;
|
|
36
|
+
stopAllPolling(): void;
|
|
37
|
+
stopPollingByPollingToken(pollingToken: string): void; /** Account ID */
|
|
38
|
+
onPollingComplete(input: BalancePollingInput, callback: (input: BalancePollingInput) => void): void;
|
|
39
|
+
}) & {
|
|
40
|
+
new (): {};
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* BalanceFetcher - Fetches token balances via multicall.
|
|
44
|
+
* Extends StaticIntervalPollingControllerOnly for built-in polling support.
|
|
45
|
+
*/
|
|
46
|
+
export declare class BalanceFetcher extends BalanceFetcher_base {
|
|
47
|
+
#private;
|
|
48
|
+
constructor(multicallClient: MulticallClient, config?: BalanceFetcherConfig);
|
|
49
|
+
/**
|
|
50
|
+
* Set the callback to receive balance updates during polling.
|
|
51
|
+
*
|
|
52
|
+
* @param callback - Function to call with balance results.
|
|
53
|
+
*/
|
|
54
|
+
setOnBalanceUpdate(callback: OnBalanceUpdateCallback): void;
|
|
55
|
+
setUserTokensStateGetter(getUserTokensState: () => UserTokensState): void;
|
|
56
|
+
/**
|
|
57
|
+
* Execute a poll cycle (required by base class).
|
|
58
|
+
* Fetches balances and calls the update callback.
|
|
59
|
+
*
|
|
60
|
+
* @param input - The polling input.
|
|
61
|
+
*/
|
|
62
|
+
_executePoll(input: BalancePollingInput): Promise<void>;
|
|
63
|
+
getTokensToFetch(chainId: ChainId, accountAddress: Address): TokenFetchInfo[];
|
|
64
|
+
fetchBalances(chainId: ChainId, accountId: AccountId, accountAddress: Address, options?: BalanceFetchOptions): Promise<BalanceFetchResult>;
|
|
65
|
+
fetchBalancesForTokens(chainId: ChainId, accountId: AccountId, accountAddress: Address, tokenAddresses: Address[], options?: BalanceFetchOptions, tokenInfos?: TokenFetchInfo[]): Promise<BalanceFetchResult>;
|
|
66
|
+
}
|
|
67
|
+
export {};
|
|
68
|
+
//# sourceMappingURL=BalanceFetcher.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalanceFetcher.d.mts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/BalanceFetcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,6BAAmB;AAClD,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EAEP,mBAAmB,EACnB,kBAAkB,EAGlB,OAAO,EACP,cAAc,EAEd,eAAe,EAChB,2BAAiB;AAQlB,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;;;;;;;;;;;;;2DATzE,iBAAiB;;;;;AAWnB;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAA0D;;gBAShF,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,oBAAoB;IAa3E;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAI3D,wBAAwB,CAAC,kBAAkB,EAAE,MAAM,eAAe,GAAG,IAAI;IAIzE;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7D,gBAAgB,CACd,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,OAAO,GACtB,cAAc,EAAE;IAmCb,aAAa,CACjB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAcxB,sBAAsB,CAC1B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,cAAc,EAAE,OAAO,EAAE,EACzB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,UAAU,CAAC,EAAE,cAAc,EAAE,GAC5B,OAAO,CAAC,kBAAkB,CAAC;CAwJ/B"}
|
|
@@ -9,25 +9,55 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
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
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _BalanceFetcher_instances, _BalanceFetcher_multicallClient, _BalanceFetcher_config, _BalanceFetcher_getUserTokensState, _BalanceFetcher_processBalanceResponses, _BalanceFetcher_formatBalance;
|
|
12
|
+
var _BalanceFetcher_instances, _BalanceFetcher_multicallClient, _BalanceFetcher_config, _BalanceFetcher_getUserTokensState, _BalanceFetcher_onBalanceUpdate, _BalanceFetcher_processBalanceResponses, _BalanceFetcher_formatBalance;
|
|
13
|
+
import { StaticIntervalPollingControllerOnly } from "@metamask/polling-controller";
|
|
13
14
|
import { reduceInBatchesSerially } from "../utils/index.mjs";
|
|
15
|
+
const DEFAULT_BALANCE_INTERVAL = 30000; // 30 seconds
|
|
14
16
|
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
15
|
-
|
|
17
|
+
/**
|
|
18
|
+
* BalanceFetcher - Fetches token balances via multicall.
|
|
19
|
+
* Extends StaticIntervalPollingControllerOnly for built-in polling support.
|
|
20
|
+
*/
|
|
21
|
+
export class BalanceFetcher extends StaticIntervalPollingControllerOnly() {
|
|
16
22
|
constructor(multicallClient, config) {
|
|
23
|
+
super();
|
|
17
24
|
_BalanceFetcher_instances.add(this);
|
|
18
25
|
_BalanceFetcher_multicallClient.set(this, void 0);
|
|
19
26
|
_BalanceFetcher_config.set(this, void 0);
|
|
20
27
|
_BalanceFetcher_getUserTokensState.set(this, void 0);
|
|
28
|
+
_BalanceFetcher_onBalanceUpdate.set(this, void 0);
|
|
21
29
|
__classPrivateFieldSet(this, _BalanceFetcher_multicallClient, multicallClient, "f");
|
|
22
30
|
__classPrivateFieldSet(this, _BalanceFetcher_config, {
|
|
23
31
|
defaultBatchSize: config?.defaultBatchSize ?? 300,
|
|
24
32
|
defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,
|
|
25
33
|
includeNativeByDefault: config?.includeNativeByDefault ?? true,
|
|
26
34
|
}, "f");
|
|
35
|
+
// Set the polling interval
|
|
36
|
+
this.setIntervalLength(config?.pollingInterval ?? DEFAULT_BALANCE_INTERVAL);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Set the callback to receive balance updates during polling.
|
|
40
|
+
*
|
|
41
|
+
* @param callback - Function to call with balance results.
|
|
42
|
+
*/
|
|
43
|
+
setOnBalanceUpdate(callback) {
|
|
44
|
+
__classPrivateFieldSet(this, _BalanceFetcher_onBalanceUpdate, callback, "f");
|
|
27
45
|
}
|
|
28
46
|
setUserTokensStateGetter(getUserTokensState) {
|
|
29
47
|
__classPrivateFieldSet(this, _BalanceFetcher_getUserTokensState, getUserTokensState, "f");
|
|
30
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Execute a poll cycle (required by base class).
|
|
51
|
+
* Fetches balances and calls the update callback.
|
|
52
|
+
*
|
|
53
|
+
* @param input - The polling input.
|
|
54
|
+
*/
|
|
55
|
+
async _executePoll(input) {
|
|
56
|
+
const result = await this.fetchBalances(input.chainId, input.accountId, input.accountAddress);
|
|
57
|
+
if (__classPrivateFieldGet(this, _BalanceFetcher_onBalanceUpdate, "f") && result.balances.length > 0) {
|
|
58
|
+
__classPrivateFieldGet(this, _BalanceFetcher_onBalanceUpdate, "f").call(this, result);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
31
61
|
getTokensToFetch(chainId, accountAddress) {
|
|
32
62
|
const userTokensState = __classPrivateFieldGet(this, _BalanceFetcher_getUserTokensState, "f")?.call(this);
|
|
33
63
|
if (!userTokensState) {
|
|
@@ -113,7 +143,7 @@ export class BalanceFetcher {
|
|
|
113
143
|
};
|
|
114
144
|
}
|
|
115
145
|
}
|
|
116
|
-
_BalanceFetcher_multicallClient = new WeakMap(), _BalanceFetcher_config = new WeakMap(), _BalanceFetcher_getUserTokensState = new WeakMap(), _BalanceFetcher_instances = new WeakSet(), _BalanceFetcher_processBalanceResponses = function _BalanceFetcher_processBalanceResponses(responses, accumulator, chainId, accountId, timestamp, tokenInfoMap) {
|
|
146
|
+
_BalanceFetcher_multicallClient = new WeakMap(), _BalanceFetcher_config = new WeakMap(), _BalanceFetcher_getUserTokensState = new WeakMap(), _BalanceFetcher_onBalanceUpdate = new WeakMap(), _BalanceFetcher_instances = new WeakSet(), _BalanceFetcher_processBalanceResponses = function _BalanceFetcher_processBalanceResponses(responses, accumulator, chainId, accountId, timestamp, tokenInfoMap) {
|
|
117
147
|
const { balances, failedAddresses } = accumulator;
|
|
118
148
|
for (const response of responses) {
|
|
119
149
|
if (!response.success) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalanceFetcher.mjs","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/BalanceFetcher.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,mCAAmC,EAAE,qCAAqC;AAiBnF,OAAO,EAAE,uBAAuB,EAAE,2BAAiB;AAEnD,MAAM,wBAAwB,GAAG,KAAM,CAAC,CAAC,aAAa;AAEtD,MAAM,YAAY,GAChB,4CAAuD,CAAC;AA2B1D;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,mCAAmC,EAAuB;IAS5F,YAAY,eAAgC,EAAE,MAA6B;QACzE,KAAK,EAAE,CAAC;;QATD,kDAAkC;QAElC,yCAAiE;QAE1E,qDAAyD;QAEzD,kDAAsD;QAIpD,uBAAA,IAAI,mCAAoB,eAAe,MAAA,CAAC;QACxC,uBAAA,IAAI,0BAAW;YACb,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,GAAG;YACjD,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,KAAK;YACnD,sBAAsB,EAAE,MAAM,EAAE,sBAAsB,IAAI,IAAI;SAC/D,MAAA,CAAC;QAEF,2BAA2B;QAC3B,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,eAAe,IAAI,wBAAwB,CAAC,CAAC;IAC9E,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,QAAiC;QAClD,uBAAA,IAAI,mCAAoB,QAAQ,MAAA,CAAC;IACnC,CAAC;IAED,wBAAwB,CAAC,kBAAyC;QAChE,uBAAA,IAAI,sCAAuB,kBAAkB,MAAA,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,KAA0B;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CACrC,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,cAAc,CACrB,CAAC;QAEF,IAAI,uBAAA,IAAI,uCAAiB,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,uBAAA,IAAI,uCAAiB,MAArB,IAAI,EAAkB,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,gBAAgB,CACd,OAAgB,EAChB,cAAuB;QAEvB,MAAM,eAAe,GAAG,uBAAA,IAAI,0CAAoB,EAAE,KAA1B,IAAI,CAAwB,CAAC;QAErD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;QAEnD,MAAM,QAAQ,GAAG,CAAC,KAAgB,EAAQ,EAAE;YAC1C,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAChC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE;oBACzB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,cAAc,GAClB,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,cAAc,GAClB,eAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAAgB,EAChB,SAAoB,EACpB,cAAuB,EACvB,OAA6B;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC9D,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC,sBAAsB,CAChC,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,OAAO,EACP,MAAM,CACP,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,OAAgB,EAChB,SAAoB,EACpB,cAAuB,EACvB,cAAyB,EACzB,OAA6B,EAC7B,UAA6B;QAE7B,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,uBAAA,IAAI,8BAAQ,CAAC,gBAAgB,CAAC;QACtE,MAAM,aAAa,GACjB,OAAO,EAAE,aAAa,IAAI,uBAAA,IAAI,8BAAQ,CAAC,sBAAsB,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;QACvD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAAuB,EAAE,CAAC;QAE/C,IAAI,aAAa,EAAE,CAAC;YAClB,eAAe,CAAC,IAAI,CAAC;gBACnB,YAAY,EAAE,YAAY;gBAC1B,cAAc;aACf,CAAC,CAAC;QACL,CAAC;QAED,KAAK,MAAM,YAAY,IAAI,cAAc,EAAE,CAAC;YAC1C,eAAe,CAAC,IAAI,CAAC;gBACnB,YAAY;gBACZ,cAAc;aACf,CAAC,CAAC;QACL,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,OAAO;gBACP,SAAS;gBACT,cAAc;gBACd,QAAQ,EAAE,EAAE;gBACZ,eAAe,EAAE,EAAE;gBACnB,SAAS;aACV,CAAC;QACJ,CAAC;QAOD,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAG1C;YACA,MAAM,EAAE,eAAe;YACvB,SAAS;YACT,aAAa,EAAE;gBACb,QAAQ,EAAE,EAAE;gBACZ,eAAe,EAAE,EAAE;aACpB;YACD,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;gBACxC,MAAM,SAAS,GAAG,MAAM,uBAAA,IAAI,uCAAiB,CAAC,cAAc,CAC1D,OAAO,EACP,KAAK,CACN,CAAC;gBAEF,OAAO,uBAAA,IAAI,0EAAyB,MAA7B,IAAI,EACT,SAAS,EACT,aAAiC,EACjC,OAAO,EACP,SAAS,EACT,SAAS,EACT,YAAY,CACb,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,SAAS;YACT,cAAc;YACd,GAAG,MAAM;YACT,SAAS;SACV,CAAC;IACJ,CAAC;CAyEF;oUAtEG,SAA8B,EAC9B,WAGC,EACD,OAAgB,EAChB,SAAoB,EACpB,SAAiB,EACjB,YAAyC;IAKzC,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,WAAW,CAAC;IAElD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,GAAG,CAAC;QACxC,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,SAAS,EAAE,QAAQ,IAAI,EAAE,CAAC;QAC3C,MAAM,gBAAgB,GAAG,uBAAA,IAAI,gEAAe,MAAnB,IAAI,EAAgB,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEhE,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,QAAQ,GACZ,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,WAAW,EAAE,CAAC;QACrE,MAAM,OAAO,GAAkB,QAAQ;YACrC,CAAC,CAAE,UAAU,cAAc,YAA8B;YACzD,CAAC,CAAE,UAAU,cAAc,UAAU,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,EAAoB,CAAC;QAE/F,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO;YACP,SAAS;YACT,OAAO;YACP,OAAO;YACP,gBAAgB;YAChB,QAAQ;YACR,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AACvC,CAAC,yEAEc,UAAkB,EAAE,QAAgB;IACjD,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC;QAEvC,MAAM,WAAW,GAAG,aAAa,GAAG,OAAO,CAAC;QAC5C,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;QAC1C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACnE,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAE5D,IAAI,iBAAiB,KAAK,EAAE,EAAE,CAAC;YAC7B,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;QAChC,CAAC;QAED,OAAO,GAAG,WAAW,IAAI,iBAAiB,EAAE,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC;IACpB,CAAC;AACH,CAAC","sourcesContent":["import { StaticIntervalPollingControllerOnly } from '@metamask/polling-controller';\nimport 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 DEFAULT_BALANCE_INTERVAL = 30_000; // 30 seconds\n\nconst ZERO_ADDRESS: Address =\n '0x0000000000000000000000000000000000000000' as Address;\n\nexport type BalanceFetcherConfig = {\n defaultBatchSize?: number;\n defaultTimeoutMs?: number;\n includeNativeByDefault?: boolean;\n /** Polling interval in ms (default: 30s) */\n pollingInterval?: number;\n};\n\n/**\n * Polling input for BalanceFetcher - identifies what to poll for.\n */\nexport type BalancePollingInput = {\n /** Chain ID (hex format) */\n chainId: ChainId;\n /** Account ID */\n accountId: AccountId;\n /** Account address */\n accountAddress: Address;\n};\n\n/**\n * Callback type for balance updates.\n */\nexport type OnBalanceUpdateCallback = (result: BalanceFetchResult) => void;\n\n/**\n * BalanceFetcher - Fetches token balances via multicall.\n * Extends StaticIntervalPollingControllerOnly for built-in polling support.\n */\nexport class BalanceFetcher extends StaticIntervalPollingControllerOnly<BalancePollingInput>() {\n readonly #multicallClient: MulticallClient;\n\n readonly #config: Required<Omit<BalanceFetcherConfig, 'pollingInterval'>>;\n\n #getUserTokensState: (() => UserTokensState) | undefined;\n\n #onBalanceUpdate: OnBalanceUpdateCallback | undefined;\n\n constructor(multicallClient: MulticallClient, config?: BalanceFetcherConfig) {\n super();\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 // Set the polling interval\n this.setIntervalLength(config?.pollingInterval ?? DEFAULT_BALANCE_INTERVAL);\n }\n\n /**\n * Set the callback to receive balance updates during polling.\n *\n * @param callback - Function to call with balance results.\n */\n setOnBalanceUpdate(callback: OnBalanceUpdateCallback): void {\n this.#onBalanceUpdate = callback;\n }\n\n setUserTokensStateGetter(getUserTokensState: () => UserTokensState): void {\n this.#getUserTokensState = getUserTokensState;\n }\n\n /**\n * Execute a poll cycle (required by base class).\n * Fetches balances and calls the update callback.\n *\n * @param input - The polling input.\n */\n async _executePoll(input: BalancePollingInput): Promise<void> {\n const result = await this.fetchBalances(\n input.chainId,\n input.accountId,\n input.accountAddress,\n );\n\n if (this.#onBalanceUpdate && result.balances.length > 0) {\n this.#onBalanceUpdate(result);\n }\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"]}
|
|
@@ -10,25 +10,55 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
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
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _TokenDetector_instances, _TokenDetector_multicallClient, _TokenDetector_config, _TokenDetector_getTokenListState, _TokenDetector_processBalanceResponses, _TokenDetector_formatBalance, _TokenDetector_getTokenMetadata, _TokenDetector_createAsset;
|
|
13
|
+
var _TokenDetector_instances, _TokenDetector_multicallClient, _TokenDetector_config, _TokenDetector_getTokenListState, _TokenDetector_onDetectionUpdate, _TokenDetector_processBalanceResponses, _TokenDetector_formatBalance, _TokenDetector_getTokenMetadata, _TokenDetector_createAsset;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.TokenDetector = void 0;
|
|
16
|
+
const polling_controller_1 = require("@metamask/polling-controller");
|
|
16
17
|
const utils_1 = require("../utils/index.cjs");
|
|
17
|
-
|
|
18
|
+
const DEFAULT_DETECTION_INTERVAL = 180000; // 3 minutes
|
|
19
|
+
/**
|
|
20
|
+
* TokenDetector - Detects tokens with non-zero balances via multicall.
|
|
21
|
+
* Extends StaticIntervalPollingControllerOnly for built-in polling support.
|
|
22
|
+
*/
|
|
23
|
+
class TokenDetector extends (0, polling_controller_1.StaticIntervalPollingControllerOnly)() {
|
|
18
24
|
constructor(multicallClient, config) {
|
|
25
|
+
super();
|
|
19
26
|
_TokenDetector_instances.add(this);
|
|
20
27
|
_TokenDetector_multicallClient.set(this, void 0);
|
|
21
28
|
_TokenDetector_config.set(this, void 0);
|
|
22
29
|
_TokenDetector_getTokenListState.set(this, void 0);
|
|
30
|
+
_TokenDetector_onDetectionUpdate.set(this, void 0);
|
|
23
31
|
__classPrivateFieldSet(this, _TokenDetector_multicallClient, multicallClient, "f");
|
|
24
32
|
__classPrivateFieldSet(this, _TokenDetector_config, {
|
|
25
33
|
defaultBatchSize: config?.defaultBatchSize ?? 300,
|
|
26
34
|
defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,
|
|
27
35
|
}, "f");
|
|
36
|
+
// Set the polling interval
|
|
37
|
+
this.setIntervalLength(config?.pollingInterval ?? DEFAULT_DETECTION_INTERVAL);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Set the callback to receive detection updates during polling.
|
|
41
|
+
*
|
|
42
|
+
* @param callback - Function to call with detection results.
|
|
43
|
+
*/
|
|
44
|
+
setOnDetectionUpdate(callback) {
|
|
45
|
+
__classPrivateFieldSet(this, _TokenDetector_onDetectionUpdate, callback, "f");
|
|
28
46
|
}
|
|
29
47
|
setTokenListStateGetter(getTokenListState) {
|
|
30
48
|
__classPrivateFieldSet(this, _TokenDetector_getTokenListState, getTokenListState, "f");
|
|
31
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Execute a poll cycle (required by base class).
|
|
52
|
+
* Detects tokens and calls the update callback.
|
|
53
|
+
*
|
|
54
|
+
* @param input - The polling input.
|
|
55
|
+
*/
|
|
56
|
+
async _executePoll(input) {
|
|
57
|
+
const result = await this.detectTokens(input.chainId, input.accountId, input.accountAddress);
|
|
58
|
+
if (__classPrivateFieldGet(this, _TokenDetector_onDetectionUpdate, "f") && result.detectedAssets.length > 0) {
|
|
59
|
+
__classPrivateFieldGet(this, _TokenDetector_onDetectionUpdate, "f").call(this, result);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
32
62
|
getTokensToCheck(chainId) {
|
|
33
63
|
const tokenListState = __classPrivateFieldGet(this, _TokenDetector_getTokenListState, "f")?.call(this);
|
|
34
64
|
if (!tokenListState) {
|
|
@@ -85,7 +115,7 @@ class TokenDetector {
|
|
|
85
115
|
}
|
|
86
116
|
}
|
|
87
117
|
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) {
|
|
118
|
+
_TokenDetector_multicallClient = new WeakMap(), _TokenDetector_config = new WeakMap(), _TokenDetector_getTokenListState = new WeakMap(), _TokenDetector_onDetectionUpdate = new WeakMap(), _TokenDetector_instances = new WeakSet(), _TokenDetector_processBalanceResponses = function _TokenDetector_processBalanceResponses(responses, accumulator, chainId, accountId, timestamp) {
|
|
89
119
|
const { detectedAssets, detectedBalances, zeroBalanceAddresses, failedAddresses, } = accumulator;
|
|
90
120
|
for (const response of responses) {
|
|
91
121
|
if (!response.success) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenDetector.cjs","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/TokenDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { StaticIntervalPollingControllerOnly } from '@metamask/polling-controller';\nimport 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\nconst DEFAULT_DETECTION_INTERVAL = 180_000; // 3 minutes\n\nexport type TokenDetectorConfig = {\n defaultBatchSize?: number;\n defaultTimeoutMs?: number;\n /** Polling interval in ms (default: 3 minutes) */\n pollingInterval?: number;\n};\n\n/**\n * Polling input for TokenDetector - identifies what to poll for.\n */\nexport type DetectionPollingInput = {\n /** Chain ID (hex format) */\n chainId: ChainId;\n /** Account ID */\n accountId: AccountId;\n /** Account address */\n accountAddress: Address;\n};\n\n/**\n * Callback type for token detection updates.\n */\nexport type OnDetectionUpdateCallback = (result: TokenDetectionResult) => void;\n\n/**\n * TokenDetector - Detects tokens with non-zero balances via multicall.\n * Extends StaticIntervalPollingControllerOnly for built-in polling support.\n */\nexport class TokenDetector extends StaticIntervalPollingControllerOnly<DetectionPollingInput>() {\n readonly #multicallClient: MulticallClient;\n\n readonly #config: Required<Omit<TokenDetectorConfig, 'pollingInterval'>>;\n\n #getTokenListState: (() => TokenListState) | undefined;\n\n #onDetectionUpdate: OnDetectionUpdateCallback | undefined;\n\n constructor(multicallClient: MulticallClient, config?: TokenDetectorConfig) {\n super();\n this.#multicallClient = multicallClient;\n this.#config = {\n defaultBatchSize: config?.defaultBatchSize ?? 300,\n defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,\n };\n\n // Set the polling interval\n this.setIntervalLength(\n config?.pollingInterval ?? DEFAULT_DETECTION_INTERVAL,\n );\n }\n\n /**\n * Set the callback to receive detection updates during polling.\n *\n * @param callback - Function to call with detection results.\n */\n setOnDetectionUpdate(callback: OnDetectionUpdateCallback): void {\n this.#onDetectionUpdate = callback;\n }\n\n setTokenListStateGetter(getTokenListState: () => TokenListState): void {\n this.#getTokenListState = getTokenListState;\n }\n\n /**\n * Execute a poll cycle (required by base class).\n * Detects tokens and calls the update callback.\n *\n * @param input - The polling input.\n */\n async _executePoll(input: DetectionPollingInput): Promise<void> {\n const result = await this.detectTokens(\n input.chainId,\n input.accountId,\n input.accountAddress,\n );\n\n if (this.#onDetectionUpdate && result.detectedAssets.length > 0) {\n this.#onDetectionUpdate(result);\n }\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,66 @@
|
|
|
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
|
+
/** Polling interval in ms (default: 3 minutes) */
|
|
7
|
+
pollingInterval?: number;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Polling input for TokenDetector - identifies what to poll for.
|
|
11
|
+
*/
|
|
12
|
+
export type DetectionPollingInput = {
|
|
13
|
+
/** Chain ID (hex format) */
|
|
14
|
+
chainId: ChainId;
|
|
15
|
+
/** Account ID */
|
|
16
|
+
accountId: AccountId;
|
|
17
|
+
/** Account address */
|
|
18
|
+
accountAddress: Address;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Callback type for token detection updates.
|
|
22
|
+
*/
|
|
23
|
+
export type OnDetectionUpdateCallback = (result: TokenDetectionResult) => void;
|
|
24
|
+
declare const TokenDetector_base: (abstract new (...args: any[]) => {
|
|
25
|
+
readonly "__#15@#intervalIds": Record<string, NodeJS.Timeout>;
|
|
26
|
+
"__#15@#intervalLength": number | undefined;
|
|
27
|
+
setIntervalLength(intervalLength: number): void;
|
|
28
|
+
getIntervalLength(): number | undefined;
|
|
29
|
+
_startPolling(input: DetectionPollingInput): void;
|
|
30
|
+
_stopPollingByPollingTokenSetId(key: string): void;
|
|
31
|
+
readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
|
|
32
|
+
readonly "__#3@#callbacks": Map<string, Set<(input: DetectionPollingInput) => void>>;
|
|
33
|
+
_executePoll(input: DetectionPollingInput): Promise<void>;
|
|
34
|
+
startPolling(input: DetectionPollingInput): string;
|
|
35
|
+
stopAllPolling(): void;
|
|
36
|
+
stopPollingByPollingToken(pollingToken: string): void;
|
|
37
|
+
onPollingComplete(input: DetectionPollingInput, callback: (input: DetectionPollingInput) => void): void;
|
|
38
|
+
}) & {
|
|
39
|
+
new (): {};
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* TokenDetector - Detects tokens with non-zero balances via multicall.
|
|
43
|
+
* Extends StaticIntervalPollingControllerOnly for built-in polling support.
|
|
44
|
+
*/
|
|
45
|
+
export declare class TokenDetector extends TokenDetector_base {
|
|
46
|
+
#private;
|
|
47
|
+
constructor(multicallClient: MulticallClient, config?: TokenDetectorConfig);
|
|
48
|
+
/**
|
|
49
|
+
* Set the callback to receive detection updates during polling.
|
|
50
|
+
*
|
|
51
|
+
* @param callback - Function to call with detection results.
|
|
52
|
+
*/
|
|
53
|
+
setOnDetectionUpdate(callback: OnDetectionUpdateCallback): void;
|
|
54
|
+
setTokenListStateGetter(getTokenListState: () => TokenListState): void;
|
|
55
|
+
/**
|
|
56
|
+
* Execute a poll cycle (required by base class).
|
|
57
|
+
* Detects tokens and calls the update callback.
|
|
58
|
+
*
|
|
59
|
+
* @param input - The polling input.
|
|
60
|
+
*/
|
|
61
|
+
_executePoll(input: DetectionPollingInput): Promise<void>;
|
|
62
|
+
getTokensToCheck(chainId: ChainId): Address[];
|
|
63
|
+
detectTokens(chainId: ChainId, accountId: AccountId, accountAddress: Address, options?: TokenDetectionOptions): Promise<TokenDetectionResult>;
|
|
64
|
+
}
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=TokenDetector.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenDetector.d.cts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/TokenDetector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,6BAAmB;AAClD,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EAKP,OAAO,EACP,qBAAqB,EACrB,oBAAoB,EAEpB,cAAc,EACf,2BAAiB;AAKlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;;;;;;;;;;;;;;;;;;AAE/E;;;GAGG;AACH,qBAAa,aAAc,SAAQ,kBAA4D;;gBASjF,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAc1E;;;;OAIG;IACH,oBAAoB,CAAC,QAAQ,EAAE,yBAAyB,GAAG,IAAI;IAI/D,uBAAuB,CAAC,iBAAiB,EAAE,MAAM,cAAc,GAAG,IAAI;IAItE;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/D,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,66 @@
|
|
|
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
|
+
/** Polling interval in ms (default: 3 minutes) */
|
|
7
|
+
pollingInterval?: number;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Polling input for TokenDetector - identifies what to poll for.
|
|
11
|
+
*/
|
|
12
|
+
export type DetectionPollingInput = {
|
|
13
|
+
/** Chain ID (hex format) */
|
|
14
|
+
chainId: ChainId;
|
|
15
|
+
/** Account ID */
|
|
16
|
+
accountId: AccountId;
|
|
17
|
+
/** Account address */
|
|
18
|
+
accountAddress: Address;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Callback type for token detection updates.
|
|
22
|
+
*/
|
|
23
|
+
export type OnDetectionUpdateCallback = (result: TokenDetectionResult) => void;
|
|
24
|
+
declare const TokenDetector_base: (abstract new (...args: any[]) => {
|
|
25
|
+
readonly "__#15@#intervalIds": Record<string, NodeJS.Timeout>;
|
|
26
|
+
"__#15@#intervalLength": number | undefined;
|
|
27
|
+
setIntervalLength(intervalLength: number): void;
|
|
28
|
+
getIntervalLength(): number | undefined;
|
|
29
|
+
_startPolling(input: DetectionPollingInput): void;
|
|
30
|
+
_stopPollingByPollingTokenSetId(key: string): void;
|
|
31
|
+
readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
|
|
32
|
+
readonly "__#3@#callbacks": Map<string, Set<(input: DetectionPollingInput) => void>>;
|
|
33
|
+
_executePoll(input: DetectionPollingInput): Promise<void>;
|
|
34
|
+
startPolling(input: DetectionPollingInput): string;
|
|
35
|
+
stopAllPolling(): void;
|
|
36
|
+
stopPollingByPollingToken(pollingToken: string): void;
|
|
37
|
+
onPollingComplete(input: DetectionPollingInput, callback: (input: DetectionPollingInput) => void): void;
|
|
38
|
+
}) & {
|
|
39
|
+
new (): {};
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* TokenDetector - Detects tokens with non-zero balances via multicall.
|
|
43
|
+
* Extends StaticIntervalPollingControllerOnly for built-in polling support.
|
|
44
|
+
*/
|
|
45
|
+
export declare class TokenDetector extends TokenDetector_base {
|
|
46
|
+
#private;
|
|
47
|
+
constructor(multicallClient: MulticallClient, config?: TokenDetectorConfig);
|
|
48
|
+
/**
|
|
49
|
+
* Set the callback to receive detection updates during polling.
|
|
50
|
+
*
|
|
51
|
+
* @param callback - Function to call with detection results.
|
|
52
|
+
*/
|
|
53
|
+
setOnDetectionUpdate(callback: OnDetectionUpdateCallback): void;
|
|
54
|
+
setTokenListStateGetter(getTokenListState: () => TokenListState): void;
|
|
55
|
+
/**
|
|
56
|
+
* Execute a poll cycle (required by base class).
|
|
57
|
+
* Detects tokens and calls the update callback.
|
|
58
|
+
*
|
|
59
|
+
* @param input - The polling input.
|
|
60
|
+
*/
|
|
61
|
+
_executePoll(input: DetectionPollingInput): Promise<void>;
|
|
62
|
+
getTokensToCheck(chainId: ChainId): Address[];
|
|
63
|
+
detectTokens(chainId: ChainId, accountId: AccountId, accountAddress: Address, options?: TokenDetectionOptions): Promise<TokenDetectionResult>;
|
|
64
|
+
}
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=TokenDetector.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenDetector.d.mts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/TokenDetector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,6BAAmB;AAClD,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EAKP,OAAO,EACP,qBAAqB,EACrB,oBAAoB,EAEpB,cAAc,EACf,2BAAiB;AAKlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;;;;;;;;;;;;;;;;;;AAE/E;;;GAGG;AACH,qBAAa,aAAc,SAAQ,kBAA4D;;gBASjF,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAc1E;;;;OAIG;IACH,oBAAoB,CAAC,QAAQ,EAAE,yBAAyB,GAAG,IAAI;IAI/D,uBAAuB,CAAC,iBAAiB,EAAE,MAAM,cAAc,GAAG,IAAI;IAItE;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/D,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"}
|
|
@@ -9,23 +9,53 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
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
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _TokenDetector_instances, _TokenDetector_multicallClient, _TokenDetector_config, _TokenDetector_getTokenListState, _TokenDetector_processBalanceResponses, _TokenDetector_formatBalance, _TokenDetector_getTokenMetadata, _TokenDetector_createAsset;
|
|
12
|
+
var _TokenDetector_instances, _TokenDetector_multicallClient, _TokenDetector_config, _TokenDetector_getTokenListState, _TokenDetector_onDetectionUpdate, _TokenDetector_processBalanceResponses, _TokenDetector_formatBalance, _TokenDetector_getTokenMetadata, _TokenDetector_createAsset;
|
|
13
|
+
import { StaticIntervalPollingControllerOnly } from "@metamask/polling-controller";
|
|
13
14
|
import { reduceInBatchesSerially } from "../utils/index.mjs";
|
|
14
|
-
|
|
15
|
+
const DEFAULT_DETECTION_INTERVAL = 180000; // 3 minutes
|
|
16
|
+
/**
|
|
17
|
+
* TokenDetector - Detects tokens with non-zero balances via multicall.
|
|
18
|
+
* Extends StaticIntervalPollingControllerOnly for built-in polling support.
|
|
19
|
+
*/
|
|
20
|
+
export class TokenDetector extends StaticIntervalPollingControllerOnly() {
|
|
15
21
|
constructor(multicallClient, config) {
|
|
22
|
+
super();
|
|
16
23
|
_TokenDetector_instances.add(this);
|
|
17
24
|
_TokenDetector_multicallClient.set(this, void 0);
|
|
18
25
|
_TokenDetector_config.set(this, void 0);
|
|
19
26
|
_TokenDetector_getTokenListState.set(this, void 0);
|
|
27
|
+
_TokenDetector_onDetectionUpdate.set(this, void 0);
|
|
20
28
|
__classPrivateFieldSet(this, _TokenDetector_multicallClient, multicallClient, "f");
|
|
21
29
|
__classPrivateFieldSet(this, _TokenDetector_config, {
|
|
22
30
|
defaultBatchSize: config?.defaultBatchSize ?? 300,
|
|
23
31
|
defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,
|
|
24
32
|
}, "f");
|
|
33
|
+
// Set the polling interval
|
|
34
|
+
this.setIntervalLength(config?.pollingInterval ?? DEFAULT_DETECTION_INTERVAL);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Set the callback to receive detection updates during polling.
|
|
38
|
+
*
|
|
39
|
+
* @param callback - Function to call with detection results.
|
|
40
|
+
*/
|
|
41
|
+
setOnDetectionUpdate(callback) {
|
|
42
|
+
__classPrivateFieldSet(this, _TokenDetector_onDetectionUpdate, callback, "f");
|
|
25
43
|
}
|
|
26
44
|
setTokenListStateGetter(getTokenListState) {
|
|
27
45
|
__classPrivateFieldSet(this, _TokenDetector_getTokenListState, getTokenListState, "f");
|
|
28
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Execute a poll cycle (required by base class).
|
|
49
|
+
* Detects tokens and calls the update callback.
|
|
50
|
+
*
|
|
51
|
+
* @param input - The polling input.
|
|
52
|
+
*/
|
|
53
|
+
async _executePoll(input) {
|
|
54
|
+
const result = await this.detectTokens(input.chainId, input.accountId, input.accountAddress);
|
|
55
|
+
if (__classPrivateFieldGet(this, _TokenDetector_onDetectionUpdate, "f") && result.detectedAssets.length > 0) {
|
|
56
|
+
__classPrivateFieldGet(this, _TokenDetector_onDetectionUpdate, "f").call(this, result);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
29
59
|
getTokensToCheck(chainId) {
|
|
30
60
|
const tokenListState = __classPrivateFieldGet(this, _TokenDetector_getTokenListState, "f")?.call(this);
|
|
31
61
|
if (!tokenListState) {
|
|
@@ -81,7 +111,7 @@ export class TokenDetector {
|
|
|
81
111
|
};
|
|
82
112
|
}
|
|
83
113
|
}
|
|
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) {
|
|
114
|
+
_TokenDetector_multicallClient = new WeakMap(), _TokenDetector_config = new WeakMap(), _TokenDetector_getTokenListState = new WeakMap(), _TokenDetector_onDetectionUpdate = new WeakMap(), _TokenDetector_instances = new WeakSet(), _TokenDetector_processBalanceResponses = function _TokenDetector_processBalanceResponses(responses, accumulator, chainId, accountId, timestamp) {
|
|
85
115
|
const { detectedAssets, detectedBalances, zeroBalanceAddresses, failedAddresses, } = accumulator;
|
|
86
116
|
for (const response of responses) {
|
|
87
117
|
if (!response.success) {
|