@metamask/assets-controller 0.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -1
- package/dist/AssetsController-method-action-types.cjs +7 -0
- package/dist/AssetsController-method-action-types.cjs.map +1 -0
- package/dist/AssetsController-method-action-types.d.cts +78 -0
- package/dist/AssetsController-method-action-types.d.cts.map +1 -0
- package/dist/AssetsController-method-action-types.d.mts +78 -0
- package/dist/AssetsController-method-action-types.d.mts.map +1 -0
- package/dist/AssetsController-method-action-types.mjs +6 -0
- package/dist/AssetsController-method-action-types.mjs.map +1 -0
- package/dist/AssetsController.cjs +346 -271
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +92 -96
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +92 -96
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +347 -272
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AbstractDataSource.cjs +8 -0
- package/dist/data-sources/AbstractDataSource.cjs.map +1 -1
- package/dist/data-sources/AbstractDataSource.d.cts +16 -1
- package/dist/data-sources/AbstractDataSource.d.cts.map +1 -1
- package/dist/data-sources/AbstractDataSource.d.mts +16 -1
- package/dist/data-sources/AbstractDataSource.d.mts.map +1 -1
- package/dist/data-sources/AbstractDataSource.mjs +8 -0
- package/dist/data-sources/AbstractDataSource.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +92 -111
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.cts +27 -70
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.mts +27 -70
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs +88 -107
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs +141 -46
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.cts +19 -66
- package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.mts +19 -66
- package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs +141 -46
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
- package/dist/data-sources/PriceDataSource.cjs +39 -48
- package/dist/data-sources/PriceDataSource.cjs.map +1 -1
- package/dist/data-sources/PriceDataSource.d.cts +13 -92
- package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
- package/dist/data-sources/PriceDataSource.d.mts +13 -92
- package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
- package/dist/data-sources/PriceDataSource.mjs +39 -48
- package/dist/data-sources/PriceDataSource.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +184 -142
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +29 -114
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +29 -114
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +185 -143
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/SnapDataSource.cjs +53 -39
- package/dist/data-sources/SnapDataSource.cjs.map +1 -1
- package/dist/data-sources/SnapDataSource.d.cts +9 -45
- package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
- package/dist/data-sources/SnapDataSource.d.mts +9 -45
- package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
- package/dist/data-sources/SnapDataSource.mjs +53 -39
- package/dist/data-sources/SnapDataSource.mjs.map +1 -1
- package/dist/data-sources/StakedBalanceDataSource.cjs +609 -0
- package/dist/data-sources/StakedBalanceDataSource.cjs.map +1 -0
- package/dist/data-sources/StakedBalanceDataSource.d.cts +72 -0
- package/dist/data-sources/StakedBalanceDataSource.d.cts.map +1 -0
- package/dist/data-sources/StakedBalanceDataSource.d.mts +72 -0
- package/dist/data-sources/StakedBalanceDataSource.d.mts.map +1 -0
- package/dist/data-sources/StakedBalanceDataSource.mjs +605 -0
- package/dist/data-sources/StakedBalanceDataSource.mjs.map +1 -0
- package/dist/data-sources/TokenDataSource.cjs +15 -21
- package/dist/data-sources/TokenDataSource.cjs.map +1 -1
- package/dist/data-sources/TokenDataSource.d.cts +3 -25
- package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
- package/dist/data-sources/TokenDataSource.d.mts +3 -25
- package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
- package/dist/data-sources/TokenDataSource.mjs +15 -21
- package/dist/data-sources/TokenDataSource.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.cjs +5 -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 +1 -1
- package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs +132 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts +78 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts +78 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs +126 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +16 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +5 -1
- 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 +5 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +16 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.cjs +6 -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 +1 -0
- 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 +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.mjs +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.d.cts +4 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.d.mts +4 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.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 +3 -3
- 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 +3 -3
- 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/dist/data-sources/evm-rpc-services/utils/index.cjs +9 -1
- package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts +2 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts +2 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.mjs +2 -0
- package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.cjs +47 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts +25 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts +25 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.mjs +39 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs +68 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts +25 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts +25 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs +62 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs.map +1 -0
- package/dist/data-sources/index.cjs +3 -6
- package/dist/data-sources/index.cjs.map +1 -1
- package/dist/data-sources/index.d.cts +7 -7
- package/dist/data-sources/index.d.cts.map +1 -1
- package/dist/data-sources/index.d.mts +7 -7
- package/dist/data-sources/index.d.mts.map +1 -1
- package/dist/data-sources/index.mjs +2 -3
- package/dist/data-sources/index.mjs.map +1 -1
- package/dist/index.cjs +6 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -11
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +11 -11
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.cjs +8 -28
- package/dist/middlewares/DetectionMiddleware.cjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.d.cts +4 -26
- package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -1
- package/dist/middlewares/DetectionMiddleware.d.mts +4 -26
- package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -1
- package/dist/middlewares/DetectionMiddleware.mjs +8 -28
- package/dist/middlewares/DetectionMiddleware.mjs.map +1 -1
- package/dist/middlewares/index.cjs.map +1 -1
- package/dist/middlewares/index.d.cts +1 -1
- package/dist/middlewares/index.d.cts.map +1 -1
- package/dist/middlewares/index.d.mts +1 -1
- package/dist/middlewares/index.d.mts.map +1 -1
- package/dist/middlewares/index.mjs.map +1 -1
- package/dist/selectors/balance.cjs +306 -0
- package/dist/selectors/balance.cjs.map +1 -0
- package/dist/selectors/balance.d.cts +22 -0
- package/dist/selectors/balance.d.cts.map +1 -0
- package/dist/selectors/balance.d.mts +22 -0
- package/dist/selectors/balance.d.mts.map +1 -0
- package/dist/selectors/balance.mjs +297 -0
- package/dist/selectors/balance.mjs.map +1 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +56 -21
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +56 -21
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +13 -10
- package/dist/data-sources/initDataSources.cjs +0 -215
- package/dist/data-sources/initDataSources.cjs.map +0 -1
- package/dist/data-sources/initDataSources.d.cts +0 -140
- package/dist/data-sources/initDataSources.d.cts.map +0 -1
- package/dist/data-sources/initDataSources.d.mts +0 -140
- package/dist/data-sources/initDataSources.d.mts.map +0 -1
- package/dist/data-sources/initDataSources.mjs +0 -210
- package/dist/data-sources/initDataSources.mjs.map +0 -1
|
@@ -13,14 +13,14 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
13
13
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
|
-
var _RpcDataSource_instances, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector, _RpcDataSource_convertToHumanReadable, _RpcDataSource_collectMetadataForBalances, _RpcDataSource_handleBalanceUpdate, _RpcDataSource_handleDetectionUpdate,
|
|
16
|
+
var _RpcDataSource_instances, _RpcDataSource_messenger, _RpcDataSource_onActiveChainsUpdated, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_useExternalService, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_unsubscribeTransactionConfirmed, _RpcDataSource_unsubscribeIncomingTransactions, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector, _RpcDataSource_convertToHumanReadable, _RpcDataSource_collectMetadataForBalances, _RpcDataSource_handleBalanceUpdate, _RpcDataSource_handleDetectionUpdate, _RpcDataSource_subscribeToNetworkController, _RpcDataSource_subscribeToTransactionEvents, _RpcDataSource_onTransactionConfirmed, _RpcDataSource_onIncomingTransactions, _RpcDataSource_refreshBalanceForChains, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_getMulticallProvider, _RpcDataSource_clearProviderCache, _RpcDataSource_buildNativeAssetId, _RpcDataSource_getExistingAssetsMetadata, _RpcDataSource_getTokenMetadataFromTokenList;
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.createRpcDataSource = exports.RpcDataSource = exports.caipChainIdToHex = void 0;
|
|
19
19
|
const providers_1 = require("@ethersproject/providers");
|
|
20
|
-
const base_controller_1 = require("@metamask/base-controller");
|
|
21
20
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
22
21
|
const utils_1 = require("@metamask/utils");
|
|
23
22
|
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
23
|
+
const AbstractDataSource_1 = require("./AbstractDataSource.cjs");
|
|
24
24
|
const evm_rpc_services_1 = require("./evm-rpc-services/index.cjs");
|
|
25
25
|
const logger_1 = require("../logger.cjs");
|
|
26
26
|
const CONTROLLER_NAME = 'RpcDataSource';
|
|
@@ -61,17 +61,15 @@ exports.caipChainIdToHex = caipChainIdToHex;
|
|
|
61
61
|
* - RpcDataSource:activeChainsUpdated
|
|
62
62
|
* - RpcDataSource:assetsUpdated
|
|
63
63
|
*/
|
|
64
|
-
class RpcDataSource extends
|
|
64
|
+
class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
|
|
65
65
|
constructor(options) {
|
|
66
|
-
super({
|
|
67
|
-
name: CONTROLLER_NAME,
|
|
68
|
-
metadata: {},
|
|
69
|
-
state: {},
|
|
70
|
-
messenger: options.messenger,
|
|
71
|
-
});
|
|
66
|
+
super(CONTROLLER_NAME, { activeChains: [] });
|
|
72
67
|
_RpcDataSource_instances.add(this);
|
|
68
|
+
_RpcDataSource_messenger.set(this, void 0);
|
|
69
|
+
_RpcDataSource_onActiveChainsUpdated.set(this, void 0);
|
|
73
70
|
_RpcDataSource_timeout.set(this, void 0);
|
|
74
71
|
_RpcDataSource_tokenDetectionEnabled.set(this, void 0);
|
|
72
|
+
_RpcDataSource_useExternalService.set(this, void 0);
|
|
75
73
|
/** Currently active chains */
|
|
76
74
|
_RpcDataSource_activeChains.set(this, []);
|
|
77
75
|
/** Network status for each active chain */
|
|
@@ -80,19 +78,25 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
80
78
|
_RpcDataSource_providerCache.set(this, new Map());
|
|
81
79
|
/** Active subscriptions by ID */
|
|
82
80
|
_RpcDataSource_activeSubscriptions.set(this, new Map());
|
|
81
|
+
_RpcDataSource_unsubscribeTransactionConfirmed.set(this, undefined);
|
|
82
|
+
_RpcDataSource_unsubscribeIncomingTransactions.set(this, undefined);
|
|
83
83
|
// Rpc-datasource components
|
|
84
84
|
_RpcDataSource_multicallClient.set(this, void 0);
|
|
85
85
|
_RpcDataSource_balanceFetcher.set(this, void 0);
|
|
86
86
|
_RpcDataSource_tokenDetector.set(this, void 0);
|
|
87
|
+
__classPrivateFieldSet(this, _RpcDataSource_messenger, options.messenger, "f");
|
|
88
|
+
__classPrivateFieldSet(this, _RpcDataSource_onActiveChainsUpdated, options.onActiveChainsUpdated, "f");
|
|
87
89
|
__classPrivateFieldSet(this, _RpcDataSource_timeout, options.timeout ?? 10000, "f");
|
|
88
|
-
__classPrivateFieldSet(this, _RpcDataSource_tokenDetectionEnabled, options.tokenDetectionEnabled ??
|
|
90
|
+
__classPrivateFieldSet(this, _RpcDataSource_tokenDetectionEnabled, options.tokenDetectionEnabled ?? (() => true), "f");
|
|
91
|
+
__classPrivateFieldSet(this, _RpcDataSource_useExternalService, options.useExternalService ?? (() => true), "f");
|
|
89
92
|
const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL;
|
|
90
93
|
const detectionInterval = options.detectionInterval ?? DEFAULT_DETECTION_INTERVAL;
|
|
91
94
|
log('Initializing RpcDataSource', {
|
|
92
95
|
timeout: __classPrivateFieldGet(this, _RpcDataSource_timeout, "f"),
|
|
93
96
|
balanceInterval,
|
|
94
97
|
detectionInterval,
|
|
95
|
-
tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f"),
|
|
98
|
+
tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this),
|
|
99
|
+
useExternalService: __classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this),
|
|
96
100
|
});
|
|
97
101
|
// Initialize MulticallClient with a provider getter
|
|
98
102
|
__classPrivateFieldSet(this, _RpcDataSource_multicallClient, new evm_rpc_services_1.MulticallClient((hexChainId) => {
|
|
@@ -101,7 +105,7 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
101
105
|
// Create messenger adapters for BalanceFetcher and TokenDetector
|
|
102
106
|
const balanceFetcherMessenger = {
|
|
103
107
|
call: (_action) => {
|
|
104
|
-
const state = this.
|
|
108
|
+
const state = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:getState');
|
|
105
109
|
return {
|
|
106
110
|
assetsBalance: (state.assetsBalance ?? {}),
|
|
107
111
|
};
|
|
@@ -109,17 +113,21 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
109
113
|
};
|
|
110
114
|
const tokenDetectorMessenger = {
|
|
111
115
|
call: (_action) => {
|
|
112
|
-
return this.
|
|
116
|
+
return __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('TokenListController:getState');
|
|
113
117
|
},
|
|
114
118
|
};
|
|
115
119
|
// Initialize BalanceFetcher with polling interval
|
|
116
120
|
__classPrivateFieldSet(this, _RpcDataSource_balanceFetcher, new evm_rpc_services_1.BalanceFetcher(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), balanceFetcherMessenger, { pollingInterval: balanceInterval }), "f");
|
|
117
121
|
__classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setOnBalanceUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleBalanceUpdate).bind(this));
|
|
118
122
|
// Initialize TokenDetector with polling interval
|
|
119
|
-
__classPrivateFieldSet(this, _RpcDataSource_tokenDetector, new evm_rpc_services_1.TokenDetector(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), tokenDetectorMessenger, {
|
|
123
|
+
__classPrivateFieldSet(this, _RpcDataSource_tokenDetector, new evm_rpc_services_1.TokenDetector(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), tokenDetectorMessenger, {
|
|
124
|
+
pollingInterval: detectionInterval,
|
|
125
|
+
tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f"),
|
|
126
|
+
useExternalService: __classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f"),
|
|
127
|
+
}), "f");
|
|
120
128
|
__classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setOnDetectionUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleDetectionUpdate).bind(this));
|
|
121
|
-
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_registerActionHandlers).call(this);
|
|
122
129
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_subscribeToNetworkController).call(this);
|
|
130
|
+
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_subscribeToTransactionEvents).call(this);
|
|
123
131
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_initializeFromNetworkController).call(this);
|
|
124
132
|
}
|
|
125
133
|
/**
|
|
@@ -127,17 +135,6 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
127
135
|
*
|
|
128
136
|
* @returns The name of this data source.
|
|
129
137
|
*/
|
|
130
|
-
getName() {
|
|
131
|
-
return this.name;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Get currently active chains.
|
|
135
|
-
*
|
|
136
|
-
* @returns Promise resolving to array of active chain IDs.
|
|
137
|
-
*/
|
|
138
|
-
async getActiveChains() {
|
|
139
|
-
return __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f");
|
|
140
|
-
}
|
|
141
138
|
/**
|
|
142
139
|
* Get the status of all configured chains.
|
|
143
140
|
*
|
|
@@ -193,7 +190,7 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
193
190
|
const response = {};
|
|
194
191
|
const chainsToFetch = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
|
|
195
192
|
log('Fetch requested', {
|
|
196
|
-
accounts: request.
|
|
193
|
+
accounts: request.accountsWithSupportedChains.map((a) => a.account.id),
|
|
197
194
|
requestedChains: request.chainIds,
|
|
198
195
|
chainsToFetch,
|
|
199
196
|
});
|
|
@@ -202,16 +199,17 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
202
199
|
return response;
|
|
203
200
|
}
|
|
204
201
|
const assetsBalance = {};
|
|
205
|
-
const
|
|
202
|
+
const assetsInfo = {};
|
|
206
203
|
const failedChains = [];
|
|
207
|
-
// Fetch balances for each
|
|
208
|
-
for (const
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
204
|
+
// Fetch balances for each account and its supported chains (pre-computed in request)
|
|
205
|
+
for (const { account, supportedChains, } of request.accountsWithSupportedChains) {
|
|
206
|
+
const chainsForAccount = chainsToFetch.filter((chain) => supportedChains.includes(chain));
|
|
207
|
+
if (chainsForAccount.length === 0) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
const { address, id: accountId } = account;
|
|
211
|
+
for (const chainId of chainsForAccount) {
|
|
212
|
+
const hexChainId = (0, exports.caipChainIdToHex)(chainId);
|
|
215
213
|
try {
|
|
216
214
|
// Use BalanceFetcher for batched balance fetching
|
|
217
215
|
const result = await __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").fetchBalancesForTokens(hexChainId, accountId, address, [], // Empty array means just native token
|
|
@@ -221,10 +219,10 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
221
219
|
}
|
|
222
220
|
// Collect metadata for all balances
|
|
223
221
|
const balanceMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, chainId);
|
|
224
|
-
Object.assign(
|
|
222
|
+
Object.assign(assetsInfo, balanceMetadata);
|
|
225
223
|
// Convert balances to human-readable format
|
|
226
224
|
for (const balance of result.balances) {
|
|
227
|
-
const metadata =
|
|
225
|
+
const metadata = assetsInfo[balance.assetId];
|
|
228
226
|
// Default to 18 decimals (ERC20 standard) for consistent human-readable format
|
|
229
227
|
const decimals = metadata?.decimals ?? 18;
|
|
230
228
|
const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
|
|
@@ -243,7 +241,7 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
243
241
|
// Even on error, include native token metadata
|
|
244
242
|
const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
|
|
245
243
|
if (chainStatus) {
|
|
246
|
-
|
|
244
|
+
assetsInfo[nativeAssetId] = {
|
|
247
245
|
type: 'native',
|
|
248
246
|
symbol: chainStatus.nativeCurrency,
|
|
249
247
|
name: chainStatus.nativeCurrency,
|
|
@@ -274,8 +272,8 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
274
272
|
}
|
|
275
273
|
response.assetsBalance = assetsBalance;
|
|
276
274
|
// Include metadata for native tokens if we have any
|
|
277
|
-
if (Object.keys(
|
|
278
|
-
response.
|
|
275
|
+
if (Object.keys(assetsInfo).length > 0) {
|
|
276
|
+
response.assetsInfo = assetsInfo;
|
|
279
277
|
}
|
|
280
278
|
return response;
|
|
281
279
|
}
|
|
@@ -287,14 +285,17 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
287
285
|
* @returns Promise resolving to a DataResponse with detected assets.
|
|
288
286
|
*/
|
|
289
287
|
async detectTokens(chainId, account) {
|
|
290
|
-
if (!__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f")) {
|
|
288
|
+
if (!__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this) || !__classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this)) {
|
|
291
289
|
return {};
|
|
292
290
|
}
|
|
293
291
|
const hexChainId = (0, exports.caipChainIdToHex)(chainId);
|
|
294
292
|
const { address, id: accountId } = account;
|
|
295
293
|
log('Running token detection', { chainId, accountId });
|
|
296
294
|
try {
|
|
297
|
-
const result = await __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").detectTokens(hexChainId, accountId, address
|
|
295
|
+
const result = await __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").detectTokens(hexChainId, accountId, address, {
|
|
296
|
+
tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this),
|
|
297
|
+
useExternalService: __classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this),
|
|
298
|
+
});
|
|
298
299
|
if (result.detectedAssets.length === 0) {
|
|
299
300
|
log('No new tokens detected');
|
|
300
301
|
return {};
|
|
@@ -306,11 +307,11 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
306
307
|
});
|
|
307
308
|
// Convert detected assets to DataResponse format
|
|
308
309
|
const balances = {};
|
|
309
|
-
const
|
|
310
|
+
const assetsInfo = {};
|
|
310
311
|
// Build metadata from detected assets
|
|
311
312
|
for (const asset of result.detectedAssets) {
|
|
312
313
|
if (asset.symbol && asset.decimals !== undefined) {
|
|
313
|
-
|
|
314
|
+
assetsInfo[asset.assetId] = {
|
|
314
315
|
type: 'erc20',
|
|
315
316
|
symbol: asset.symbol,
|
|
316
317
|
name: asset.name ?? asset.symbol,
|
|
@@ -338,8 +339,8 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
338
339
|
},
|
|
339
340
|
};
|
|
340
341
|
// Include metadata if we have any
|
|
341
|
-
if (Object.keys(
|
|
342
|
-
response.
|
|
342
|
+
if (Object.keys(assetsInfo).length > 0) {
|
|
343
|
+
response.assetsInfo = assetsInfo;
|
|
343
344
|
}
|
|
344
345
|
return response;
|
|
345
346
|
}
|
|
@@ -359,7 +360,7 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
359
360
|
let successfullyHandledChains = [];
|
|
360
361
|
log('Middleware fetching', {
|
|
361
362
|
chains: supportedChains,
|
|
362
|
-
accounts: request.
|
|
363
|
+
accounts: request.accountsWithSupportedChains.map((a) => a.account.id),
|
|
363
364
|
});
|
|
364
365
|
const response = await this.fetch({
|
|
365
366
|
...request,
|
|
@@ -375,11 +376,11 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
375
376
|
};
|
|
376
377
|
}
|
|
377
378
|
}
|
|
378
|
-
if (response.
|
|
379
|
-
(_c = context.response).
|
|
380
|
-
context.response.
|
|
381
|
-
...context.response.
|
|
382
|
-
...response.
|
|
379
|
+
if (response.assetsInfo) {
|
|
380
|
+
(_c = context.response).assetsInfo ?? (_c.assetsInfo = {});
|
|
381
|
+
context.response.assetsInfo = {
|
|
382
|
+
...context.response.assetsInfo,
|
|
383
|
+
...response.assetsInfo,
|
|
383
384
|
};
|
|
384
385
|
}
|
|
385
386
|
const failedChains = new Set(Object.keys(response.errors ?? {}));
|
|
@@ -409,7 +410,7 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
409
410
|
log('Subscribe requested', {
|
|
410
411
|
subscriptionId,
|
|
411
412
|
isUpdate,
|
|
412
|
-
accounts: request.
|
|
413
|
+
accounts: request.accountsWithSupportedChains.map((a) => a.account.id),
|
|
413
414
|
chainsToSubscribe,
|
|
414
415
|
});
|
|
415
416
|
if (chainsToSubscribe.length === 0) {
|
|
@@ -430,16 +431,17 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
430
431
|
}
|
|
431
432
|
// Clean up existing subscription (stops old polling)
|
|
432
433
|
await this.unsubscribe(subscriptionId);
|
|
433
|
-
// Start polling through BalanceFetcher and TokenDetector
|
|
434
|
+
// Start polling through BalanceFetcher and TokenDetector (use pre-computed supportedChains per account)
|
|
434
435
|
const balancePollingTokens = [];
|
|
435
436
|
const detectionPollingTokens = [];
|
|
436
|
-
for (const
|
|
437
|
-
const
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
437
|
+
for (const { account, supportedChains, } of request.accountsWithSupportedChains) {
|
|
438
|
+
const chainsForAccount = chainsToSubscribe.filter((chain) => supportedChains.includes(chain));
|
|
439
|
+
if (chainsForAccount.length === 0) {
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
const { address, id: accountId } = account;
|
|
443
|
+
for (const chainId of chainsForAccount) {
|
|
444
|
+
const hexChainId = (0, exports.caipChainIdToHex)(chainId);
|
|
443
445
|
// Start balance polling
|
|
444
446
|
const balanceInput = {
|
|
445
447
|
chainId: hexChainId,
|
|
@@ -448,8 +450,8 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
448
450
|
};
|
|
449
451
|
const balanceToken = __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").startPolling(balanceInput);
|
|
450
452
|
balancePollingTokens.push(balanceToken);
|
|
451
|
-
// Start detection polling if enabled
|
|
452
|
-
if (__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f")) {
|
|
453
|
+
// Start detection polling if enabled and external services allowed
|
|
454
|
+
if (__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this) && __classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this)) {
|
|
453
455
|
const detectionInput = {
|
|
454
456
|
chainId: hexChainId,
|
|
455
457
|
accountId,
|
|
@@ -461,11 +463,13 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
461
463
|
}
|
|
462
464
|
}
|
|
463
465
|
// Store subscription data
|
|
466
|
+
const accounts = request.accountsWithSupportedChains.map((entry) => entry.account);
|
|
464
467
|
__classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").set(subscriptionId, {
|
|
465
468
|
balancePollingTokens,
|
|
466
469
|
detectionPollingTokens,
|
|
467
470
|
chains: chainsToSubscribe,
|
|
468
|
-
accounts
|
|
471
|
+
accounts,
|
|
472
|
+
onAssetsUpdate: subscriptionRequest.onAssetsUpdate,
|
|
469
473
|
});
|
|
470
474
|
log('Subscription SUCCESS', {
|
|
471
475
|
subscriptionId,
|
|
@@ -499,6 +503,8 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
499
503
|
*/
|
|
500
504
|
destroy() {
|
|
501
505
|
log('Destroying RpcDataSource');
|
|
506
|
+
__classPrivateFieldGet(this, _RpcDataSource_unsubscribeTransactionConfirmed, "f")?.call(this);
|
|
507
|
+
__classPrivateFieldGet(this, _RpcDataSource_unsubscribeIncomingTransactions, "f")?.call(this);
|
|
502
508
|
// Stop all polling
|
|
503
509
|
__classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").stopAllPolling();
|
|
504
510
|
__classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").stopAllPolling();
|
|
@@ -509,19 +515,19 @@ class RpcDataSource extends base_controller_1.BaseController {
|
|
|
509
515
|
}
|
|
510
516
|
}
|
|
511
517
|
exports.RpcDataSource = RpcDataSource;
|
|
512
|
-
_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_convertToHumanReadable = function _RpcDataSource_convertToHumanReadable(rawBalance, decimals) {
|
|
518
|
+
_RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated = new WeakMap(), _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = new WeakMap(), _RpcDataSource_useExternalService = new WeakMap(), _RpcDataSource_activeChains = new WeakMap(), _RpcDataSource_chainStatuses = new WeakMap(), _RpcDataSource_providerCache = new WeakMap(), _RpcDataSource_activeSubscriptions = new WeakMap(), _RpcDataSource_unsubscribeTransactionConfirmed = new WeakMap(), _RpcDataSource_unsubscribeIncomingTransactions = new WeakMap(), _RpcDataSource_multicallClient = new WeakMap(), _RpcDataSource_balanceFetcher = new WeakMap(), _RpcDataSource_tokenDetector = new WeakMap(), _RpcDataSource_instances = new WeakSet(), _RpcDataSource_convertToHumanReadable = function _RpcDataSource_convertToHumanReadable(rawBalance, decimals) {
|
|
513
519
|
const rawAmount = new bignumber_js_1.default(rawBalance);
|
|
514
520
|
const divisor = new bignumber_js_1.default(10).pow(decimals);
|
|
515
521
|
return rawAmount.dividedBy(divisor).toString();
|
|
516
522
|
}, _RpcDataSource_collectMetadataForBalances = function _RpcDataSource_collectMetadataForBalances(balances, chainId) {
|
|
517
|
-
const
|
|
523
|
+
const assetsInfo = {};
|
|
518
524
|
const existingMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getExistingAssetsMetadata).call(this);
|
|
519
525
|
for (const balance of balances) {
|
|
520
526
|
const isNative = balance.assetId.includes('/slip44:');
|
|
521
527
|
if (isNative) {
|
|
522
528
|
const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
|
|
523
529
|
if (chainStatus) {
|
|
524
|
-
|
|
530
|
+
assetsInfo[balance.assetId] = {
|
|
525
531
|
type: 'native',
|
|
526
532
|
symbol: chainStatus.nativeCurrency,
|
|
527
533
|
name: chainStatus.nativeCurrency,
|
|
@@ -533,19 +539,19 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
|
|
|
533
539
|
// For ERC20 tokens, try existing metadata from state first
|
|
534
540
|
const existingMeta = existingMetadata[balance.assetId];
|
|
535
541
|
if (existingMeta) {
|
|
536
|
-
|
|
542
|
+
assetsInfo[balance.assetId] = existingMeta;
|
|
537
543
|
}
|
|
538
544
|
else {
|
|
539
545
|
// Fallback to token list if not in state
|
|
540
546
|
const tokenListMeta = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getTokenMetadataFromTokenList).call(this, balance.assetId);
|
|
541
547
|
if (tokenListMeta) {
|
|
542
|
-
|
|
548
|
+
assetsInfo[balance.assetId] = tokenListMeta;
|
|
543
549
|
}
|
|
544
550
|
else {
|
|
545
551
|
// Default metadata for unknown ERC20 tokens.
|
|
546
552
|
// Use 18 decimals (the standard for most ERC20 tokens)
|
|
547
553
|
// to ensure consistent human-readable balance format.
|
|
548
|
-
|
|
554
|
+
assetsInfo[balance.assetId] = {
|
|
549
555
|
type: 'erc20',
|
|
550
556
|
symbol: '',
|
|
551
557
|
name: '',
|
|
@@ -555,17 +561,17 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
|
|
|
555
561
|
}
|
|
556
562
|
}
|
|
557
563
|
}
|
|
558
|
-
return
|
|
564
|
+
return assetsInfo;
|
|
559
565
|
}, _RpcDataSource_handleBalanceUpdate = function _RpcDataSource_handleBalanceUpdate(result) {
|
|
560
566
|
const newBalances = {};
|
|
561
567
|
// Convert hex chain ID to CAIP-2 format
|
|
562
568
|
const chainIdDecimal = parseInt(result.chainId, 16);
|
|
563
569
|
const caipChainId = `eip155:${chainIdDecimal}`;
|
|
564
570
|
// Collect metadata for all balances
|
|
565
|
-
const
|
|
571
|
+
const assetsInfo = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, caipChainId);
|
|
566
572
|
// Convert balances to human-readable format using metadata
|
|
567
573
|
for (const balance of result.balances) {
|
|
568
|
-
const metadata =
|
|
574
|
+
const metadata = assetsInfo[balance.assetId];
|
|
569
575
|
// Default to 18 decimals (ERC20 standard) for consistent human-readable format
|
|
570
576
|
const decimals = metadata?.decimals ?? 18;
|
|
571
577
|
const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
|
|
@@ -579,17 +585,17 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
|
|
|
579
585
|
assetsBalance: {
|
|
580
586
|
[result.accountId]: newBalances,
|
|
581
587
|
},
|
|
582
|
-
|
|
588
|
+
assetsInfo,
|
|
583
589
|
};
|
|
584
590
|
log('Balance update response', {
|
|
585
591
|
accountId: result.accountId,
|
|
586
592
|
newBalanceCount: Object.keys(newBalances).length,
|
|
587
593
|
});
|
|
588
|
-
this.
|
|
589
|
-
.
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
}
|
|
594
|
+
for (const subscription of __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").values()) {
|
|
595
|
+
subscription.onAssetsUpdate(response)?.catch((error) => {
|
|
596
|
+
log('Failed to update assets', { error });
|
|
597
|
+
});
|
|
598
|
+
}
|
|
593
599
|
}, _RpcDataSource_handleDetectionUpdate = function _RpcDataSource_handleDetectionUpdate(result) {
|
|
594
600
|
log('Detected new tokens', {
|
|
595
601
|
count: result.detectedAssets.length,
|
|
@@ -630,37 +636,93 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
|
|
|
630
636
|
detectedAssets: {
|
|
631
637
|
[result.accountId]: result.detectedAssets.map((asset) => asset.assetId),
|
|
632
638
|
},
|
|
633
|
-
|
|
639
|
+
assetsInfo: newMetadata,
|
|
634
640
|
assetsBalance: {
|
|
635
641
|
[result.accountId]: newBalances,
|
|
636
642
|
},
|
|
637
643
|
};
|
|
638
|
-
this.
|
|
639
|
-
.
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
}
|
|
643
|
-
}, _RpcDataSource_registerActionHandlers = function _RpcDataSource_registerActionHandlers() {
|
|
644
|
-
const getAssetsMiddlewareHandler = () => this.assetsMiddleware;
|
|
645
|
-
const getActiveChainsHandler = async () => this.getActiveChains();
|
|
646
|
-
const fetchHandler = async (request) => this.fetch(request);
|
|
647
|
-
const subscribeHandler = async (request) => this.subscribe(request);
|
|
648
|
-
const unsubscribeHandler = async (subscriptionId) => this.unsubscribe(subscriptionId);
|
|
649
|
-
this.messenger.registerActionHandler('RpcDataSource:getAssetsMiddleware', getAssetsMiddlewareHandler);
|
|
650
|
-
this.messenger.registerActionHandler('RpcDataSource:getActiveChains', getActiveChainsHandler);
|
|
651
|
-
this.messenger.registerActionHandler('RpcDataSource:fetch', fetchHandler);
|
|
652
|
-
this.messenger.registerActionHandler('RpcDataSource:subscribe', subscribeHandler);
|
|
653
|
-
this.messenger.registerActionHandler('RpcDataSource:unsubscribe', unsubscribeHandler);
|
|
644
|
+
for (const subscription of __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").values()) {
|
|
645
|
+
subscription.onAssetsUpdate(response)?.catch((error) => {
|
|
646
|
+
log('Failed to update detected assets', { error });
|
|
647
|
+
});
|
|
648
|
+
}
|
|
654
649
|
}, _RpcDataSource_subscribeToNetworkController = function _RpcDataSource_subscribeToNetworkController() {
|
|
655
|
-
this.
|
|
650
|
+
__classPrivateFieldGet(this, _RpcDataSource_messenger, "f").subscribe('NetworkController:stateChange', (networkState) => {
|
|
656
651
|
log('NetworkController state changed');
|
|
657
652
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_clearProviderCache).call(this);
|
|
658
653
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_updateFromNetworkState).call(this, networkState);
|
|
659
654
|
});
|
|
655
|
+
}, _RpcDataSource_subscribeToTransactionEvents = function _RpcDataSource_subscribeToTransactionEvents() {
|
|
656
|
+
const unsubConfirmed = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").subscribe('TransactionController:transactionConfirmed', __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_onTransactionConfirmed).bind(this));
|
|
657
|
+
__classPrivateFieldSet(this, _RpcDataSource_unsubscribeTransactionConfirmed, typeof unsubConfirmed === 'function' ? unsubConfirmed : undefined, "f");
|
|
658
|
+
const unsubIncoming = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").subscribe('TransactionController:incomingTransactionsReceived', __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_onIncomingTransactions).bind(this));
|
|
659
|
+
__classPrivateFieldSet(this, _RpcDataSource_unsubscribeIncomingTransactions, typeof unsubIncoming === 'function' ? unsubIncoming : undefined, "f");
|
|
660
|
+
}, _RpcDataSource_onTransactionConfirmed = function _RpcDataSource_onTransactionConfirmed(payload) {
|
|
661
|
+
const hexChainId = payload?.chainId;
|
|
662
|
+
if (!hexChainId) {
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
665
|
+
const caipChainId = `eip155:${parseInt(hexChainId, 16)}`;
|
|
666
|
+
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_refreshBalanceForChains).call(this, [caipChainId]).catch((error) => {
|
|
667
|
+
log('Failed to refresh balance after transaction confirmed', { error });
|
|
668
|
+
});
|
|
669
|
+
}, _RpcDataSource_onIncomingTransactions = function _RpcDataSource_onIncomingTransactions(payload) {
|
|
670
|
+
const chainIds = Array.from(new Set((payload ?? [])
|
|
671
|
+
.map((item) => item?.chainId)
|
|
672
|
+
.filter((id) => Boolean(id))));
|
|
673
|
+
const caipChainIds = chainIds.map((hexChainId) => `eip155:${parseInt(hexChainId, 16)}`);
|
|
674
|
+
const toRefresh = caipChainIds.length > 0 ? caipChainIds : [...__classPrivateFieldGet(this, _RpcDataSource_activeChains, "f")];
|
|
675
|
+
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_refreshBalanceForChains).call(this, toRefresh).catch((error) => {
|
|
676
|
+
log('Failed to refresh balance after incoming transactions', { error });
|
|
677
|
+
});
|
|
678
|
+
}, _RpcDataSource_refreshBalanceForChains =
|
|
679
|
+
/**
|
|
680
|
+
* Fetch balances for the given chains across all active subscriptions and
|
|
681
|
+
* push updates to the controller.
|
|
682
|
+
*
|
|
683
|
+
* @param chainIds - CAIP-2 chain IDs to refresh.
|
|
684
|
+
*/
|
|
685
|
+
async function _RpcDataSource_refreshBalanceForChains(chainIds) {
|
|
686
|
+
const chainIdsSet = new Set(chainIds);
|
|
687
|
+
const chainsToFetch = chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
|
|
688
|
+
if (chainsToFetch.length === 0) {
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
for (const subscription of __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").values()) {
|
|
692
|
+
const subscriptionChains = subscription.chains.filter((chainId) => chainIdsSet.has(chainId));
|
|
693
|
+
if (subscriptionChains.length === 0) {
|
|
694
|
+
continue;
|
|
695
|
+
}
|
|
696
|
+
const request = {
|
|
697
|
+
accountsWithSupportedChains: subscription.accounts.map((account) => ({
|
|
698
|
+
account,
|
|
699
|
+
supportedChains: subscriptionChains,
|
|
700
|
+
})),
|
|
701
|
+
chainIds: subscriptionChains,
|
|
702
|
+
dataTypes: ['balance'],
|
|
703
|
+
};
|
|
704
|
+
try {
|
|
705
|
+
const response = await this.fetch(request);
|
|
706
|
+
if (response.assetsBalance &&
|
|
707
|
+
Object.keys(response.assetsBalance).length > 0) {
|
|
708
|
+
subscription.onAssetsUpdate(response)?.catch((error) => {
|
|
709
|
+
log('Failed to report balance update after transaction', {
|
|
710
|
+
error,
|
|
711
|
+
});
|
|
712
|
+
});
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
catch (error) {
|
|
716
|
+
log('Failed to fetch balance after transaction', {
|
|
717
|
+
chains: subscriptionChains,
|
|
718
|
+
error,
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
}
|
|
660
722
|
}, _RpcDataSource_initializeFromNetworkController = function _RpcDataSource_initializeFromNetworkController() {
|
|
661
723
|
log('Initializing from NetworkController');
|
|
662
724
|
try {
|
|
663
|
-
const networkState = this.
|
|
725
|
+
const networkState = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('NetworkController:getState');
|
|
664
726
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_updateFromNetworkState).call(this, networkState);
|
|
665
727
|
}
|
|
666
728
|
catch (error) {
|
|
@@ -696,14 +758,18 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
|
|
|
696
758
|
activeChains,
|
|
697
759
|
});
|
|
698
760
|
// Check if chains changed
|
|
699
|
-
const previousChains =
|
|
700
|
-
const
|
|
701
|
-
|
|
702
|
-
|
|
761
|
+
const previousChains = [...__classPrivateFieldGet(this, _RpcDataSource_activeChains, "f")];
|
|
762
|
+
const previousSet = new Set(previousChains);
|
|
763
|
+
const hasChanges = previousChains.length !== activeChains.length ||
|
|
764
|
+
activeChains.some((chain) => !previousSet.has(chain));
|
|
765
|
+
// Update internal state and data source state before notifying, so that
|
|
766
|
+
// when the controller handles the callback and calls getActiveChainsSync(),
|
|
767
|
+
// it receives the updated chains (same order as AbstractDataSource.updateActiveChains).
|
|
703
768
|
__classPrivateFieldSet(this, _RpcDataSource_chainStatuses, chainStatuses, "f");
|
|
704
769
|
__classPrivateFieldSet(this, _RpcDataSource_activeChains, activeChains, "f");
|
|
770
|
+
this.state.activeChains = activeChains;
|
|
705
771
|
if (hasChanges) {
|
|
706
|
-
this.
|
|
772
|
+
__classPrivateFieldGet(this, _RpcDataSource_onActiveChainsUpdated, "f").call(this, this.getName(), activeChains, previousChains);
|
|
707
773
|
}
|
|
708
774
|
}, _RpcDataSource_getProvider = function _RpcDataSource_getProvider(chainId) {
|
|
709
775
|
const cached = __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").get(chainId);
|
|
@@ -715,7 +781,10 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
|
|
|
715
781
|
return undefined;
|
|
716
782
|
}
|
|
717
783
|
try {
|
|
718
|
-
const networkClient = this.
|
|
784
|
+
const networkClient = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('NetworkController:getNetworkClientById', chainStatus.networkClientId);
|
|
785
|
+
if (!networkClient?.provider) {
|
|
786
|
+
return undefined;
|
|
787
|
+
}
|
|
719
788
|
const web3Provider = new providers_1.Web3Provider(networkClient.provider);
|
|
720
789
|
__classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").set(chainId, web3Provider);
|
|
721
790
|
return web3Provider;
|
|
@@ -745,39 +814,14 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
|
|
|
745
814
|
};
|
|
746
815
|
}, _RpcDataSource_clearProviderCache = function _RpcDataSource_clearProviderCache() {
|
|
747
816
|
__classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").clear();
|
|
748
|
-
}, _RpcDataSource_accountSupportsChain = function _RpcDataSource_accountSupportsChain(account, chainId) {
|
|
749
|
-
const scopes = account.scopes ?? [];
|
|
750
|
-
if (scopes.length === 0) {
|
|
751
|
-
return true;
|
|
752
|
-
}
|
|
753
|
-
const [chainNamespace, chainReference] = chainId.split(':');
|
|
754
|
-
for (const scope of scopes) {
|
|
755
|
-
const [scopeNamespace, scopeReference] = scope.split(':');
|
|
756
|
-
if (scopeNamespace !== chainNamespace) {
|
|
757
|
-
continue;
|
|
758
|
-
}
|
|
759
|
-
// Wildcard scope (e.g., eip155:0) matches all chains in the namespace
|
|
760
|
-
if (scopeReference === '0') {
|
|
761
|
-
return true;
|
|
762
|
-
}
|
|
763
|
-
// RpcDataSource only handles eip155 (EVM) chains
|
|
764
|
-
// Normalize hex chain references (e.g., 0x1 -> 1) for comparison
|
|
765
|
-
const normalizedScopeRef = scopeReference?.startsWith('0x')
|
|
766
|
-
? parseInt(scopeReference, 16).toString()
|
|
767
|
-
: scopeReference;
|
|
768
|
-
if (normalizedScopeRef === chainReference) {
|
|
769
|
-
return true;
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
return false;
|
|
773
817
|
}, _RpcDataSource_buildNativeAssetId = function _RpcDataSource_buildNativeAssetId(chainId) {
|
|
774
|
-
const { nativeAssetIdentifiers } = this.
|
|
818
|
+
const { nativeAssetIdentifiers } = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('NetworkEnablementController:getState');
|
|
775
819
|
return (nativeAssetIdentifiers[chainId] ??
|
|
776
820
|
`${chainId}/slip44:60`);
|
|
777
821
|
}, _RpcDataSource_getExistingAssetsMetadata = function _RpcDataSource_getExistingAssetsMetadata() {
|
|
778
822
|
try {
|
|
779
|
-
const state = this.
|
|
780
|
-
return
|
|
823
|
+
const state = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:getState');
|
|
824
|
+
return state.assetsInfo ?? {};
|
|
781
825
|
}
|
|
782
826
|
catch {
|
|
783
827
|
// If AssetsController:getState fails, return empty metadata
|
|
@@ -785,17 +829,15 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
|
|
|
785
829
|
}
|
|
786
830
|
}, _RpcDataSource_getTokenMetadataFromTokenList = function _RpcDataSource_getTokenMetadataFromTokenList(assetId) {
|
|
787
831
|
try {
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
const [chainPart, assetPart] = assetId.split('/');
|
|
791
|
-
if (!assetPart?.startsWith('erc20:')) {
|
|
832
|
+
const parsed = (0, utils_1.parseCaipAssetType)(assetId);
|
|
833
|
+
if (parsed.assetNamespace !== 'erc20') {
|
|
792
834
|
return undefined;
|
|
793
835
|
}
|
|
794
|
-
const tokenAddress =
|
|
795
|
-
const
|
|
796
|
-
const hexChainId =
|
|
797
|
-
const tokenListState = this.
|
|
798
|
-
const chainCacheEntry = tokenListState
|
|
836
|
+
const tokenAddress = parsed.assetReference;
|
|
837
|
+
const { reference } = (0, utils_1.parseCaipChainId)(parsed.chainId);
|
|
838
|
+
const hexChainId = (0, utils_1.numberToHex)(parseInt(reference, 10));
|
|
839
|
+
const tokenListState = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('TokenListController:getState');
|
|
840
|
+
const chainCacheEntry = tokenListState?.tokensChainsCache?.[hexChainId];
|
|
799
841
|
const chainTokenList = chainCacheEntry?.data;
|
|
800
842
|
if (!chainTokenList) {
|
|
801
843
|
return undefined;
|