@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MulticallClient.mjs","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/clients/MulticallClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport {\n createServicePolicy,\n encodeFunctionData,\n} from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { ZERO_ADDRESS } from '../../../utils/constants.js';\nimport type {\n Address,\n BalanceOfRequest,\n BalanceOfResponse,\n ChainId,\n GetProviderFunction,\n Provider,\n} from '../types/index.js';\nimport { reduceInBatchesSerially } from '../utils/index.js';\n\n// =============================================================================\n// ABI DEFINITIONS\n// =============================================================================\n\n/**\n * Multicall3 contract ABI (subset for aggregate3 and getEthBalance).\n *\n * @see https://github.com/mds1/multicall\n */\nconst MULTICALL3_ABI = [\n {\n name: 'aggregate3',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'target', type: 'address' },\n { name: 'allowFailure', type: 'bool' },\n { name: 'callData', type: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n components: [\n { name: 'success', type: 'bool' },\n { name: 'returnData', type: 'bytes' },\n ],\n },\n ],\n },\n {\n name: 'getEthBalance',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'addr', type: 'address' }],\n outputs: [{ name: 'balance', type: 'uint256' }],\n },\n];\n\n/**\n * ERC-20 ABI (subset for balanceOf).\n */\nconst ERC20_ABI = [\n {\n name: 'balanceOf',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: 'balance', type: 'uint256' }],\n },\n];\n\n/**\n * Interface instances for ABI encoding/decoding.\n */\nconst multicall3Interface = new Interface(MULTICALL3_ABI);\nconst erc20Interface = new Interface(ERC20_ABI);\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/**\n * Multicall3 contract addresses by chain ID.\n * Source: https://github.com/mds1/multicall/blob/main/deployments.json\n *\n * TODO: try to find service to use here instead of hardcoding the addresses\n */\nconst MULTICALL3_ADDRESS_BY_CHAIN: Record<Hex, Hex> = {\n '0x1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaa36a7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4268': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b6e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18fc4a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaa37dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eee': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eeb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15f2249': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x89': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13881': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13882': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x44d': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x5a2': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x98a': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x64': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x27d8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa86a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa869': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfa2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfaf0': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xcc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x504': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x505': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x507': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2a15c308d': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2a15c3083': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x63564c40': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x19': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5535072': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6c1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x10': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x120': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4e454152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x250': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5c2359': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xec0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x42': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x80': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x440': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x257': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9fe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd3a0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x84444': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2329': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2328': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x12': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa516': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5afe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4ec': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaef3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x116ea': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x116e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2019': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3e9': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x7d1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x141': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e15': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1251': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7f08': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8ae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x138b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1389': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1388': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f92': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x14a33': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x14a34': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2105': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x936': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x46a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x46b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x14f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd2af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9ac0ce': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe705': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xe704': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe708': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2b6f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x39': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x23a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1644': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdea8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x171': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3e7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x76adf1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3b9ac9ff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2c': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2e': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x15b3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x82751': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8274f': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x82750': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x96f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3cc5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4571': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe99': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7d0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1297': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1d5e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3a14269b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x561bf78b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x235ddd0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3cd156dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5d456c62': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x79f99296': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x585eb4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x507aaa2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1fc3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x32d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a73': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a71': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9ac0d6': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1069': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7e5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x53': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x52': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xe298': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x94': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2803': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2802': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c5f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c60': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4cb2f': '0xdbfa261cd7d17bb40479a0493ad6c0fee435859e',\n '0x7f93': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb660': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb02113d3f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdad': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15b38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15b32': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x41a6ace': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa729': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f47b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b59': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1b58': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc3': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x16fd8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc7': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x405': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x334': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1ce': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1cf': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xa70e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x868b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa0c71fd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13e31': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa1337': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xf63': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x144': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x118': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x12c': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x18995f': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x2b74': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0xfc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x9da': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x137': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13ed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x24b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xba9302': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7c8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x138d5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x343b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x34a1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3109': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x91b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa96': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x22c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2be3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xbf03': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b254': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa7b14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2276': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b9e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6a63bb8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15af3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15af1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xae3f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x531': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c58': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1d88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5b9b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4c7e1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa53b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x406': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2cef': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18b2': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x182a9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfdd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfde': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x99c0a0f': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x22cf': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x310c5': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x46f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x659': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x139c968f9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xed88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd036': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x31bf8c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1cbc67bfdc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x98967f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4f588': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x16db': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x3a': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x59': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1e0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x221': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6f0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa867': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2611': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15f900': '0x6B5eFbC0C82eBb26CA13a4F11836f36Fc6fdBC5D',\n '0x74c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x407b': '0x90a2377F233E3461BACa6080d4837837d8762927',\n '0xa3c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xab5': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x138de': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8173': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x279f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb67d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18232': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x32': '0x0B1795ccA8E4eC4df02346a082df54D437F8D9aF',\n '0x18c7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x10e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x10b3e': '0x99423C88EB5723A590b4C644426069042f137B9e',\n // Ink Mainnet\n '0xdef1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Stable (988)\n '0x3dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Tempo Mainnet\n '0x1079': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Tempo Testnet Moderato\n '0xa5bf': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Arc (5042)\n '0x13b2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Robinhood Chain (4663)\n '0x1237': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Somnia (5031), MultiCallV3 per docs.somnia.network/developer/smart-contracts\n '0x13a7': '0x5e44F178E8cF9B2F5409B6f18ce936aB817C5a11',\n};\n\n// =============================================================================\n// ENCODING/DECODING UTILITIES (using @ethersproject/abi)\n// =============================================================================\n\n/**\n * Encode a balanceOf call for an ERC-20 token.\n *\n * @param accountAddress - The account address.\n * @returns The encoded call data.\n */\nfunction encodeBalanceOf(accountAddress: Address): Hex {\n return encodeFunctionData(erc20Interface, 'balanceOf', [accountAddress]);\n}\n\n/**\n * Encode a getEthBalance call for native token via Multicall3.\n *\n * @param accountAddress - The account address.\n * @returns The encoded call data.\n */\nfunction encodeGetEthBalance(accountAddress: Address): Hex {\n return encodeFunctionData(multicall3Interface, 'getEthBalance', [\n accountAddress,\n ]);\n}\n\ntype BalanceCallDataCache = {\n getErc20BalanceCallData: (accountAddress: Address) => Hex;\n getNativeBalanceCallData: (accountAddress: Address) => Hex;\n};\n\nfunction createBalanceCallDataCache(): BalanceCallDataCache {\n const erc20ByAccount = new Map<string, Hex>();\n const nativeByAccount = new Map<string, Hex>();\n\n return {\n getErc20BalanceCallData(accountAddress: Address): Hex {\n const key = accountAddress.toLowerCase();\n const existing = erc20ByAccount.get(key);\n if (existing !== undefined) {\n return existing;\n }\n const callData = encodeBalanceOf(accountAddress);\n erc20ByAccount.set(key, callData);\n return callData;\n },\n getNativeBalanceCallData(accountAddress: Address): Hex {\n const key = accountAddress.toLowerCase();\n const existing = nativeByAccount.get(key);\n if (existing !== undefined) {\n return existing;\n }\n const callData = encodeGetEthBalance(accountAddress);\n nativeByAccount.set(key, callData);\n return callData;\n },\n };\n}\n\n/**\n * Cache balance call encodings per account address.\n * ERC-20 `balanceOf` and native `getEthBalance` call data depend only on the\n * account being queried, not the token contract (which is the multicall target).\n */\nconst balanceCallDataCache = createBalanceCallDataCache();\n\n/**\n * Build Multicall3 aggregate3 calls for a batch of balance requests.\n *\n * @param batch - Balance requests in the current batch.\n * @param multicallAddress - Multicall3 contract address for native balance calls.\n * @returns Aggregate3 call descriptors.\n */\nfunction buildAggregate3BalanceCalls(\n batch: BalanceOfRequest[],\n multicallAddress: Hex,\n): { target: Address; allowFailure: boolean; callData: Hex }[] {\n return batch.map((req) => {\n const isNative = req.tokenAddress === ZERO_ADDRESS;\n const target = isNative ? multicallAddress : req.tokenAddress;\n return {\n target,\n allowFailure: true,\n callData: isNative\n ? balanceCallDataCache.getNativeBalanceCallData(req.accountAddress)\n : balanceCallDataCache.getErc20BalanceCallData(req.accountAddress),\n };\n });\n}\n\n/**\n * Encode a Multicall3 aggregate3 call.\n *\n * @param calls - Array of calls with target, allowFailure, and callData.\n * @returns The encoded aggregate3 call data.\n */\nexport function encodeAggregate3(\n calls: readonly { target: Address; allowFailure: boolean; callData: Hex }[],\n): Hex {\n return encodeFunctionData(multicall3Interface, 'aggregate3', [\n calls.map((call) => ({\n target: call.target,\n allowFailure: call.allowFailure,\n callData: call.callData,\n })),\n ]);\n}\n\n/**\n * Decode the response from aggregate3.\n * Returns array of (success, returnData) tuples.\n *\n * @param data - The raw response data.\n * @param callCount - Number of calls made (used for validation).\n * @returns Array of success and return data.\n */\nexport function decodeAggregate3Response(\n data: Hex,\n callCount: number,\n): { success: boolean; returnData: Hex }[] {\n const decoded = multicall3Interface.decodeFunctionResult('aggregate3', data);\n\n // decoded[0] is the array of (success, returnData) tuples\n const results = decoded[0] as readonly {\n success: boolean;\n returnData: string;\n }[];\n\n if (results.length !== callCount) {\n throw new Error(`Expected ${callCount} results, got ${results.length}`);\n }\n\n return results.map((result) => ({\n success: result.success,\n returnData: result.returnData as Hex,\n }));\n}\n\n/**\n * Decode a uint256 balance from return data.\n *\n * @param data - The hex return data.\n * @returns The decoded balance as a string.\n */\nfunction decodeUint256(data: Hex): string {\n if (data === '0x' || data.length < 66) {\n // Empty or invalid data; treat as 0\n return '0';\n }\n const decoded = erc20Interface.decodeFunctionResult('balanceOf', data);\n return decoded[0].toString();\n}\n\n// =============================================================================\n// MULTICALL CLIENT\n// =============================================================================\n\n/** Retries after the initial multicall attempt before returning failed responses. */\nconst MULTICALL_MAX_RETRIES = 2;\n\nexport type MulticallClientConfig = {\n maxCallsPerBatch?: number;\n timeoutMs?: number;\n};\n\n/**\n * Function for retrieving the Multicall3 contract address for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @returns The Multicall3 contract address, or undefined if not supported.\n */\nexport type GetMulticall3AddressForChainFunction = (\n chainId: ChainId,\n) => Hex | undefined;\n\n/**\n * Options for creating a MulticallClient.\n */\nexport type MulticallClientOptions = {\n getProvider: GetProviderFunction;\n getMulticall3AddressForChain: GetMulticall3AddressForChainFunction;\n config?: MulticallClientConfig;\n};\n\n/**\n * Client for batching RPC calls using Multicall3.\n * Falls back to individual calls on chains without Multicall3 support.\n */\nexport class MulticallClient {\n readonly #getProvider: GetProviderFunction;\n\n readonly #config: Required<MulticallClientConfig>;\n\n readonly #getMulticall3AddressForChain: GetMulticall3AddressForChainFunction;\n\n constructor({\n getProvider,\n getMulticall3AddressForChain,\n config,\n }: MulticallClientOptions) {\n this.#getProvider = getProvider;\n // Use default values for invalid (non-positive) batch sizes to prevent\n // infinite loops or errors in divideIntoBatches\n const maxCallsPerBatch =\n config?.maxCallsPerBatch !== undefined && config.maxCallsPerBatch > 0\n ? config.maxCallsPerBatch\n : 300;\n const timeoutMs =\n config?.timeoutMs !== undefined && config.timeoutMs > 0\n ? config.timeoutMs\n : 30000;\n this.#config = {\n maxCallsPerBatch,\n timeoutMs,\n };\n this.#getMulticall3AddressForChain = getMulticall3AddressForChain;\n }\n\n /**\n * Fetch ERC-20 and native token balances using Multicall3.\n * Falls back to individual RPC calls on unsupported chains.\n *\n * @param chainId - The chain ID.\n * @param requests - Array of balance requests.\n * @param options - Optional batch options (e.g. single-call fallback).\n * @returns Array of balance responses.\n */\n async batchBalanceOf(\n chainId: ChainId,\n requests: BalanceOfRequest[],\n options = { fallbackToSingleCalls: false },\n ): Promise<BalanceOfResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n const multicallAddress =\n this.#getMulticall3AddressForChain(chainId) ??\n MULTICALL3_ADDRESS_BY_CHAIN[chainId];\n const provider = this.#getProvider(chainId);\n\n if (!multicallAddress) {\n return options.fallbackToSingleCalls\n ? this.#fallbackBatchBalanceOf(provider, requests)\n : this.#createFailedResponses(requests);\n }\n\n // Use Multicall3\n return this.#multicallBatchBalanceOf(\n provider,\n multicallAddress,\n requests,\n options.fallbackToSingleCalls,\n );\n }\n\n /**\n * Fetch balances using Multicall3 aggregate3.\n *\n * @param provider - The RPC provider.\n * @param multicallAddress - The Multicall3 contract address.\n * @param requests - Array of balance requests.\n * @param fallbackToSingleCalls - Whether to fall back to individual RPC calls on batch failure.\n * @returns Array of balance responses.\n */\n async #multicallBatchBalanceOf(\n provider: Provider,\n multicallAddress: Hex,\n requests: BalanceOfRequest[],\n fallbackToSingleCalls: boolean,\n ): Promise<BalanceOfResponse[]> {\n const batchSize = this.#config.maxCallsPerBatch;\n\n const responses = await reduceInBatchesSerially<\n BalanceOfRequest,\n BalanceOfResponse[]\n >({\n values: requests,\n batchSize,\n initialResult: [],\n eachBatch: async (workingResult, batch) => {\n const calls = buildAggregate3BalanceCalls(batch, multicallAddress);\n\n try {\n await createServicePolicy({\n maxRetries: MULTICALL_MAX_RETRIES,\n }).execute(async () => {\n // Encode and send aggregate3 call\n const callData = encodeAggregate3(calls);\n const result = await provider.call({\n to: multicallAddress,\n data: callData,\n });\n\n // Decode response\n const decoded = decodeAggregate3Response(\n result as Hex,\n batch.length,\n );\n\n // Map results back to responses\n for (let i = 0; i < batch.length; i++) {\n const { tokenAddress, accountAddress } = batch[i];\n const { success, returnData } = decoded[i];\n\n if (success && returnData && returnData.length > 2) {\n workingResult.push({\n tokenAddress,\n accountAddress,\n success: true,\n balance: decodeUint256(returnData),\n });\n } else {\n workingResult.push({\n tokenAddress,\n accountAddress,\n success: false,\n });\n }\n }\n });\n } catch {\n if (fallbackToSingleCalls) {\n // On aggregate3 error, fall back to individual calls for this batch.\n // #fetchSingleBalance never rejects - it catches all errors internally\n // and returns a failed response, so we use Promise.all here.\n const fallbackResults = await Promise.all(\n batch.map((req) => this.#fetchSingleBalance(provider, req)),\n );\n\n for (const result of fallbackResults) {\n workingResult.push(result);\n }\n } else {\n workingResult.push(...this.#createFailedResponses(batch));\n }\n }\n\n return workingResult;\n },\n });\n\n return responses;\n }\n\n /**\n * Fallback: fetch balances using individual RPC calls.\n *\n * @param provider - The RPC provider.\n * @param requests - Array of balance requests.\n * @returns Array of balance responses.\n */\n async #fallbackBatchBalanceOf(\n provider: Provider,\n requests: BalanceOfRequest[],\n ): Promise<BalanceOfResponse[]> {\n // Use smaller batch size for parallel individual calls to avoid overwhelming RPC\n const batchSize = Math.min(this.#config.maxCallsPerBatch, 50);\n\n const responses = await reduceInBatchesSerially<\n BalanceOfRequest,\n BalanceOfResponse[]\n >({\n values: requests,\n batchSize,\n initialResult: [],\n eachBatch: async (workingResult, batch) => {\n // #fetchSingleBalance never rejects - it catches all errors internally\n // and returns a failed response, so we use Promise.all here.\n const batchResults = await Promise.all(\n batch.map((req) => this.#fetchSingleBalance(provider, req)),\n );\n\n for (const result of batchResults) {\n workingResult.push(result);\n }\n\n return workingResult;\n },\n });\n\n return responses;\n }\n\n /**\n * Fetch a single token balance (fallback method).\n *\n * @param provider - The RPC provider.\n * @param request - The balance request.\n * @returns The balance response.\n */\n async #fetchSingleBalance(\n provider: Provider,\n request: BalanceOfRequest,\n ): Promise<BalanceOfResponse> {\n // Destructure inside try block to ensure any errors are caught\n // and don't cause promise rejections that bypass error handling\n try {\n const { tokenAddress, accountAddress } = request;\n\n // Native token (zero address)\n if (tokenAddress === ZERO_ADDRESS) {\n const balance = await provider.getBalance(accountAddress);\n return {\n tokenAddress,\n accountAddress,\n success: true,\n balance: balance.toString(),\n };\n }\n\n // ERC-20 token\n const callData =\n balanceCallDataCache.getErc20BalanceCallData(accountAddress);\n const result = await provider.call({\n to: tokenAddress,\n data: callData,\n });\n\n const balance = decodeUint256(result as Hex);\n return {\n tokenAddress,\n accountAddress,\n success: true,\n balance,\n };\n } catch {\n return this.#createFailedResponse(request);\n }\n }\n\n #createFailedResponses(requests: BalanceOfRequest[]): BalanceOfResponse[] {\n return requests.map((request) => this.#createFailedResponse(request));\n }\n\n #createFailedResponse(request: BalanceOfRequest): BalanceOfResponse {\n return {\n tokenAddress: request.tokenAddress,\n accountAddress: request.accountAddress,\n success: false,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _TokensApiClient_instances, _TokensApiClient_fetch, _TokensApiClient_queryClient, _TokensApiClient_supportedChainIds, _TokensApiClient_supportedChainIdsCachedAt, _TokensApiClient_supportedChainIdsRefreshPromise, _TokensApiClient_suggestedOccurrenceFloors, _TokensApiClient_suggestedOccurrenceFloorsCachedAt, _TokensApiClient_suggestedOccurrenceFloorsRefreshPromise, _TokensApiClient_isSupportedChain, _TokensApiClient_refreshSupportedChainIds, _TokensApiClient_getOccurrenceFloor, _TokensApiClient_refreshSuggestedOccurrenceFloors, _TokensApiClient_fetchTokenListUncached;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.TokensApiClient = void 0;
|
|
16
|
+
const controller_utils_1 = require("@metamask/controller-utils");
|
|
17
|
+
/**
|
|
18
|
+
* Same host + path that `TokenListController` (assets-controllers) uses
|
|
19
|
+
* (`token-service.ts` → `getTokensURL`). Sharing this endpoint keeps the
|
|
20
|
+
* RPC token detector aligned with the rest of the wallet's token listing
|
|
21
|
+
* (occurrence floors, aggregator filters, icon URLs, etc.).
|
|
22
|
+
*/
|
|
23
|
+
const TOKEN_END_POINT_API = 'https://token.api.cx.metamask.io';
|
|
24
|
+
/**
|
|
25
|
+
* Endpoint that returns which CAIP chain IDs the Tokens API supports.
|
|
26
|
+
* Used to skip detection (and avoid unnecessary network requests) for chains
|
|
27
|
+
* that are not in the supported-networks list.
|
|
28
|
+
*/
|
|
29
|
+
const SUPPORTED_NETWORKS_URL = `${TOKEN_END_POINT_API}/v2/supportedNetworks`;
|
|
30
|
+
/**
|
|
31
|
+
* Per-chain suggested occurrence floors used as the `occurrenceFloor` query
|
|
32
|
+
* param when fetching token lists (and aligned with TokenDataSource spam
|
|
33
|
+
* filtering). Keys are decimal chain IDs.
|
|
34
|
+
*/
|
|
35
|
+
const SUGGESTED_OCCURRENCE_FLOORS_URL = `${TOKEN_END_POINT_API}/v1/suggestedOccurrenceFloors`;
|
|
36
|
+
/**
|
|
37
|
+
* Fallback `occurrenceFloor` when `/v1/suggestedOccurrenceFloors` has no entry
|
|
38
|
+
* for the chain, or the floors request fails.
|
|
39
|
+
*/
|
|
40
|
+
const DEFAULT_OCCURRENCE_FLOOR = 3;
|
|
41
|
+
/**
|
|
42
|
+
* How long to keep the supported-networks response in the instance-level
|
|
43
|
+
* cache before refreshing it. One hour is sufficient — the list rarely
|
|
44
|
+
* changes and a stale cache just means we may do an unnecessary token-list
|
|
45
|
+
* fetch for a newly-unsupported chain (harmless).
|
|
46
|
+
*/
|
|
47
|
+
const SUPPORTED_NETWORKS_CACHE_TTL_MS = 60 * 60000;
|
|
48
|
+
/**
|
|
49
|
+
* How long to keep suggested occurrence floors cached. Same TTL as supported
|
|
50
|
+
* networks — floors change infrequently.
|
|
51
|
+
*/
|
|
52
|
+
const SUGGESTED_OCCURRENCE_FLOORS_CACHE_TTL_MS = 60 * 60000;
|
|
53
|
+
/**
|
|
54
|
+
* TanStack-Query cache config for the cached `fetchTokenList` path.
|
|
55
|
+
*
|
|
56
|
+
* The Tokens API per-chain list barely changes between polls, so we keep
|
|
57
|
+
* results fresh for a few minutes (`staleTime`) and retain them in cache for
|
|
58
|
+
* an hour (`gcTime`) so re-detections across accounts/chains hit the cache.
|
|
59
|
+
* These tunings only apply when a `queryClient` is provided to the client;
|
|
60
|
+
* the uncached fallback path (used in standalone tests) is unaffected.
|
|
61
|
+
*/
|
|
62
|
+
const TOKEN_LIST_STALE_TIME_MS = 5 * 60000;
|
|
63
|
+
const TOKEN_LIST_GC_TIME_MS = 60 * 60000;
|
|
64
|
+
/**
|
|
65
|
+
* Client for the MetaMask Tokens API.
|
|
66
|
+
*
|
|
67
|
+
* Fetches the per-chain ERC-20 token list from the same endpoint that
|
|
68
|
+
* `TokenListController` uses (`token.api.cx.metamask.io/tokens/{chainId}`),
|
|
69
|
+
* with the same query parameters. The `occurrenceFloor` query param comes from
|
|
70
|
+
* Token API `/v1/suggestedOccurrenceFloors` (fallback {@link DEFAULT_OCCURRENCE_FLOOR}),
|
|
71
|
+
* matching `TokenDataSource` spam filtering. Linea's post-response aggregator
|
|
72
|
+
* filter is still applied client-side.
|
|
73
|
+
*
|
|
74
|
+
* Before fetching a chain's token list, the client checks
|
|
75
|
+
* `/v2/supportedNetworks` and returns `[]` immediately for chains that are
|
|
76
|
+
* not in the supported list, avoiding unnecessary API calls. The supported-
|
|
77
|
+
* networks response is cached in-memory for one hour.
|
|
78
|
+
*
|
|
79
|
+
* When constructed with a `queryClient`, token-list results are cached and
|
|
80
|
+
* deduped via TanStack Query (5 min staleTime, 1 h gcTime), so concurrent
|
|
81
|
+
* detection cycles for the same chain coalesce into a single network request.
|
|
82
|
+
*/
|
|
83
|
+
class TokensApiClient {
|
|
84
|
+
constructor(config) {
|
|
85
|
+
_TokensApiClient_instances.add(this);
|
|
86
|
+
_TokensApiClient_fetch.set(this, void 0);
|
|
87
|
+
_TokensApiClient_queryClient.set(this, void 0);
|
|
88
|
+
/** CAIP chain IDs returned by `/v2/supportedNetworks` (both tiers). */
|
|
89
|
+
_TokensApiClient_supportedChainIds.set(this, void 0);
|
|
90
|
+
/** Timestamp of the last successful `/v2/supportedNetworks` fetch. */
|
|
91
|
+
_TokensApiClient_supportedChainIdsCachedAt.set(this, 0);
|
|
92
|
+
/**
|
|
93
|
+
* In-flight `/v2/supportedNetworks` request shared across concurrent callers
|
|
94
|
+
* so only one network request is made even when multiple `fetchTokenList`
|
|
95
|
+
* calls arrive before the first one resolves.
|
|
96
|
+
*/
|
|
97
|
+
_TokensApiClient_supportedChainIdsRefreshPromise.set(this, void 0);
|
|
98
|
+
/** Decimal chain ID → suggested occurrence floor from Token API. */
|
|
99
|
+
_TokensApiClient_suggestedOccurrenceFloors.set(this, void 0);
|
|
100
|
+
/** Timestamp of the last successful floors fetch. */
|
|
101
|
+
_TokensApiClient_suggestedOccurrenceFloorsCachedAt.set(this, 0);
|
|
102
|
+
/** In-flight floors request shared across concurrent callers. */
|
|
103
|
+
_TokensApiClient_suggestedOccurrenceFloorsRefreshPromise.set(this, void 0);
|
|
104
|
+
__classPrivateFieldSet(this, _TokensApiClient_fetch, config?.fetch ?? globalThis.fetch.bind(globalThis), "f");
|
|
105
|
+
__classPrivateFieldSet(this, _TokensApiClient_queryClient, config?.queryClient, "f");
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Fetch the list of ERC-20 tokens for a chain from the Tokens API.
|
|
109
|
+
*
|
|
110
|
+
* Returns `[]` immediately (without hitting the token-list endpoint) when
|
|
111
|
+
* the chain is not in the `/v2/supportedNetworks` response, or when the
|
|
112
|
+
* supported-networks check fails for any reason.
|
|
113
|
+
*
|
|
114
|
+
* @param hexChainId - Chain ID in hex format (e.g. `'0x1'` for Ethereum mainnet).
|
|
115
|
+
* @returns Array of token list entries with address and metadata, or an empty
|
|
116
|
+
* array if the chain is unsupported or the request fails.
|
|
117
|
+
*/
|
|
118
|
+
async fetchTokenList(hexChainId) {
|
|
119
|
+
// Treat any error from the supported-networks check as "not supported":
|
|
120
|
+
// the token-list endpoint is only contacted for known-supported chains.
|
|
121
|
+
if (!(await __classPrivateFieldGet(this, _TokensApiClient_instances, "m", _TokensApiClient_isSupportedChain).call(this, hexChainId).catch(() => false))) {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
const queryClient = __classPrivateFieldGet(this, _TokensApiClient_queryClient, "f");
|
|
125
|
+
if (queryClient === undefined) {
|
|
126
|
+
return __classPrivateFieldGet(this, _TokensApiClient_instances, "m", _TokensApiClient_fetchTokenListUncached).call(this, hexChainId);
|
|
127
|
+
}
|
|
128
|
+
return queryClient.fetchQuery({
|
|
129
|
+
// Namespacing keeps this key from colliding with other clients that
|
|
130
|
+
// share the same QueryClient (e.g. core-backend's ApiPlatformClient).
|
|
131
|
+
queryKey: [
|
|
132
|
+
'assets-controller',
|
|
133
|
+
'rpc-detection',
|
|
134
|
+
'token-list',
|
|
135
|
+
{ chainId: hexChainId },
|
|
136
|
+
],
|
|
137
|
+
queryFn: () => __classPrivateFieldGet(this, _TokensApiClient_instances, "m", _TokensApiClient_fetchTokenListUncached).call(this, hexChainId),
|
|
138
|
+
staleTime: TOKEN_LIST_STALE_TIME_MS,
|
|
139
|
+
gcTime: TOKEN_LIST_GC_TIME_MS,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.TokensApiClient = TokensApiClient;
|
|
144
|
+
_TokensApiClient_fetch = new WeakMap(), _TokensApiClient_queryClient = new WeakMap(), _TokensApiClient_supportedChainIds = new WeakMap(), _TokensApiClient_supportedChainIdsCachedAt = new WeakMap(), _TokensApiClient_supportedChainIdsRefreshPromise = new WeakMap(), _TokensApiClient_suggestedOccurrenceFloors = new WeakMap(), _TokensApiClient_suggestedOccurrenceFloorsCachedAt = new WeakMap(), _TokensApiClient_suggestedOccurrenceFloorsRefreshPromise = new WeakMap(), _TokensApiClient_instances = new WeakSet(), _TokensApiClient_isSupportedChain =
|
|
145
|
+
/**
|
|
146
|
+
* Check whether the given chain is present in the supported-networks list.
|
|
147
|
+
*
|
|
148
|
+
* Uses an instance-level cache (1 h TTL). Throws if the network request
|
|
149
|
+
* fails — callers should handle this (e.g. via `.catch(() => false)`).
|
|
150
|
+
*
|
|
151
|
+
* @param hexChainId - Hex chain ID to check.
|
|
152
|
+
* @returns `true` when the chain is in the supported-networks list.
|
|
153
|
+
*/
|
|
154
|
+
async function _TokensApiClient_isSupportedChain(hexChainId) {
|
|
155
|
+
const now = Date.now();
|
|
156
|
+
if (__classPrivateFieldGet(this, _TokensApiClient_supportedChainIds, "f") === undefined ||
|
|
157
|
+
now - __classPrivateFieldGet(this, _TokensApiClient_supportedChainIdsCachedAt, "f") >= SUPPORTED_NETWORKS_CACHE_TTL_MS) {
|
|
158
|
+
await __classPrivateFieldGet(this, _TokensApiClient_instances, "m", _TokensApiClient_refreshSupportedChainIds).call(this, now);
|
|
159
|
+
}
|
|
160
|
+
const caipChainId = `eip155:${(0, controller_utils_1.convertHexToDecimal)(hexChainId)}`;
|
|
161
|
+
return __classPrivateFieldGet(this, _TokensApiClient_supportedChainIds, "f")?.has(caipChainId) ?? false;
|
|
162
|
+
}, _TokensApiClient_refreshSupportedChainIds =
|
|
163
|
+
/**
|
|
164
|
+
* Fetch `/v2/supportedNetworks` and update the instance cache.
|
|
165
|
+
* Concurrent callers share the same in-flight Promise so only one network
|
|
166
|
+
* request is made. If the response is not 2xx the cache is left unchanged
|
|
167
|
+
* (the chain will be treated as unsupported this cycle).
|
|
168
|
+
*
|
|
169
|
+
* @param now - Current timestamp used to stamp the cache entry.
|
|
170
|
+
* @returns A promise that resolves once the cache has been refreshed.
|
|
171
|
+
*/
|
|
172
|
+
async function _TokensApiClient_refreshSupportedChainIds(now) {
|
|
173
|
+
if (__classPrivateFieldGet(this, _TokensApiClient_supportedChainIdsRefreshPromise, "f") !== undefined) {
|
|
174
|
+
return __classPrivateFieldGet(this, _TokensApiClient_supportedChainIdsRefreshPromise, "f");
|
|
175
|
+
}
|
|
176
|
+
__classPrivateFieldSet(this, _TokensApiClient_supportedChainIdsRefreshPromise, (async () => {
|
|
177
|
+
try {
|
|
178
|
+
const response = await __classPrivateFieldGet(this, _TokensApiClient_fetch, "f").call(this, SUPPORTED_NETWORKS_URL);
|
|
179
|
+
if (response.ok) {
|
|
180
|
+
const data = (await response.json());
|
|
181
|
+
__classPrivateFieldSet(this, _TokensApiClient_supportedChainIds, new Set([
|
|
182
|
+
...(data.fullSupport ?? []),
|
|
183
|
+
...(data.partialSupport ?? []),
|
|
184
|
+
]), "f");
|
|
185
|
+
__classPrivateFieldSet(this, _TokensApiClient_supportedChainIdsCachedAt, now, "f");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
__classPrivateFieldSet(this, _TokensApiClient_supportedChainIdsRefreshPromise, undefined, "f");
|
|
190
|
+
}
|
|
191
|
+
})(), "f");
|
|
192
|
+
return __classPrivateFieldGet(this, _TokensApiClient_supportedChainIdsRefreshPromise, "f");
|
|
193
|
+
}, _TokensApiClient_getOccurrenceFloor =
|
|
194
|
+
/**
|
|
195
|
+
* Resolve the `occurrenceFloor` query param for a chain from Token API
|
|
196
|
+
* `/v1/suggestedOccurrenceFloors`. Falls back to
|
|
197
|
+
* {@link DEFAULT_OCCURRENCE_FLOOR} when the chain is missing or the request
|
|
198
|
+
* fails.
|
|
199
|
+
*
|
|
200
|
+
* @param hexChainId - Hex chain ID.
|
|
201
|
+
* @returns Occurrence floor to send to `/tokens/{chainId}`.
|
|
202
|
+
*/
|
|
203
|
+
async function _TokensApiClient_getOccurrenceFloor(hexChainId) {
|
|
204
|
+
const now = Date.now();
|
|
205
|
+
if (__classPrivateFieldGet(this, _TokensApiClient_suggestedOccurrenceFloors, "f") === undefined ||
|
|
206
|
+
now - __classPrivateFieldGet(this, _TokensApiClient_suggestedOccurrenceFloorsCachedAt, "f") >=
|
|
207
|
+
SUGGESTED_OCCURRENCE_FLOORS_CACHE_TTL_MS) {
|
|
208
|
+
await __classPrivateFieldGet(this, _TokensApiClient_instances, "m", _TokensApiClient_refreshSuggestedOccurrenceFloors).call(this, now);
|
|
209
|
+
}
|
|
210
|
+
const decimalChainId = String((0, controller_utils_1.convertHexToDecimal)(hexChainId));
|
|
211
|
+
return (__classPrivateFieldGet(this, _TokensApiClient_suggestedOccurrenceFloors, "f")?.[decimalChainId] ??
|
|
212
|
+
DEFAULT_OCCURRENCE_FLOOR);
|
|
213
|
+
}, _TokensApiClient_refreshSuggestedOccurrenceFloors =
|
|
214
|
+
/**
|
|
215
|
+
* Fetch `/v1/suggestedOccurrenceFloors` and update the instance cache.
|
|
216
|
+
* Concurrent callers share the in-flight Promise. Failures leave the cache
|
|
217
|
+
* empty so {@link #getOccurrenceFloor} falls back to the default.
|
|
218
|
+
*
|
|
219
|
+
* @param now - Current timestamp used to stamp the cache entry.
|
|
220
|
+
* @returns A promise that resolves once the cache has been refreshed.
|
|
221
|
+
*/
|
|
222
|
+
async function _TokensApiClient_refreshSuggestedOccurrenceFloors(now) {
|
|
223
|
+
if (__classPrivateFieldGet(this, _TokensApiClient_suggestedOccurrenceFloorsRefreshPromise, "f") !== undefined) {
|
|
224
|
+
return __classPrivateFieldGet(this, _TokensApiClient_suggestedOccurrenceFloorsRefreshPromise, "f");
|
|
225
|
+
}
|
|
226
|
+
__classPrivateFieldSet(this, _TokensApiClient_suggestedOccurrenceFloorsRefreshPromise, (async () => {
|
|
227
|
+
try {
|
|
228
|
+
const response = await __classPrivateFieldGet(this, _TokensApiClient_fetch, "f").call(this, SUGGESTED_OCCURRENCE_FLOORS_URL);
|
|
229
|
+
if (response.ok) {
|
|
230
|
+
const data = (await response.json());
|
|
231
|
+
__classPrivateFieldSet(this, _TokensApiClient_suggestedOccurrenceFloors, data && typeof data === 'object' && !Array.isArray(data)
|
|
232
|
+
? data
|
|
233
|
+
: {}, "f");
|
|
234
|
+
__classPrivateFieldSet(this, _TokensApiClient_suggestedOccurrenceFloorsCachedAt, now, "f");
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
__classPrivateFieldSet(this, _TokensApiClient_suggestedOccurrenceFloors, {}, "f");
|
|
238
|
+
__classPrivateFieldSet(this, _TokensApiClient_suggestedOccurrenceFloorsCachedAt, now, "f");
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
__classPrivateFieldSet(this, _TokensApiClient_suggestedOccurrenceFloors, {}, "f");
|
|
243
|
+
__classPrivateFieldSet(this, _TokensApiClient_suggestedOccurrenceFloorsCachedAt, now, "f");
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
__classPrivateFieldSet(this, _TokensApiClient_suggestedOccurrenceFloorsRefreshPromise, undefined, "f");
|
|
247
|
+
}
|
|
248
|
+
})(), "f");
|
|
249
|
+
return __classPrivateFieldGet(this, _TokensApiClient_suggestedOccurrenceFloorsRefreshPromise, "f");
|
|
250
|
+
}, _TokensApiClient_fetchTokenListUncached = async function _TokensApiClient_fetchTokenListUncached(hexChainId) {
|
|
251
|
+
const decimalChainId = (0, controller_utils_1.convertHexToDecimal)(hexChainId);
|
|
252
|
+
const occurrenceFloor = await __classPrivateFieldGet(this, _TokensApiClient_instances, "m", _TokensApiClient_getOccurrenceFloor).call(this, hexChainId);
|
|
253
|
+
// Same query shape as `TokenListController.getTokensURL` (token-service.ts),
|
|
254
|
+
// but `occurrenceFloor` comes from `/v1/suggestedOccurrenceFloors`.
|
|
255
|
+
// No `first=...` cap — the API returns the full per-chain list bounded
|
|
256
|
+
// server-side by `occurrenceFloor`.
|
|
257
|
+
const url = `${TOKEN_END_POINT_API}/tokens/${decimalChainId}` +
|
|
258
|
+
`?occurrenceFloor=${occurrenceFloor}` +
|
|
259
|
+
`&includeNativeAssets=false` +
|
|
260
|
+
`&includeTokenFees=false` +
|
|
261
|
+
`&includeAssetType=false` +
|
|
262
|
+
`&includeERC20Permit=false` +
|
|
263
|
+
`&includeStorage=false` +
|
|
264
|
+
`&includeRwaData=true`;
|
|
265
|
+
let response;
|
|
266
|
+
try {
|
|
267
|
+
response = await __classPrivateFieldGet(this, _TokensApiClient_fetch, "f").call(this, url);
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
console.error(`Tokens API request failed for chain ${hexChainId}:`, error);
|
|
271
|
+
return [];
|
|
272
|
+
}
|
|
273
|
+
if (!response.ok) {
|
|
274
|
+
console.error(`Tokens API responded with ${response.status} for chain ${hexChainId}`);
|
|
275
|
+
return [];
|
|
276
|
+
}
|
|
277
|
+
const raw = (await response.json());
|
|
278
|
+
const items = Array.isArray(raw)
|
|
279
|
+
? raw
|
|
280
|
+
: [];
|
|
281
|
+
const filtered = applyChainSpecificFilters(hexChainId, items);
|
|
282
|
+
return filtered.map((item) => ({
|
|
283
|
+
address: item.address,
|
|
284
|
+
symbol: item.symbol ?? '',
|
|
285
|
+
name: item.name ?? '',
|
|
286
|
+
decimals: item.decimals ?? 18,
|
|
287
|
+
iconUrl: item.iconUrl,
|
|
288
|
+
aggregators: item.aggregators,
|
|
289
|
+
occurrences: item.occurrences,
|
|
290
|
+
}));
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* Apply chain-specific filters to a raw token list response, mirroring
|
|
294
|
+
* `fetchTokenListByChainId` in `assets-controllers/src/token-service.ts`.
|
|
295
|
+
*
|
|
296
|
+
* For Linea mainnet, the API returns extras with low aggregator coverage, so
|
|
297
|
+
* we keep only entries flagged by Linea's own team or seen by ≥3 aggregators.
|
|
298
|
+
*
|
|
299
|
+
* @param hexChainId - Hex chain ID.
|
|
300
|
+
* @param items - Raw items from the API response.
|
|
301
|
+
* @returns Items after chain-specific filtering.
|
|
302
|
+
*/
|
|
303
|
+
function applyChainSpecificFilters(hexChainId, items) {
|
|
304
|
+
if (hexChainId === controller_utils_1.ChainId['linea-mainnet']) {
|
|
305
|
+
return items.filter((item) => {
|
|
306
|
+
const aggregators = item.aggregators ?? [];
|
|
307
|
+
return aggregators.includes('lineaTeam') || aggregators.length >= 3;
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
return items;
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=TokensApiClient.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokensApiClient.cjs","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"]}
|
package/dist/data-sources/evm-rpc-services/clients/{TokensApiClient.d.ts → TokensApiClient.d.cts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ChainId, TokenListEntry } from
|
|
1
|
+
import type { ChainId, TokenListEntry } from "../types/index.cjs";
|
|
2
2
|
/**
|
|
3
3
|
* Minimal structural type for the TanStack Query client method we use.
|
|
4
4
|
* Avoids a direct dependency on `@tanstack/query-core` while still being
|
|
@@ -58,4 +58,4 @@ export declare class TokensApiClient {
|
|
|
58
58
|
*/
|
|
59
59
|
fetchTokenList(hexChainId: ChainId): Promise<TokenListEntry[]>;
|
|
60
60
|
}
|
|
61
|
-
//# sourceMappingURL=TokensApiClient.d.
|
|
61
|
+
//# sourceMappingURL=TokensApiClient.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokensApiClient.d.cts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/clients/TokensApiClient.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,2BAA0B;AAgFjE;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE;QACzB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC;;;;OAIG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAe;;gBA2Bd,MAAM,CAAC,EAAE,qBAAqB;IAK1C;;;;;;;;;;OAUG;IACG,cAAc,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CA0MrE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ChainId, TokenListEntry } from "../types/index.mjs";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal structural type for the TanStack Query client method we use.
|
|
4
|
+
* Avoids a direct dependency on `@tanstack/query-core` while still being
|
|
5
|
+
* fully compatible with the shared `QueryClient` exposed by
|
|
6
|
+
* `ApiPlatformClient.queryClient` (`@metamask/core-backend`).
|
|
7
|
+
*/
|
|
8
|
+
export type TokenListQueryClient = {
|
|
9
|
+
fetchQuery<TData>(options: {
|
|
10
|
+
queryKey: readonly unknown[];
|
|
11
|
+
queryFn: () => Promise<TData>;
|
|
12
|
+
staleTime?: number;
|
|
13
|
+
gcTime?: number;
|
|
14
|
+
}): Promise<TData>;
|
|
15
|
+
};
|
|
16
|
+
export type TokensApiClientConfig = {
|
|
17
|
+
/** Fetch function (defaults to globalThis.fetch). */
|
|
18
|
+
fetch?: typeof globalThis.fetch;
|
|
19
|
+
/**
|
|
20
|
+
* Optional TanStack-Query client used to cache token-list responses across
|
|
21
|
+
* detector polls / accounts / instances. When omitted, every call hits the
|
|
22
|
+
* network directly (preserves prior behaviour for tests and standalone use).
|
|
23
|
+
*/
|
|
24
|
+
queryClient?: TokenListQueryClient;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Client for the MetaMask Tokens API.
|
|
28
|
+
*
|
|
29
|
+
* Fetches the per-chain ERC-20 token list from the same endpoint that
|
|
30
|
+
* `TokenListController` uses (`token.api.cx.metamask.io/tokens/{chainId}`),
|
|
31
|
+
* with the same query parameters. The `occurrenceFloor` query param comes from
|
|
32
|
+
* Token API `/v1/suggestedOccurrenceFloors` (fallback {@link DEFAULT_OCCURRENCE_FLOOR}),
|
|
33
|
+
* matching `TokenDataSource` spam filtering. Linea's post-response aggregator
|
|
34
|
+
* filter is still applied client-side.
|
|
35
|
+
*
|
|
36
|
+
* Before fetching a chain's token list, the client checks
|
|
37
|
+
* `/v2/supportedNetworks` and returns `[]` immediately for chains that are
|
|
38
|
+
* not in the supported list, avoiding unnecessary API calls. The supported-
|
|
39
|
+
* networks response is cached in-memory for one hour.
|
|
40
|
+
*
|
|
41
|
+
* When constructed with a `queryClient`, token-list results are cached and
|
|
42
|
+
* deduped via TanStack Query (5 min staleTime, 1 h gcTime), so concurrent
|
|
43
|
+
* detection cycles for the same chain coalesce into a single network request.
|
|
44
|
+
*/
|
|
45
|
+
export declare class TokensApiClient {
|
|
46
|
+
#private;
|
|
47
|
+
constructor(config?: TokensApiClientConfig);
|
|
48
|
+
/**
|
|
49
|
+
* Fetch the list of ERC-20 tokens for a chain from the Tokens API.
|
|
50
|
+
*
|
|
51
|
+
* Returns `[]` immediately (without hitting the token-list endpoint) when
|
|
52
|
+
* the chain is not in the `/v2/supportedNetworks` response, or when the
|
|
53
|
+
* supported-networks check fails for any reason.
|
|
54
|
+
*
|
|
55
|
+
* @param hexChainId - Chain ID in hex format (e.g. `'0x1'` for Ethereum mainnet).
|
|
56
|
+
* @returns Array of token list entries with address and metadata, or an empty
|
|
57
|
+
* array if the chain is unsupported or the request fails.
|
|
58
|
+
*/
|
|
59
|
+
fetchTokenList(hexChainId: ChainId): Promise<TokenListEntry[]>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=TokensApiClient.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokensApiClient.d.mts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/clients/TokensApiClient.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,2BAA0B;AAgFjE;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE;QACzB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC;;;;OAIG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAe;;gBA2Bd,MAAM,CAAC,EAAE,qBAAqB;IAK1C;;;;;;;;;;OAUG;IACG,cAAc,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CA0MrE"}
|