@metamask-previews/assets-controller 14.0.2-preview-b13d916 → 14.0.2-preview-4f4c98e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -0
- package/dist/{AssetsController-method-action-types.d.mts → AssetsController-method-action-types.d.ts} +2 -2
- package/dist/AssetsController-method-action-types.d.ts.map +1 -0
- package/dist/{AssetsController-method-action-types.mjs → AssetsController-method-action-types.js} +1 -1
- package/dist/AssetsController-method-action-types.js.map +1 -0
- package/dist/{AssetsController.d.cts → AssetsController.d.ts} +30 -30
- package/dist/AssetsController.d.ts.map +1 -0
- package/dist/{AssetsController.mjs → AssetsController.js} +28 -29
- package/dist/AssetsController.js.map +1 -0
- package/dist/data-sources/{AbstractDataSource.d.mts → AbstractDataSource.d.ts} +2 -2
- package/dist/data-sources/AbstractDataSource.d.ts.map +1 -0
- package/dist/data-sources/{AbstractDataSource.mjs → AbstractDataSource.js} +1 -1
- package/dist/data-sources/AbstractDataSource.js.map +1 -0
- package/dist/data-sources/{AccountActivityDataSource.d.cts → AccountActivityDataSource.d.ts} +6 -6
- package/dist/data-sources/AccountActivityDataSource.d.ts.map +1 -0
- package/dist/data-sources/{AccountActivityDataSource.mjs → AccountActivityDataSource.js} +11 -11
- package/dist/data-sources/AccountActivityDataSource.js.map +1 -0
- package/dist/data-sources/{AccountsApiDataSource.d.cts → AccountsApiDataSource.d.ts} +7 -7
- package/dist/data-sources/AccountsApiDataSource.d.ts.map +1 -0
- package/dist/data-sources/{AccountsApiDataSource.mjs → AccountsApiDataSource.js} +7 -8
- package/dist/data-sources/AccountsApiDataSource.js.map +1 -0
- package/dist/data-sources/{PriceDataSource.d.cts → PriceDataSource.d.ts} +5 -5
- package/dist/data-sources/PriceDataSource.d.ts.map +1 -0
- package/dist/data-sources/{PriceDataSource.mjs → PriceDataSource.js} +7 -8
- package/dist/data-sources/PriceDataSource.js.map +1 -0
- package/dist/data-sources/{RpcDataSource.d.cts → RpcDataSource.d.ts} +10 -10
- package/dist/data-sources/RpcDataSource.d.ts.map +1 -0
- package/dist/data-sources/{RpcDataSource.mjs → RpcDataSource.js} +11 -11
- package/dist/data-sources/RpcDataSource.js.map +1 -0
- package/dist/data-sources/{SnapDataSource.d.cts → SnapDataSource.d.ts} +8 -8
- package/dist/data-sources/SnapDataSource.d.ts.map +1 -0
- package/dist/data-sources/{SnapDataSource.mjs → SnapDataSource.js} +6 -6
- package/dist/data-sources/SnapDataSource.js.map +1 -0
- package/dist/data-sources/{StakedBalanceDataSource.d.cts → StakedBalanceDataSource.d.ts} +5 -5
- package/dist/data-sources/StakedBalanceDataSource.d.ts.map +1 -0
- package/dist/data-sources/{StakedBalanceDataSource.mjs → StakedBalanceDataSource.js} +7 -7
- package/dist/data-sources/StakedBalanceDataSource.js.map +1 -0
- package/dist/data-sources/{TokenDataSource.d.cts → TokenDataSource.d.ts} +5 -5
- package/dist/data-sources/TokenDataSource.d.ts.map +1 -0
- package/dist/data-sources/{TokenDataSource.mjs → TokenDataSource.js} +7 -8
- package/dist/data-sources/TokenDataSource.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/{MulticallClient.d.cts → MulticallClient.d.ts} +3 -3
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/{MulticallClient.mjs → MulticallClient.js} +5 -5
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/{TokensApiClient.d.cts → TokensApiClient.d.ts} +2 -2
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/{TokensApiClient.mjs → TokensApiClient.js} +2 -2
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.d.ts +4 -0
- package/dist/data-sources/evm-rpc-services/clients/index.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.js +3 -0
- package/dist/data-sources/evm-rpc-services/clients/index.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/{index.d.cts → index.d.ts} +5 -5
- package/dist/data-sources/evm-rpc-services/index.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/index.js +4 -0
- package/dist/data-sources/evm-rpc-services/index.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{BalanceFetcher.d.cts → BalanceFetcher.d.ts} +11 -11
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{BalanceFetcher.mjs → BalanceFetcher.js} +5 -5
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{StakedBalanceFetcher.d.mts → StakedBalanceFetcher.d.ts} +13 -14
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{StakedBalanceFetcher.mjs → StakedBalanceFetcher.js} +5 -6
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{TokenDetector.d.cts → TokenDetector.d.ts} +12 -12
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{TokenDetector.mjs → TokenDetector.js} +4 -4
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{index.d.cts → index.d.ts} +4 -4
- package/dist/data-sources/evm-rpc-services/services/index.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.js +4 -0
- package/dist/data-sources/evm-rpc-services/services/index.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{assets.d.cts → assets.d.ts} +3 -3
- package/dist/data-sources/evm-rpc-services/types/assets.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.js +2 -0
- package/dist/data-sources/evm-rpc-services/types/assets.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{config.d.cts → config.d.ts} +2 -2
- package/dist/data-sources/evm-rpc-services/types/config.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.js +2 -0
- package/dist/data-sources/evm-rpc-services/types/config.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{core.d.cts → core.d.ts} +2 -2
- package/dist/data-sources/evm-rpc-services/types/core.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.js +2 -0
- package/dist/data-sources/evm-rpc-services/types/core.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.d.ts +7 -0
- package/dist/data-sources/evm-rpc-services/types/index.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.js +2 -0
- package/dist/data-sources/evm-rpc-services/types/index.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{multicall.d.cts → multicall.d.ts} +2 -2
- package/dist/data-sources/evm-rpc-services/types/multicall.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.js +2 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{services.d.cts → services.d.ts} +3 -3
- package/dist/data-sources/evm-rpc-services/types/services.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.js +2 -0
- package/dist/data-sources/evm-rpc-services/types/services.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{state.d.cts → state.d.ts} +2 -2
- package/dist/data-sources/evm-rpc-services/types/state.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.js +2 -0
- package/dist/data-sources/evm-rpc-services/types/state.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{assets.d.cts → assets.d.ts} +2 -2
- package/dist/data-sources/evm-rpc-services/utils/assets.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{assets.mjs → assets.js} +2 -2
- package/dist/data-sources/evm-rpc-services/utils/assets.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{batch.d.mts → batch.d.ts} +1 -1
- package/dist/data-sources/evm-rpc-services/utils/batch.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{batch.mjs → batch.js} +1 -1
- package/dist/data-sources/evm-rpc-services/utils/batch.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.ts +4 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.js +4 -0
- package/dist/data-sources/evm-rpc-services/utils/index.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{parsing.d.mts → parsing.d.ts} +3 -3
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{parsing.mjs → parsing.js} +3 -3
- package/dist/data-sources/evm-rpc-services/utils/parsing.js.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{staking-contracts.d.cts → staking-contracts.d.ts} +1 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.ts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{staking-contracts.mjs → staking-contracts.js} +3 -3
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.js.map +1 -0
- package/dist/data-sources/{index.d.cts → index.d.ts} +9 -9
- package/dist/data-sources/index.d.ts.map +1 -0
- package/dist/data-sources/index.js +14 -0
- package/dist/data-sources/index.js.map +1 -0
- package/dist/{defaults.d.mts → defaults.d.ts} +2 -2
- package/dist/defaults.d.ts.map +1 -0
- package/dist/{defaults.mjs → defaults.js} +1 -1
- package/dist/defaults.js.map +1 -0
- package/dist/{errors.d.mts → errors.d.ts} +1 -1
- package/dist/errors.d.ts.map +1 -0
- package/dist/{errors.mjs → errors.js} +1 -1
- package/dist/errors.js.map +1 -0
- package/dist/{index.d.mts → index.d.ts} +26 -26
- package/dist/index.d.ts.map +1 -0
- package/dist/{index.mjs → index.js} +13 -13
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +4 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +4 -0
- package/dist/logger.js.map +1 -0
- package/dist/middlewares/{CustomAssetGraduationMiddleware.d.cts → CustomAssetGraduationMiddleware.d.ts} +2 -2
- package/dist/middlewares/CustomAssetGraduationMiddleware.d.ts.map +1 -0
- package/dist/middlewares/{CustomAssetGraduationMiddleware.mjs → CustomAssetGraduationMiddleware.js} +5 -5
- package/dist/middlewares/CustomAssetGraduationMiddleware.js.map +1 -0
- package/dist/middlewares/{DetectionMiddleware.d.cts → DetectionMiddleware.d.ts} +2 -2
- package/dist/middlewares/DetectionMiddleware.d.ts.map +1 -0
- package/dist/middlewares/{DetectionMiddleware.mjs → DetectionMiddleware.js} +4 -4
- package/dist/middlewares/DetectionMiddleware.js.map +1 -0
- package/dist/middlewares/{ParallelMiddleware.d.cts → ParallelMiddleware.d.ts} +2 -2
- package/dist/middlewares/ParallelMiddleware.d.ts.map +1 -0
- package/dist/middlewares/{ParallelMiddleware.mjs → ParallelMiddleware.js} +2 -9
- package/dist/middlewares/{ParallelMiddleware.mjs.map → ParallelMiddleware.js.map} +1 -1
- package/dist/middlewares/{RpcFallbackMiddleware.d.cts → RpcFallbackMiddleware.d.ts} +2 -2
- package/dist/middlewares/RpcFallbackMiddleware.d.ts.map +1 -0
- package/dist/middlewares/{RpcFallbackMiddleware.mjs → RpcFallbackMiddleware.js} +4 -4
- package/dist/middlewares/RpcFallbackMiddleware.js.map +1 -0
- package/dist/middlewares/index.d.ts +9 -0
- package/dist/middlewares/index.d.ts.map +1 -0
- package/dist/middlewares/index.js +5 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/migrations/{healAssetsInfoMetadata.d.cts → healAssetsInfoMetadata.d.ts} +4 -4
- package/dist/migrations/healAssetsInfoMetadata.d.ts.map +1 -0
- package/dist/migrations/{healAssetsInfoMetadata.mjs → healAssetsInfoMetadata.js} +4 -5
- package/dist/migrations/healAssetsInfoMetadata.js.map +1 -0
- package/dist/selectors/{balance.d.cts → balance.d.ts} +6 -6
- package/dist/selectors/balance.d.ts.map +1 -0
- package/dist/selectors/{balance.mjs → balance.js} +5 -5
- package/dist/selectors/balance.js.map +1 -0
- package/dist/{types.d.mts → types.d.ts} +4 -4
- package/dist/types.d.ts.map +1 -0
- package/dist/{types.mjs → types.js} +1 -1
- package/dist/types.js.map +1 -0
- package/dist/utils/constants.d.ts +2 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/{constants.mjs → constants.js} +1 -1
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/{customAssetsRpcSupplement.d.mts → customAssetsRpcSupplement.d.ts} +2 -2
- package/dist/utils/customAssetsRpcSupplement.d.ts.map +1 -0
- package/dist/utils/{customAssetsRpcSupplement.mjs → customAssetsRpcSupplement.js} +2 -2
- package/dist/utils/customAssetsRpcSupplement.js.map +1 -0
- package/dist/utils/{dedupingBatchFetcher.d.cts → dedupingBatchFetcher.d.ts} +1 -1
- package/dist/utils/dedupingBatchFetcher.d.ts.map +1 -0
- package/dist/utils/{dedupingBatchFetcher.mjs → dedupingBatchFetcher.js} +1 -1
- package/dist/utils/dedupingBatchFetcher.js.map +1 -0
- package/dist/utils/{fetchWithTimeout.d.mts → fetchWithTimeout.d.ts} +1 -1
- package/dist/utils/fetchWithTimeout.d.ts.map +1 -0
- package/dist/utils/{fetchWithTimeout.mjs → fetchWithTimeout.js} +1 -1
- package/dist/utils/fetchWithTimeout.js.map +1 -0
- package/dist/utils/{formatExchangeRatesForBridge.d.mts → formatExchangeRatesForBridge.d.ts} +3 -3
- package/dist/utils/formatExchangeRatesForBridge.d.ts.map +1 -0
- package/dist/utils/{formatExchangeRatesForBridge.mjs → formatExchangeRatesForBridge.js} +6 -7
- package/dist/utils/formatExchangeRatesForBridge.js.map +1 -0
- package/dist/utils/{formatStateForTransactionPay.d.cts → formatStateForTransactionPay.d.ts} +3 -3
- package/dist/utils/formatStateForTransactionPay.d.ts.map +1 -0
- package/dist/utils/{formatStateForTransactionPay.mjs → formatStateForTransactionPay.js} +7 -8
- package/dist/utils/formatStateForTransactionPay.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/{native-assets.d.cts → native-assets.d.ts} +2 -2
- package/dist/utils/native-assets.d.ts.map +1 -0
- package/dist/utils/{native-assets.mjs → native-assets.js} +5 -5
- package/dist/utils/native-assets.js.map +1 -0
- package/dist/utils/{normalizeAmountString.d.mts → normalizeAmountString.d.ts} +1 -1
- package/dist/utils/normalizeAmountString.d.ts.map +1 -0
- package/dist/utils/{normalizeAmountString.mjs → normalizeAmountString.js} +2 -2
- package/dist/utils/normalizeAmountString.js.map +1 -0
- package/dist/utils/{normalizeAssetId.d.cts → normalizeAssetId.d.ts} +3 -3
- package/dist/utils/normalizeAssetId.d.ts.map +1 -0
- package/dist/utils/{normalizeAssetId.mjs → normalizeAssetId.js} +4 -11
- package/dist/utils/normalizeAssetId.js.map +1 -0
- package/dist/utils/{snaps-assets-migration.d.mts → snaps-assets-migration.d.ts} +5 -5
- package/dist/utils/snaps-assets-migration.d.ts.map +1 -0
- package/dist/utils/{snaps-assets-migration.mjs → snaps-assets-migration.js} +2 -2
- package/dist/utils/snaps-assets-migration.js.map +1 -0
- package/dist/utils/{trace.d.mts → trace.d.ts} +2 -2
- package/dist/utils/trace.d.ts.map +1 -0
- package/dist/utils/{trace.mjs → trace.js} +1 -1
- package/dist/utils/trace.js.map +1 -0
- package/package.json +14 -17
- package/dist/AssetsController-method-action-types.cjs +0 -7
- package/dist/AssetsController-method-action-types.cjs.map +0 -1
- package/dist/AssetsController-method-action-types.d.cts +0 -181
- package/dist/AssetsController-method-action-types.d.cts.map +0 -1
- package/dist/AssetsController-method-action-types.d.mts.map +0 -1
- package/dist/AssetsController-method-action-types.mjs.map +0 -1
- package/dist/AssetsController.cjs +0 -2559
- package/dist/AssetsController.cjs.map +0 -1
- package/dist/AssetsController.d.cts.map +0 -1
- package/dist/AssetsController.d.mts +0 -395
- package/dist/AssetsController.d.mts.map +0 -1
- package/dist/AssetsController.mjs.map +0 -1
- package/dist/data-sources/AbstractDataSource.cjs +0 -111
- package/dist/data-sources/AbstractDataSource.cjs.map +0 -1
- package/dist/data-sources/AbstractDataSource.d.cts +0 -113
- package/dist/data-sources/AbstractDataSource.d.cts.map +0 -1
- package/dist/data-sources/AbstractDataSource.d.mts.map +0 -1
- package/dist/data-sources/AbstractDataSource.mjs.map +0 -1
- package/dist/data-sources/AccountActivityDataSource.cjs +0 -267
- package/dist/data-sources/AccountActivityDataSource.cjs.map +0 -1
- package/dist/data-sources/AccountActivityDataSource.d.cts.map +0 -1
- package/dist/data-sources/AccountActivityDataSource.d.mts +0 -80
- package/dist/data-sources/AccountActivityDataSource.d.mts.map +0 -1
- package/dist/data-sources/AccountActivityDataSource.mjs.map +0 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +0 -586
- package/dist/data-sources/AccountsApiDataSource.cjs.map +0 -1
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +0 -1
- package/dist/data-sources/AccountsApiDataSource.d.mts +0 -82
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +0 -1
- package/dist/data-sources/AccountsApiDataSource.mjs.map +0 -1
- package/dist/data-sources/PriceDataSource.cjs +0 -466
- package/dist/data-sources/PriceDataSource.cjs.map +0 -1
- package/dist/data-sources/PriceDataSource.d.cts.map +0 -1
- package/dist/data-sources/PriceDataSource.d.mts +0 -100
- package/dist/data-sources/PriceDataSource.d.mts.map +0 -1
- package/dist/data-sources/PriceDataSource.mjs.map +0 -1
- package/dist/data-sources/RpcDataSource.cjs +0 -1021
- package/dist/data-sources/RpcDataSource.cjs.map +0 -1
- package/dist/data-sources/RpcDataSource.d.cts.map +0 -1
- package/dist/data-sources/RpcDataSource.d.mts +0 -174
- package/dist/data-sources/RpcDataSource.d.mts.map +0 -1
- package/dist/data-sources/RpcDataSource.mjs.map +0 -1
- package/dist/data-sources/SnapDataSource.cjs +0 -443
- package/dist/data-sources/SnapDataSource.cjs.map +0 -1
- package/dist/data-sources/SnapDataSource.d.cts.map +0 -1
- package/dist/data-sources/SnapDataSource.d.mts +0 -127
- package/dist/data-sources/SnapDataSource.d.mts.map +0 -1
- package/dist/data-sources/SnapDataSource.mjs.map +0 -1
- package/dist/data-sources/StakedBalanceDataSource.cjs +0 -616
- package/dist/data-sources/StakedBalanceDataSource.cjs.map +0 -1
- package/dist/data-sources/StakedBalanceDataSource.d.cts.map +0 -1
- package/dist/data-sources/StakedBalanceDataSource.d.mts +0 -72
- package/dist/data-sources/StakedBalanceDataSource.d.mts.map +0 -1
- package/dist/data-sources/StakedBalanceDataSource.mjs.map +0 -1
- package/dist/data-sources/TokenDataSource.cjs +0 -583
- package/dist/data-sources/TokenDataSource.cjs.map +0 -1
- package/dist/data-sources/TokenDataSource.d.cts.map +0 -1
- package/dist/data-sources/TokenDataSource.d.mts +0 -81
- package/dist/data-sources/TokenDataSource.d.mts.map +0 -1
- package/dist/data-sources/TokenDataSource.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs +0 -705
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.mts +0 -65
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.cjs +0 -312
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.mts +0 -61
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/index.cjs +0 -10
- package/dist/data-sources/evm-rpc-services/clients/index.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/index.d.cts +0 -4
- package/dist/data-sources/evm-rpc-services/clients/index.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/index.d.mts +0 -4
- package/dist/data-sources/evm-rpc-services/clients/index.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/index.mjs +0 -3
- package/dist/data-sources/evm-rpc-services/clients/index.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/index.cjs +0 -17
- package/dist/data-sources/evm-rpc-services/index.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/index.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/index.d.mts +0 -5
- package/dist/data-sources/evm-rpc-services/index.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/index.mjs +0 -4
- package/dist/data-sources/evm-rpc-services/index.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +0 -247
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +0 -96
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs +0 -132
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts +0 -81
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +0 -230
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +0 -78
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/index.cjs +0 -13
- package/dist/data-sources/evm-rpc-services/services/index.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.mts +0 -4
- package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/index.mjs +0 -4
- package/dist/data-sources/evm-rpc-services/services/index.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/assets.cjs +0 -3
- package/dist/data-sources/evm-rpc-services/types/assets.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/assets.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/assets.d.mts +0 -53
- package/dist/data-sources/evm-rpc-services/types/assets.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/assets.mjs +0 -2
- package/dist/data-sources/evm-rpc-services/types/assets.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/config.cjs +0 -3
- package/dist/data-sources/evm-rpc-services/types/config.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/config.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/config.d.mts +0 -18
- package/dist/data-sources/evm-rpc-services/types/config.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/config.mjs +0 -2
- package/dist/data-sources/evm-rpc-services/types/config.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/core.cjs +0 -3
- package/dist/data-sources/evm-rpc-services/types/core.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/core.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/core.d.mts +0 -19
- package/dist/data-sources/evm-rpc-services/types/core.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/core.mjs +0 -2
- package/dist/data-sources/evm-rpc-services/types/core.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/index.cjs +0 -3
- package/dist/data-sources/evm-rpc-services/types/index.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/index.d.cts +0 -7
- package/dist/data-sources/evm-rpc-services/types/index.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/index.d.mts +0 -7
- package/dist/data-sources/evm-rpc-services/types/index.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/index.mjs +0 -2
- package/dist/data-sources/evm-rpc-services/types/index.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/multicall.cjs +0 -3
- package/dist/data-sources/evm-rpc-services/types/multicall.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/multicall.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/multicall.d.mts +0 -24
- package/dist/data-sources/evm-rpc-services/types/multicall.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/multicall.mjs +0 -2
- package/dist/data-sources/evm-rpc-services/types/multicall.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/services.cjs +0 -3
- package/dist/data-sources/evm-rpc-services/types/services.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/services.d.mts +0 -70
- package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/services.mjs +0 -2
- package/dist/data-sources/evm-rpc-services/types/services.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/state.cjs +0 -3
- package/dist/data-sources/evm-rpc-services/types/state.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/state.d.mts +0 -58
- package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/state.mjs +0 -2
- package/dist/data-sources/evm-rpc-services/types/state.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/assets.cjs +0 -9
- package/dist/data-sources/evm-rpc-services/utils/assets.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/assets.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/assets.d.mts +0 -3
- package/dist/data-sources/evm-rpc-services/utils/assets.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/assets.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/batch.cjs +0 -45
- package/dist/data-sources/evm-rpc-services/utils/batch.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/batch.d.cts +0 -28
- package/dist/data-sources/evm-rpc-services/utils/batch.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/batch.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/batch.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/index.cjs +0 -15
- package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts +0 -4
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts +0 -4
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/index.mjs +0 -4
- package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.cjs +0 -47
- package/dist/data-sources/evm-rpc-services/utils/parsing.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts +0 -25
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs +0 -68
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts +0 -25
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs.map +0 -1
- package/dist/data-sources/index.cjs +0 -30
- package/dist/data-sources/index.cjs.map +0 -1
- package/dist/data-sources/index.d.cts.map +0 -1
- package/dist/data-sources/index.d.mts +0 -9
- package/dist/data-sources/index.d.mts.map +0 -1
- package/dist/data-sources/index.mjs +0 -14
- package/dist/data-sources/index.mjs.map +0 -1
- package/dist/defaults.cjs +0 -125
- package/dist/defaults.cjs.map +0 -1
- package/dist/defaults.d.cts +0 -50
- package/dist/defaults.d.cts.map +0 -1
- package/dist/defaults.d.mts.map +0 -1
- package/dist/defaults.mjs.map +0 -1
- package/dist/errors.cjs +0 -25
- package/dist/errors.cjs.map +0 -1
- package/dist/errors.d.cts +0 -25
- package/dist/errors.d.cts.map +0 -1
- package/dist/errors.d.mts.map +0 -1
- package/dist/errors.mjs.map +0 -1
- package/dist/index.cjs +0 -67
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -26
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/logger.cjs +0 -7
- package/dist/logger.cjs.map +0 -1
- package/dist/logger.d.cts +0 -5
- package/dist/logger.d.cts.map +0 -1
- package/dist/logger.d.mts +0 -5
- package/dist/logger.d.mts.map +0 -1
- package/dist/logger.mjs +0 -4
- package/dist/logger.mjs.map +0 -1
- package/dist/middlewares/CustomAssetGraduationMiddleware.cjs +0 -132
- package/dist/middlewares/CustomAssetGraduationMiddleware.cjs.map +0 -1
- package/dist/middlewares/CustomAssetGraduationMiddleware.d.cts.map +0 -1
- package/dist/middlewares/CustomAssetGraduationMiddleware.d.mts +0 -32
- package/dist/middlewares/CustomAssetGraduationMiddleware.d.mts.map +0 -1
- package/dist/middlewares/CustomAssetGraduationMiddleware.mjs.map +0 -1
- package/dist/middlewares/DetectionMiddleware.cjs +0 -154
- package/dist/middlewares/DetectionMiddleware.cjs.map +0 -1
- package/dist/middlewares/DetectionMiddleware.d.cts.map +0 -1
- package/dist/middlewares/DetectionMiddleware.d.mts +0 -40
- package/dist/middlewares/DetectionMiddleware.d.mts.map +0 -1
- package/dist/middlewares/DetectionMiddleware.mjs.map +0 -1
- package/dist/middlewares/ParallelMiddleware.cjs +0 -263
- package/dist/middlewares/ParallelMiddleware.cjs.map +0 -1
- package/dist/middlewares/ParallelMiddleware.d.cts.map +0 -1
- package/dist/middlewares/ParallelMiddleware.d.mts +0 -41
- package/dist/middlewares/ParallelMiddleware.d.mts.map +0 -1
- package/dist/middlewares/RpcFallbackMiddleware.cjs +0 -90
- package/dist/middlewares/RpcFallbackMiddleware.cjs.map +0 -1
- package/dist/middlewares/RpcFallbackMiddleware.d.cts.map +0 -1
- package/dist/middlewares/RpcFallbackMiddleware.d.mts +0 -23
- package/dist/middlewares/RpcFallbackMiddleware.d.mts.map +0 -1
- package/dist/middlewares/RpcFallbackMiddleware.mjs.map +0 -1
- package/dist/middlewares/index.cjs +0 -14
- package/dist/middlewares/index.cjs.map +0 -1
- package/dist/middlewares/index.d.cts +0 -9
- package/dist/middlewares/index.d.cts.map +0 -1
- package/dist/middlewares/index.d.mts +0 -9
- package/dist/middlewares/index.d.mts.map +0 -1
- package/dist/middlewares/index.mjs +0 -5
- package/dist/middlewares/index.mjs.map +0 -1
- package/dist/migrations/healAssetsInfoMetadata.cjs +0 -385
- package/dist/migrations/healAssetsInfoMetadata.cjs.map +0 -1
- package/dist/migrations/healAssetsInfoMetadata.d.cts.map +0 -1
- package/dist/migrations/healAssetsInfoMetadata.d.mts +0 -106
- package/dist/migrations/healAssetsInfoMetadata.d.mts.map +0 -1
- package/dist/migrations/healAssetsInfoMetadata.mjs.map +0 -1
- package/dist/selectors/balance.cjs +0 -532
- package/dist/selectors/balance.cjs.map +0 -1
- package/dist/selectors/balance.d.cts.map +0 -1
- package/dist/selectors/balance.d.mts +0 -103
- package/dist/selectors/balance.d.mts.map +0 -1
- package/dist/selectors/balance.mjs.map +0 -1
- package/dist/types.cjs +0 -39
- package/dist/types.cjs.map +0 -1
- package/dist/types.d.cts +0 -533
- package/dist/types.d.cts.map +0 -1
- package/dist/types.d.mts.map +0 -1
- package/dist/types.mjs.map +0 -1
- package/dist/utils/constants.cjs +0 -5
- package/dist/utils/constants.cjs.map +0 -1
- package/dist/utils/constants.d.cts +0 -2
- package/dist/utils/constants.d.cts.map +0 -1
- package/dist/utils/constants.d.mts +0 -2
- package/dist/utils/constants.d.mts.map +0 -1
- package/dist/utils/constants.mjs.map +0 -1
- package/dist/utils/customAssetsRpcSupplement.cjs +0 -72
- package/dist/utils/customAssetsRpcSupplement.cjs.map +0 -1
- package/dist/utils/customAssetsRpcSupplement.d.cts +0 -60
- package/dist/utils/customAssetsRpcSupplement.d.cts.map +0 -1
- package/dist/utils/customAssetsRpcSupplement.d.mts.map +0 -1
- package/dist/utils/customAssetsRpcSupplement.mjs.map +0 -1
- package/dist/utils/dedupingBatchFetcher.cjs +0 -168
- package/dist/utils/dedupingBatchFetcher.cjs.map +0 -1
- package/dist/utils/dedupingBatchFetcher.d.cts.map +0 -1
- package/dist/utils/dedupingBatchFetcher.d.mts +0 -72
- package/dist/utils/dedupingBatchFetcher.d.mts.map +0 -1
- package/dist/utils/dedupingBatchFetcher.mjs.map +0 -1
- package/dist/utils/fetchWithTimeout.cjs +0 -30
- package/dist/utils/fetchWithTimeout.cjs.map +0 -1
- package/dist/utils/fetchWithTimeout.d.cts +0 -11
- package/dist/utils/fetchWithTimeout.d.cts.map +0 -1
- package/dist/utils/fetchWithTimeout.d.mts.map +0 -1
- package/dist/utils/fetchWithTimeout.mjs.map +0 -1
- package/dist/utils/formatExchangeRatesForBridge.cjs +0 -161
- package/dist/utils/formatExchangeRatesForBridge.cjs.map +0 -1
- package/dist/utils/formatExchangeRatesForBridge.d.cts +0 -43
- package/dist/utils/formatExchangeRatesForBridge.d.cts.map +0 -1
- package/dist/utils/formatExchangeRatesForBridge.d.mts.map +0 -1
- package/dist/utils/formatExchangeRatesForBridge.mjs.map +0 -1
- package/dist/utils/formatStateForTransactionPay.cjs +0 -174
- package/dist/utils/formatStateForTransactionPay.cjs.map +0 -1
- package/dist/utils/formatStateForTransactionPay.d.cts.map +0 -1
- package/dist/utils/formatStateForTransactionPay.d.mts +0 -72
- package/dist/utils/formatStateForTransactionPay.d.mts.map +0 -1
- package/dist/utils/formatStateForTransactionPay.mjs.map +0 -1
- package/dist/utils/index.cjs +0 -21
- package/dist/utils/index.cjs.map +0 -1
- package/dist/utils/index.d.cts +0 -9
- package/dist/utils/index.d.cts.map +0 -1
- package/dist/utils/index.d.mts +0 -9
- package/dist/utils/index.d.mts.map +0 -1
- package/dist/utils/index.mjs +0 -7
- package/dist/utils/index.mjs.map +0 -1
- package/dist/utils/native-assets.cjs +0 -64
- package/dist/utils/native-assets.cjs.map +0 -1
- package/dist/utils/native-assets.d.cts.map +0 -1
- package/dist/utils/native-assets.d.mts +0 -19
- package/dist/utils/native-assets.d.mts.map +0 -1
- package/dist/utils/native-assets.mjs.map +0 -1
- package/dist/utils/normalizeAmountString.cjs +0 -64
- package/dist/utils/normalizeAmountString.cjs.map +0 -1
- package/dist/utils/normalizeAmountString.d.cts +0 -35
- package/dist/utils/normalizeAmountString.d.cts.map +0 -1
- package/dist/utils/normalizeAmountString.d.mts.map +0 -1
- package/dist/utils/normalizeAmountString.mjs.map +0 -1
- package/dist/utils/normalizeAssetId.cjs +0 -60
- package/dist/utils/normalizeAssetId.cjs.map +0 -1
- package/dist/utils/normalizeAssetId.d.cts.map +0 -1
- package/dist/utils/normalizeAssetId.d.mts +0 -32
- package/dist/utils/normalizeAssetId.d.mts.map +0 -1
- package/dist/utils/normalizeAssetId.mjs.map +0 -1
- package/dist/utils/snaps-assets-migration.cjs +0 -171
- package/dist/utils/snaps-assets-migration.cjs.map +0 -1
- package/dist/utils/snaps-assets-migration.d.cts +0 -113
- package/dist/utils/snaps-assets-migration.d.cts.map +0 -1
- package/dist/utils/snaps-assets-migration.d.mts.map +0 -1
- package/dist/utils/snaps-assets-migration.mjs.map +0 -1
- package/dist/utils/trace.cjs +0 -120
- package/dist/utils/trace.cjs.map +0 -1
- package/dist/utils/trace.d.cts +0 -52
- package/dist/utils/trace.d.cts.map +0 -1
- package/dist/utils/trace.d.mts.map +0 -1
- package/dist/utils/trace.mjs.map +0 -1
package/dist/data-sources/{AccountActivityDataSource.d.cts → AccountActivityDataSource.d.ts}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { AccountActivityServiceBalanceUpdatedEvent, AccountActivityServiceStatusChangedEvent } from
|
|
2
|
-
import type { AssetsControllerMessenger } from
|
|
3
|
-
import type { ChainId, Caip19AssetId, DataRequest, DataResponse } from
|
|
4
|
-
import { AbstractDataSource } from
|
|
5
|
-
import type { DataSourceState } from
|
|
1
|
+
import type { AccountActivityServiceBalanceUpdatedEvent, AccountActivityServiceStatusChangedEvent } from '@metamask/core-backend';
|
|
2
|
+
import type { AssetsControllerMessenger } from '../AssetsController.js';
|
|
3
|
+
import type { ChainId, Caip19AssetId, DataRequest, DataResponse } from '../types.js';
|
|
4
|
+
import { AbstractDataSource } from './AbstractDataSource.js';
|
|
5
|
+
import type { DataSourceState } from './AbstractDataSource.js';
|
|
6
6
|
declare const CONTROLLER_NAME = "AccountActivityDataSource";
|
|
7
7
|
/** Allowed events that AccountActivityDataSource subscribes to. */
|
|
8
8
|
export type AccountActivityDataSourceAllowedEvents = AccountActivityServiceBalanceUpdatedEvent | AccountActivityServiceStatusChangedEvent;
|
|
@@ -77,4 +77,4 @@ export declare class AccountActivityDataSource extends AbstractDataSource<typeof
|
|
|
77
77
|
*/
|
|
78
78
|
export declare function createAccountActivityDataSource(options: AccountActivityDataSourceOptions): AccountActivityDataSource;
|
|
79
79
|
export {};
|
|
80
|
-
//# sourceMappingURL=AccountActivityDataSource.d.
|
|
80
|
+
//# sourceMappingURL=AccountActivityDataSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountActivityDataSource.d.ts","sourceRoot":"","sources":["../../src/data-sources/AccountActivityDataSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yCAAyC,EACzC,wCAAwC,EAEzC,MAAM,wBAAwB,CAAC;AAKhC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,KAAK,EAGV,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAM/D,QAAA,MAAM,eAAe,8BAA8B,CAAC;AAqFpD,mEAAmE;AACnE,MAAM,MAAM,sCAAsC,GAC9C,yCAAyC,GACzC,wCAAwC,CAAC;AAM7C,MAAM,MAAM,8BAA8B,GAAG,eAAe,CAAC;AAU7D,MAAM,MAAM,gCAAgC,GAAG;IAC7C,mEAAmE;IACnE,SAAS,EAAE,yBAAyB,CAAC;IACrC,qGAAqG;IACrG,qBAAqB,EAAE,CACrB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,OAAO,EAAE,EACjB,cAAc,EAAE,OAAO,EAAE,KACtB,IAAI,CAAC;IACV,wFAAwF;IACxF,YAAY,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;IACrE;;;;;OAKG;IACH,cAAc,EAAE,CACd,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,WAAW,KAClB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;CACjD,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,yBAA0B,SAAQ,kBAAkB,CAC/D,OAAO,eAAe,EACtB,8BAA8B,CAC/B;;IAwBC,YAAY,OAAO,EAAE,gCAAgC,EAapD;IAqBD;;;;;;;OAOG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAE/B;IAwJD,OAAO,IAAI,IAAI,CAoBd;CACF;AAMD;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,gCAAgC,GACxC,yBAAyB,CAE3B"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
+
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");
|
|
4
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
+
};
|
|
1
6
|
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
7
|
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
8
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
10
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
11
|
};
|
|
7
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
-
};
|
|
12
12
|
var _AccountActivityDataSource_instances, _AccountActivityDataSource_messenger, _AccountActivityDataSource_onActiveChainsUpdated, _AccountActivityDataSource_getAssetType, _AccountActivityDataSource_onAssetsUpdate, _AccountActivityDataSource_onBalanceUpdatedBound, _AccountActivityDataSource_subscribeToEvents, _AccountActivityDataSource_onBalanceUpdated, _AccountActivityDataSource_findAccountForAddress, _AccountActivityDataSource_getWalletAccounts, _AccountActivityDataSource_onAccountActivityStatusChanged;
|
|
13
|
-
import { isCaipChainId } from
|
|
14
|
-
import BigNumberJS from
|
|
15
|
-
import { projectLogger, createModuleLogger } from
|
|
16
|
-
import { safeNormalizeAssetId } from
|
|
17
|
-
import { AbstractDataSource } from
|
|
13
|
+
import { isCaipChainId } from '@metamask/utils';
|
|
14
|
+
import { BigNumber as BigNumberJS } from 'bignumber.js';
|
|
15
|
+
import { projectLogger, createModuleLogger } from '../logger.js';
|
|
16
|
+
import { safeNormalizeAssetId } from '../utils/index.js';
|
|
17
|
+
import { AbstractDataSource } from './AbstractDataSource.js';
|
|
18
18
|
// ============================================================================
|
|
19
19
|
// CONSTANTS
|
|
20
20
|
// ============================================================================
|
|
@@ -256,4 +256,4 @@ _AccountActivityDataSource_messenger = new WeakMap(), _AccountActivityDataSource
|
|
|
256
256
|
export function createAccountActivityDataSource(options) {
|
|
257
257
|
return new AccountActivityDataSource(options);
|
|
258
258
|
}
|
|
259
|
-
//# sourceMappingURL=AccountActivityDataSource.
|
|
259
|
+
//# sourceMappingURL=AccountActivityDataSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountActivityDataSource.js","sourceRoot":"","sources":["../../src/data-sources/AccountActivityDataSource.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountActivityServiceBalanceUpdatedEvent,\n AccountActivityServiceStatusChangedEvent,\n BalanceUpdate,\n} from '@metamask/core-backend';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { isCaipChainId } from '@metamask/utils';\nimport { BigNumber as BigNumberJS } from 'bignumber.js';\n\nimport type { AssetsControllerMessenger } from '../AssetsController.js';\nimport { projectLogger, createModuleLogger } from '../logger.js';\nimport type {\n AssetBalance,\n AssetMetadata,\n ChainId,\n Caip19AssetId,\n DataRequest,\n DataResponse,\n} from '../types.js';\nimport { safeNormalizeAssetId } from '../utils/index.js';\nimport { AbstractDataSource } from './AbstractDataSource.js';\nimport type { DataSourceState } from './AbstractDataSource.js';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst CONTROLLER_NAME = 'AccountActivityDataSource';\n\nconst log = createModuleLogger(projectLogger, CONTROLLER_NAME);\n\n// ============================================================================\n// BALANCE UPDATE PROCESSING\n// ============================================================================\n\n/**\n * Convert AccountActivityMessage balance updates into a {@link DataResponse}\n * for AssetsController.\n *\n * @param updates - Balance updates from account-activity websocket payload.\n * @param accountId - Internal account UUID.\n * @param getAssetType - Resolver for asset metadata type.\n * @returns DataResponse with merge mode when balances are present.\n */\nfunction processAccountActivityBalanceUpdates(\n updates: BalanceUpdate[],\n accountId: string,\n getAssetType: (assetId: Caip19AssetId) => 'native' | 'erc20' | 'spl',\n): DataResponse {\n const assetsBalance = Object.create(null) as Record<\n string,\n Record<Caip19AssetId, AssetBalance>\n >;\n assetsBalance[accountId] = Object.create(null) as Record<\n Caip19AssetId,\n AssetBalance\n >;\n const assetsMetadata = Object.create(null) as Record<\n Caip19AssetId,\n AssetMetadata\n >;\n\n for (const update of updates) {\n const { asset, postBalance } = update;\n\n if (!asset || !postBalance) {\n continue;\n }\n\n // The websocket sends lower-case ERC-20 addresses, while state and the\n // rest of the pipeline key assets by their checksummed ID. Normalizing\n // here keeps middleware comparisons (detection, custom-asset graduation,\n // occurrence filtering) from treating an existing holding as brand new.\n const assetId = safeNormalizeAssetId(asset.type as Caip19AssetId);\n\n if (asset.decimals === undefined) {\n continue;\n }\n\n const rawBalanceStr = postBalance.amount.startsWith('0x')\n ? BigInt(postBalance.amount).toString()\n : postBalance.amount;\n\n const humanReadableAmount = new BigNumberJS(rawBalanceStr)\n .dividedBy(new BigNumberJS(10).pow(asset.decimals))\n .toFixed();\n\n assetsBalance[accountId][assetId] = {\n amount: humanReadableAmount,\n };\n\n assetsMetadata[assetId] = {\n type: getAssetType(assetId),\n symbol: asset.unit,\n name: asset.unit,\n decimals: asset.decimals,\n };\n }\n\n const response: DataResponse = { updateMode: 'merge' };\n if (Object.keys(assetsBalance[accountId]).length > 0) {\n response.assetsBalance = assetsBalance;\n response.assetsInfo = assetsMetadata;\n }\n\n return response;\n}\n\n// ============================================================================\n// MESSENGER TYPES\n// ============================================================================\n\n/** Allowed events that AccountActivityDataSource subscribes to. */\nexport type AccountActivityDataSourceAllowedEvents =\n | AccountActivityServiceBalanceUpdatedEvent\n | AccountActivityServiceStatusChangedEvent;\n\n// ============================================================================\n// STATE\n// ============================================================================\n\nexport type AccountActivityDataSourceState = DataSourceState;\n\nconst defaultState: AccountActivityDataSourceState = {\n activeChains: [],\n};\n\n// ============================================================================\n// OPTIONS\n// ============================================================================\n\nexport type AccountActivityDataSourceOptions = {\n /** The AssetsController messenger (shared by all data sources). */\n messenger: AssetsControllerMessenger;\n /** Called when active chains are updated. Pass dataSourceName so the controller knows the source. */\n onActiveChainsUpdated: (\n dataSourceName: string,\n chains: ChainId[],\n previousChains: ChainId[],\n ) => void;\n /** Returns the asset type ('native' | 'erc20' | 'spl') for a given CAIP-19 asset ID. */\n getAssetType: (assetId: Caip19AssetId) => 'native' | 'erc20' | 'spl';\n /**\n * Pushes decoded balance updates to the controller (bound to\n * `AssetsController.handleAssetsUpdate`). AADS is event-driven and never\n * takes part in the controller's subscribe handoff, so it receives this\n * callback directly instead of via a `SubscriptionRequest`.\n */\n onAssetsUpdate: (\n response: DataResponse,\n request?: DataRequest,\n ) => void | Promise<void>;\n state?: Partial<AccountActivityDataSourceState>;\n};\n\n// ============================================================================\n// ACCOUNT ACTIVITY DATA SOURCE\n// ============================================================================\n\n/**\n * Data source that consumes real-time updates from `AccountActivityService`.\n *\n * `AccountActivityService` owns the WebSocket connection and channel\n * subscriptions; this data source is a thin consumer of the two high-level\n * events that it publishes:\n *\n * - `AccountActivityService:balanceUpdated` — post-transaction balances for the\n * subscribed account(s). The address is resolved against the wallet's\n * selected account group, transformed into a {@link DataResponse} (via\n * {@link processAccountActivityBalanceUpdates}), and pushed to the controller\n * through the injected `onAssetsUpdate` callback.\n * - `AccountActivityService:statusChanged` — per-chain \"up\"/\"down\" notifications.\n * A chain reported \"up\" is claimed as an active chain (WebSocket is providing\n * real-time data); a chain reported \"down\" is released so polling data sources\n * can take over. Each change is applied directly via `updateActiveChains`,\n * which notifies the controller through `onActiveChainsUpdated`.\n *\n * This data source does NOT debounce, jitter, or gate chain updates itself.\n * Coalescing (collapsing bursts) and jitter (staggering the WS-subscribe herd\n * across clients) live in `AssetsController`, where the expensive re-subscribe\n * happens and where updates from all data sources converge. `activeChains` are\n * never seeded from the accounts API; they only ever reflect live\n * `statusChanged` events (the service flushes all tracked chains as \"down\" when\n * the WebSocket disconnects, releasing them).\n *\n * It subscribes to these events in its constructor (the same way\n * `TokenBalancesController` does). Unlike the polling data sources it does not\n * take part in the controller's subscribe/unsubscribe handoff: `subscribe` is a\n * no-op, balance updates are routed by resolving the address against the\n * wallet, and updates are pushed through the injected `onAssetsUpdate` callback.\n */\nexport class AccountActivityDataSource extends AbstractDataSource<\n typeof CONTROLLER_NAME,\n AccountActivityDataSourceState\n> {\n readonly #messenger: AssetsControllerMessenger;\n\n readonly #onActiveChainsUpdated: (\n dataSourceName: string,\n chains: ChainId[],\n previousChains: ChainId[],\n ) => void;\n\n readonly #getAssetType: (\n assetId: Caip19AssetId,\n ) => 'native' | 'erc20' | 'spl';\n\n readonly #onAssetsUpdate: (\n response: DataResponse,\n request?: DataRequest,\n ) => void | Promise<void>;\n\n readonly #onBalanceUpdatedBound: (event: {\n address: string;\n chain: string;\n updates: BalanceUpdate[];\n }) => void;\n\n constructor(options: AccountActivityDataSourceOptions) {\n super(CONTROLLER_NAME, {\n ...defaultState,\n ...options.state,\n });\n\n this.#messenger = options.messenger;\n this.#onActiveChainsUpdated = options.onActiveChainsUpdated;\n this.#getAssetType = options.getAssetType;\n this.#onAssetsUpdate = options.onAssetsUpdate;\n this.#onBalanceUpdatedBound = this.#onBalanceUpdated.bind(this);\n\n this.#subscribeToEvents();\n }\n\n // ============================================================================\n // EVENT SUBSCRIPTIONS\n // ============================================================================\n\n #subscribeToEvents(): void {\n this.#messenger.subscribe(\n 'AccountActivityService:balanceUpdated',\n this.#onBalanceUpdatedBound,\n );\n this.#messenger.subscribe(\n 'AccountActivityService:statusChanged',\n this.#onAccountActivityStatusChanged,\n );\n }\n\n // ============================================================================\n // SUBSCRIBE / UNSUBSCRIBE\n // ============================================================================\n\n /**\n * AADS is event-driven and chain-agnostic: it never participates in the\n * controller's subscribe/unsubscribe handoff. Incoming `balanceUpdated`\n * events are routed by resolving the address against the wallet's accounts\n * (see `#onBalanceUpdated`), and updates are pushed through the injected\n * `#onAssetsUpdate` callback. This override exists only to satisfy the\n * abstract contract and is intentionally a no-op.\n */\n async subscribe(): Promise<void> {\n // Intentionally empty — see method doc.\n }\n\n // ============================================================================\n // BALANCE UPDATES\n // ============================================================================\n\n #onBalanceUpdated({\n address,\n chain,\n updates,\n }: {\n address: string;\n chain: string;\n updates: BalanceUpdate[];\n }): void {\n try {\n if (!address || !chain || !updates || updates.length === 0) {\n return;\n }\n\n const account = this.#findAccountForAddress(address);\n if (!account) {\n return;\n }\n\n const chainId = chain as ChainId;\n\n const response = processAccountActivityBalanceUpdates(\n updates,\n account.id,\n (assetId) => this.#getAssetType(assetId),\n );\n\n if (!response.assetsBalance) {\n return;\n }\n\n const request: DataRequest = {\n accountsWithSupportedChains: [{ account, supportedChains: [chainId] }],\n chainIds: [chainId],\n dataTypes: ['balance', 'metadata'],\n };\n\n Promise.resolve(this.#onAssetsUpdate(response, request)).catch(\n (error) => {\n log('Failed to report balance update', { error });\n },\n );\n } catch (error) {\n log('Error handling balance update', error);\n }\n }\n\n /**\n * Find the wallet account matching the given activity address. EVM addresses\n * are matched case-insensitively; other namespaces are matched exactly.\n *\n * The candidate set is the accounts of the selected account group, resolved\n * from the wallet at event time (rather than from a stored subscription), so\n * AADS does not need to be re-subscribed whenever the account set changes.\n *\n * @param address - The account address from the activity message.\n * @returns The matching account, or null.\n */\n #findAccountForAddress(address: string): InternalAccount | null {\n const isEvm = address.startsWith('0x');\n\n return (\n this.#getWalletAccounts().find((candidate) =>\n isEvm\n ? candidate.address.toLowerCase() === address.toLowerCase()\n : candidate.address === address,\n ) ?? null\n );\n }\n\n /**\n * Resolve the accounts of the selected account group from the wallet,\n * mirroring `AssetsController.#getSelectedAccounts`.\n *\n * @returns The accounts of the selected account group.\n */\n #getWalletAccounts(): InternalAccount[] {\n const accounts = this.#messenger.call(\n 'AccountTreeController:getAccountsFromSelectedAccountGroup',\n );\n if (accounts.length > 0) {\n return accounts;\n }\n\n const selectedAccount = this.#messenger.call(\n 'AccountsController:getSelectedAccount',\n );\n return selectedAccount ? [selectedAccount] : [];\n }\n\n // ============================================================================\n // STATUS CHANGES\n // ============================================================================\n\n /**\n * Handle a `statusChanged` notification. Chains reported \"up\" are claimed as\n * active (WebSocket provides real-time data); chains reported \"down\" are\n * released so polling data sources take over. The change is applied directly;\n * coalescing and jitter are handled by `AssetsController`.\n *\n * @param options - The status change notification.\n * @param options.chainIds - The CAIP-2 chain IDs whose status changed.\n * @param options.status - Whether the chains are `up` or `down`.\n * @param options.timestamp - Optional timestamp of the status change.\n */\n readonly #onAccountActivityStatusChanged = ({\n chainIds,\n status,\n }: {\n chainIds: string[];\n status: 'up' | 'down';\n timestamp?: number;\n }): void => {\n try {\n // Act on every namespace (eip155, solana, etc.); AssetsController is\n // multichain. Only skip identifiers that are not valid CAIP-2 chain IDs.\n const validChains = chainIds.filter((chainId) => isCaipChainId(chainId));\n\n if (validChains.length === 0) {\n return;\n }\n\n const next = new Set(this.state.activeChains);\n if (status === 'up') {\n for (const chainId of validChains) {\n next.add(chainId);\n }\n } else {\n for (const chainId of validChains) {\n next.delete(chainId);\n }\n }\n\n const previous = [...this.state.activeChains];\n this.updateActiveChains(Array.from(next), (updatedChains) =>\n this.#onActiveChainsUpdated(this.getName(), updatedChains, previous),\n );\n } catch (error) {\n log('Error handling status change', error);\n }\n };\n\n // ============================================================================\n // CLEANUP\n // ============================================================================\n\n destroy(): void {\n try {\n this.#messenger.unsubscribe(\n 'AccountActivityService:balanceUpdated',\n this.#onBalanceUpdatedBound,\n );\n } catch (error) {\n log('Failed to unsubscribe from balanceUpdated', { error });\n }\n\n try {\n this.#messenger.unsubscribe(\n 'AccountActivityService:statusChanged',\n this.#onAccountActivityStatusChanged,\n );\n } catch (error) {\n log('Failed to unsubscribe from statusChanged', { error });\n }\n\n super.destroy();\n }\n}\n\n// ============================================================================\n// FACTORY FUNCTION\n// ============================================================================\n\n/**\n * Creates an AccountActivityDataSource instance.\n *\n * @param options - Configuration options for the data source.\n * @returns A new AccountActivityDataSource instance.\n */\nexport function createAccountActivityDataSource(\n options: AccountActivityDataSourceOptions,\n): AccountActivityDataSource {\n return new AccountActivityDataSource(options);\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ApiPlatformClient } from
|
|
2
|
-
import type { RemoteFeatureFlagControllerGetStateAction, RemoteFeatureFlagControllerStateChangeEvent } from
|
|
3
|
-
import type { AssetsControllerMessenger } from
|
|
4
|
-
import type { ChainId, DataRequest, DataResponse, Middleware, AssetsControllerStateInternal } from
|
|
5
|
-
import type { DataSourceState, SubscriptionRequest } from
|
|
6
|
-
import { AbstractDataSource } from
|
|
1
|
+
import { ApiPlatformClient } from '@metamask/core-backend';
|
|
2
|
+
import type { RemoteFeatureFlagControllerGetStateAction, RemoteFeatureFlagControllerStateChangeEvent } from '@metamask/remote-feature-flag-controller';
|
|
3
|
+
import type { AssetsControllerMessenger } from '../AssetsController.js';
|
|
4
|
+
import type { ChainId, DataRequest, DataResponse, Middleware, AssetsControllerStateInternal } from '../types.js';
|
|
5
|
+
import type { DataSourceState, SubscriptionRequest } from './AbstractDataSource.js';
|
|
6
|
+
import { AbstractDataSource } from './AbstractDataSource.js';
|
|
7
7
|
declare const CONTROLLER_NAME = "AccountsApiDataSource";
|
|
8
8
|
export type AccountsApiDataSourceAllowedActions = RemoteFeatureFlagControllerGetStateAction;
|
|
9
9
|
export type AccountsApiDataSourceAllowedEvents = RemoteFeatureFlagControllerStateChangeEvent;
|
|
@@ -79,4 +79,4 @@ export declare class AccountsApiDataSource extends AbstractDataSource<typeof CON
|
|
|
79
79
|
destroy(): void;
|
|
80
80
|
}
|
|
81
81
|
export {};
|
|
82
|
-
//# sourceMappingURL=AccountsApiDataSource.d.
|
|
82
|
+
//# sourceMappingURL=AccountsApiDataSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountsApiDataSource.d.ts","sourceRoot":"","sources":["../../src/data-sources/AccountsApiDataSource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EACV,yCAAyC,EACzC,2CAA2C,EAC5C,MAAM,0CAA0C,CAAC;AAOlD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,KAAK,EACV,OAAO,EAGP,WAAW,EACX,YAAY,EACZ,UAAU,EACV,6BAA6B,EAC9B,MAAM,aAAa,CAAC;AAMrB,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAO7D,QAAA,MAAM,eAAe,0BAA0B,CAAC;AAehD,MAAM,MAAM,mCAAmC,GAC7C,yCAAyC,CAAC;AAI5C,MAAM,MAAM,kCAAkC,GAC5C,2CAA2C,CAAC;AAM9C,MAAM,MAAM,0BAA0B,GAAG,eAAe,CAAC;AAUzD,wDAAwD;AACxD,MAAM,MAAM,2BAA2B,GAAG;IACxC,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC;IACtC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,2BAA2B,GAAG;IACvE;;;OAGG;IACH,SAAS,EAAE,yBAAyB,CAAC;IACrC,mDAAmD;IACnD,cAAc,EAAE,iBAAiB,CAAC;IAClC,qGAAqG;IACrG,qBAAqB,EAAE,CACrB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,OAAO,EAAE,EACjB,cAAc,EAAE,OAAO,EAAE,KACtB,IAAI,CAAC;IACV,KAAK,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;CAC7C,CAAC;AAgCF;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,6BAA6B,GACzC,YAAY,CAqCd;AAMD;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,kBAAkB,CAC3D,OAAO,eAAe,EACtB,0BAA0B,CAC3B;;IA0BC,YAAY,OAAO,EAAE,4BAA4B,EAgChD;IA8FD;;;;;;OAMG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnC;IA0BK,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAoFvD;IAmOD;;;;;;;;;OASG;IACH,IAAI,gBAAgB,IAAI,UAAU,CAuEjC;IAMK,SAAS,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoGvE;IAMD,OAAO,IAAI,IAAI,CAMd;CACF"}
|
|
@@ -10,13 +10,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
12
|
var _AccountsApiDataSource_instances, _AccountsApiDataSource_onActiveChainsUpdated, _AccountsApiDataSource_pollInterval, _AccountsApiDataSource_fetchTimeoutMs, _AccountsApiDataSource_tokenDetectionEnabled, _AccountsApiDataSource_messenger, _AccountsApiDataSource_apiClient, _AccountsApiDataSource_chainsRefreshTimer, _AccountsApiDataSource_getAssetsState, _AccountsApiDataSource_handleMigrationFeatureFlagsChanged, _AccountsApiDataSource_isBalanceV6Enabled, _AccountsApiDataSource_initializeActiveChains, _AccountsApiDataSource_refreshActiveChains, _AccountsApiDataSource_fetchActiveChains, _AccountsApiDataSource_fetchV5Balances, _AccountsApiDataSource_fetchV6Balances, _AccountsApiDataSource_buildAddressToAccountIdMap, _AccountsApiDataSource_processV5Balances, _AccountsApiDataSource_processV6Balances;
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { isStakingContractAssetId } from "./evm-rpc-services/index.mjs";
|
|
13
|
+
import { isCaipChainId, KnownCaipNamespace, toCaipChainId, } from '@metamask/utils';
|
|
14
|
+
import { projectLogger, createModuleLogger } from '../logger.js';
|
|
15
|
+
import { fetchWithTimeout, normalizeAssetId } from '../utils/index.js';
|
|
16
|
+
import { getMigrationStages, shouldSupportChain, } from '../utils/snaps-assets-migration.js';
|
|
17
|
+
import { AbstractDataSource } from './AbstractDataSource.js';
|
|
18
|
+
import { isStakingContractAssetId } from './evm-rpc-services/index.js';
|
|
20
19
|
// ============================================================================
|
|
21
20
|
// CONSTANTS
|
|
22
21
|
// ============================================================================
|
|
@@ -578,4 +577,4 @@ async function _AccountsApiDataSource_fetchV6Balances(accountIds, fetchOptions,
|
|
|
578
577
|
}
|
|
579
578
|
return { assetsBalance };
|
|
580
579
|
};
|
|
581
|
-
//# sourceMappingURL=AccountsApiDataSource.
|
|
580
|
+
//# sourceMappingURL=AccountsApiDataSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountsApiDataSource.js","sourceRoot":"","sources":["../../src/data-sources/AccountsApiDataSource.ts"],"names":[],"mappings":";;;;;;;;;;;;AAMA,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,aAAa,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAUjE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAK5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAChD,MAAM,qBAAqB,GAAG,KAAM,CAAC;AACrC,MAAM,wBAAwB,GAAG,KAAM,CAAC;AAExC,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;AAyB/D,MAAM,YAAY,GAA+B;IAC/C,YAAY,EAAE,EAAE;CACjB,CAAC;AAyCF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,SAAS,gBAAgB,CAAC,cAA+B;IACvD,mEAAmE;IACnE,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QACvC,IAAI,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,OAAO,cAAc,CAAC;QACxB,CAAC;QACD,OAAO,aAAa,CAAC,kBAAkB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,aAAa,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,aAAa,CAAC,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAAsB,EACtB,WAA0C;IAE1C,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,eAAe,GAGjB,EAAE,CAAC;IAEP,KAAK,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CACvD,QAAQ,CAAC,aAAa,CACvB,EAAE,CAAC;QACF,MAAM,gBAAgB,GAAG,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,6DAA6D;YAC7D,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAwC,EAAE,CAAC;QACzD,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YACjE,+CAA+C;YAC/C,IAAI,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBAChC,QAAQ,CAAC,OAAwB,CAAC,GAAG,OAAO,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,eAAe,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,QAAQ;QACX,aAAa,EACX,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;KACxE,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,OAAO,qBAAsB,SAAQ,kBAG1C;IA0BC,YAAY,OAAqC;QAC/C,KAAK,CAAC,eAAe,EAAE;YACrB,GAAG,YAAY;YACf,GAAG,OAAO,CAAC,KAAK;SACjB,CAAC,CAAC;;QA7BI,+DAIC;QAED,sDAAsB;QAEtB,wDAAwB;QAEjC,8EAA8E;QACrE,+DAAsC;QAE/C,4EAA4E;QACnE,mDAAsC;QAE/C,6CAA6C;QACpC,mDAA8B;QAEvC,2BAA2B;QAC3B,oDAA6D,IAAI,EAAC;QAElE,4FAA4F;QAC5F,wDAAsD;QAQpD,uBAAA,IAAI,gDAA0B,OAAO,CAAC,qBAAqB,MAAA,CAAC;QAC5D,uBAAA,IAAI,uCAAiB,OAAO,CAAC,YAAY,IAAI,qBAAqB,MAAA,CAAC;QACnE,uBAAA,IAAI,yCAAmB,OAAO,CAAC,cAAc,IAAI,wBAAwB,MAAA,CAAC;QAC1E,uBAAA,IAAI,gDACF,OAAO,CAAC,qBAAqB,IAAI,CAAC,GAAY,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;QACzD,uBAAA,IAAI,oCAAc,OAAO,CAAC,SAAS,MAAA,CAAC;QACpC,uBAAA,IAAI,oCAAc,OAAO,CAAC,cAAc,MAAA,CAAC;QAEzC,6EAA6E;QAC7E,6DAA6D;QAC7D,2EAA2E;QAC3E,6EAA6E;QAC7E,wEAAwE;QACxE,uBAAA,IAAI,wCAAW,CAAC,SAAS;QACvB,gDAAgD;QAChD,yCAAyC;QACzC,2CAA2C;QAC3C,kEAAkE;QAClE,KAAK,IAAI,EAAE,CAAC,MAAM,uBAAA,IAAI,mGAAoC,MAAxC,IAAI,CAAsC;QAC5D,sEAAsE;QACtE,uEAAuE;QACvE,iDAAiD;QACjD,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAClE,CAAC;QAEF,uBAAA,IAAI,uFAAwB,MAA5B,IAAI,CAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IA8FD;;;;;;OAMG;IACH,mBAAmB;QACjB,OAAO,uBAAA,IAAI,oFAAqB,MAAzB,IAAI,CAAuB,CAAC;IACrC,CAAC;IAkBD,+EAA+E;IAC/E,wBAAwB;IACxB,+EAA+E;IAE/E,+EAA+E;IAC/E,QAAQ;IACR,+EAA+E;IAE/E,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,QAAQ,GAAiB,EAAE,CAAC;QAEhC,kDAAkD;QAClD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CACxD,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAC7B,CAAC;QAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,oEAAoE;YACpE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACvC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;oBACxC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,qCAAqC,CAAC;gBACnE,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,yDAAyD;YACzD,gEAAgE;YAChE,MAAM,UAAU,GAAG,OAAO,CAAC,2BAA2B,CAAC,OAAO,CAC5D,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,EAAE,EAAE,CAC9C,aAAa;iBACV,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBACpD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CACvD,CAAC;YAEF,uDAAuD;YACvD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW;gBACtC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;gBAC7B,CAAC,CAAC,SAAS,CAAC;YAEd,yEAAyE;YACzE,kEAAkE;YAClE,MAAM,EAAE,mBAAmB,EAAE,aAAa,EAAE,GAAG,uBAAA,IAAI,mFAAoB,MAAxB,IAAI,CAAsB;gBACvE,CAAC,CAAC,MAAM,uBAAA,IAAI,gFAAiB,MAArB,IAAI,EAAkB,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC;gBAChE,CAAC,CAAC,MAAM,uBAAA,IAAI,gFAAiB,MAArB,IAAI,EAAkB,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAEnE,wEAAwE;YACxE,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,mBAAmB,GACvB,mBAAmB,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAEhD,iFAAiF;gBACjF,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;gBACxC,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;oBAC1C,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,6BAA6B,CAAC;gBAC3D,CAAC;YACH,CAAC;YAED,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAC;YACvC,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;YAEtD,gFAAgF;YAChF,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;YACxC,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;gBACpC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;oBACtB,iBAAiB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,oEAAoE;QACpE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;gBACxC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,qCAAqC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,IAAI,CAAC,uBAAA,IAAI,oDAAuB,MAA3B,IAAI,CAAyB,IAAI,uBAAA,IAAI,6CAAgB,EAAE,CAAC;YAC3D,QAAQ,GAAG,2BAA2B,CAAC,QAAQ,EAAE,uBAAA,IAAI,6CAAgB,MAApB,IAAI,CAAkB,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IA+ND,+EAA+E;IAC/E,aAAa;IACb,+EAA+E;IAE/E;;;;;;;;;OASG;IACH,IAAI,gBAAgB;QAClB,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;;YAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAE5B,8DAA8D;YAC9D,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YAED,kDAAkD;YAClD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YAED,IAAI,yBAAyB,GAAc,EAAE,CAAC;YAE9C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAE3C,8BAA8B;gBAC9B,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;oBAC3B,MAAA,OAAO,CAAC,QAAQ,EAAC,aAAa,QAAb,aAAa,GAAK,EAAE,EAAC;oBACtC,KAAK,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CACvD,QAAQ,CAAC,aAAa,CACvB,EAAE,CAAC;wBACF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG;4BAC1C,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC;4BAC5C,GAAG,eAAe;yBACnB,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,2EAA2E;gBAC3E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;gBACtE,yBAAyB,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CACjD,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAC7C,CAAC;gBAEF,6EAA6E;gBAC7E,2EAA2E;gBAC3E,kFAAkF;gBAClF,IACE,CAAC,uBAAA,IAAI,oDAAuB,MAA3B,IAAI,CAAyB;oBAC9B,CAAC,CAAC,QAAQ,CAAC,aAAa;wBACtB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EACnD,CAAC;oBACD,yBAAyB,GAAG,EAAE,CAAC;gBACjC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1C,yBAAyB,GAAG,EAAE,CAAC;YACjC,CAAC;YAED,sEAAsE;YACtE,IAAI,yBAAyB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAC7C,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC1D,CAAC;gBAEF,OAAO,IAAI,CAAC;oBACV,GAAG,OAAO;oBACV,OAAO,EAAE;wBACP,GAAG,OAAO;wBACV,QAAQ,EAAE,eAAe;qBAC1B;iBACF,CAAC,CAAC;YACL,CAAC;YAED,6CAA6C;YAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,YAAY;IACZ,+EAA+E;IAE/E,KAAK,CAAC,SAAS,CAAC,mBAAwC;QACtD,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAC3D,mBAAmB,CAAC;QAEtB,yEAAyE;QACzE,IAAI,mBAAmB,CAAC,cAAc,EAAE,CAAC;YACvC,uBAAA,IAAI,yCAAmB,mBAAmB,CAAC,cAAc,MAAA,CAAC;QAC5D,CAAC;QAED,sFAAsF;QACtF,MAAM,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;QAE3C,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,6EAA6E;QAC7E,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC9D,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;gBACvC,QAAQ,CAAC,MAAM,GAAG,iBAAiB,CAAC;gBACpC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;gBAE3B,iEAAiE;gBACjE,gEAAgE;gBAChE,2DAA2D;gBAC3D,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAC1C,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC/C,CAAC;gBACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,IAAI,CAAC;wBACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;4BACrC,GAAG,OAAO;4BACV,QAAQ,EAAE,WAAW;4BACrB,WAAW,EAAE,IAAI;yBAClB,CAAC,CAAC;wBACH,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;oBAC/C,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,GAAG,CAAC,uCAAuC,EAAE;4BAC3C,cAAc;4BACd,WAAW;4BACX,KAAK;yBACN,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAEvC,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,IAAI,uBAAA,IAAI,2CAAc,CAAC;QAElE,6CAA6C;QAC7C,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;YACvC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAClE,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;oBAC3B,OAAO;gBACT,CAAC;gBAED,8DAA8D;gBAC9D,8DAA8D;gBAC9D,oEAAoE;gBACpE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;oBACrC,GAAG,YAAY,CAAC,OAAO;oBACvB,QAAQ,EAAE,YAAY,CAAC,MAAM;oBAC7B,WAAW,EAAE,IAAI;iBAClB,CAAC,CAAC;gBAEH,iDAAiD;gBACjD,MAAM,YAAY,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,0BAA0B,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC;QAEF,iBAAiB;QACjB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,EAAE,YAAY,CAAC,CAAC;QAEjB,sDAAsD;QACtD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,cAAc,EAAE;YAC3C,OAAO,EAAE,GAAG,EAAE;gBACZ,aAAa,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YACD,MAAM,EAAE,iBAAiB;YACzB,OAAO;YACP,cAAc,EAAE,mBAAmB,CAAC,cAAc;SACnD,CAAC,CAAC;QAEH,wEAAwE;QACxE,qEAAqE;QACrE,gEAAgE;QAChE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,MAAM,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,UAAU;IACV,+EAA+E;IAE/E,OAAO;QACL,IAAI,uBAAA,IAAI,iDAAoB,EAAE,CAAC;YAC7B,aAAa,CAAC,uBAAA,IAAI,iDAAoB,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;CACF;;AA9nBC;;;;;GAKG;AACH,KAAK;IACH,IAAI,CAAC;QACH,MAAM,uBAAA,IAAI,oFAAqB,MAAzB,IAAI,CAAuB,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,2DAA2D,EAAE;YAC/D,KAAK;SACN,CAAC,CAAC;IACL,CAAC;AACH,CAAC;IAgBC,IAAI,CAAC;QACH,MAAM,EAAE,kBAAkB,EAAE,GAAG,uBAAA,IAAI,wCAAW,CAAC,IAAI,CACjD,sCAAsC,CACvC,CAAC;QACF,MAAM,IAAI,GAAG,kBAAkB,EAAE,mBAAmB,CAAC;QACrD,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;YACxB,IAAI,KAAK,IAAI;YACb,OAAO,CAAE,IAA4B,CAAC,KAAK,CAAC,CAC7C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,KAAK;IACH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,uBAAA,IAAI,kFAAmB,MAAvB,IAAI,CAAqB,CAAC;QAC/C,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,CAChD,uBAAA,IAAI,oDAAuB,MAA3B,IAAI,EAAwB,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,QAAQ,CAAC,CACrE,CAAC;QAEF,wDAAwD;QACxD,uBAAA,IAAI,6CAAuB,WAAW,CACpC,GAAG,EAAE;YACH,uBAAA,IAAI,oFAAqB,MAAzB,IAAI,CAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC,EACD,EAAE,GAAG,EAAE,GAAG,IAAI,CACf,MAAA,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC,+CAED,KAAK;IACH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,uBAAA,IAAI,kFAAmB,MAAvB,IAAI,CAAqB,CAAC;QAC/C,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAElC,0BAA0B;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAC/C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CACjC,CAAC;QAEF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,CAChD,uBAAA,IAAI,oDAAuB,MAA3B,IAAI,EAAwB,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,QAAQ,CAAC,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,6CAaD,KAAK;IACH,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,wCAAW,CAAC,QAAQ,CAAC,wBAAwB,EAAE,CAAC;IAE3E,kEAAkE;IAClE,0EAA0E;IAC1E,4EAA4E;IAC5E,qDAAqD;IACrD,oCAAoC;IACpC,MAAM,EAAE,kBAAkB,EAAE,GAAG,uBAAA,IAAI,wCAAW,CAAC,IAAI,CACjD,sCAAsC,CACvC,CAAC;IACF,OAAO,QAAQ,CAAC,WAAW;SACxB,GAAG,CAAC,gBAAgB,CAAC;SACrB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAC1E,CAAC;AAgGD;;;;;;;GAOG;AACH,KAAK,iDACH,UAAoB,EACpB,YAA+D,EAC/D,OAAoB;IAKpB,MAAM,WAAW,GAAG,MAAM,gBAAgB,CACxC,GAAG,EAAE,CACH,uBAAA,IAAI,wCAAW,CAAC,QAAQ,CAAC,2BAA2B,CAClD,UAAU,EACV,SAAS,EACT,YAAY,CACb,EACH,uBAAA,IAAI,6CAAgB,CACrB,CAAC;IAEF,MAAM,EAAE,aAAa,EAAE,GAAG,uBAAA,IAAI,kFAAmB,MAAvB,IAAI,EAC5B,WAAW,CAAC,QAAQ,EACpB,OAAO,CACR,CAAC;IAEF,OAAO;QACL,mBAAmB,EAAE,WAAW,CAAC,mBAAmB;QACpD,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,iDACH,UAAoB,EACpB,YAA+D,EAC/D,OAAoB;IAKpB,MAAM,WAAW,GAAG,MAAM,gBAAgB,CACxC,GAAG,EAAE,CACH,uBAAA,IAAI,wCAAW,CAAC,QAAQ,CAAC,2BAA2B,CAClD,UAAU,EACV,SAAS,EACT,YAAY,CACb,EACH,uBAAA,IAAI,6CAAgB,CACrB,CAAC;IAEF,MAAM,EAAE,aAAa,EAAE,GAAG,uBAAA,IAAI,kFAAmB,MAAvB,IAAI,EAC5B,WAAW,CAAC,QAAQ,EACpB,OAAO,CACR,CAAC;IAEF,OAAO;QACL,mBAAmB,EAAE,WAAW,CAAC,mBAAmB;QACpD,aAAa;KACd,CAAC;AACJ,CAAC,iHAQ2B,OAAoB;IAC9C,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrD,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,OAAO,CAAC,2BAA2B,EAAE,CAAC;QAC9D,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC,+FAWC,QAAyB,EACzB,OAAoB;IAIpB,MAAM,aAAa,GAGf,EAAE,CAAC;IAEP,yEAAyE;IACzE,MAAM,kBAAkB,GAAG,uBAAA,IAAI,2FAA4B,MAAhC,IAAI,EAA6B,OAAO,CAAC,CAAC;IAErE,6DAA6D;IAC7D,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,sFAAsF;QACtF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAE9C,4CAA4C;QAC5C,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,8FAA8F;YAC9F,SAAS;QACX,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,aAAa,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAChC,CAAC;QAED,+DAA+D;QAC/D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAwB,CAAC,CAAC;QAE1E,yEAAyE;QACzE,sEAAsE;QACtE,qEAAqE;QACrE,IAAI,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAChD,SAAS;QACX,CAAC;QAED,mCAAmC;QACnC,aAAa,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,GAAG;YAC5C,MAAM,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,CAAC;AAC3B,CAAC,+FAaC,QAAyB,EACzB,OAAoB;IAIpB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAGvC,CAAC;IAEF,yEAAyE;IACzE,MAAM,kBAAkB,GAAG,uBAAA,IAAI,2FAA4B,MAAhC,IAAI,EAA6B,OAAO,CAAC,CAAC;IAErE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,sFAAsF;QACtF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAE9C,4CAA4C;QAC5C,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,8FAA8F;YAC9F,SAAS;QACX,CAAC;QAED,qEAAqE;QACrE,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,aAAa,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAG5C,CAAC;QACJ,CAAC;QAED,+DAA+D;QAC/D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAwB,CAAC,CAAC;QAE1E,yEAAyE;QACzE,sEAAsE;QACtE,qEAAqE;QACrE,IAAI,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAChD,SAAS;QACX,CAAC;QAED,mCAAmC;QACnC,aAAa,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,GAAG;YAC5C,MAAM,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["import type { V5BalanceItem, V6BalanceItem } from '@metamask/core-backend';\nimport { ApiPlatformClient } from '@metamask/core-backend';\nimport type {\n RemoteFeatureFlagControllerGetStateAction,\n RemoteFeatureFlagControllerStateChangeEvent,\n} from '@metamask/remote-feature-flag-controller';\nimport {\n isCaipChainId,\n KnownCaipNamespace,\n toCaipChainId,\n} from '@metamask/utils';\n\nimport type { AssetsControllerMessenger } from '../AssetsController.js';\nimport { projectLogger, createModuleLogger } from '../logger.js';\nimport type {\n ChainId,\n Caip19AssetId,\n AssetBalance,\n DataRequest,\n DataResponse,\n Middleware,\n AssetsControllerStateInternal,\n} from '../types.js';\nimport { fetchWithTimeout, normalizeAssetId } from '../utils/index.js';\nimport {\n getMigrationStages,\n shouldSupportChain,\n} from '../utils/snaps-assets-migration.js';\nimport type {\n DataSourceState,\n SubscriptionRequest,\n} from './AbstractDataSource.js';\nimport { AbstractDataSource } from './AbstractDataSource.js';\nimport { isStakingContractAssetId } from './evm-rpc-services/index.js';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst CONTROLLER_NAME = 'AccountsApiDataSource';\nconst DEFAULT_POLL_INTERVAL = 30_000;\nconst DEFAULT_FETCH_TIMEOUT_MS = 15_000;\n\nconst log = createModuleLogger(projectLogger, CONTROLLER_NAME);\n\n// ============================================================================\n// MESSENGER TYPES\n// ============================================================================\n\n// Allowed actions that AccountsApiDataSource can call. Balances are fetched via\n// ApiPlatformClient directly (no BackendApiClient actions needed); the messenger\n// is used to read the Accounts API v6 balances feature flag and to subscribe to\n// `RemoteFeatureFlagController:stateChange` (see constructor) so migration flag\n// changes refresh the active chains.\nexport type AccountsApiDataSourceAllowedActions =\n RemoteFeatureFlagControllerGetStateAction;\n\n// Allowed events that AccountsApiDataSource subscribes to. Migration flag\n// changes trigger a refresh of the chains surfaced as active.\nexport type AccountsApiDataSourceAllowedEvents =\n RemoteFeatureFlagControllerStateChangeEvent;\n\n// ============================================================================\n// STATE\n// ============================================================================\n\nexport type AccountsApiDataSourceState = DataSourceState;\n\nconst defaultState: AccountsApiDataSourceState = {\n activeChains: [],\n};\n\n// ============================================================================\n// OPTIONS\n// ============================================================================\n\n/** Optional configuration for AccountsApiDataSource. */\nexport type AccountsApiDataSourceConfig = {\n /** Polling interval in ms (default: 30000) */\n pollInterval?: number;\n /**\n * Function returning whether token detection is enabled (default: () => true).\n * When it returns false, balances are only returned for tokens already in state.\n * Using a getter avoids stale values when the user toggles the preference at runtime.\n */\n tokenDetectionEnabled?: () => boolean;\n /**\n * Timeout in ms for a single balances fetch call (default: 15000).\n * When it fires, every requested chain is marked as errored so the\n * middleware hands them off to the next data source (e.g. RPC fallback).\n */\n fetchTimeoutMs?: number;\n};\n\nexport type AccountsApiDataSourceOptions = AccountsApiDataSourceConfig & {\n /**\n * The AssetsController messenger (shared by all data sources). Used to read\n * the `assetsAccountsApiV6` remote feature flag.\n */\n messenger: AssetsControllerMessenger;\n /** ApiPlatformClient for API calls with caching */\n queryApiClient: ApiPlatformClient;\n /** Called when active chains are updated. Pass dataSourceName so the controller knows the source. */\n onActiveChainsUpdated: (\n dataSourceName: string,\n chains: ChainId[],\n previousChains: ChainId[],\n ) => void;\n state?: Partial<AccountsApiDataSourceState>;\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nfunction decimalToChainId(decimalChainId: number | string): ChainId {\n // Handle both decimal numbers and already-formatted CAIP chain IDs\n if (typeof decimalChainId === 'string') {\n if (isCaipChainId(decimalChainId)) {\n return decimalChainId;\n }\n return toCaipChainId(KnownCaipNamespace.Eip155, decimalChainId);\n }\n return toCaipChainId(KnownCaipNamespace.Eip155, String(decimalChainId));\n}\n\n/**\n * Convert a CAIP-2 chain ID from the API response to our ChainId type.\n * Handles both formats: \"eip155:1\" or just \"1\" (decimal).\n * Uses @metamask/utils for CAIP parsing.\n *\n * @param chainIdStr - The chain ID string to convert.\n * @returns The normalized ChainId.\n */\nfunction caipChainIdToChainId(chainIdStr: string): ChainId {\n if (isCaipChainId(chainIdStr)) {\n return chainIdStr;\n }\n return toCaipChainId(KnownCaipNamespace.Eip155, chainIdStr);\n}\n\n/**\n * Filter a response to only include balances for assets already in state.\n * Used when tokenDetectionEnabled is false to prevent adding new tokens.\n *\n * @param response - The fetch response to filter.\n * @param assetsState - Current assets controller state to check existing balances against.\n * @returns A new response with only known asset balances.\n */\nexport function filterResponseToKnownAssets(\n response: DataResponse,\n assetsState: AssetsControllerStateInternal,\n): DataResponse {\n if (!response.assetsBalance) {\n return response;\n }\n\n const filteredBalance: Record<\n string,\n Record<Caip19AssetId, AssetBalance>\n > = {};\n\n for (const [accountId, accountBalances] of Object.entries(\n response.assetsBalance,\n )) {\n const existingBalances = assetsState.assetsBalance[accountId];\n if (!existingBalances) {\n // Account has no balances in state yet — skip all its tokens\n continue;\n }\n\n const filtered: Record<Caip19AssetId, AssetBalance> = {};\n for (const [assetId, balance] of Object.entries(accountBalances)) {\n // Only include assets already tracked in state\n if (assetId in existingBalances) {\n filtered[assetId as Caip19AssetId] = balance;\n }\n }\n\n if (Object.keys(filtered).length > 0) {\n filteredBalance[accountId] = filtered;\n }\n }\n\n return {\n ...response,\n assetsBalance:\n Object.keys(filteredBalance).length > 0 ? filteredBalance : undefined,\n };\n}\n\n// ============================================================================\n// ACCOUNTS API DATA SOURCE\n// ============================================================================\n\n/**\n * Data source for fetching balances from the MetaMask Accounts API.\n *\n * Uses ApiPlatformClient (queryApiClient) for all API calls. Does not use the\n * messenger. Reports active chains via onActiveChainsUpdated callback.\n */\nexport class AccountsApiDataSource extends AbstractDataSource<\n typeof CONTROLLER_NAME,\n AccountsApiDataSourceState\n> {\n readonly #onActiveChainsUpdated: (\n dataSourceName: string,\n chains: ChainId[],\n previousChains: ChainId[],\n ) => void;\n\n readonly #pollInterval: number;\n\n readonly #fetchTimeoutMs: number;\n\n /** Getter avoids stale value when user toggles token detection at runtime. */\n readonly #tokenDetectionEnabled: () => boolean;\n\n /** Shared AssetsController messenger, used to read remote feature flags. */\n readonly #messenger: AssetsControllerMessenger;\n\n /** ApiPlatformClient for cached API calls */\n readonly #apiClient: ApiPlatformClient;\n\n /** Chains refresh timer */\n #chainsRefreshTimer: ReturnType<typeof setInterval> | null = null;\n\n /** State accessor from subscriptions (for filtering when tokenDetectionEnabled is false) */\n #getAssetsState?: () => AssetsControllerStateInternal;\n\n constructor(options: AccountsApiDataSourceOptions) {\n super(CONTROLLER_NAME, {\n ...defaultState,\n ...options.state,\n });\n\n this.#onActiveChainsUpdated = options.onActiveChainsUpdated;\n this.#pollInterval = options.pollInterval ?? DEFAULT_POLL_INTERVAL;\n this.#fetchTimeoutMs = options.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS;\n this.#tokenDetectionEnabled =\n options.tokenDetectionEnabled ?? ((): boolean => true);\n this.#messenger = options.messenger;\n this.#apiClient = options.queryApiClient;\n\n // The Snaps → AssetsController migration flags gate which migration networks\n // (Solana, Stellar, Tron) are surfaced as active chains (see\n // `#shouldSupportChain`). Mirror core-backend's AccountActivityService and\n // react to remote feature flag changes so newly-enabled chains are picked up\n // (and disabled ones dropped) without waiting for the periodic refresh.\n this.#messenger.subscribe(\n // eslint-disable-next-line no-restricted-syntax\n 'RemoteFeatureFlagController:stateChange',\n // Promise result intentionally not awaited\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async () => await this.#handleMigrationFeatureFlagsChanged(),\n // Only react to changes in the set of migration stages. The messenger\n // compares selector results with strict equality, so the selector must\n // return a primitive rather than a fresh object.\n (state) => getMigrationStages(state.remoteFeatureFlags).join(','),\n );\n\n this.#initializeActiveChains().catch(console.error);\n }\n\n /**\n * Handle a change to the Snaps → AssetsController migration flags: re-fetch\n * active chains so newly-enabled migration networks are surfaced (and disabled\n * ones dropped) without waiting for the periodic refresh. The refresh invokes\n * `onActiveChainsUpdated` when the set changes, which drives re-subscription.\n */\n async #handleMigrationFeatureFlagsChanged(): Promise<void> {\n try {\n await this.#refreshActiveChains();\n } catch (error) {\n log('Failed to refresh active chains after feature flag change', {\n error,\n });\n }\n }\n\n /**\n * Whether the Accounts API v6 balances endpoint is enabled, read from the\n * RemoteFeatureFlagController (`assetsAccountsApiV6`). Read on demand (per\n * fetch) rather than cached so the value can be toggled at runtime, and behaves\n * the same across clients (extension, mobile). Defaults to `false` when the\n * flag is unset or the controller is unavailable.\n *\n * The flag is a LaunchDarkly JSON variation shaped `{ value: boolean }` (same\n * shape as `backendWebSocketConnection`), so the nested `value` is read rather\n * than treating the flag as a plain boolean.\n *\n * @returns `true` when the v6 balances endpoint should be used.\n */\n #isBalanceV6Enabled(): boolean {\n try {\n const { remoteFeatureFlags } = this.#messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n const flag = remoteFeatureFlags?.assetsAccountsApiV6;\n return (\n typeof flag === 'object' &&\n flag !== null &&\n Boolean((flag as { value?: unknown }).value)\n );\n } catch {\n return false;\n }\n }\n\n // ============================================================================\n // INITIALIZATION\n // ============================================================================\n\n async #initializeActiveChains(): Promise<void> {\n try {\n const chains = await this.#fetchActiveChains();\n const previous = [...this.state.activeChains];\n this.updateActiveChains(chains, (updatedChains) =>\n this.#onActiveChainsUpdated(this.getName(), updatedChains, previous),\n );\n\n // Periodically refresh active chains (every 20 minutes)\n this.#chainsRefreshTimer = setInterval(\n () => {\n this.#refreshActiveChains().catch(console.error);\n },\n 20 * 60 * 1000,\n );\n } catch (error) {\n log('Failed to fetch active chains', error);\n }\n }\n\n async #refreshActiveChains(): Promise<void> {\n try {\n const chains = await this.#fetchActiveChains();\n const previousChains = new Set(this.state.activeChains);\n const newChains = new Set(chains);\n\n // Check if chains changed\n const added = chains.filter((chain) => !previousChains.has(chain));\n const removed = Array.from(previousChains).filter(\n (chain) => !newChains.has(chain),\n );\n\n if (added.length > 0 || removed.length > 0) {\n const previous = [...this.state.activeChains];\n this.updateActiveChains(chains, (updatedChains) =>\n this.#onActiveChainsUpdated(this.getName(), updatedChains, previous),\n );\n }\n } catch (error) {\n log('Failed to refresh active chains', error);\n }\n }\n\n /**\n * Re-fetch supported networks from the Accounts API and update `activeChains`\n * when the list changed. Used when the selected EVM network switches so\n * chain claiming is not stuck on an empty init-time list.\n *\n * @returns Resolves when supported networks have been re-fetched.\n */\n refreshActiveChains(): Promise<void> {\n return this.#refreshActiveChains();\n }\n\n async #fetchActiveChains(): Promise<ChainId[]> {\n const response = await this.#apiClient.accounts.fetchV2SupportedNetworks();\n\n // Use fullSupport networks as active chains, gated by the Snaps →\n // AssetsController migration FF: non-migration namespaces (e.g. `eip155`)\n // are always surfaced, while migration networks (Solana, Stellar, Tron) are\n // only surfaced once their per-network stage reaches\n // ReadAssetsControllerWithFallback.\n const { remoteFeatureFlags } = this.#messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n return response.fullSupport\n .map(decimalToChainId)\n .filter((chainId) => shouldSupportChain(chainId, remoteFeatureFlags));\n }\n\n // ============================================================================\n // ACCOUNT SCOPE HELPERS\n // ============================================================================\n\n // ============================================================================\n // FETCH\n // ============================================================================\n\n async fetch(request: DataRequest): Promise<DataResponse> {\n let response: DataResponse = {};\n\n // Filter to only chains supported by Accounts API\n const supportedChains = new Set(this.state.activeChains);\n const chainsToFetch = request.chainIds.filter((chainId) =>\n supportedChains.has(chainId),\n );\n\n if (chainsToFetch.length === 0) {\n // Mark unsupported chains as errors so they pass to next middleware\n for (const chainId of request.chainIds) {\n if (!supportedChains.has(chainId)) {\n response.errors = response.errors ?? {};\n response.errors[chainId] = 'Chain not supported by Accounts API';\n }\n }\n return response;\n }\n\n try {\n // Build CAIP-10 account IDs (e.g., \"eip155:1:0x1234...\")\n // Use pre-computed supportedChains per account from the request\n const accountIds = request.accountsWithSupportedChains.flatMap(\n ({ account, supportedChains: accountChains }) =>\n chainsToFetch\n .filter((chainId) => accountChains.includes(chainId))\n .map((chainId) => `${chainId}:${account.address}`),\n );\n\n // Skip API call if no valid account-chain combinations\n if (accountIds.length === 0) {\n return response;\n }\n\n const fetchOptions = request.forceUpdate\n ? { staleTime: 0, gcTime: 0 }\n : undefined;\n\n // Feature-flagged: v6 endpoint with a fallback to legacy v5. The flag is\n // read here (not cached) so a runtime toggle can revert v6 -> v5.\n const { unprocessedNetworks, assetsBalance } = this.#isBalanceV6Enabled()\n ? await this.#fetchV6Balances(accountIds, fetchOptions, request)\n : await this.#fetchV5Balances(accountIds, fetchOptions, request);\n\n // Handle unprocessed networks - these will be passed to next middleware\n if (unprocessedNetworks.length > 0) {\n const unprocessedChainIds =\n unprocessedNetworks.map(caipChainIdToChainId);\n\n // Add unprocessed chains to errors so middleware passes them to next data source\n response.errors = response.errors ?? {};\n for (const chainId of unprocessedChainIds) {\n response.errors[chainId] = 'Unprocessed by Accounts API';\n }\n }\n\n response.assetsBalance = assetsBalance;\n response.updateMode = 'merge';\n } catch (error) {\n log('Fetch FAILED', { error, chains: chainsToFetch });\n\n // On error, mark all chains as errors so they can be handled by next middleware\n response.errors = response.errors ?? {};\n for (const chainId of chainsToFetch) {\n response.errors[chainId] =\n `Fetch failed: ${error instanceof Error ? error.message : String(error)}`;\n }\n }\n\n // Mark unsupported chains as errors so they pass to next middleware\n for (const chainId of request.chainIds) {\n if (!supportedChains.has(chainId)) {\n response.errors = response.errors ?? {};\n response.errors[chainId] = 'Chain not supported by Accounts API';\n }\n }\n\n // When token detection is disabled, filter out tokens not already in state\n if (!this.#tokenDetectionEnabled() && this.#getAssetsState) {\n response = filterResponseToKnownAssets(response, this.#getAssetsState());\n }\n\n return response;\n }\n\n /**\n * Fetch balances from the legacy v5 endpoint and process them.\n *\n * @param accountIds - CAIP-10 account IDs to fetch balances for.\n * @param fetchOptions - Cache/fetch options (e.g. force update settings).\n * @param request - The original data request containing accounts to map.\n * @returns Unprocessed networks and processed asset balances by account.\n */\n async #fetchV5Balances(\n accountIds: string[],\n fetchOptions: { staleTime: number; gcTime: number } | undefined,\n request: DataRequest,\n ): Promise<{\n unprocessedNetworks: string[];\n assetsBalance: Record<string, Record<Caip19AssetId, AssetBalance>>;\n }> {\n const apiResponse = await fetchWithTimeout(\n () =>\n this.#apiClient.accounts.fetchV5MultiAccountBalances(\n accountIds,\n undefined,\n fetchOptions,\n ),\n this.#fetchTimeoutMs,\n );\n\n const { assetsBalance } = this.#processV5Balances(\n apiResponse.balances,\n request,\n );\n\n return {\n unprocessedNetworks: apiResponse.unprocessedNetworks,\n assetsBalance,\n };\n }\n\n /**\n * Fetch balances from the v6 endpoint and process them.\n *\n * @param accountIds - CAIP-10 account IDs to fetch balances for.\n * @param fetchOptions - Cache/fetch options (e.g. force update settings).\n * @param request - The original data request containing accounts to map.\n * @returns Unprocessed networks and processed asset balances by account.\n */\n async #fetchV6Balances(\n accountIds: string[],\n fetchOptions: { staleTime: number; gcTime: number } | undefined,\n request: DataRequest,\n ): Promise<{\n unprocessedNetworks: string[];\n assetsBalance: Record<string, Record<Caip19AssetId, AssetBalance>>;\n }> {\n const apiResponse = await fetchWithTimeout(\n () =>\n this.#apiClient.accounts.fetchV6MultiAccountBalances(\n accountIds,\n undefined,\n fetchOptions,\n ),\n this.#fetchTimeoutMs,\n );\n\n const { assetsBalance } = this.#processV6Balances(\n apiResponse.balances,\n request,\n );\n\n return {\n unprocessedNetworks: apiResponse.unprocessedNetworks,\n assetsBalance,\n };\n }\n\n /**\n * Build a lookup of lowercased account address to the request's account ID.\n *\n * @param request - The original data request containing accounts to map.\n * @returns Map of lowercase address to account ID.\n */\n #buildAddressToAccountIdMap(request: DataRequest): Map<string, string> {\n const addressToAccountId = new Map<string, string>();\n for (const { account } of request.accountsWithSupportedChains) {\n if (account.address) {\n addressToAccountId.set(account.address.toLowerCase(), account.id);\n }\n }\n return addressToAccountId;\n }\n\n /**\n * Process V5 API balances response.\n * V5 returns a flat array of balance items, each with accountId and assetId.\n *\n * @param balances - Array of balance items from the V5 API response.\n * @param request - The original data request containing accounts to map.\n * @returns Object containing processed asset balances by account.\n */\n #processV5Balances(\n balances: V5BalanceItem[],\n request: DataRequest,\n ): {\n assetsBalance: Record<string, Record<Caip19AssetId, AssetBalance>>;\n } {\n const assetsBalance: Record<\n string,\n Record<Caip19AssetId, AssetBalance>\n > = {};\n\n // Build a map of lowercase addresses to account IDs for efficient lookup\n const addressToAccountId = this.#buildAddressToAccountIdMap(request);\n\n // V5 response: array of { accountId, assetId, balance, ... }\n for (const item of balances) {\n // Extract address from CAIP-10 account ID (e.g., \"eip155:1:0x1234...\" -> \"0x1234...\")\n const addressParts = item.accountId.split(':');\n if (addressParts.length < 3) {\n continue;\n }\n const address = addressParts[2].toLowerCase();\n\n // Find the matching account ID from request\n const accountId = addressToAccountId.get(address);\n if (!accountId) {\n // This is normal - API returns balances for all chains, but request may only have one account\n continue;\n }\n\n if (!assetsBalance[accountId]) {\n assetsBalance[accountId] = {};\n }\n\n // Normalize asset ID (checksum EVM addresses for ERC20 tokens)\n const normalizedAssetId = normalizeAssetId(item.assetId as Caip19AssetId);\n\n // Staked balances are owned by StakedBalanceDataSource. Accounts API may\n // return the vault share token as a normal ERC-20 (often 0 or stale),\n // which would overwrite or wipe the on-chain staked amount on merge.\n if (isStakingContractAssetId(normalizedAssetId)) {\n continue;\n }\n\n // Store balance as returned by API\n assetsBalance[accountId][normalizedAssetId] = {\n amount: item.balance,\n };\n }\n\n return { assetsBalance };\n }\n\n /**\n * Process V6 API balances response.\n * V6 returns a flat array of rows carrying their `accountId`.\n * Only `object: 'token'` rows are consumed here to preserve parity with\n * the v5 token-balance behavior; DeFi positions are ignored.\n *\n * @param balances - Flat balance rows from the V6 API response.\n * @param request - The original data request containing accounts to map.\n * @returns Object containing processed asset balances by account.\n */\n #processV6Balances(\n balances: V6BalanceItem[],\n request: DataRequest,\n ): {\n assetsBalance: Record<string, Record<Caip19AssetId, AssetBalance>>;\n } {\n const assetsBalance = Object.create(null) as Record<\n string,\n Record<Caip19AssetId, AssetBalance>\n >;\n\n // Build a map of lowercase addresses to account IDs for efficient lookup\n const addressToAccountId = this.#buildAddressToAccountIdMap(request);\n\n for (const item of balances) {\n // Extract address from CAIP-10 account ID (e.g., \"eip155:1:0x1234...\" -> \"0x1234...\")\n const addressParts = item.accountId.split(':');\n if (addressParts.length < 3) {\n continue;\n }\n const address = addressParts[2].toLowerCase();\n\n // Find the matching account ID from request\n const accountId = addressToAccountId.get(address);\n if (!accountId) {\n // This is normal - API returns balances for all chains, but request may only have one account\n continue;\n }\n\n // Only consume token balances; DeFi positions are handled elsewhere.\n if (item.object !== 'token') {\n continue;\n }\n\n if (!assetsBalance[accountId]) {\n assetsBalance[accountId] = Object.create(null) as Record<\n Caip19AssetId,\n AssetBalance\n >;\n }\n\n // Normalize asset ID (checksum EVM addresses for ERC20 tokens)\n const normalizedAssetId = normalizeAssetId(item.assetId as Caip19AssetId);\n\n // Staked balances are owned by StakedBalanceDataSource. Accounts API may\n // return the vault share token as a normal ERC-20 (often 0 or stale),\n // which would overwrite or wipe the on-chain staked amount on merge.\n if (isStakingContractAssetId(normalizedAssetId)) {\n continue;\n }\n\n // Store balance as returned by API\n assetsBalance[accountId][normalizedAssetId] = {\n amount: item.balance,\n };\n }\n\n return { assetsBalance };\n }\n\n // ============================================================================\n // MIDDLEWARE\n // ============================================================================\n\n /**\n * Get the middleware for fetching balances via Accounts API.\n * This middleware:\n * - Supports multiple accounts in a single request\n * - Uses unprocessedNetworks from API response to determine what to pass to next middleware\n * - Merges response into context\n * - Removes handled chains from request for next middleware\n *\n * @returns The middleware function for the assets pipeline.\n */\n get assetsMiddleware(): Middleware {\n return async (context, next) => {\n const { request } = context;\n\n // Price/metadata-only requests must not hit the Accounts API.\n if (!request.dataTypes.includes('balance')) {\n return next(context);\n }\n\n // If no chains requested, skip to next middleware\n if (request.chainIds.length === 0) {\n return next(context);\n }\n\n let successfullyHandledChains: ChainId[] = [];\n\n try {\n const response = await this.fetch(request);\n\n // Merge response into context\n if (response.assetsBalance) {\n context.response.assetsBalance ??= {};\n for (const [accountId, accountBalances] of Object.entries(\n response.assetsBalance,\n )) {\n context.response.assetsBalance[accountId] = {\n ...context.response.assetsBalance[accountId],\n ...accountBalances,\n };\n }\n }\n\n // Determine successfully handled chains (exclude unprocessed/error chains)\n const unprocessedChains = new Set(Object.keys(response.errors ?? {}));\n successfullyHandledChains = request.chainIds.filter(\n (chainId) => !unprocessedChains.has(chainId),\n );\n\n // When token detection is off and we filtered out all balance data (e.g. new\n // account with empty state), do not claim any chain as handled so that RPC\n // middleware can still process them and fetch native balances (ETH, MATIC, etc.).\n if (\n !this.#tokenDetectionEnabled() &&\n (!response.assetsBalance ||\n Object.keys(response.assetsBalance).length === 0)\n ) {\n successfullyHandledChains = [];\n }\n } catch (error) {\n log('Middleware fetch failed', { error });\n successfullyHandledChains = [];\n }\n\n // Remove successfully handled chains from request for next middleware\n if (successfullyHandledChains.length > 0) {\n const remainingChains = request.chainIds.filter(\n (chainId) => !successfullyHandledChains.includes(chainId),\n );\n\n return next({\n ...context,\n request: {\n ...request,\n chainIds: remainingChains,\n },\n });\n }\n\n // No chains handled - pass context unchanged\n return next(context);\n };\n }\n\n // ============================================================================\n // SUBSCRIBE\n // ============================================================================\n\n async subscribe(subscriptionRequest: SubscriptionRequest): Promise<void> {\n const { request, subscriptionId, isUpdate, skipInitialFetch } =\n subscriptionRequest;\n\n // Store state accessor for filtering when tokenDetectionEnabled is false\n if (subscriptionRequest.getAssetsState) {\n this.#getAssetsState = subscriptionRequest.getAssetsState;\n }\n\n // Try all requested chains - API will handle unsupported ones via unprocessedNetworks\n const chainsToSubscribe = request.chainIds;\n\n if (chainsToSubscribe.length === 0) {\n return;\n }\n\n // Handle subscription update - update both chains AND request (for accounts)\n if (isUpdate) {\n const existing = this.activeSubscriptions.get(subscriptionId);\n if (existing) {\n const previousChains = existing.chains;\n existing.chains = chainsToSubscribe;\n existing.request = request;\n\n // Chains handed off from another data source (e.g. the websocket\n // source releasing a chain that went down) would otherwise stay\n // stale until the next poll tick — fetch them immediately.\n const addedChains = chainsToSubscribe.filter(\n (chainId) => !previousChains.includes(chainId),\n );\n if (addedChains.length > 0) {\n try {\n const fetchResponse = await this.fetch({\n ...request,\n chainIds: addedChains,\n forceUpdate: true,\n });\n await existing.onAssetsUpdate(fetchResponse);\n } catch (error) {\n log('Initial fetch for added chains failed', {\n subscriptionId,\n addedChains,\n error,\n });\n }\n }\n return;\n }\n }\n\n // Clean up existing subscription if any\n await this.unsubscribe(subscriptionId);\n\n const pollInterval = request.updateInterval ?? this.#pollInterval;\n\n // Create poll function for this subscription\n const pollFn = async (): Promise<void> => {\n try {\n const subscription = this.activeSubscriptions.get(subscriptionId);\n if (!subscription?.request) {\n return;\n }\n\n // Use stored request (which gets updated on account changes).\n // forceUpdate so we don't get a stale response from the cache\n // (STALE_TIMES.BALANCES is 60s, longer than our 30s poll interval).\n const fetchResponse = await this.fetch({\n ...subscription.request,\n chainIds: subscription.chains,\n forceUpdate: true,\n });\n\n // Report update to AssetsController via callback\n await subscription.onAssetsUpdate(fetchResponse);\n } catch (error) {\n log('Subscription poll failed', { subscriptionId, error });\n }\n };\n\n // Set up polling\n const timer = setInterval(() => {\n pollFn().catch(console.error);\n }, pollInterval);\n\n // Store subscription with request for account updates\n this.activeSubscriptions.set(subscriptionId, {\n cleanup: () => {\n clearInterval(timer);\n },\n chains: chainsToSubscribe,\n request,\n onAssetsUpdate: subscriptionRequest.onAssetsUpdate,\n });\n\n // Interval above still polls on the normal cadence. This only skips the\n // one-shot fetch at subscribe time when the controller already ran a\n // force getAssets for the same scope (startup / group refresh).\n if (!skipInitialFetch) {\n await pollFn();\n }\n }\n\n // ============================================================================\n // CLEANUP\n // ============================================================================\n\n destroy(): void {\n if (this.#chainsRefreshTimer) {\n clearInterval(this.#chainsRefreshTimer);\n }\n\n super.destroy();\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { SupportedCurrency } from
|
|
2
|
-
import { ApiPlatformClient } from
|
|
3
|
-
import type { Caip19AssetId, DataRequest, DataResponse, Middleware, AssetsControllerStateInternal } from
|
|
4
|
-
import type { SubscriptionRequest } from
|
|
1
|
+
import type { SupportedCurrency } from '@metamask/core-backend';
|
|
2
|
+
import { ApiPlatformClient } from '@metamask/core-backend';
|
|
3
|
+
import type { Caip19AssetId, DataRequest, DataResponse, Middleware, AssetsControllerStateInternal } from '../types.js';
|
|
4
|
+
import type { SubscriptionRequest } from './AbstractDataSource.js';
|
|
5
5
|
/** Optional configuration for PriceDataSource. */
|
|
6
6
|
export type PriceDataSourceConfig = {
|
|
7
7
|
/** Polling interval in ms (default: 60000) */
|
|
@@ -97,4 +97,4 @@ export declare class PriceDataSource {
|
|
|
97
97
|
*/
|
|
98
98
|
destroy(): void;
|
|
99
99
|
}
|
|
100
|
-
//# sourceMappingURL=PriceDataSource.d.
|
|
100
|
+
//# sourceMappingURL=PriceDataSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PriceDataSource.d.ts","sourceRoot":"","sources":["../../src/data-sources/PriceDataSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,YAAY,EAEZ,UAAU,EACV,6BAA6B,EAC9B,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AA4BnE,kDAAkD;AAClD,MAAM,MAAM,qBAAqB,GAAG;IAClC,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,qBAAqB,GAAG;IAC3D,mDAAmD;IACnD,cAAc,EAAE,iBAAiB,CAAC;IAClC,qEAAqE;IACrE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;CAC9C,CAAC;AAwBF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAEhE;AA0BD;;;;;;;;;GASG;AACH,qBAAa,eAAe;;IAC1B,MAAM,CAAC,QAAQ,CAAC,cAAc,qBAAmB;IAEjD,OAAO,IAAI,MAAM,CAEhB;IA8BD,YAAY,OAAO,EAAE,sBAAsB,EAY1C;IAMD;;;;;;;;;;;;;;OAcG;IACH,IAAI,gBAAgB,IAAI,UAAU,CAiEjC;IAwMD;;;;;;;OAOG;IACG,KAAK,CACT,OAAO,EAAE,WAAW,EACpB,cAAc,CAAC,EAAE,MAAM,6BAA6B,GACnD,OAAO,CAAC,YAAY,CAAC,CA4BvB;IAMD;;;;;OAKG;IACG,SAAS,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGvE;IAED;;;;OAIG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvD;IAED;;;;OAIG;IACH,oBAAoB,IAAI,IAAI,CAE3B;IAED;;OAEG;IACH,OAAO,IAAI,IAAI,CAMd;CACF"}
|
|
@@ -10,13 +10,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
12
|
var _PriceDataSource_instances, _PriceDataSource_getSelectedCurrency, _PriceDataSource_pollInterval, _PriceDataSource_apiClient, _PriceDataSource_fetchTimeoutMs, _PriceDataSource_deduper, _PriceDataSource_activeSubscriptions, _PriceDataSource_fetchSpotPricesBatch, _PriceDataSource_executeBatchFetch, _PriceDataSource_fetchSpotPrices, _PriceDataSource_getAssetIdsFromBalanceState;
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { reduceInBatchesSerially } from "./evm-rpc-services/index.mjs";
|
|
13
|
+
import { parseCaipAssetType } from '@metamask/utils';
|
|
14
|
+
import { projectLogger, createModuleLogger } from '../logger.js';
|
|
15
|
+
import { forDataTypes } from '../types.js';
|
|
16
|
+
import { DedupingBatchFetcher } from '../utils/dedupingBatchFetcher.js';
|
|
17
|
+
import { fetchWithTimeout, normalizeAssetId } from '../utils/index.js';
|
|
18
|
+
import { reduceInBatchesSerially } from './evm-rpc-services/index.js';
|
|
20
19
|
// ============================================================================
|
|
21
20
|
// CONSTANTS
|
|
22
21
|
// ============================================================================
|
|
@@ -458,4 +457,4 @@ async function _PriceDataSource_fetchSpotPrices(assetIds) {
|
|
|
458
457
|
}
|
|
459
458
|
};
|
|
460
459
|
PriceDataSource.controllerName = CONTROLLER_NAME;
|
|
461
|
-
//# sourceMappingURL=PriceDataSource.
|
|
460
|
+
//# sourceMappingURL=PriceDataSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PriceDataSource.js","sourceRoot":"","sources":["../../src/data-sources/PriceDataSource.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SupportedCurrency,\n V3SpotPricesResponse,\n} from '@metamask/core-backend';\nimport { ApiPlatformClient } from '@metamask/core-backend';\nimport { parseCaipAssetType } from '@metamask/utils';\n\nimport { projectLogger, createModuleLogger } from '../logger.js';\nimport { forDataTypes } from '../types.js';\nimport type {\n Caip19AssetId,\n DataRequest,\n DataResponse,\n FungibleAssetPrice,\n Middleware,\n AssetsControllerStateInternal,\n} from '../types.js';\nimport { DedupingBatchFetcher } from '../utils/dedupingBatchFetcher.js';\nimport { fetchWithTimeout, normalizeAssetId } from '../utils/index.js';\nimport type { SubscriptionRequest } from './AbstractDataSource.js';\nimport { reduceInBatchesSerially } from './evm-rpc-services/index.js';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst CONTROLLER_NAME = 'PriceDataSource';\nconst DEFAULT_POLL_INTERVAL = 60_000; // 1 minute for price updates\nconst DEFAULT_FETCH_TIMEOUT_MS = 15_000;\n\n/**\n * Fraction of the poll interval used to cap the freshness TTL. Kept strictly\n * below 1 so an asset fetched on one poll is reliably stale by the next poll;\n * the margin absorbs network latency and timer jitter (see the cap in\n * `subscribe`).\n */\nconst FRESHNESS_TTL_POLL_RATIO = 0.9;\n\n/** Maximum number of asset IDs per Price API request. */\nconst PRICE_API_BATCH_SIZE = 50;\n\nconst log = createModuleLogger(projectLogger, CONTROLLER_NAME);\n\n// ============================================================================\n// OPTIONS\n// ============================================================================\n\n/** Optional configuration for PriceDataSource. */\nexport type PriceDataSourceConfig = {\n /** Polling interval in ms (default: 60000) */\n pollInterval?: number;\n /**\n * Timeout in ms for a single Price API call (default: 15000). When it fires,\n * the batch rejects so the caller can proceed without prices.\n */\n fetchTimeoutMs?: number;\n /**\n * Minimum age (ms) before a price is considered stale and re-fetched.\n * Assets fetched more recently than this are skipped to avoid redundant\n * API calls from overlapping middleware / subscription / manual triggers.\n * Defaults to pollInterval (60 000 ms).\n */\n priceFreshnessTtlMs?: number;\n};\n\nexport type PriceDataSourceOptions = PriceDataSourceConfig & {\n /** ApiPlatformClient for API calls with caching */\n queryApiClient: ApiPlatformClient;\n /** Function returning the currently-active ISO 4217 currency code */\n getSelectedCurrency: () => SupportedCurrency;\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Asset reference patterns that should NOT be sent to the Price API.\n * These are internal resource tracking values without market prices.\n */\nconst NON_PRICEABLE_ASSET_PATTERNS = [\n // Synthetic slip44 staking-position assets: the Price API only knows about\n // pure numeric coin-type references (e.g. slip44:195). Any suffix after the\n // number (e.g. slip44:195-ready-for-withdrawal, slip44:195-in-lock-period,\n // slip44:195-staking-rewards, slip44:195-staked-for-…) is a MetaMask-internal\n // synthetic asset that has no market price.\n /\\/slip44:\\d+-/u,\n // Tron non-price resource assets (bandwidth, energy)\n /\\/slip44:bandwidth$/u,\n /\\/slip44:energy$/u,\n /\\/slip44:maximum-bandwidth$/u,\n /\\/slip44:maximum-energy$/u,\n];\n\n/**\n * Check if an asset ID represents a priceable asset.\n * Filters out internal resource tracking values that don't have market prices.\n *\n * @param assetId - The CAIP-19 asset ID to check.\n * @returns True if the asset has market price data.\n */\nexport function isPriceableAsset(assetId: Caip19AssetId): boolean {\n return !NON_PRICEABLE_ASSET_PATTERNS.some((pattern) => pattern.test(assetId));\n}\n\n/** Market data item from spot prices response (same as FungibleAssetPrice without lastUpdated) */\ntype SpotPriceMarketData = Omit<\n FungibleAssetPrice,\n 'lastUpdated' | 'assetPriceType'\n>;\n\n/**\n * Type guard to check if market data has a valid price\n *\n * @param data - The data to check.\n * @returns True if data is valid SpotPriceMarketData.\n */\nfunction isValidMarketData(data: unknown): data is SpotPriceMarketData {\n return (\n typeof data === 'object' &&\n data !== null &&\n typeof (data as Record<string, unknown>).price === 'number'\n );\n}\n\n// ============================================================================\n// PRICE DATA SOURCE\n// ============================================================================\n\n/**\n * PriceDataSource fetches asset prices from the Price API.\n *\n * This data source:\n * - Fetches prices from Price API v3 spot-prices endpoint\n * - Supports one-time fetch and subscription-based polling\n * - In subscribe mode, uses getAssetsState from SubscriptionRequest to read assetsBalance and fetch prices\n *\n * Usage: Create with queryApiClient; subscribe() requires getAssetsState in the request for balance-based pricing.\n */\nexport class PriceDataSource {\n static readonly controllerName = CONTROLLER_NAME;\n\n getName(): string {\n return PriceDataSource.controllerName;\n }\n\n readonly #getSelectedCurrency: () => SupportedCurrency;\n\n readonly #pollInterval: number;\n\n /** ApiPlatformClient for cached API calls */\n readonly #apiClient: ApiPlatformClient;\n\n readonly #fetchTimeoutMs: number;\n\n /**\n * Deduplicates price fetches by asset ID: skips assets fetched within the\n * freshness TTL and joins concurrent in-flight fetches for the same asset so\n * overlapping triggers (middleware + subscription poll) don't issue duplicate\n * API requests.\n */\n readonly #deduper: DedupingBatchFetcher<Caip19AssetId, FungibleAssetPrice>;\n\n /** Active subscriptions by ID */\n readonly #activeSubscriptions: Map<\n string,\n {\n cleanup: () => void;\n request: DataRequest;\n onAssetsUpdate: (response: DataResponse) => void | Promise<void>;\n getAssetsState?: () => AssetsControllerStateInternal;\n }\n > = new Map();\n\n constructor(options: PriceDataSourceOptions) {\n this.#getSelectedCurrency = options.getSelectedCurrency;\n this.#pollInterval = options.pollInterval ?? DEFAULT_POLL_INTERVAL;\n this.#apiClient = options.queryApiClient;\n this.#fetchTimeoutMs = options.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS;\n this.#deduper = new DedupingBatchFetcher({\n fetchBatch: (\n assetIds,\n ): Promise<Record<Caip19AssetId, FungibleAssetPrice>> =>\n this.#executeBatchFetch(assetIds),\n freshnessTtlMs: options.priceFreshnessTtlMs ?? this.#pollInterval,\n });\n }\n\n // ============================================================================\n // MIDDLEWARE\n // ============================================================================\n\n /**\n * Get the middleware for enriching responses with price data.\n *\n * This middleware:\n * 1. Extracts the response from context\n * 2. Fetches prices for detected assets (assets without metadata)\n * 3. Enriches the response with fetched prices\n * 4. Calls next() at the end to continue the middleware chain\n *\n * Note: This middleware ONLY fetches prices for detected assets.\n * For fetching prices for all assets, use the subscription mechanism\n * which polls prices for all assets in the balance state.\n *\n * @returns The middleware function for the assets pipeline.\n */\n get assetsMiddleware(): Middleware {\n return forDataTypes(['price'], async (ctx, next) => {\n // Extract response from context\n const { response, request } = ctx;\n\n const statePrices = (ctx.getAssetsState()?.assetsPrice ?? {}) as Record<\n string,\n FungibleAssetPrice\n >;\n\n const assetIds = new Set<Caip19AssetId>();\n\n for (const assetId of request.assetsForPriceUpdate ?? []) {\n assetIds.add(assetId);\n }\n\n // Detected assets only need a price fetch when state has none yet.\n // Explicit assetsForPriceUpdate (e.g. currency change) are always fetched.\n for (const detectedAccountAssets of Object.values(\n response.detectedAssets ?? {},\n )) {\n for (const assetId of detectedAccountAssets) {\n const normalizedAssetId = normalizeAssetId(assetId);\n const alreadyQueued = request.assetsForPriceUpdate?.some(\n (queuedId) =>\n queuedId === assetId || queuedId === normalizedAssetId,\n );\n if (\n statePrices[assetId] === undefined &&\n statePrices[normalizedAssetId] === undefined &&\n !alreadyQueued\n ) {\n assetIds.add(normalizedAssetId);\n }\n }\n }\n\n if (assetIds.size === 0) {\n return next(ctx);\n }\n\n // Filter to only priceable assets\n const priceableAssetIds = [...assetIds].filter(isPriceableAsset);\n\n if (priceableAssetIds.length === 0) {\n return next(ctx);\n }\n\n if (request.forceUpdate) {\n this.#deduper.invalidateKeys(priceableAssetIds);\n }\n\n try {\n const spotPrices = await this.#fetchSpotPrices(priceableAssetIds);\n response.assetsPrice = {\n ...(response.assetsPrice ?? {}),\n ...spotPrices,\n };\n } catch (error) {\n log('Failed to fetch prices via middleware', { error });\n }\n\n // Call next() at the end to continue the middleware chain\n return next(ctx);\n });\n }\n\n // ============================================================================\n // HELPERS\n // ============================================================================\n\n /**\n * Fetch spot prices for a single batch of asset IDs (must be ≤ PRICE_API_BATCH_SIZE).\n *\n * @param assetIds - Array of CAIP-19 asset IDs (already within batch size limit).\n * @param selectedCurrency - The user's selected display currency.\n * @returns Raw spot-prices responses for the selected currency and USD.\n */\n async #fetchSpotPricesBatch(\n assetIds: string[],\n selectedCurrency: SupportedCurrency,\n ): Promise<{\n selectedCurrencyPrices: V3SpotPricesResponse;\n usdPrices: V3SpotPricesResponse;\n }> {\n if (selectedCurrency === 'usd') {\n const selectedCurrencyPrices = await fetchWithTimeout(\n () =>\n this.#apiClient.prices.fetchV3SpotPrices(assetIds, {\n currency: selectedCurrency,\n includeMarketData: true,\n }),\n this.#fetchTimeoutMs,\n );\n return { selectedCurrencyPrices, usdPrices: selectedCurrencyPrices };\n }\n\n const [selectedCurrencyPrices, usdPrices] = await Promise.all([\n fetchWithTimeout(\n () =>\n this.#apiClient.prices.fetchV3SpotPrices(assetIds, {\n currency: selectedCurrency,\n includeMarketData: true,\n }),\n this.#fetchTimeoutMs,\n ),\n fetchWithTimeout(\n () =>\n this.#apiClient.prices.fetchV3SpotPrices(assetIds, {\n currency: 'usd',\n includeMarketData: true,\n }),\n this.#fetchTimeoutMs,\n ),\n ]);\n\n return { selectedCurrencyPrices, usdPrices };\n }\n\n /**\n * Execute the actual batched API call for a set of asset IDs and return\n * parsed price results. Used as the `fetchBatch` callback for the deduper,\n * so it does NOT check freshness or inflight state — that is handled by\n * {@link DedupingBatchFetcher}.\n *\n * @param assetIds - Asset IDs to fetch (already filtered/deduplicated).\n * @returns Parsed prices keyed by CAIP-19 asset ID.\n */\n async #executeBatchFetch(\n assetIds: Caip19AssetId[],\n ): Promise<Record<Caip19AssetId, FungibleAssetPrice>> {\n const selectedCurrency = this.#getSelectedCurrency();\n\n type BatchResult = {\n selectedCurrencyPrices: V3SpotPricesResponse;\n usdPrices: V3SpotPricesResponse;\n };\n\n const batchResults = await reduceInBatchesSerially<string, BatchResult[]>({\n values: assetIds,\n batchSize: PRICE_API_BATCH_SIZE,\n eachBatch: async (workingResult, batch) => {\n const result = await this.#fetchSpotPricesBatch(\n batch,\n selectedCurrency,\n );\n return [...(workingResult as BatchResult[]), result];\n },\n initialResult: [],\n });\n\n const fetchedAt = Date.now();\n const prices: Record<Caip19AssetId, FungibleAssetPrice> = {};\n\n for (const { selectedCurrencyPrices, usdPrices } of batchResults) {\n for (const [assetId, marketData] of Object.entries(\n selectedCurrencyPrices,\n )) {\n const usdMarketData = usdPrices[assetId];\n\n if (\n !isValidMarketData(marketData) ||\n !isValidMarketData(usdMarketData)\n ) {\n continue;\n }\n\n prices[assetId as Caip19AssetId] = {\n ...marketData,\n assetPriceType: 'fungible',\n usdPrice: usdMarketData.price,\n lastUpdated: fetchedAt,\n };\n }\n }\n\n return prices;\n }\n\n /**\n * Fetch spot prices for all provided asset IDs, deduplicating via the\n * deduper (freshness TTL + per-asset inflight coalescing).\n *\n * @param assetIds - Array of CAIP-19 asset IDs.\n * @returns Spot prices response (only contains entries for assets that were\n * actually fetched or joined from inflight).\n */\n async #fetchSpotPrices(\n assetIds: Caip19AssetId[],\n ): Promise<Record<Caip19AssetId, FungibleAssetPrice>> {\n return this.#deduper.fetch(assetIds);\n }\n\n /**\n * Get unique asset IDs from the assetsBalance state.\n * Filters by accounts and chains from the request.\n *\n * @param request - Data request with accounts and chainIds filters.\n * @param getAssetsState - State access; when omitted, returns [].\n * @returns Array of CAIP-19 asset IDs from balance state.\n */\n #getAssetIdsFromBalanceState(\n request: DataRequest,\n getAssetsState?: () => AssetsControllerStateInternal,\n ): Caip19AssetId[] {\n if (!getAssetsState) {\n return [];\n }\n try {\n const state = getAssetsState();\n const assetIds = new Set<Caip19AssetId>();\n\n const accountIds = request.accountsWithSupportedChains.map(\n (a) => a.account.id,\n );\n const accountFilter =\n accountIds.length > 0 ? new Set(accountIds) : undefined;\n const chainFilter =\n request.chainIds.length > 0 ? new Set(request.chainIds) : undefined;\n\n if (state?.assetsBalance) {\n for (const [accountId, accountBalances] of Object.entries(\n state.assetsBalance,\n )) {\n // Filter by account if specified\n if (accountFilter && !accountFilter.has(accountId)) {\n continue;\n }\n\n for (const assetId of Object.keys(\n accountBalances as Record<string, unknown>,\n )) {\n // Filter by chain if specified; skip malformed asset IDs for this entry only\n if (chainFilter) {\n try {\n const { chainId } = parseCaipAssetType(\n assetId as Caip19AssetId,\n );\n if (!chainFilter.has(chainId)) {\n continue;\n }\n } catch (error) {\n log('Skipping malformed asset ID in balance state', {\n assetId,\n error,\n });\n continue;\n }\n }\n assetIds.add(assetId as Caip19AssetId);\n }\n }\n }\n\n return [...assetIds];\n } catch (error) {\n log('Failed to get asset IDs from balance state', { error });\n return [];\n }\n }\n\n // ============================================================================\n // FETCH\n // ============================================================================\n\n /**\n * Fetch prices for assets held by the accounts and chains in the request.\n * When getAssetsState is provided, gets asset IDs from balance state; otherwise returns empty.\n *\n * @param request - The data request specifying accounts and chains.\n * @param getAssetsState - Optional state access (e.g. from SubscriptionRequest).\n * @returns DataResponse containing asset prices.\n */\n async fetch(\n request: DataRequest,\n getAssetsState?: () => AssetsControllerStateInternal,\n ): Promise<DataResponse> {\n const response: DataResponse = {};\n\n // Get asset IDs from balance state when state access is provided\n const rawAssetIds = this.#getAssetIdsFromBalanceState(\n request,\n getAssetsState,\n );\n\n // Filter out non-priceable assets (e.g., Tron bandwidth/energy resources)\n const assetIds = rawAssetIds.filter(isPriceableAsset);\n\n if (assetIds.length === 0) {\n return response;\n }\n\n try {\n const spotPrices = await this.#fetchSpotPrices([...assetIds]);\n\n response.assetsPrice = {\n ...(response.assetsPrice ?? {}),\n ...spotPrices,\n };\n } catch (error) {\n log('Failed to fetch prices', { error });\n }\n\n return response;\n }\n\n // ============================================================================\n // SUBSCRIBE\n // ============================================================================\n\n /**\n * Subscribe to price updates.\n * Sets up polling that fetches prices for all assets in assetsBalance state.\n *\n * @param subscriptionRequest - The subscription request configuration.\n */\n async subscribe(subscriptionRequest: SubscriptionRequest): Promise<void> {\n const { request, subscriptionId, isUpdate } = subscriptionRequest;\n\n // Handle subscription update: refresh request and fetch immediately so\n // newly held / still-unpriced assets (e.g. seeded natives) do not wait\n // for the next poll tick. Deduper freshness TTL skips recently priced IDs.\n if (isUpdate) {\n const existing = this.#activeSubscriptions.get(subscriptionId);\n if (existing) {\n existing.request = request;\n existing.onAssetsUpdate = subscriptionRequest.onAssetsUpdate;\n existing.getAssetsState = subscriptionRequest.getAssetsState;\n\n try {\n const fetchResponse = await this.fetch(\n request,\n subscriptionRequest.getAssetsState,\n );\n if (\n fetchResponse.assetsPrice &&\n Object.keys(fetchResponse.assetsPrice).length > 0\n ) {\n await existing.onAssetsUpdate({\n ...fetchResponse,\n updateMode: 'merge',\n });\n }\n } catch (error) {\n log('Subscription update fetch failed', { subscriptionId, error });\n }\n return;\n }\n }\n\n // Clean up existing subscription\n await this.unsubscribe(subscriptionId);\n\n const pollInterval = request.updateInterval ?? this.#pollInterval;\n\n // Cap the freshness TTL strictly below the effective poll interval.\n // `fetchedAt` is stamped when a fetch completes (slightly after the tick\n // that triggered it), so a TTL equal to the poll interval would leave the\n // asset still \"fresh\" at the next tick, making the subscription re-fetch\n // only every other poll. The margin also absorbs network latency / jitter.\n this.#deduper.freshnessTtlMs = Math.min(\n this.#deduper.freshnessTtlMs,\n Math.floor(pollInterval * FRESHNESS_TTL_POLL_RATIO),\n );\n\n // Create poll function - fetches prices using getAssetsState from subscription.\n // The freshness TTL naturally gates re-fetches: assets fetched less than\n // `priceFreshnessTtlMs` ago are skipped, preventing duplicates when middleware\n // or other triggers already fetched the same assets between polls.\n // Concurrent middleware calls will join the inflight promise rather than\n // issuing duplicate requests.\n const pollFn = async (): Promise<void> => {\n try {\n const subscription = this.#activeSubscriptions.get(subscriptionId);\n if (!subscription) {\n return;\n }\n\n const fetchResponse = await this.fetch(\n subscription.request,\n subscription.getAssetsState,\n );\n\n // Only report if we got prices\n if (\n fetchResponse.assetsPrice &&\n Object.keys(fetchResponse.assetsPrice).length > 0\n ) {\n await subscription.onAssetsUpdate({\n ...fetchResponse,\n // merge overwrites existing spot prices on each poll; update would\n // seed-only and leave the first price forever.\n updateMode: 'merge',\n });\n }\n } catch (error) {\n log('Subscription poll failed', { subscriptionId, error });\n }\n };\n\n // Set up polling\n const timer = setInterval(() => {\n pollFn().catch(console.error);\n }, pollInterval);\n\n // Store subscription (getAssetsState from request for balance-based pricing)\n this.#activeSubscriptions.set(subscriptionId, {\n cleanup: () => {\n clearInterval(timer);\n },\n request,\n onAssetsUpdate: subscriptionRequest.onAssetsUpdate,\n getAssetsState: subscriptionRequest.getAssetsState,\n });\n\n // Initial fetch\n await pollFn();\n }\n\n /**\n * Unsubscribe from price updates.\n *\n * @param subscriptionId - The ID of the subscription to cancel.\n */\n async unsubscribe(subscriptionId: string): Promise<void> {\n const subscription = this.#activeSubscriptions.get(subscriptionId);\n if (subscription) {\n subscription.cleanup();\n this.#activeSubscriptions.delete(subscriptionId);\n }\n }\n\n /**\n * Invalidate the price freshness cache, forcing the next fetch to call the\n * API regardless of TTL. Use when external state changes (e.g. selected\n * currency) require a full refresh.\n */\n invalidatePriceCache(): void {\n this.#deduper.invalidate();\n }\n\n /**\n * Destroy the data source and clean up all subscriptions.\n */\n destroy(): void {\n for (const subscription of this.#activeSubscriptions.values()) {\n subscription.cleanup();\n }\n this.#activeSubscriptions.clear();\n this.#deduper.destroy();\n }\n}\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type { InternalAccount } from
|
|
2
|
-
import type { NetworkControllerGetNetworkClientByIdAction, NetworkControllerGetStateAction, NetworkControllerStateChangeEvent, NetworkStatus } from
|
|
3
|
-
import type { TransactionControllerTransactionConfirmedEvent } from
|
|
4
|
-
import type { Hex } from
|
|
5
|
-
import type { AssetsControllerGetStateAction, AssetsControllerMessenger } from
|
|
6
|
-
import type { ChainId, Caip19AssetId, DataRequest, DataResponse, Middleware } from
|
|
7
|
-
import { AbstractDataSource } from
|
|
8
|
-
import type { DataSourceState, SubscriptionRequest } from
|
|
9
|
-
import type { TokenListQueryClient } from
|
|
1
|
+
import type { InternalAccount } from '@metamask/keyring-internal-api';
|
|
2
|
+
import type { NetworkControllerGetNetworkClientByIdAction, NetworkControllerGetStateAction, NetworkControllerStateChangeEvent, NetworkStatus } from '@metamask/network-controller';
|
|
3
|
+
import type { TransactionControllerTransactionConfirmedEvent } from '@metamask/transaction-controller';
|
|
4
|
+
import type { Hex } from '@metamask/utils';
|
|
5
|
+
import type { AssetsControllerGetStateAction, AssetsControllerMessenger } from '../AssetsController.js';
|
|
6
|
+
import type { ChainId, Caip19AssetId, DataRequest, DataResponse, Middleware } from '../types.js';
|
|
7
|
+
import { AbstractDataSource } from './AbstractDataSource.js';
|
|
8
|
+
import type { DataSourceState, SubscriptionRequest } from './AbstractDataSource.js';
|
|
9
|
+
import type { TokenListQueryClient } from './evm-rpc-services/index.js';
|
|
10
10
|
declare const CONTROLLER_NAME = "RpcDataSource";
|
|
11
11
|
export type RpcDataSourceAllowedActions = NetworkControllerGetStateAction | NetworkControllerGetNetworkClientByIdAction | AssetsControllerGetStateAction;
|
|
12
12
|
export type RpcDataSourceAllowedEvents = NetworkControllerStateChangeEvent | TransactionControllerTransactionConfirmedEvent;
|
|
@@ -171,4 +171,4 @@ export declare class RpcDataSource extends AbstractDataSource<typeof CONTROLLER_
|
|
|
171
171
|
}
|
|
172
172
|
export declare function createRpcDataSource(options: RpcDataSourceOptions): RpcDataSource;
|
|
173
173
|
export {};
|
|
174
|
-
//# sourceMappingURL=RpcDataSource.d.
|
|
174
|
+
//# sourceMappingURL=RpcDataSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcDataSource.d.ts","sourceRoot":"","sources":["../../src/data-sources/RpcDataSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,16 +10,16 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
12
|
var _RpcDataSource_instances, _RpcDataSource_messenger, _RpcDataSource_onActiveChainsUpdated, _RpcDataSource_getNativeAssetForChain, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_useExternalService, _RpcDataSource_isOnboarded, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_unsubscribeTransactionConfirmed, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector, _RpcDataSource_getAssetType, _RpcDataSource_convertToHumanReadable, _RpcDataSource_collectMetadataForBalances, _RpcDataSource_hasValidDecimals, _RpcDataSource_pickValidDecimals, _RpcDataSource_handleBalanceUpdate, _RpcDataSource_handleDetectionUpdate, _RpcDataSource_subscribeToNetworkController, _RpcDataSource_subscribeToTransactionEvents, _RpcDataSource_onTransactionConfirmed, _RpcDataSource_refreshBalanceForChains, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_getMulticallProvider, _RpcDataSource_clearProviderCache, _RpcDataSource_fetchDecimalsViaRpc, _RpcDataSource_getExistingAssetsMetadata;
|
|
13
|
-
import { Web3Provider } from
|
|
14
|
-
import { toHex } from
|
|
15
|
-
import { isStrictHexString, isCaipChainId, parseCaipAssetType, parseCaipChainId, hexToNumber, toCaipChainId, KnownCaipNamespace } from
|
|
16
|
-
import BigNumberJS from
|
|
17
|
-
import { projectLogger, createModuleLogger } from
|
|
18
|
-
import { ZERO_ADDRESS } from
|
|
19
|
-
import { normalizeAssetId } from
|
|
20
|
-
import { AbstractDataSource } from
|
|
21
|
-
import { BalanceFetcher, MulticallClient, TokenDetector, TokensApiClient } from
|
|
22
|
-
import { shouldSkipNativeForCaipChainId } from
|
|
13
|
+
import { Web3Provider } from '@ethersproject/providers';
|
|
14
|
+
import { toHex } from '@metamask/controller-utils';
|
|
15
|
+
import { isStrictHexString, isCaipChainId, parseCaipAssetType, parseCaipChainId, hexToNumber, toCaipChainId, KnownCaipNamespace, } from '@metamask/utils';
|
|
16
|
+
import { BigNumber as BigNumberJS } from 'bignumber.js';
|
|
17
|
+
import { projectLogger, createModuleLogger } from '../logger.js';
|
|
18
|
+
import { ZERO_ADDRESS } from '../utils/constants.js';
|
|
19
|
+
import { normalizeAssetId } from '../utils/index.js';
|
|
20
|
+
import { AbstractDataSource } from './AbstractDataSource.js';
|
|
21
|
+
import { BalanceFetcher, MulticallClient, TokenDetector, TokensApiClient, } from './evm-rpc-services/index.js';
|
|
22
|
+
import { shouldSkipNativeForCaipChainId } from './evm-rpc-services/utils/assets.js';
|
|
23
23
|
const CONTROLLER_NAME = 'RpcDataSource';
|
|
24
24
|
const DEFAULT_BALANCE_INTERVAL = 30000; // 30 seconds
|
|
25
25
|
const DEFAULT_DETECTION_INTERVAL = 180000; // 3 minutes
|
|
@@ -1009,4 +1009,4 @@ async function _RpcDataSource_fetchDecimalsViaRpc(chainId, tokenAddress) {
|
|
|
1009
1009
|
export function createRpcDataSource(options) {
|
|
1010
1010
|
return new RpcDataSource(options);
|
|
1011
1011
|
}
|
|
1012
|
-
//# sourceMappingURL=RpcDataSource.
|
|
1012
|
+
//# sourceMappingURL=RpcDataSource.js.map
|