@metamask-previews/assets-controller 0.0.0-preview-3ec2a74 → 0.0.0-preview-6ae8a59c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/dist/data-sources/RpcDataSource.cjs +415 -186
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +115 -30
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +115 -30
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +413 -185
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.mjs.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/index.cjs +4 -1
- package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/index.d.cts +5 -0
- package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/index.d.mts +5 -0
- package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/index.mjs +1 -0
- package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/BalanceFetcher.cjs +33 -3
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +68 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +68 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/BalanceFetcher.mjs +33 -3
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/TokenDetector.cjs +33 -3
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +66 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +66 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -0
- package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/TokenDetector.mjs +33 -3
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.cts +3 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.mts +3 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -0
- package/dist/data-sources/initDataSources.cjs +5 -1
- package/dist/data-sources/initDataSources.cjs.map +1 -1
- package/dist/data-sources/initDataSources.d.cts +15 -0
- package/dist/data-sources/initDataSources.d.cts.map +1 -1
- package/dist/data-sources/initDataSources.d.mts +15 -0
- package/dist/data-sources/initDataSources.d.mts.map +1 -1
- package/dist/data-sources/initDataSources.mjs +5 -1
- package/dist/data-sources/initDataSources.mjs.map +1 -1
- package/package.json +5 -2
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/index.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/index.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/index.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/clients/index.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/index.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/index.d.cts +0 -4
- package/dist/data-sources/rpc-datasource/index.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/index.d.mts +0 -4
- package/dist/data-sources/rpc-datasource/index.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/index.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts +0 -16
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts +0 -16
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/TokenDetector.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts +0 -14
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts +0 -14
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/TokenDetector.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/index.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/services/index.d.cts +0 -3
- package/dist/data-sources/rpc-datasource/services/index.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/index.d.mts +0 -3
- package/dist/data-sources/rpc-datasource/services/index.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/services/index.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/assets.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/assets.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/assets.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/assets.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/config.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/config.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/config.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/config.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/core.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/core.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/core.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/core.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/index.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/index.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/index.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/index.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/multicall.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/multicall.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/multicall.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/multicall.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/services.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/services.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/services.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/services.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/state.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/types/state.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/state.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/types/state.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/batch.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/batch.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/batch.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/batch.mjs.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/index.cjs.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/index.d.cts.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/index.d.mts.map +0 -1
- package/dist/data-sources/rpc-datasource/utils/index.mjs.map +0 -1
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/index.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/index.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.mjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.cjs +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.d.cts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.d.mts +0 -0
- /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.mjs +0 -0
|
@@ -10,35 +10,40 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _RpcDataSource_instances,
|
|
13
|
+
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;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.createRpcDataSource = exports.RpcDataSource = void 0;
|
|
15
|
+
exports.createRpcDataSource = exports.RpcDataSource = exports.caipChainIdToHex = void 0;
|
|
16
16
|
const providers_1 = require("@ethersproject/providers");
|
|
17
|
-
const
|
|
17
|
+
const base_controller_1 = require("@metamask/base-controller");
|
|
18
|
+
const controller_utils_1 = require("@metamask/controller-utils");
|
|
19
|
+
const utils_1 = require("@metamask/utils");
|
|
20
|
+
const evm_rpc_services_1 = require("./evm-rpc-services/index.cjs");
|
|
18
21
|
const logger_1 = require("../logger.cjs");
|
|
19
|
-
// ============================================================================
|
|
20
|
-
// CONSTANTS
|
|
21
|
-
// ============================================================================
|
|
22
22
|
const CONTROLLER_NAME = 'RpcDataSource';
|
|
23
|
-
const
|
|
23
|
+
const DEFAULT_BALANCE_INTERVAL = 30000; // 30 seconds
|
|
24
|
+
const DEFAULT_DETECTION_INTERVAL = 180000; // 3 minutes
|
|
24
25
|
const log = (0, logger_1.createModuleLogger)(logger_1.projectLogger, CONTROLLER_NAME);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Convert CAIP chain ID or hex chain ID to hex chain ID.
|
|
28
|
+
*
|
|
29
|
+
* @param chainId - CAIP chain ID or hex chain ID.
|
|
30
|
+
* @returns Hex chain ID.
|
|
31
|
+
*/
|
|
32
|
+
const caipChainIdToHex = (chainId) => {
|
|
33
|
+
if ((0, utils_1.isStrictHexString)(chainId)) {
|
|
34
|
+
return chainId;
|
|
35
|
+
}
|
|
36
|
+
if ((0, utils_1.isCaipChainId)(chainId)) {
|
|
37
|
+
return (0, controller_utils_1.toHex)((0, utils_1.parseCaipChainId)(chainId).reference);
|
|
38
|
+
}
|
|
39
|
+
throw new Error('caipChainIdToHex - Failed to provide CAIP-2 or Hex chainId');
|
|
28
40
|
};
|
|
29
|
-
|
|
30
|
-
// HELPER FUNCTIONS
|
|
31
|
-
// ============================================================================
|
|
32
|
-
function buildNativeAssetId(chainId) {
|
|
33
|
-
return `${chainId}/slip44:60`;
|
|
34
|
-
}
|
|
35
|
-
// ============================================================================
|
|
36
|
-
// RPC DATA SOURCE
|
|
37
|
-
// ============================================================================
|
|
41
|
+
exports.caipChainIdToHex = caipChainIdToHex;
|
|
38
42
|
/**
|
|
39
43
|
* Data source for fetching balances via RPC calls.
|
|
40
44
|
*
|
|
41
|
-
*
|
|
45
|
+
* Orchestrates polling through BalanceFetcher and TokenDetector,
|
|
46
|
+
* each of which handle their own polling intervals.
|
|
42
47
|
*
|
|
43
48
|
* Communicates with AssetsController via Messenger:
|
|
44
49
|
*
|
|
@@ -52,88 +57,176 @@ function buildNativeAssetId(chainId) {
|
|
|
52
57
|
* - RpcDataSource:activeChainsUpdated
|
|
53
58
|
* - RpcDataSource:assetsUpdated
|
|
54
59
|
*/
|
|
55
|
-
class RpcDataSource extends
|
|
60
|
+
class RpcDataSource extends base_controller_1.BaseController {
|
|
56
61
|
constructor(options) {
|
|
57
|
-
super(
|
|
58
|
-
|
|
59
|
-
|
|
62
|
+
super({
|
|
63
|
+
name: CONTROLLER_NAME,
|
|
64
|
+
metadata: {},
|
|
65
|
+
state: {},
|
|
66
|
+
messenger: options.messenger,
|
|
60
67
|
});
|
|
61
68
|
_RpcDataSource_instances.add(this);
|
|
62
|
-
_RpcDataSource_messenger.set(this, void 0);
|
|
63
69
|
_RpcDataSource_timeout.set(this, void 0);
|
|
64
|
-
|
|
70
|
+
_RpcDataSource_tokenDetectionEnabled.set(this, void 0);
|
|
71
|
+
/** Currently active chains */
|
|
72
|
+
_RpcDataSource_activeChains.set(this, []);
|
|
73
|
+
/** Network status for each active chain */
|
|
74
|
+
_RpcDataSource_chainStatuses.set(this, {});
|
|
65
75
|
/** Cache of Web3Provider instances by chainId */
|
|
66
76
|
_RpcDataSource_providerCache.set(this, new Map());
|
|
67
|
-
|
|
77
|
+
/** Active subscriptions by ID */
|
|
78
|
+
_RpcDataSource_activeSubscriptions.set(this, new Map());
|
|
79
|
+
// Rpc-datasource components
|
|
80
|
+
_RpcDataSource_multicallClient.set(this, void 0);
|
|
81
|
+
_RpcDataSource_balanceFetcher.set(this, void 0);
|
|
82
|
+
_RpcDataSource_tokenDetector.set(this, void 0);
|
|
68
83
|
__classPrivateFieldSet(this, _RpcDataSource_timeout, options.timeout ?? 10000, "f");
|
|
69
|
-
__classPrivateFieldSet(this,
|
|
84
|
+
__classPrivateFieldSet(this, _RpcDataSource_tokenDetectionEnabled, options.tokenDetectionEnabled ?? false, "f");
|
|
85
|
+
const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL;
|
|
86
|
+
const detectionInterval = options.detectionInterval ?? DEFAULT_DETECTION_INTERVAL;
|
|
87
|
+
log('Initializing RpcDataSource', {
|
|
88
|
+
timeout: __classPrivateFieldGet(this, _RpcDataSource_timeout, "f"),
|
|
89
|
+
balanceInterval,
|
|
90
|
+
detectionInterval,
|
|
91
|
+
tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f"),
|
|
92
|
+
});
|
|
93
|
+
// Initialize MulticallClient with a provider getter
|
|
94
|
+
__classPrivateFieldSet(this, _RpcDataSource_multicallClient, new evm_rpc_services_1.MulticallClient((hexChainId) => {
|
|
95
|
+
return __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getMulticallProvider).call(this, hexChainId);
|
|
96
|
+
}), "f");
|
|
97
|
+
// Create state getters using messenger
|
|
98
|
+
const getTokenListState = () => {
|
|
99
|
+
return this.messenger.call('TokenListController:getState');
|
|
100
|
+
};
|
|
101
|
+
const getUserTokensState = () => {
|
|
102
|
+
return this.messenger.call('AssetsController:getState');
|
|
103
|
+
};
|
|
104
|
+
// Initialize BalanceFetcher with polling interval
|
|
105
|
+
__classPrivateFieldSet(this, _RpcDataSource_balanceFetcher, new evm_rpc_services_1.BalanceFetcher(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), {
|
|
106
|
+
pollingInterval: balanceInterval,
|
|
107
|
+
}), "f");
|
|
108
|
+
__classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setUserTokensStateGetter(getUserTokensState);
|
|
109
|
+
__classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setOnBalanceUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleBalanceUpdate).bind(this));
|
|
110
|
+
// Initialize TokenDetector with polling interval
|
|
111
|
+
__classPrivateFieldSet(this, _RpcDataSource_tokenDetector, new evm_rpc_services_1.TokenDetector(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), {
|
|
112
|
+
pollingInterval: detectionInterval,
|
|
113
|
+
}), "f");
|
|
114
|
+
__classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setTokenListStateGetter(getTokenListState);
|
|
115
|
+
__classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setOnDetectionUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleDetectionUpdate).bind(this));
|
|
70
116
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_registerActionHandlers).call(this);
|
|
71
117
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_subscribeToNetworkController).call(this);
|
|
72
118
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_initializeFromNetworkController).call(this);
|
|
73
119
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
120
|
+
/**
|
|
121
|
+
* Get the data source name.
|
|
122
|
+
*
|
|
123
|
+
* @returns The name of this data source.
|
|
124
|
+
*/
|
|
125
|
+
getName() {
|
|
126
|
+
return this.name;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get currently active chains.
|
|
130
|
+
*
|
|
131
|
+
* @returns Promise resolving to array of active chain IDs.
|
|
132
|
+
*/
|
|
133
|
+
async getActiveChains() {
|
|
134
|
+
return __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f");
|
|
135
|
+
}
|
|
77
136
|
/**
|
|
78
137
|
* Get the status of all configured chains.
|
|
79
138
|
*
|
|
80
139
|
* @returns Record of chain statuses keyed by chain ID.
|
|
81
140
|
*/
|
|
82
141
|
getChainStatuses() {
|
|
83
|
-
return { ...this
|
|
142
|
+
return { ...__classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f") };
|
|
84
143
|
}
|
|
85
144
|
/**
|
|
86
145
|
* Get the status of a specific chain.
|
|
87
146
|
*
|
|
88
|
-
* @param chainId - The
|
|
89
|
-
* @returns The chain status
|
|
147
|
+
* @param chainId - The chain ID to get status for.
|
|
148
|
+
* @returns The chain status or undefined if not found.
|
|
90
149
|
*/
|
|
91
150
|
getChainStatus(chainId) {
|
|
92
|
-
return this
|
|
151
|
+
return __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Set the balance polling interval.
|
|
155
|
+
*
|
|
156
|
+
* @param interval - The polling interval in milliseconds.
|
|
157
|
+
*/
|
|
158
|
+
setBalancePollingInterval(interval) {
|
|
159
|
+
log('Setting balance polling interval', { interval });
|
|
160
|
+
__classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setIntervalLength(interval);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get the current balance polling interval.
|
|
164
|
+
*
|
|
165
|
+
* @returns The polling interval in milliseconds, or undefined if not set.
|
|
166
|
+
*/
|
|
167
|
+
getBalancePollingInterval() {
|
|
168
|
+
return __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").getIntervalLength();
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Set the token detection polling interval.
|
|
172
|
+
*
|
|
173
|
+
* @param interval - The polling interval in milliseconds.
|
|
174
|
+
*/
|
|
175
|
+
setDetectionPollingInterval(interval) {
|
|
176
|
+
log('Setting detection polling interval', { interval });
|
|
177
|
+
__classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setIntervalLength(interval);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get the current token detection polling interval.
|
|
181
|
+
*
|
|
182
|
+
* @returns The polling interval in milliseconds, or undefined if not set.
|
|
183
|
+
*/
|
|
184
|
+
getDetectionPollingInterval() {
|
|
185
|
+
return __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").getIntervalLength();
|
|
93
186
|
}
|
|
94
|
-
// ============================================================================
|
|
95
|
-
// FETCH
|
|
96
|
-
// ============================================================================
|
|
97
187
|
async fetch(request) {
|
|
98
188
|
const response = {};
|
|
99
|
-
|
|
100
|
-
|
|
189
|
+
const chainsToFetch = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
|
|
190
|
+
log('Fetch requested', {
|
|
191
|
+
accounts: request.accounts.map((a) => a.id),
|
|
192
|
+
requestedChains: request.chainIds,
|
|
193
|
+
chainsToFetch,
|
|
194
|
+
});
|
|
101
195
|
if (chainsToFetch.length === 0) {
|
|
196
|
+
log('No active chains to fetch');
|
|
102
197
|
return response;
|
|
103
198
|
}
|
|
104
199
|
const assetsBalance = {};
|
|
105
200
|
const failedChains = [];
|
|
106
|
-
// Fetch
|
|
201
|
+
// Fetch balances for each chain using BalanceFetcher
|
|
107
202
|
for (const chainId of chainsToFetch) {
|
|
108
|
-
const
|
|
109
|
-
if (!provider) {
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
const assetId = buildNativeAssetId(chainId);
|
|
113
|
-
// Fetch balance for each account that supports this chain
|
|
203
|
+
const hexChainId = (0, exports.caipChainIdToHex)(chainId);
|
|
114
204
|
for (const account of request.accounts) {
|
|
115
|
-
// Check if account supports this chain based on its scopes
|
|
116
205
|
if (!__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_accountSupportsChain).call(this, account, chainId)) {
|
|
117
206
|
continue;
|
|
118
207
|
}
|
|
119
208
|
const { address, id: accountId } = account;
|
|
120
209
|
try {
|
|
121
|
-
|
|
122
|
-
const
|
|
123
|
-
|
|
210
|
+
// Use BalanceFetcher for batched balance fetching
|
|
211
|
+
const result = await __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").fetchBalancesForTokens(hexChainId, accountId, address, [], // Empty array means just native token
|
|
212
|
+
{ includeNative: true });
|
|
124
213
|
if (!assetsBalance[accountId]) {
|
|
125
214
|
assetsBalance[accountId] = {};
|
|
126
215
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
216
|
+
// Convert balances to response format
|
|
217
|
+
for (const balance of result.balances) {
|
|
218
|
+
assetsBalance[accountId][balance.assetId] = {
|
|
219
|
+
amount: balance.balance,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
130
222
|
}
|
|
131
223
|
catch (error) {
|
|
132
224
|
log('Failed to fetch balance', { address, chainId, error });
|
|
133
225
|
if (!assetsBalance[accountId]) {
|
|
134
226
|
assetsBalance[accountId] = {};
|
|
135
227
|
}
|
|
136
|
-
|
|
228
|
+
const nativeAssetId = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_buildNativeAssetId).call(this, chainId);
|
|
229
|
+
assetsBalance[accountId][nativeAssetId] = { amount: '0' };
|
|
137
230
|
if (!failedChains.includes(chainId)) {
|
|
138
231
|
failedChains.push(chainId);
|
|
139
232
|
}
|
|
@@ -141,68 +234,101 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
|
|
|
141
234
|
}
|
|
142
235
|
}
|
|
143
236
|
if (failedChains.length > 0) {
|
|
144
|
-
|
|
237
|
+
log('Fetch PARTIAL - some chains failed', {
|
|
238
|
+
successChains: chainsToFetch.filter((chain) => !failedChains.includes(chain)),
|
|
239
|
+
failedChains,
|
|
240
|
+
});
|
|
145
241
|
response.errors = {};
|
|
146
242
|
for (const chainId of failedChains) {
|
|
147
243
|
response.errors[chainId] = 'RPC fetch failed';
|
|
148
244
|
}
|
|
149
245
|
}
|
|
246
|
+
else {
|
|
247
|
+
log('Fetch SUCCESS', {
|
|
248
|
+
chains: chainsToFetch,
|
|
249
|
+
accountCount: Object.keys(assetsBalance).length,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
150
252
|
response.assetsBalance = assetsBalance;
|
|
151
253
|
return response;
|
|
152
254
|
}
|
|
153
|
-
// ============================================================================
|
|
154
|
-
// MIDDLEWARE
|
|
155
|
-
// ============================================================================
|
|
156
255
|
/**
|
|
157
|
-
*
|
|
158
|
-
* This middleware:
|
|
159
|
-
* - Supports multiple accounts in a single request
|
|
160
|
-
* - Filters request to only chains this data source supports
|
|
161
|
-
* - Fetches balances for those chains for all accounts
|
|
162
|
-
* - Merges response into context
|
|
163
|
-
* - Removes handled chains from request for next middleware
|
|
256
|
+
* Run token detection for an account on a chain.
|
|
164
257
|
*
|
|
165
|
-
* @
|
|
258
|
+
* @param chainId - The chain ID to detect tokens on.
|
|
259
|
+
* @param account - The account to detect tokens for.
|
|
260
|
+
* @returns Promise resolving to a DataResponse with detected assets.
|
|
166
261
|
*/
|
|
262
|
+
async detectTokens(chainId, account) {
|
|
263
|
+
if (!__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f")) {
|
|
264
|
+
return {};
|
|
265
|
+
}
|
|
266
|
+
const hexChainId = (0, exports.caipChainIdToHex)(chainId);
|
|
267
|
+
const { address, id: accountId } = account;
|
|
268
|
+
log('Running token detection', { chainId, accountId });
|
|
269
|
+
try {
|
|
270
|
+
const result = await __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").detectTokens(hexChainId, accountId, address);
|
|
271
|
+
if (result.detectedAssets.length === 0) {
|
|
272
|
+
log('No new tokens detected');
|
|
273
|
+
return {};
|
|
274
|
+
}
|
|
275
|
+
log('Detected new tokens', {
|
|
276
|
+
count: result.detectedAssets.length,
|
|
277
|
+
chainId,
|
|
278
|
+
accountId,
|
|
279
|
+
});
|
|
280
|
+
// Convert detected assets to DataResponse format
|
|
281
|
+
const balances = {};
|
|
282
|
+
// Add balances for detected tokens
|
|
283
|
+
for (const balance of result.detectedBalances) {
|
|
284
|
+
balances[balance.assetId] = {
|
|
285
|
+
amount: balance.balance,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
const response = {
|
|
289
|
+
detectedAssets: {
|
|
290
|
+
[accountId]: result.detectedAssets.map((asset) => asset.assetId),
|
|
291
|
+
},
|
|
292
|
+
assetsBalance: {
|
|
293
|
+
[accountId]: balances,
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
return response;
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
log('Token detection failed', { chainId, accountId, error });
|
|
300
|
+
return {};
|
|
301
|
+
}
|
|
302
|
+
}
|
|
167
303
|
get assetsMiddleware() {
|
|
168
304
|
return async (context, next) => {
|
|
169
|
-
var _a;
|
|
305
|
+
var _a, _b;
|
|
170
306
|
const { request } = context;
|
|
171
|
-
|
|
172
|
-
const supportedChains = request.chainIds.filter((chainId) => this.state.activeChains.includes(chainId));
|
|
173
|
-
// If no supported chains, skip and pass to next middleware
|
|
307
|
+
const supportedChains = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
|
|
174
308
|
if (supportedChains.length === 0) {
|
|
175
309
|
return next(context);
|
|
176
310
|
}
|
|
177
311
|
let successfullyHandledChains = [];
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
context.response.assetsBalance[accountId]
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
};
|
|
195
|
-
}
|
|
312
|
+
log('Middleware fetching', {
|
|
313
|
+
chains: supportedChains,
|
|
314
|
+
accounts: request.accounts.map((a) => a.id),
|
|
315
|
+
});
|
|
316
|
+
const response = await this.fetch({
|
|
317
|
+
...request,
|
|
318
|
+
chainIds: supportedChains,
|
|
319
|
+
});
|
|
320
|
+
if (response.assetsBalance) {
|
|
321
|
+
(_a = context.response).assetsBalance ?? (_a.assetsBalance = {});
|
|
322
|
+
for (const [accountId, accountBalances] of Object.entries(response.assetsBalance)) {
|
|
323
|
+
(_b = context.response.assetsBalance)[accountId] ?? (_b[accountId] = {});
|
|
324
|
+
context.response.assetsBalance[accountId] = {
|
|
325
|
+
...context.response.assetsBalance[accountId],
|
|
326
|
+
...accountBalances,
|
|
327
|
+
};
|
|
196
328
|
}
|
|
197
|
-
// Determine successfully handled chains (exclude errors)
|
|
198
|
-
const failedChains = new Set(Object.keys(response.errors ?? {}));
|
|
199
|
-
successfullyHandledChains = supportedChains.filter((chainId) => !failedChains.has(chainId));
|
|
200
329
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
successfullyHandledChains = [];
|
|
204
|
-
}
|
|
205
|
-
// Remove successfully handled chains from request for next middleware
|
|
330
|
+
const failedChains = new Set(Object.keys(response.errors ?? {}));
|
|
331
|
+
successfullyHandledChains = supportedChains.filter((chainId) => !failedChains.has(chainId));
|
|
206
332
|
if (successfullyHandledChains.length > 0) {
|
|
207
333
|
const remainingChains = request.chainIds.filter((chainId) => !successfullyHandledChains.includes(chainId));
|
|
208
334
|
return next({
|
|
@@ -213,88 +339,185 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
|
|
|
213
339
|
},
|
|
214
340
|
});
|
|
215
341
|
}
|
|
216
|
-
// No chains handled - pass context unchanged
|
|
217
342
|
return next(context);
|
|
218
343
|
};
|
|
219
344
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
345
|
+
/**
|
|
346
|
+
* Subscribe to updates for the given request.
|
|
347
|
+
* Starts polling through BalanceFetcher and TokenDetector.
|
|
348
|
+
*
|
|
349
|
+
* @param subscriptionRequest - The subscription request details.
|
|
350
|
+
*/
|
|
223
351
|
async subscribe(subscriptionRequest) {
|
|
224
352
|
const { request, subscriptionId, isUpdate } = subscriptionRequest;
|
|
225
|
-
|
|
226
|
-
|
|
353
|
+
const chainsToSubscribe = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
|
|
354
|
+
log('Subscribe requested', {
|
|
355
|
+
subscriptionId,
|
|
356
|
+
isUpdate,
|
|
357
|
+
accounts: request.accounts.map((a) => a.id),
|
|
358
|
+
chainsToSubscribe,
|
|
359
|
+
});
|
|
227
360
|
if (chainsToSubscribe.length === 0) {
|
|
361
|
+
log('No active chains to subscribe');
|
|
228
362
|
return;
|
|
229
363
|
}
|
|
230
|
-
// Handle subscription update
|
|
364
|
+
// Handle subscription update
|
|
231
365
|
if (isUpdate) {
|
|
232
|
-
const existing = this.
|
|
366
|
+
const existing = __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").get(subscriptionId);
|
|
233
367
|
if (existing) {
|
|
368
|
+
log('Updating existing subscription', {
|
|
369
|
+
subscriptionId,
|
|
370
|
+
chainsToSubscribe,
|
|
371
|
+
});
|
|
234
372
|
existing.chains = chainsToSubscribe;
|
|
235
|
-
existing.
|
|
373
|
+
existing.accounts = request.accounts;
|
|
236
374
|
return;
|
|
237
375
|
}
|
|
238
376
|
}
|
|
239
377
|
// Clean up existing subscription
|
|
240
378
|
await this.unsubscribe(subscriptionId);
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
const
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
379
|
+
// Start polling through BalanceFetcher and TokenDetector
|
|
380
|
+
const balancePollingTokens = [];
|
|
381
|
+
const detectionPollingTokens = [];
|
|
382
|
+
for (const chainId of chainsToSubscribe) {
|
|
383
|
+
const hexChainId = (0, exports.caipChainIdToHex)(chainId);
|
|
384
|
+
for (const account of request.accounts) {
|
|
385
|
+
if (!__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_accountSupportsChain).call(this, account, chainId)) {
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
const { address, id: accountId } = account;
|
|
389
|
+
// Start balance polling
|
|
390
|
+
const balanceInput = {
|
|
391
|
+
chainId: hexChainId,
|
|
392
|
+
accountId,
|
|
393
|
+
accountAddress: address,
|
|
394
|
+
};
|
|
395
|
+
const balanceToken = __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").startPolling(balanceInput);
|
|
396
|
+
balancePollingTokens.push(balanceToken);
|
|
397
|
+
// Start detection polling if enabled
|
|
398
|
+
if (__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f")) {
|
|
399
|
+
const detectionInput = {
|
|
400
|
+
chainId: hexChainId,
|
|
401
|
+
accountId,
|
|
402
|
+
accountAddress: address,
|
|
403
|
+
};
|
|
404
|
+
const detectionToken = __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").startPolling(detectionInput);
|
|
405
|
+
detectionPollingTokens.push(detectionToken);
|
|
248
406
|
}
|
|
249
|
-
// Use stored request (which gets updated on account changes)
|
|
250
|
-
const fetchResponse = await this.fetch({
|
|
251
|
-
...subscription.request,
|
|
252
|
-
chainIds: subscription.chains,
|
|
253
|
-
});
|
|
254
|
-
// Report update to AssetsController
|
|
255
|
-
await __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:assetsUpdate', fetchResponse, CONTROLLER_NAME);
|
|
256
|
-
}
|
|
257
|
-
catch (error) {
|
|
258
|
-
log('Subscription poll failed', { subscriptionId, error });
|
|
259
407
|
}
|
|
260
|
-
}
|
|
261
|
-
//
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
408
|
+
}
|
|
409
|
+
// Store subscription data
|
|
410
|
+
__classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").set(subscriptionId, {
|
|
411
|
+
balancePollingTokens,
|
|
412
|
+
detectionPollingTokens,
|
|
413
|
+
chains: chainsToSubscribe,
|
|
414
|
+
accounts: request.accounts,
|
|
415
|
+
});
|
|
416
|
+
log('Subscription SUCCESS', {
|
|
417
|
+
subscriptionId,
|
|
270
418
|
chains: chainsToSubscribe,
|
|
271
|
-
|
|
419
|
+
balancePollingCount: balancePollingTokens.length,
|
|
420
|
+
detectionPollingCount: detectionPollingTokens.length,
|
|
272
421
|
});
|
|
273
|
-
|
|
274
|
-
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Unsubscribe from updates and stop polling.
|
|
425
|
+
*
|
|
426
|
+
* @param subscriptionId - The subscription ID to unsubscribe.
|
|
427
|
+
*/
|
|
428
|
+
async unsubscribe(subscriptionId) {
|
|
429
|
+
const subscription = __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").get(subscriptionId);
|
|
430
|
+
if (subscription) {
|
|
431
|
+
// Stop balance polling
|
|
432
|
+
for (const token of subscription.balancePollingTokens) {
|
|
433
|
+
__classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").stopPollingByPollingToken(token);
|
|
434
|
+
}
|
|
435
|
+
// Stop detection polling
|
|
436
|
+
for (const token of subscription.detectionPollingTokens) {
|
|
437
|
+
__classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").stopPollingByPollingToken(token);
|
|
438
|
+
}
|
|
439
|
+
__classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").delete(subscriptionId);
|
|
440
|
+
log('Unsubscribed and stopped polling', { subscriptionId });
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Destroy the data source and clean up resources.
|
|
445
|
+
*/
|
|
446
|
+
destroy() {
|
|
447
|
+
log('Destroying RpcDataSource');
|
|
448
|
+
// Stop all polling
|
|
449
|
+
__classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").stopAllPolling();
|
|
450
|
+
__classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").stopAllPolling();
|
|
451
|
+
// Clear subscriptions
|
|
452
|
+
__classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").clear();
|
|
453
|
+
// Clear caches
|
|
454
|
+
__classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").clear();
|
|
275
455
|
}
|
|
276
456
|
}
|
|
277
457
|
exports.RpcDataSource = RpcDataSource;
|
|
278
|
-
|
|
458
|
+
_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) {
|
|
459
|
+
const accountBalances = {};
|
|
460
|
+
for (const balance of result.balances) {
|
|
461
|
+
accountBalances[balance.assetId] = {
|
|
462
|
+
amount: balance.balance,
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
const response = {
|
|
466
|
+
assetsBalance: {
|
|
467
|
+
[result.accountId]: accountBalances,
|
|
468
|
+
},
|
|
469
|
+
};
|
|
470
|
+
this.messenger
|
|
471
|
+
.call('AssetsController:assetsUpdate', response, CONTROLLER_NAME)
|
|
472
|
+
.catch((error) => {
|
|
473
|
+
log('Failed to update assets', { error });
|
|
474
|
+
});
|
|
475
|
+
}, _RpcDataSource_handleDetectionUpdate = function _RpcDataSource_handleDetectionUpdate(result) {
|
|
476
|
+
log('Detected new tokens', {
|
|
477
|
+
count: result.detectedAssets.length,
|
|
478
|
+
});
|
|
479
|
+
const response = {
|
|
480
|
+
detectedAssets: {
|
|
481
|
+
[result.accountId]: result.detectedAssets.map((asset) => asset.assetId),
|
|
482
|
+
},
|
|
483
|
+
};
|
|
484
|
+
// Add balances for detected tokens
|
|
485
|
+
if (result.detectedBalances.length > 0) {
|
|
486
|
+
response.assetsBalance = {
|
|
487
|
+
[result.accountId]: {},
|
|
488
|
+
};
|
|
489
|
+
for (const balance of result.detectedBalances) {
|
|
490
|
+
response.assetsBalance[result.accountId][balance.assetId] = {
|
|
491
|
+
amount: balance.balance,
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
this.messenger
|
|
496
|
+
.call('AssetsController:assetsUpdate', response, CONTROLLER_NAME)
|
|
497
|
+
.catch((error) => {
|
|
498
|
+
log('Failed to update detected assets', { error });
|
|
499
|
+
});
|
|
500
|
+
}, _RpcDataSource_registerActionHandlers = function _RpcDataSource_registerActionHandlers() {
|
|
279
501
|
const getAssetsMiddlewareHandler = () => this.assetsMiddleware;
|
|
280
502
|
const getActiveChainsHandler = async () => this.getActiveChains();
|
|
281
503
|
const fetchHandler = async (request) => this.fetch(request);
|
|
282
504
|
const subscribeHandler = async (request) => this.subscribe(request);
|
|
283
505
|
const unsubscribeHandler = async (subscriptionId) => this.unsubscribe(subscriptionId);
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
506
|
+
this.messenger.registerActionHandler('RpcDataSource:getAssetsMiddleware', getAssetsMiddlewareHandler);
|
|
507
|
+
this.messenger.registerActionHandler('RpcDataSource:getActiveChains', getActiveChainsHandler);
|
|
508
|
+
this.messenger.registerActionHandler('RpcDataSource:fetch', fetchHandler);
|
|
509
|
+
this.messenger.registerActionHandler('RpcDataSource:subscribe', subscribeHandler);
|
|
510
|
+
this.messenger.registerActionHandler('RpcDataSource:unsubscribe', unsubscribeHandler);
|
|
289
511
|
}, _RpcDataSource_subscribeToNetworkController = function _RpcDataSource_subscribeToNetworkController() {
|
|
290
|
-
|
|
291
|
-
|
|
512
|
+
this.messenger.subscribe('NetworkController:stateChange', (networkState) => {
|
|
513
|
+
log('NetworkController state changed');
|
|
292
514
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_clearProviderCache).call(this);
|
|
293
515
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_updateFromNetworkState).call(this, networkState);
|
|
294
516
|
});
|
|
295
517
|
}, _RpcDataSource_initializeFromNetworkController = function _RpcDataSource_initializeFromNetworkController() {
|
|
518
|
+
log('Initializing from NetworkController');
|
|
296
519
|
try {
|
|
297
|
-
const networkState =
|
|
520
|
+
const networkState = this.messenger.call('NetworkController:getState');
|
|
298
521
|
__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_updateFromNetworkState).call(this, networkState);
|
|
299
522
|
}
|
|
300
523
|
catch (error) {
|
|
@@ -304,19 +527,15 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_timeout = new WeakMap()
|
|
|
304
527
|
const { networkConfigurationsByChainId, networksMetadata } = networkState;
|
|
305
528
|
const chainStatuses = {};
|
|
306
529
|
const activeChains = [];
|
|
307
|
-
// Iterate through all configured networks
|
|
308
530
|
for (const [hexChainId, config] of Object.entries(networkConfigurationsByChainId)) {
|
|
309
|
-
// Convert hex chainId to CAIP-2 format (eip155:decimal)
|
|
310
531
|
const decimalChainId = parseInt(hexChainId, 16);
|
|
311
532
|
const caip2ChainId = `eip155:${decimalChainId}`;
|
|
312
|
-
// Get the default RPC endpoint's network client ID
|
|
313
533
|
const defaultRpcEndpoint = config.rpcEndpoints[config.defaultRpcEndpointIndex];
|
|
314
534
|
if (!defaultRpcEndpoint) {
|
|
315
535
|
continue;
|
|
316
536
|
}
|
|
317
537
|
const { networkClientId } = defaultRpcEndpoint;
|
|
318
538
|
const metadata = networksMetadata[networkClientId];
|
|
319
|
-
// Determine status - default to 'unknown' if not in metadata
|
|
320
539
|
const status = metadata?.status ?? 'unknown';
|
|
321
540
|
chainStatuses[caip2ChainId] = {
|
|
322
541
|
chainId: caip2ChainId,
|
|
@@ -325,84 +544,94 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_timeout = new WeakMap()
|
|
|
325
544
|
nativeCurrency: config.nativeCurrency,
|
|
326
545
|
networkClientId,
|
|
327
546
|
};
|
|
328
|
-
// Only include chains that have an available status
|
|
329
|
-
// (not degraded/unavailable/blocked)
|
|
330
547
|
if (status === 'available' || status === 'unknown') {
|
|
331
548
|
activeChains.push(caip2ChainId);
|
|
332
549
|
}
|
|
333
550
|
}
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
551
|
+
log('Network state updated', {
|
|
552
|
+
configuredChains: Object.keys(chainStatuses),
|
|
553
|
+
activeChains,
|
|
554
|
+
});
|
|
555
|
+
// Check if chains changed
|
|
556
|
+
const previousChains = new Set(__classPrivateFieldGet(this, _RpcDataSource_activeChains, "f"));
|
|
557
|
+
const hasChanges = previousChains.size !== activeChains.length ||
|
|
558
|
+
activeChains.some((chain) => !previousChains.has(chain));
|
|
559
|
+
// Update internal state
|
|
560
|
+
__classPrivateFieldSet(this, _RpcDataSource_chainStatuses, chainStatuses, "f");
|
|
561
|
+
__classPrivateFieldSet(this, _RpcDataSource_activeChains, activeChains, "f");
|
|
562
|
+
if (hasChanges) {
|
|
563
|
+
this.messenger.call('AssetsController:activeChainsUpdate', CONTROLLER_NAME, activeChains);
|
|
564
|
+
}
|
|
338
565
|
}, _RpcDataSource_getProvider = function _RpcDataSource_getProvider(chainId) {
|
|
339
|
-
// Check cache first
|
|
340
566
|
const cached = __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").get(chainId);
|
|
341
567
|
if (cached) {
|
|
342
568
|
return cached;
|
|
343
569
|
}
|
|
344
|
-
|
|
345
|
-
const chainStatus = this.state.chainStatuses[chainId];
|
|
570
|
+
const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
|
|
346
571
|
if (!chainStatus) {
|
|
347
572
|
return undefined;
|
|
348
573
|
}
|
|
349
574
|
try {
|
|
350
|
-
|
|
351
|
-
const networkClient = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('NetworkController:getNetworkClientById', chainStatus.networkClientId);
|
|
352
|
-
// Create Web3Provider directly
|
|
575
|
+
const networkClient = this.messenger.call('NetworkController:getNetworkClientById', chainStatus.networkClientId);
|
|
353
576
|
const web3Provider = new providers_1.Web3Provider(networkClient.provider);
|
|
354
|
-
// Cache for reuse
|
|
355
577
|
__classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").set(chainId, web3Provider);
|
|
356
578
|
return web3Provider;
|
|
357
579
|
}
|
|
358
580
|
catch (error) {
|
|
359
|
-
|
|
581
|
+
log('Failed to get provider for chain', { chainId, error });
|
|
360
582
|
return undefined;
|
|
361
583
|
}
|
|
584
|
+
}, _RpcDataSource_getMulticallProvider = function _RpcDataSource_getMulticallProvider(hexChainId) {
|
|
585
|
+
const decimalChainId = parseInt(hexChainId, 16);
|
|
586
|
+
const caip2ChainId = `eip155:${decimalChainId}`;
|
|
587
|
+
const web3Provider = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getProvider).call(this, caip2ChainId);
|
|
588
|
+
if (!web3Provider) {
|
|
589
|
+
throw new Error(`No provider available for chain ${hexChainId}`);
|
|
590
|
+
}
|
|
591
|
+
return {
|
|
592
|
+
call: async (params) => {
|
|
593
|
+
return web3Provider.call({
|
|
594
|
+
to: params.to,
|
|
595
|
+
data: params.data,
|
|
596
|
+
});
|
|
597
|
+
},
|
|
598
|
+
getBalance: async (address) => {
|
|
599
|
+
const balance = await web3Provider.getBalance(address);
|
|
600
|
+
return balance;
|
|
601
|
+
},
|
|
602
|
+
};
|
|
362
603
|
}, _RpcDataSource_clearProviderCache = function _RpcDataSource_clearProviderCache() {
|
|
363
604
|
__classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").clear();
|
|
364
605
|
}, _RpcDataSource_accountSupportsChain = function _RpcDataSource_accountSupportsChain(account, chainId) {
|
|
365
606
|
const scopes = account.scopes ?? [];
|
|
366
|
-
// If no scopes defined, assume it supports the chain (backward compatibility)
|
|
367
607
|
if (scopes.length === 0) {
|
|
368
608
|
return true;
|
|
369
609
|
}
|
|
370
|
-
// Extract namespace and reference from chainId (e.g., "eip155:1" -> ["eip155", "1"])
|
|
371
610
|
const [chainNamespace, chainReference] = chainId.split(':');
|
|
372
611
|
for (const scope of scopes) {
|
|
373
612
|
const [scopeNamespace, scopeReference] = scope.split(':');
|
|
374
|
-
// Check if namespaces match
|
|
375
613
|
if (scopeNamespace !== chainNamespace) {
|
|
376
614
|
continue;
|
|
377
615
|
}
|
|
378
|
-
// Wildcard scope (e.g.,
|
|
616
|
+
// Wildcard scope (e.g., eip155:0) matches all chains in the namespace
|
|
379
617
|
if (scopeReference === '0') {
|
|
380
618
|
return true;
|
|
381
619
|
}
|
|
382
|
-
//
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
return true;
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
else if (scopeReference === chainReference) {
|
|
620
|
+
// RpcDataSource only handles eip155 (EVM) chains
|
|
621
|
+
// Normalize hex chain references (e.g., 0x1 -> 1) for comparison
|
|
622
|
+
const normalizedScopeRef = scopeReference?.startsWith('0x')
|
|
623
|
+
? parseInt(scopeReference, 16).toString()
|
|
624
|
+
: scopeReference;
|
|
625
|
+
if (normalizedScopeRef === chainReference) {
|
|
392
626
|
return true;
|
|
393
627
|
}
|
|
394
628
|
}
|
|
395
629
|
return false;
|
|
630
|
+
}, _RpcDataSource_buildNativeAssetId = function _RpcDataSource_buildNativeAssetId(chainId) {
|
|
631
|
+
const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');
|
|
632
|
+
return (nativeAssetIdentifiers[chainId] ??
|
|
633
|
+
`${chainId}/slip44:60`);
|
|
396
634
|
};
|
|
397
|
-
// ============================================================================
|
|
398
|
-
// FACTORY FUNCTION
|
|
399
|
-
// ============================================================================
|
|
400
|
-
/**
|
|
401
|
-
* Creates an RpcDataSource instance.
|
|
402
|
-
*
|
|
403
|
-
* @param options - Configuration options for the data source.
|
|
404
|
-
* @returns A new RpcDataSource instance.
|
|
405
|
-
*/
|
|
406
635
|
function createRpcDataSource(options) {
|
|
407
636
|
return new RpcDataSource(options);
|
|
408
637
|
}
|