@talismn/balances 0.0.0-pr2075-20250711045153 → 0.0.0-pr2075-20250711064604

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.
@@ -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
- const assetStorageEntries = assetStorageResults[0].changes;
2903
- const metadataStorageEntries = metadataStorageResults[0].changes;
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
@@ -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
- const assetStorageEntries = assetStorageResults[0].changes;
2903
- const metadataStorageEntries = metadataStorageResults[0].changes;
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
@@ -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
- const assetStorageEntries = assetStorageResults[0].changes;
2894
- const metadataStorageEntries = metadataStorageResults[0].changes;
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talismn/balances",
3
- "version": "0.0.0-pr2075-20250711045153",
3
+ "version": "0.0.0-pr2075-20250711064604",
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-20250711045153",
38
- "@talismn/chain-connector-evm": "0.0.0-pr2075-20250711045153",
39
- "@talismn/chaindata-provider": "0.0.0-pr2075-20250711045153",
40
- "@talismn/sapi": "0.0.0-pr2075-20250711045153",
41
- "@talismn/scale": "0.0.0-pr2075-20250711045153",
42
- "@talismn/token-rates": "0.0.0-pr2075-20250711045153",
43
- "@talismn/util": "0.0.0-pr2075-20250711045153"
37
+ "@talismn/chain-connector": "0.0.0-pr2075-20250711064604",
38
+ "@talismn/chain-connector-evm": "0.0.0-pr2075-20250711064604",
39
+ "@talismn/sapi": "0.0.0-pr2075-20250711064604",
40
+ "@talismn/chaindata-provider": "0.0.0-pr2075-20250711064604",
41
+ "@talismn/scale": "0.0.0-pr2075-20250711064604",
42
+ "@talismn/token-rates": "0.0.0-pr2075-20250711064604",
43
+ "@talismn/util": "0.0.0-pr2075-20250711064604"
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/tsconfig": "0.0.2",
59
- "@talismn/eslint-config": "0.0.3"
58
+ "@talismn/eslint-config": "0.0.3",
59
+ "@talismn/tsconfig": "0.0.2"
60
60
  },
61
61
  "peerDependencies": {
62
62
  "@polkadot/api-contract": "*",