@talismn/balances 0.0.0-pr2075-20250711045153 → 0.0.0-pr2075-20250711073805
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.
@@ -20,6 +20,7 @@ export declare class BalancesProvider {
|
|
20
20
|
fetchBalances(addressesByTokenId: Record<TokenId, Address[]>): Promise<IBalance[]>;
|
21
21
|
private getNetworkBalances$;
|
22
22
|
private getNetworkMiniMetadatas$;
|
23
|
+
private getNetworkSpecVersion$;
|
23
24
|
private getMiniMetadatas$;
|
24
25
|
private getStoredMiniMetadatas$;
|
25
26
|
private getDefaultMiniMetadatas$;
|
@@ -5,3 +5,8 @@ export type BalanceDef<T extends TokenType = TokenType> = {
|
|
5
5
|
address: TokenPlatform<T> extends "ethereum" ? `0x${string}` : string;
|
6
6
|
};
|
7
7
|
export declare const getBalanceDefs: <T extends TokenType = TokenType>(addressesByToken: TokensWithAddresses) => BalanceDef<T>[];
|
8
|
+
export type QueryStorageChange = [stateKey: `0x${string}`, value: `0x${string}`];
|
9
|
+
export type QueryStorageResult = [{
|
10
|
+
block: `0x${string}`;
|
11
|
+
changes: QueryStorageChange[];
|
12
|
+
}] | [];
|
@@ -621,6 +621,10 @@ const getBalanceDefs = addressesByToken => {
|
|
621
621
|
})));
|
622
622
|
};
|
623
623
|
|
624
|
+
// esponse of getStorageAt queries:
|
625
|
+
// if there is at least one storage entry, the results will be an array with a single object
|
626
|
+
// if the storage has no entries in it (ex: Assets on ewx or moonbeam), the response will be an empty array
|
627
|
+
|
624
628
|
const fetchBalances$8 = async ({
|
625
629
|
networkId,
|
626
630
|
tokensWithAddresses,
|
@@ -1502,7 +1506,7 @@ const decodeRpcQueryPack = (queries, result) => {
|
|
1502
1506
|
decodeResult
|
1503
1507
|
}) => {
|
1504
1508
|
const changes = stateKeys.map(stateKey => {
|
1505
|
-
if (!stateKey) return null;
|
1509
|
+
if (!stateKey || !result) return null;
|
1506
1510
|
const change = result.changes.find(([key]) => key === stateKey);
|
1507
1511
|
if (!change) return null;
|
1508
1512
|
return change[1];
|
@@ -1750,8 +1754,8 @@ const fetchTokens$5 = async ({
|
|
1750
1754
|
const metadataCodec = builder.buildStorage("Assets", "Metadata");
|
1751
1755
|
const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("Assets", "Asset")]), connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("Assets", "Metadata")])]);
|
1752
1756
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
1753
|
-
const assetStorageEntries = assetStorageResults[0].changes;
|
1754
|
-
const metadataStorageEntries = metadataStorageResults[0].changes;
|
1757
|
+
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
1758
|
+
const metadataStorageEntries = metadataStorageResults.length ? metadataStorageResults[0].changes : [];
|
1755
1759
|
const assetByAssetId = lodashEs.keyBy(assetStorageEntries.map(([key, value]) => {
|
1756
1760
|
const [assetId] = assetCodec.keys.dec(key);
|
1757
1761
|
const asset = assetCodec.value.dec(value);
|
@@ -2899,8 +2903,11 @@ const fetchTokens$4 = async ({
|
|
2899
2903
|
const metadataCodec = builder.buildStorage("ForeignAssets", "Metadata");
|
2900
2904
|
const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("ForeignAssets", "Asset")]), connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("ForeignAssets", "Metadata")])]);
|
2901
2905
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
2902
|
-
|
2903
|
-
|
2906
|
+
|
2907
|
+
// if there is at least one storage entry, the results will be an array with a single object
|
2908
|
+
// some networks avec the pallet with no tokens in it, in which case the response will be an empty array
|
2909
|
+
const assetStorageEntries = assetStorageResults[0]?.changes ?? [];
|
2910
|
+
const metadataStorageEntries = metadataStorageResults[0]?.changes ?? [];
|
2904
2911
|
const assetByOnChainId = lodashEs.keyBy(assetStorageEntries.map(([key, value]) => {
|
2905
2912
|
const [decodedKey] = assetCodec.keys.dec(key);
|
2906
2913
|
const onChainId = scale.papiStringify(decodedKey);
|
@@ -3241,7 +3248,7 @@ const fetchTokens$3 = async ({
|
|
3241
3248
|
const assetsCodec = builder.buildStorage("AssetRegistry", "Assets");
|
3242
3249
|
const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("AssetRegistry", "Assets")]);
|
3243
3250
|
const assetStorageResults = await connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]);
|
3244
|
-
const assetStorageEntries = assetStorageResults[0].changes;
|
3251
|
+
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
3245
3252
|
const configTokenByAssetId = lodashEs.keyBy(tokens, t => t.onChainId);
|
3246
3253
|
return assetStorageEntries.map(([key, value]) => {
|
3247
3254
|
// parse results
|
@@ -6328,7 +6335,9 @@ class BalancesProvider {
|
|
6328
6335
|
networkId,
|
6329
6336
|
tokensWithAddresses,
|
6330
6337
|
connector: this.#chainConnectors.evm
|
6331
|
-
}).pipe(rxjs.
|
6338
|
+
}).pipe(rxjs.catchError(() => rxjs.EMPTY),
|
6339
|
+
// don't emit, let provider mark balances stale
|
6340
|
+
rxjs.map(results => ({
|
6332
6341
|
status: "live",
|
6333
6342
|
// exclude zero balances
|
6334
6343
|
balances: results.success.filter(b => new Balance(b).total.planck > 0n)
|
@@ -6344,7 +6353,9 @@ class BalancesProvider {
|
|
6344
6353
|
tokensWithAddresses,
|
6345
6354
|
connector: this.#chainConnectors.substrate,
|
6346
6355
|
miniMetadata: miniMetadata
|
6347
|
-
}).pipe(rxjs.
|
6356
|
+
}).pipe(rxjs.catchError(() => rxjs.EMPTY),
|
6357
|
+
// don't emit, let provider mark balances stale
|
6358
|
+
rxjs.map(results => ({
|
6348
6359
|
status: "live",
|
6349
6360
|
// exclude zero balances
|
6350
6361
|
balances: results.success.filter(b => new Balance(b).total.planck > 0n)
|
@@ -6371,7 +6382,20 @@ class BalancesProvider {
|
|
6371
6382
|
});
|
6372
6383
|
}
|
6373
6384
|
getNetworkMiniMetadatas$(networkId) {
|
6374
|
-
return this.#chaindataProvider.getNetworkById$(networkId).pipe(rxjs.switchMap(network => chaindataProvider.isNetworkDot(network)
|
6385
|
+
return this.#chaindataProvider.getNetworkById$(networkId).pipe(rxjs.switchMap(network => chaindataProvider.isNetworkDot(network) ? this.getNetworkSpecVersion$(networkId).pipe(rxjs.switchMap(specVersion => specVersion === null ? rxjs.of([]) : this.getMiniMetadatas$(networkId, specVersion))) : rxjs.of([])));
|
6386
|
+
}
|
6387
|
+
getNetworkSpecVersion$(networkId) {
|
6388
|
+
return rxjs.from(viem.withRetry(async () => {
|
6389
|
+
if (!this.#chainConnectors.substrate) return null;
|
6390
|
+
return await getSpecVersion(this.#chainConnectors.substrate, networkId);
|
6391
|
+
}, {
|
6392
|
+
delay: 2_000
|
6393
|
+
})).pipe(rxjs.catchError(() => {
|
6394
|
+
log.warn("Failed to fetch spec version for network", {
|
6395
|
+
networkId
|
6396
|
+
});
|
6397
|
+
return rxjs.of(null);
|
6398
|
+
}));
|
6375
6399
|
}
|
6376
6400
|
getMiniMetadatas$(networkId, specVersion) {
|
6377
6401
|
const miniMetadataIds = BALANCE_MODULES.filter(mod => mod.platform === "polkadot").map(mod => deriveMiniMetadataId({
|
@@ -621,6 +621,10 @@ const getBalanceDefs = addressesByToken => {
|
|
621
621
|
})));
|
622
622
|
};
|
623
623
|
|
624
|
+
// esponse of getStorageAt queries:
|
625
|
+
// if there is at least one storage entry, the results will be an array with a single object
|
626
|
+
// if the storage has no entries in it (ex: Assets on ewx or moonbeam), the response will be an empty array
|
627
|
+
|
624
628
|
const fetchBalances$8 = async ({
|
625
629
|
networkId,
|
626
630
|
tokensWithAddresses,
|
@@ -1502,7 +1506,7 @@ const decodeRpcQueryPack = (queries, result) => {
|
|
1502
1506
|
decodeResult
|
1503
1507
|
}) => {
|
1504
1508
|
const changes = stateKeys.map(stateKey => {
|
1505
|
-
if (!stateKey) return null;
|
1509
|
+
if (!stateKey || !result) return null;
|
1506
1510
|
const change = result.changes.find(([key]) => key === stateKey);
|
1507
1511
|
if (!change) return null;
|
1508
1512
|
return change[1];
|
@@ -1750,8 +1754,8 @@ const fetchTokens$5 = async ({
|
|
1750
1754
|
const metadataCodec = builder.buildStorage("Assets", "Metadata");
|
1751
1755
|
const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("Assets", "Asset")]), connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("Assets", "Metadata")])]);
|
1752
1756
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
1753
|
-
const assetStorageEntries = assetStorageResults[0].changes;
|
1754
|
-
const metadataStorageEntries = metadataStorageResults[0].changes;
|
1757
|
+
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
1758
|
+
const metadataStorageEntries = metadataStorageResults.length ? metadataStorageResults[0].changes : [];
|
1755
1759
|
const assetByAssetId = lodashEs.keyBy(assetStorageEntries.map(([key, value]) => {
|
1756
1760
|
const [assetId] = assetCodec.keys.dec(key);
|
1757
1761
|
const asset = assetCodec.value.dec(value);
|
@@ -2899,8 +2903,11 @@ const fetchTokens$4 = async ({
|
|
2899
2903
|
const metadataCodec = builder.buildStorage("ForeignAssets", "Metadata");
|
2900
2904
|
const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("ForeignAssets", "Asset")]), connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("ForeignAssets", "Metadata")])]);
|
2901
2905
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
2902
|
-
|
2903
|
-
|
2906
|
+
|
2907
|
+
// if there is at least one storage entry, the results will be an array with a single object
|
2908
|
+
// some networks avec the pallet with no tokens in it, in which case the response will be an empty array
|
2909
|
+
const assetStorageEntries = assetStorageResults[0]?.changes ?? [];
|
2910
|
+
const metadataStorageEntries = metadataStorageResults[0]?.changes ?? [];
|
2904
2911
|
const assetByOnChainId = lodashEs.keyBy(assetStorageEntries.map(([key, value]) => {
|
2905
2912
|
const [decodedKey] = assetCodec.keys.dec(key);
|
2906
2913
|
const onChainId = scale.papiStringify(decodedKey);
|
@@ -3241,7 +3248,7 @@ const fetchTokens$3 = async ({
|
|
3241
3248
|
const assetsCodec = builder.buildStorage("AssetRegistry", "Assets");
|
3242
3249
|
const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("AssetRegistry", "Assets")]);
|
3243
3250
|
const assetStorageResults = await connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]);
|
3244
|
-
const assetStorageEntries = assetStorageResults[0].changes;
|
3251
|
+
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
3245
3252
|
const configTokenByAssetId = lodashEs.keyBy(tokens, t => t.onChainId);
|
3246
3253
|
return assetStorageEntries.map(([key, value]) => {
|
3247
3254
|
// parse results
|
@@ -6328,7 +6335,9 @@ class BalancesProvider {
|
|
6328
6335
|
networkId,
|
6329
6336
|
tokensWithAddresses,
|
6330
6337
|
connector: this.#chainConnectors.evm
|
6331
|
-
}).pipe(rxjs.
|
6338
|
+
}).pipe(rxjs.catchError(() => rxjs.EMPTY),
|
6339
|
+
// don't emit, let provider mark balances stale
|
6340
|
+
rxjs.map(results => ({
|
6332
6341
|
status: "live",
|
6333
6342
|
// exclude zero balances
|
6334
6343
|
balances: results.success.filter(b => new Balance(b).total.planck > 0n)
|
@@ -6344,7 +6353,9 @@ class BalancesProvider {
|
|
6344
6353
|
tokensWithAddresses,
|
6345
6354
|
connector: this.#chainConnectors.substrate,
|
6346
6355
|
miniMetadata: miniMetadata
|
6347
|
-
}).pipe(rxjs.
|
6356
|
+
}).pipe(rxjs.catchError(() => rxjs.EMPTY),
|
6357
|
+
// don't emit, let provider mark balances stale
|
6358
|
+
rxjs.map(results => ({
|
6348
6359
|
status: "live",
|
6349
6360
|
// exclude zero balances
|
6350
6361
|
balances: results.success.filter(b => new Balance(b).total.planck > 0n)
|
@@ -6371,7 +6382,20 @@ class BalancesProvider {
|
|
6371
6382
|
});
|
6372
6383
|
}
|
6373
6384
|
getNetworkMiniMetadatas$(networkId) {
|
6374
|
-
return this.#chaindataProvider.getNetworkById$(networkId).pipe(rxjs.switchMap(network => chaindataProvider.isNetworkDot(network)
|
6385
|
+
return this.#chaindataProvider.getNetworkById$(networkId).pipe(rxjs.switchMap(network => chaindataProvider.isNetworkDot(network) ? this.getNetworkSpecVersion$(networkId).pipe(rxjs.switchMap(specVersion => specVersion === null ? rxjs.of([]) : this.getMiniMetadatas$(networkId, specVersion))) : rxjs.of([])));
|
6386
|
+
}
|
6387
|
+
getNetworkSpecVersion$(networkId) {
|
6388
|
+
return rxjs.from(viem.withRetry(async () => {
|
6389
|
+
if (!this.#chainConnectors.substrate) return null;
|
6390
|
+
return await getSpecVersion(this.#chainConnectors.substrate, networkId);
|
6391
|
+
}, {
|
6392
|
+
delay: 2_000
|
6393
|
+
})).pipe(rxjs.catchError(() => {
|
6394
|
+
log.warn("Failed to fetch spec version for network", {
|
6395
|
+
networkId
|
6396
|
+
});
|
6397
|
+
return rxjs.of(null);
|
6398
|
+
}));
|
6375
6399
|
}
|
6376
6400
|
getMiniMetadatas$(networkId, specVersion) {
|
6377
6401
|
const miniMetadataIds = BALANCE_MODULES.filter(mod => mod.platform === "polkadot").map(mod => deriveMiniMetadataId({
|
@@ -5,7 +5,7 @@ import { parseAbi, erc20Abi, getContract, ContractFunctionExecutionError, hexToS
|
|
5
5
|
import { assign, omit, isEqual, keyBy, keys, uniq, fromPairs, values, toPairs } from 'lodash-es';
|
6
6
|
import z from 'zod/v4';
|
7
7
|
import anylogger from 'anylogger';
|
8
|
-
import { of, Observable, distinctUntilChanged, map, timer, switchMap, from, firstValueFrom, combineLatest, BehaviorSubject, shareReplay, startWith, filter, tap } from 'rxjs';
|
8
|
+
import { of, Observable, distinctUntilChanged, map, timer, switchMap, from, firstValueFrom, combineLatest, BehaviorSubject, shareReplay, startWith, filter, catchError, EMPTY, tap } from 'rxjs';
|
9
9
|
import { parseMetadataRpc, toHex, unifyMetadata, decAnyMetadata, getDynamicBuilder, getLookupFn, decodeScale, getStorageKeyPrefix, Twox128, compactMetadata, encodeMetadata, papiParse, papiStringify } from '@talismn/scale';
|
10
10
|
import { newTokenRates } from '@talismn/token-rates';
|
11
11
|
import BigNumber from 'bignumber.js';
|
@@ -612,6 +612,10 @@ const getBalanceDefs = addressesByToken => {
|
|
612
612
|
})));
|
613
613
|
};
|
614
614
|
|
615
|
+
// esponse of getStorageAt queries:
|
616
|
+
// if there is at least one storage entry, the results will be an array with a single object
|
617
|
+
// if the storage has no entries in it (ex: Assets on ewx or moonbeam), the response will be an empty array
|
618
|
+
|
615
619
|
const fetchBalances$8 = async ({
|
616
620
|
networkId,
|
617
621
|
tokensWithAddresses,
|
@@ -1493,7 +1497,7 @@ const decodeRpcQueryPack = (queries, result) => {
|
|
1493
1497
|
decodeResult
|
1494
1498
|
}) => {
|
1495
1499
|
const changes = stateKeys.map(stateKey => {
|
1496
|
-
if (!stateKey) return null;
|
1500
|
+
if (!stateKey || !result) return null;
|
1497
1501
|
const change = result.changes.find(([key]) => key === stateKey);
|
1498
1502
|
if (!change) return null;
|
1499
1503
|
return change[1];
|
@@ -1741,8 +1745,8 @@ const fetchTokens$5 = async ({
|
|
1741
1745
|
const metadataCodec = builder.buildStorage("Assets", "Metadata");
|
1742
1746
|
const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([connector.send(networkId, "state_getKeys", [getStorageKeyPrefix("Assets", "Asset")]), connector.send(networkId, "state_getKeys", [getStorageKeyPrefix("Assets", "Metadata")])]);
|
1743
1747
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
1744
|
-
const assetStorageEntries = assetStorageResults[0].changes;
|
1745
|
-
const metadataStorageEntries = metadataStorageResults[0].changes;
|
1748
|
+
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
1749
|
+
const metadataStorageEntries = metadataStorageResults.length ? metadataStorageResults[0].changes : [];
|
1746
1750
|
const assetByAssetId = keyBy(assetStorageEntries.map(([key, value]) => {
|
1747
1751
|
const [assetId] = assetCodec.keys.dec(key);
|
1748
1752
|
const asset = assetCodec.value.dec(value);
|
@@ -2890,8 +2894,11 @@ const fetchTokens$4 = async ({
|
|
2890
2894
|
const metadataCodec = builder.buildStorage("ForeignAssets", "Metadata");
|
2891
2895
|
const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([connector.send(networkId, "state_getKeys", [getStorageKeyPrefix("ForeignAssets", "Asset")]), connector.send(networkId, "state_getKeys", [getStorageKeyPrefix("ForeignAssets", "Metadata")])]);
|
2892
2896
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
2893
|
-
|
2894
|
-
|
2897
|
+
|
2898
|
+
// if there is at least one storage entry, the results will be an array with a single object
|
2899
|
+
// some networks avec the pallet with no tokens in it, in which case the response will be an empty array
|
2900
|
+
const assetStorageEntries = assetStorageResults[0]?.changes ?? [];
|
2901
|
+
const metadataStorageEntries = metadataStorageResults[0]?.changes ?? [];
|
2895
2902
|
const assetByOnChainId = keyBy(assetStorageEntries.map(([key, value]) => {
|
2896
2903
|
const [decodedKey] = assetCodec.keys.dec(key);
|
2897
2904
|
const onChainId = papiStringify(decodedKey);
|
@@ -3232,7 +3239,7 @@ const fetchTokens$3 = async ({
|
|
3232
3239
|
const assetsCodec = builder.buildStorage("AssetRegistry", "Assets");
|
3233
3240
|
const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [getStorageKeyPrefix("AssetRegistry", "Assets")]);
|
3234
3241
|
const assetStorageResults = await connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]);
|
3235
|
-
const assetStorageEntries = assetStorageResults[0].changes;
|
3242
|
+
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
3236
3243
|
const configTokenByAssetId = keyBy(tokens, t => t.onChainId);
|
3237
3244
|
return assetStorageEntries.map(([key, value]) => {
|
3238
3245
|
// parse results
|
@@ -6319,7 +6326,9 @@ class BalancesProvider {
|
|
6319
6326
|
networkId,
|
6320
6327
|
tokensWithAddresses,
|
6321
6328
|
connector: this.#chainConnectors.evm
|
6322
|
-
}).pipe(
|
6329
|
+
}).pipe(catchError(() => EMPTY),
|
6330
|
+
// don't emit, let provider mark balances stale
|
6331
|
+
map(results => ({
|
6323
6332
|
status: "live",
|
6324
6333
|
// exclude zero balances
|
6325
6334
|
balances: results.success.filter(b => new Balance(b).total.planck > 0n)
|
@@ -6335,7 +6344,9 @@ class BalancesProvider {
|
|
6335
6344
|
tokensWithAddresses,
|
6336
6345
|
connector: this.#chainConnectors.substrate,
|
6337
6346
|
miniMetadata: miniMetadata
|
6338
|
-
}).pipe(
|
6347
|
+
}).pipe(catchError(() => EMPTY),
|
6348
|
+
// don't emit, let provider mark balances stale
|
6349
|
+
map(results => ({
|
6339
6350
|
status: "live",
|
6340
6351
|
// exclude zero balances
|
6341
6352
|
balances: results.success.filter(b => new Balance(b).total.planck > 0n)
|
@@ -6362,7 +6373,20 @@ class BalancesProvider {
|
|
6362
6373
|
});
|
6363
6374
|
}
|
6364
6375
|
getNetworkMiniMetadatas$(networkId) {
|
6365
|
-
return this.#chaindataProvider.getNetworkById$(networkId).pipe(switchMap(network => isNetworkDot(network)
|
6376
|
+
return this.#chaindataProvider.getNetworkById$(networkId).pipe(switchMap(network => isNetworkDot(network) ? this.getNetworkSpecVersion$(networkId).pipe(switchMap(specVersion => specVersion === null ? of([]) : this.getMiniMetadatas$(networkId, specVersion))) : of([])));
|
6377
|
+
}
|
6378
|
+
getNetworkSpecVersion$(networkId) {
|
6379
|
+
return from(withRetry(async () => {
|
6380
|
+
if (!this.#chainConnectors.substrate) return null;
|
6381
|
+
return await getSpecVersion(this.#chainConnectors.substrate, networkId);
|
6382
|
+
}, {
|
6383
|
+
delay: 2_000
|
6384
|
+
})).pipe(catchError(() => {
|
6385
|
+
log.warn("Failed to fetch spec version for network", {
|
6386
|
+
networkId
|
6387
|
+
});
|
6388
|
+
return of(null);
|
6389
|
+
}));
|
6366
6390
|
}
|
6367
6391
|
getMiniMetadatas$(networkId, specVersion) {
|
6368
6392
|
const miniMetadataIds = BALANCE_MODULES.filter(mod => mod.platform === "polkadot").map(mod => deriveMiniMetadataId({
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@talismn/balances",
|
3
|
-
"version": "0.0.0-pr2075-
|
3
|
+
"version": "0.0.0-pr2075-20250711073805",
|
4
4
|
"author": "Talisman",
|
5
5
|
"homepage": "https://talisman.xyz",
|
6
6
|
"license": "GPL-3.0-or-later",
|
@@ -34,13 +34,13 @@
|
|
34
34
|
"scale-ts": "^1.6.1",
|
35
35
|
"viem": "^2.27.3",
|
36
36
|
"zod": "^3.25.62",
|
37
|
-
"@talismn/chain-connector": "0.0.0-pr2075-
|
38
|
-
"@talismn/chain-connector-evm": "0.0.0-pr2075-
|
39
|
-
"@talismn/
|
40
|
-
"@talismn/sapi": "0.0.0-pr2075-
|
41
|
-
"@talismn/
|
42
|
-
"@talismn/token-rates": "0.0.0-pr2075-
|
43
|
-
"@talismn/util": "0.0.0-pr2075-
|
37
|
+
"@talismn/chain-connector": "0.0.0-pr2075-20250711073805",
|
38
|
+
"@talismn/chain-connector-evm": "0.0.0-pr2075-20250711073805",
|
39
|
+
"@talismn/scale": "0.0.0-pr2075-20250711073805",
|
40
|
+
"@talismn/sapi": "0.0.0-pr2075-20250711073805",
|
41
|
+
"@talismn/chaindata-provider": "0.0.0-pr2075-20250711073805",
|
42
|
+
"@talismn/token-rates": "0.0.0-pr2075-20250711073805",
|
43
|
+
"@talismn/util": "0.0.0-pr2075-20250711073805"
|
44
44
|
},
|
45
45
|
"devDependencies": {
|
46
46
|
"@polkadot/api-contract": "16.1.2",
|
@@ -55,8 +55,8 @@
|
|
55
55
|
"jest": "^29.7.0",
|
56
56
|
"ts-jest": "^29.2.5",
|
57
57
|
"typescript": "^5.6.3",
|
58
|
-
"@talismn/
|
59
|
-
"@talismn/
|
58
|
+
"@talismn/eslint-config": "0.0.3",
|
59
|
+
"@talismn/tsconfig": "0.0.2"
|
60
60
|
},
|
61
61
|
"peerDependencies": {
|
62
62
|
"@polkadot/api-contract": "*",
|