@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAEvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC","sourcesContent":["export { CustomAssetGraduationMiddleware } from './CustomAssetGraduationMiddleware.js';\nexport type { CustomAssetGraduationMiddlewareOptions } from './CustomAssetGraduationMiddleware.js';\nexport { DetectionMiddleware } from './DetectionMiddleware.js';\nexport { RpcFallbackMiddleware } from './RpcFallbackMiddleware.js';\nexport type { RpcFallbackMiddlewareOptions } from './RpcFallbackMiddleware.js';\nexport {\n createParallelBalanceMiddleware,\n createParallelMiddleware,\n mergeDataResponses,\n} from './ParallelMiddleware.js';\nexport type { BalanceSource } from './ParallelMiddleware.js';\nexport type { AssetsDataSource } from '../types.js';\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { AccountsControllerState } from
|
|
2
|
-
import type { TokensControllerState } from
|
|
3
|
-
import type { AccountId, Caip19AssetId, FungibleAssetMetadata, AssetsControllerStateInternal } from
|
|
1
|
+
import type { AccountsControllerState } from '@metamask/accounts-controller';
|
|
2
|
+
import type { TokensControllerState } from '@metamask/assets-controllers';
|
|
3
|
+
import type { AccountId, Caip19AssetId, FungibleAssetMetadata, AssetsControllerStateInternal } from '../types.js';
|
|
4
4
|
/**
|
|
5
5
|
* TEMPORARY MODULE — remove in a future release.
|
|
6
6
|
*
|
|
@@ -103,4 +103,4 @@ export declare function tempHealAssetsInfoMetadata({ state, getMigrationState, c
|
|
|
103
103
|
* @returns The additions to apply, or `null` when there is nothing to heal.
|
|
104
104
|
*/
|
|
105
105
|
export declare function healAssetsInfoMetadata(legacyState: unknown, currentState: CurrentAssetsState): AssetsInfoHealingPatch | null;
|
|
106
|
-
//# sourceMappingURL=healAssetsInfoMetadata.d.
|
|
106
|
+
//# sourceMappingURL=healAssetsInfoMetadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healAssetsInfoMetadata.d.ts","sourceRoot":"","sources":["../../src/migrations/healAssetsInfoMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAW1E,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,6BAA6B,EAC9B,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,6BAA6B,EAC7B,YAAY,GAAG,eAAe,GAAG,cAAc,GAAG,kBAAkB,CACrE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,wBAAwB,GAAG;IAErC,gBAAgB,CAAC,EAAE,OAAO,CACxB,IAAI,CAAC,qBAAqB,EAAE,WAAW,GAAG,kBAAkB,CAAC,CAC9D,CAAC;IAEF,kBAAkB,CAAC,EAAE;QACnB,gBAAgB,CAAC,EAAE;YACjB,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN,IAAI,CACF,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAC/D,SAAS,CACV,CACF,CAAC;SACH,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;IACzD,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;CAClD,CAAC;AAIF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,8EAA8E;IAC9E,KAAK,EAAE,6BAA6B,CAAC;IACrC;;;OAGG;IACH,iBAAiB,EAAE,MAAM,OAAO,CAAC;IACjC,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC3C,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,iBAAiB,EACjB,gBAAgB,GACjB,EAAE,iCAAiC,GAAG,6BAA6B,CAqCnE;AAmDD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,OAAO,EACpB,YAAY,EAAE,kBAAkB,GAC/B,sBAAsB,GAAG,IAAI,CAmF/B"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { getChecksumAddress, getErrorMessage, hasProperty, isObject } from
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import { createModuleLogger, projectLogger } from "../logger.mjs";
|
|
1
|
+
import { getChecksumAddress, getErrorMessage, hasProperty, isObject, } from '@metamask/utils';
|
|
2
|
+
import { cloneDeep } from 'lodash-es';
|
|
3
|
+
import { createModuleLogger, projectLogger } from '../logger.js';
|
|
5
4
|
const log = createModuleLogger(projectLogger, 'tempHealAssetsInfoMetadata');
|
|
6
5
|
/**
|
|
7
6
|
* TEMPORARY — will be removed in a future release.
|
|
@@ -378,4 +377,4 @@ function addCustomAssetAddition(currentState, additions, accountId, assetId) {
|
|
|
378
377
|
}
|
|
379
378
|
additions[accountId] = queued;
|
|
380
379
|
}
|
|
381
|
-
//# sourceMappingURL=healAssetsInfoMetadata.
|
|
380
|
+
//# sourceMappingURL=healAssetsInfoMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healAssetsInfoMetadata.js","sourceRoot":"","sources":["../../src/migrations/healAssetsInfoMetadata.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { TokensControllerState } from '@metamask/assets-controllers';\nimport type { Hex } from '@metamask/utils';\nimport {\n getChecksumAddress,\n getErrorMessage,\n hasProperty,\n isObject,\n} from '@metamask/utils';\nimport { cloneDeep } from 'lodash-es';\n\nimport { createModuleLogger, projectLogger } from '../logger.js';\nimport type {\n AccountId,\n Caip19AssetId,\n FungibleAssetMetadata,\n AssetsControllerStateInternal,\n} from '../types.js';\n\n/**\n * TEMPORARY MODULE — remove in a future release.\n *\n * Port of extension migration #215 (Assets Controller Metadata Healing).\n * Issue: https://consensyssoftware.atlassian.net/browse/ASSETS-3346\n * Incident: #incident-metamask-1731\n *\n * Background: after a prior defect in AssetsController, metadata for custom\n * tokens was wiped. Most popular chains support auto-detection and can\n * self-heal, however not all.\n *\n * This module computes the state additions needed to restore metadata for\n * custom tokens on niche EVM chains (chains that cannot auto-detect and\n * self-heal), using the legacy `TokensController.allTokens` state as the\n * source of truth. It is a pure function so it can be tested in isolation;\n * the controller applies the returned patch in its constructor.\n *\n * The legacy state is treated as fully untrusted (`unknown`): every shape is\n * validated before use, and any unexpected input results in that entry being\n * skipped (or `null` being returned when nothing is restorable).\n */\n\n/**\n * The slices of current `AssetsController` state the healing computation\n * reads. Never mutated.\n */\nexport type CurrentAssetsState = Pick<\n AssetsControllerStateInternal,\n 'assetsInfo' | 'assetsBalance' | 'customAssets' | 'assetPreferences'\n>;\n\n/**\n * TEMPORARY — will be removed in a future release.\n *\n * Shape of the legacy persisted state the ASSETS-3346 healing reads, derived\n * from the real `TokensControllerState` and `AccountsControllerState` types.\n * Use it to type the `tempMigrateAssetsInfoMetadataAssets3346` getter when\n * integrating in a client.\n *\n * Everything is optional and only the listed slices are read:\n *\n * - `TokensController.allTokens` — required for any healing to happen.\n * - `TokensController.allIgnoredTokens` — tokens the user hid/removed\n * (skipped during healing).\n * - `AccountsController.internalAccounts.accounts` — maps addresses to\n * account IDs so healed tokens are also tracked in `customAssets`\n * (without it only `assetsInfo` is healed).\n *\n * At runtime the value still crosses the boundary as `unknown`: every shape\n * is re-validated by the migration, so a partial or malformed object is safe\n * and simply skipped.\n */\nexport type Assets3346MigrationState = {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- must match the persisted controller state key\n TokensController?: Partial<\n Pick<TokensControllerState, 'allTokens' | 'allIgnoredTokens'>\n >;\n // eslint-disable-next-line @typescript-eslint/naming-convention -- must match the persisted controller state key\n AccountsController?: {\n internalAccounts?: {\n accounts?: Record<\n string,\n Pick<\n AccountsControllerState['internalAccounts']['accounts'][string],\n 'address'\n >\n >;\n };\n };\n};\n\nexport type AssetsInfoHealingPatch = {\n assetsInfo: Record<Caip19AssetId, FungibleAssetMetadata>;\n customAssets: Record<AccountId, Caip19AssetId[]>;\n};\n\nconst log = createModuleLogger(projectLogger, 'tempHealAssetsInfoMetadata');\n\nexport type TempHealAssetsInfoMetadataOptions = {\n /** Current `AssetsController` state the healing patch is computed against. */\n state: AssetsControllerStateInternal;\n /**\n * Host-provided getter for the untrusted legacy state root (see\n * `AssetsControllerOptions.tempMigrateAssetsInfoMetadataAssets3346`).\n */\n getMigrationState: () => unknown;\n /** Optional Sentry-compatible reporter for healing failures. */\n captureException?: (error: Error) => void;\n};\n\n/**\n * TEMPORARY — will be removed in a future release.\n *\n * @param options - The options bag.\n * @param options.state - Current controller state to compute the patch against.\n * @param options.getMigrationState - Getter for the untrusted legacy state root.\n * @param options.captureException - Optional reporter for healing failures.\n * @returns Updated controller state with the healing patch applied, or the\n * original state when there is nothing to heal or healing fails.\n */\nexport function tempHealAssetsInfoMetadata({\n state,\n getMigrationState,\n captureException,\n}: TempHealAssetsInfoMetadataOptions): AssetsControllerStateInternal {\n const reportError = (error: unknown): void => {\n log('Failed to heal assetsInfo metadata', error);\n captureException?.(\n new Error(\n `AssetsController: temporary assetsInfo metadata healing failed: ${getErrorMessage(\n error,\n )}`,\n ),\n );\n };\n\n let patch: AssetsInfoHealingPatch | null = null;\n try {\n patch = healAssetsInfoMetadata(getMigrationState(), state);\n } catch (error) {\n reportError(error);\n }\n\n if (!patch) {\n return state;\n }\n\n try {\n const nextState = cloneDeep(state);\n applyHealingPatch(nextState, patch);\n\n log('Healed wiped assetsInfo metadata for niche-chain tokens', {\n healedAssetsInfoCount: Object.keys(patch.assetsInfo).length,\n healedCustomAssetsAccounts: Object.keys(patch.customAssets).length,\n });\n\n return nextState;\n } catch (error) {\n reportError(error);\n return state;\n }\n}\n\n/**\n * Apply a healing patch to (draft) controller state. Defensive against\n * concurrent writes: fills `assetsInfo` gaps only and dedupes `customAssets`\n * against the current draft rather than trusting the patch blindly.\n *\n * @param state - Mutable controller state copy.\n * @param patch - The additions computed by {@link healAssetsInfoMetadata}.\n */\nfunction applyHealingPatch(\n state: CurrentAssetsState,\n patch: AssetsInfoHealingPatch,\n): void {\n for (const [assetId, metadata] of Object.entries(patch.assetsInfo)) {\n state.assetsInfo[assetId as Caip19AssetId] ??= metadata;\n }\n\n for (const [accountId, assetIds] of Object.entries(patch.customAssets)) {\n const existing = state.customAssets[accountId] ?? [];\n state.customAssets[accountId] = [\n ...existing,\n ...assetIds.filter((assetId) => !existing.includes(assetId)),\n ];\n }\n}\n\nconst EVM_CHAIN_NAMESPACE = 'eip155';\n\nconst EVM_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/u;\n\n/**\n * Popular networks (covered by the Accounts API) can self-heal through\n * auto-detection, so their tokens must not be touched. Frozen snapshot from\n * extension migration #215.\n */\nconst ACCOUNT_API_SUPPORTED_CHAIN_IDS: ReadonlySet<string> = new Set([\n 'eip155:1', // Ethereum Mainnet\n 'eip155:10', // Optimism\n 'eip155:56', // BNB Smart Chain\n 'eip155:137', // Polygon\n 'eip155:143', // Monad\n 'eip155:999', // HyperEVM\n 'eip155:1329', // Sei\n 'eip155:5042', // Arc\n 'eip155:8453', // Base\n 'eip155:42161', // Arbitrum One\n 'eip155:43114', // Avalanche\n 'eip155:59144', // Linea\n]);\n\n/**\n * Compute the additions required to heal `assetsInfo` metadata (and custom\n * asset tracking) for tokens on niche EVM chains, based on the legacy\n * `TokensController` state.\n *\n * What it deliberately skips:\n *\n * - Accounts-API-supported chains — see `ACCOUNT_API_SUPPORTED_CHAIN_IDS`.\n * - Tokens the user hid/removed, detected via either the legacy\n * `TokensController.allIgnoredTokens` or the current\n * `assetPreferences` (`hidden: true`).\n * - Non-EVM assets, ERC-721s, and tokens with invalid addresses or metadata.\n *\n * @param legacyState - Untrusted legacy state root. Expected (but not\n * required) to contain `TokensController.allTokens`,\n * `TokensController.allIgnoredTokens`, and\n * `AccountsController.internalAccounts.accounts`.\n * @param currentState - Current `AssetsController` state slices (read-only).\n * @returns The additions to apply, or `null` when there is nothing to heal.\n */\nexport function healAssetsInfoMetadata(\n legacyState: unknown,\n currentState: CurrentAssetsState,\n): AssetsInfoHealingPatch | null {\n const allTokens = readPath(legacyState, ['TokensController', 'allTokens']);\n if (!isObject(allTokens)) {\n return null;\n }\n\n const addressToAccountId = buildAddressToAccountIdMap(legacyState);\n const hiddenAssetIds = collectHiddenAssetIds(currentState);\n const allIgnoredTokens = readPath(legacyState, [\n 'TokensController',\n 'allIgnoredTokens',\n ]);\n\n const assetsInfoAdditions: Record<Caip19AssetId, FungibleAssetMetadata> = {};\n const customAssetAdditions: Record<AccountId, Caip19AssetId[]> = {};\n\n for (const [hexChainId, accountTokens] of Object.entries(allTokens)) {\n if (!isObject(accountTokens)) {\n continue;\n }\n\n const caip2 = hexChainIdToCaip2(hexChainId);\n // Skip chains we can't parse or that self-heal via the accounts API.\n if (!caip2 || ACCOUNT_API_SUPPORTED_CHAIN_IDS.has(caip2)) {\n continue;\n }\n\n for (const [rawAddress, tokens] of Object.entries(accountTokens)) {\n if (!Array.isArray(tokens) || tokens.length === 0) {\n continue;\n }\n\n const accountId = addressToAccountId[rawAddress.toLowerCase()];\n const ignoredAddresses = collectIgnoredAddresses(\n allIgnoredTokens,\n hexChainId,\n rawAddress,\n );\n\n for (const token of tokens) {\n const restorable = getRestorableAsset(\n token,\n caip2,\n ignoredAddresses,\n hiddenAssetIds,\n );\n if (!restorable) {\n continue;\n }\n const { assetId, info } = restorable;\n\n // `assetsInfo` is a global registry; fill gaps only, never overwrite.\n if (\n currentState.assetsInfo[assetId] === undefined &&\n assetsInfoAdditions[assetId] === undefined\n ) {\n assetsInfoAdditions[assetId] = info;\n }\n\n // Ensure the asset is tracked for its account.\n if (accountId) {\n addCustomAssetAddition(\n currentState,\n customAssetAdditions,\n accountId,\n assetId,\n );\n }\n }\n }\n }\n\n if (\n Object.keys(assetsInfoAdditions).length === 0 &&\n Object.keys(customAssetAdditions).length === 0\n ) {\n return null;\n }\n\n return {\n assetsInfo: assetsInfoAdditions,\n customAssets: customAssetAdditions,\n };\n}\n\n/**\n * Resolve a raw `TokensController` token entry to the CAIP-19 asset ID and\n * metadata that should be healed, or `null` when the token must be skipped\n * (not an object, missing/invalid address or symbol, an ERC-721, or hidden\n * in either the legacy or the current controller).\n *\n * @param token - Raw token entry from `allTokens`.\n * @param caip2 - The CAIP-2 chain ID of the token's chain (e.g. 'eip155:14').\n * @param ignoredAddresses - Lowercase addresses hidden via legacy `allIgnoredTokens`.\n * @param hiddenAssetIds - Lowercase asset IDs hidden via current `assetPreferences`.\n * @returns The restorable asset, or `null` to skip.\n */\nfunction getRestorableAsset(\n token: unknown,\n caip2: string,\n ignoredAddresses: Set<string>,\n hiddenAssetIds: Set<string>,\n): { assetId: Caip19AssetId; info: FungibleAssetMetadata } | null {\n if (!isObject(token)) {\n return null;\n }\n // Skip NFTs — AssetsController tracks them separately.\n if (token.isERC721 === true) {\n return null;\n }\n if (\n typeof token.address !== 'string' ||\n !EVM_ADDRESS_REGEX.test(token.address)\n ) {\n return null;\n }\n // Healed metadata with no symbol would be unusable in the UI; skip it.\n if (typeof token.symbol !== 'string' || token.symbol.length === 0) {\n return null;\n }\n\n const assetId = buildErc20AssetId(caip2, token.address as Hex);\n if (!assetId) {\n return null;\n }\n\n // Skip tokens the user hid/removed — in the legacy controller…\n if (ignoredAddresses.has(token.address.toLowerCase())) {\n return null;\n }\n // …or in the current controller.\n if (hiddenAssetIds.has(assetId.toLowerCase())) {\n return null;\n }\n\n return { assetId, info: buildEvmAssetInfo(token) };\n}\n\n/**\n * Build a `FungibleAssetMetadata` from a raw `TokensController` token entry.\n * The caller has already validated `symbol` as a non-empty string.\n *\n * @param token - Raw token object.\n * @returns The metadata to write into `assetsInfo`.\n */\nfunction buildEvmAssetInfo(\n token: Record<string, unknown>,\n): FungibleAssetMetadata {\n const symbol = token.symbol as string;\n const name =\n typeof token.name === 'string' && token.name.length > 0\n ? token.name\n : symbol;\n const decimals =\n typeof token.decimals === 'number' && Number.isFinite(token.decimals)\n ? token.decimals\n : 0;\n\n const image =\n typeof token.image === 'string' && token.image.length > 0\n ? token.image\n : undefined;\n const aggregators = Array.isArray(token.aggregators)\n ? token.aggregators.filter(\n (aggregator): aggregator is string => typeof aggregator === 'string',\n )\n : undefined;\n\n return {\n type: 'erc20',\n symbol,\n name,\n decimals,\n ...(image ? { image } : {}),\n ...(aggregators ? { aggregators } : {}),\n };\n}\n\n/**\n * Build a map from lowercase account address to account UUID using the\n * legacy `AccountsController.internalAccounts.accounts`.\n *\n * @param legacyState - Untrusted legacy state root.\n * @returns Map of lowercase address to account ID (empty on invalid input).\n */\nfunction buildAddressToAccountIdMap(\n legacyState: unknown,\n): Record<string, AccountId> {\n const accounts = readPath(legacyState, [\n 'AccountsController',\n 'internalAccounts',\n 'accounts',\n ]);\n if (!isObject(accounts)) {\n return {};\n }\n\n const map: Record<string, AccountId> = {};\n for (const [id, account] of Object.entries(accounts)) {\n if (\n isObject(account) &&\n typeof account.address === 'string' &&\n account.address.length > 0\n ) {\n map[account.address.toLowerCase()] = id;\n }\n }\n return map;\n}\n\n/**\n * Collect the set of CAIP-19 asset IDs (lowercased) marked `hidden: true` in\n * the current `assetPreferences`. Lowercasing lets callers compare against\n * checksummed asset IDs case-insensitively.\n *\n * @param currentState - Current `AssetsController` state slices.\n * @returns Set of lowercase hidden asset IDs.\n */\nfunction collectHiddenAssetIds(currentState: CurrentAssetsState): Set<string> {\n const hidden = new Set<string>();\n for (const [assetId, preference] of Object.entries(\n currentState.assetPreferences,\n )) {\n if (isObject(preference) && preference.hidden === true) {\n hidden.add(assetId.toLowerCase());\n }\n }\n return hidden;\n}\n\n/**\n * Collect the lowercase token addresses ignored (hidden) in the legacy\n * `TokensController.allIgnoredTokens` for a given chain and account. The\n * account key is matched case-insensitively.\n *\n * @param allIgnoredTokens - The legacy `allIgnoredTokens` map (possibly missing).\n * @param hexChainId - The hex chain ID being processed.\n * @param accountAddress - The account address whose ignored list to read.\n * @returns Set of lowercase ignored token addresses.\n */\nfunction collectIgnoredAddresses(\n allIgnoredTokens: unknown,\n hexChainId: string,\n accountAddress: string,\n): Set<string> {\n const result = new Set<string>();\n if (!isObject(allIgnoredTokens)) {\n return result;\n }\n\n const chainEntry = allIgnoredTokens[hexChainId];\n if (!isObject(chainEntry)) {\n return result;\n }\n\n const lowerAccount = accountAddress.toLowerCase();\n for (const [address, list] of Object.entries(chainEntry)) {\n if (address.toLowerCase() !== lowerAccount || !Array.isArray(list)) {\n continue;\n }\n for (const ignored of list) {\n if (typeof ignored === 'string') {\n result.add(ignored.toLowerCase());\n }\n }\n }\n return result;\n}\n\n/**\n * Convert a hex chain ID (e.g. '0x1') to a CAIP-2 chain ID (e.g. 'eip155:1').\n *\n * @param hexChainId - The hex-encoded EVM chain ID.\n * @returns The CAIP-2 chain ID, or `null` when the input cannot be parsed.\n */\nfunction hexChainIdToCaip2(hexChainId: string): string | null {\n if (!/^0x[0-9a-fA-F]+$/u.test(hexChainId)) {\n return null;\n }\n const decimal = Number.parseInt(hexChainId, 16);\n if (!Number.isFinite(decimal)) {\n return null;\n }\n return `${EVM_CHAIN_NAMESPACE}:${decimal}`;\n}\n\n/**\n * Build the checksummed CAIP-19 asset ID for an ERC-20 token.\n *\n * @param caip2 - The CAIP-2 chain ID (e.g. 'eip155:14').\n * @param tokenAddress - The ERC-20 contract address.\n * @returns The asset ID, or `null` when the address cannot be checksummed.\n */\nfunction buildErc20AssetId(\n caip2: string,\n tokenAddress: Hex,\n): Caip19AssetId | null {\n let checksummed: string;\n try {\n checksummed = getChecksumAddress(tokenAddress);\n } catch {\n return null;\n }\n return `${caip2}/erc20:${checksummed}` as Caip19AssetId;\n}\n\n/**\n * Read a nested path on an unknown value, returning `undefined` if any\n * intermediate key is missing or not an object.\n *\n * @param root - The value to read from.\n * @param path - Sequence of keys to traverse.\n * @returns The value at the path, or `undefined`.\n */\nfunction readPath(root: unknown, path: string[]): unknown {\n return path.reduce<unknown>((cursor, key) => {\n if (!isObject(cursor) || !hasProperty(cursor, key)) {\n return undefined;\n }\n return cursor[key];\n }, root);\n}\n\n/**\n * Record `assetId` as a custom-asset addition for `accountId` unless it is\n * already tracked in the current `assetsBalance` (mutual exclusion), already\n * present in the current `customAssets`, or already queued as an addition.\n *\n * @param currentState - Current `AssetsController` state slices.\n * @param additions - The custom-asset additions accumulated so far (mutated).\n * @param accountId - The account UUID.\n * @param assetId - CAIP-19 asset identifier.\n */\nfunction addCustomAssetAddition(\n currentState: CurrentAssetsState,\n additions: Record<AccountId, Caip19AssetId[]>,\n accountId: AccountId,\n assetId: Caip19AssetId,\n): void {\n if (currentState.assetsBalance[accountId]?.[assetId]) {\n return;\n }\n if (currentState.customAssets[accountId]?.includes(assetId)) {\n return;\n }\n\n const queued = additions[accountId] ?? [];\n if (!queued.includes(assetId)) {\n queued.push(assetId);\n }\n additions[accountId] = queued;\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { AccountTreeControllerState } from
|
|
2
|
-
import type { TraceCallback } from
|
|
3
|
-
import type { InternalAccount } from
|
|
4
|
-
import type { AssetsControllerState } from
|
|
5
|
-
import type { AccountId, Caip19AssetId } from
|
|
1
|
+
import type { AccountTreeControllerState } from '@metamask/account-tree-controller';
|
|
2
|
+
import type { TraceCallback } from '@metamask/controller-utils';
|
|
3
|
+
import type { InternalAccount } from '@metamask/keyring-internal-api';
|
|
4
|
+
import type { AssetsControllerState } from '../AssetsController.js';
|
|
5
|
+
import type { AccountId, Caip19AssetId } from '../types.js';
|
|
6
6
|
export type EnabledNetworkMap = Record<string, Record<string, boolean>> | undefined;
|
|
7
7
|
export type AggregatedBalanceEntry = {
|
|
8
8
|
assetId: Caip19AssetId;
|
|
@@ -100,4 +100,4 @@ export declare function calculateBalanceForAllWallets(assetsControllerState: Ass
|
|
|
100
100
|
* @returns The change result for the requested period.
|
|
101
101
|
*/
|
|
102
102
|
export declare function calculateBalanceChangeForAccountGroup(assetsControllerState: AssetsControllerState, accountTreeState: AccountTreeControllerState, groupId: string, period: BalanceChangePeriod, enabledNetworkMap?: EnabledNetworkMap, trace?: TraceCallback): BalanceChangeResult;
|
|
103
|
-
//# sourceMappingURL=balance.d.
|
|
103
|
+
//# sourceMappingURL=balance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../src/selectors/balance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { toHex } from
|
|
2
|
-
import { KnownCaipNamespace, isStrictHexString, parseCaipAssetType, parseCaipChainId } from
|
|
3
|
-
import BigNumberJS from
|
|
4
|
-
import { emitTrace, withTrace } from
|
|
1
|
+
import { toHex } from '@metamask/controller-utils';
|
|
2
|
+
import { KnownCaipNamespace, isStrictHexString, parseCaipAssetType, parseCaipChainId, } from '@metamask/utils';
|
|
3
|
+
import { BigNumber as BigNumberJS } from 'bignumber.js';
|
|
4
|
+
import { emitTrace, withTrace } from '../utils/trace.js';
|
|
5
5
|
// ============================================================================
|
|
6
6
|
// TRACE NAMES — used in Sentry spans (search these strings in Discover)
|
|
7
7
|
// ============================================================================
|
|
@@ -516,4 +516,4 @@ export function calculateBalanceChangeForAccountGroup(assetsControllerState, acc
|
|
|
516
516
|
const { current, previous } = getCurrentAndPrevious(totalBalanceInFiat, previousTotalInFiat, period);
|
|
517
517
|
return buildBalanceChangeResult(current, previous, period, userCurrency);
|
|
518
518
|
}
|
|
519
|
-
//# sourceMappingURL=balance.
|
|
519
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/selectors/balance.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport { toHex } from '@metamask/controller-utils';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { CaipChainId, Hex } from '@metamask/utils';\nimport {\n KnownCaipNamespace,\n isStrictHexString,\n parseCaipAssetType,\n parseCaipChainId,\n} from '@metamask/utils';\nimport { BigNumber as BigNumberJS } from 'bignumber.js';\n\nimport type { AssetsControllerState } from '../AssetsController.js';\nimport type {\n AccountId,\n AssetBalance,\n AssetMetadata,\n AssetPreferences,\n Caip19AssetId,\n} from '../types.js';\nimport { emitTrace, withTrace } from '../utils/trace.js';\n\n// ============================================================================\n// TRACE NAMES — used in Sentry spans (search these strings in Discover)\n// ============================================================================\n/** Parent span that nests {@link TRACE_AGGREGATED_BALANCE_SELECTOR}. */\nconst TRACE_AGGREGATED_BALANCE = 'AggregatedBalance';\nconst TRACE_AGGREGATED_BALANCE_SELECTOR = 'AggregatedBalanceSelector';\n\n/**\n * Emit `AggregatedBalanceSelector` as a **subspan** under an `AggregatedBalance`\n * parent (via `parentContext`).\n *\n * Work is timed outside the callback (selectors are sync), so we backdate\n * `startTime` via `duration_ms` — MetaMask's Sentry adapter promotes numeric\n * tags to measurements, which Spans dashboard widgets chart as `duration_ms`.\n *\n * @param trace - Trace callback from the client.\n * @param durationMs - Measured compute time in milliseconds.\n * @param data - Additional span attributes (counts, etc.).\n */\nfunction emitAggregatedBalanceSelectorTrace(\n trace: TraceCallback,\n durationMs: number,\n data: Record<string, number | string | boolean>,\n): void {\n const spanData = {\n duration_ms: durationMs,\n ...data,\n };\n\n withTrace({\n name: TRACE_AGGREGATED_BALANCE,\n trace,\n data: spanData,\n fn: async (parentContext) => {\n emitTrace({\n name: TRACE_AGGREGATED_BALANCE_SELECTOR,\n trace,\n data: spanData,\n parentContext,\n });\n },\n }).catch(() => {\n // Telemetry failure must not break.\n });\n}\n\nexport type EnabledNetworkMap =\n | Record<string, Record<string, boolean>>\n | undefined;\n\nexport type AggregatedBalanceEntry = {\n assetId: Caip19AssetId;\n amount: string;\n decimals?: number;\n symbol?: string;\n name?: string;\n};\n\nexport type AggregatedBalanceForAccount = {\n entries: AggregatedBalanceEntry[];\n totalBalanceInFiat?: number;\n pricePercentChange1d?: number;\n previousTotalInFiat?: number;\n};\n\ntype AccountLike = { id: AccountId };\nexport type AccountsById = Record<AccountId, InternalAccount>;\n\ntype PriceDatum = { price: number; pricePercentChange1d: number };\n\nconst ZERO_PRICE: PriceDatum = { price: 0, pricePercentChange1d: 0 };\n\nconst getAmountFromBalance = (balance: AssetBalance): string => {\n if (typeof balance === 'object' && balance !== null && 'amount' in balance) {\n const { amount } = balance as { amount?: unknown };\n return typeof amount === 'string' ? amount : '0';\n }\n return '0';\n};\n\nconst toBigNumberOrZero = (value: string): BigNumberJS => {\n const parsed = new BigNumberJS(value);\n return parsed.isNaN() || !parsed.isFinite() ? new BigNumberJS(0) : parsed;\n};\n\nconst getPriceDatumFast = (\n assetsPrice: AssetsControllerState['assetsPrice'] | undefined,\n assetId: Caip19AssetId,\n): PriceDatum => {\n const raw = assetsPrice?.[assetId];\n if (!raw || typeof raw !== 'object') {\n return ZERO_PRICE;\n }\n const { price, pricePercentChange1d } = raw as {\n price?: unknown;\n pricePercentChange1d?: unknown;\n };\n return {\n price: typeof price === 'number' && Number.isFinite(price) ? price : 0,\n pricePercentChange1d:\n typeof pricePercentChange1d === 'number' &&\n Number.isFinite(pricePercentChange1d)\n ? pricePercentChange1d\n : 0,\n };\n};\n\n/**\n * Enablement lookup optimized:\n * - no array allocations\n * - early returns\n *\n * @param map - Enabled network map (namespace -> storageKey -> boolean)\n * @param id - Chain id as Hex or CAIP-2\n * @returns True if the chain is enabled or map is undefined\n */\nconst isChainEnabledByMap = (\n map: EnabledNetworkMap,\n id: Hex | CaipChainId,\n): boolean => {\n if (!map) {\n return true;\n }\n\n if (isStrictHexString(id)) {\n return Boolean(map[KnownCaipNamespace.Eip155]?.[id]);\n }\n\n const { namespace, reference } = parseCaipChainId(id);\n const namespaceMap = map[namespace];\n if (!namespaceMap) {\n return false;\n }\n\n // exact CAIP-2 id / reference\n if (namespaceMap[id] || namespaceMap[reference]) {\n return true;\n }\n\n // EVM: hex storage key\n if (namespace === KnownCaipNamespace.Eip155) {\n try {\n const storageKey = toHex(reference);\n return Boolean(namespaceMap[storageKey]);\n } catch {\n const parsedRef = Number.parseInt(reference, 10);\n if (Number.isFinite(parsedRef)) {\n return Boolean(namespaceMap[`0x${parsedRef.toString(16)}`]);\n }\n }\n }\n\n return false;\n};\n\n/**\n * Cache parsing results per assetId to avoid parseCaipAssetType/parseCaipChainId\n * being called multiple times across filtering + grouping + pricing.\n */\ntype AssetParseInfo = {\n chainId: CaipChainId;\n isEvm: boolean;\n};\n\nconst makeAssetInfoCache = (): Map<Caip19AssetId, AssetParseInfo> =>\n new Map<Caip19AssetId, AssetParseInfo>();\n\nconst getAssetInfo = (\n cache: Map<Caip19AssetId, AssetParseInfo>,\n assetId: Caip19AssetId,\n): AssetParseInfo => {\n const cached = cache.get(assetId);\n if (cached) {\n return cached;\n }\n const { chainId } = parseCaipAssetType(assetId);\n const { namespace } = parseCaipChainId(chainId);\n const info = { chainId, isEvm: namespace === KnownCaipNamespace.Eip155 };\n cache.set(assetId, info);\n return info;\n};\n\n/**\n * Merge across accounts without building per-account entries arrays.\n * Uses BigNumber for amount accumulation to avoid float precision loss.\n */\ntype AggRow = {\n amount: BigNumberJS;\n decimals?: number;\n symbol?: string;\n name?: string;\n};\n\nfunction mergeBalancesIntoMap(args: {\n out: Map<Caip19AssetId, AggRow>;\n accountBalances: Record<Caip19AssetId, AssetBalance>;\n metadata: Record<Caip19AssetId, AssetMetadata>;\n assetPreferences?: Record<Caip19AssetId, AssetPreferences>;\n enabledNetworkMap?: EnabledNetworkMap;\n assetInfoCache: Map<Caip19AssetId, AssetParseInfo>;\n}): void {\n const {\n out,\n accountBalances,\n metadata,\n assetPreferences,\n enabledNetworkMap,\n assetInfoCache,\n } = args;\n\n for (const assetId in accountBalances) {\n if (!Object.prototype.hasOwnProperty.call(accountBalances, assetId)) {\n continue;\n }\n const typedAssetId = assetId as Caip19AssetId;\n\n if (assetPreferences?.[typedAssetId]?.hidden) {\n continue;\n }\n\n const info = getAssetInfo(assetInfoCache, typedAssetId);\n if (!isChainEnabledByMap(enabledNetworkMap, info.chainId)) {\n continue;\n }\n\n const amountStr = getAmountFromBalance(accountBalances[typedAssetId]);\n const amountBn = toBigNumberOrZero(amountStr);\n const meta = metadata[typedAssetId];\n if (amountBn.isZero()) {\n continue; // skip zeros early to reduce map pressure\n }\n\n const existing = out.get(typedAssetId);\n if (existing) {\n existing.amount = existing.amount.plus(amountBn);\n continue;\n }\n\n out.set(typedAssetId, {\n amount: amountBn,\n decimals: meta?.decimals,\n symbol: meta?.symbol,\n name: meta?.name,\n });\n }\n}\n\nexport function getGroupIdForAccount(\n accountTreeState: AccountTreeControllerState,\n accountId: AccountId,\n): string | undefined {\n const wallets = accountTreeState.accountTree?.wallets;\n if (!wallets) {\n return undefined;\n }\n for (const wallet of Object.values(wallets)) {\n for (const [groupId, group] of Object.entries(wallet?.groups ?? {})) {\n const accounts = group?.accounts;\n if (Array.isArray(accounts) && accounts.includes(accountId)) {\n return groupId;\n }\n }\n }\n return undefined;\n}\n\nexport function getInternalAccountsForGroup(\n accountTreeState: AccountTreeControllerState,\n accountsById: AccountsById,\n groupId: string,\n): InternalAccount[] {\n const wallets = accountTreeState.accountTree?.wallets;\n if (!wallets) {\n return [];\n }\n type GroupWithAccounts = { accounts?: AccountId[] };\n const getGroups = (\n walletItem: (typeof wallets)[keyof typeof wallets],\n ): Record<string, GroupWithAccounts> =>\n (walletItem?.groups ?? {}) as Record<string, GroupWithAccounts>;\n\n for (const wallet of Object.values(wallets)) {\n const group = getGroups(wallet)[groupId];\n if (!group?.accounts) {\n continue;\n }\n const result: InternalAccount[] = [];\n for (const id of group.accounts) {\n const acct = accountsById[id];\n if (acct) {\n result.push(acct);\n }\n }\n return result;\n }\n return [];\n}\n\nfunction getAccountIdsInSameGroup(\n accountTreeState: AccountTreeControllerState,\n selectedAccountId: AccountId,\n): AccountId[] | undefined {\n const groupId = getGroupIdForAccount(accountTreeState, selectedAccountId);\n if (!groupId) {\n return undefined;\n }\n const wallets = accountTreeState.accountTree?.wallets;\n if (!wallets) {\n return undefined;\n }\n type GroupWithAccounts = { accounts?: AccountId[] };\n const getGroups = (\n walletItem: (typeof wallets)[keyof typeof wallets],\n ): Record<string, GroupWithAccounts> =>\n (walletItem?.groups ?? {}) as Record<string, GroupWithAccounts>;\n\n for (const wallet of Object.values(wallets)) {\n const group = getGroups(wallet)[groupId];\n if (group?.accounts) {\n return [...group.accounts];\n }\n }\n return undefined;\n}\n\nfunction resolveAccountsToAggregate(args: {\n selectedInternalAccount: InternalAccount;\n accountTreeState?: AccountTreeControllerState;\n internalAccountsOrAccountIds?: InternalAccount[] | AccountId[];\n accountsById?: AccountsById;\n}): AccountLike[] {\n const {\n selectedInternalAccount,\n accountTreeState,\n internalAccountsOrAccountIds,\n accountsById,\n } = args;\n\n if (internalAccountsOrAccountIds && internalAccountsOrAccountIds.length > 0) {\n const first = internalAccountsOrAccountIds[0];\n if (typeof first === 'string') {\n const ids = internalAccountsOrAccountIds as AccountId[];\n const out: AccountLike[] = new Array(ids.length);\n for (let i = 0; i < ids.length; i++) {\n out[i] = { id: ids[i] };\n }\n return out;\n }\n return internalAccountsOrAccountIds as InternalAccount[];\n }\n\n if (\n accountTreeState &&\n accountsById &&\n Object.keys(accountsById).length > 0\n ) {\n const groupId = getGroupIdForAccount(\n accountTreeState,\n selectedInternalAccount.id,\n );\n if (groupId) {\n const groupAccounts = getInternalAccountsForGroup(\n accountTreeState,\n accountsById,\n groupId,\n );\n if (groupAccounts.length > 0) {\n return groupAccounts;\n }\n }\n }\n\n if (accountTreeState) {\n const ids = getAccountIdsInSameGroup(\n accountTreeState,\n selectedInternalAccount.id,\n );\n if (ids && ids.length > 0) {\n const out: AccountLike[] = new Array(ids.length);\n for (let i = 0; i < ids.length; i++) {\n out[i] = { id: ids[i] };\n }\n return out;\n }\n }\n\n return [selectedInternalAccount];\n}\n\n/**\n * Get account ids that belong to a group, reading directly from the account\n * tree. Unlike {@link getInternalAccountsForGroup}, this does not require an\n * `accountsById` lookup map, which makes it convenient for balance aggregation\n * where only the ids are needed.\n *\n * @param accountTreeState - AccountTreeController state.\n * @param groupId - The account group id to look up.\n * @returns The list of account ids in the group, or an empty array.\n */\nexport function getAccountIdsForGroup(\n accountTreeState: AccountTreeControllerState,\n groupId: string,\n): AccountId[] {\n const wallets = accountTreeState.accountTree?.wallets ?? {};\n type GroupWithAccounts = { accounts?: AccountId[] };\n for (const wallet of Object.values(wallets)) {\n const groups = (wallet?.groups ?? {}) as Record<string, GroupWithAccounts>;\n const group = groups[groupId];\n if (group?.accounts) {\n return [...group.accounts];\n }\n }\n return [];\n}\n\n/**\n * Aggregate balances across an explicit list of accounts.\n *\n * This is the core aggregation engine shared by the account- and group-level\n * selectors. It intentionally takes a fully-resolved list of accounts so that\n * callers control account resolution and no \"selected account\" placeholder is\n * required.\n *\n * @param state - AssetsController state slice.\n * @param accounts - Accounts whose balances should be aggregated.\n * @param enabledNetworkMap - Optional map of enabled networks keyed by namespace.\n * @param trace - Optional trace callback for telemetry spans.\n * @returns Aggregated balance entries plus fiat totals when prices are present.\n */\nfunction aggregateBalances(\n state: AssetsControllerState,\n accounts: AccountLike[],\n enabledNetworkMap?: EnabledNetworkMap,\n trace?: TraceCallback,\n): AggregatedBalanceForAccount {\n const startTime = trace ? performance.now() : 0;\n const { assetsBalance, assetsInfo, assetPreferences, assetsPrice } = state;\n\n const metadata = (assetsInfo ?? {}) as Record<Caip19AssetId, AssetMetadata>;\n\n const hasPrices =\n Boolean(assetsPrice) &&\n ((): boolean => {\n for (const key in assetsPrice) {\n if (Object.prototype.hasOwnProperty.call(assetsPrice, key)) {\n return true;\n }\n }\n return false;\n })();\n\n const accountsToAggregate = accounts;\n\n const assetInfoCache = makeAssetInfoCache();\n const merged = new Map<Caip19AssetId, AggRow>();\n\n for (const account of accountsToAggregate) {\n const accountId = account.id;\n const accountBalances =\n assetsBalance?.[accountId] ?? ({} as Record<Caip19AssetId, AssetBalance>);\n\n mergeBalancesIntoMap({\n out: merged,\n accountBalances,\n metadata,\n assetPreferences,\n enabledNetworkMap,\n assetInfoCache,\n });\n }\n\n // Materialize entries once\n const entries: AggregatedBalanceEntry[] = new Array(merged.size);\n let idx = 0;\n\n // If prices exist, compute totals in a single pass over merged.\n let totalBalanceInFiat = 0;\n let previousTotalInFiat = 0;\n let weightedNumerator = 0;\n\n for (const [assetId, row] of merged.entries()) {\n const { amount } = row;\n const entry: AggregatedBalanceEntry = {\n assetId,\n amount: amount.toFixed(),\n ...(row.decimals === undefined ? {} : { decimals: row.decimals }),\n ...(row.symbol === undefined ? {} : { symbol: row.symbol }),\n ...(row.name === undefined ? {} : { name: row.name }),\n };\n entries[idx] = entry;\n idx += 1;\n\n if (hasPrices) {\n const { price, pricePercentChange1d } = getPriceDatumFast(\n assetsPrice,\n assetId,\n );\n const contribution = amount.multipliedBy(price).toNumber();\n if (contribution > 0) {\n totalBalanceInFiat += contribution;\n weightedNumerator += contribution * pricePercentChange1d;\n\n // A -100% move makes the denominator zero; treat it as flat so the\n // previous total never goes to infinity.\n const denom = Number((1 + pricePercentChange1d / 100).toFixed(8));\n previousTotalInFiat +=\n denom === 0 ? contribution : contribution / denom;\n }\n }\n }\n\n if (trace) {\n const durationMs = performance.now() - startTime;\n const uniqueNetworks = new Set<CaipChainId>();\n for (const assetId of merged.keys()) {\n const info = getAssetInfo(assetInfoCache, assetId);\n uniqueNetworks.add(info.chainId);\n }\n emitAggregatedBalanceSelectorTrace(trace, durationMs, {\n asset_count: merged.size,\n network_count: uniqueNetworks.size,\n account_count: accountsToAggregate.length,\n });\n }\n\n if (hasPrices) {\n const pricePercentChange1d =\n totalBalanceInFiat > 0 ? weightedNumerator / totalBalanceInFiat : 0;\n return {\n entries,\n totalBalanceInFiat,\n pricePercentChange1d,\n previousTotalInFiat,\n };\n }\n\n return { entries };\n}\n\n/**\n * Aggregate balances for an explicit list of account ids.\n *\n * Prefer this over {@link getAggregatedBalanceForAccount} when the set of\n * accounts to aggregate is already known (e.g. all accounts in a group), since\n * it does not require a \"selected account\" and therefore avoids the brittle\n * account-resolution heuristics.\n *\n * @param state - AssetsController state slice.\n * @param accountIds - Account ids whose balances should be aggregated.\n * @param enabledNetworkMap - Optional map of enabled networks keyed by namespace.\n * @param trace - Optional trace callback for telemetry spans.\n * @returns Aggregated balance entries plus fiat totals when prices are present.\n */\nexport function getAggregatedBalanceForAccountIds(\n state: AssetsControllerState,\n accountIds: AccountId[],\n enabledNetworkMap?: EnabledNetworkMap,\n trace?: TraceCallback,\n): AggregatedBalanceForAccount {\n const accounts: AccountLike[] = accountIds.map((id) => ({ id }));\n return aggregateBalances(state, accounts, enabledNetworkMap, trace);\n}\n\nexport function getAggregatedBalanceForAccount(\n state: AssetsControllerState,\n selectedInternalAccount: InternalAccount,\n enabledNetworkMap?: EnabledNetworkMap,\n accountTreeState?: AccountTreeControllerState,\n internalAccountsOrAccountIds?: InternalAccount[] | AccountId[],\n accountsById?: AccountsById,\n trace?: TraceCallback,\n): AggregatedBalanceForAccount {\n const accountsToAggregate = resolveAccountsToAggregate({\n selectedInternalAccount,\n accountTreeState,\n internalAccountsOrAccountIds,\n accountsById,\n });\n return aggregateBalances(\n state,\n accountsToAggregate,\n enabledNetworkMap,\n trace,\n );\n}\n\n// ============================================================================\n// WALLET- AND GROUP-LEVEL BALANCE CALCULATIONS\n// ============================================================================\n\n/**\n * Default user currency used when {@link AssetsControllerState.selectedCurrency}\n * is not set.\n */\nconst DEFAULT_USER_CURRENCY = 'usd';\n\nexport type AccountGroupBalance = {\n walletId: string;\n groupId: string;\n totalBalanceInUserCurrency: number;\n userCurrency: string;\n};\n\nexport type WalletBalance = {\n walletId: string;\n groups: Record<string, AccountGroupBalance>;\n totalBalanceInUserCurrency: number;\n userCurrency: string;\n};\n\nexport type AllWalletsBalance = {\n wallets: Record<string, WalletBalance>;\n totalBalanceInUserCurrency: number;\n userCurrency: string;\n};\n\nexport type BalanceChangePeriod = '1d' | '7d' | '30d';\n\nexport type BalanceChangeResult = {\n period: BalanceChangePeriod;\n currentTotalInUserCurrency: number;\n previousTotalInUserCurrency: number;\n amountChangeInUserCurrency: number;\n percentChange: number;\n userCurrency: string;\n};\n\n/**\n * Resolve the user currency for a balance calculation, falling back to a\n * sensible default when the controller has no selected currency.\n *\n * @param assetsControllerState - AssetsController state slice.\n * @returns The user currency code.\n */\nfunction getUserCurrency(assetsControllerState: AssetsControllerState): string {\n return assetsControllerState.selectedCurrency ?? DEFAULT_USER_CURRENCY;\n}\n\n/**\n * Resolve the current and previous totals for a change calculation.\n *\n * The AssetsController state only exposes a 1d price change, so non-`1d`\n * periods produce a zeroed change (previous equals current).\n *\n * @param totalBalanceInFiat - Aggregated current balance in user currency.\n * @param previousTotalInFiat - Aggregated prior balance summed per asset.\n * @param period - Period to compute the change for.\n * @returns The current and previous totals in user currency.\n */\nfunction getCurrentAndPrevious(\n totalBalanceInFiat: number,\n previousTotalInFiat: number,\n period: BalanceChangePeriod,\n): { current: number; previous: number } {\n const current = totalBalanceInFiat;\n const previous = period === '1d' ? previousTotalInFiat : current;\n return { current, previous };\n}\n\n/**\n * Build a {@link BalanceChangeResult} from current/previous totals.\n *\n * @param current - Current total in user currency.\n * @param previous - Previous total in user currency.\n * @param period - Period the change was computed for.\n * @param userCurrency - User currency code.\n * @returns The change result with delta and percent change.\n */\nfunction buildBalanceChangeResult(\n current: number,\n previous: number,\n period: BalanceChangePeriod,\n userCurrency: string,\n): BalanceChangeResult {\n const amountChange = current - previous;\n const percentChange = previous === 0 ? 0 : (amountChange / previous) * 100;\n return {\n period,\n currentTotalInUserCurrency: Number(current.toFixed(8)),\n previousTotalInUserCurrency: Number(previous.toFixed(8)),\n amountChangeInUserCurrency: Number(amountChange.toFixed(8)),\n percentChange: Number(percentChange.toFixed(8)),\n userCurrency,\n };\n}\n\n/**\n * Calculate aggregated balances for all wallets and groups.\n *\n * Mirrors the legacy `@metamask/assets-controllers` `calculateBalanceForAllWallets`\n * output shape, but sources every group total from the unified AssetsController\n * state via {@link getAggregatedBalanceForAccountIds}. The account tree is walked\n * to aggregate each group individually.\n *\n * @param assetsControllerState - AssetsController state slice.\n * @param accountTreeState - AccountTreeController state.\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace.\n * @param trace - Optional trace callback forwarded to the aggregation selector.\n * @returns Aggregated balances for all wallets and groups.\n */\nexport function calculateBalanceForAllWallets(\n assetsControllerState: AssetsControllerState,\n accountTreeState: AccountTreeControllerState,\n enabledNetworkMap?: EnabledNetworkMap,\n trace?: TraceCallback,\n): AllWalletsBalance {\n const startTime = performance.now();\n const userCurrency = getUserCurrency(assetsControllerState);\n const wallets: AllWalletsBalance['wallets'] = {};\n let totalBalanceInUserCurrency = 0;\n let groupCount = 0;\n\n type WalletWithGroups = { groups?: Record<string, unknown> };\n for (const [walletId, wallet] of Object.entries(\n accountTreeState.accountTree?.wallets ?? {},\n )) {\n const walletBalance: WalletBalance = {\n walletId,\n groups: {},\n totalBalanceInUserCurrency: 0,\n userCurrency,\n };\n\n const groups = (wallet as WalletWithGroups)?.groups ?? {};\n for (const groupId of Object.keys(groups)) {\n groupCount += 1;\n const accountIds = getAccountIdsForGroup(accountTreeState, groupId);\n // Do not forward `trace` per group — that created one root Sentry span\n // per account group and hit rate limits. Emit a single span below.\n const { totalBalanceInFiat = 0 } = getAggregatedBalanceForAccountIds(\n assetsControllerState,\n accountIds,\n enabledNetworkMap,\n );\n\n walletBalance.groups[groupId] = {\n walletId,\n groupId,\n totalBalanceInUserCurrency: totalBalanceInFiat,\n userCurrency,\n };\n walletBalance.totalBalanceInUserCurrency += totalBalanceInFiat;\n }\n\n wallets[walletId] = walletBalance;\n totalBalanceInUserCurrency += walletBalance.totalBalanceInUserCurrency;\n }\n\n if (trace) {\n emitAggregatedBalanceSelectorTrace(trace, performance.now() - startTime, {\n wallet_count: Object.keys(wallets).length,\n group_count: groupCount,\n });\n }\n\n return { wallets, totalBalanceInUserCurrency, userCurrency };\n}\n\n/**\n * Calculate the portfolio value change for a single account group and period.\n *\n * @param assetsControllerState - AssetsController state slice.\n * @param accountTreeState - AccountTreeController state.\n * @param groupId - Account group id to compute the change for.\n * @param period - Change period (`1d` | `7d` | `30d`).\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace.\n * @param trace - Optional trace callback forwarded to the aggregation selector.\n * @returns The change result for the requested period.\n */\nexport function calculateBalanceChangeForAccountGroup(\n assetsControllerState: AssetsControllerState,\n accountTreeState: AccountTreeControllerState,\n groupId: string,\n period: BalanceChangePeriod,\n enabledNetworkMap?: EnabledNetworkMap,\n trace?: TraceCallback,\n): BalanceChangeResult {\n const userCurrency = getUserCurrency(assetsControllerState);\n const accountIds = getAccountIdsForGroup(accountTreeState, groupId);\n const { totalBalanceInFiat = 0, previousTotalInFiat = totalBalanceInFiat } =\n getAggregatedBalanceForAccountIds(\n assetsControllerState,\n accountIds,\n enabledNetworkMap,\n trace,\n );\n\n const { current, previous } = getCurrentAndPrevious(\n totalBalanceInFiat,\n previousTotalInFiat,\n period,\n );\n\n return buildBalanceChangeResult(current, previous, period, userCurrency);\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { SupportedCurrency } from
|
|
2
|
-
import type { InternalAccount } from
|
|
3
|
-
import type { CaipAssetType, CaipChainId, Json } from
|
|
1
|
+
import type { SupportedCurrency } from '@metamask/core-backend';
|
|
2
|
+
import type { InternalAccount } from '@metamask/keyring-internal-api';
|
|
3
|
+
import type { CaipAssetType, CaipChainId, Json } from '@metamask/utils';
|
|
4
4
|
/**
|
|
5
5
|
* CAIP-19 compliant asset identifier
|
|
6
6
|
* Format: "{chainId}/{assetNamespace}:{assetReference}[/tokenId]"
|
|
@@ -530,4 +530,4 @@ export type AssetsDetectedEvent = {
|
|
|
530
530
|
accountId: AccountId;
|
|
531
531
|
assetIds: Caip19AssetId[];
|
|
532
532
|
};
|
|
533
|
-
//# sourceMappingURL=types.d.
|
|
533
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA4gBA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAqB,EACrB,UAAsB;IAEtB,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;QAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAEtE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,OAAO,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { SupportedCurrency } from '@metamask/core-backend';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { CaipAssetType, CaipChainId, Json } from '@metamask/utils';\n\n/**\n * CAIP-19 compliant asset identifier\n * Format: \"{chainId}/{assetNamespace}:{assetReference}[/tokenId]\"\n *\n * Examples:\n * - Native: \"eip155:1/slip44:60\" (ETH)\n * - ERC20: \"eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\" (USDC)\n * - ERC721: \"eip155:1/erc721:0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D/1234\" (BAYC #1234)\n * - SPL: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"\n */\nexport type Caip19AssetId = CaipAssetType;\n\n/**\n * InternalAccount UUID from AccountsController\n * Not the blockchain address!\n */\nexport type AccountId = string;\n\n/**\n * CAIP-2 chain identifier\n */\nexport type ChainId = CaipChainId;\n\n// ============================================================================\n// ASSET TYPES - Defined by metadata structure\n// ============================================================================\n\n/**\n * Asset types define the metadata structure, not blockchain implementation.\n * - \"fungible\" includes: native, erc20, spl - all share balance, symbol, decimals\n * - \"nft\" includes: erc721, erc1155 - include tokenId, image, attributes\n */\nexport type AssetType = 'fungible' | 'nft' | 'collectible';\n\n/**\n * Token standards - blockchain implementation details\n */\nexport type TokenStandard =\n | 'native'\n | 'erc20'\n | 'erc721'\n | 'erc1155'\n | 'spl'\n | string;\n\n// ============================================================================\n// METADATA TYPES (vary by asset type)\n// ============================================================================\n\n/**\n * UI preferences for an asset (stored in assetPreferences state, not in metadata).\n */\nexport type AssetPreferences = {\n /** Whether the asset is hidden from display */\n hidden?: boolean;\n};\n\n/**\n * Base metadata attributes shared by ALL asset types.\n */\nexport type BaseAssetMetadata = {\n /** Token standard - how it's implemented on the blockchain */\n type: TokenStandard;\n /** Display symbol (e.g., \"ETH\", \"USDC\") */\n symbol: string;\n /** Full name (e.g., \"Ethereum\", \"USD Coin\") */\n name: string;\n /** Token decimals (18 for ETH, 6 for USDC, etc.) */\n decimals: number;\n /** Logo URL or data URI */\n image?: string;\n};\n\n// ============================================================================\n// TOKEN CONTRACT DATA TYPES\n// ============================================================================\n\n/** Fee information for token transfers */\nexport type TokenFees = {\n avgFee: number;\n maxFee: number;\n minFee: number;\n};\n\n/** Honeypot detection status */\nexport type HoneypotStatus = {\n honeypotIs: boolean;\n goPlus?: boolean;\n};\n\n/** Storage slot information for the contract */\nexport type StorageSlots = {\n balance: number;\n approval: number;\n};\n\n/** Localized description */\nexport type LocalizedDescription = {\n en: string;\n};\n\n// ============================================================================\n// ASSET METADATA TYPES\n// ============================================================================\n\n/**\n * Metadata for fungible tokens.\n * Structure mirrors V3AssetResponse from the Tokens API.\n *\n * Differences from V3AssetResponse:\n * - `type` is derived from assetId namespace (not in API response)\n * - `image` maps from API's `iconUrl`\n * - `assetId` is not stored (used as the key)\n */\nexport type FungibleAssetMetadata = {\n /** Token type derived from assetId namespace */\n type: 'native' | 'erc20' | 'spl';\n /** CoinGecko ID for price lookups */\n coingeckoId?: string;\n /** Number of token list occurrences */\n occurrences?: number;\n /** DEX/aggregator integrations */\n aggregators?: string[];\n /** Asset labels/tags (e.g., \"stable_coin\") */\n labels?: string[];\n /** Whether the token supports ERC-20 permit */\n erc20Permit?: boolean;\n /** Fee information for token transfers */\n fees?: TokenFees;\n /** Honeypot detection status */\n honeypotStatus?: HoneypotStatus;\n /** Storage slot information for the contract */\n storage?: StorageSlots;\n /** Whether the contract is verified */\n isContractVerified?: boolean;\n /** Localized description */\n description?: LocalizedDescription;\n} & BaseAssetMetadata;\n\n/**\n * Metadata for ERC721 NFTs\n * Asset Type: \"nft\"\n */\nexport type ERC721AssetMetadata = {\n type: 'erc721';\n decimals: 0;\n /** Collection name */\n collectionName?: string;\n /** Collection size */\n collectionSize?: number;\n /** NFT traits/attributes - must be Json-serializable */\n traits?: Record<string, Json>;\n /** Rarity score */\n rarity?: number;\n /** Verification status */\n verified?: boolean;\n} & BaseAssetMetadata;\n\n/**\n * Metadata for ERC1155 multi-tokens\n */\nexport type ERC1155AssetMetadata = {\n type: 'erc1155';\n /** Token URI */\n tokenUri?: string;\n /** Token category */\n category?: string;\n /** Spam detection flag */\n isSpam?: boolean;\n} & BaseAssetMetadata;\n\n/**\n * Union type representing all possible asset metadata types.\n * All types must be JSON-serializable.\n */\nexport type AssetMetadata =\n | FungibleAssetMetadata\n | ERC721AssetMetadata\n | ERC1155AssetMetadata\n | (BaseAssetMetadata & { [key: string]: Json });\n\n// ============================================================================\n// PRICE TYPES (vary by asset type)\n// ============================================================================\n\n/**\n * Base price attributes.\n */\nexport type BaseAssetPrice = {\n /** Current price in selected currency */\n price: number;\n /** Timestamp of last price update */\n lastUpdated: number;\n};\n\n/**\n * Price data for fungible tokens (native, ERC20, SPL)\n * Matches V3SpotPricesResponse from the Price API.\n */\nexport type FungibleAssetPrice = BaseAssetPrice & {\n assetPriceType: 'fungible';\n /** CoinGecko ID */\n id?: string;\n /** Market capitalization */\n marketCap?: number;\n /** All-time high price */\n allTimeHigh?: number;\n /** All-time low price */\n allTimeLow?: number;\n /** 24h trading volume */\n totalVolume?: number;\n /** 24h high price */\n high1d?: number;\n /** 24h low price */\n low1d?: number;\n /** Circulating supply */\n circulatingSupply?: number;\n /** Fully diluted market cap */\n dilutedMarketCap?: number;\n /** 24h market cap change percentage */\n marketCapPercentChange1d?: number;\n /** 24h price change in USD */\n priceChange1d?: number;\n /** 1h price change percentage */\n pricePercentChange1h?: number;\n /** 24h price change percentage */\n pricePercentChange1d?: number;\n /** 7d price change percentage */\n pricePercentChange7d?: number;\n /** 14d price change percentage */\n pricePercentChange14d?: number;\n /** 30d price change percentage */\n pricePercentChange30d?: number;\n /** 200d price change percentage */\n pricePercentChange200d?: number;\n /** 1y price change percentage */\n pricePercentChange1y?: number;\n /** Current price in USD */\n usdPrice: number;\n};\n\n/**\n * Price data for NFT collections\n */\nexport type NFTAssetPrice = BaseAssetPrice & {\n assetPriceType: 'nft';\n /** Floor price */\n floorPrice?: number;\n /** Last sale price */\n lastSalePrice?: number;\n /** Collection trading volume */\n collectionVolume?: number;\n /** Average price */\n averagePrice?: number;\n /** Number of sales in 24h */\n sales24h?: number;\n};\n\n/**\n * Union type representing all possible asset price types.\n * All types must be JSON-serializable.\n */\nexport type AssetPrice = FungibleAssetPrice | NFTAssetPrice;\n\n// ============================================================================\n// BALANCE TYPES (vary by asset type)\n// ============================================================================\n\n/**\n * Balance data for fungible tokens (native, ERC20, SPL).\n */\nexport type FungibleAssetBalance = {\n /** Raw balance amount as string (e.g., \"1000000000\" for 1000 USDC) */\n amount: string;\n};\n\n/**\n * Balance data for ERC721 NFTs.\n * Each tokenId has its own CAIP-19 asset ID, so always \"1\".\n */\nexport type ERC721AssetBalance = {\n /** Always \"1\" for ERC721 (non-fungible) */\n amount: '1';\n};\n\n/**\n * Balance data for ERC1155 multi-tokens.\n */\nexport type ERC1155AssetBalance = {\n /** Quantity owned of this specific tokenId */\n amount: string;\n};\n\n/**\n * Union type representing all possible asset balance types.\n * All types must be JSON-serializable.\n */\nexport type AssetBalance =\n | FungibleAssetBalance\n | ERC721AssetBalance\n | ERC1155AssetBalance\n | { amount: string; [key: string]: Json };\n\n// ============================================================================\n// DATA SOURCE TYPES\n// ============================================================================\n\n/**\n * Data type dimension - what kind of data\n */\nexport type DataType = 'balance' | 'metadata' | 'price';\n\n/**\n * Account with its supported chains (enabled chains ∩ account scope).\n * Pre-computed by the controller so data sources do not need to implement\n * account-scope logic; they iterate over supportedChains for each account.\n */\nexport type AccountWithSupportedChains = {\n account: InternalAccount;\n supportedChains: ChainId[];\n};\n\n/**\n * Request for data from data sources\n */\nexport type DataRequest = {\n /** Accounts with their supported chains (enabled ∩ account scope). Data sources use this instead of computing accountSupportsChain. */\n accountsWithSupportedChains: AccountWithSupportedChains[];\n /** CAIP-2 chain IDs (union of chains in this request) */\n chainIds: ChainId[];\n /** Filter by asset types */\n assetTypes?: AssetType[];\n /** Which data to fetch */\n dataTypes: DataType[];\n /** Specific CAIP-19 asset IDs */\n customAssets?: Caip19AssetId[];\n /**\n * When true, the data source should poll only the user's `customAssets`\n * for the requested chains and skip refreshing the regular tracked\n * balances. Used by the AssetsController to issue a supplemental RPC\n * subscription on chains that another data source is already covering.\n */\n customAssetsOnly?: boolean;\n /** Force fresh fetch, bypass cache */\n forceUpdate?: boolean;\n /** Hint for polling interval (ms) - used by data sources that implement polling */\n updateInterval?: number;\n /** Specific CAIP-19 asset IDs for price update */\n assetsForPriceUpdate?: Caip19AssetId[];\n};\n\n/**\n * Response from data sources\n */\nexport type DataResponse = {\n /** Metadata for assets (shared across accounts) */\n assetsInfo?: Record<Caip19AssetId, AssetMetadata>;\n /** Price data for assets (shared across accounts) */\n assetsPrice?: Record<Caip19AssetId, AssetPrice>;\n /** Balance data per account */\n assetsBalance?: Record<AccountId, Record<Caip19AssetId, AssetBalance>>;\n /** Errors encountered, keyed by chain ID */\n errors?: Record<ChainId, string>;\n /** Detected assets (assets that do not have metadata) */\n detectedAssets?: Record<AccountId, Caip19AssetId[]>;\n /**\n * How to apply this response to state. See {@link AssetsUpdateMode}.\n * Defaults to `'merge'` if omitted.\n */\n updateMode?: AssetsUpdateMode;\n /**\n * When set with `updateMode: 'merge'`, balances on chains present in\n * `assetsBalance` replace the prior chain slice (stale tokens on those chains\n * are dropped). Custom assets on covered chains are preserved. Used for\n * `getAssets({ forceUpdate: true })` so unlock/startup reflects the API snapshot\n * without switching to `updateMode: 'full'`.\n */\n replaceCoveredChainBalances?: boolean;\n};\n\n/**\n * Type of {@link DataResponse.updateMode}: how the controller applies the response to state.\n *\n * - **full**: Response is the full set for the scope. Assets in state but not in the\n * response are cleared (except custom assets). Use for initial fetch or full refresh.\n * - **merge**: By default only assets present in the response are updated;\n * nothing is removed. When {@link DataResponse.replaceCoveredChainBalances}\n * is true, balances on chains present in the response replace the prior chain\n * slice (stale tokens on those chains are dropped; custom assets preserved).\n * Metadata and prices from the response are applied. Use for event-driven updates.\n * - **update**: Balance-only overlay — incoming balance amounts are patched in place;\n * existing balances, metadata, and prices are never removed or overwritten.\n * Missing metadata and prices from the response are seeded so RPC-only chains\n * can render on first fetch. Use for force refresh when the API may return a\n * partial chain snapshot.\n */\nexport type AssetsUpdateMode = 'full' | 'merge' | 'update';\n\n// ============================================================================\n// DATA SOURCE <-> CONTROLLER (DIRECT CALLS, NO MESSENGER PER SOURCE)\n// ============================================================================\n\n/**\n * Callbacks for data sources to report to AssetsController.\n * Passed to data sources so they report by direct call instead of messenger.\n */\nexport type AssetsControllerReport = {\n onActiveChainsUpdate: (dataSourceId: string, activeChains: ChainId[]) => void;\n onAssetsUpdate: (response: DataResponse, sourceId: string) => Promise<void>;\n};\n\n/** Request passed from controller to data source when subscribing */\nexport type DataSourceSubscriptionRequest = {\n request: DataRequest;\n subscriptionId: string;\n isUpdate: boolean;\n};\n\n/**\n * Interface for balance data sources that the controller calls directly.\n * No messenger is required for controller <-> data source communication.\n */\nexport type BalanceDataSource = {\n getAssetsMiddleware: () => Middleware;\n subscribe: (request: DataSourceSubscriptionRequest) => Promise<void>;\n unsubscribe: (subscriptionId: string) => Promise<void>;\n getName: () => string;\n};\n\n/**\n * Interface for the price data source (subscribe/unsubscribe + middleware).\n * Controller calls these methods directly.\n */\nexport type PriceDataSourceInterface = {\n getAssetsMiddleware: () => Middleware;\n subscribe: (request: DataSourceSubscriptionRequest) => Promise<void>;\n unsubscribe: (subscriptionId: string) => Promise<void>;\n};\n\n/**\n * Middleware-only source (e.g. detection, token enrichment).\n * Controller calls getAssetsMiddleware() directly.\n */\nexport type MiddlewareDataSource = {\n getAssetsMiddleware: () => Middleware;\n};\n\n// ============================================================================\n// UNIFIED MIDDLEWARE TYPES\n// ============================================================================\n\n/**\n * Internal state structure for AssetsController following normalized design.\n *\n * Keys use CAIP identifiers:\n * - assetsInfo keys: CAIP-19 asset IDs (e.g., \"eip155:1/erc20:0x...\")\n * - assetsBalance outer keys: Account IDs (InternalAccount.id UUIDs)\n * - assetsBalance inner keys: CAIP-19 asset IDs\n * - assetsPrice keys: CAIP-19 asset IDs\n * - customAssets outer keys: Account IDs (InternalAccount.id UUIDs)\n * - customAssets inner values: CAIP-19 asset IDs array\n * - assetPreferences keys: CAIP-19 asset IDs\n */\nexport type AssetsControllerStateInternal = {\n /** Shared metadata for all assets (stored once per asset) */\n assetsInfo: Record<Caip19AssetId, AssetMetadata>;\n /** Per-account balance data */\n assetsBalance: Record<AccountId, Record<Caip19AssetId, AssetBalance>>;\n /** Price data for assets */\n assetsPrice: Record<Caip19AssetId, AssetPrice>;\n /** Custom assets added by users per account */\n customAssets: Record<AccountId, Caip19AssetId[]>;\n /** UI preferences per asset (e.g. hidden) - separate from metadata */\n assetPreferences: Record<Caip19AssetId, AssetPreferences>;\n /** Currently-active ISO 4217 currency code */\n selectedCurrency: SupportedCurrency;\n};\n\n/**\n * Base context for all middleware operations.\n * Contains the common interface shared by fetch and subscribe.\n */\nexport type Context = {\n /** The data request */\n request: DataRequest;\n /** The response data (mutated by middlewares) */\n response: DataResponse;\n /** Get current assets state */\n getAssetsState: () => AssetsControllerStateInternal;\n /**\n * Optional breakdown of latency (ms) per data source, e.g. from parallel\n * middlewares. Keys are source names (often \"MiddlewareName.SourceName\").\n * Merged into the controller's durationByDataSource for tracing.\n */\n durationByDataSource?: Record<string, number>;\n};\n\n/**\n * Next function for middleware chain\n */\nexport type NextFunction = (context: Context) => Promise<Context>;\n\n/**\n * Middleware function - works for both fetch and subscribe operations.\n */\nexport type Middleware = (\n context: Context,\n next: NextFunction,\n) => Promise<Context>;\n\n/**\n * An assets data source: any object that can participate in the assets\n * middleware chain with a display name (e.g. for tracing). Used by\n * createParallelMiddleware and by the controller when executing the chain.\n */\nexport type AssetsDataSource = {\n getName(): string;\n assetsMiddleware: Middleware;\n};\n\n/**\n * Wraps a middleware to only execute if specific dataTypes are requested.\n *\n * @param dataTypes - DataTypes that must be in the request for middleware to run\n * @param middleware - The middleware to conditionally execute\n * @returns A middleware that skips execution if none of the dataTypes are requested\n *\n * @example\n * ```typescript\n * // Only runs for metadata requests\n * const metadataMiddleware = forDataTypes(['metadata'], async (ctx, next) => {\n * const result = await next(ctx);\n * // Enrich metadata...\n * return result;\n * });\n *\n * // Runs for balance or price requests\n * const balanceOrPriceMiddleware = forDataTypes(['balance', 'price'], async (ctx, next) => {\n * const result = await next(ctx);\n * // Process balances or prices...\n * return result;\n * });\n * ```\n */\nexport function forDataTypes(\n dataTypes: DataType[],\n middleware: Middleware,\n): Middleware {\n return async (ctx, next) => {\n const requestedTypes = ctx.request.dataTypes;\n const shouldRun = dataTypes.some((dt) => requestedTypes.includes(dt));\n\n if (!shouldRun) {\n return next(ctx);\n }\n\n return middleware(ctx, next);\n };\n}\n\n/**\n * Context for fetch operations.\n * Extends base Context - no additional fields needed for fetch.\n */\nexport type FetchContext = Context;\n\n// Legacy aliases for backwards compatibility\nexport type FetchNextFunction = NextFunction;\nexport type FetchMiddleware = Middleware;\n\n/**\n * Subscription response returned when subscribing to asset updates.\n */\nexport type SubscriptionResponse = {\n /** Chains actively subscribed */\n chains: ChainId[];\n /** Account ID being watched */\n accountId: AccountId;\n /** Asset types being watched */\n assetTypes: AssetType[];\n /** Data types being kept fresh */\n dataTypes: DataType[];\n /** Cleanup function */\n unsubscribe: () => void;\n};\n\n// ============================================================================\n// COMBINED ASSET TYPE (for UI)\n// ============================================================================\n\n/**\n * Combined asset type matching state structure: balance, metadata, price\n */\nexport type Asset = {\n /** CAIP-19 asset ID */\n id: Caip19AssetId;\n /** CAIP-2 chain ID (extracted from id) */\n chainId: ChainId;\n /** Balance data */\n balance: AssetBalance;\n /** Metadata (symbol, name, decimals, etc.) */\n metadata: AssetMetadata;\n /** Price data */\n price: AssetPrice;\n /** Computed fiat value (balance × price) */\n fiatValue: number;\n};\n\n// ============================================================================\n// EVENT TYPES\n// ============================================================================\n\n/**\n * Event emitted when balances change\n */\nexport type BalanceChangeEvent = {\n accountId: AccountId;\n assetId: Caip19AssetId;\n previousAmount: string;\n newAmount: string;\n timestamp: number;\n};\n\n/**\n * Event emitted when prices change\n */\nexport type PriceChangeEvent = {\n assetIds: Caip19AssetId[];\n timestamp: number;\n};\n\n/**\n * Event emitted when metadata changes\n */\nexport type MetadataChangeEvent = {\n assetId: Caip19AssetId;\n changes: Partial<AssetMetadata>;\n};\n\n/**\n * Event emitted when assets without metadata are detected\n */\nexport type AssetsDetectedEvent = {\n accountId: AccountId;\n assetIds: Caip19AssetId[];\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,EACvB,4CAAqD,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
2
|
-
//# sourceMappingURL=constants.
|
|
2
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GACvB,4CAAqD,CAAC","sourcesContent":["export const ZERO_ADDRESS =\n '0x0000000000000000000000000000000000000000' as const;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Caip19AssetId, ChainId } from
|
|
1
|
+
import type { Caip19AssetId, ChainId } from '../types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Inputs needed to decide whether `RpcDataSource` should run a supplemental
|
|
4
4
|
* `customAssetsOnly` subscription. All inputs are pre-computed by the caller
|
|
@@ -57,4 +57,4 @@ export type RpcCustomAssetsSupplementResult = {
|
|
|
57
57
|
* @returns Chains and account IDs that require supplemental subscription.
|
|
58
58
|
*/
|
|
59
59
|
export declare function pickRpcCustomAssetsSupplement(input: RpcCustomAssetsSupplementInput): RpcCustomAssetsSupplementResult;
|
|
60
|
-
//# sourceMappingURL=customAssetsRpcSupplement.d.
|
|
60
|
+
//# sourceMappingURL=customAssetsRpcSupplement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customAssetsRpcSupplement.d.ts","sourceRoot":"","sources":["../../src/utils/customAssetsRpcSupplement.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1D;;;;GAIG;AACH,MAAM,MAAM,8BAA8B,GAAG;IAC3C,8DAA8D;IAC9D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kEAAkE;IAClE,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IACvD,0DAA0D;IAC1D,iBAAiB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,uEAAuE;IACvE,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC;;;OAGG;IACH,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,yEAAyE;IACzE,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,0EAA0E;IAC1E,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,8BAA8B,GACpC,+BAA+B,CA8CjC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { parseCaipAssetType } from
|
|
1
|
+
import { parseCaipAssetType } from '@metamask/utils';
|
|
2
2
|
/**
|
|
3
3
|
* Decide which chains require a supplemental `customAssetsOnly` RPC
|
|
4
4
|
* subscription so that user-imported customAssets are **always** polled by
|
|
@@ -65,4 +65,4 @@ export function pickRpcCustomAssetsSupplement(input) {
|
|
|
65
65
|
accountIds: supplementalAccountIds,
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
|
-
//# sourceMappingURL=customAssetsRpcSupplement.
|
|
68
|
+
//# sourceMappingURL=customAssetsRpcSupplement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customAssetsRpcSupplement.js","sourceRoot":"","sources":["../../src/utils/customAssetsRpcSupplement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAoCrD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,6BAA6B,CAC3C,KAAqC;IAErC,MAAM,EACJ,UAAU,EACV,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,GACd,GAAG,KAAK,CAAC;IAEV,MAAM,MAAM,GAAG,IAAI,GAAG,EAAW,CAAC;IAClC,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvD,SAAS;QACX,CAAC;QACD,0EAA0E;QAC1E,sEAAsE;QACtE,uEAAuE;QACvE,uDAAuD;QACvD,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,IAAI,OAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,SAAS;YACX,CAAC;YACD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,SAAS;YACX,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;QACnB,UAAU,EAAE,sBAAsB;KACnC,CAAC;AACJ,CAAC","sourcesContent":["import { parseCaipAssetType } from '@metamask/utils';\n\nimport type { Caip19AssetId, ChainId } from '../types.js';\n\n/**\n * Inputs needed to decide whether `RpcDataSource` should run a supplemental\n * `customAssetsOnly` subscription. All inputs are pre-computed by the caller\n * (controller) so this helper is fully pure and deterministic.\n */\nexport type RpcCustomAssetsSupplementInput = {\n /** Selected account IDs being considered for subscription. */\n accountIds: string[];\n /** `state.customAssets` slice — accountId → CAIP-19 asset IDs. */\n customAssetsByAccount: Record<string, Caip19AssetId[]>;\n /** Chains the regular RPC subscription already covers. */\n rpcAssignedChains: Set<ChainId>;\n /** Chains the RPC data source can serve (its current activeChains). */\n rpcAvailableChains: Set<ChainId>;\n /**\n * Chains that are currently enabled for at least one selected account\n * (i.e. keys of the controller's chainToAccounts map).\n */\n enabledChains: Set<ChainId>;\n};\n\n/**\n * The decision output: which chains and accounts need a supplemental\n * `customAssetsOnly` RPC subscription.\n */\nexport type RpcCustomAssetsSupplementResult = {\n /** Chains that need a supplemental customAssetsOnly RPC subscription. */\n chains: ChainId[];\n /** Accounts that own at least one customAsset on a supplemental chain. */\n accountIds: Set<string>;\n};\n\n/**\n * Decide which chains require a supplemental `customAssetsOnly` RPC\n * subscription so that user-imported customAssets are **always** polled by\n * RPC — even when AccountsApi or the websocket data source has already\n * claimed the chain in the regular handoff.\n *\n * RPC is the sole balance fetcher for customAssets:\n * - AccountsApi indexes a curated token list and may return zero (or no\n * entry at all) for a user-imported token, even on supported chains.\n * - The websocket data source is push-only: it relays balance deltas from\n * transactions, so a user who never transacts won't see balance updates.\n *\n * To guarantee freshness, we subscribe RPC in `customAssetsOnly` mode on\n * any chain that:\n * 1. has at least one selected account with a customAsset there;\n * 2. is supported by the RPC data source;\n * 3. is **not** already covered by the regular RPC subscription\n * (`rpcAssignedChains`) — otherwise customAssets are picked up there;\n * 4. is currently enabled (in `chainToAccounts`); polling a disabled\n * chain wastes resources because the user can't see its balances.\n *\n * Malformed asset IDs are silently skipped — they can't be parsed into a\n * chain anyway and shouldn't crash the subscription pipeline.\n *\n * @param input - Decision inputs.\n * @returns Chains and account IDs that require supplemental subscription.\n */\nexport function pickRpcCustomAssetsSupplement(\n input: RpcCustomAssetsSupplementInput,\n): RpcCustomAssetsSupplementResult {\n const {\n accountIds,\n customAssetsByAccount,\n rpcAssignedChains,\n rpcAvailableChains,\n enabledChains,\n } = input;\n\n const chains = new Set<ChainId>();\n const supplementalAccountIds = new Set<string>();\n\n for (const accountId of accountIds) {\n const customForAccount = customAssetsByAccount[accountId];\n if (!customForAccount || customForAccount.length === 0) {\n continue;\n }\n // Mirror the controller's prior behavior: an account with any customAsset\n // (even if all are filtered out below) is added to the candidate set.\n // The empty-chains early-return in the caller still prevents a useless\n // subscription, so this preserves observable behavior.\n supplementalAccountIds.add(accountId);\n for (const assetId of customForAccount) {\n let chainId: ChainId;\n try {\n chainId = parseCaipAssetType(assetId).chainId;\n } catch {\n continue;\n }\n if (rpcAssignedChains.has(chainId)) {\n continue;\n }\n if (!rpcAvailableChains.has(chainId)) {\n continue;\n }\n if (!enabledChains.has(chainId)) {\n continue;\n }\n chains.add(chainId);\n }\n }\n\n return {\n chains: [...chains],\n accountIds: supplementalAccountIds,\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupingBatchFetcher.d.ts","sourceRoot":"","sources":["../../src/utils/dedupingBatchFetcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,IAAI,CACpD,IAAI,EAAE,GAAG,EAAE,KACR,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAEjC,MAAM,MAAM,2BAA2B,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,IAAI;IACnE,sEAAsE;IACtE,UAAU,EAAE,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,oBAAoB,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK;;IAczD,YAAY,OAAO,EAAE,2BAA2B,CAAC,GAAG,EAAE,KAAK,CAAC,EAG3D;IAED;;;;OAIG;IACH,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,cAAc,CAAC,EAAE,EAAE,MAAM,EAE5B;IAED;;;;;;;OAOG;IACG,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAiBpD;IAED;;;OAGG;IACH,UAAU,IAAI,IAAI,CAEjB;IAED;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAIhC;IAED,8CAA8C;IAC9C,OAAO,IAAI,IAAI,CAGd;CAyGF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupingBatchFetcher.js","sourceRoot":"","sources":["../../src/utils/dedupingBatchFetcher.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Executes the underlying batched fetch for a set of keys. Only keys that have\n * a value need to be present in the returned record; keys the source had no\n * data for are simply omitted (they are still marked fresh — see\n * {@link DedupingBatchFetcher.fetch}).\n *\n * @param keys - The keys to fetch (already filtered to stale, not-inflight keys).\n * @returns The fetched values keyed by key.\n */\nexport type BatchFetchFn<Key extends string, Value> = (\n keys: Key[],\n) => Promise<Record<Key, Value>>;\n\nexport type DedupingBatchFetcherOptions<Key extends string, Value> = {\n /** Performs the actual batched fetch for stale, not-inflight keys. */\n fetchBatch: BatchFetchFn<Key, Value>;\n /**\n * Minimum age (ms) before a key is considered stale and re-fetched. Keys\n * fetched more recently than this are skipped entirely.\n */\n freshnessTtlMs: number;\n};\n\n/**\n * Deduplicates batched fetches by key across two dimensions:\n *\n * 1. **Freshness TTL** — keys fetched within `freshnessTtlMs` are skipped\n * entirely. Note the freshness window only starts once a fetch *completes*,\n * so it does not cover requests that are still in flight.\n * 2. **Inflight coalescing** — if a fetch is already in progress for a key,\n * concurrent callers join the existing promise instead of issuing a new\n * request. This covers the request-in-flight window the freshness TTL\n * structurally cannot.\n *\n * Both layers are per-key, so a call for a partially-overlapping set of keys\n * reuses the fresh/inflight keys and only fetches the genuinely-missing ones.\n *\n * The fetch is batched: all stale, not-inflight keys from a single `fetch()`\n * call are passed to `fetchBatch` together, then split into per-key results so\n * each key can be joined independently.\n */\nexport class DedupingBatchFetcher<Key extends string, Value> {\n readonly #fetchBatch: BatchFetchFn<Key, Value>;\n\n #freshnessTtlMs: number;\n\n /** Tracks the last successful fetch time per key (freshness gating). */\n readonly #fetchedAt = new Map<Key, number>();\n\n /**\n * Per-key inflight fetch promises. Each resolves to the value, or `undefined`\n * if the batch failed or returned no data for that key.\n */\n readonly #inflight = new Map<Key, Promise<Value | undefined>>();\n\n constructor(options: DedupingBatchFetcherOptions<Key, Value>) {\n this.#fetchBatch = options.fetchBatch;\n this.#freshnessTtlMs = options.freshnessTtlMs;\n }\n\n /**\n * Minimum age (ms) before a key is re-fetched.\n *\n * @returns The current freshness TTL in milliseconds.\n */\n get freshnessTtlMs(): number {\n return this.#freshnessTtlMs;\n }\n\n set freshnessTtlMs(ms: number) {\n this.#freshnessTtlMs = ms;\n }\n\n /**\n * Fetch values for the given keys, deduplicating against fresh and inflight\n * fetches.\n *\n * @param keys - The keys to fetch.\n * @returns Values keyed by key. Only contains entries for keys that were\n * actually fetched (or joined from inflight) and had a value.\n */\n async fetch(keys: Key[]): Promise<Record<Key, Value>> {\n const { staleKeys, inflightKeys } = this.#partition(keys);\n\n if (staleKeys.length === 0 && inflightKeys.length === 0) {\n return {} as Record<Key, Value>;\n }\n\n // Start a fetch for stale keys and join any fetches already in progress.\n const batchPromise =\n staleKeys.length > 0 ? this.#startBatchFetch(staleKeys) : undefined;\n const values = await this.#joinInflight(inflightKeys);\n\n if (batchPromise) {\n Object.assign(values, await batchPromise);\n }\n\n return values;\n }\n\n /**\n * Clear the freshness cache, forcing the next fetch to re-request every key\n * regardless of TTL. Does not affect inflight fetches.\n */\n invalidate(): void {\n this.#fetchedAt.clear();\n }\n\n /**\n * Clear freshness for specific keys only, forcing the next fetch to\n * re-request those keys regardless of TTL. Does not affect inflight fetches.\n *\n * @param keys - Keys to mark stale.\n */\n invalidateKeys(keys: Key[]): void {\n for (const key of keys) {\n this.#fetchedAt.delete(key);\n }\n }\n\n /** Clear all freshness and inflight state. */\n destroy(): void {\n this.#fetchedAt.clear();\n this.#inflight.clear();\n }\n\n /**\n * Split keys into those that need a fresh fetch and those already being\n * fetched by another caller. Keys still within the freshness TTL are dropped.\n *\n * @param keys - The keys to classify.\n * @returns `staleKeys` (need fetching) and `inflightKeys` (join existing fetch).\n */\n #partition(keys: Key[]): { staleKeys: Key[]; inflightKeys: Key[] } {\n const now = Date.now();\n const staleKeys: Key[] = [];\n const inflightKeys: Key[] = [];\n\n for (const key of keys) {\n if (this.#isFresh(key, now)) {\n continue;\n }\n if (this.#inflight.has(key)) {\n inflightKeys.push(key);\n } else {\n staleKeys.push(key);\n }\n }\n\n return { staleKeys, inflightKeys };\n }\n\n /**\n * Returns true if the key's last fetch is still within the freshness TTL.\n *\n * @param key - The key to check.\n * @param now - Current timestamp (avoids repeated clock reads).\n * @returns True if the key was fetched within the freshness TTL.\n */\n #isFresh(key: Key, now: number): boolean {\n const fetchedAt = this.#fetchedAt.get(key);\n return fetchedAt !== undefined && now - fetchedAt < this.#freshnessTtlMs;\n }\n\n /**\n * Launch a batch fetch and register a per-key inflight promise for each key\n * so concurrent callers can join. On success, all requested keys are marked\n * fresh — including keys the source returned no value for, since the absence\n * of a value is itself a valid answer that should not be re-asked until the\n * TTL expires. A failed batch leaves keys stale so they are retried.\n *\n * @param staleKeys - Keys to fetch (none of which are already inflight).\n * @returns The batch fetch promise.\n */\n #startBatchFetch(staleKeys: Key[]): Promise<Record<Key, Value>> {\n const batchPromise = this.#fetchBatch(staleKeys).then((values) => {\n const fetchedAt = Date.now();\n for (const key of staleKeys) {\n this.#fetchedAt.set(key, fetchedAt);\n }\n return values;\n });\n\n for (const key of staleKeys) {\n const perKey = batchPromise.then(\n (values) => values[key],\n () => undefined,\n );\n this.#inflight.set(key, perKey);\n }\n\n // Clean up inflight entries once the batch settles (success or failure).\n // Rejection is already surfaced to the caller via the returned batchPromise.\n batchPromise\n .finally(() => {\n for (const key of staleKeys) {\n this.#inflight.delete(key);\n }\n })\n .catch(() => undefined);\n\n return batchPromise;\n }\n\n /**\n * Join the inflight fetches for the given keys and collect their values. Keys\n * whose inflight fetch produced no value are omitted.\n *\n * @param inflightKeys - Keys whose fetches are already in progress.\n * @returns Values keyed by key.\n */\n async #joinInflight(inflightKeys: Key[]): Promise<Record<Key, Value>> {\n const values = {} as Record<Key, Value>;\n\n const results = await Promise.all(\n inflightKeys.map(async (key) => {\n const value = await this.#inflight.get(key);\n return [key, value] as const;\n }),\n );\n\n for (const [key, value] of results) {\n if (value !== undefined) {\n values[key] = value;\n }\n }\n\n return values;\n }\n}\n"]}
|
|
@@ -8,4 +8,4 @@
|
|
|
8
8
|
* @returns The task's resolved value when it wins the race.
|
|
9
9
|
*/
|
|
10
10
|
export declare function fetchWithTimeout<Value>(task: () => Promise<Value>, timeoutMs: number): Promise<Value>;
|
|
11
|
-
//# sourceMappingURL=fetchWithTimeout.d.
|
|
11
|
+
//# sourceMappingURL=fetchWithTimeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWithTimeout.d.ts","sourceRoot":"","sources":["../../src/utils/fetchWithTimeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAC1C,IAAI,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC,CAchB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWithTimeout.js","sourceRoot":"","sources":["../../src/utils/fetchWithTimeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAA0B,EAC1B,SAAiB;IAEjB,IAAI,SAAoD,CAAC;IACzD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;QAC7D,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,SAAS,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACtD,CAAC;YAAS,CAAC;QACT,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["/**\n * Race an async task against a timeout. The returned promise rejects with\n * `new Error('Fetch timed out after <n>ms')` when the timeout wins, letting\n * the caller handle timeouts identically to network errors.\n *\n * @param task - The async task to run (e.g. the raw API call).\n * @param timeoutMs - The timeout in milliseconds.\n * @returns The task's resolved value when it wins the race.\n */\nexport async function fetchWithTimeout<Value>(\n task: () => Promise<Value>,\n timeoutMs: number,\n): Promise<Value> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`Fetch timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n try {\n return await Promise.race([task(), timeoutPromise]);\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CurrencyRateState, MultichainAssetsRatesControllerState, TokenRatesControllerState } from
|
|
2
|
-
import type { AssetMetadata, AssetPrice } from
|
|
1
|
+
import { CurrencyRateState, MultichainAssetsRatesControllerState, TokenRatesControllerState } from '@metamask/assets-controllers';
|
|
2
|
+
import type { AssetMetadata, AssetPrice } from '../types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Exchange rates in the format expected by the bridge controller:
|
|
5
5
|
* conversionRates (MultichainAssetsRatesController) + currencyRates (CurrencyRateController)
|
|
@@ -40,4 +40,4 @@ export declare function formatExchangeRatesForBridge(params: FormatExchangeRates
|
|
|
40
40
|
* Clears the {@link formatExchangeRatesForBridge} memoize cache. Exported for tests.
|
|
41
41
|
*/
|
|
42
42
|
export declare function clearFormatExchangeRatesForBridgeCacheForTesting(): void;
|
|
43
|
-
//# sourceMappingURL=formatExchangeRatesForBridge.d.
|
|
43
|
+
//# sourceMappingURL=formatExchangeRatesForBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatExchangeRatesForBridge.d.ts","sourceRoot":"","sources":["../../src/utils/formatExchangeRatesForBridge.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAGjB,oCAAoC,EACpC,yBAAyB,EAE1B,MAAM,8BAA8B,CAAC;AAKtC,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EAGX,MAAM,aAAa,CAAC;AAErB;;;;GAIG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,eAAe,EAAE,oCAAoC,CAAC,iBAAiB,CAAC,CAAC;IACzE,aAAa,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAClD,UAAU,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACpD,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,kCAAkC,GAAG;IAC/C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,8BAA8B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9E,CAAC;AAOF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,kCAAkC,GACzC,yBAAyB,CAkB3B;AAED;;GAEG;AACH,wBAAgB,gDAAgD,IAAI,IAAI,CAEvE"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { toChecksumAddress } from
|
|
2
|
-
import { MAP_CAIP_CURRENCIES, getNativeTokenAddress } from
|
|
3
|
-
import { KnownCaipNamespace, numberToHex } from
|
|
4
|
-
import { parseCaipAssetType, parseCaipChainId } from
|
|
5
|
-
import
|
|
6
|
-
const { isEqual } = $lodash;
|
|
1
|
+
import { toChecksumAddress } from '@ethereumjs/util';
|
|
2
|
+
import { MAP_CAIP_CURRENCIES, getNativeTokenAddress, } from '@metamask/assets-controllers';
|
|
3
|
+
import { KnownCaipNamespace, numberToHex } from '@metamask/utils';
|
|
4
|
+
import { parseCaipAssetType, parseCaipChainId } from '@metamask/utils';
|
|
5
|
+
import { isEqual } from 'lodash-es';
|
|
7
6
|
let lastCall = null;
|
|
8
7
|
/**
|
|
9
8
|
* Converts AssetsController state (assetsPrice, selectedCurrency) into the
|
|
@@ -154,4 +153,4 @@ function computeExchangeRatesForBridge(params) {
|
|
|
154
153
|
currentCurrency: selectedCurrency,
|
|
155
154
|
};
|
|
156
155
|
}
|
|
157
|
-
//# sourceMappingURL=formatExchangeRatesForBridge.
|
|
156
|
+
//# sourceMappingURL=formatExchangeRatesForBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatExchangeRatesForBridge.js","sourceRoot":"","sources":["../../src/utils/formatExchangeRatesForBridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { toChecksumAddress } from '@ethereumjs/util';\nimport {\n CurrencyRateState,\n MAP_CAIP_CURRENCIES,\n MarketDataDetails,\n MultichainAssetsRatesControllerState,\n TokenRatesControllerState,\n getNativeTokenAddress,\n} from '@metamask/assets-controllers';\nimport { Hex, KnownCaipNamespace, numberToHex } from '@metamask/utils';\nimport { parseCaipAssetType, parseCaipChainId } from '@metamask/utils';\nimport { isEqual } from 'lodash-es';\n\nimport type {\n AssetMetadata,\n AssetPrice,\n FungibleAssetPrice,\n Caip19AssetId,\n} from '../types.js';\n\n/**\n * Exchange rates in the format expected by the bridge controller:\n * conversionRates (MultichainAssetsRatesController) + currencyRates (CurrencyRateController)\n * + marketData (TokenRatesController) + currentCurrency.\n */\nexport type BridgeExchangeRatesFormat = {\n conversionRates: MultichainAssetsRatesControllerState['conversionRates'];\n currencyRates: CurrencyRateState['currencyRates'];\n marketData: TokenRatesControllerState['marketData'];\n currentCurrency: string;\n};\n\n/** Parameters accepted by {@link formatExchangeRatesForBridge}. */\nexport type FormatExchangeRatesForBridgeParams = {\n assetsInfo: Record<string, AssetMetadata>;\n assetsPrice: Record<string, AssetPrice>;\n selectedCurrency: string;\n nativeAssetIdentifiers: Record<string, string>;\n networkConfigurationsByChainId?: Record<string, { nativeCurrency?: string }>;\n};\n\nlet lastCall: {\n params: FormatExchangeRatesForBridgeParams;\n result: BridgeExchangeRatesFormat;\n} | null = null;\n\n/**\n * Converts AssetsController state (assetsPrice, selectedCurrency) into the\n * same format the bridge expects from MultichainAssetsRatesController,\n * CurrencyRateController, and TokenRatesController so the bridge can use\n * a single action when useAssetsControllerForRates is true.\n *\n * Memoized on input identity for BaseController state slices (`===`) and\n * lodash `isEqual` for rebuilt maps (`nativeAssetIdentifiers`). Bridge quote\n * / rate paths call this repeatedly while assets state is unchanged; recomputing\n * runs keccak256 (`toChecksumAddress`) and CAIP parsing per priced asset.\n *\n * @param params - Conversion parameters.\n * @returns Bridge-compatible conversionRates, currencyRates, marketData, currentCurrency.\n */\nexport function formatExchangeRatesForBridge(\n params: FormatExchangeRatesForBridgeParams,\n): BridgeExchangeRatesFormat {\n if (\n lastCall?.params.assetsInfo === params.assetsInfo &&\n lastCall.params.assetsPrice === params.assetsPrice &&\n lastCall.params.selectedCurrency === params.selectedCurrency &&\n lastCall.params.networkConfigurationsByChainId ===\n params.networkConfigurationsByChainId &&\n isEqual(\n lastCall.params.nativeAssetIdentifiers,\n params.nativeAssetIdentifiers,\n )\n ) {\n return lastCall.result;\n }\n\n const result = computeExchangeRatesForBridge(params);\n lastCall = { params, result };\n return result;\n}\n\n/**\n * Clears the {@link formatExchangeRatesForBridge} memoize cache. Exported for tests.\n */\nexport function clearFormatExchangeRatesForBridgeCacheForTesting(): void {\n lastCall = null;\n}\n\n/**\n * Performs the actual exchange-rate conversion for\n * {@link formatExchangeRatesForBridge}.\n *\n * @param params - Conversion parameters.\n * @returns Bridge-compatible rates.\n */\nfunction computeExchangeRatesForBridge(\n params: FormatExchangeRatesForBridgeParams,\n): BridgeExchangeRatesFormat {\n const {\n assetsInfo,\n assetsPrice,\n selectedCurrency,\n nativeAssetIdentifiers,\n networkConfigurationsByChainId = {},\n } = params;\n const conversionRates: MultichainAssetsRatesControllerState['conversionRates'] =\n {};\n const currencyRates: CurrencyRateState['currencyRates'] = {};\n const marketData: TokenRatesControllerState['marketData'] = {};\n\n const currencyCaip = MAP_CAIP_CURRENCIES[selectedCurrency.toLowerCase()];\n if (!currencyCaip) {\n return {\n conversionRates: {},\n currencyRates: {},\n marketData: {},\n currentCurrency: selectedCurrency,\n };\n }\n\n const fungibleAssetsPrice = Object.entries(assetsPrice).reduce<\n Record<Caip19AssetId, FungibleAssetPrice>\n >((acc, [assetId, priceData]) => {\n if (priceData.assetPriceType === 'fungible') {\n acc[assetId as Caip19AssetId] = priceData;\n }\n return acc;\n }, {});\n\n for (const [assetId, priceData] of Object.entries(fungibleAssetsPrice)) {\n const { price, usdPrice, lastUpdated } = priceData;\n if (price < 0) {\n continue;\n }\n\n const lastUpdatedInSeconds = lastUpdated / 1000;\n const expirationOffsetInSeconds = 60;\n const expirationTime = lastUpdatedInSeconds + expirationOffsetInSeconds;\n\n try {\n const isNative = assetsInfo[assetId]?.type === 'native';\n const parsed = parseCaipAssetType(assetId as Caip19AssetId);\n const chainIdParsed = parseCaipChainId(parsed.chainId);\n\n if (chainIdParsed.namespace === KnownCaipNamespace.Eip155) {\n const chainIdHex = numberToHex(parseInt(chainIdParsed.reference, 10));\n\n const nativeAssetId = (\n isNative ? assetId : nativeAssetIdentifiers[parsed.chainId]\n ) as Caip19AssetId | undefined;\n\n const nativeCurrencySymbol =\n networkConfigurationsByChainId[chainIdHex]?.nativeCurrency;\n\n const nativeAssetUsdPrice =\n nativeAssetId && fungibleAssetsPrice[nativeAssetId]?.usdPrice;\n\n if (\n !nativeAssetId ||\n !nativeCurrencySymbol ||\n nativeAssetUsdPrice === undefined\n ) {\n // If we do not have a native asset for that chain or a price for it, the asset needs to be skipped\n continue;\n }\n\n let tokenAddress: Hex | undefined;\n if (parsed.assetNamespace === 'erc20') {\n tokenAddress = toChecksumAddress(parsed.assetReference);\n } else if (isNative) {\n tokenAddress = toChecksumAddress(getNativeTokenAddress(chainIdHex));\n }\n\n if (tokenAddress) {\n const priceInNative =\n nativeAssetUsdPrice > 0 ? usdPrice / nativeAssetUsdPrice : usdPrice;\n if (!marketData[chainIdHex]) {\n marketData[chainIdHex] = {};\n }\n marketData[chainIdHex][tokenAddress] = {\n ...priceData,\n price: priceInNative,\n currency: nativeCurrencySymbol,\n assetId,\n chainId: chainIdHex,\n tokenAddress,\n } as MarketDataDetails;\n }\n\n if (isNative) {\n currencyRates[nativeCurrencySymbol] = {\n conversionDate: lastUpdatedInSeconds,\n conversionRate: price,\n usdConversionRate: usdPrice,\n };\n }\n } else {\n conversionRates[assetId as Caip19AssetId] = {\n rate: String(price),\n currency: currencyCaip,\n conversionTime: lastUpdatedInSeconds,\n expirationTime,\n marketData: {\n fungible: true,\n allTimeHigh: `${priceData.allTimeHigh}`,\n allTimeLow: `${priceData.allTimeLow}`,\n circulatingSupply: `${priceData.circulatingSupply}`,\n marketCap: `${priceData.marketCap}`,\n totalVolume: `${priceData.totalVolume}`,\n pricePercentChange: {\n PT1H: priceData.pricePercentChange1h as number,\n P1D: priceData.pricePercentChange1d as number,\n P7D: priceData.pricePercentChange7d as number,\n P14D: priceData.pricePercentChange14d as number,\n P30D: priceData.pricePercentChange30d as number,\n P200D: priceData.pricePercentChange200d as number,\n P1Y: priceData.pricePercentChange1y as number,\n },\n },\n } as MultichainAssetsRatesControllerState['conversionRates'][Caip19AssetId];\n }\n } catch {\n // Skip malformed asset IDs\n }\n }\n\n return {\n conversionRates,\n currencyRates,\n marketData,\n currentCurrency: selectedCurrency,\n };\n}\n"]}
|