@metamask-previews/assets-controller 0.0.0-preview-903db2da → 0.0.0-preview-3ec2a74
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 +10 -0
- package/dist/AssetsController.cjs +1028 -61
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +229 -83
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +229 -83
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +1024 -59
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AbstractDataSource.cjs +103 -0
- package/dist/data-sources/AbstractDataSource.cjs.map +1 -0
- package/dist/data-sources/AbstractDataSource.d.cts +92 -0
- package/dist/data-sources/AbstractDataSource.d.cts.map +1 -0
- package/dist/data-sources/AbstractDataSource.d.mts +92 -0
- package/dist/data-sources/AbstractDataSource.d.mts.map +1 -0
- package/dist/data-sources/AbstractDataSource.mjs +99 -0
- package/dist/data-sources/AbstractDataSource.mjs.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.cjs +421 -0
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.d.cts +103 -0
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.d.mts +103 -0
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -0
- package/dist/data-sources/AccountsApiDataSource.mjs +416 -0
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -0
- package/dist/data-sources/BackendWebsocketDataSource.cjs +388 -0
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.cts +95 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.mts +95 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -0
- package/dist/data-sources/BackendWebsocketDataSource.mjs +383 -0
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -0
- package/dist/data-sources/PriceDataSource.cjs +350 -0
- package/dist/data-sources/PriceDataSource.cjs.map +1 -0
- package/dist/data-sources/PriceDataSource.d.cts +153 -0
- package/dist/data-sources/PriceDataSource.d.cts.map +1 -0
- package/dist/data-sources/PriceDataSource.d.mts +153 -0
- package/dist/data-sources/PriceDataSource.d.mts.map +1 -0
- package/dist/data-sources/PriceDataSource.mjs +346 -0
- package/dist/data-sources/PriceDataSource.mjs.map +1 -0
- package/dist/data-sources/RpcDataSource.cjs +410 -0
- package/dist/data-sources/RpcDataSource.cjs.map +1 -0
- package/dist/data-sources/RpcDataSource.d.cts +154 -0
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -0
- package/dist/data-sources/RpcDataSource.d.mts +154 -0
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -0
- package/dist/data-sources/RpcDataSource.mjs +405 -0
- package/dist/data-sources/RpcDataSource.mjs.map +1 -0
- package/dist/data-sources/SnapDataSource.cjs +734 -0
- package/dist/data-sources/SnapDataSource.cjs.map +1 -0
- package/dist/data-sources/SnapDataSource.d.cts +217 -0
- package/dist/data-sources/SnapDataSource.d.cts.map +1 -0
- package/dist/data-sources/SnapDataSource.d.mts +217 -0
- package/dist/data-sources/SnapDataSource.d.mts.map +1 -0
- package/dist/data-sources/SnapDataSource.mjs +723 -0
- package/dist/data-sources/SnapDataSource.mjs.map +1 -0
- package/dist/data-sources/TokenDataSource.cjs +179 -0
- package/dist/data-sources/TokenDataSource.cjs.map +1 -0
- package/dist/data-sources/TokenDataSource.d.cts +62 -0
- package/dist/data-sources/TokenDataSource.d.cts.map +1 -0
- package/dist/data-sources/TokenDataSource.d.mts +62 -0
- package/dist/data-sources/TokenDataSource.d.mts.map +1 -0
- package/dist/data-sources/TokenDataSource.mjs +175 -0
- package/dist/data-sources/TokenDataSource.mjs.map +1 -0
- package/dist/data-sources/index.cjs +62 -0
- package/dist/data-sources/index.cjs.map +1 -0
- package/dist/data-sources/index.d.cts +9 -0
- 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 +23 -0
- package/dist/data-sources/index.mjs.map +1 -0
- package/dist/data-sources/initDataSources.cjs +199 -0
- package/dist/data-sources/initDataSources.cjs.map +1 -0
- package/dist/data-sources/initDataSources.d.cts +123 -0
- package/dist/data-sources/initDataSources.d.cts.map +1 -0
- package/dist/data-sources/initDataSources.d.mts +123 -0
- package/dist/data-sources/initDataSources.d.mts.map +1 -0
- package/dist/data-sources/initDataSources.mjs +194 -0
- package/dist/data-sources/initDataSources.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.cjs +638 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.cts +47 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.mts +47 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.mjs +632 -0
- package/dist/data-sources/rpc-datasource/clients/MulticallClient.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/index.cjs +8 -0
- package/dist/data-sources/rpc-datasource/clients/index.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/index.d.cts +3 -0
- package/dist/data-sources/rpc-datasource/clients/index.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/index.d.mts +3 -0
- package/dist/data-sources/rpc-datasource/clients/index.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/clients/index.mjs +2 -0
- package/dist/data-sources/rpc-datasource/clients/index.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/index.cjs +9 -0
- package/dist/data-sources/rpc-datasource/index.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/index.d.cts +4 -0
- package/dist/data-sources/rpc-datasource/index.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/index.d.mts +4 -0
- package/dist/data-sources/rpc-datasource/index.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/index.mjs +3 -0
- package/dist/data-sources/rpc-datasource/index.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.cjs +167 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts +16 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts +16 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.mjs +163 -0
- package/dist/data-sources/rpc-datasource/services/BalanceFetcher.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.cjs +173 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts +14 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts +14 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.mjs +169 -0
- package/dist/data-sources/rpc-datasource/services/TokenDetector.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/index.cjs +8 -0
- package/dist/data-sources/rpc-datasource/services/index.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/services/index.d.cts +3 -0
- package/dist/data-sources/rpc-datasource/services/index.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/index.d.mts +3 -0
- package/dist/data-sources/rpc-datasource/services/index.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/services/index.mjs +3 -0
- package/dist/data-sources/rpc-datasource/services/index.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/assets.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/assets.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/assets.d.cts +53 -0
- package/dist/data-sources/rpc-datasource/types/assets.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/assets.d.mts +53 -0
- package/dist/data-sources/rpc-datasource/types/assets.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/assets.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/assets.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/config.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/config.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/config.d.cts +18 -0
- package/dist/data-sources/rpc-datasource/types/config.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/config.d.mts +18 -0
- package/dist/data-sources/rpc-datasource/types/config.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/config.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/config.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/core.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/core.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/core.d.cts +19 -0
- package/dist/data-sources/rpc-datasource/types/core.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/core.d.mts +19 -0
- package/dist/data-sources/rpc-datasource/types/core.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/core.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/core.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/index.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/index.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/index.d.cts +7 -0
- package/dist/data-sources/rpc-datasource/types/index.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/index.d.mts +7 -0
- package/dist/data-sources/rpc-datasource/types/index.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/index.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/index.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/multicall.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/multicall.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/multicall.d.cts +24 -0
- package/dist/data-sources/rpc-datasource/types/multicall.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/multicall.d.mts +24 -0
- package/dist/data-sources/rpc-datasource/types/multicall.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/multicall.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/multicall.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/services.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/services.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/services.d.cts +74 -0
- package/dist/data-sources/rpc-datasource/types/services.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/services.d.mts +74 -0
- package/dist/data-sources/rpc-datasource/types/services.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/services.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/services.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/state.cjs +3 -0
- package/dist/data-sources/rpc-datasource/types/state.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/types/state.d.cts +67 -0
- package/dist/data-sources/rpc-datasource/types/state.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/state.d.mts +67 -0
- package/dist/data-sources/rpc-datasource/types/state.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/types/state.mjs +2 -0
- package/dist/data-sources/rpc-datasource/types/state.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/batch.cjs +45 -0
- package/dist/data-sources/rpc-datasource/utils/batch.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/batch.d.cts +28 -0
- package/dist/data-sources/rpc-datasource/utils/batch.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/batch.d.mts +28 -0
- package/dist/data-sources/rpc-datasource/utils/batch.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/batch.mjs +40 -0
- package/dist/data-sources/rpc-datasource/utils/batch.mjs.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/index.cjs +7 -0
- package/dist/data-sources/rpc-datasource/utils/index.cjs.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/index.d.cts +2 -0
- package/dist/data-sources/rpc-datasource/utils/index.d.cts.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/index.d.mts +2 -0
- package/dist/data-sources/rpc-datasource/utils/index.d.mts.map +1 -0
- package/dist/data-sources/rpc-datasource/utils/index.mjs +2 -0
- package/dist/data-sources/rpc-datasource/utils/index.mjs.map +1 -0
- package/dist/index.cjs +70 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +19 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +31 -0
- package/dist/index.mjs.map +1 -1
- 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/DetectionMiddleware.cjs +101 -0
- package/dist/middlewares/DetectionMiddleware.cjs.map +1 -0
- package/dist/middlewares/DetectionMiddleware.d.cts +54 -0
- package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -0
- package/dist/middlewares/DetectionMiddleware.d.mts +54 -0
- package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -0
- package/dist/middlewares/DetectionMiddleware.mjs +97 -0
- package/dist/middlewares/DetectionMiddleware.mjs.map +1 -0
- package/dist/middlewares/index.cjs +6 -0
- package/dist/middlewares/index.cjs.map +1 -0
- package/dist/middlewares/index.d.cts +2 -0
- package/dist/middlewares/index.d.cts.map +1 -0
- package/dist/middlewares/index.d.mts +2 -0
- package/dist/middlewares/index.d.mts.map +1 -0
- package/dist/middlewares/index.mjs +2 -0
- package/dist/middlewares/index.mjs.map +1 -0
- package/dist/types.cjs +39 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +360 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +360 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +35 -0
- package/dist/types.mjs.map +1 -0
- package/dist/utils.cjs +28 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +13 -0
- package/dist/utils.d.cts.map +1 -0
- package/dist/utils.d.mts +13 -0
- package/dist/utils.d.mts.map +1 -0
- package/dist/utils.mjs +24 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +15 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MulticallClient.mjs","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/clients/MulticallClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,aAAa;AAUhE,OAAO,EAAE,uBAAuB,EAAE,2BAAiB;AAEnD,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,cAAc,GAAG;IACrB;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,SAAS;QAC1B,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;oBACnC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE;oBACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;iBACpC;aACF;SACF;QACD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;oBACjC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;iBACtC;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KAChD;CACqB,CAAC;AAEzB;;GAEG;AACH,MAAM,SAAS,GAAG;IAChB;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KAChD;CACqB,CAAC;AAEzB,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;GAEG;AACH,MAAM,YAAY,GAChB,4CAAuD,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,2BAA2B,GAAqB;IACpD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,UAAU,EAAE,4CAA4C;IACxD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,WAAW,EAAE,4CAA4C;IACzD,MAAM,EAAE,4CAA4C;IACpD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,aAAa,EAAE,4CAA4C;IAC3D,aAAa,EAAE,4CAA4C;IAC3D,YAAY,EAAE,4CAA4C;IAC1D,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,WAAW,EAAE,4CAA4C;IACzD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,YAAY,EAAE,4CAA4C;IAC1D,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,YAAY,EAAE,4CAA4C;IAC1D,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,WAAW,EAAE,4CAA4C;IACzD,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,aAAa,EAAE,4CAA4C;IAC3D,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,UAAU,EAAE,4CAA4C;IACxD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,aAAa,EAAE,4CAA4C;IAC3D,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,WAAW,EAAE,4CAA4C;IACzD,cAAc,EAAE,4CAA4C;IAC5D,UAAU,EAAE,4CAA4C;IACxD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,UAAU,EAAE,4CAA4C;IACxD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;CACxD,CAAC;AAEF,gFAAgF;AAChF,2CAA2C;AAC3C,gFAAgF;AAEhF;;;;;GAKG;AACH,SAAS,eAAe,CAAC,cAAuB;IAC9C,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE,CAAC,cAAc,CAAC;KACvB,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,cAAuB;IAClD,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,cAAc;QACnB,YAAY,EAAE,eAAe;QAC7B,IAAI,EAAE,CAAC,cAAc,CAAC;KACvB,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAA2E;IAE3E,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,cAAc;QACnB,YAAY,EAAE,YAAY;QAC1B,IAAI,EAAE;YACJ,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC;SACJ;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAS,EACT,SAAiB;IAEjB,MAAM,OAAO,GAAG,oBAAoB,CAAC;QACnC,GAAG,EAAE,cAAc;QACnB,YAAY,EAAE,YAAY;QAC1B,IAAI;KACL,CAAC,CAAC;IAEH,yEAAyE;IACzE,MAAM,OAAO,GAAG,OAGb,CAAC;IAEJ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,YAAY,SAAS,iBAAiB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,IAAS;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,6CAA6C;IAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3E,OAAO,MAAM,CAAC,KAAK,aAAa,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AACjD,CAAC;AAWD;;;GAGG;AACH,MAAM,OAAO,eAAe;IAK1B,YACE,WAAgC,EAChC,MAA8B;;QANvB,+CAAkC;QAElC,0CAAyC;QAMhD,uBAAA,IAAI,gCAAgB,WAAW,MAAA,CAAC;QAChC,uEAAuE;QACvE,gDAAgD;QAChD,MAAM,gBAAgB,GACpB,MAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC;YACnE,CAAC,CAAC,MAAM,CAAC,gBAAgB;YACzB,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,SAAS,GACb,MAAM,EAAE,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC;YACrD,CAAC,CAAC,MAAM,CAAC,SAAS;YAClB,CAAC,CAAC,KAAK,CAAC;QACZ,uBAAA,IAAI,2BAAW;YACb,gBAAgB;YAChB,SAAS;SACV,MAAA,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,cAAc,CAClB,OAAgB,EAChB,QAA4B;QAE5B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,uBAAA,IAAI,oCAAa,MAAjB,IAAI,EAAc,OAAO,CAAC,CAAC;QAE5C,gEAAgE;QAChE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,uBAAA,IAAI,2EAAwB,MAA5B,IAAI,EAAyB,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC;QAED,iBAAiB;QACjB,OAAO,uBAAA,IAAI,4EAAyB,MAA7B,IAAI,EAA0B,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAC7E,CAAC;CAiLF;;AA/KC;;;;;;;GAOG;AACH,KAAK,mDACH,QAAkB,EAClB,gBAAqB,EACrB,QAA4B;IAE5B,MAAM,SAAS,GAAG,uBAAA,IAAI,+BAAQ,CAAC,gBAAgB,CAAC;IAEhD,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAG7C;QACA,MAAM,EAAE,QAAQ;QAChB,SAAS;QACT,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,yBAAyB;gBACzB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,KAAK,YAAY,CAAC;oBACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;oBAC9D,OAAO;wBACL,MAAM;wBACN,YAAY,EAAE,IAAI;wBAClB,QAAQ,EAAE,QAAQ;4BAChB,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC;4BACzC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC;qBACxC,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,kCAAkC;gBAClC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;oBACjC,EAAE,EAAE,gBAAgB;oBACpB,IAAI,EAAE,QAAQ;iBACf,CAAC,CAAC;gBAEH,kBAAkB;gBAClB,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAEtE,gCAAgC;gBAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAClD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oBAE3C,IAAI,OAAO,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACnD,aAAa,CAAC,IAAI,CAAC;4BACjB,YAAY;4BACZ,cAAc;4BACd,OAAO,EAAE,IAAI;4BACb,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC;yBACnC,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,IAAI,CAAC;4BACjB,YAAY;4BACZ,cAAc;4BACd,OAAO,EAAE,KAAK;yBACf,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,qEAAqE;gBACrE,uEAAuE;gBACvE,6DAA6D;gBAC7D,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CACvC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAA,IAAI,uEAAoB,MAAxB,IAAI,EAAqB,QAAQ,EAAE,GAAG,CAAC,CAAC,CAC5D,CAAC;gBAEF,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;oBACrC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,OAAO,aAAa,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,KAAK,kDACH,QAAkB,EAClB,QAA4B;IAE5B,iFAAiF;IACjF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAA,IAAI,+BAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAE9D,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAG7C;QACA,MAAM,EAAE,QAAQ;QAChB,SAAS;QACT,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;YACxC,uEAAuE;YACvE,6DAA6D;YAC7D,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAA,IAAI,uEAAoB,MAAxB,IAAI,EAAqB,QAAQ,EAAE,GAAG,CAAC,CAAC,CAC5D,CAAC;YAEF,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;gBAClC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO,aAAa,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,KAAK,8CACH,QAAkB,EAClB,OAAyB;IAEzB,+DAA+D;IAC/D,gEAAgE;IAChE,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;QAEjD,8BAA8B;QAC9B,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC1D,OAAO;gBACL,YAAY;gBACZ,cAAc;gBACd,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;aAC5B,CAAC;QACJ,CAAC;QAED,eAAe;QACf,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACjC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAa,CAAC,CAAC;QAC7C,OAAO;YACL,YAAY;YACZ,cAAc;YACd,OAAO,EAAE,IAAI;YACb,OAAO;SACR,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport type { Abi } from 'viem';\nimport { decodeFunctionResult, encodeFunctionData } from 'viem';\n\nimport type {\n Address,\n BalanceOfRequest,\n BalanceOfResponse,\n ChainId,\n GetProviderFunction,\n Provider,\n} from '../types';\nimport { reduceInBatchesSerially } from '../utils';\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] as const satisfies Abi;\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] as const satisfies Abi;\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/**\n * Zero address constant for native token.\n */\nconst ZERO_ADDRESS: Address =\n '0x0000000000000000000000000000000000000000' as Address;\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};\n\n// =============================================================================\n// ENCODING/DECODING UTILITIES (using viem)\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({\n abi: ERC20_ABI,\n functionName: 'balanceOf',\n args: [accountAddress],\n });\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({\n abi: MULTICALL3_ABI,\n functionName: 'getEthBalance',\n args: [accountAddress],\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({\n abi: MULTICALL3_ABI,\n functionName: 'aggregate3',\n args: [\n calls.map((call) => ({\n target: call.target,\n allowFailure: call.allowFailure,\n callData: call.callData,\n })),\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 = decodeFunctionResult({\n abi: MULTICALL3_ABI,\n functionName: 'aggregate3',\n data,\n });\n\n // decoded is an array of { success: boolean, returnData: `0x${string}` }\n const results = decoded as readonly {\n success: boolean;\n returnData: Hex;\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,\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 const hexData = data.slice(2);\n if (hexData.length === 0) {\n return '0';\n }\n // Take first 64 chars (32 bytes) for uint256\n const normalizedHex = hexData.length > 64 ? hexData.slice(0, 64) : hexData;\n return BigInt(`0x${normalizedHex}`).toString();\n}\n\n// =============================================================================\n// MULTICALL CLIENT\n// =============================================================================\n\nexport type MulticallClientConfig = {\n maxCallsPerBatch?: number;\n timeoutMs?: number;\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 constructor(\n getProvider: GetProviderFunction,\n config?: MulticallClientConfig,\n ) {\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 }\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 * @returns Array of balance responses.\n */\n async batchBalanceOf(\n chainId: ChainId,\n requests: BalanceOfRequest[],\n ): Promise<BalanceOfResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n const multicallAddress = MULTICALL3_ADDRESS_BY_CHAIN[chainId];\n const provider = this.#getProvider(chainId);\n\n // If Multicall3 is not supported, fall back to individual calls\n if (!multicallAddress) {\n return this.#fallbackBatchBalanceOf(provider, requests);\n }\n\n // Use Multicall3\n return this.#multicallBatchBalanceOf(provider, multicallAddress, requests);\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 * @returns Array of balance responses.\n */\n async #multicallBatchBalanceOf(\n provider: Provider,\n multicallAddress: Hex,\n requests: BalanceOfRequest[],\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 try {\n // Build aggregate3 calls\n const calls = 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 ? encodeGetEthBalance(req.accountAddress)\n : encodeBalanceOf(req.accountAddress),\n };\n });\n\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(result as Hex, batch.length);\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 } catch {\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 }\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 = encodeBalanceOf(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 {\n tokenAddress: request.tokenAddress,\n accountAddress: request.accountAddress,\n success: false,\n };\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MulticallClient = exports.encodeAggregate3 = exports.decodeAggregate3Response = void 0;
|
|
4
|
+
var MulticallClient_1 = require("./MulticallClient.cjs");
|
|
5
|
+
Object.defineProperty(exports, "decodeAggregate3Response", { enumerable: true, get: function () { return MulticallClient_1.decodeAggregate3Response; } });
|
|
6
|
+
Object.defineProperty(exports, "encodeAggregate3", { enumerable: true, get: function () { return MulticallClient_1.encodeAggregate3; } });
|
|
7
|
+
Object.defineProperty(exports, "MulticallClient", { enumerable: true, get: function () { return MulticallClient_1.MulticallClient; } });
|
|
8
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/clients/index.ts"],"names":[],"mappings":";;;AAAA,yDAK2B;AAJzB,2HAAA,wBAAwB,OAAA;AACxB,mHAAA,gBAAgB,OAAA;AAChB,kHAAA,eAAe,OAAA","sourcesContent":["export {\n decodeAggregate3Response,\n encodeAggregate3,\n MulticallClient,\n type MulticallClientConfig,\n} from './MulticallClient';\n\n// Re-export provider types from types module\nexport type { GetProviderFunction, Provider } from '../types';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/clients/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,KAAK,qBAAqB,GAC3B,8BAA0B;AAG3B,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,2BAAiB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/clients/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,KAAK,qBAAqB,GAC3B,8BAA0B;AAG3B,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,2BAAiB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/clients/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EAEhB,8BAA0B","sourcesContent":["export {\n decodeAggregate3Response,\n encodeAggregate3,\n MulticallClient,\n type MulticallClientConfig,\n} from './MulticallClient';\n\n// Re-export provider types from types module\nexport type { GetProviderFunction, Provider } from '../types';\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reduceInBatchesSerially = exports.divideIntoBatches = exports.MulticallClient = void 0;
|
|
4
|
+
var clients_1 = require("./clients/index.cjs");
|
|
5
|
+
Object.defineProperty(exports, "MulticallClient", { enumerable: true, get: function () { return clients_1.MulticallClient; } });
|
|
6
|
+
var utils_1 = require("./utils/index.cjs");
|
|
7
|
+
Object.defineProperty(exports, "divideIntoBatches", { enumerable: true, get: function () { return utils_1.divideIntoBatches; } });
|
|
8
|
+
Object.defineProperty(exports, "reduceInBatchesSerially", { enumerable: true, get: function () { return utils_1.reduceInBatchesSerially; } });
|
|
9
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../../src/data-sources/rpc-datasource/index.ts"],"names":[],"mappings":";;;AAQA,+CAAwE;AAA/D,0GAAA,eAAe,OAAA;AACxB,2CAAqE;AAA5D,0GAAA,iBAAiB,OAAA;AAAE,gHAAA,uBAAuB,OAAA","sourcesContent":["export type {\n Address,\n ChainId,\n GetProviderFunction,\n Provider,\n BalanceOfRequest,\n BalanceOfResponse,\n} from './types';\nexport { MulticallClient, type MulticallClientConfig } from './clients';\nexport { divideIntoBatches, reduceInBatchesSerially } from './utils';\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { Address, ChainId, GetProviderFunction, Provider, BalanceOfRequest, BalanceOfResponse, } from "./types/index.cjs";
|
|
2
|
+
export { MulticallClient, type MulticallClientConfig } from "./clients/index.cjs";
|
|
3
|
+
export { divideIntoBatches, reduceInBatchesSerially } from "./utils/index.cjs";
|
|
4
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/data-sources/rpc-datasource/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EACP,OAAO,EACP,mBAAmB,EACnB,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,GAClB,0BAAgB;AACjB,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,4BAAkB;AACxE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,0BAAgB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { Address, ChainId, GetProviderFunction, Provider, BalanceOfRequest, BalanceOfResponse, } from "./types/index.mjs";
|
|
2
|
+
export { MulticallClient, type MulticallClientConfig } from "./clients/index.mjs";
|
|
3
|
+
export { divideIntoBatches, reduceInBatchesSerially } from "./utils/index.mjs";
|
|
4
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/data-sources/rpc-datasource/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EACP,OAAO,EACP,mBAAmB,EACnB,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,GAClB,0BAAgB;AACjB,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,4BAAkB;AACxE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,0BAAgB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/data-sources/rpc-datasource/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAA8B,4BAAkB;AACxE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,0BAAgB","sourcesContent":["export type {\n Address,\n ChainId,\n GetProviderFunction,\n Provider,\n BalanceOfRequest,\n BalanceOfResponse,\n} from './types';\nexport { MulticallClient, type MulticallClientConfig } from './clients';\nexport { divideIntoBatches, reduceInBatchesSerially } from './utils';\n"]}
|
|
@@ -0,0 +1,167 @@
|
|
|
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 _BalanceFetcher_instances, _BalanceFetcher_multicallClient, _BalanceFetcher_config, _BalanceFetcher_getUserTokensState, _BalanceFetcher_processBalanceResponses, _BalanceFetcher_formatBalance;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.BalanceFetcher = void 0;
|
|
16
|
+
const utils_1 = require("../utils/index.cjs");
|
|
17
|
+
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
18
|
+
class BalanceFetcher {
|
|
19
|
+
constructor(multicallClient, config) {
|
|
20
|
+
_BalanceFetcher_instances.add(this);
|
|
21
|
+
_BalanceFetcher_multicallClient.set(this, void 0);
|
|
22
|
+
_BalanceFetcher_config.set(this, void 0);
|
|
23
|
+
_BalanceFetcher_getUserTokensState.set(this, void 0);
|
|
24
|
+
__classPrivateFieldSet(this, _BalanceFetcher_multicallClient, multicallClient, "f");
|
|
25
|
+
__classPrivateFieldSet(this, _BalanceFetcher_config, {
|
|
26
|
+
defaultBatchSize: config?.defaultBatchSize ?? 300,
|
|
27
|
+
defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,
|
|
28
|
+
includeNativeByDefault: config?.includeNativeByDefault ?? true,
|
|
29
|
+
}, "f");
|
|
30
|
+
}
|
|
31
|
+
setUserTokensStateGetter(getUserTokensState) {
|
|
32
|
+
__classPrivateFieldSet(this, _BalanceFetcher_getUserTokensState, getUserTokensState, "f");
|
|
33
|
+
}
|
|
34
|
+
getTokensToFetch(chainId, accountAddress) {
|
|
35
|
+
const userTokensState = __classPrivateFieldGet(this, _BalanceFetcher_getUserTokensState, "f")?.call(this);
|
|
36
|
+
if (!userTokensState) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const tokenMap = new Map();
|
|
40
|
+
const addToken = (token) => {
|
|
41
|
+
const lowerAddress = token.address.toLowerCase();
|
|
42
|
+
if (!tokenMap.has(lowerAddress)) {
|
|
43
|
+
tokenMap.set(lowerAddress, {
|
|
44
|
+
address: token.address,
|
|
45
|
+
decimals: token.decimals,
|
|
46
|
+
symbol: token.symbol,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const importedTokens = userTokensState.allTokens[chainId]?.[accountAddress] ?? [];
|
|
51
|
+
for (const token of importedTokens) {
|
|
52
|
+
addToken(token);
|
|
53
|
+
}
|
|
54
|
+
const detectedTokens = userTokensState.allDetectedTokens[chainId]?.[accountAddress] ?? [];
|
|
55
|
+
for (const token of detectedTokens) {
|
|
56
|
+
addToken(token);
|
|
57
|
+
}
|
|
58
|
+
return Array.from(tokenMap.values());
|
|
59
|
+
}
|
|
60
|
+
async fetchBalances(chainId, accountId, accountAddress, options) {
|
|
61
|
+
const tokens = this.getTokensToFetch(chainId, accountAddress);
|
|
62
|
+
const tokenAddresses = tokens.map((token) => token.address);
|
|
63
|
+
return this.fetchBalancesForTokens(chainId, accountId, accountAddress, tokenAddresses, options, tokens);
|
|
64
|
+
}
|
|
65
|
+
async fetchBalancesForTokens(chainId, accountId, accountAddress, tokenAddresses, options, tokenInfos) {
|
|
66
|
+
const batchSize = options?.batchSize ?? __classPrivateFieldGet(this, _BalanceFetcher_config, "f").defaultBatchSize;
|
|
67
|
+
const includeNative = options?.includeNative ?? __classPrivateFieldGet(this, _BalanceFetcher_config, "f").includeNativeByDefault;
|
|
68
|
+
const timestamp = Date.now();
|
|
69
|
+
const tokenInfoMap = new Map();
|
|
70
|
+
if (tokenInfos) {
|
|
71
|
+
for (const info of tokenInfos) {
|
|
72
|
+
tokenInfoMap.set(info.address.toLowerCase(), info);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const balanceRequests = [];
|
|
76
|
+
if (includeNative) {
|
|
77
|
+
balanceRequests.push({
|
|
78
|
+
tokenAddress: ZERO_ADDRESS,
|
|
79
|
+
accountAddress,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
for (const tokenAddress of tokenAddresses) {
|
|
83
|
+
balanceRequests.push({
|
|
84
|
+
tokenAddress,
|
|
85
|
+
accountAddress,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (balanceRequests.length === 0) {
|
|
89
|
+
return {
|
|
90
|
+
chainId,
|
|
91
|
+
accountId,
|
|
92
|
+
accountAddress,
|
|
93
|
+
balances: [],
|
|
94
|
+
failedAddresses: [],
|
|
95
|
+
timestamp,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const result = await (0, utils_1.reduceInBatchesSerially)({
|
|
99
|
+
values: balanceRequests,
|
|
100
|
+
batchSize,
|
|
101
|
+
initialResult: {
|
|
102
|
+
balances: [],
|
|
103
|
+
failedAddresses: [],
|
|
104
|
+
},
|
|
105
|
+
eachBatch: async (workingResult, batch) => {
|
|
106
|
+
const responses = await __classPrivateFieldGet(this, _BalanceFetcher_multicallClient, "f").batchBalanceOf(chainId, batch);
|
|
107
|
+
return __classPrivateFieldGet(this, _BalanceFetcher_instances, "m", _BalanceFetcher_processBalanceResponses).call(this, responses, workingResult, chainId, accountId, timestamp, tokenInfoMap);
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
chainId,
|
|
112
|
+
accountId,
|
|
113
|
+
accountAddress,
|
|
114
|
+
...result,
|
|
115
|
+
timestamp,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.BalanceFetcher = BalanceFetcher;
|
|
120
|
+
_BalanceFetcher_multicallClient = new WeakMap(), _BalanceFetcher_config = new WeakMap(), _BalanceFetcher_getUserTokensState = new WeakMap(), _BalanceFetcher_instances = new WeakSet(), _BalanceFetcher_processBalanceResponses = function _BalanceFetcher_processBalanceResponses(responses, accumulator, chainId, accountId, timestamp, tokenInfoMap) {
|
|
121
|
+
const { balances, failedAddresses } = accumulator;
|
|
122
|
+
for (const response of responses) {
|
|
123
|
+
if (!response.success) {
|
|
124
|
+
failedAddresses.push(response.tokenAddress);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const balance = response.balance ?? '0';
|
|
128
|
+
const tokenInfo = tokenInfoMap.get(response.tokenAddress.toLowerCase());
|
|
129
|
+
const decimals = tokenInfo?.decimals ?? 18;
|
|
130
|
+
const formattedBalance = __classPrivateFieldGet(this, _BalanceFetcher_instances, "m", _BalanceFetcher_formatBalance).call(this, balance, decimals);
|
|
131
|
+
const chainIdDecimal = parseInt(chainId, 16);
|
|
132
|
+
const isNative = response.tokenAddress.toLowerCase() === ZERO_ADDRESS.toLowerCase();
|
|
133
|
+
const assetId = isNative
|
|
134
|
+
? `eip155:${chainIdDecimal}/slip44:60`
|
|
135
|
+
: `eip155:${chainIdDecimal}/erc20:${response.tokenAddress.toLowerCase()}`;
|
|
136
|
+
balances.push({
|
|
137
|
+
assetId,
|
|
138
|
+
accountId,
|
|
139
|
+
chainId,
|
|
140
|
+
balance,
|
|
141
|
+
formattedBalance,
|
|
142
|
+
decimals,
|
|
143
|
+
timestamp,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return { balances, failedAddresses };
|
|
147
|
+
}, _BalanceFetcher_formatBalance = function _BalanceFetcher_formatBalance(rawBalance, decimals) {
|
|
148
|
+
if (rawBalance === '0') {
|
|
149
|
+
return '0';
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const balanceBigInt = BigInt(rawBalance);
|
|
153
|
+
const divisor = BigInt(10 ** decimals);
|
|
154
|
+
const integerPart = balanceBigInt / divisor;
|
|
155
|
+
const remainder = balanceBigInt % divisor;
|
|
156
|
+
const fractionalStr = remainder.toString().padStart(decimals, '0');
|
|
157
|
+
const trimmedFractional = fractionalStr.replace(/0+$/u, '');
|
|
158
|
+
if (trimmedFractional === '') {
|
|
159
|
+
return integerPart.toString();
|
|
160
|
+
}
|
|
161
|
+
return `${integerPart}.${trimmedFractional}`;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return rawBalance;
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=BalanceFetcher.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalanceFetcher.cjs","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/BalanceFetcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgBA,8CAAmD;AAEnD,MAAM,YAAY,GAChB,4CAAuD,CAAC;AAQ1D,MAAa,cAAc;IAOzB,YAAY,eAAgC,EAAE,MAA6B;;QANlE,kDAAkC;QAElC,yCAAwC;QAEjD,qDAAyD;QAGvD,uBAAA,IAAI,mCAAoB,eAAe,MAAA,CAAC;QACxC,uBAAA,IAAI,0BAAW;YACb,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,GAAG;YACjD,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,KAAK;YACnD,sBAAsB,EAAE,MAAM,EAAE,sBAAsB,IAAI,IAAI;SAC/D,MAAA,CAAC;IACJ,CAAC;IAED,wBAAwB,CAAC,kBAAyC;QAChE,uBAAA,IAAI,sCAAuB,kBAAkB,MAAA,CAAC;IAChD,CAAC;IAED,gBAAgB,CACd,OAAgB,EAChB,cAAuB;QAEvB,MAAM,eAAe,GAAG,uBAAA,IAAI,0CAAoB,EAAE,KAA1B,IAAI,CAAwB,CAAC;QAErD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;QAEnD,MAAM,QAAQ,GAAG,CAAC,KAAgB,EAAQ,EAAE;YAC1C,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAChC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE;oBACzB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,cAAc,GAClB,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,cAAc,GAClB,eAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAAgB,EAChB,SAAoB,EACpB,cAAuB,EACvB,OAA6B;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC9D,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC,sBAAsB,CAChC,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,OAAO,EACP,MAAM,CACP,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,OAAgB,EAChB,SAAoB,EACpB,cAAuB,EACvB,cAAyB,EACzB,OAA6B,EAC7B,UAA6B;QAE7B,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,uBAAA,IAAI,8BAAQ,CAAC,gBAAgB,CAAC;QACtE,MAAM,aAAa,GACjB,OAAO,EAAE,aAAa,IAAI,uBAAA,IAAI,8BAAQ,CAAC,sBAAsB,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;QACvD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAAuB,EAAE,CAAC;QAE/C,IAAI,aAAa,EAAE,CAAC;YAClB,eAAe,CAAC,IAAI,CAAC;gBACnB,YAAY,EAAE,YAAY;gBAC1B,cAAc;aACf,CAAC,CAAC;QACL,CAAC;QAED,KAAK,MAAM,YAAY,IAAI,cAAc,EAAE,CAAC;YAC1C,eAAe,CAAC,IAAI,CAAC;gBACnB,YAAY;gBACZ,cAAc;aACf,CAAC,CAAC;QACL,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,OAAO;gBACP,SAAS;gBACT,cAAc;gBACd,QAAQ,EAAE,EAAE;gBACZ,eAAe,EAAE,EAAE;gBACnB,SAAS;aACV,CAAC;QACJ,CAAC;QAOD,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAuB,EAG1C;YACA,MAAM,EAAE,eAAe;YACvB,SAAS;YACT,aAAa,EAAE;gBACb,QAAQ,EAAE,EAAE;gBACZ,eAAe,EAAE,EAAE;aACpB;YACD,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;gBACxC,MAAM,SAAS,GAAG,MAAM,uBAAA,IAAI,uCAAiB,CAAC,cAAc,CAC1D,OAAO,EACP,KAAK,CACN,CAAC;gBAEF,OAAO,uBAAA,IAAI,0EAAyB,MAA7B,IAAI,EACT,SAAS,EACT,aAAiC,EACjC,OAAO,EACP,SAAS,EACT,SAAS,EACT,YAAY,CACb,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,SAAS;YACT,cAAc;YACd,GAAG,MAAM;YACT,SAAS;SACV,CAAC;IACJ,CAAC;CAyEF;AA5OD,wCA4OC;mRAtEG,SAA8B,EAC9B,WAGC,EACD,OAAgB,EAChB,SAAoB,EACpB,SAAiB,EACjB,YAAyC;IAKzC,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,WAAW,CAAC;IAElD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,GAAG,CAAC;QACxC,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,SAAS,EAAE,QAAQ,IAAI,EAAE,CAAC;QAC3C,MAAM,gBAAgB,GAAG,uBAAA,IAAI,gEAAe,MAAnB,IAAI,EAAgB,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEhE,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,QAAQ,GACZ,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,WAAW,EAAE,CAAC;QACrE,MAAM,OAAO,GAAkB,QAAQ;YACrC,CAAC,CAAE,UAAU,cAAc,YAA8B;YACzD,CAAC,CAAE,UAAU,cAAc,UAAU,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,EAAoB,CAAC;QAE/F,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO;YACP,SAAS;YACT,OAAO;YACP,OAAO;YACP,gBAAgB;YAChB,QAAQ;YACR,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AACvC,CAAC,yEAEc,UAAkB,EAAE,QAAgB;IACjD,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC;QAEvC,MAAM,WAAW,GAAG,aAAa,GAAG,OAAO,CAAC;QAC5C,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;QAC1C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACnE,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAE5D,IAAI,iBAAiB,KAAK,EAAE,EAAE,CAAC;YAC7B,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;QAChC,CAAC;QAED,OAAO,GAAG,WAAW,IAAI,iBAAiB,EAAE,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC;IACpB,CAAC;AACH,CAAC","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\nimport type { MulticallClient } from '../clients';\nimport type {\n AccountId,\n Address,\n AssetBalance,\n BalanceFetchOptions,\n BalanceFetchResult,\n BalanceOfRequest,\n BalanceOfResponse,\n ChainId,\n TokenFetchInfo,\n UserToken,\n UserTokensState,\n} from '../types';\nimport { reduceInBatchesSerially } from '../utils';\n\nconst ZERO_ADDRESS: Address =\n '0x0000000000000000000000000000000000000000' as Address;\n\nexport type BalanceFetcherConfig = {\n defaultBatchSize?: number;\n defaultTimeoutMs?: number;\n includeNativeByDefault?: boolean;\n};\n\nexport class BalanceFetcher {\n readonly #multicallClient: MulticallClient;\n\n readonly #config: Required<BalanceFetcherConfig>;\n\n #getUserTokensState: (() => UserTokensState) | undefined;\n\n constructor(multicallClient: MulticallClient, config?: BalanceFetcherConfig) {\n this.#multicallClient = multicallClient;\n this.#config = {\n defaultBatchSize: config?.defaultBatchSize ?? 300,\n defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,\n includeNativeByDefault: config?.includeNativeByDefault ?? true,\n };\n }\n\n setUserTokensStateGetter(getUserTokensState: () => UserTokensState): void {\n this.#getUserTokensState = getUserTokensState;\n }\n\n getTokensToFetch(\n chainId: ChainId,\n accountAddress: Address,\n ): TokenFetchInfo[] {\n const userTokensState = this.#getUserTokensState?.();\n\n if (!userTokensState) {\n return [];\n }\n\n const tokenMap = new Map<string, TokenFetchInfo>();\n\n const addToken = (token: UserToken): void => {\n const lowerAddress = token.address.toLowerCase();\n if (!tokenMap.has(lowerAddress)) {\n tokenMap.set(lowerAddress, {\n address: token.address,\n decimals: token.decimals,\n symbol: token.symbol,\n });\n }\n };\n\n const importedTokens =\n userTokensState.allTokens[chainId]?.[accountAddress] ?? [];\n for (const token of importedTokens) {\n addToken(token);\n }\n\n const detectedTokens =\n userTokensState.allDetectedTokens[chainId]?.[accountAddress] ?? [];\n for (const token of detectedTokens) {\n addToken(token);\n }\n\n return Array.from(tokenMap.values());\n }\n\n async fetchBalances(\n chainId: ChainId,\n accountId: AccountId,\n accountAddress: Address,\n options?: BalanceFetchOptions,\n ): Promise<BalanceFetchResult> {\n const tokens = this.getTokensToFetch(chainId, accountAddress);\n const tokenAddresses = tokens.map((token) => token.address);\n\n return this.fetchBalancesForTokens(\n chainId,\n accountId,\n accountAddress,\n tokenAddresses,\n options,\n tokens,\n );\n }\n\n async fetchBalancesForTokens(\n chainId: ChainId,\n accountId: AccountId,\n accountAddress: Address,\n tokenAddresses: Address[],\n options?: BalanceFetchOptions,\n tokenInfos?: TokenFetchInfo[],\n ): Promise<BalanceFetchResult> {\n const batchSize = options?.batchSize ?? this.#config.defaultBatchSize;\n const includeNative =\n options?.includeNative ?? this.#config.includeNativeByDefault;\n const timestamp = Date.now();\n\n const tokenInfoMap = new Map<string, TokenFetchInfo>();\n if (tokenInfos) {\n for (const info of tokenInfos) {\n tokenInfoMap.set(info.address.toLowerCase(), info);\n }\n }\n\n const balanceRequests: BalanceOfRequest[] = [];\n\n if (includeNative) {\n balanceRequests.push({\n tokenAddress: ZERO_ADDRESS,\n accountAddress,\n });\n }\n\n for (const tokenAddress of tokenAddresses) {\n balanceRequests.push({\n tokenAddress,\n accountAddress,\n });\n }\n\n if (balanceRequests.length === 0) {\n return {\n chainId,\n accountId,\n accountAddress,\n balances: [],\n failedAddresses: [],\n timestamp,\n };\n }\n\n type FetchAccumulator = {\n balances: AssetBalance[];\n failedAddresses: Address[];\n };\n\n const result = await reduceInBatchesSerially<\n BalanceOfRequest,\n FetchAccumulator\n >({\n values: balanceRequests,\n batchSize,\n initialResult: {\n balances: [],\n failedAddresses: [],\n },\n eachBatch: async (workingResult, batch) => {\n const responses = await this.#multicallClient.batchBalanceOf(\n chainId,\n batch,\n );\n\n return this.#processBalanceResponses(\n responses,\n workingResult as FetchAccumulator,\n chainId,\n accountId,\n timestamp,\n tokenInfoMap,\n );\n },\n });\n\n return {\n chainId,\n accountId,\n accountAddress,\n ...result,\n timestamp,\n };\n }\n\n #processBalanceResponses(\n responses: BalanceOfResponse[],\n accumulator: {\n balances: AssetBalance[];\n failedAddresses: Address[];\n },\n chainId: ChainId,\n accountId: AccountId,\n timestamp: number,\n tokenInfoMap: Map<string, TokenFetchInfo>,\n ): {\n balances: AssetBalance[];\n failedAddresses: Address[];\n } {\n const { balances, failedAddresses } = accumulator;\n\n for (const response of responses) {\n if (!response.success) {\n failedAddresses.push(response.tokenAddress);\n continue;\n }\n\n const balance = response.balance ?? '0';\n const tokenInfo = tokenInfoMap.get(response.tokenAddress.toLowerCase());\n const decimals = tokenInfo?.decimals ?? 18;\n const formattedBalance = this.#formatBalance(balance, decimals);\n\n const chainIdDecimal = parseInt(chainId, 16);\n const isNative =\n response.tokenAddress.toLowerCase() === ZERO_ADDRESS.toLowerCase();\n const assetId: CaipAssetType = isNative\n ? (`eip155:${chainIdDecimal}/slip44:60` as CaipAssetType)\n : (`eip155:${chainIdDecimal}/erc20:${response.tokenAddress.toLowerCase()}` as CaipAssetType);\n\n balances.push({\n assetId,\n accountId,\n chainId,\n balance,\n formattedBalance,\n decimals,\n timestamp,\n });\n }\n\n return { balances, failedAddresses };\n }\n\n #formatBalance(rawBalance: string, decimals: number): string {\n if (rawBalance === '0') {\n return '0';\n }\n\n try {\n const balanceBigInt = BigInt(rawBalance);\n const divisor = BigInt(10 ** decimals);\n\n const integerPart = balanceBigInt / divisor;\n const remainder = balanceBigInt % divisor;\n const fractionalStr = remainder.toString().padStart(decimals, '0');\n const trimmedFractional = fractionalStr.replace(/0+$/u, '');\n\n if (trimmedFractional === '') {\n return integerPart.toString();\n }\n\n return `${integerPart}.${trimmedFractional}`;\n } catch {\n return rawBalance;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MulticallClient } from "../clients/index.cjs";
|
|
2
|
+
import type { AccountId, Address, BalanceFetchOptions, BalanceFetchResult, ChainId, TokenFetchInfo, UserTokensState } from "../types/index.cjs";
|
|
3
|
+
export type BalanceFetcherConfig = {
|
|
4
|
+
defaultBatchSize?: number;
|
|
5
|
+
defaultTimeoutMs?: number;
|
|
6
|
+
includeNativeByDefault?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare class BalanceFetcher {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(multicallClient: MulticallClient, config?: BalanceFetcherConfig);
|
|
11
|
+
setUserTokensStateGetter(getUserTokensState: () => UserTokensState): void;
|
|
12
|
+
getTokensToFetch(chainId: ChainId, accountAddress: Address): TokenFetchInfo[];
|
|
13
|
+
fetchBalances(chainId: ChainId, accountId: AccountId, accountAddress: Address, options?: BalanceFetchOptions): Promise<BalanceFetchResult>;
|
|
14
|
+
fetchBalancesForTokens(chainId: ChainId, accountId: AccountId, accountAddress: Address, tokenAddresses: Address[], options?: BalanceFetchOptions, tokenInfos?: TokenFetchInfo[]): Promise<BalanceFetchResult>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=BalanceFetcher.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalanceFetcher.d.cts","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/BalanceFetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,6BAAmB;AAClD,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EAEP,mBAAmB,EACnB,kBAAkB,EAGlB,OAAO,EACP,cAAc,EAEd,eAAe,EAChB,2BAAiB;AAMlB,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF,qBAAa,cAAc;;gBAOb,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,oBAAoB;IAS3E,wBAAwB,CAAC,kBAAkB,EAAE,MAAM,eAAe,GAAG,IAAI;IAIzE,gBAAgB,CACd,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,OAAO,GACtB,cAAc,EAAE;IAmCb,aAAa,CACjB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAcxB,sBAAsB,CAC1B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,cAAc,EAAE,OAAO,EAAE,EACzB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,UAAU,CAAC,EAAE,cAAc,EAAE,GAC5B,OAAO,CAAC,kBAAkB,CAAC;CAwJ/B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MulticallClient } from "../clients/index.mjs";
|
|
2
|
+
import type { AccountId, Address, BalanceFetchOptions, BalanceFetchResult, ChainId, TokenFetchInfo, UserTokensState } from "../types/index.mjs";
|
|
3
|
+
export type BalanceFetcherConfig = {
|
|
4
|
+
defaultBatchSize?: number;
|
|
5
|
+
defaultTimeoutMs?: number;
|
|
6
|
+
includeNativeByDefault?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare class BalanceFetcher {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(multicallClient: MulticallClient, config?: BalanceFetcherConfig);
|
|
11
|
+
setUserTokensStateGetter(getUserTokensState: () => UserTokensState): void;
|
|
12
|
+
getTokensToFetch(chainId: ChainId, accountAddress: Address): TokenFetchInfo[];
|
|
13
|
+
fetchBalances(chainId: ChainId, accountId: AccountId, accountAddress: Address, options?: BalanceFetchOptions): Promise<BalanceFetchResult>;
|
|
14
|
+
fetchBalancesForTokens(chainId: ChainId, accountId: AccountId, accountAddress: Address, tokenAddresses: Address[], options?: BalanceFetchOptions, tokenInfos?: TokenFetchInfo[]): Promise<BalanceFetchResult>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=BalanceFetcher.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalanceFetcher.d.mts","sourceRoot":"","sources":["../../../../src/data-sources/rpc-datasource/services/BalanceFetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,6BAAmB;AAClD,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EAEP,mBAAmB,EACnB,kBAAkB,EAGlB,OAAO,EACP,cAAc,EAEd,eAAe,EAChB,2BAAiB;AAMlB,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF,qBAAa,cAAc;;gBAOb,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,oBAAoB;IAS3E,wBAAwB,CAAC,kBAAkB,EAAE,MAAM,eAAe,GAAG,IAAI;IAIzE,gBAAgB,CACd,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,OAAO,GACtB,cAAc,EAAE;IAmCb,aAAa,CACjB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAcxB,sBAAsB,CAC1B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,OAAO,EACvB,cAAc,EAAE,OAAO,EAAE,EACzB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,UAAU,CAAC,EAAE,cAAc,EAAE,GAC5B,OAAO,CAAC,kBAAkB,CAAC;CAwJ/B"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _BalanceFetcher_instances, _BalanceFetcher_multicallClient, _BalanceFetcher_config, _BalanceFetcher_getUserTokensState, _BalanceFetcher_processBalanceResponses, _BalanceFetcher_formatBalance;
|
|
13
|
+
import { reduceInBatchesSerially } from "../utils/index.mjs";
|
|
14
|
+
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
15
|
+
export class BalanceFetcher {
|
|
16
|
+
constructor(multicallClient, config) {
|
|
17
|
+
_BalanceFetcher_instances.add(this);
|
|
18
|
+
_BalanceFetcher_multicallClient.set(this, void 0);
|
|
19
|
+
_BalanceFetcher_config.set(this, void 0);
|
|
20
|
+
_BalanceFetcher_getUserTokensState.set(this, void 0);
|
|
21
|
+
__classPrivateFieldSet(this, _BalanceFetcher_multicallClient, multicallClient, "f");
|
|
22
|
+
__classPrivateFieldSet(this, _BalanceFetcher_config, {
|
|
23
|
+
defaultBatchSize: config?.defaultBatchSize ?? 300,
|
|
24
|
+
defaultTimeoutMs: config?.defaultTimeoutMs ?? 30000,
|
|
25
|
+
includeNativeByDefault: config?.includeNativeByDefault ?? true,
|
|
26
|
+
}, "f");
|
|
27
|
+
}
|
|
28
|
+
setUserTokensStateGetter(getUserTokensState) {
|
|
29
|
+
__classPrivateFieldSet(this, _BalanceFetcher_getUserTokensState, getUserTokensState, "f");
|
|
30
|
+
}
|
|
31
|
+
getTokensToFetch(chainId, accountAddress) {
|
|
32
|
+
const userTokensState = __classPrivateFieldGet(this, _BalanceFetcher_getUserTokensState, "f")?.call(this);
|
|
33
|
+
if (!userTokensState) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
const tokenMap = new Map();
|
|
37
|
+
const addToken = (token) => {
|
|
38
|
+
const lowerAddress = token.address.toLowerCase();
|
|
39
|
+
if (!tokenMap.has(lowerAddress)) {
|
|
40
|
+
tokenMap.set(lowerAddress, {
|
|
41
|
+
address: token.address,
|
|
42
|
+
decimals: token.decimals,
|
|
43
|
+
symbol: token.symbol,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const importedTokens = userTokensState.allTokens[chainId]?.[accountAddress] ?? [];
|
|
48
|
+
for (const token of importedTokens) {
|
|
49
|
+
addToken(token);
|
|
50
|
+
}
|
|
51
|
+
const detectedTokens = userTokensState.allDetectedTokens[chainId]?.[accountAddress] ?? [];
|
|
52
|
+
for (const token of detectedTokens) {
|
|
53
|
+
addToken(token);
|
|
54
|
+
}
|
|
55
|
+
return Array.from(tokenMap.values());
|
|
56
|
+
}
|
|
57
|
+
async fetchBalances(chainId, accountId, accountAddress, options) {
|
|
58
|
+
const tokens = this.getTokensToFetch(chainId, accountAddress);
|
|
59
|
+
const tokenAddresses = tokens.map((token) => token.address);
|
|
60
|
+
return this.fetchBalancesForTokens(chainId, accountId, accountAddress, tokenAddresses, options, tokens);
|
|
61
|
+
}
|
|
62
|
+
async fetchBalancesForTokens(chainId, accountId, accountAddress, tokenAddresses, options, tokenInfos) {
|
|
63
|
+
const batchSize = options?.batchSize ?? __classPrivateFieldGet(this, _BalanceFetcher_config, "f").defaultBatchSize;
|
|
64
|
+
const includeNative = options?.includeNative ?? __classPrivateFieldGet(this, _BalanceFetcher_config, "f").includeNativeByDefault;
|
|
65
|
+
const timestamp = Date.now();
|
|
66
|
+
const tokenInfoMap = new Map();
|
|
67
|
+
if (tokenInfos) {
|
|
68
|
+
for (const info of tokenInfos) {
|
|
69
|
+
tokenInfoMap.set(info.address.toLowerCase(), info);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const balanceRequests = [];
|
|
73
|
+
if (includeNative) {
|
|
74
|
+
balanceRequests.push({
|
|
75
|
+
tokenAddress: ZERO_ADDRESS,
|
|
76
|
+
accountAddress,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
for (const tokenAddress of tokenAddresses) {
|
|
80
|
+
balanceRequests.push({
|
|
81
|
+
tokenAddress,
|
|
82
|
+
accountAddress,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (balanceRequests.length === 0) {
|
|
86
|
+
return {
|
|
87
|
+
chainId,
|
|
88
|
+
accountId,
|
|
89
|
+
accountAddress,
|
|
90
|
+
balances: [],
|
|
91
|
+
failedAddresses: [],
|
|
92
|
+
timestamp,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const result = await reduceInBatchesSerially({
|
|
96
|
+
values: balanceRequests,
|
|
97
|
+
batchSize,
|
|
98
|
+
initialResult: {
|
|
99
|
+
balances: [],
|
|
100
|
+
failedAddresses: [],
|
|
101
|
+
},
|
|
102
|
+
eachBatch: async (workingResult, batch) => {
|
|
103
|
+
const responses = await __classPrivateFieldGet(this, _BalanceFetcher_multicallClient, "f").batchBalanceOf(chainId, batch);
|
|
104
|
+
return __classPrivateFieldGet(this, _BalanceFetcher_instances, "m", _BalanceFetcher_processBalanceResponses).call(this, responses, workingResult, chainId, accountId, timestamp, tokenInfoMap);
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
chainId,
|
|
109
|
+
accountId,
|
|
110
|
+
accountAddress,
|
|
111
|
+
...result,
|
|
112
|
+
timestamp,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
_BalanceFetcher_multicallClient = new WeakMap(), _BalanceFetcher_config = new WeakMap(), _BalanceFetcher_getUserTokensState = new WeakMap(), _BalanceFetcher_instances = new WeakSet(), _BalanceFetcher_processBalanceResponses = function _BalanceFetcher_processBalanceResponses(responses, accumulator, chainId, accountId, timestamp, tokenInfoMap) {
|
|
117
|
+
const { balances, failedAddresses } = accumulator;
|
|
118
|
+
for (const response of responses) {
|
|
119
|
+
if (!response.success) {
|
|
120
|
+
failedAddresses.push(response.tokenAddress);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const balance = response.balance ?? '0';
|
|
124
|
+
const tokenInfo = tokenInfoMap.get(response.tokenAddress.toLowerCase());
|
|
125
|
+
const decimals = tokenInfo?.decimals ?? 18;
|
|
126
|
+
const formattedBalance = __classPrivateFieldGet(this, _BalanceFetcher_instances, "m", _BalanceFetcher_formatBalance).call(this, balance, decimals);
|
|
127
|
+
const chainIdDecimal = parseInt(chainId, 16);
|
|
128
|
+
const isNative = response.tokenAddress.toLowerCase() === ZERO_ADDRESS.toLowerCase();
|
|
129
|
+
const assetId = isNative
|
|
130
|
+
? `eip155:${chainIdDecimal}/slip44:60`
|
|
131
|
+
: `eip155:${chainIdDecimal}/erc20:${response.tokenAddress.toLowerCase()}`;
|
|
132
|
+
balances.push({
|
|
133
|
+
assetId,
|
|
134
|
+
accountId,
|
|
135
|
+
chainId,
|
|
136
|
+
balance,
|
|
137
|
+
formattedBalance,
|
|
138
|
+
decimals,
|
|
139
|
+
timestamp,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return { balances, failedAddresses };
|
|
143
|
+
}, _BalanceFetcher_formatBalance = function _BalanceFetcher_formatBalance(rawBalance, decimals) {
|
|
144
|
+
if (rawBalance === '0') {
|
|
145
|
+
return '0';
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const balanceBigInt = BigInt(rawBalance);
|
|
149
|
+
const divisor = BigInt(10 ** decimals);
|
|
150
|
+
const integerPart = balanceBigInt / divisor;
|
|
151
|
+
const remainder = balanceBigInt % divisor;
|
|
152
|
+
const fractionalStr = remainder.toString().padStart(decimals, '0');
|
|
153
|
+
const trimmedFractional = fractionalStr.replace(/0+$/u, '');
|
|
154
|
+
if (trimmedFractional === '') {
|
|
155
|
+
return integerPart.toString();
|
|
156
|
+
}
|
|
157
|
+
return `${integerPart}.${trimmedFractional}`;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return rawBalance;
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=BalanceFetcher.mjs.map
|