@metamask-previews/assets-controllers 73.0.1-preview-bf50b46b → 73.0.1-preview-e4e5ca5c
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 +1 -13
- package/dist/AccountTrackerController.cjs +5 -167
- package/dist/AccountTrackerController.cjs.map +1 -1
- package/dist/AccountTrackerController.d.cts +2 -14
- package/dist/AccountTrackerController.d.cts.map +1 -1
- package/dist/AccountTrackerController.d.mts +2 -14
- package/dist/AccountTrackerController.d.mts.map +1 -1
- package/dist/AccountTrackerController.mjs +5 -167
- package/dist/AccountTrackerController.mjs.map +1 -1
- package/dist/TokenBalancesController.cjs +321 -267
- package/dist/TokenBalancesController.cjs.map +1 -1
- package/dist/TokenBalancesController.d.cts +93 -51
- package/dist/TokenBalancesController.d.cts.map +1 -1
- package/dist/TokenBalancesController.d.mts +93 -51
- package/dist/TokenBalancesController.d.mts.map +1 -1
- package/dist/TokenBalancesController.mjs +320 -270
- package/dist/TokenBalancesController.mjs.map +1 -1
- package/dist/assetsUtil.cjs +1 -13
- package/dist/assetsUtil.cjs.map +1 -1
- package/dist/assetsUtil.d.cts +0 -8
- package/dist/assetsUtil.d.cts.map +1 -1
- package/dist/assetsUtil.d.mts +0 -8
- package/dist/assetsUtil.d.mts.map +1 -1
- package/dist/assetsUtil.mjs +1 -12
- package/dist/assetsUtil.mjs.map +1 -1
- package/dist/constants.cjs +1 -12
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +0 -1
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +0 -1
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +0 -11
- package/dist/constants.mjs.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/multi-chain-accounts-service/multi-chain-accounts.cjs +1 -35
- package/dist/multi-chain-accounts-service/multi-chain-accounts.cjs.map +1 -1
- package/dist/multi-chain-accounts-service/multi-chain-accounts.d.cts +0 -16
- package/dist/multi-chain-accounts-service/multi-chain-accounts.d.cts.map +1 -1
- package/dist/multi-chain-accounts-service/multi-chain-accounts.d.mts +0 -16
- package/dist/multi-chain-accounts-service/multi-chain-accounts.d.mts.map +1 -1
- package/dist/multi-chain-accounts-service/multi-chain-accounts.mjs +0 -33
- package/dist/multi-chain-accounts-service/multi-chain-accounts.mjs.map +1 -1
- package/dist/multi-chain-accounts-service/types.cjs.map +1 -1
- package/dist/multi-chain-accounts-service/types.d.cts +0 -8
- package/dist/multi-chain-accounts-service/types.d.cts.map +1 -1
- package/dist/multi-chain-accounts-service/types.d.mts +0 -8
- package/dist/multi-chain-accounts-service/types.d.mts.map +1 -1
- package/dist/multi-chain-accounts-service/types.mjs.map +1 -1
- package/dist/multicall.cjs +22 -397
- package/dist/multicall.cjs.map +1 -1
- package/dist/multicall.d.cts +0 -39
- package/dist/multicall.d.cts.map +1 -1
- package/dist/multicall.d.mts +0 -39
- package/dist/multicall.d.mts.map +1 -1
- package/dist/multicall.mjs +21 -398
- package/dist/multicall.mjs.map +1 -1
- package/dist/selectors/balanceSelectors.cjs +275 -0
- package/dist/selectors/balanceSelectors.cjs.map +1 -0
- package/dist/selectors/balanceSelectors.d.cts +248 -0
- package/dist/selectors/balanceSelectors.d.cts.map +1 -0
- package/dist/selectors/balanceSelectors.d.mts +248 -0
- package/dist/selectors/balanceSelectors.d.mts.map +1 -0
- package/dist/selectors/balanceSelectors.mjs +268 -0
- package/dist/selectors/balanceSelectors.mjs.map +1 -0
- package/package.json +6 -3
- package/dist/multi-chain-accounts-service/api-balance-fetcher.cjs +0 -98
- package/dist/multi-chain-accounts-service/api-balance-fetcher.cjs.map +0 -1
- package/dist/multi-chain-accounts-service/api-balance-fetcher.d.cts +0 -28
- package/dist/multi-chain-accounts-service/api-balance-fetcher.d.cts.map +0 -1
- package/dist/multi-chain-accounts-service/api-balance-fetcher.d.mts +0 -28
- package/dist/multi-chain-accounts-service/api-balance-fetcher.d.mts.map +0 -1
- package/dist/multi-chain-accounts-service/api-balance-fetcher.mjs +0 -98
- package/dist/multi-chain-accounts-service/api-balance-fetcher.mjs.map +0 -1
- package/dist/rpc-service/rpc-balance-fetcher.cjs +0 -128
- package/dist/rpc-service/rpc-balance-fetcher.cjs.map +0 -1
- package/dist/rpc-service/rpc-balance-fetcher.d.cts +0 -34
- package/dist/rpc-service/rpc-balance-fetcher.d.cts.map +0 -1
- package/dist/rpc-service/rpc-balance-fetcher.d.mts +0 -34
- package/dist/rpc-service/rpc-balance-fetcher.d.mts.map +0 -1
- package/dist/rpc-service/rpc-balance-fetcher.mjs +0 -124
- package/dist/rpc-service/rpc-balance-fetcher.mjs.map +0 -1
- package/dist/selectors.cjs +0 -64
- package/dist/selectors.cjs.map +0 -1
- package/dist/selectors.d.cts +0 -51
- package/dist/selectors.d.cts.map +0 -1
- package/dist/selectors.d.mts +0 -51
- package/dist/selectors.d.mts.map +0 -1
- package/dist/selectors.mjs +0 -61
- package/dist/selectors.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-balance-fetcher.mjs","sourceRoot":"","sources":["../../src/multi-chain-accounts-service/api-balance-fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n safelyExecute,\n toHex,\n toChecksumHexAddress,\n} from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { CaipAccountAddress, Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { fetchMultiChainBalancesV4 } from './multi-chain-accounts';\nimport {\n accountAddressToCaipReference,\n reduceInBatchesSerially,\n} from '../assetsUtil';\nimport { SUPPORTED_NETWORKS_ACCOUNTS_API_V4 } from '../constants';\n\n// Maximum number of account addresses that can be sent to the accounts API in a single request\nconst ACCOUNTS_API_BATCH_SIZE = 50;\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n success: boolean;\n value?: BN;\n account: ChecksumAddress;\n token: ChecksumAddress;\n chainId: ChainIdHex;\n};\n\nexport type BalanceFetcher = {\n supports(chainId: ChainIdHex): boolean;\n fetch(input: {\n chainIds: ChainIdHex[];\n queryAllAccounts: boolean;\n selectedAccount: ChecksumAddress;\n allAccounts: InternalAccount[];\n }): Promise<ProcessedBalance[]>;\n};\n\nconst checksum = (addr: string): ChecksumAddress =>\n toChecksumHexAddress(addr) as ChecksumAddress;\n\nconst toCaipAccount = (\n chainId: ChainIdHex,\n account: ChecksumAddress,\n): CaipAccountAddress => accountAddressToCaipReference(chainId, account);\n\nexport class AccountsApiBalanceFetcher implements BalanceFetcher {\n readonly #platform: 'extension' | 'mobile' = 'extension';\n\n constructor(platform: 'extension' | 'mobile' = 'extension') {\n this.#platform = platform;\n }\n\n supports(chainId: ChainIdHex): boolean {\n return SUPPORTED_NETWORKS_ACCOUNTS_API_V4.includes(chainId);\n }\n\n async #fetchBalances(addrs: CaipAccountAddress[]) {\n // If we have fewer than or equal to the batch size, make a single request\n if (addrs.length <= ACCOUNTS_API_BATCH_SIZE) {\n const { balances } = await fetchMultiChainBalancesV4(\n { accountAddresses: addrs },\n this.#platform,\n );\n return balances;\n }\n\n // Otherwise, batch the requests to respect the 50-element limit\n type BalanceData = Awaited<\n ReturnType<typeof fetchMultiChainBalancesV4>\n >['balances'][number];\n\n const allBalances = await reduceInBatchesSerially<\n CaipAccountAddress,\n BalanceData[]\n >({\n values: addrs,\n batchSize: ACCOUNTS_API_BATCH_SIZE,\n eachBatch: async (workingResult, batch) => {\n const { balances } = await fetchMultiChainBalancesV4(\n { accountAddresses: batch },\n this.#platform,\n );\n return [...(workingResult || []), ...balances];\n },\n initialResult: [],\n });\n\n return allBalances;\n }\n\n async fetch({\n chainIds,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n }: Parameters<BalanceFetcher['fetch']>[0]): Promise<ProcessedBalance[]> {\n const caipAddrs: CaipAccountAddress[] = [];\n\n for (const chainId of chainIds.filter((c) => this.supports(c))) {\n if (queryAllAccounts) {\n allAccounts.forEach((a) =>\n caipAddrs.push(toCaipAccount(chainId, a.address as ChecksumAddress)),\n );\n } else {\n caipAddrs.push(toCaipAccount(chainId, selectedAccount));\n }\n }\n\n if (!caipAddrs.length) {\n return [];\n }\n\n const balances = await safelyExecute(() => this.#fetchBalances(caipAddrs));\n if (!balances) {\n return [];\n }\n\n return balances.flatMap((b) => {\n const account = b.accountAddress?.split(':')[2] as ChecksumAddress;\n if (!account) {\n return [];\n }\n const token = checksum(b.address);\n const chainId = toHex(b.chainId) as ChainIdHex;\n\n let value: BN | undefined;\n try {\n value = new BN((parseFloat(b.balance) * 10 ** b.decimals).toFixed(0));\n } catch {\n value = undefined;\n }\n\n return [\n {\n success: value !== undefined,\n value,\n account,\n token,\n chainId,\n },\n ];\n });\n }\n}\n"]}
|
|
@@ -1,128 +0,0 @@
|
|
|
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 _RpcBalanceFetcher_instances, _RpcBalanceFetcher_getProvider, _RpcBalanceFetcher_getNetworkClient, _RpcBalanceFetcher_getTokensState, _RpcBalanceFetcher_ensureFreshBlockData;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.RpcBalanceFetcher = void 0;
|
|
16
|
-
const controller_utils_1 = require("@metamask/controller-utils");
|
|
17
|
-
const multicall_1 = require("../multicall.cjs");
|
|
18
|
-
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
19
|
-
const checksum = (addr) => (0, controller_utils_1.toChecksumHexAddress)(addr);
|
|
20
|
-
class RpcBalanceFetcher {
|
|
21
|
-
constructor(getProvider, getNetworkClient, getTokensState) {
|
|
22
|
-
_RpcBalanceFetcher_instances.add(this);
|
|
23
|
-
_RpcBalanceFetcher_getProvider.set(this, void 0);
|
|
24
|
-
_RpcBalanceFetcher_getNetworkClient.set(this, void 0);
|
|
25
|
-
_RpcBalanceFetcher_getTokensState.set(this, void 0);
|
|
26
|
-
__classPrivateFieldSet(this, _RpcBalanceFetcher_getProvider, getProvider, "f");
|
|
27
|
-
__classPrivateFieldSet(this, _RpcBalanceFetcher_getNetworkClient, getNetworkClient, "f");
|
|
28
|
-
__classPrivateFieldSet(this, _RpcBalanceFetcher_getTokensState, getTokensState, "f");
|
|
29
|
-
}
|
|
30
|
-
supports() {
|
|
31
|
-
return true; // fallback – supports every chain
|
|
32
|
-
}
|
|
33
|
-
async fetch({ chainIds, queryAllAccounts, selectedAccount, allAccounts, }) {
|
|
34
|
-
const results = [];
|
|
35
|
-
for (const chainId of chainIds) {
|
|
36
|
-
const tokensState = __classPrivateFieldGet(this, _RpcBalanceFetcher_getTokensState, "f").call(this);
|
|
37
|
-
const accountTokenGroups = buildAccountTokenGroupsStatic(chainId, queryAllAccounts, selectedAccount, allAccounts, tokensState.allTokens, tokensState.allDetectedTokens);
|
|
38
|
-
if (!accountTokenGroups.length) {
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
const provider = __classPrivateFieldGet(this, _RpcBalanceFetcher_getProvider, "f").call(this, chainId);
|
|
42
|
-
await __classPrivateFieldGet(this, _RpcBalanceFetcher_instances, "m", _RpcBalanceFetcher_ensureFreshBlockData).call(this, chainId);
|
|
43
|
-
const { tokenBalances } = await (0, multicall_1.getTokenBalancesForMultipleAddresses)(accountTokenGroups, chainId, provider, true, // include native
|
|
44
|
-
false);
|
|
45
|
-
Object.entries(tokenBalances).forEach(([tokenAddr, balances]) => {
|
|
46
|
-
Object.entries(balances).forEach(([acct, bn]) => {
|
|
47
|
-
results.push({
|
|
48
|
-
success: bn !== null,
|
|
49
|
-
value: bn,
|
|
50
|
-
account: acct,
|
|
51
|
-
token: checksum(tokenAddr),
|
|
52
|
-
chainId,
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
return results;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
exports.RpcBalanceFetcher = RpcBalanceFetcher;
|
|
61
|
-
_RpcBalanceFetcher_getProvider = new WeakMap(), _RpcBalanceFetcher_getNetworkClient = new WeakMap(), _RpcBalanceFetcher_getTokensState = new WeakMap(), _RpcBalanceFetcher_instances = new WeakSet(), _RpcBalanceFetcher_ensureFreshBlockData =
|
|
62
|
-
/**
|
|
63
|
-
* Ensures that the block tracker has the latest block data before performing multicall operations.
|
|
64
|
-
* This is a temporary fix to ensure that the block number is up to date.
|
|
65
|
-
*
|
|
66
|
-
* @param chainId - The chain id to update block data for.
|
|
67
|
-
*/
|
|
68
|
-
async function _RpcBalanceFetcher_ensureFreshBlockData(chainId) {
|
|
69
|
-
// Force fresh block data before multicall
|
|
70
|
-
// TODO: This is a temporary fix to ensure that the block number is up to date.
|
|
71
|
-
// We should remove this once we have a better solution for this on the block tracker controller.
|
|
72
|
-
const networkClient = __classPrivateFieldGet(this, _RpcBalanceFetcher_getNetworkClient, "f").call(this, chainId);
|
|
73
|
-
await networkClient.blockTracker?.checkForLatestBlock?.();
|
|
74
|
-
};
|
|
75
|
-
/**
|
|
76
|
-
* Merges imported & detected tokens for the requested chain and returns a list
|
|
77
|
-
* of `{ accountAddress, tokenAddresses[] }` suitable for getTokenBalancesForMultipleAddresses.
|
|
78
|
-
*
|
|
79
|
-
* @param chainId - The chain ID to build account token groups for
|
|
80
|
-
* @param queryAllAccounts - Whether to query all accounts or just the selected one
|
|
81
|
-
* @param selectedAccount - The currently selected account
|
|
82
|
-
* @param allAccounts - All available accounts
|
|
83
|
-
* @param allTokens - All tokens from TokensController
|
|
84
|
-
* @param allDetectedTokens - All detected tokens from TokensController
|
|
85
|
-
* @returns Array of account/token groups for multicall
|
|
86
|
-
*/
|
|
87
|
-
function buildAccountTokenGroupsStatic(chainId, queryAllAccounts, selectedAccount, allAccounts, allTokens, allDetectedTokens) {
|
|
88
|
-
const pairs = [];
|
|
89
|
-
const add = ([account, tokens]) => {
|
|
90
|
-
const shouldInclude = queryAllAccounts || checksum(account) === checksum(selectedAccount);
|
|
91
|
-
if (!shouldInclude) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
tokens.forEach((t) => pairs.push({
|
|
95
|
-
accountAddress: account,
|
|
96
|
-
tokenAddress: checksum(t.address),
|
|
97
|
-
}));
|
|
98
|
-
};
|
|
99
|
-
Object.entries(allTokens[chainId] ?? {}).forEach(add);
|
|
100
|
-
Object.entries(allDetectedTokens[chainId] ?? {}).forEach(add);
|
|
101
|
-
if (queryAllAccounts) {
|
|
102
|
-
allAccounts.forEach((a) => {
|
|
103
|
-
pairs.push({
|
|
104
|
-
accountAddress: a.address,
|
|
105
|
-
tokenAddress: ZERO_ADDRESS,
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
if (!pairs.length) {
|
|
110
|
-
return [];
|
|
111
|
-
}
|
|
112
|
-
// group by account
|
|
113
|
-
const map = new Map();
|
|
114
|
-
pairs.forEach(({ accountAddress, tokenAddress }) => {
|
|
115
|
-
if (!map.has(accountAddress)) {
|
|
116
|
-
map.set(accountAddress, []);
|
|
117
|
-
}
|
|
118
|
-
const tokens = map.get(accountAddress);
|
|
119
|
-
if (tokens) {
|
|
120
|
-
tokens.push(tokenAddress);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
return Array.from(map.entries()).map(([accountAddress, tokenAddresses]) => ({
|
|
124
|
-
accountAddress,
|
|
125
|
-
tokenAddresses,
|
|
126
|
-
}));
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=rpc-balance-fetcher.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-balance-fetcher.cjs","sourceRoot":"","sources":["../../src/rpc-service/rpc-balance-fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Web3Provider } from '@ethersproject/providers';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkClient } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport type BN from 'bn.js';\n\nimport { getTokenBalancesForMultipleAddresses } from '../multicall';\nimport type { TokensControllerState } from '../TokensController';\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n success: boolean;\n value?: BN;\n account: ChecksumAddress;\n token: ChecksumAddress;\n chainId: ChainIdHex;\n};\n\nexport type BalanceFetcher = {\n supports(chainId: ChainIdHex): boolean;\n fetch(input: {\n chainIds: ChainIdHex[];\n queryAllAccounts: boolean;\n selectedAccount: ChecksumAddress;\n allAccounts: InternalAccount[];\n }): Promise<ProcessedBalance[]>;\n};\n\nconst ZERO_ADDRESS =\n '0x0000000000000000000000000000000000000000' as ChecksumAddress;\n\nconst checksum = (addr: string): ChecksumAddress =>\n toChecksumHexAddress(addr) as ChecksumAddress;\n\nexport class RpcBalanceFetcher implements BalanceFetcher {\n readonly #getProvider: (chainId: ChainIdHex) => Web3Provider;\n\n readonly #getNetworkClient: (chainId: ChainIdHex) => NetworkClient;\n\n readonly #getTokensState: () => {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n };\n\n constructor(\n getProvider: (chainId: ChainIdHex) => Web3Provider,\n getNetworkClient: (chainId: ChainIdHex) => NetworkClient,\n getTokensState: () => {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n },\n ) {\n this.#getProvider = getProvider;\n this.#getNetworkClient = getNetworkClient;\n this.#getTokensState = getTokensState;\n }\n\n supports(): boolean {\n return true; // fallback – supports every chain\n }\n\n async fetch({\n chainIds,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n }: Parameters<BalanceFetcher['fetch']>[0]): Promise<ProcessedBalance[]> {\n const results: ProcessedBalance[] = [];\n\n for (const chainId of chainIds) {\n const tokensState = this.#getTokensState();\n const accountTokenGroups = buildAccountTokenGroupsStatic(\n chainId,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n tokensState.allTokens,\n tokensState.allDetectedTokens,\n );\n if (!accountTokenGroups.length) {\n continue;\n }\n\n const provider = this.#getProvider(chainId);\n await this.#ensureFreshBlockData(chainId);\n\n const { tokenBalances } = await getTokenBalancesForMultipleAddresses(\n accountTokenGroups,\n chainId,\n provider,\n true, // include native\n false, // include staked\n );\n\n Object.entries(tokenBalances).forEach(([tokenAddr, balances]) => {\n Object.entries(balances).forEach(([acct, bn]) => {\n results.push({\n success: bn !== null,\n value: bn as BN,\n account: acct as ChecksumAddress,\n token: checksum(tokenAddr),\n chainId,\n });\n });\n });\n }\n\n return results;\n }\n\n /**\n * Ensures that the block tracker has the latest block data before performing multicall operations.\n * This is a temporary fix to ensure that the block number is up to date.\n *\n * @param chainId - The chain id to update block data for.\n */\n async #ensureFreshBlockData(chainId: Hex): Promise<void> {\n // Force fresh block data before multicall\n // TODO: This is a temporary fix to ensure that the block number is up to date.\n // We should remove this once we have a better solution for this on the block tracker controller.\n const networkClient = this.#getNetworkClient(chainId);\n await networkClient.blockTracker?.checkForLatestBlock?.();\n }\n}\n\n/**\n * Merges imported & detected tokens for the requested chain and returns a list\n * of `{ accountAddress, tokenAddresses[] }` suitable for getTokenBalancesForMultipleAddresses.\n *\n * @param chainId - The chain ID to build account token groups for\n * @param queryAllAccounts - Whether to query all accounts or just the selected one\n * @param selectedAccount - The currently selected account\n * @param allAccounts - All available accounts\n * @param allTokens - All tokens from TokensController\n * @param allDetectedTokens - All detected tokens from TokensController\n * @returns Array of account/token groups for multicall\n */\nfunction buildAccountTokenGroupsStatic(\n chainId: ChainIdHex,\n queryAllAccounts: boolean,\n selectedAccount: ChecksumAddress,\n allAccounts: InternalAccount[],\n allTokens: TokensControllerState['allTokens'],\n allDetectedTokens: TokensControllerState['allDetectedTokens'],\n): { accountAddress: ChecksumAddress; tokenAddresses: ChecksumAddress[] }[] {\n const pairs: {\n accountAddress: ChecksumAddress;\n tokenAddress: ChecksumAddress;\n }[] = [];\n\n const add = ([account, tokens]: [string, unknown[]]) => {\n const shouldInclude =\n queryAllAccounts || checksum(account) === checksum(selectedAccount);\n if (!shouldInclude) {\n return;\n }\n (tokens as unknown[]).forEach((t: unknown) =>\n pairs.push({\n accountAddress: account as ChecksumAddress,\n tokenAddress: checksum((t as { address: string }).address),\n }),\n );\n };\n\n Object.entries(allTokens[chainId] ?? {}).forEach(\n add as (entry: [string, unknown]) => void,\n );\n Object.entries(allDetectedTokens[chainId] ?? {}).forEach(\n add as (entry: [string, unknown]) => void,\n );\n\n if (queryAllAccounts) {\n allAccounts.forEach((a) => {\n pairs.push({\n accountAddress: a.address as ChecksumAddress,\n tokenAddress: ZERO_ADDRESS,\n });\n });\n }\n\n if (!pairs.length) {\n return [];\n }\n\n // group by account\n const map = new Map<ChecksumAddress, ChecksumAddress[]>();\n pairs.forEach(({ accountAddress, tokenAddress }) => {\n if (!map.has(accountAddress)) {\n map.set(accountAddress, []);\n }\n const tokens = map.get(accountAddress);\n if (tokens) {\n tokens.push(tokenAddress);\n }\n });\n\n return Array.from(map.entries()).map(([accountAddress, tokenAddresses]) => ({\n accountAddress,\n tokenAddresses,\n }));\n}\n"]}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import type { Web3Provider } from "@ethersproject/providers";
|
|
2
|
-
import type { InternalAccount } from "@metamask/keyring-internal-api";
|
|
3
|
-
import type { NetworkClient } from "@metamask/network-controller";
|
|
4
|
-
import type { Hex } from "@metamask/utils";
|
|
5
|
-
import type BN from "bn.js";
|
|
6
|
-
import type { TokensControllerState } from "../TokensController.cjs";
|
|
7
|
-
export type ChainIdHex = Hex;
|
|
8
|
-
export type ChecksumAddress = Hex;
|
|
9
|
-
export type ProcessedBalance = {
|
|
10
|
-
success: boolean;
|
|
11
|
-
value?: BN;
|
|
12
|
-
account: ChecksumAddress;
|
|
13
|
-
token: ChecksumAddress;
|
|
14
|
-
chainId: ChainIdHex;
|
|
15
|
-
};
|
|
16
|
-
export type BalanceFetcher = {
|
|
17
|
-
supports(chainId: ChainIdHex): boolean;
|
|
18
|
-
fetch(input: {
|
|
19
|
-
chainIds: ChainIdHex[];
|
|
20
|
-
queryAllAccounts: boolean;
|
|
21
|
-
selectedAccount: ChecksumAddress;
|
|
22
|
-
allAccounts: InternalAccount[];
|
|
23
|
-
}): Promise<ProcessedBalance[]>;
|
|
24
|
-
};
|
|
25
|
-
export declare class RpcBalanceFetcher implements BalanceFetcher {
|
|
26
|
-
#private;
|
|
27
|
-
constructor(getProvider: (chainId: ChainIdHex) => Web3Provider, getNetworkClient: (chainId: ChainIdHex) => NetworkClient, getTokensState: () => {
|
|
28
|
-
allTokens: TokensControllerState['allTokens'];
|
|
29
|
-
allDetectedTokens: TokensControllerState['allDetectedTokens'];
|
|
30
|
-
});
|
|
31
|
-
supports(): boolean;
|
|
32
|
-
fetch({ chainIds, queryAllAccounts, selectedAccount, allAccounts, }: Parameters<BalanceFetcher['fetch']>[0]): Promise<ProcessedBalance[]>;
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=rpc-balance-fetcher.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-balance-fetcher.d.cts","sourceRoot":"","sources":["../../src/rpc-service/rpc-balance-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,qCAAqC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,KAAK,EAAE,cAAc;AAG5B,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC;AAC7B,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC;AAElC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,EAAE,CAAC;IACX,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;IACvC,KAAK,CAAC,KAAK,EAAE;QACX,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,eAAe,EAAE,eAAe,CAAC;QACjC,WAAW,EAAE,eAAe,EAAE,CAAC;KAChC,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CACjC,CAAC;AAQF,qBAAa,iBAAkB,YAAW,cAAc;;gBAWpD,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,YAAY,EAClD,gBAAgB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,aAAa,EACxD,cAAc,EAAE,MAAM;QACpB,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAC9C,iBAAiB,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;KAC/D;IAOH,QAAQ,IAAI,OAAO;IAIb,KAAK,CAAC,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,EAAE,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAyDxE"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import type { Web3Provider } from "@ethersproject/providers";
|
|
2
|
-
import type { InternalAccount } from "@metamask/keyring-internal-api";
|
|
3
|
-
import type { NetworkClient } from "@metamask/network-controller";
|
|
4
|
-
import type { Hex } from "@metamask/utils";
|
|
5
|
-
import type BN from "bn.js";
|
|
6
|
-
import type { TokensControllerState } from "../TokensController.mjs";
|
|
7
|
-
export type ChainIdHex = Hex;
|
|
8
|
-
export type ChecksumAddress = Hex;
|
|
9
|
-
export type ProcessedBalance = {
|
|
10
|
-
success: boolean;
|
|
11
|
-
value?: BN;
|
|
12
|
-
account: ChecksumAddress;
|
|
13
|
-
token: ChecksumAddress;
|
|
14
|
-
chainId: ChainIdHex;
|
|
15
|
-
};
|
|
16
|
-
export type BalanceFetcher = {
|
|
17
|
-
supports(chainId: ChainIdHex): boolean;
|
|
18
|
-
fetch(input: {
|
|
19
|
-
chainIds: ChainIdHex[];
|
|
20
|
-
queryAllAccounts: boolean;
|
|
21
|
-
selectedAccount: ChecksumAddress;
|
|
22
|
-
allAccounts: InternalAccount[];
|
|
23
|
-
}): Promise<ProcessedBalance[]>;
|
|
24
|
-
};
|
|
25
|
-
export declare class RpcBalanceFetcher implements BalanceFetcher {
|
|
26
|
-
#private;
|
|
27
|
-
constructor(getProvider: (chainId: ChainIdHex) => Web3Provider, getNetworkClient: (chainId: ChainIdHex) => NetworkClient, getTokensState: () => {
|
|
28
|
-
allTokens: TokensControllerState['allTokens'];
|
|
29
|
-
allDetectedTokens: TokensControllerState['allDetectedTokens'];
|
|
30
|
-
});
|
|
31
|
-
supports(): boolean;
|
|
32
|
-
fetch({ chainIds, queryAllAccounts, selectedAccount, allAccounts, }: Parameters<BalanceFetcher['fetch']>[0]): Promise<ProcessedBalance[]>;
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=rpc-balance-fetcher.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-balance-fetcher.d.mts","sourceRoot":"","sources":["../../src/rpc-service/rpc-balance-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,qCAAqC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,KAAK,EAAE,cAAc;AAG5B,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC;AAC7B,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC;AAElC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,EAAE,CAAC;IACX,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;IACvC,KAAK,CAAC,KAAK,EAAE;QACX,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,eAAe,EAAE,eAAe,CAAC;QACjC,WAAW,EAAE,eAAe,EAAE,CAAC;KAChC,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CACjC,CAAC;AAQF,qBAAa,iBAAkB,YAAW,cAAc;;gBAWpD,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,YAAY,EAClD,gBAAgB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,aAAa,EACxD,cAAc,EAAE,MAAM;QACpB,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAC9C,iBAAiB,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;KAC/D;IAOH,QAAQ,IAAI,OAAO;IAIb,KAAK,CAAC,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,EAAE,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAyDxE"}
|
|
@@ -1,124 +0,0 @@
|
|
|
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 _RpcBalanceFetcher_instances, _RpcBalanceFetcher_getProvider, _RpcBalanceFetcher_getNetworkClient, _RpcBalanceFetcher_getTokensState, _RpcBalanceFetcher_ensureFreshBlockData;
|
|
13
|
-
import { toChecksumHexAddress } from "@metamask/controller-utils";
|
|
14
|
-
import { getTokenBalancesForMultipleAddresses } from "../multicall.mjs";
|
|
15
|
-
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
16
|
-
const checksum = (addr) => toChecksumHexAddress(addr);
|
|
17
|
-
export class RpcBalanceFetcher {
|
|
18
|
-
constructor(getProvider, getNetworkClient, getTokensState) {
|
|
19
|
-
_RpcBalanceFetcher_instances.add(this);
|
|
20
|
-
_RpcBalanceFetcher_getProvider.set(this, void 0);
|
|
21
|
-
_RpcBalanceFetcher_getNetworkClient.set(this, void 0);
|
|
22
|
-
_RpcBalanceFetcher_getTokensState.set(this, void 0);
|
|
23
|
-
__classPrivateFieldSet(this, _RpcBalanceFetcher_getProvider, getProvider, "f");
|
|
24
|
-
__classPrivateFieldSet(this, _RpcBalanceFetcher_getNetworkClient, getNetworkClient, "f");
|
|
25
|
-
__classPrivateFieldSet(this, _RpcBalanceFetcher_getTokensState, getTokensState, "f");
|
|
26
|
-
}
|
|
27
|
-
supports() {
|
|
28
|
-
return true; // fallback – supports every chain
|
|
29
|
-
}
|
|
30
|
-
async fetch({ chainIds, queryAllAccounts, selectedAccount, allAccounts, }) {
|
|
31
|
-
const results = [];
|
|
32
|
-
for (const chainId of chainIds) {
|
|
33
|
-
const tokensState = __classPrivateFieldGet(this, _RpcBalanceFetcher_getTokensState, "f").call(this);
|
|
34
|
-
const accountTokenGroups = buildAccountTokenGroupsStatic(chainId, queryAllAccounts, selectedAccount, allAccounts, tokensState.allTokens, tokensState.allDetectedTokens);
|
|
35
|
-
if (!accountTokenGroups.length) {
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
const provider = __classPrivateFieldGet(this, _RpcBalanceFetcher_getProvider, "f").call(this, chainId);
|
|
39
|
-
await __classPrivateFieldGet(this, _RpcBalanceFetcher_instances, "m", _RpcBalanceFetcher_ensureFreshBlockData).call(this, chainId);
|
|
40
|
-
const { tokenBalances } = await getTokenBalancesForMultipleAddresses(accountTokenGroups, chainId, provider, true, // include native
|
|
41
|
-
false);
|
|
42
|
-
Object.entries(tokenBalances).forEach(([tokenAddr, balances]) => {
|
|
43
|
-
Object.entries(balances).forEach(([acct, bn]) => {
|
|
44
|
-
results.push({
|
|
45
|
-
success: bn !== null,
|
|
46
|
-
value: bn,
|
|
47
|
-
account: acct,
|
|
48
|
-
token: checksum(tokenAddr),
|
|
49
|
-
chainId,
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
return results;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
_RpcBalanceFetcher_getProvider = new WeakMap(), _RpcBalanceFetcher_getNetworkClient = new WeakMap(), _RpcBalanceFetcher_getTokensState = new WeakMap(), _RpcBalanceFetcher_instances = new WeakSet(), _RpcBalanceFetcher_ensureFreshBlockData =
|
|
58
|
-
/**
|
|
59
|
-
* Ensures that the block tracker has the latest block data before performing multicall operations.
|
|
60
|
-
* This is a temporary fix to ensure that the block number is up to date.
|
|
61
|
-
*
|
|
62
|
-
* @param chainId - The chain id to update block data for.
|
|
63
|
-
*/
|
|
64
|
-
async function _RpcBalanceFetcher_ensureFreshBlockData(chainId) {
|
|
65
|
-
// Force fresh block data before multicall
|
|
66
|
-
// TODO: This is a temporary fix to ensure that the block number is up to date.
|
|
67
|
-
// We should remove this once we have a better solution for this on the block tracker controller.
|
|
68
|
-
const networkClient = __classPrivateFieldGet(this, _RpcBalanceFetcher_getNetworkClient, "f").call(this, chainId);
|
|
69
|
-
await networkClient.blockTracker?.checkForLatestBlock?.();
|
|
70
|
-
};
|
|
71
|
-
/**
|
|
72
|
-
* Merges imported & detected tokens for the requested chain and returns a list
|
|
73
|
-
* of `{ accountAddress, tokenAddresses[] }` suitable for getTokenBalancesForMultipleAddresses.
|
|
74
|
-
*
|
|
75
|
-
* @param chainId - The chain ID to build account token groups for
|
|
76
|
-
* @param queryAllAccounts - Whether to query all accounts or just the selected one
|
|
77
|
-
* @param selectedAccount - The currently selected account
|
|
78
|
-
* @param allAccounts - All available accounts
|
|
79
|
-
* @param allTokens - All tokens from TokensController
|
|
80
|
-
* @param allDetectedTokens - All detected tokens from TokensController
|
|
81
|
-
* @returns Array of account/token groups for multicall
|
|
82
|
-
*/
|
|
83
|
-
function buildAccountTokenGroupsStatic(chainId, queryAllAccounts, selectedAccount, allAccounts, allTokens, allDetectedTokens) {
|
|
84
|
-
const pairs = [];
|
|
85
|
-
const add = ([account, tokens]) => {
|
|
86
|
-
const shouldInclude = queryAllAccounts || checksum(account) === checksum(selectedAccount);
|
|
87
|
-
if (!shouldInclude) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
tokens.forEach((t) => pairs.push({
|
|
91
|
-
accountAddress: account,
|
|
92
|
-
tokenAddress: checksum(t.address),
|
|
93
|
-
}));
|
|
94
|
-
};
|
|
95
|
-
Object.entries(allTokens[chainId] ?? {}).forEach(add);
|
|
96
|
-
Object.entries(allDetectedTokens[chainId] ?? {}).forEach(add);
|
|
97
|
-
if (queryAllAccounts) {
|
|
98
|
-
allAccounts.forEach((a) => {
|
|
99
|
-
pairs.push({
|
|
100
|
-
accountAddress: a.address,
|
|
101
|
-
tokenAddress: ZERO_ADDRESS,
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
if (!pairs.length) {
|
|
106
|
-
return [];
|
|
107
|
-
}
|
|
108
|
-
// group by account
|
|
109
|
-
const map = new Map();
|
|
110
|
-
pairs.forEach(({ accountAddress, tokenAddress }) => {
|
|
111
|
-
if (!map.has(accountAddress)) {
|
|
112
|
-
map.set(accountAddress, []);
|
|
113
|
-
}
|
|
114
|
-
const tokens = map.get(accountAddress);
|
|
115
|
-
if (tokens) {
|
|
116
|
-
tokens.push(tokenAddress);
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
return Array.from(map.entries()).map(([accountAddress, tokenAddresses]) => ({
|
|
120
|
-
accountAddress,
|
|
121
|
-
tokenAddresses,
|
|
122
|
-
}));
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=rpc-balance-fetcher.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-balance-fetcher.mjs","sourceRoot":"","sources":["../../src/rpc-service/rpc-balance-fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Web3Provider } from '@ethersproject/providers';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkClient } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport type BN from 'bn.js';\n\nimport { getTokenBalancesForMultipleAddresses } from '../multicall';\nimport type { TokensControllerState } from '../TokensController';\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n success: boolean;\n value?: BN;\n account: ChecksumAddress;\n token: ChecksumAddress;\n chainId: ChainIdHex;\n};\n\nexport type BalanceFetcher = {\n supports(chainId: ChainIdHex): boolean;\n fetch(input: {\n chainIds: ChainIdHex[];\n queryAllAccounts: boolean;\n selectedAccount: ChecksumAddress;\n allAccounts: InternalAccount[];\n }): Promise<ProcessedBalance[]>;\n};\n\nconst ZERO_ADDRESS =\n '0x0000000000000000000000000000000000000000' as ChecksumAddress;\n\nconst checksum = (addr: string): ChecksumAddress =>\n toChecksumHexAddress(addr) as ChecksumAddress;\n\nexport class RpcBalanceFetcher implements BalanceFetcher {\n readonly #getProvider: (chainId: ChainIdHex) => Web3Provider;\n\n readonly #getNetworkClient: (chainId: ChainIdHex) => NetworkClient;\n\n readonly #getTokensState: () => {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n };\n\n constructor(\n getProvider: (chainId: ChainIdHex) => Web3Provider,\n getNetworkClient: (chainId: ChainIdHex) => NetworkClient,\n getTokensState: () => {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n },\n ) {\n this.#getProvider = getProvider;\n this.#getNetworkClient = getNetworkClient;\n this.#getTokensState = getTokensState;\n }\n\n supports(): boolean {\n return true; // fallback – supports every chain\n }\n\n async fetch({\n chainIds,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n }: Parameters<BalanceFetcher['fetch']>[0]): Promise<ProcessedBalance[]> {\n const results: ProcessedBalance[] = [];\n\n for (const chainId of chainIds) {\n const tokensState = this.#getTokensState();\n const accountTokenGroups = buildAccountTokenGroupsStatic(\n chainId,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n tokensState.allTokens,\n tokensState.allDetectedTokens,\n );\n if (!accountTokenGroups.length) {\n continue;\n }\n\n const provider = this.#getProvider(chainId);\n await this.#ensureFreshBlockData(chainId);\n\n const { tokenBalances } = await getTokenBalancesForMultipleAddresses(\n accountTokenGroups,\n chainId,\n provider,\n true, // include native\n false, // include staked\n );\n\n Object.entries(tokenBalances).forEach(([tokenAddr, balances]) => {\n Object.entries(balances).forEach(([acct, bn]) => {\n results.push({\n success: bn !== null,\n value: bn as BN,\n account: acct as ChecksumAddress,\n token: checksum(tokenAddr),\n chainId,\n });\n });\n });\n }\n\n return results;\n }\n\n /**\n * Ensures that the block tracker has the latest block data before performing multicall operations.\n * This is a temporary fix to ensure that the block number is up to date.\n *\n * @param chainId - The chain id to update block data for.\n */\n async #ensureFreshBlockData(chainId: Hex): Promise<void> {\n // Force fresh block data before multicall\n // TODO: This is a temporary fix to ensure that the block number is up to date.\n // We should remove this once we have a better solution for this on the block tracker controller.\n const networkClient = this.#getNetworkClient(chainId);\n await networkClient.blockTracker?.checkForLatestBlock?.();\n }\n}\n\n/**\n * Merges imported & detected tokens for the requested chain and returns a list\n * of `{ accountAddress, tokenAddresses[] }` suitable for getTokenBalancesForMultipleAddresses.\n *\n * @param chainId - The chain ID to build account token groups for\n * @param queryAllAccounts - Whether to query all accounts or just the selected one\n * @param selectedAccount - The currently selected account\n * @param allAccounts - All available accounts\n * @param allTokens - All tokens from TokensController\n * @param allDetectedTokens - All detected tokens from TokensController\n * @returns Array of account/token groups for multicall\n */\nfunction buildAccountTokenGroupsStatic(\n chainId: ChainIdHex,\n queryAllAccounts: boolean,\n selectedAccount: ChecksumAddress,\n allAccounts: InternalAccount[],\n allTokens: TokensControllerState['allTokens'],\n allDetectedTokens: TokensControllerState['allDetectedTokens'],\n): { accountAddress: ChecksumAddress; tokenAddresses: ChecksumAddress[] }[] {\n const pairs: {\n accountAddress: ChecksumAddress;\n tokenAddress: ChecksumAddress;\n }[] = [];\n\n const add = ([account, tokens]: [string, unknown[]]) => {\n const shouldInclude =\n queryAllAccounts || checksum(account) === checksum(selectedAccount);\n if (!shouldInclude) {\n return;\n }\n (tokens as unknown[]).forEach((t: unknown) =>\n pairs.push({\n accountAddress: account as ChecksumAddress,\n tokenAddress: checksum((t as { address: string }).address),\n }),\n );\n };\n\n Object.entries(allTokens[chainId] ?? {}).forEach(\n add as (entry: [string, unknown]) => void,\n );\n Object.entries(allDetectedTokens[chainId] ?? {}).forEach(\n add as (entry: [string, unknown]) => void,\n );\n\n if (queryAllAccounts) {\n allAccounts.forEach((a) => {\n pairs.push({\n accountAddress: a.address as ChecksumAddress,\n tokenAddress: ZERO_ADDRESS,\n });\n });\n }\n\n if (!pairs.length) {\n return [];\n }\n\n // group by account\n const map = new Map<ChecksumAddress, ChecksumAddress[]>();\n pairs.forEach(({ accountAddress, tokenAddress }) => {\n if (!map.has(accountAddress)) {\n map.set(accountAddress, []);\n }\n const tokens = map.get(accountAddress);\n if (tokens) {\n tokens.push(tokenAddress);\n }\n });\n\n return Array.from(map.entries()).map(([accountAddress, tokenAddresses]) => ({\n accountAddress,\n tokenAddresses,\n }));\n}\n"]}
|
package/dist/selectors.cjs
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.evmAggregatedBalancesForAccount = void 0;
|
|
4
|
-
const controller_utils_1 = require("@metamask/controller-utils");
|
|
5
|
-
const reselect_1 = require("reselect");
|
|
6
|
-
const currencyConversionRate = (state) => state.currencyRates;
|
|
7
|
-
const evmTokenBalances = (state) => state.tokenBalances;
|
|
8
|
-
const evmTokenRates = (state) => state.marketData;
|
|
9
|
-
const tokensInformations = (state) => state.allTokens;
|
|
10
|
-
exports.evmAggregatedBalancesForAccount = (0, reselect_1.createSelector)(evmTokenBalances, evmTokenRates, currencyConversionRate, tokensInformations, (_state, account) => account, (tokenBalances, tokenRates, currencyConversionRateState, tokensInformationsState, account) => {
|
|
11
|
-
const balancesForAccount = tokenBalances?.[account];
|
|
12
|
-
if (!balancesForAccount) {
|
|
13
|
-
return {};
|
|
14
|
-
}
|
|
15
|
-
// Calculate total balance value across all chains for this account
|
|
16
|
-
let totalBalance = 0;
|
|
17
|
-
for (const [chainId, chainBalances] of Object.entries(balancesForAccount)) {
|
|
18
|
-
for (const [tokenAddress, balance] of Object.entries(chainBalances)) {
|
|
19
|
-
// tokenRates is organized by chainId -> tokenAddress -> MarketDataDetails
|
|
20
|
-
// We need to find the market data for this token across all chains
|
|
21
|
-
let marketData;
|
|
22
|
-
for (const chainData of Object.values(tokenRates)) {
|
|
23
|
-
if (chainData[tokenAddress]) {
|
|
24
|
-
marketData = chainData[tokenAddress];
|
|
25
|
-
break;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
const rateToUse = currencyConversionRateState[marketData?.currency ?? '']
|
|
29
|
-
?.conversionRate ?? 0;
|
|
30
|
-
if (marketData?.price) {
|
|
31
|
-
const { price } = marketData;
|
|
32
|
-
// Find the token decimals from tokensInformations
|
|
33
|
-
let tokenDecimals = 18; // Default to 18 decimals
|
|
34
|
-
const chainTokens = tokensInformationsState[chainId];
|
|
35
|
-
if (chainTokens) {
|
|
36
|
-
// Look through all accounts in this chain to find the token
|
|
37
|
-
for (const accountTokens of Object.values(chainTokens)) {
|
|
38
|
-
if (Array.isArray(accountTokens)) {
|
|
39
|
-
const foundToken = accountTokens.find((token) => token.address.toLowerCase() === tokenAddress.toLowerCase());
|
|
40
|
-
if (foundToken && foundToken.decimals !== undefined) {
|
|
41
|
-
tokenDecimals = foundToken.decimals;
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
// Convert all balances to 18 decimal equivalent first
|
|
48
|
-
let normalizedBalance = (0, controller_utils_1.convertHexToDecimal)(balance);
|
|
49
|
-
// If token has different decimals, convert to 18 decimals
|
|
50
|
-
if (tokenDecimals !== 18) {
|
|
51
|
-
const decimalDifference = 18 - tokenDecimals;
|
|
52
|
-
normalizedBalance *= Math.pow(10, decimalDifference);
|
|
53
|
-
}
|
|
54
|
-
// Now divide by 10^18 since everything is normalized to 18 decimals
|
|
55
|
-
const balanceInTokens = normalizedBalance / Math.pow(10, 18);
|
|
56
|
-
const tokenValue = price * balanceInTokens * rateToUse;
|
|
57
|
-
const roundedTokenValue = Math.round(tokenValue * 100) / 100; // Round to 2 decimal places
|
|
58
|
-
totalBalance += roundedTokenValue;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return totalBalance;
|
|
63
|
-
});
|
|
64
|
-
//# sourceMappingURL=selectors.cjs.map
|
package/dist/selectors.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.cjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import { convertHexToDecimal } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport type { CurrencyRateState } from './CurrencyRateController';\nimport type { TokenBalancesControllerState } from './TokenBalancesController';\nimport type { TokenRatesControllerState } from './TokenRatesController';\nimport type { TokensControllerState } from './TokensController';\n\nconst currencyConversionRate = (state: CurrencyRateState) =>\n state.currencyRates;\n\nconst evmTokenBalances = (state: TokenBalancesControllerState) =>\n state.tokenBalances;\n\nconst evmTokenRates = (state: TokenRatesControllerState) => state.marketData;\n\nconst tokensInformations = (state: TokensControllerState) => state.allTokens;\n\nexport const evmAggregatedBalancesForAccount = createSelector(\n evmTokenBalances,\n evmTokenRates,\n currencyConversionRate,\n tokensInformations,\n (_state: TokenBalancesControllerState, account: Hex) => account,\n (\n tokenBalances,\n tokenRates,\n currencyConversionRateState,\n tokensInformationsState,\n account,\n ) => {\n const balancesForAccount = tokenBalances?.[account];\n if (!balancesForAccount) {\n return {};\n }\n\n // Calculate total balance value across all chains for this account\n let totalBalance = 0;\n\n for (const [chainId, chainBalances] of Object.entries(balancesForAccount)) {\n for (const [tokenAddress, balance] of Object.entries(chainBalances)) {\n // tokenRates is organized by chainId -> tokenAddress -> MarketDataDetails\n // We need to find the market data for this token across all chains\n let marketData;\n for (const chainData of Object.values(tokenRates)) {\n if (chainData[tokenAddress as Hex]) {\n marketData = chainData[tokenAddress as Hex];\n break;\n }\n }\n\n const rateToUse =\n currencyConversionRateState[marketData?.currency ?? '']\n ?.conversionRate ?? 0;\n\n if (marketData?.price) {\n const { price } = marketData;\n\n // Find the token decimals from tokensInformations\n let tokenDecimals = 18; // Default to 18 decimals\n const chainTokens = tokensInformationsState[chainId as Hex];\n if (chainTokens) {\n // Look through all accounts in this chain to find the token\n for (const accountTokens of Object.values(chainTokens)) {\n if (Array.isArray(accountTokens)) {\n const foundToken = accountTokens.find(\n (token: { address: string; decimals: number }) =>\n token.address.toLowerCase() === tokenAddress.toLowerCase(),\n );\n if (foundToken && foundToken.decimals !== undefined) {\n tokenDecimals = foundToken.decimals;\n break;\n }\n }\n }\n }\n\n // Convert all balances to 18 decimal equivalent first\n let normalizedBalance = convertHexToDecimal(balance);\n\n // If token has different decimals, convert to 18 decimals\n if (tokenDecimals !== 18) {\n const decimalDifference = 18 - tokenDecimals;\n normalizedBalance *= Math.pow(10, decimalDifference);\n }\n\n // Now divide by 10^18 since everything is normalized to 18 decimals\n const balanceInTokens = normalizedBalance / Math.pow(10, 18);\n const tokenValue = price * balanceInTokens * rateToUse;\n const roundedTokenValue = Math.round(tokenValue * 100) / 100; // Round to 2 decimal places\n\n totalBalance += roundedTokenValue;\n }\n }\n }\n\n return totalBalance;\n },\n);\n"]}
|
package/dist/selectors.d.cts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import type { Hex } from "@metamask/utils";
|
|
2
|
-
import type { CurrencyRateState } from "./CurrencyRateController.cjs";
|
|
3
|
-
import type { TokenBalancesControllerState } from "./TokenBalancesController.cjs";
|
|
4
|
-
import type { TokenRatesControllerState } from "./TokenRatesController.cjs";
|
|
5
|
-
import type { TokensControllerState } from "./TokensController.cjs";
|
|
6
|
-
export declare const evmAggregatedBalancesForAccount: ((state: TokenBalancesControllerState & TokenRatesControllerState & CurrencyRateState & TokensControllerState, account: `0x${string}`) => {}) & {
|
|
7
|
-
clearCache: () => void;
|
|
8
|
-
resultsCount: () => number;
|
|
9
|
-
resetResultsCount: () => void;
|
|
10
|
-
} & {
|
|
11
|
-
resultFunc: (resultFuncArgs_0: import("./TokenBalancesController.cjs").TokenBalances, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.cjs").MarketDataDetails>>, resultFuncArgs_2: Record<string, {
|
|
12
|
-
conversionDate: number | null;
|
|
13
|
-
conversionRate: number | null;
|
|
14
|
-
usdConversionRate: number | null;
|
|
15
|
-
}>, resultFuncArgs_3: {
|
|
16
|
-
[chainId: `0x${string}`]: {
|
|
17
|
-
[key: string]: import("./TokenRatesController.cjs").Token[];
|
|
18
|
-
};
|
|
19
|
-
}, resultFuncArgs_4: `0x${string}`) => {};
|
|
20
|
-
memoizedResultFunc: ((resultFuncArgs_0: import("./TokenBalancesController.cjs").TokenBalances, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.cjs").MarketDataDetails>>, resultFuncArgs_2: Record<string, {
|
|
21
|
-
conversionDate: number | null;
|
|
22
|
-
conversionRate: number | null;
|
|
23
|
-
usdConversionRate: number | null;
|
|
24
|
-
}>, resultFuncArgs_3: {
|
|
25
|
-
[chainId: `0x${string}`]: {
|
|
26
|
-
[key: string]: import("./TokenRatesController.cjs").Token[];
|
|
27
|
-
};
|
|
28
|
-
}, resultFuncArgs_4: `0x${string}`) => {}) & {
|
|
29
|
-
clearCache: () => void;
|
|
30
|
-
resultsCount: () => number;
|
|
31
|
-
resetResultsCount: () => void;
|
|
32
|
-
};
|
|
33
|
-
lastResult: () => {};
|
|
34
|
-
dependencies: [(state: TokenBalancesControllerState) => import("./TokenBalancesController.cjs").TokenBalances, (state: TokenRatesControllerState) => Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.cjs").MarketDataDetails>>, (state: CurrencyRateState) => Record<string, {
|
|
35
|
-
conversionDate: number | null;
|
|
36
|
-
conversionRate: number | null;
|
|
37
|
-
usdConversionRate: number | null;
|
|
38
|
-
}>, (state: TokensControllerState) => {
|
|
39
|
-
[chainId: `0x${string}`]: {
|
|
40
|
-
[key: string]: import("./TokenRatesController.cjs").Token[];
|
|
41
|
-
};
|
|
42
|
-
}, (_state: TokenBalancesControllerState, account: Hex) => `0x${string}`];
|
|
43
|
-
recomputations: () => number;
|
|
44
|
-
resetRecomputations: () => void;
|
|
45
|
-
dependencyRecomputations: () => number;
|
|
46
|
-
resetDependencyRecomputations: () => void;
|
|
47
|
-
} & {
|
|
48
|
-
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
49
|
-
memoize: typeof import("reselect").weakMapMemoize;
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=selectors.d.cts.map
|
package/dist/selectors.d.cts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.d.cts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,qCAAiC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAE,sCAAkC;AAC9E,OAAO,KAAK,EAAE,yBAAyB,EAAE,mCAA+B;AACxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,+BAA2B;AAYhE,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAPX,4BAA4B,gEAG/B,yBAAyB,+GANhB,iBAAiB;;;;gBAQrB,qBAAqB;;;;gBAO7C,4BAA4B,WAAW,GAAG;;;;;;;;CA2EpD,CAAC"}
|
package/dist/selectors.d.mts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import type { Hex } from "@metamask/utils";
|
|
2
|
-
import type { CurrencyRateState } from "./CurrencyRateController.mjs";
|
|
3
|
-
import type { TokenBalancesControllerState } from "./TokenBalancesController.mjs";
|
|
4
|
-
import type { TokenRatesControllerState } from "./TokenRatesController.mjs";
|
|
5
|
-
import type { TokensControllerState } from "./TokensController.mjs";
|
|
6
|
-
export declare const evmAggregatedBalancesForAccount: ((state: TokenBalancesControllerState & TokenRatesControllerState & CurrencyRateState & TokensControllerState, account: `0x${string}`) => {}) & {
|
|
7
|
-
clearCache: () => void;
|
|
8
|
-
resultsCount: () => number;
|
|
9
|
-
resetResultsCount: () => void;
|
|
10
|
-
} & {
|
|
11
|
-
resultFunc: (resultFuncArgs_0: import("./TokenBalancesController.mjs").TokenBalances, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.mjs").MarketDataDetails>>, resultFuncArgs_2: Record<string, {
|
|
12
|
-
conversionDate: number | null;
|
|
13
|
-
conversionRate: number | null;
|
|
14
|
-
usdConversionRate: number | null;
|
|
15
|
-
}>, resultFuncArgs_3: {
|
|
16
|
-
[chainId: `0x${string}`]: {
|
|
17
|
-
[key: string]: import("./TokenRatesController.mjs").Token[];
|
|
18
|
-
};
|
|
19
|
-
}, resultFuncArgs_4: `0x${string}`) => {};
|
|
20
|
-
memoizedResultFunc: ((resultFuncArgs_0: import("./TokenBalancesController.mjs").TokenBalances, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.mjs").MarketDataDetails>>, resultFuncArgs_2: Record<string, {
|
|
21
|
-
conversionDate: number | null;
|
|
22
|
-
conversionRate: number | null;
|
|
23
|
-
usdConversionRate: number | null;
|
|
24
|
-
}>, resultFuncArgs_3: {
|
|
25
|
-
[chainId: `0x${string}`]: {
|
|
26
|
-
[key: string]: import("./TokenRatesController.mjs").Token[];
|
|
27
|
-
};
|
|
28
|
-
}, resultFuncArgs_4: `0x${string}`) => {}) & {
|
|
29
|
-
clearCache: () => void;
|
|
30
|
-
resultsCount: () => number;
|
|
31
|
-
resetResultsCount: () => void;
|
|
32
|
-
};
|
|
33
|
-
lastResult: () => {};
|
|
34
|
-
dependencies: [(state: TokenBalancesControllerState) => import("./TokenBalancesController.mjs").TokenBalances, (state: TokenRatesControllerState) => Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.mjs").MarketDataDetails>>, (state: CurrencyRateState) => Record<string, {
|
|
35
|
-
conversionDate: number | null;
|
|
36
|
-
conversionRate: number | null;
|
|
37
|
-
usdConversionRate: number | null;
|
|
38
|
-
}>, (state: TokensControllerState) => {
|
|
39
|
-
[chainId: `0x${string}`]: {
|
|
40
|
-
[key: string]: import("./TokenRatesController.mjs").Token[];
|
|
41
|
-
};
|
|
42
|
-
}, (_state: TokenBalancesControllerState, account: Hex) => `0x${string}`];
|
|
43
|
-
recomputations: () => number;
|
|
44
|
-
resetRecomputations: () => void;
|
|
45
|
-
dependencyRecomputations: () => number;
|
|
46
|
-
resetDependencyRecomputations: () => void;
|
|
47
|
-
} & {
|
|
48
|
-
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
49
|
-
memoize: typeof import("reselect").weakMapMemoize;
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=selectors.d.mts.map
|
package/dist/selectors.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.d.mts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,qCAAiC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAE,sCAAkC;AAC9E,OAAO,KAAK,EAAE,yBAAyB,EAAE,mCAA+B;AACxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,+BAA2B;AAYhE,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAPX,4BAA4B,gEAG/B,yBAAyB,+GANhB,iBAAiB;;;;gBAQrB,qBAAqB;;;;gBAO7C,4BAA4B,WAAW,GAAG;;;;;;;;CA2EpD,CAAC"}
|