@metamask-previews/assets-controller 0.0.0-preview-52f4a2ca → 0.0.0-preview-2d06693a
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 +0 -3
- package/dist/AssetsController.cjs +19 -7
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +19 -7
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +42 -232
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +1 -5
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +1 -5
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +42 -229
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.cts +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.mts +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +27 -32
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +5 -12
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +5 -12
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs +27 -32
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +12 -23
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +3 -8
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +3 -8
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +12 -23
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.cts +2 -2
- package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.mts +2 -2
- package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/index.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/index.d.cts +1 -1
- package/dist/data-sources/evm-rpc-services/types/index.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/index.d.mts +1 -1
- package/dist/data-sources/evm-rpc-services/types/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.d.cts +24 -9
- package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.d.mts +24 -9
- package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -9,12 +9,11 @@ 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 _RpcDataSource_instances, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector,
|
|
12
|
+
var _RpcDataSource_instances, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector, _RpcDataSource_handleBalanceUpdate, _RpcDataSource_handleDetectionUpdate, _RpcDataSource_registerActionHandlers, _RpcDataSource_subscribeToNetworkController, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_getMulticallProvider, _RpcDataSource_clearProviderCache, _RpcDataSource_accountSupportsChain, _RpcDataSource_buildNativeAssetId;
|
|
13
13
|
import { Web3Provider } from "@ethersproject/providers";
|
|
14
14
|
import { BaseController } from "@metamask/base-controller";
|
|
15
15
|
import { toHex } from "@metamask/controller-utils";
|
|
16
16
|
import { isStrictHexString, isCaipChainId, parseCaipChainId } from "@metamask/utils";
|
|
17
|
-
import BigNumberJS from "bignumber.js";
|
|
18
17
|
import { BalanceFetcher, MulticallClient, TokenDetector } from "./evm-rpc-services/index.mjs";
|
|
19
18
|
import { projectLogger, createModuleLogger } from "../logger.mjs";
|
|
20
19
|
const CONTROLLER_NAME = 'RpcDataSource';
|
|
@@ -91,25 +90,24 @@ export class RpcDataSource extends BaseController {
|
|
|
91
90
|
__classPrivateFieldSet(this, _RpcDataSource_multicallClient, new MulticallClient((hexChainId) => {
|
|
92
91
|
return __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getMulticallProvider).call(this, hexChainId);
|
|
93
92
|
}), "f");
|
|
94
|
-
// Create
|
|
95
|
-
const
|
|
96
|
-
call:
|
|
97
|
-
const state = this.messenger.call('AssetsController:getState');
|
|
98
|
-
return {
|
|
99
|
-
assetsBalance: (state.assetsBalance ?? {}),
|
|
100
|
-
};
|
|
101
|
-
},
|
|
93
|
+
// Create state getters using messenger
|
|
94
|
+
const getTokenListState = () => {
|
|
95
|
+
return this.messenger.call('TokenListController:getState');
|
|
102
96
|
};
|
|
103
|
-
const
|
|
104
|
-
call:
|
|
105
|
-
return this.messenger.call('TokenListController:getState');
|
|
106
|
-
},
|
|
97
|
+
const getUserTokensState = () => {
|
|
98
|
+
return this.messenger.call('AssetsController:getState');
|
|
107
99
|
};
|
|
108
100
|
// Initialize BalanceFetcher with polling interval
|
|
109
|
-
__classPrivateFieldSet(this, _RpcDataSource_balanceFetcher, new BalanceFetcher(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"),
|
|
101
|
+
__classPrivateFieldSet(this, _RpcDataSource_balanceFetcher, new BalanceFetcher(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), {
|
|
102
|
+
pollingInterval: balanceInterval,
|
|
103
|
+
}), "f");
|
|
104
|
+
__classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setUserTokensStateGetter(getUserTokensState);
|
|
110
105
|
__classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setOnBalanceUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleBalanceUpdate).bind(this));
|
|
111
106
|
// Initialize TokenDetector with polling interval
|
|
112
|
-
__classPrivateFieldSet(this, _RpcDataSource_tokenDetector, new TokenDetector(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"),
|
|
107
|
+
__classPrivateFieldSet(this, _RpcDataSource_tokenDetector, new TokenDetector(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), {
|
|
108
|
+
pollingInterval: detectionInterval,
|
|
109
|
+
}), "f");
|
|
110
|
+
__classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setTokenListStateGetter(getTokenListState);
|
|
113
111
|
__classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setOnDetectionUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleDetectionUpdate).bind(this));
|
|
114
112
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_registerActionHandlers).call(this);
|
|
115
113
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_subscribeToNetworkController).call(this);
|
|
@@ -195,7 +193,6 @@ export class RpcDataSource extends BaseController {
|
|
|
195
193
|
return response;
|
|
196
194
|
}
|
|
197
195
|
const assetsBalance = {};
|
|
198
|
-
const assetsMetadata = {};
|
|
199
196
|
const failedChains = [];
|
|
200
197
|
// Fetch balances for each chain using BalanceFetcher
|
|
201
198
|
for (const chainId of chainsToFetch) {
|
|
@@ -212,17 +209,10 @@ export class RpcDataSource extends BaseController {
|
|
|
212
209
|
if (!assetsBalance[accountId]) {
|
|
213
210
|
assetsBalance[accountId] = {};
|
|
214
211
|
}
|
|
215
|
-
//
|
|
216
|
-
const balanceMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, chainId);
|
|
217
|
-
Object.assign(assetsMetadata, balanceMetadata);
|
|
218
|
-
// Convert balances to human-readable format
|
|
212
|
+
// Convert balances to response format
|
|
219
213
|
for (const balance of result.balances) {
|
|
220
|
-
const metadata = assetsMetadata[balance.assetId];
|
|
221
|
-
// Default to 18 decimals (ERC20 standard) for consistent human-readable format
|
|
222
|
-
const decimals = metadata?.decimals ?? 18;
|
|
223
|
-
const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
|
|
224
214
|
assetsBalance[accountId][balance.assetId] = {
|
|
225
|
-
amount:
|
|
215
|
+
amount: balance.balance,
|
|
226
216
|
};
|
|
227
217
|
}
|
|
228
218
|
}
|
|
@@ -233,16 +223,6 @@ export class RpcDataSource extends BaseController {
|
|
|
233
223
|
}
|
|
234
224
|
const nativeAssetId = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_buildNativeAssetId).call(this, chainId);
|
|
235
225
|
assetsBalance[accountId][nativeAssetId] = { amount: '0' };
|
|
236
|
-
// Even on error, include native token metadata
|
|
237
|
-
const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
|
|
238
|
-
if (chainStatus) {
|
|
239
|
-
assetsMetadata[nativeAssetId] = {
|
|
240
|
-
type: 'native',
|
|
241
|
-
symbol: chainStatus.nativeCurrency,
|
|
242
|
-
name: chainStatus.nativeCurrency,
|
|
243
|
-
decimals: 18,
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
226
|
if (!failedChains.includes(chainId)) {
|
|
247
227
|
failedChains.push(chainId);
|
|
248
228
|
}
|
|
@@ -266,10 +246,6 @@ export class RpcDataSource extends BaseController {
|
|
|
266
246
|
});
|
|
267
247
|
}
|
|
268
248
|
response.assetsBalance = assetsBalance;
|
|
269
|
-
// Include metadata for native tokens if we have any
|
|
270
|
-
if (Object.keys(assetsMetadata).length > 0) {
|
|
271
|
-
response.assetsMetadata = assetsMetadata;
|
|
272
|
-
}
|
|
273
249
|
return response;
|
|
274
250
|
}
|
|
275
251
|
/**
|
|
@@ -299,27 +275,10 @@ export class RpcDataSource extends BaseController {
|
|
|
299
275
|
});
|
|
300
276
|
// Convert detected assets to DataResponse format
|
|
301
277
|
const balances = {};
|
|
302
|
-
|
|
303
|
-
// Build metadata from detected assets
|
|
304
|
-
for (const asset of result.detectedAssets) {
|
|
305
|
-
if (asset.symbol && asset.decimals !== undefined) {
|
|
306
|
-
assetsMetadata[asset.assetId] = {
|
|
307
|
-
type: 'erc20',
|
|
308
|
-
symbol: asset.symbol,
|
|
309
|
-
name: asset.name ?? asset.symbol,
|
|
310
|
-
decimals: asset.decimals,
|
|
311
|
-
image: asset.image,
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
// Add balances for detected tokens (converted to human-readable format)
|
|
278
|
+
// Add balances for detected tokens
|
|
316
279
|
for (const balance of result.detectedBalances) {
|
|
317
|
-
const detectedAsset = result.detectedAssets.find((asset) => asset.assetId === balance.assetId);
|
|
318
|
-
// Default to 18 decimals (ERC20 standard) for consistent human-readable format
|
|
319
|
-
const decimals = detectedAsset?.decimals ?? 18;
|
|
320
|
-
const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
|
|
321
280
|
balances[balance.assetId] = {
|
|
322
|
-
amount:
|
|
281
|
+
amount: balance.balance,
|
|
323
282
|
};
|
|
324
283
|
}
|
|
325
284
|
const response = {
|
|
@@ -330,10 +289,6 @@ export class RpcDataSource extends BaseController {
|
|
|
330
289
|
[accountId]: balances,
|
|
331
290
|
},
|
|
332
291
|
};
|
|
333
|
-
// Include metadata if we have any
|
|
334
|
-
if (Object.keys(assetsMetadata).length > 0) {
|
|
335
|
-
response.assetsMetadata = assetsMetadata;
|
|
336
|
-
}
|
|
337
292
|
return response;
|
|
338
293
|
}
|
|
339
294
|
catch (error) {
|
|
@@ -343,7 +298,7 @@ export class RpcDataSource extends BaseController {
|
|
|
343
298
|
}
|
|
344
299
|
get assetsMiddleware() {
|
|
345
300
|
return async (context, next) => {
|
|
346
|
-
var _a, _b
|
|
301
|
+
var _a, _b;
|
|
347
302
|
const { request } = context;
|
|
348
303
|
const supportedChains = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
|
|
349
304
|
if (supportedChains.length === 0) {
|
|
@@ -368,13 +323,6 @@ export class RpcDataSource extends BaseController {
|
|
|
368
323
|
};
|
|
369
324
|
}
|
|
370
325
|
}
|
|
371
|
-
if (response.assetsMetadata) {
|
|
372
|
-
(_c = context.response).assetsMetadata ?? (_c.assetsMetadata = {});
|
|
373
|
-
context.response.assetsMetadata = {
|
|
374
|
-
...context.response.assetsMetadata,
|
|
375
|
-
...response.assetsMetadata,
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
326
|
const failedChains = new Set(Object.keys(response.errors ?? {}));
|
|
379
327
|
successfullyHandledChains = supportedChains.filter((chainId) => !failedChains.has(chainId));
|
|
380
328
|
if (successfullyHandledChains.length > 0) {
|
|
@@ -409,19 +357,20 @@ export class RpcDataSource extends BaseController {
|
|
|
409
357
|
log('No active chains to subscribe');
|
|
410
358
|
return;
|
|
411
359
|
}
|
|
412
|
-
// Handle subscription update
|
|
360
|
+
// Handle subscription update
|
|
413
361
|
if (isUpdate) {
|
|
414
362
|
const existing = __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").get(subscriptionId);
|
|
415
363
|
if (existing) {
|
|
416
|
-
log('Updating existing subscription
|
|
364
|
+
log('Updating existing subscription', {
|
|
417
365
|
subscriptionId,
|
|
418
|
-
|
|
419
|
-
newChains: chainsToSubscribe,
|
|
366
|
+
chainsToSubscribe,
|
|
420
367
|
});
|
|
421
|
-
|
|
368
|
+
existing.chains = chainsToSubscribe;
|
|
369
|
+
existing.accounts = request.accounts;
|
|
370
|
+
return;
|
|
422
371
|
}
|
|
423
372
|
}
|
|
424
|
-
// Clean up existing subscription
|
|
373
|
+
// Clean up existing subscription
|
|
425
374
|
await this.unsubscribe(subscriptionId);
|
|
426
375
|
// Start polling through BalanceFetcher and TokenDetector
|
|
427
376
|
const balancePollingTokens = [];
|
|
@@ -501,82 +450,18 @@ export class RpcDataSource extends BaseController {
|
|
|
501
450
|
__classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").clear();
|
|
502
451
|
}
|
|
503
452
|
}
|
|
504
|
-
_RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = new WeakMap(), _RpcDataSource_activeChains = new WeakMap(), _RpcDataSource_chainStatuses = new WeakMap(), _RpcDataSource_providerCache = new WeakMap(), _RpcDataSource_activeSubscriptions = new WeakMap(), _RpcDataSource_multicallClient = new WeakMap(), _RpcDataSource_balanceFetcher = new WeakMap(), _RpcDataSource_tokenDetector = new WeakMap(), _RpcDataSource_instances = new WeakSet(),
|
|
505
|
-
const
|
|
506
|
-
const divisor = new BigNumberJS(10).pow(decimals);
|
|
507
|
-
return rawAmount.dividedBy(divisor).toString();
|
|
508
|
-
}, _RpcDataSource_collectMetadataForBalances = function _RpcDataSource_collectMetadataForBalances(balances, chainId) {
|
|
509
|
-
const assetsMetadata = {};
|
|
510
|
-
const existingMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getExistingAssetsMetadata).call(this);
|
|
511
|
-
for (const balance of balances) {
|
|
512
|
-
const isNative = balance.assetId.includes('/slip44:');
|
|
513
|
-
if (isNative) {
|
|
514
|
-
const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
|
|
515
|
-
if (chainStatus) {
|
|
516
|
-
assetsMetadata[balance.assetId] = {
|
|
517
|
-
type: 'native',
|
|
518
|
-
symbol: chainStatus.nativeCurrency,
|
|
519
|
-
name: chainStatus.nativeCurrency,
|
|
520
|
-
decimals: 18,
|
|
521
|
-
};
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
else {
|
|
525
|
-
// For ERC20 tokens, try existing metadata from state first
|
|
526
|
-
const existingMeta = existingMetadata[balance.assetId];
|
|
527
|
-
if (existingMeta) {
|
|
528
|
-
assetsMetadata[balance.assetId] = existingMeta;
|
|
529
|
-
}
|
|
530
|
-
else {
|
|
531
|
-
// Fallback to token list if not in state
|
|
532
|
-
const tokenListMeta = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getTokenMetadataFromTokenList).call(this, balance.assetId);
|
|
533
|
-
if (tokenListMeta) {
|
|
534
|
-
assetsMetadata[balance.assetId] = tokenListMeta;
|
|
535
|
-
}
|
|
536
|
-
else {
|
|
537
|
-
// Default metadata for unknown ERC20 tokens.
|
|
538
|
-
// Use 18 decimals (the standard for most ERC20 tokens)
|
|
539
|
-
// to ensure consistent human-readable balance format.
|
|
540
|
-
assetsMetadata[balance.assetId] = {
|
|
541
|
-
type: 'erc20',
|
|
542
|
-
symbol: '',
|
|
543
|
-
name: '',
|
|
544
|
-
decimals: 18,
|
|
545
|
-
};
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
return assetsMetadata;
|
|
551
|
-
}, _RpcDataSource_handleBalanceUpdate = function _RpcDataSource_handleBalanceUpdate(result) {
|
|
552
|
-
const newBalances = {};
|
|
553
|
-
// Convert hex chain ID to CAIP-2 format
|
|
554
|
-
const chainIdDecimal = parseInt(result.chainId, 16);
|
|
555
|
-
const caipChainId = `eip155:${chainIdDecimal}`;
|
|
556
|
-
// Collect metadata for all balances
|
|
557
|
-
const assetsMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, caipChainId);
|
|
558
|
-
// Convert balances to human-readable format using metadata
|
|
453
|
+
_RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = new WeakMap(), _RpcDataSource_activeChains = new WeakMap(), _RpcDataSource_chainStatuses = new WeakMap(), _RpcDataSource_providerCache = new WeakMap(), _RpcDataSource_activeSubscriptions = new WeakMap(), _RpcDataSource_multicallClient = new WeakMap(), _RpcDataSource_balanceFetcher = new WeakMap(), _RpcDataSource_tokenDetector = new WeakMap(), _RpcDataSource_instances = new WeakSet(), _RpcDataSource_handleBalanceUpdate = function _RpcDataSource_handleBalanceUpdate(result) {
|
|
454
|
+
const accountBalances = {};
|
|
559
455
|
for (const balance of result.balances) {
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
const decimals = metadata?.decimals ?? 18;
|
|
563
|
-
const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
|
|
564
|
-
newBalances[balance.assetId] = {
|
|
565
|
-
amount: humanReadableAmount,
|
|
456
|
+
accountBalances[balance.assetId] = {
|
|
457
|
+
amount: balance.balance,
|
|
566
458
|
};
|
|
567
459
|
}
|
|
568
|
-
// Only send new data to AssetsController - it handles merging atomically
|
|
569
|
-
// to avoid race conditions when concurrent updates occur for the same account
|
|
570
460
|
const response = {
|
|
571
461
|
assetsBalance: {
|
|
572
|
-
[result.accountId]:
|
|
462
|
+
[result.accountId]: accountBalances,
|
|
573
463
|
},
|
|
574
|
-
assetsMetadata,
|
|
575
464
|
};
|
|
576
|
-
log('Balance update response', {
|
|
577
|
-
accountId: result.accountId,
|
|
578
|
-
newBalanceCount: Object.keys(newBalances).length,
|
|
579
|
-
});
|
|
580
465
|
this.messenger
|
|
581
466
|
.call('AssetsController:assetsUpdate', response, CONTROLLER_NAME)
|
|
582
467
|
.catch((error) => {
|
|
@@ -586,47 +471,22 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
|
|
|
586
471
|
log('Detected new tokens', {
|
|
587
472
|
count: result.detectedAssets.length,
|
|
588
473
|
});
|
|
589
|
-
// Build new metadata from detected assets
|
|
590
|
-
const newMetadata = {};
|
|
591
|
-
if (result.detectedAssets.length > 0) {
|
|
592
|
-
for (const asset of result.detectedAssets) {
|
|
593
|
-
// Only include if we have metadata (symbol and decimals at minimum)
|
|
594
|
-
if (asset.symbol && asset.decimals !== undefined) {
|
|
595
|
-
newMetadata[asset.assetId] = {
|
|
596
|
-
type: 'erc20',
|
|
597
|
-
symbol: asset.symbol,
|
|
598
|
-
name: asset.name ?? asset.symbol,
|
|
599
|
-
decimals: asset.decimals,
|
|
600
|
-
image: asset.image,
|
|
601
|
-
};
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
// Build new balances from detected tokens
|
|
606
|
-
const newBalances = {};
|
|
607
|
-
if (result.detectedBalances.length > 0) {
|
|
608
|
-
for (const balance of result.detectedBalances) {
|
|
609
|
-
// Get decimals from the detected asset metadata
|
|
610
|
-
const detectedAsset = result.detectedAssets.find((asset) => asset.assetId === balance.assetId);
|
|
611
|
-
// Default to 18 decimals (ERC20 standard) for consistent human-readable format
|
|
612
|
-
const decimals = detectedAsset?.decimals ?? 18;
|
|
613
|
-
const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
|
|
614
|
-
newBalances[balance.assetId] = {
|
|
615
|
-
amount: humanReadableAmount,
|
|
616
|
-
};
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
// Only send new data to AssetsController - it handles merging atomically
|
|
620
|
-
// to avoid race conditions when concurrent updates occur for the same account
|
|
621
474
|
const response = {
|
|
622
475
|
detectedAssets: {
|
|
623
476
|
[result.accountId]: result.detectedAssets.map((asset) => asset.assetId),
|
|
624
477
|
},
|
|
625
|
-
assetsMetadata: newMetadata,
|
|
626
|
-
assetsBalance: {
|
|
627
|
-
[result.accountId]: newBalances,
|
|
628
|
-
},
|
|
629
478
|
};
|
|
479
|
+
// Add balances for detected tokens
|
|
480
|
+
if (result.detectedBalances.length > 0) {
|
|
481
|
+
response.assetsBalance = {
|
|
482
|
+
[result.accountId]: {},
|
|
483
|
+
};
|
|
484
|
+
for (const balance of result.detectedBalances) {
|
|
485
|
+
response.assetsBalance[result.accountId][balance.assetId] = {
|
|
486
|
+
amount: balance.balance,
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
}
|
|
630
490
|
this.messenger
|
|
631
491
|
.call('AssetsController:assetsUpdate', response, CONTROLLER_NAME)
|
|
632
492
|
.catch((error) => {
|
|
@@ -766,53 +626,6 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
|
|
|
766
626
|
const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');
|
|
767
627
|
return (nativeAssetIdentifiers[chainId] ??
|
|
768
628
|
`${chainId}/slip44:60`);
|
|
769
|
-
}, _RpcDataSource_getExistingAssetsMetadata = function _RpcDataSource_getExistingAssetsMetadata() {
|
|
770
|
-
try {
|
|
771
|
-
const state = this.messenger.call('AssetsController:getState');
|
|
772
|
-
return (state.assetsMetadata ?? {});
|
|
773
|
-
}
|
|
774
|
-
catch {
|
|
775
|
-
// If AssetsController:getState fails, return empty metadata
|
|
776
|
-
return {};
|
|
777
|
-
}
|
|
778
|
-
}, _RpcDataSource_getTokenMetadataFromTokenList = function _RpcDataSource_getTokenMetadataFromTokenList(assetId) {
|
|
779
|
-
try {
|
|
780
|
-
// Parse asset ID to get chain and token address
|
|
781
|
-
// Format: eip155:{chainId}/erc20:{address}
|
|
782
|
-
const [chainPart, assetPart] = assetId.split('/');
|
|
783
|
-
if (!assetPart?.startsWith('erc20:')) {
|
|
784
|
-
return undefined;
|
|
785
|
-
}
|
|
786
|
-
const tokenAddress = assetPart.slice(6); // Remove 'erc20:' prefix
|
|
787
|
-
const chainIdDecimal = chainPart.split(':')[1];
|
|
788
|
-
const hexChainId = `0x${parseInt(chainIdDecimal, 10).toString(16)}`;
|
|
789
|
-
const tokenListState = this.messenger.call('TokenListController:getState');
|
|
790
|
-
const chainCacheEntry = tokenListState.tokensChainsCache[hexChainId];
|
|
791
|
-
const chainTokenList = chainCacheEntry?.data;
|
|
792
|
-
if (!chainTokenList) {
|
|
793
|
-
return undefined;
|
|
794
|
-
}
|
|
795
|
-
// Look up token by address (case-insensitive)
|
|
796
|
-
const lowerAddress = tokenAddress.toLowerCase();
|
|
797
|
-
for (const [address, tokenData] of Object.entries(chainTokenList)) {
|
|
798
|
-
if (address.toLowerCase() === lowerAddress) {
|
|
799
|
-
const token = tokenData;
|
|
800
|
-
if (token.symbol && token.decimals !== undefined) {
|
|
801
|
-
return {
|
|
802
|
-
type: 'erc20',
|
|
803
|
-
symbol: token.symbol,
|
|
804
|
-
name: token.name ?? token.symbol,
|
|
805
|
-
decimals: token.decimals,
|
|
806
|
-
image: token.iconUrl,
|
|
807
|
-
};
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
return undefined;
|
|
812
|
-
}
|
|
813
|
-
catch {
|
|
814
|
-
return undefined;
|
|
815
|
-
}
|
|
816
629
|
};
|
|
817
630
|
export function createRpcDataSource(options) {
|
|
818
631
|
return new RpcDataSource(options);
|