@metamask-previews/assets-controller 14.0.2-preview-3866c0ff1 → 14.0.2-preview-e3275932a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -1
- package/dist/AssetsController-method-action-types.cjs +7 -0
- package/dist/AssetsController-method-action-types.cjs.map +1 -0
- package/dist/{AssetsController-method-action-types.d.ts → AssetsController-method-action-types.d.cts} +2 -2
- package/dist/AssetsController-method-action-types.d.cts.map +1 -0
- package/dist/AssetsController-method-action-types.d.mts +181 -0
- package/dist/AssetsController-method-action-types.d.mts.map +1 -0
- package/dist/{AssetsController-method-action-types.js → AssetsController-method-action-types.mjs} +1 -1
- package/dist/AssetsController-method-action-types.mjs.map +1 -0
- package/dist/AssetsController.cjs +2596 -0
- package/dist/AssetsController.cjs.map +1 -0
- package/dist/{AssetsController.d.ts → AssetsController.d.cts} +30 -30
- package/dist/AssetsController.d.cts.map +1 -0
- package/dist/AssetsController.d.mts +395 -0
- package/dist/AssetsController.d.mts.map +1 -0
- package/dist/AssetsController.mjs +2589 -0
- package/dist/AssetsController.mjs.map +1 -0
- package/dist/data-sources/AbstractDataSource.cjs +111 -0
- package/dist/data-sources/AbstractDataSource.cjs.map +1 -0
- package/dist/data-sources/{AbstractDataSource.d.ts → AbstractDataSource.d.cts} +2 -2
- package/dist/data-sources/AbstractDataSource.d.cts.map +1 -0
- package/dist/data-sources/AbstractDataSource.d.mts +113 -0
- package/dist/data-sources/AbstractDataSource.d.mts.map +1 -0
- package/dist/data-sources/{AbstractDataSource.js → AbstractDataSource.mjs} +3 -5
- package/dist/data-sources/AbstractDataSource.mjs.map +1 -0
- package/dist/data-sources/AccountActivityDataSource.cjs +267 -0
- package/dist/data-sources/AccountActivityDataSource.cjs.map +1 -0
- package/dist/data-sources/{AccountActivityDataSource.d.ts → AccountActivityDataSource.d.cts} +6 -6
- package/dist/data-sources/AccountActivityDataSource.d.cts.map +1 -0
- package/dist/data-sources/AccountActivityDataSource.d.mts +80 -0
- package/dist/data-sources/AccountActivityDataSource.d.mts.map +1 -0
- package/dist/data-sources/AccountActivityDataSource.mjs +259 -0
- package/dist/data-sources/AccountActivityDataSource.mjs.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.cjs +586 -0
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -0
- package/dist/data-sources/{AccountsApiDataSource.d.ts → AccountsApiDataSource.d.cts} +7 -7
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.d.mts +82 -0
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.mjs +581 -0
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -0
- package/dist/data-sources/PriceDataSource.cjs +466 -0
- package/dist/data-sources/PriceDataSource.cjs.map +1 -0
- package/dist/data-sources/{PriceDataSource.d.ts → PriceDataSource.d.cts} +5 -5
- package/dist/data-sources/PriceDataSource.d.cts.map +1 -0
- package/dist/data-sources/PriceDataSource.d.mts +100 -0
- package/dist/data-sources/PriceDataSource.d.mts.map +1 -0
- package/dist/data-sources/{PriceDataSource.js → PriceDataSource.mjs} +185 -179
- package/dist/data-sources/PriceDataSource.mjs.map +1 -0
- package/dist/data-sources/RpcDataSource.cjs +1021 -0
- package/dist/data-sources/RpcDataSource.cjs.map +1 -0
- package/dist/data-sources/{RpcDataSource.d.ts → RpcDataSource.d.cts} +10 -10
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -0
- package/dist/data-sources/RpcDataSource.d.mts +174 -0
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -0
- package/dist/data-sources/RpcDataSource.mjs +1012 -0
- package/dist/data-sources/RpcDataSource.mjs.map +1 -0
- package/dist/data-sources/SnapDataSource.cjs +443 -0
- package/dist/data-sources/SnapDataSource.cjs.map +1 -0
- package/dist/data-sources/{SnapDataSource.d.ts → SnapDataSource.d.cts} +8 -8
- package/dist/data-sources/SnapDataSource.d.cts.map +1 -0
- package/dist/data-sources/SnapDataSource.d.mts +127 -0
- package/dist/data-sources/SnapDataSource.d.mts.map +1 -0
- package/dist/data-sources/{SnapDataSource.js → SnapDataSource.mjs} +177 -225
- package/dist/data-sources/SnapDataSource.mjs.map +1 -0
- package/dist/data-sources/StakedBalanceDataSource.cjs +616 -0
- package/dist/data-sources/StakedBalanceDataSource.cjs.map +1 -0
- package/dist/data-sources/{StakedBalanceDataSource.d.ts → StakedBalanceDataSource.d.cts} +5 -5
- package/dist/data-sources/StakedBalanceDataSource.d.cts.map +1 -0
- package/dist/data-sources/StakedBalanceDataSource.d.mts +72 -0
- package/dist/data-sources/StakedBalanceDataSource.d.mts.map +1 -0
- package/dist/data-sources/StakedBalanceDataSource.mjs +612 -0
- package/dist/data-sources/StakedBalanceDataSource.mjs.map +1 -0
- package/dist/data-sources/TokenDataSource.cjs +583 -0
- package/dist/data-sources/TokenDataSource.cjs.map +1 -0
- package/dist/data-sources/{TokenDataSource.d.ts → TokenDataSource.d.cts} +5 -5
- package/dist/data-sources/TokenDataSource.d.cts.map +1 -0
- package/dist/data-sources/TokenDataSource.d.mts +81 -0
- package/dist/data-sources/TokenDataSource.d.mts.map +1 -0
- package/dist/data-sources/{TokenDataSource.js → TokenDataSource.mjs} +164 -157
- package/dist/data-sources/TokenDataSource.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs +705 -0
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/{MulticallClient.d.ts → MulticallClient.d.cts} +3 -3
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.mts +65 -0
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/{MulticallClient.js → MulticallClient.mjs} +160 -148
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.cjs +312 -0
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/{TokensApiClient.d.ts → TokensApiClient.d.cts} +2 -2
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.mts +61 -0
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.mjs +308 -0
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.cjs +10 -0
- package/dist/data-sources/evm-rpc-services/clients/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.d.cts +4 -0
- package/dist/data-sources/evm-rpc-services/clients/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.d.mts +4 -0
- package/dist/data-sources/evm-rpc-services/clients/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/clients/index.mjs +3 -0
- package/dist/data-sources/evm-rpc-services/clients/index.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/index.cjs +17 -0
- package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/{index.d.ts → index.d.cts} +5 -5
- package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/index.d.mts +5 -0
- package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/index.mjs +4 -0
- package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +247 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{BalanceFetcher.d.ts → BalanceFetcher.d.cts} +11 -11
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +96 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs +243 -0
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs +132 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{StakedBalanceFetcher.d.ts → StakedBalanceFetcher.d.cts} +14 -13
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts +81 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{StakedBalanceFetcher.js → StakedBalanceFetcher.mjs} +27 -13
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +230 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{TokenDetector.d.ts → TokenDetector.d.cts} +12 -12
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +78 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +226 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.cjs +13 -0
- package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/{index.d.ts → index.d.cts} +4 -4
- package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.mts +4 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.mjs +4 -0
- package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.cjs +3 -0
- package/dist/data-sources/evm-rpc-services/types/assets.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{assets.d.ts → assets.d.cts} +3 -3
- package/dist/data-sources/evm-rpc-services/types/assets.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.d.mts +53 -0
- package/dist/data-sources/evm-rpc-services/types/assets.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/assets.mjs +2 -0
- package/dist/data-sources/evm-rpc-services/types/assets.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.cjs +3 -0
- package/dist/data-sources/evm-rpc-services/types/config.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{config.d.ts → config.d.cts} +2 -2
- package/dist/data-sources/evm-rpc-services/types/config.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.d.mts +18 -0
- package/dist/data-sources/evm-rpc-services/types/config.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/config.mjs +2 -0
- package/dist/data-sources/evm-rpc-services/types/config.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.cjs +3 -0
- package/dist/data-sources/evm-rpc-services/types/core.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{core.d.ts → core.d.cts} +2 -2
- package/dist/data-sources/evm-rpc-services/types/core.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.d.mts +19 -0
- package/dist/data-sources/evm-rpc-services/types/core.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/core.mjs +2 -0
- package/dist/data-sources/evm-rpc-services/types/core.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.cjs +3 -0
- package/dist/data-sources/evm-rpc-services/types/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.d.cts +7 -0
- package/dist/data-sources/evm-rpc-services/types/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.d.mts +7 -0
- package/dist/data-sources/evm-rpc-services/types/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/index.mjs +2 -0
- package/dist/data-sources/evm-rpc-services/types/index.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.cjs +3 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{multicall.d.ts → multicall.d.cts} +2 -2
- package/dist/data-sources/evm-rpc-services/types/multicall.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.d.mts +24 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.mjs +2 -0
- package/dist/data-sources/evm-rpc-services/types/multicall.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.cjs +3 -0
- package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{services.d.ts → services.d.cts} +3 -3
- package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.mts +70 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/services.mjs +2 -0
- package/dist/data-sources/evm-rpc-services/types/services.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.cjs +3 -0
- package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/{state.d.ts → state.d.cts} +2 -2
- package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.d.mts +58 -0
- package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/types/state.mjs +2 -0
- package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/assets.cjs +9 -0
- package/dist/data-sources/evm-rpc-services/utils/assets.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{assets.d.ts → assets.d.cts} +2 -2
- package/dist/data-sources/evm-rpc-services/utils/assets.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/assets.d.mts +3 -0
- package/dist/data-sources/evm-rpc-services/utils/assets.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{assets.js → assets.mjs} +2 -2
- package/dist/data-sources/evm-rpc-services/utils/assets.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.cjs +45 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{batch.d.ts → batch.d.cts} +1 -1
- package/dist/data-sources/evm-rpc-services/utils/batch.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.d.mts +28 -0
- package/dist/data-sources/evm-rpc-services/utils/batch.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{batch.js → batch.mjs} +1 -1
- package/dist/data-sources/evm-rpc-services/utils/batch.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.cjs +15 -0
- package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts +4 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts +4 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/index.mjs +4 -0
- package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.cjs +47 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{parsing.d.ts → parsing.d.cts} +3 -3
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts +25 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{parsing.js → parsing.mjs} +3 -3
- package/dist/data-sources/evm-rpc-services/utils/parsing.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs +68 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{staking-contracts.d.ts → staking-contracts.d.cts} +1 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts +25 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/{staking-contracts.js → staking-contracts.mjs} +3 -3
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs.map +1 -0
- package/dist/data-sources/index.cjs +30 -0
- package/dist/data-sources/index.cjs.map +1 -0
- package/dist/data-sources/{index.d.ts → index.d.cts} +9 -9
- package/dist/data-sources/index.d.cts.map +1 -0
- package/dist/data-sources/index.d.mts +9 -0
- package/dist/data-sources/index.d.mts.map +1 -0
- package/dist/data-sources/index.mjs +14 -0
- package/dist/data-sources/index.mjs.map +1 -0
- package/dist/defaults.cjs +125 -0
- package/dist/defaults.cjs.map +1 -0
- package/dist/{defaults.d.ts → defaults.d.cts} +2 -2
- package/dist/defaults.d.cts.map +1 -0
- package/dist/defaults.d.mts +50 -0
- package/dist/defaults.d.mts.map +1 -0
- package/dist/{defaults.js → defaults.mjs} +1 -1
- package/dist/defaults.mjs.map +1 -0
- package/dist/errors.cjs +25 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/{errors.d.ts → errors.d.cts} +1 -1
- package/dist/errors.d.cts.map +1 -0
- package/dist/errors.d.mts +25 -0
- package/dist/errors.d.mts.map +1 -0
- package/dist/{errors.js → errors.mjs} +1 -7
- package/dist/errors.mjs.map +1 -0
- package/dist/index.cjs +67 -0
- package/dist/index.cjs.map +1 -0
- package/dist/{index.d.ts → index.d.cts} +26 -26
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +26 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/{index.js → index.mjs} +13 -13
- package/dist/index.mjs.map +1 -0
- package/dist/logger.cjs +7 -0
- package/dist/logger.cjs.map +1 -0
- package/dist/logger.d.cts +5 -0
- package/dist/logger.d.cts.map +1 -0
- package/dist/logger.d.mts +5 -0
- package/dist/logger.d.mts.map +1 -0
- package/dist/logger.mjs +4 -0
- package/dist/logger.mjs.map +1 -0
- package/dist/middlewares/CustomAssetGraduationMiddleware.cjs +132 -0
- package/dist/middlewares/CustomAssetGraduationMiddleware.cjs.map +1 -0
- package/dist/middlewares/{CustomAssetGraduationMiddleware.d.ts → CustomAssetGraduationMiddleware.d.cts} +2 -2
- package/dist/middlewares/CustomAssetGraduationMiddleware.d.cts.map +1 -0
- package/dist/middlewares/CustomAssetGraduationMiddleware.d.mts +32 -0
- package/dist/middlewares/CustomAssetGraduationMiddleware.d.mts.map +1 -0
- package/dist/middlewares/{CustomAssetGraduationMiddleware.js → CustomAssetGraduationMiddleware.mjs} +25 -12
- package/dist/middlewares/CustomAssetGraduationMiddleware.mjs.map +1 -0
- package/dist/middlewares/DetectionMiddleware.cjs +154 -0
- package/dist/middlewares/DetectionMiddleware.cjs.map +1 -0
- package/dist/middlewares/{DetectionMiddleware.d.ts → DetectionMiddleware.d.cts} +2 -2
- package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -0
- package/dist/middlewares/DetectionMiddleware.d.mts +40 -0
- package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -0
- package/dist/middlewares/{DetectionMiddleware.js → DetectionMiddleware.mjs} +7 -5
- package/dist/middlewares/DetectionMiddleware.mjs.map +1 -0
- package/dist/middlewares/ParallelMiddleware.cjs +263 -0
- package/dist/middlewares/ParallelMiddleware.cjs.map +1 -0
- package/dist/middlewares/{ParallelMiddleware.d.ts → ParallelMiddleware.d.cts} +2 -2
- package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -0
- package/dist/middlewares/ParallelMiddleware.d.mts +41 -0
- package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -0
- package/dist/middlewares/{ParallelMiddleware.js → ParallelMiddleware.mjs} +11 -4
- package/dist/middlewares/ParallelMiddleware.mjs.map +1 -0
- package/dist/middlewares/RpcFallbackMiddleware.cjs +90 -0
- package/dist/middlewares/RpcFallbackMiddleware.cjs.map +1 -0
- package/dist/middlewares/{RpcFallbackMiddleware.d.ts → RpcFallbackMiddleware.d.cts} +2 -2
- package/dist/middlewares/RpcFallbackMiddleware.d.cts.map +1 -0
- package/dist/middlewares/RpcFallbackMiddleware.d.mts +23 -0
- package/dist/middlewares/RpcFallbackMiddleware.d.mts.map +1 -0
- package/dist/middlewares/{RpcFallbackMiddleware.js → RpcFallbackMiddleware.mjs} +21 -8
- package/dist/middlewares/RpcFallbackMiddleware.mjs.map +1 -0
- package/dist/middlewares/index.cjs +14 -0
- package/dist/middlewares/index.cjs.map +1 -0
- package/dist/middlewares/index.d.cts +9 -0
- package/dist/middlewares/index.d.cts.map +1 -0
- package/dist/middlewares/index.d.mts +9 -0
- package/dist/middlewares/index.d.mts.map +1 -0
- package/dist/middlewares/index.mjs +5 -0
- package/dist/middlewares/index.mjs.map +1 -0
- package/dist/migrations/healAssetsInfoMetadata.cjs +539 -0
- package/dist/migrations/healAssetsInfoMetadata.cjs.map +1 -0
- package/dist/migrations/{healAssetsInfoMetadata.d.ts → healAssetsInfoMetadata.d.cts} +5 -5
- package/dist/migrations/healAssetsInfoMetadata.d.cts.map +1 -0
- package/dist/migrations/healAssetsInfoMetadata.d.mts +140 -0
- package/dist/migrations/healAssetsInfoMetadata.d.mts.map +1 -0
- package/dist/migrations/{healAssetsInfoMetadata.js → healAssetsInfoMetadata.mjs} +11 -9
- package/dist/migrations/healAssetsInfoMetadata.mjs.map +1 -0
- package/dist/selectors/balance.cjs +532 -0
- package/dist/selectors/balance.cjs.map +1 -0
- package/dist/selectors/{balance.d.ts → balance.d.cts} +6 -6
- package/dist/selectors/balance.d.cts.map +1 -0
- package/dist/selectors/balance.d.mts +103 -0
- package/dist/selectors/balance.d.mts.map +1 -0
- package/dist/selectors/{balance.js → balance.mjs} +5 -5
- package/dist/selectors/balance.mjs.map +1 -0
- package/dist/types.cjs +39 -0
- package/dist/types.cjs.map +1 -0
- package/dist/{types.d.ts → types.d.cts} +4 -4
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +533 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/{types.js → types.mjs} +1 -1
- package/dist/types.mjs.map +1 -0
- package/dist/utils/constants.cjs +5 -0
- package/dist/utils/constants.cjs.map +1 -0
- package/dist/utils/constants.d.cts +2 -0
- package/dist/utils/constants.d.cts.map +1 -0
- package/dist/utils/constants.d.mts +2 -0
- package/dist/utils/constants.d.mts.map +1 -0
- package/dist/utils/{constants.js → constants.mjs} +1 -1
- package/dist/utils/constants.mjs.map +1 -0
- package/dist/utils/customAssetsRpcSupplement.cjs +72 -0
- package/dist/utils/customAssetsRpcSupplement.cjs.map +1 -0
- package/dist/utils/{customAssetsRpcSupplement.d.ts → customAssetsRpcSupplement.d.cts} +2 -2
- package/dist/utils/customAssetsRpcSupplement.d.cts.map +1 -0
- package/dist/utils/customAssetsRpcSupplement.d.mts +60 -0
- package/dist/utils/customAssetsRpcSupplement.d.mts.map +1 -0
- package/dist/utils/{customAssetsRpcSupplement.js → customAssetsRpcSupplement.mjs} +2 -2
- package/dist/utils/customAssetsRpcSupplement.mjs.map +1 -0
- package/dist/utils/dedupingBatchFetcher.cjs +168 -0
- package/dist/utils/dedupingBatchFetcher.cjs.map +1 -0
- package/dist/utils/{dedupingBatchFetcher.d.ts → dedupingBatchFetcher.d.cts} +1 -1
- package/dist/utils/dedupingBatchFetcher.d.cts.map +1 -0
- package/dist/utils/dedupingBatchFetcher.d.mts +72 -0
- package/dist/utils/dedupingBatchFetcher.d.mts.map +1 -0
- package/dist/utils/dedupingBatchFetcher.mjs +164 -0
- package/dist/utils/dedupingBatchFetcher.mjs.map +1 -0
- package/dist/utils/fetchWithTimeout.cjs +30 -0
- package/dist/utils/fetchWithTimeout.cjs.map +1 -0
- package/dist/utils/{fetchWithTimeout.d.ts → fetchWithTimeout.d.cts} +1 -1
- package/dist/utils/fetchWithTimeout.d.cts.map +1 -0
- package/dist/utils/fetchWithTimeout.d.mts +11 -0
- package/dist/utils/fetchWithTimeout.d.mts.map +1 -0
- package/dist/utils/{fetchWithTimeout.js → fetchWithTimeout.mjs} +1 -1
- package/dist/utils/fetchWithTimeout.mjs.map +1 -0
- package/dist/utils/formatExchangeRatesForBridge.cjs +161 -0
- package/dist/utils/formatExchangeRatesForBridge.cjs.map +1 -0
- package/dist/utils/{formatExchangeRatesForBridge.d.ts → formatExchangeRatesForBridge.d.cts} +3 -3
- package/dist/utils/formatExchangeRatesForBridge.d.cts.map +1 -0
- package/dist/utils/formatExchangeRatesForBridge.d.mts +43 -0
- package/dist/utils/formatExchangeRatesForBridge.d.mts.map +1 -0
- package/dist/utils/{formatExchangeRatesForBridge.js → formatExchangeRatesForBridge.mjs} +7 -6
- package/dist/utils/formatExchangeRatesForBridge.mjs.map +1 -0
- package/dist/utils/formatStateForTransactionPay.cjs +174 -0
- package/dist/utils/formatStateForTransactionPay.cjs.map +1 -0
- package/dist/utils/{formatStateForTransactionPay.d.ts → formatStateForTransactionPay.d.cts} +3 -3
- package/dist/utils/formatStateForTransactionPay.d.cts.map +1 -0
- package/dist/utils/formatStateForTransactionPay.d.mts +72 -0
- package/dist/utils/formatStateForTransactionPay.d.mts.map +1 -0
- package/dist/utils/{formatStateForTransactionPay.js → formatStateForTransactionPay.mjs} +15 -13
- package/dist/utils/formatStateForTransactionPay.mjs.map +1 -0
- package/dist/utils/index.cjs +21 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +9 -0
- package/dist/utils/index.d.cts.map +1 -0
- package/dist/utils/index.d.mts +9 -0
- package/dist/utils/index.d.mts.map +1 -0
- package/dist/utils/index.mjs +7 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/native-assets.cjs +64 -0
- package/dist/utils/native-assets.cjs.map +1 -0
- package/dist/utils/{native-assets.d.ts → native-assets.d.cts} +2 -2
- package/dist/utils/native-assets.d.cts.map +1 -0
- package/dist/utils/native-assets.d.mts +19 -0
- package/dist/utils/native-assets.d.mts.map +1 -0
- package/dist/utils/{native-assets.js → native-assets.mjs} +6 -6
- package/dist/utils/native-assets.mjs.map +1 -0
- package/dist/utils/normalizeAmountString.cjs +64 -0
- package/dist/utils/normalizeAmountString.cjs.map +1 -0
- package/dist/utils/{normalizeAmountString.d.ts → normalizeAmountString.d.cts} +1 -1
- package/dist/utils/normalizeAmountString.d.cts.map +1 -0
- package/dist/utils/normalizeAmountString.d.mts +35 -0
- package/dist/utils/normalizeAmountString.d.mts.map +1 -0
- package/dist/utils/{normalizeAmountString.js → normalizeAmountString.mjs} +2 -2
- package/dist/utils/normalizeAmountString.mjs.map +1 -0
- package/dist/utils/normalizeAssetId.cjs +60 -0
- package/dist/utils/normalizeAssetId.cjs.map +1 -0
- package/dist/utils/{normalizeAssetId.d.ts → normalizeAssetId.d.cts} +3 -3
- package/dist/utils/normalizeAssetId.d.cts.map +1 -0
- package/dist/utils/normalizeAssetId.d.mts +32 -0
- package/dist/utils/normalizeAssetId.d.mts.map +1 -0
- package/dist/utils/{normalizeAssetId.js → normalizeAssetId.mjs} +11 -4
- package/dist/utils/normalizeAssetId.mjs.map +1 -0
- package/dist/utils/snaps-assets-migration.cjs +171 -0
- package/dist/utils/snaps-assets-migration.cjs.map +1 -0
- package/dist/utils/{snaps-assets-migration.d.ts → snaps-assets-migration.d.cts} +5 -5
- package/dist/utils/snaps-assets-migration.d.cts.map +1 -0
- package/dist/utils/snaps-assets-migration.d.mts +113 -0
- package/dist/utils/snaps-assets-migration.d.mts.map +1 -0
- package/dist/utils/{snaps-assets-migration.js → snaps-assets-migration.mjs} +2 -2
- package/dist/utils/snaps-assets-migration.mjs.map +1 -0
- package/dist/utils/trace.cjs +120 -0
- package/dist/utils/trace.cjs.map +1 -0
- package/dist/utils/{trace.d.ts → trace.d.cts} +2 -2
- package/dist/utils/trace.d.cts.map +1 -0
- package/dist/utils/trace.d.mts +52 -0
- package/dist/utils/trace.d.mts.map +1 -0
- package/dist/utils/{trace.js → trace.mjs} +1 -1
- package/dist/utils/trace.mjs.map +1 -0
- package/package.json +17 -14
- package/dist/AssetsController-method-action-types.d.ts.map +0 -1
- package/dist/AssetsController-method-action-types.js.map +0 -1
- package/dist/AssetsController.d.ts.map +0 -1
- package/dist/AssetsController.js +0 -2934
- package/dist/AssetsController.js.map +0 -1
- package/dist/data-sources/AbstractDataSource.d.ts.map +0 -1
- package/dist/data-sources/AbstractDataSource.js.map +0 -1
- package/dist/data-sources/AccountActivityDataSource.d.ts.map +0 -1
- package/dist/data-sources/AccountActivityDataSource.js +0 -272
- package/dist/data-sources/AccountActivityDataSource.js.map +0 -1
- package/dist/data-sources/AccountsApiDataSource.d.ts.map +0 -1
- package/dist/data-sources/AccountsApiDataSource.js +0 -609
- package/dist/data-sources/AccountsApiDataSource.js.map +0 -1
- package/dist/data-sources/PriceDataSource.d.ts.map +0 -1
- package/dist/data-sources/PriceDataSource.js.map +0 -1
- package/dist/data-sources/RpcDataSource.d.ts.map +0 -1
- package/dist/data-sources/RpcDataSource.js +0 -1077
- package/dist/data-sources/RpcDataSource.js.map +0 -1
- package/dist/data-sources/SnapDataSource.d.ts.map +0 -1
- package/dist/data-sources/SnapDataSource.js.map +0 -1
- package/dist/data-sources/StakedBalanceDataSource.d.ts.map +0 -1
- package/dist/data-sources/StakedBalanceDataSource.js +0 -675
- package/dist/data-sources/StakedBalanceDataSource.js.map +0 -1
- package/dist/data-sources/TokenDataSource.d.ts.map +0 -1
- package/dist/data-sources/TokenDataSource.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/MulticallClient.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.js +0 -297
- package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/index.d.ts +0 -4
- package/dist/data-sources/evm-rpc-services/clients/index.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/clients/index.js +0 -3
- package/dist/data-sources/evm-rpc-services/clients/index.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/index.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/index.js +0 -4
- package/dist/data-sources/evm-rpc-services/index.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.js +0 -241
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.js +0 -217
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/index.js +0 -4
- package/dist/data-sources/evm-rpc-services/services/index.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/assets.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/assets.js +0 -2
- package/dist/data-sources/evm-rpc-services/types/assets.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/config.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/config.js +0 -2
- package/dist/data-sources/evm-rpc-services/types/config.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/core.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/core.js +0 -2
- package/dist/data-sources/evm-rpc-services/types/core.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/index.d.ts +0 -7
- package/dist/data-sources/evm-rpc-services/types/index.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/index.js +0 -2
- package/dist/data-sources/evm-rpc-services/types/index.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/multicall.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/multicall.js +0 -2
- package/dist/data-sources/evm-rpc-services/types/multicall.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/services.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/services.js +0 -2
- package/dist/data-sources/evm-rpc-services/types/services.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/state.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/types/state.js +0 -2
- package/dist/data-sources/evm-rpc-services/types/state.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/assets.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/assets.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/batch.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/batch.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/index.d.ts +0 -4
- package/dist/data-sources/evm-rpc-services/utils/index.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/index.js +0 -4
- package/dist/data-sources/evm-rpc-services/utils/index.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.js.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.ts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.js.map +0 -1
- package/dist/data-sources/index.d.ts.map +0 -1
- package/dist/data-sources/index.js +0 -14
- package/dist/data-sources/index.js.map +0 -1
- package/dist/defaults.d.ts.map +0 -1
- package/dist/defaults.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger.d.ts +0 -4
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -4
- package/dist/logger.js.map +0 -1
- package/dist/middlewares/CustomAssetGraduationMiddleware.d.ts.map +0 -1
- package/dist/middlewares/CustomAssetGraduationMiddleware.js.map +0 -1
- package/dist/middlewares/DetectionMiddleware.d.ts.map +0 -1
- package/dist/middlewares/DetectionMiddleware.js.map +0 -1
- package/dist/middlewares/ParallelMiddleware.d.ts.map +0 -1
- package/dist/middlewares/ParallelMiddleware.js.map +0 -1
- package/dist/middlewares/RpcFallbackMiddleware.d.ts.map +0 -1
- package/dist/middlewares/RpcFallbackMiddleware.js.map +0 -1
- package/dist/middlewares/index.d.ts +0 -9
- package/dist/middlewares/index.d.ts.map +0 -1
- package/dist/middlewares/index.js +0 -5
- package/dist/middlewares/index.js.map +0 -1
- package/dist/migrations/healAssetsInfoMetadata.d.ts.map +0 -1
- package/dist/migrations/healAssetsInfoMetadata.js.map +0 -1
- package/dist/selectors/balance.d.ts.map +0 -1
- package/dist/selectors/balance.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils/constants.d.ts +0 -2
- package/dist/utils/constants.d.ts.map +0 -1
- package/dist/utils/constants.js.map +0 -1
- package/dist/utils/customAssetsRpcSupplement.d.ts.map +0 -1
- package/dist/utils/customAssetsRpcSupplement.js.map +0 -1
- package/dist/utils/dedupingBatchFetcher.d.ts.map +0 -1
- package/dist/utils/dedupingBatchFetcher.js +0 -177
- package/dist/utils/dedupingBatchFetcher.js.map +0 -1
- package/dist/utils/fetchWithTimeout.d.ts.map +0 -1
- package/dist/utils/fetchWithTimeout.js.map +0 -1
- package/dist/utils/formatExchangeRatesForBridge.d.ts.map +0 -1
- package/dist/utils/formatExchangeRatesForBridge.js.map +0 -1
- package/dist/utils/formatStateForTransactionPay.d.ts.map +0 -1
- package/dist/utils/formatStateForTransactionPay.js.map +0 -1
- package/dist/utils/index.d.ts +0 -9
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -7
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/native-assets.d.ts.map +0 -1
- package/dist/utils/native-assets.js.map +0 -1
- package/dist/utils/normalizeAmountString.d.ts.map +0 -1
- package/dist/utils/normalizeAmountString.js.map +0 -1
- package/dist/utils/normalizeAssetId.d.ts.map +0 -1
- package/dist/utils/normalizeAssetId.js.map +0 -1
- package/dist/utils/snaps-assets-migration.d.ts.map +0 -1
- package/dist/utils/snaps-assets-migration.js.map +0 -1
- package/dist/utils/trace.d.ts.map +0 -1
- package/dist/utils/trace.js.map +0 -1
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
import { ChainId as ControllerChainId, convertHexToDecimal, } from '@metamask/controller-utils';
|
|
2
|
-
/**
|
|
3
|
-
* Same host + path that `TokenListController` (assets-controllers) uses
|
|
4
|
-
* (`token-service.ts` → `getTokensURL`). Sharing this endpoint keeps the
|
|
5
|
-
* RPC token detector aligned with the rest of the wallet's token listing
|
|
6
|
-
* (occurrence floors, aggregator filters, icon URLs, etc.).
|
|
7
|
-
*/
|
|
8
|
-
const TOKEN_END_POINT_API = 'https://token.api.cx.metamask.io';
|
|
9
|
-
/**
|
|
10
|
-
* Endpoint that returns which CAIP chain IDs the Tokens API supports.
|
|
11
|
-
* Used to skip detection (and avoid unnecessary network requests) for chains
|
|
12
|
-
* that are not in the supported-networks list.
|
|
13
|
-
*/
|
|
14
|
-
const SUPPORTED_NETWORKS_URL = `${TOKEN_END_POINT_API}/v2/supportedNetworks`;
|
|
15
|
-
/**
|
|
16
|
-
* Per-chain suggested occurrence floors used as the `occurrenceFloor` query
|
|
17
|
-
* param when fetching token lists (and aligned with TokenDataSource spam
|
|
18
|
-
* filtering). Keys are decimal chain IDs.
|
|
19
|
-
*/
|
|
20
|
-
const SUGGESTED_OCCURRENCE_FLOORS_URL = `${TOKEN_END_POINT_API}/v1/suggestedOccurrenceFloors`;
|
|
21
|
-
/**
|
|
22
|
-
* Fallback `occurrenceFloor` when `/v1/suggestedOccurrenceFloors` has no entry
|
|
23
|
-
* for the chain, or the floors request fails.
|
|
24
|
-
*/
|
|
25
|
-
const DEFAULT_OCCURRENCE_FLOOR = 3;
|
|
26
|
-
/**
|
|
27
|
-
* How long to keep the supported-networks response in the instance-level
|
|
28
|
-
* cache before refreshing it. One hour is sufficient — the list rarely
|
|
29
|
-
* changes and a stale cache just means we may do an unnecessary token-list
|
|
30
|
-
* fetch for a newly-unsupported chain (harmless).
|
|
31
|
-
*/
|
|
32
|
-
const SUPPORTED_NETWORKS_CACHE_TTL_MS = 60 * 60_000;
|
|
33
|
-
/**
|
|
34
|
-
* How long to keep suggested occurrence floors cached. Same TTL as supported
|
|
35
|
-
* networks — floors change infrequently.
|
|
36
|
-
*/
|
|
37
|
-
const SUGGESTED_OCCURRENCE_FLOORS_CACHE_TTL_MS = 60 * 60_000;
|
|
38
|
-
/**
|
|
39
|
-
* TanStack-Query cache config for the cached `fetchTokenList` path.
|
|
40
|
-
*
|
|
41
|
-
* The Tokens API per-chain list barely changes between polls, so we keep
|
|
42
|
-
* results fresh for a few minutes (`staleTime`) and retain them in cache for
|
|
43
|
-
* an hour (`gcTime`) so re-detections across accounts/chains hit the cache.
|
|
44
|
-
* These tunings only apply when a `queryClient` is provided to the client;
|
|
45
|
-
* the uncached fallback path (used in standalone tests) is unaffected.
|
|
46
|
-
*/
|
|
47
|
-
const TOKEN_LIST_STALE_TIME_MS = 5 * 60_000;
|
|
48
|
-
const TOKEN_LIST_GC_TIME_MS = 60 * 60_000;
|
|
49
|
-
/**
|
|
50
|
-
* Client for the MetaMask Tokens API.
|
|
51
|
-
*
|
|
52
|
-
* Fetches the per-chain ERC-20 token list from the same endpoint that
|
|
53
|
-
* `TokenListController` uses (`token.api.cx.metamask.io/tokens/{chainId}`),
|
|
54
|
-
* with the same query parameters. The `occurrenceFloor` query param comes from
|
|
55
|
-
* Token API `/v1/suggestedOccurrenceFloors` (fallback {@link DEFAULT_OCCURRENCE_FLOOR}),
|
|
56
|
-
* matching `TokenDataSource` spam filtering. Linea's post-response aggregator
|
|
57
|
-
* filter is still applied client-side.
|
|
58
|
-
*
|
|
59
|
-
* Before fetching a chain's token list, the client checks
|
|
60
|
-
* `/v2/supportedNetworks` and returns `[]` immediately for chains that are
|
|
61
|
-
* not in the supported list, avoiding unnecessary API calls. The supported-
|
|
62
|
-
* networks response is cached in-memory for one hour.
|
|
63
|
-
*
|
|
64
|
-
* When constructed with a `queryClient`, token-list results are cached and
|
|
65
|
-
* deduped via TanStack Query (5 min staleTime, 1 h gcTime), so concurrent
|
|
66
|
-
* detection cycles for the same chain coalesce into a single network request.
|
|
67
|
-
*/
|
|
68
|
-
export class TokensApiClient {
|
|
69
|
-
#fetch;
|
|
70
|
-
#queryClient;
|
|
71
|
-
/** CAIP chain IDs returned by `/v2/supportedNetworks` (both tiers). */
|
|
72
|
-
#supportedChainIds;
|
|
73
|
-
/** Timestamp of the last successful `/v2/supportedNetworks` fetch. */
|
|
74
|
-
#supportedChainIdsCachedAt = 0;
|
|
75
|
-
/**
|
|
76
|
-
* In-flight `/v2/supportedNetworks` request shared across concurrent callers
|
|
77
|
-
* so only one network request is made even when multiple `fetchTokenList`
|
|
78
|
-
* calls arrive before the first one resolves.
|
|
79
|
-
*/
|
|
80
|
-
#supportedChainIdsRefreshPromise;
|
|
81
|
-
/** Decimal chain ID → suggested occurrence floor from Token API. */
|
|
82
|
-
#suggestedOccurrenceFloors;
|
|
83
|
-
/** Timestamp of the last successful floors fetch. */
|
|
84
|
-
#suggestedOccurrenceFloorsCachedAt = 0;
|
|
85
|
-
/** In-flight floors request shared across concurrent callers. */
|
|
86
|
-
#suggestedOccurrenceFloorsRefreshPromise;
|
|
87
|
-
constructor(config) {
|
|
88
|
-
this.#fetch = config?.fetch ?? globalThis.fetch.bind(globalThis);
|
|
89
|
-
this.#queryClient = config?.queryClient;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Fetch the list of ERC-20 tokens for a chain from the Tokens API.
|
|
93
|
-
*
|
|
94
|
-
* Returns `[]` immediately (without hitting the token-list endpoint) when
|
|
95
|
-
* the chain is not in the `/v2/supportedNetworks` response, or when the
|
|
96
|
-
* supported-networks check fails for any reason.
|
|
97
|
-
*
|
|
98
|
-
* @param hexChainId - Chain ID in hex format (e.g. `'0x1'` for Ethereum mainnet).
|
|
99
|
-
* @returns Array of token list entries with address and metadata, or an empty
|
|
100
|
-
* array if the chain is unsupported or the request fails.
|
|
101
|
-
*/
|
|
102
|
-
async fetchTokenList(hexChainId) {
|
|
103
|
-
// Treat any error from the supported-networks check as "not supported":
|
|
104
|
-
// the token-list endpoint is only contacted for known-supported chains.
|
|
105
|
-
if (!(await this.#isSupportedChain(hexChainId).catch(() => false))) {
|
|
106
|
-
return [];
|
|
107
|
-
}
|
|
108
|
-
const queryClient = this.#queryClient;
|
|
109
|
-
if (queryClient === undefined) {
|
|
110
|
-
return this.#fetchTokenListUncached(hexChainId);
|
|
111
|
-
}
|
|
112
|
-
return queryClient.fetchQuery({
|
|
113
|
-
// Namespacing keeps this key from colliding with other clients that
|
|
114
|
-
// share the same QueryClient (e.g. core-backend's ApiPlatformClient).
|
|
115
|
-
queryKey: [
|
|
116
|
-
'assets-controller',
|
|
117
|
-
'rpc-detection',
|
|
118
|
-
'token-list',
|
|
119
|
-
{ chainId: hexChainId },
|
|
120
|
-
],
|
|
121
|
-
queryFn: () => this.#fetchTokenListUncached(hexChainId),
|
|
122
|
-
staleTime: TOKEN_LIST_STALE_TIME_MS,
|
|
123
|
-
gcTime: TOKEN_LIST_GC_TIME_MS,
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Check whether the given chain is present in the supported-networks list.
|
|
128
|
-
*
|
|
129
|
-
* Uses an instance-level cache (1 h TTL). Throws if the network request
|
|
130
|
-
* fails — callers should handle this (e.g. via `.catch(() => false)`).
|
|
131
|
-
*
|
|
132
|
-
* @param hexChainId - Hex chain ID to check.
|
|
133
|
-
* @returns `true` when the chain is in the supported-networks list.
|
|
134
|
-
*/
|
|
135
|
-
async #isSupportedChain(hexChainId) {
|
|
136
|
-
const now = Date.now();
|
|
137
|
-
if (this.#supportedChainIds === undefined ||
|
|
138
|
-
now - this.#supportedChainIdsCachedAt >= SUPPORTED_NETWORKS_CACHE_TTL_MS) {
|
|
139
|
-
await this.#refreshSupportedChainIds(now);
|
|
140
|
-
}
|
|
141
|
-
const caipChainId = `eip155:${convertHexToDecimal(hexChainId)}`;
|
|
142
|
-
return this.#supportedChainIds?.has(caipChainId) ?? false;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Fetch `/v2/supportedNetworks` and update the instance cache.
|
|
146
|
-
* Concurrent callers share the same in-flight Promise so only one network
|
|
147
|
-
* request is made. If the response is not 2xx the cache is left unchanged
|
|
148
|
-
* (the chain will be treated as unsupported this cycle).
|
|
149
|
-
*
|
|
150
|
-
* @param now - Current timestamp used to stamp the cache entry.
|
|
151
|
-
* @returns A promise that resolves once the cache has been refreshed.
|
|
152
|
-
*/
|
|
153
|
-
async #refreshSupportedChainIds(now) {
|
|
154
|
-
if (this.#supportedChainIdsRefreshPromise !== undefined) {
|
|
155
|
-
return this.#supportedChainIdsRefreshPromise;
|
|
156
|
-
}
|
|
157
|
-
this.#supportedChainIdsRefreshPromise = (async () => {
|
|
158
|
-
try {
|
|
159
|
-
const response = await this.#fetch(SUPPORTED_NETWORKS_URL);
|
|
160
|
-
if (response.ok) {
|
|
161
|
-
const data = (await response.json());
|
|
162
|
-
this.#supportedChainIds = new Set([
|
|
163
|
-
...(data.fullSupport ?? []),
|
|
164
|
-
...(data.partialSupport ?? []),
|
|
165
|
-
]);
|
|
166
|
-
this.#supportedChainIdsCachedAt = now;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
finally {
|
|
170
|
-
this.#supportedChainIdsRefreshPromise = undefined;
|
|
171
|
-
}
|
|
172
|
-
})();
|
|
173
|
-
return this.#supportedChainIdsRefreshPromise;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Resolve the `occurrenceFloor` query param for a chain from Token API
|
|
177
|
-
* `/v1/suggestedOccurrenceFloors`. Falls back to
|
|
178
|
-
* {@link DEFAULT_OCCURRENCE_FLOOR} when the chain is missing or the request
|
|
179
|
-
* fails.
|
|
180
|
-
*
|
|
181
|
-
* @param hexChainId - Hex chain ID.
|
|
182
|
-
* @returns Occurrence floor to send to `/tokens/{chainId}`.
|
|
183
|
-
*/
|
|
184
|
-
async #getOccurrenceFloor(hexChainId) {
|
|
185
|
-
const now = Date.now();
|
|
186
|
-
if (this.#suggestedOccurrenceFloors === undefined ||
|
|
187
|
-
now - this.#suggestedOccurrenceFloorsCachedAt >=
|
|
188
|
-
SUGGESTED_OCCURRENCE_FLOORS_CACHE_TTL_MS) {
|
|
189
|
-
await this.#refreshSuggestedOccurrenceFloors(now);
|
|
190
|
-
}
|
|
191
|
-
const decimalChainId = String(convertHexToDecimal(hexChainId));
|
|
192
|
-
return (this.#suggestedOccurrenceFloors?.[decimalChainId] ??
|
|
193
|
-
DEFAULT_OCCURRENCE_FLOOR);
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Fetch `/v1/suggestedOccurrenceFloors` and update the instance cache.
|
|
197
|
-
* Concurrent callers share the in-flight Promise. Failures leave the cache
|
|
198
|
-
* empty so {@link #getOccurrenceFloor} falls back to the default.
|
|
199
|
-
*
|
|
200
|
-
* @param now - Current timestamp used to stamp the cache entry.
|
|
201
|
-
* @returns A promise that resolves once the cache has been refreshed.
|
|
202
|
-
*/
|
|
203
|
-
async #refreshSuggestedOccurrenceFloors(now) {
|
|
204
|
-
if (this.#suggestedOccurrenceFloorsRefreshPromise !== undefined) {
|
|
205
|
-
return this.#suggestedOccurrenceFloorsRefreshPromise;
|
|
206
|
-
}
|
|
207
|
-
this.#suggestedOccurrenceFloorsRefreshPromise =
|
|
208
|
-
(async () => {
|
|
209
|
-
try {
|
|
210
|
-
const response = await this.#fetch(SUGGESTED_OCCURRENCE_FLOORS_URL);
|
|
211
|
-
if (response.ok) {
|
|
212
|
-
const data = (await response.json());
|
|
213
|
-
this.#suggestedOccurrenceFloors =
|
|
214
|
-
data && typeof data === 'object' && !Array.isArray(data)
|
|
215
|
-
? data
|
|
216
|
-
: {};
|
|
217
|
-
this.#suggestedOccurrenceFloorsCachedAt = now;
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
this.#suggestedOccurrenceFloors = {};
|
|
221
|
-
this.#suggestedOccurrenceFloorsCachedAt = now;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
catch {
|
|
225
|
-
this.#suggestedOccurrenceFloors = {};
|
|
226
|
-
this.#suggestedOccurrenceFloorsCachedAt = now;
|
|
227
|
-
}
|
|
228
|
-
finally {
|
|
229
|
-
this.#suggestedOccurrenceFloorsRefreshPromise = undefined;
|
|
230
|
-
}
|
|
231
|
-
})();
|
|
232
|
-
return this.#suggestedOccurrenceFloorsRefreshPromise;
|
|
233
|
-
}
|
|
234
|
-
async #fetchTokenListUncached(hexChainId) {
|
|
235
|
-
const decimalChainId = convertHexToDecimal(hexChainId);
|
|
236
|
-
const occurrenceFloor = await this.#getOccurrenceFloor(hexChainId);
|
|
237
|
-
// Same query shape as `TokenListController.getTokensURL` (token-service.ts),
|
|
238
|
-
// but `occurrenceFloor` comes from `/v1/suggestedOccurrenceFloors`.
|
|
239
|
-
// No `first=...` cap — the API returns the full per-chain list bounded
|
|
240
|
-
// server-side by `occurrenceFloor`.
|
|
241
|
-
const url = `${TOKEN_END_POINT_API}/tokens/${decimalChainId}` +
|
|
242
|
-
`?occurrenceFloor=${occurrenceFloor}` +
|
|
243
|
-
`&includeNativeAssets=false` +
|
|
244
|
-
`&includeTokenFees=false` +
|
|
245
|
-
`&includeAssetType=false` +
|
|
246
|
-
`&includeERC20Permit=false` +
|
|
247
|
-
`&includeStorage=false` +
|
|
248
|
-
`&includeRwaData=true`;
|
|
249
|
-
let response;
|
|
250
|
-
try {
|
|
251
|
-
response = await this.#fetch(url);
|
|
252
|
-
}
|
|
253
|
-
catch (error) {
|
|
254
|
-
console.error(`Tokens API request failed for chain ${hexChainId}:`, error);
|
|
255
|
-
return [];
|
|
256
|
-
}
|
|
257
|
-
if (!response.ok) {
|
|
258
|
-
console.error(`Tokens API responded with ${response.status} for chain ${hexChainId}`);
|
|
259
|
-
return [];
|
|
260
|
-
}
|
|
261
|
-
const raw = (await response.json());
|
|
262
|
-
const items = Array.isArray(raw)
|
|
263
|
-
? raw
|
|
264
|
-
: [];
|
|
265
|
-
const filtered = applyChainSpecificFilters(hexChainId, items);
|
|
266
|
-
return filtered.map((item) => ({
|
|
267
|
-
address: item.address,
|
|
268
|
-
symbol: item.symbol ?? '',
|
|
269
|
-
name: item.name ?? '',
|
|
270
|
-
decimals: item.decimals ?? 18,
|
|
271
|
-
iconUrl: item.iconUrl,
|
|
272
|
-
aggregators: item.aggregators,
|
|
273
|
-
occurrences: item.occurrences,
|
|
274
|
-
}));
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Apply chain-specific filters to a raw token list response, mirroring
|
|
279
|
-
* `fetchTokenListByChainId` in `assets-controllers/src/token-service.ts`.
|
|
280
|
-
*
|
|
281
|
-
* For Linea mainnet, the API returns extras with low aggregator coverage, so
|
|
282
|
-
* we keep only entries flagged by Linea's own team or seen by ≥3 aggregators.
|
|
283
|
-
*
|
|
284
|
-
* @param hexChainId - Hex chain ID.
|
|
285
|
-
* @param items - Raw items from the API response.
|
|
286
|
-
* @returns Items after chain-specific filtering.
|
|
287
|
-
*/
|
|
288
|
-
function applyChainSpecificFilters(hexChainId, items) {
|
|
289
|
-
if (hexChainId === ControllerChainId['linea-mainnet']) {
|
|
290
|
-
return items.filter((item) => {
|
|
291
|
-
const aggregators = item.aggregators ?? [];
|
|
292
|
-
return aggregators.includes('lineaTeam') || aggregators.length >= 3;
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
return items;
|
|
296
|
-
}
|
|
297
|
-
//# sourceMappingURL=TokensApiClient.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TokensApiClient.js","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/clients/TokensApiClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChainId as ControllerChainId,\n convertHexToDecimal,\n} from '@metamask/controller-utils';\n\nimport type { ChainId, TokenListEntry } from '../types/index.js';\n\n/**\n * Same host + path that `TokenListController` (assets-controllers) uses\n * (`token-service.ts` → `getTokensURL`). Sharing this endpoint keeps the\n * RPC token detector aligned with the rest of the wallet's token listing\n * (occurrence floors, aggregator filters, icon URLs, etc.).\n */\nconst TOKEN_END_POINT_API = 'https://token.api.cx.metamask.io';\n\n/**\n * Endpoint that returns which CAIP chain IDs the Tokens API supports.\n * Used to skip detection (and avoid unnecessary network requests) for chains\n * that are not in the supported-networks list.\n */\nconst SUPPORTED_NETWORKS_URL = `${TOKEN_END_POINT_API}/v2/supportedNetworks`;\n\n/**\n * Per-chain suggested occurrence floors used as the `occurrenceFloor` query\n * param when fetching token lists (and aligned with TokenDataSource spam\n * filtering). Keys are decimal chain IDs.\n */\nconst SUGGESTED_OCCURRENCE_FLOORS_URL = `${TOKEN_END_POINT_API}/v1/suggestedOccurrenceFloors`;\n\n/**\n * Fallback `occurrenceFloor` when `/v1/suggestedOccurrenceFloors` has no entry\n * for the chain, or the floors request fails.\n */\nconst DEFAULT_OCCURRENCE_FLOOR = 3;\n\n/**\n * How long to keep the supported-networks response in the instance-level\n * cache before refreshing it. One hour is sufficient — the list rarely\n * changes and a stale cache just means we may do an unnecessary token-list\n * fetch for a newly-unsupported chain (harmless).\n */\nconst SUPPORTED_NETWORKS_CACHE_TTL_MS = 60 * 60_000;\n\n/**\n * How long to keep suggested occurrence floors cached. Same TTL as supported\n * networks — floors change infrequently.\n */\nconst SUGGESTED_OCCURRENCE_FLOORS_CACHE_TTL_MS = 60 * 60_000;\n\n/**\n * TanStack-Query cache config for the cached `fetchTokenList` path.\n *\n * The Tokens API per-chain list barely changes between polls, so we keep\n * results fresh for a few minutes (`staleTime`) and retain them in cache for\n * an hour (`gcTime`) so re-detections across accounts/chains hit the cache.\n * These tunings only apply when a `queryClient` is provided to the client;\n * the uncached fallback path (used in standalone tests) is unaffected.\n */\nconst TOKEN_LIST_STALE_TIME_MS = 5 * 60_000;\nconst TOKEN_LIST_GC_TIME_MS = 60 * 60_000;\n\n/**\n * Shape of the `/v2/supportedNetworks` response.\n */\ntype SupportedNetworksResponse = {\n fullSupport?: string[];\n partialSupport?: string[];\n};\n\n/**\n * Shape of a single item returned by the Tokens API `/tokens/{chainId}`\n * endpoint. Mirrors `TokenListToken` in\n * `packages/assets-controllers/src/TokenListController.ts` and the response\n * parsed by `fetchTokenListByChainId` in `token-service.ts`.\n */\ntype ApiTokenListItem = {\n address: string;\n symbol?: string;\n name?: string;\n decimals?: number;\n occurrences?: number;\n aggregators?: string[];\n iconUrl?: string;\n};\n\n/**\n * Minimal structural type for the TanStack Query client method we use.\n * Avoids a direct dependency on `@tanstack/query-core` while still being\n * fully compatible with the shared `QueryClient` exposed by\n * `ApiPlatformClient.queryClient` (`@metamask/core-backend`).\n */\nexport type TokenListQueryClient = {\n fetchQuery<TData>(options: {\n queryKey: readonly unknown[];\n queryFn: () => Promise<TData>;\n staleTime?: number;\n gcTime?: number;\n }): Promise<TData>;\n};\n\nexport type TokensApiClientConfig = {\n /** Fetch function (defaults to globalThis.fetch). */\n fetch?: typeof globalThis.fetch;\n /**\n * Optional TanStack-Query client used to cache token-list responses across\n * detector polls / accounts / instances. When omitted, every call hits the\n * network directly (preserves prior behaviour for tests and standalone use).\n */\n queryClient?: TokenListQueryClient;\n};\n\n/**\n * Client for the MetaMask Tokens API.\n *\n * Fetches the per-chain ERC-20 token list from the same endpoint that\n * `TokenListController` uses (`token.api.cx.metamask.io/tokens/{chainId}`),\n * with the same query parameters. The `occurrenceFloor` query param comes from\n * Token API `/v1/suggestedOccurrenceFloors` (fallback {@link DEFAULT_OCCURRENCE_FLOOR}),\n * matching `TokenDataSource` spam filtering. Linea's post-response aggregator\n * filter is still applied client-side.\n *\n * Before fetching a chain's token list, the client checks\n * `/v2/supportedNetworks` and returns `[]` immediately for chains that are\n * not in the supported list, avoiding unnecessary API calls. The supported-\n * networks response is cached in-memory for one hour.\n *\n * When constructed with a `queryClient`, token-list results are cached and\n * deduped via TanStack Query (5 min staleTime, 1 h gcTime), so concurrent\n * detection cycles for the same chain coalesce into a single network request.\n */\nexport class TokensApiClient {\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #queryClient: TokenListQueryClient | undefined;\n\n /** CAIP chain IDs returned by `/v2/supportedNetworks` (both tiers). */\n #supportedChainIds: Set<string> | undefined;\n\n /** Timestamp of the last successful `/v2/supportedNetworks` fetch. */\n #supportedChainIdsCachedAt = 0;\n\n /**\n * In-flight `/v2/supportedNetworks` request shared across concurrent callers\n * so only one network request is made even when multiple `fetchTokenList`\n * calls arrive before the first one resolves.\n */\n #supportedChainIdsRefreshPromise: Promise<void> | undefined;\n\n /** Decimal chain ID → suggested occurrence floor from Token API. */\n #suggestedOccurrenceFloors: Record<string, number> | undefined;\n\n /** Timestamp of the last successful floors fetch. */\n #suggestedOccurrenceFloorsCachedAt = 0;\n\n /** In-flight floors request shared across concurrent callers. */\n #suggestedOccurrenceFloorsRefreshPromise: Promise<void> | undefined;\n\n constructor(config?: TokensApiClientConfig) {\n this.#fetch = config?.fetch ?? globalThis.fetch.bind(globalThis);\n this.#queryClient = config?.queryClient;\n }\n\n /**\n * Fetch the list of ERC-20 tokens for a chain from the Tokens API.\n *\n * Returns `[]` immediately (without hitting the token-list endpoint) when\n * the chain is not in the `/v2/supportedNetworks` response, or when the\n * supported-networks check fails for any reason.\n *\n * @param hexChainId - Chain ID in hex format (e.g. `'0x1'` for Ethereum mainnet).\n * @returns Array of token list entries with address and metadata, or an empty\n * array if the chain is unsupported or the request fails.\n */\n async fetchTokenList(hexChainId: ChainId): Promise<TokenListEntry[]> {\n // Treat any error from the supported-networks check as \"not supported\":\n // the token-list endpoint is only contacted for known-supported chains.\n if (!(await this.#isSupportedChain(hexChainId).catch(() => false))) {\n return [];\n }\n\n const queryClient = this.#queryClient;\n if (queryClient === undefined) {\n return this.#fetchTokenListUncached(hexChainId);\n }\n\n return queryClient.fetchQuery({\n // Namespacing keeps this key from colliding with other clients that\n // share the same QueryClient (e.g. core-backend's ApiPlatformClient).\n queryKey: [\n 'assets-controller',\n 'rpc-detection',\n 'token-list',\n { chainId: hexChainId },\n ],\n queryFn: () => this.#fetchTokenListUncached(hexChainId),\n staleTime: TOKEN_LIST_STALE_TIME_MS,\n gcTime: TOKEN_LIST_GC_TIME_MS,\n });\n }\n\n /**\n * Check whether the given chain is present in the supported-networks list.\n *\n * Uses an instance-level cache (1 h TTL). Throws if the network request\n * fails — callers should handle this (e.g. via `.catch(() => false)`).\n *\n * @param hexChainId - Hex chain ID to check.\n * @returns `true` when the chain is in the supported-networks list.\n */\n async #isSupportedChain(hexChainId: ChainId): Promise<boolean> {\n const now = Date.now();\n if (\n this.#supportedChainIds === undefined ||\n now - this.#supportedChainIdsCachedAt >= SUPPORTED_NETWORKS_CACHE_TTL_MS\n ) {\n await this.#refreshSupportedChainIds(now);\n }\n\n const caipChainId = `eip155:${convertHexToDecimal(hexChainId)}`;\n return this.#supportedChainIds?.has(caipChainId) ?? false;\n }\n\n /**\n * Fetch `/v2/supportedNetworks` and update the instance cache.\n * Concurrent callers share the same in-flight Promise so only one network\n * request is made. If the response is not 2xx the cache is left unchanged\n * (the chain will be treated as unsupported this cycle).\n *\n * @param now - Current timestamp used to stamp the cache entry.\n * @returns A promise that resolves once the cache has been refreshed.\n */\n async #refreshSupportedChainIds(now: number): Promise<void> {\n if (this.#supportedChainIdsRefreshPromise !== undefined) {\n return this.#supportedChainIdsRefreshPromise;\n }\n\n this.#supportedChainIdsRefreshPromise = (async (): Promise<void> => {\n try {\n const response = await this.#fetch(SUPPORTED_NETWORKS_URL);\n if (response.ok) {\n const data = (await response.json()) as SupportedNetworksResponse;\n this.#supportedChainIds = new Set([\n ...(data.fullSupport ?? []),\n ...(data.partialSupport ?? []),\n ]);\n this.#supportedChainIdsCachedAt = now;\n }\n } finally {\n this.#supportedChainIdsRefreshPromise = undefined;\n }\n })();\n\n return this.#supportedChainIdsRefreshPromise;\n }\n\n /**\n * Resolve the `occurrenceFloor` query param for a chain from Token API\n * `/v1/suggestedOccurrenceFloors`. Falls back to\n * {@link DEFAULT_OCCURRENCE_FLOOR} when the chain is missing or the request\n * fails.\n *\n * @param hexChainId - Hex chain ID.\n * @returns Occurrence floor to send to `/tokens/{chainId}`.\n */\n async #getOccurrenceFloor(hexChainId: ChainId): Promise<number> {\n const now = Date.now();\n if (\n this.#suggestedOccurrenceFloors === undefined ||\n now - this.#suggestedOccurrenceFloorsCachedAt >=\n SUGGESTED_OCCURRENCE_FLOORS_CACHE_TTL_MS\n ) {\n await this.#refreshSuggestedOccurrenceFloors(now);\n }\n\n const decimalChainId = String(convertHexToDecimal(hexChainId));\n return (\n this.#suggestedOccurrenceFloors?.[decimalChainId] ??\n DEFAULT_OCCURRENCE_FLOOR\n );\n }\n\n /**\n * Fetch `/v1/suggestedOccurrenceFloors` and update the instance cache.\n * Concurrent callers share the in-flight Promise. Failures leave the cache\n * empty so {@link #getOccurrenceFloor} falls back to the default.\n *\n * @param now - Current timestamp used to stamp the cache entry.\n * @returns A promise that resolves once the cache has been refreshed.\n */\n async #refreshSuggestedOccurrenceFloors(now: number): Promise<void> {\n if (this.#suggestedOccurrenceFloorsRefreshPromise !== undefined) {\n return this.#suggestedOccurrenceFloorsRefreshPromise;\n }\n\n this.#suggestedOccurrenceFloorsRefreshPromise =\n (async (): Promise<void> => {\n try {\n const response = await this.#fetch(SUGGESTED_OCCURRENCE_FLOORS_URL);\n if (response.ok) {\n const data = (await response.json()) as Record<string, number>;\n this.#suggestedOccurrenceFloors =\n data && typeof data === 'object' && !Array.isArray(data)\n ? data\n : {};\n this.#suggestedOccurrenceFloorsCachedAt = now;\n } else {\n this.#suggestedOccurrenceFloors = {};\n this.#suggestedOccurrenceFloorsCachedAt = now;\n }\n } catch {\n this.#suggestedOccurrenceFloors = {};\n this.#suggestedOccurrenceFloorsCachedAt = now;\n } finally {\n this.#suggestedOccurrenceFloorsRefreshPromise = undefined;\n }\n })();\n\n return this.#suggestedOccurrenceFloorsRefreshPromise;\n }\n\n async #fetchTokenListUncached(\n hexChainId: ChainId,\n ): Promise<TokenListEntry[]> {\n const decimalChainId = convertHexToDecimal(hexChainId);\n const occurrenceFloor = await this.#getOccurrenceFloor(hexChainId);\n\n // Same query shape as `TokenListController.getTokensURL` (token-service.ts),\n // but `occurrenceFloor` comes from `/v1/suggestedOccurrenceFloors`.\n // No `first=...` cap — the API returns the full per-chain list bounded\n // server-side by `occurrenceFloor`.\n const url =\n `${TOKEN_END_POINT_API}/tokens/${decimalChainId}` +\n `?occurrenceFloor=${occurrenceFloor}` +\n `&includeNativeAssets=false` +\n `&includeTokenFees=false` +\n `&includeAssetType=false` +\n `&includeERC20Permit=false` +\n `&includeStorage=false` +\n `&includeRwaData=true`;\n\n let response: Response;\n try {\n response = await this.#fetch(url);\n } catch (error) {\n console.error(\n `Tokens API request failed for chain ${hexChainId}:`,\n error,\n );\n return [];\n }\n\n if (!response.ok) {\n console.error(\n `Tokens API responded with ${response.status} for chain ${hexChainId}`,\n );\n return [];\n }\n\n const raw = (await response.json()) as unknown;\n const items: ApiTokenListItem[] = Array.isArray(raw)\n ? (raw as ApiTokenListItem[])\n : [];\n\n const filtered = applyChainSpecificFilters(hexChainId, items);\n\n return filtered.map((item) => ({\n address: item.address,\n symbol: item.symbol ?? '',\n name: item.name ?? '',\n decimals: item.decimals ?? 18,\n iconUrl: item.iconUrl,\n aggregators: item.aggregators,\n occurrences: item.occurrences,\n }));\n }\n}\n\n/**\n * Apply chain-specific filters to a raw token list response, mirroring\n * `fetchTokenListByChainId` in `assets-controllers/src/token-service.ts`.\n *\n * For Linea mainnet, the API returns extras with low aggregator coverage, so\n * we keep only entries flagged by Linea's own team or seen by ≥3 aggregators.\n *\n * @param hexChainId - Hex chain ID.\n * @param items - Raw items from the API response.\n * @returns Items after chain-specific filtering.\n */\nfunction applyChainSpecificFilters(\n hexChainId: ChainId,\n items: ApiTokenListItem[],\n): ApiTokenListItem[] {\n if (hexChainId === ControllerChainId['linea-mainnet']) {\n return items.filter((item) => {\n const aggregators = item.aggregators ?? [];\n return aggregators.includes('lineaTeam') || aggregators.length >= 3;\n });\n }\n return items;\n}\n"]}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export { decodeAggregate3Response, encodeAggregate3, MulticallClient, type MulticallClientConfig, } from './MulticallClient.js';
|
|
2
|
-
export { TokensApiClient, type TokensApiClientConfig, type TokenListQueryClient, } from './TokensApiClient.js';
|
|
3
|
-
export type { GetProviderFunction, Provider } from '../types/index.js';
|
|
4
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/clients/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/clients/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,GAEhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,eAAe,GAGhB,MAAM,sBAAsB,CAAC","sourcesContent":["export {\n decodeAggregate3Response,\n encodeAggregate3,\n MulticallClient,\n type MulticallClientConfig,\n} from './MulticallClient.js';\n\nexport {\n TokensApiClient,\n type TokensApiClientConfig,\n type TokenListQueryClient,\n} from './TokensApiClient.js';\n\n// Re-export provider types from types module\nexport type { GetProviderFunction, Provider } from '../types/index.js';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data-sources/evm-rpc-services/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EACP,eAAe,EACf,kBAAkB,EAClB,OAAO,EACP,mBAAmB,EACnB,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,GACnC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export { MulticallClient, TokensApiClient, } from './clients/index.js';
|
|
2
|
-
export { BalanceFetcher, TokenDetector, StakedBalanceFetcher, getSupportedStakingChainIds, getStakingContractAddress, isStakingContractAssetId, } from './services/index.js';
|
|
3
|
-
export { divideIntoBatches, reduceInBatchesSerially } from './utils/index.js';
|
|
4
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data-sources/evm-rpc-services/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,eAAe,EAEf,eAAe,GAGhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,GAQzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export type {\n Address,\n AssetFetchEntry,\n AssetsBalanceState,\n ChainId,\n GetProviderFunction,\n Provider,\n BalanceOfRequest,\n BalanceOfResponse,\n TokenListState,\n BalanceFetchResult,\n TokenDetectionResult,\n} from './types/index.js';\nexport {\n MulticallClient,\n type MulticallClientConfig,\n TokensApiClient,\n type TokensApiClientConfig,\n type TokenListQueryClient,\n} from './clients/index.js';\nexport {\n BalanceFetcher,\n TokenDetector,\n StakedBalanceFetcher,\n getSupportedStakingChainIds,\n getStakingContractAddress,\n isStakingContractAssetId,\n type BalancePollingInput,\n type DetectionPollingInput,\n type StakedBalancePollingInput,\n type StakedBalanceFetchResult,\n type OnBalanceUpdateCallback,\n type OnDetectionUpdateCallback,\n type OnStakedBalanceUpdateCallback,\n} from './services/index.js';\nexport { divideIntoBatches, reduceInBatchesSerially } from './utils/index.js';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BalanceFetcher.d.ts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/BalanceFetcher.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EAEP,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAGlB,aAAa,EACb,OAAO,EACR,MAAM,mBAAmB,CAAC;AAK3B;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,CAAC,MAAM,EAAE,2BAA2B,KAAK,kBAAkB,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC;CACpD,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CACpC,MAAM,EAAE,kBAAkB,KACvB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;;;;;;;;;;;;;;;;;;AAE1B;;;;;;;;GAQG;AACH,qBAAa,cAAe,SAAQ,mBAA0D;;IAa5F,YACE,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,uBAAuB,EAClC,MAAM,EAAE,oBAAoB,EAa7B;IAED;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAE1D;IAED;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5D;IAmGD;;;;;;;;;;;OAWG;IACG,sBAAsB,CAC1B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,MAAM,EAAE,eAAe,EAAE,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAqE7B;CAqFF"}
|
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
import { StaticIntervalPollingControllerOnly } from '@metamask/polling-controller';
|
|
2
|
-
import { parseCaipAssetType } from '@metamask/utils';
|
|
3
|
-
import { ZERO_ADDRESS } from '../../../utils/constants.js';
|
|
4
|
-
import { reduceInBatchesSerially } from '../utils/index.js';
|
|
5
|
-
const DEFAULT_BALANCE_INTERVAL = 30_000; // 30 seconds
|
|
6
|
-
/**
|
|
7
|
-
* BalanceFetcher - Fetches token balances via multicall.
|
|
8
|
-
* Extends StaticIntervalPollingControllerOnly for built-in polling support.
|
|
9
|
-
*
|
|
10
|
-
* Callers provide CAIP-19 asset IDs; the fetcher extracts on-chain addresses
|
|
11
|
-
* (or uses the zero address for native assets) and maps multicall responses
|
|
12
|
-
* back to the original asset IDs. This ensures the returned balance entries
|
|
13
|
-
* always carry the correct identifier regardless of chain.
|
|
14
|
-
*/
|
|
15
|
-
export class BalanceFetcher extends StaticIntervalPollingControllerOnly() {
|
|
16
|
-
#multicallClient;
|
|
17
|
-
#messenger;
|
|
18
|
-
#config;
|
|
19
|
-
#isNativeAsset;
|
|
20
|
-
#onBalanceUpdate;
|
|
21
|
-
constructor(multicallClient, messenger, config) {
|
|
22
|
-
super();
|
|
23
|
-
this.#multicallClient = multicallClient;
|
|
24
|
-
this.#messenger = messenger;
|
|
25
|
-
this.#config = {
|
|
26
|
-
defaultBatchSize: config.defaultBatchSize ?? 300,
|
|
27
|
-
defaultTimeoutMs: config.defaultTimeoutMs ?? 30000,
|
|
28
|
-
};
|
|
29
|
-
this.#isNativeAsset = config.isNativeAsset;
|
|
30
|
-
// Set the polling interval
|
|
31
|
-
this.setIntervalLength(config?.pollingInterval ?? DEFAULT_BALANCE_INTERVAL);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Set the callback to receive balance updates during polling.
|
|
35
|
-
*
|
|
36
|
-
* @param callback - Function to call with balance results.
|
|
37
|
-
*/
|
|
38
|
-
setOnBalanceUpdate(callback) {
|
|
39
|
-
this.#onBalanceUpdate = callback;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Execute a poll cycle (required by base class).
|
|
43
|
-
* Fetches balances and calls the update callback.
|
|
44
|
-
*
|
|
45
|
-
* @param input - The polling input.
|
|
46
|
-
*/
|
|
47
|
-
async _executePoll(input) {
|
|
48
|
-
const result = await this.#fetchBalances(input.chainId, input.accountId, input.accountAddress, input.customAssetsOnly === true);
|
|
49
|
-
if (this.#onBalanceUpdate && result.balances.length > 0) {
|
|
50
|
-
await this.#onBalanceUpdate(result);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Return asset fetch entries tracked in state for the given account and
|
|
55
|
-
* chain. Both native (`slip44:`) and ERC-20 (`erc20:`) entries are included.
|
|
56
|
-
*
|
|
57
|
-
* @param chainId - Hex chain ID (e.g. "0x1").
|
|
58
|
-
* @param accountId - Account UUID.
|
|
59
|
-
* @param customAssetsOnly - When true, skip `assetsBalance` and only include `customAssets`.
|
|
60
|
-
* @returns Array of asset fetch entries from state for the requested chain.
|
|
61
|
-
*/
|
|
62
|
-
#getAssetsToFetch(chainId, accountId, customAssetsOnly) {
|
|
63
|
-
const state = this.#messenger.call('AssetsController:getState');
|
|
64
|
-
// Convert hex chainId to decimal for CAIP-2 matching
|
|
65
|
-
// This is safe because we are filtring with an accountId that is for evm balances only
|
|
66
|
-
const chainIdDecimal = parseInt(chainId, 16).toString();
|
|
67
|
-
const assetsToFetch = new Map();
|
|
68
|
-
const collect = (assetId) => {
|
|
69
|
-
const parsed = parseCaipAssetType(assetId);
|
|
70
|
-
if (parsed.chain.reference !== chainIdDecimal) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const normalizedAssetId = assetId.toLowerCase();
|
|
74
|
-
if (assetsToFetch.has(normalizedAssetId)) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
const isNative = this.#isNativeAsset(assetId);
|
|
78
|
-
assetsToFetch.set(normalizedAssetId, {
|
|
79
|
-
assetId,
|
|
80
|
-
address: isNative
|
|
81
|
-
? ZERO_ADDRESS
|
|
82
|
-
: parsed.assetReference.toLowerCase(),
|
|
83
|
-
});
|
|
84
|
-
};
|
|
85
|
-
// 1. Assets already tracked with a balance entry — only when not in
|
|
86
|
-
// "customAssetsOnly" mode (otherwise another data source is already
|
|
87
|
-
// refreshing them and we'd double-poll).
|
|
88
|
-
if (!customAssetsOnly) {
|
|
89
|
-
const accountBalances = state?.assetsBalance?.[accountId];
|
|
90
|
-
if (accountBalances) {
|
|
91
|
-
for (const assetId of Object.keys(accountBalances)) {
|
|
92
|
-
collect(assetId);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// 2. User-added custom assets — RPC is the sole balance fetcher for
|
|
97
|
-
// these, so they must be polled even if they have no balance entry
|
|
98
|
-
// yet (e.g. zero balance, first fetch failed, or state was hydrated
|
|
99
|
-
// from disk before any successful fetch).
|
|
100
|
-
const customAssets = state?.customAssets?.[accountId];
|
|
101
|
-
if (customAssets) {
|
|
102
|
-
for (const assetId of customAssets) {
|
|
103
|
-
collect(assetId);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
return Array.from(assetsToFetch.values());
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Fetch balances for assets already tracked in state for the given
|
|
110
|
-
* account and chain.
|
|
111
|
-
*
|
|
112
|
-
* @param chainId - Hex chain ID.
|
|
113
|
-
* @param accountId - Account UUID.
|
|
114
|
-
* @param accountAddress - On-chain address of the account.
|
|
115
|
-
* @param customAssetsOnly - When true, skip `assetsBalance` and only include `customAssets`.
|
|
116
|
-
* @returns Balance fetch result.
|
|
117
|
-
*/
|
|
118
|
-
async #fetchBalances(chainId, accountId, accountAddress, customAssetsOnly) {
|
|
119
|
-
const assets = this.#getAssetsToFetch(chainId, accountId, customAssetsOnly);
|
|
120
|
-
return this.fetchBalancesForAssets(chainId, accountId, accountAddress, assets);
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Fetch balances for the given assets via multicall.
|
|
124
|
-
*
|
|
125
|
-
* Each entry bundles a CAIP-19 asset ID with its on-chain address and
|
|
126
|
-
* optional decimals.
|
|
127
|
-
*
|
|
128
|
-
* @param chainId - Hex chain ID.
|
|
129
|
-
* @param accountId - Account UUID.
|
|
130
|
-
* @param accountAddress - On-chain address of the account.
|
|
131
|
-
* @param assets - Asset fetch entries to fetch balances for.
|
|
132
|
-
* @returns Balance fetch result.
|
|
133
|
-
*/
|
|
134
|
-
async fetchBalancesForAssets(chainId, accountId, accountAddress, assets) {
|
|
135
|
-
const timestamp = Date.now();
|
|
136
|
-
// Build a single map keyed by lowercase address that holds all info
|
|
137
|
-
// needed to match multicall responses back to their original entries.
|
|
138
|
-
const balanceRequests = [];
|
|
139
|
-
const entryByAddress = new Map();
|
|
140
|
-
for (const entry of assets) {
|
|
141
|
-
const lowerAddress = entry.address.toLowerCase();
|
|
142
|
-
if (entryByAddress.has(lowerAddress)) {
|
|
143
|
-
continue; // deduplicate
|
|
144
|
-
}
|
|
145
|
-
entryByAddress.set(lowerAddress, entry);
|
|
146
|
-
balanceRequests.push({ tokenAddress: entry.address, accountAddress });
|
|
147
|
-
}
|
|
148
|
-
if (balanceRequests.length === 0) {
|
|
149
|
-
return {
|
|
150
|
-
chainId,
|
|
151
|
-
accountId,
|
|
152
|
-
accountAddress,
|
|
153
|
-
balances: [],
|
|
154
|
-
failedAddresses: [],
|
|
155
|
-
timestamp,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
const result = await reduceInBatchesSerially({
|
|
159
|
-
values: balanceRequests,
|
|
160
|
-
batchSize: this.#config.defaultBatchSize,
|
|
161
|
-
initialResult: {
|
|
162
|
-
balances: [],
|
|
163
|
-
failedAddresses: [],
|
|
164
|
-
},
|
|
165
|
-
eachBatch: async (workingResult, batch) => {
|
|
166
|
-
const responses = await this.#multicallClient.batchBalanceOf(chainId, batch, { fallbackToSingleCalls: true });
|
|
167
|
-
return this.#processBalanceResponses(responses, workingResult, chainId, accountId, timestamp, entryByAddress);
|
|
168
|
-
},
|
|
169
|
-
});
|
|
170
|
-
return {
|
|
171
|
-
chainId,
|
|
172
|
-
accountId,
|
|
173
|
-
accountAddress,
|
|
174
|
-
...result,
|
|
175
|
-
timestamp,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
#processBalanceResponses(responses, accumulator, chainId, accountId, timestamp, entryByAddress) {
|
|
179
|
-
const { balances, failedAddresses } = accumulator;
|
|
180
|
-
for (const response of responses) {
|
|
181
|
-
if (!response.success) {
|
|
182
|
-
failedAddresses.push(response.tokenAddress);
|
|
183
|
-
continue;
|
|
184
|
-
}
|
|
185
|
-
const lowerAddress = response.tokenAddress.toLowerCase();
|
|
186
|
-
const entry = entryByAddress.get(lowerAddress);
|
|
187
|
-
if (!entry) {
|
|
188
|
-
continue;
|
|
189
|
-
}
|
|
190
|
-
const balance = response.balance ?? '0';
|
|
191
|
-
const isNative = lowerAddress === ZERO_ADDRESS.toLowerCase();
|
|
192
|
-
let decimals;
|
|
193
|
-
let formattedBalance;
|
|
194
|
-
if (isNative) {
|
|
195
|
-
decimals = 18;
|
|
196
|
-
formattedBalance = this.#formatBalance(balance, decimals);
|
|
197
|
-
}
|
|
198
|
-
else if (entry.decimals === undefined) {
|
|
199
|
-
formattedBalance = balance;
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
decimals = entry.decimals;
|
|
203
|
-
formattedBalance = this.#formatBalance(balance, decimals);
|
|
204
|
-
}
|
|
205
|
-
const balanceEntry = {
|
|
206
|
-
assetId: entry.assetId,
|
|
207
|
-
accountId,
|
|
208
|
-
chainId,
|
|
209
|
-
balance,
|
|
210
|
-
formattedBalance,
|
|
211
|
-
timestamp,
|
|
212
|
-
};
|
|
213
|
-
if (typeof decimals === 'number') {
|
|
214
|
-
balanceEntry.decimals = decimals;
|
|
215
|
-
}
|
|
216
|
-
balances.push(balanceEntry);
|
|
217
|
-
}
|
|
218
|
-
return { balances, failedAddresses };
|
|
219
|
-
}
|
|
220
|
-
#formatBalance(rawBalance, decimals) {
|
|
221
|
-
if (rawBalance === '0') {
|
|
222
|
-
return '0';
|
|
223
|
-
}
|
|
224
|
-
try {
|
|
225
|
-
const balanceBigInt = BigInt(rawBalance);
|
|
226
|
-
const divisor = BigInt(10 ** decimals);
|
|
227
|
-
const integerPart = balanceBigInt / divisor;
|
|
228
|
-
const remainder = balanceBigInt % divisor;
|
|
229
|
-
const fractionalStr = remainder.toString().padStart(decimals, '0');
|
|
230
|
-
const trimmedFractional = fractionalStr.replace(/0+$/u, '');
|
|
231
|
-
if (trimmedFractional === '') {
|
|
232
|
-
return integerPart.toString();
|
|
233
|
-
}
|
|
234
|
-
return `${integerPart}.${trimmedFractional}`;
|
|
235
|
-
}
|
|
236
|
-
catch {
|
|
237
|
-
return rawBalance;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
//# sourceMappingURL=BalanceFetcher.js.map
|