@talismn/balances 1.4.0 → 2.0.0

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/dist/index.js CHANGED
@@ -81,7 +81,9 @@ __export(index_exports, {
81
81
  excludeFromTransferableAmount: () => excludeFromTransferableAmount,
82
82
  filterBaseLocks: () => filterBaseLocks,
83
83
  filterMirrorTokens: () => filterMirrorTokens,
84
+ findDTaoConvictionLock: () => findDTaoConvictionLock,
84
85
  getBalanceId: () => getBalanceId,
86
+ getConvictionLockLabel: () => getConvictionLockLabel,
85
87
  getDTaoTokenRates: () => getDTaoTokenRates,
86
88
  getLockTitle: () => getLockTitle,
87
89
  getLockedType: () => getLockedType,
@@ -89,14 +91,20 @@ __export(index_exports, {
89
91
  getValueId: () => getValueId,
90
92
  includeInTotalExtraAmount: () => includeInTotalExtraAmount,
91
93
  taoToAlpha: () => taoToAlpha,
94
+ taoToAlphaCeil: () => taoToAlphaCeil,
92
95
  uniswapV2PairAbi: () => uniswapV2PairAbi
93
96
  });
94
97
  module.exports = __toCommonJS(index_exports);
95
98
 
99
+ // src/configureBigNumber.ts
100
+ var import_bignumber = __toESM(require("bignumber.js"));
101
+ import_bignumber.default.set({ STRICT: false });
102
+ var configureBigNumber_default = import_bignumber.default;
103
+
96
104
  // src/BalancesProvider.ts
97
105
  var import_chaindata_provider71 = require("@talismn/chaindata-provider");
98
106
  var import_crypto8 = require("@talismn/crypto");
99
- var import_util15 = require("@talismn/util");
107
+ var import_util17 = require("@talismn/util");
100
108
  var import_lodash_es30 = require("lodash-es");
101
109
  var import_rxjs16 = require("rxjs");
102
110
  var import_viem9 = require("viem");
@@ -110,7 +118,7 @@ var import_anylogger = __toESM(require("anylogger"));
110
118
  // package.json
111
119
  var package_default = {
112
120
  name: "@talismn/balances",
113
- version: "1.4.0",
121
+ version: "2.0.0",
114
122
  author: "Talisman",
115
123
  homepage: "https://talisman.xyz",
116
124
  license: "GPL-3.0-or-later",
@@ -138,9 +146,9 @@ var package_default = {
138
146
  },
139
147
  dependencies: {
140
148
  "@metaplex-foundation/mpl-token-metadata": "^3.4.0",
141
- "@metaplex-foundation/umi": "^1.2.0",
142
- "@polkadot-api/utils": "0.2.0",
143
- "@solana/spl-token": "^0.4.13",
149
+ "@metaplex-foundation/umi": "^1.5.1",
150
+ "@polkadot-api/utils": "0.4.0",
151
+ "@solana/spl-token": "^0.4.14",
144
152
  "@solana/web3.js": "^1.98.2",
145
153
  "@talismn/chain-connectors": "workspace:*",
146
154
  "@talismn/chaindata-provider": "workspace:*",
@@ -150,21 +158,22 @@ var package_default = {
150
158
  "@talismn/token-rates": "workspace:*",
151
159
  "@talismn/util": "workspace:*",
152
160
  anylogger: "^1.0.11",
153
- "bignumber.js": "^9.1.2",
154
- "lodash-es": "4.17.21",
161
+ "bignumber.js": "^11.1.3",
162
+ "lodash-es": "4.18.1",
155
163
  "p-queue": "8.1.0",
156
- "polkadot-api": "1.23.3",
157
- rxjs: "^7.8.1",
164
+ "polkadot-api": "2.1.6",
165
+ rxjs: "^7.8.2",
158
166
  "scale-ts": "^1.6.1",
159
- viem: "^2.27.3",
160
- zod: "^3.25.76"
167
+ viem: "2.52.2",
168
+ zod: "^4.4.3"
161
169
  },
162
170
  devDependencies: {
163
171
  "@polkadot/api-contract": "16.1.2",
164
172
  "@polkadot/types": "16.1.2",
165
173
  "@talismn/tsconfig": "workspace:*",
166
174
  "@types/lodash-es": "4.17.12",
167
- typescript: "^5.6.3"
175
+ "@types/node": "^24.5.1",
176
+ typescript: "^6.0.3"
168
177
  },
169
178
  peerDependencies: {
170
179
  "@polkadot/api-contract": "*",
@@ -1088,6 +1097,7 @@ var import_lodash_es = require("lodash-es");
1088
1097
  var import_v4 = __toESM(require("zod/v4"));
1089
1098
 
1090
1099
  // src/modules/evm-erc20/utils.ts
1100
+ var import_util = require("@talismn/util");
1091
1101
  var import_viem4 = require("viem");
1092
1102
  var getErc20ContractData = async (client, contractAddress) => {
1093
1103
  try {
@@ -1098,7 +1108,7 @@ var getErc20ContractData = async (client, contractAddress) => {
1098
1108
  contract.read.name()
1099
1109
  ]);
1100
1110
  } catch (e) {
1101
- if (e instanceof import_viem4.ContractFunctionExecutionError) {
1111
+ if ((0, import_util.isErrorOfName)(e, "ContractFunctionExecutionError")) {
1102
1112
  const contract = getTypedContract(client, import_viem4.erc20Abi_bytes32, contractAddress);
1103
1113
  var [bytesSymbol, decimals, nameSymbol] = await Promise.all([
1104
1114
  contract.read.symbol(),
@@ -1315,21 +1325,30 @@ var fetchBalances2 = async ({
1315
1325
  }
1316
1326
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
1317
1327
  if (client.chain?.contracts?.multicall3 && balanceDefs.length > 1) {
1318
- const multicall3 = client.chain.contracts.multicall3;
1319
- return fetchWithMulticall(client, balanceDefs, multicall3.address);
1328
+ try {
1329
+ return await fetchWithMulticall(
1330
+ client,
1331
+ balanceDefs,
1332
+ client.chain.contracts.multicall3.address
1333
+ );
1334
+ } catch {
1335
+ }
1320
1336
  }
1321
- return fetchWithoutMulticall(client, balanceDefs);
1337
+ return fetchWithGetBalance(client, balanceDefs);
1322
1338
  };
1323
- var fetchWithoutMulticall = async (client, balanceDefs) => {
1339
+ var fetchWithGetBalance = async (client, balanceDefs) => {
1324
1340
  if (balanceDefs.length === 0) return { success: [], errors: [] };
1325
1341
  const results = await Promise.allSettled(
1326
1342
  balanceDefs.map(async ({ token, address }) => {
1327
1343
  try {
1328
- const result = await client.getBalance({ address });
1344
+ const result = await client.request({
1345
+ method: "eth_getBalance",
1346
+ params: [address, "latest"]
1347
+ });
1329
1348
  const balance = {
1330
1349
  address,
1331
1350
  tokenId: token.id,
1332
- value: result.toString(),
1351
+ value: BigInt(result).toString(),
1333
1352
  source: MODULE_TYPE2,
1334
1353
  networkId: (0, import_chaindata_provider8.parseTokenId)(token.id).networkId,
1335
1354
  status: "live"
@@ -1363,55 +1382,28 @@ var fetchWithoutMulticall = async (client, balanceDefs) => {
1363
1382
  };
1364
1383
  var fetchWithMulticall = async (client, balanceDefs, multicall3Address) => {
1365
1384
  if (balanceDefs.length === 0) return { success: [], errors: [] };
1366
- try {
1367
- const callResults = await client.multicall({
1368
- contracts: balanceDefs.map(({ address }) => ({
1369
- address: multicall3Address,
1370
- abi: abiMulticall,
1371
- functionName: "getEthBalance",
1372
- args: [address]
1373
- }))
1374
- });
1375
- return callResults.reduce(
1376
- (acc, result, index) => {
1377
- if (result.status === "success") {
1378
- acc.success.push({
1379
- address: balanceDefs[index].address,
1380
- tokenId: balanceDefs[index].token.id,
1381
- value: result.result.toString(),
1382
- source: MODULE_TYPE2,
1383
- networkId: (0, import_chaindata_provider8.parseTokenId)(balanceDefs[index].token.id).networkId,
1384
- status: "live"
1385
- });
1386
- }
1387
- if (result.status === "failure") {
1388
- acc.errors.push({
1389
- tokenId: balanceDefs[index].token.id,
1390
- address: balanceDefs[index].address,
1391
- error: new BalanceFetchError(
1392
- `Failed to get balance for token ${balanceDefs[index].token.id} and address ${balanceDefs[index].address} on chain ${client.chain?.id}`,
1393
- balanceDefs[index].token.id,
1394
- balanceDefs[index].address,
1395
- result.error
1396
- )
1397
- });
1398
- }
1399
- return acc;
1400
- },
1401
- { success: [], errors: [] }
1402
- );
1403
- } catch (err) {
1404
- const errors = balanceDefs.map((balanceDef) => ({
1405
- tokenId: balanceDef.token.id,
1406
- address: balanceDef.address,
1407
- error: new BalanceFetchNetworkError(
1408
- `Failed to get balances for evm-erc20 tokens on chain ${client.chain?.id}`,
1409
- String(client.chain?.id),
1410
- err
1411
- )
1412
- }));
1413
- return { success: [], errors };
1414
- }
1385
+ const results = await client.multicall({
1386
+ allowFailure: false,
1387
+ contracts: balanceDefs.map(({ address }) => ({
1388
+ address: multicall3Address,
1389
+ abi: abiMulticall,
1390
+ functionName: "getEthBalance",
1391
+ args: [address]
1392
+ }))
1393
+ });
1394
+ return {
1395
+ success: results.map(
1396
+ (value, index) => ({
1397
+ address: balanceDefs[index].address,
1398
+ tokenId: balanceDefs[index].token.id,
1399
+ value: String(value),
1400
+ source: MODULE_TYPE2,
1401
+ networkId: (0, import_chaindata_provider8.parseTokenId)(balanceDefs[index].token.id).networkId,
1402
+ status: "live"
1403
+ })
1404
+ ),
1405
+ errors: []
1406
+ };
1415
1407
  };
1416
1408
 
1417
1409
  // src/modules/evm-native/fetchTokens.ts
@@ -1529,7 +1521,6 @@ var PLATFORM3 = import_chaindata_provider11.EvmUniswapV2TokenSchema.shape.platfo
1529
1521
  // src/modules/evm-uniswapv2/fetchBalances.ts
1530
1522
  var import_chaindata_provider12 = require("@talismn/chaindata-provider");
1531
1523
  var import_crypto5 = require("@talismn/crypto");
1532
- var import_bignumber = __toESM(require("bignumber.js"));
1533
1524
  var import_lodash_es5 = require("lodash-es");
1534
1525
  var import_viem6 = require("viem");
1535
1526
  var fetchBalances3 = async ({
@@ -1621,7 +1612,7 @@ var fetchPoolBalances = async (client, balanceDefs) => {
1621
1612
  label,
1622
1613
  amount
1623
1614
  });
1624
- const ratio = (0, import_bignumber.default)(String(balance)).div(totalSupply === 0n ? "1" : String(totalSupply));
1615
+ const ratio = configureBigNumber_default(String(balance)).div(totalSupply === 0n ? "1" : String(totalSupply));
1625
1616
  acc.success.push({
1626
1617
  address,
1627
1618
  tokenId: token.id,
@@ -1650,6 +1641,7 @@ var import_lodash_es6 = require("lodash-es");
1650
1641
  var import_v44 = __toESM(require("zod/v4"));
1651
1642
 
1652
1643
  // src/modules/evm-uniswapv2/utils.ts
1644
+ var import_util2 = require("@talismn/util");
1653
1645
  var import_viem7 = require("viem");
1654
1646
  var getErc20ContractData2 = async (client, contractAddress) => {
1655
1647
  try {
@@ -1660,7 +1652,7 @@ var getErc20ContractData2 = async (client, contractAddress) => {
1660
1652
  contract.read.name()
1661
1653
  ]);
1662
1654
  } catch (e) {
1663
- if (e instanceof import_viem7.ContractFunctionExecutionError) {
1655
+ if ((0, import_util2.isErrorOfName)(e, "ContractFunctionExecutionError")) {
1664
1656
  const contract = getTypedContract2(client, import_viem7.erc20Abi_bytes32, contractAddress);
1665
1657
  var [bytesSymbol, decimals, nameSymbol] = await Promise.all([
1666
1658
  contract.read.symbol(),
@@ -2056,7 +2048,7 @@ var PLATFORM5 = import_chaindata_provider19.SolSplTokenSchema.shape.platform.val
2056
2048
  // src/modules/sol-spl/fetchBalances.ts
2057
2049
  var import_web34 = require("@solana/web3.js");
2058
2050
  var import_chaindata_provider22 = require("@talismn/chaindata-provider");
2059
- var import_util2 = require("@talismn/util");
2051
+ var import_util4 = require("@talismn/util");
2060
2052
  var import_lodash_es12 = require("lodash-es");
2061
2053
 
2062
2054
  // src/modules/shared/buildNetworkStorageCoders.ts
@@ -2094,9 +2086,9 @@ var buildNetworkStorageCoders = (chainId, miniMetadata, coders) => {
2094
2086
 
2095
2087
  // src/modules/shared/fetchRuntimeCallResult.ts
2096
2088
  var import_scale2 = require("@talismn/scale");
2097
- var fetchRuntimeCallResult = async (connector, networkId, metadataRpc, apiName, method, args) => {
2089
+ var fetchRuntimeCallResult = async (connector, networkId, metadataRpcOrBuilder, apiName, method, args) => {
2098
2090
  try {
2099
- const { builder } = (0, import_scale2.parseMetadataRpc)(metadataRpc);
2091
+ const builder = typeof metadataRpcOrBuilder === "string" ? (0, import_scale2.parseMetadataRpc)(metadataRpcOrBuilder).builder : metadataRpcOrBuilder;
2100
2092
  const call = builder.buildRuntimeCall(apiName, method);
2101
2093
  const hex = await connector.send(networkId, "state_call", [
2102
2094
  `${apiName}_${method}`,
@@ -2111,11 +2103,11 @@ var fetchRuntimeCallResult = async (connector, networkId, metadataRpc, apiName,
2111
2103
  };
2112
2104
 
2113
2105
  // src/modules/shared/rpcQueryPack.ts
2114
- var import_util = require("@talismn/util");
2106
+ var import_util3 = require("@talismn/util");
2115
2107
  var import_lodash_es10 = require("lodash-es");
2116
2108
  var import_rxjs5 = require("rxjs");
2117
2109
  var fetchRpcQueryPack = async (connector, networkId, queries) => {
2118
- const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(import_util.isNotNil);
2110
+ const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(import_util3.isNotNil);
2119
2111
  if (!allStateKeys.length)
2120
2112
  return queries.map(({ stateKeys, decodeResult }) => decodeResult(stateKeys.map(() => null)));
2121
2113
  const [result] = await connector.send(networkId, "state_queryStorageAt", [
@@ -2124,7 +2116,7 @@ var fetchRpcQueryPack = async (connector, networkId, queries) => {
2124
2116
  return decodeRpcQueryPack(queries, result);
2125
2117
  };
2126
2118
  var getRpcQueryPack$ = (connector, networkId, queries, timeout = false) => {
2127
- const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(import_util.isNotNil);
2119
+ const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(import_util3.isNotNil);
2128
2120
  if (!allStateKeys.length)
2129
2121
  return (0, import_rxjs5.of)(queries.map(({ stateKeys, decodeResult }) => decodeResult(stateKeys.map(() => null))));
2130
2122
  return new import_rxjs5.Observable((subscriber) => {
@@ -2167,17 +2159,17 @@ var decodeRpcQueryPack = (queries, result) => {
2167
2159
  var import_scale3 = require("@talismn/scale");
2168
2160
  var hasStorageItem = (metadata, palletName, itemName) => {
2169
2161
  const pallet = metadata.pallets.find((p) => p.name === palletName);
2170
- if (!pallet || !pallet.storage) return false;
2162
+ if (!pallet?.storage) return false;
2171
2163
  return pallet.storage.items.some((item) => item.name === itemName);
2172
2164
  };
2173
2165
  var hasStorageItems = (metadata, palletName, itemNames) => {
2174
2166
  const pallet = metadata.pallets.find((p) => p.name === palletName);
2175
- if (!pallet || !pallet.storage) return false;
2167
+ if (!pallet?.storage) return false;
2176
2168
  return itemNames.every((itemName) => pallet.storage?.items.some((item) => item.name === itemName));
2177
2169
  };
2178
2170
  var hasRuntimeApi = (metadata, apiName, method) => {
2179
2171
  const api = metadata.apis.find((api2) => api2.name === apiName);
2180
- if (!api || !api.methods) return false;
2172
+ if (!api?.methods) return false;
2181
2173
  return api.methods.some((m) => m.name === method);
2182
2174
  };
2183
2175
  var getConstantValue = (metadataRpc, pallet, constant) => {
@@ -2321,7 +2313,7 @@ var fetchBalances5 = async ({
2321
2313
  });
2322
2314
  return null;
2323
2315
  }
2324
- }).filter(import_util2.isNotNil);
2316
+ }).filter(import_util4.isNotNil);
2325
2317
  setDetectedTokenIds(
2326
2318
  address,
2327
2319
  MODULE_TYPE5,
@@ -2343,7 +2335,7 @@ var fetchBalances5 = async ({
2343
2335
  cached = fetched;
2344
2336
  }
2345
2337
  }
2346
- if (!cached || !cached.isValid) return;
2338
+ if (!cached?.isValid) return;
2347
2339
  const token = {
2348
2340
  id: tokenId,
2349
2341
  type: MODULE_TYPE5,
@@ -2549,7 +2541,7 @@ var PLATFORM6 = import_chaindata_provider26.SolToken2022TokenSchema.shape.platfo
2549
2541
  // src/modules/sol-token2022/fetchBalances.ts
2550
2542
  var import_web37 = require("@solana/web3.js");
2551
2543
  var import_chaindata_provider28 = require("@talismn/chaindata-provider");
2552
- var import_util3 = require("@talismn/util");
2544
+ var import_util5 = require("@talismn/util");
2553
2545
  var import_lodash_es15 = require("lodash-es");
2554
2546
 
2555
2547
  // src/modules/sol-token2022/onChainTokenMetadata.ts
@@ -2703,7 +2695,7 @@ var fetchBalances6 = async ({
2703
2695
  });
2704
2696
  return null;
2705
2697
  }
2706
- }).filter(import_util3.isNotNil);
2698
+ }).filter(import_util5.isNotNil);
2707
2699
  setDetectedTokenIds(
2708
2700
  address,
2709
2701
  MODULE_TYPE6,
@@ -2725,7 +2717,7 @@ var fetchBalances6 = async ({
2725
2717
  cached = fetched;
2726
2718
  }
2727
2719
  }
2728
- if (!cached || !cached.isValid) return;
2720
+ if (!cached?.isValid) return;
2729
2721
  const token = {
2730
2722
  id: tokenId,
2731
2723
  type: MODULE_TYPE6,
@@ -3003,7 +2995,7 @@ var PLATFORM7 = import_chaindata_provider32.SubAssetsTokenSchema.shape.platform.
3003
2995
 
3004
2996
  // src/modules/substrate-assets/buildQueries.ts
3005
2997
  var import_scale4 = require("@talismn/scale");
3006
- var import_util4 = require("@talismn/util");
2998
+ var import_util6 = require("@talismn/util");
3007
2999
  var buildQueries = (networkId, balanceDefs, miniMetadata) => {
3008
3000
  const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
3009
3001
  storage: ["Assets", "Account"]
@@ -3052,7 +3044,7 @@ var buildQueries = (networkId, balanceDefs, miniMetadata) => {
3052
3044
  stateKeys: [stateKey],
3053
3045
  decodeResult
3054
3046
  };
3055
- }).filter(import_util4.isNotNil);
3047
+ }).filter(import_util6.isNotNil);
3056
3048
  };
3057
3049
  var tryEncode = (scaleCoder, ...args) => {
3058
3050
  try {
@@ -3136,6 +3128,7 @@ var fetchBalances7 = async ({
3136
3128
  var import_chaindata_provider33 = require("@talismn/chaindata-provider");
3137
3129
  var import_scale5 = require("@talismn/scale");
3138
3130
  var import_lodash_es18 = require("lodash-es");
3131
+ var import_polkadot_api = require("polkadot-api");
3139
3132
  var fetchTokens7 = async ({
3140
3133
  networkId,
3141
3134
  tokens,
@@ -3177,8 +3170,8 @@ var fetchTokens7 = async ({
3177
3170
  assetId,
3178
3171
  decimals: metadata.decimals,
3179
3172
  isFrozen: metadata.is_frozen,
3180
- name: metadata.name?.asText(),
3181
- symbol: metadata.symbol?.asText()
3173
+ name: metadata.name ? import_polkadot_api.Binary.toText(metadata.name) : void 0,
3174
+ symbol: metadata.symbol ? import_polkadot_api.Binary.toText(metadata.symbol) : void 0
3182
3175
  };
3183
3176
  }),
3184
3177
  (a) => a.assetId
@@ -3216,13 +3209,12 @@ var fetchTokens7 = async ({
3216
3209
 
3217
3210
  // src/modules/substrate-assets/getMiniMetadata.ts
3218
3211
  var import_chaindata_provider44 = require("@talismn/chaindata-provider");
3219
- var import_scale11 = require("@talismn/scale");
3212
+ var import_scale12 = require("@talismn/scale");
3220
3213
 
3221
3214
  // src/types/balances.ts
3222
3215
  var import_chaindata_provider42 = require("@talismn/chaindata-provider");
3223
3216
  var import_token_rates2 = require("@talismn/token-rates");
3224
- var import_util7 = require("@talismn/util");
3225
- var import_bignumber2 = __toESM(require("bignumber.js"));
3217
+ var import_util9 = require("@talismn/util");
3226
3218
 
3227
3219
  // src/modules/substrate-dtao/alphaPrice.ts
3228
3220
  var TAO_DECIMALS = 9n;
@@ -3239,12 +3231,189 @@ var taoToAlpha = (tao, scaledAlphaPrice) => {
3239
3231
  if (!tao || !scaledAlphaPrice) return 0n;
3240
3232
  return tao * ALPHA_PRICE_SCALE / scaledAlphaPrice;
3241
3233
  };
3234
+ var taoToAlphaCeil = (tao, scaledAlphaPrice) => {
3235
+ if (!tao || !scaledAlphaPrice) return 0n;
3236
+ return (tao * ALPHA_PRICE_SCALE + scaledAlphaPrice - 1n) / scaledAlphaPrice;
3237
+ };
3238
+
3239
+ // src/modules/substrate-dtao/convictionLocks.ts
3240
+ var import_scale6 = require("@talismn/scale");
3241
+ var convictionLockKey = (address, netuid) => `${address}:${netuid}`;
3242
+ var getConvictionLockLabel = (lockType) => lockType === "perpetual" ? "Perpetual Conviction Lock" : "Decaying Conviction Lock";
3243
+ var findDTaoConvictionLock = (locks) => {
3244
+ for (const lock of locks ?? []) {
3245
+ const meta = lock.meta;
3246
+ if (meta?.convictionLock?.type !== "conviction-lock") continue;
3247
+ const lockType = meta.convictionLock.lockType;
3248
+ return {
3249
+ amount: lock.amount.planck,
3250
+ hotkey: meta.convictionLock.hotkey,
3251
+ lockType,
3252
+ label: getConvictionLockLabel(lockType)
3253
+ };
3254
+ }
3255
+ return null;
3256
+ };
3257
+ var toBigIntValue = (value) => {
3258
+ if (typeof value === "bigint") return value;
3259
+ if (value && typeof value === "object" && "bits" in value) {
3260
+ const bits = value.bits;
3261
+ if (typeof bits === "bigint") return bits;
3262
+ }
3263
+ return 0n;
3264
+ };
3265
+ var fetchConvictionLocks = async (connector, networkId, metadataRpc, addresses) => {
3266
+ if (!addresses.length) return [];
3267
+ const { unifiedMetadata, builder } = (0, import_scale6.parseMetadataRpc)(metadataRpc);
3268
+ if (!hasRuntimeApi(unifiedMetadata, "StakeInfoRuntimeApi", "get_coldkey_lock") || !hasStorageItems(unifiedMetadata, "SubtensorModule", ["Lock", "DecayingLock"])) {
3269
+ return [];
3270
+ }
3271
+ try {
3272
+ const lockStorageCoder = builder.buildStorage("SubtensorModule", "Lock");
3273
+ const decayingLockStorageCoder = builder.buildStorage("SubtensorModule", "DecayingLock");
3274
+ const lockStorageKeys = await fetchConvictionLockStorageKeys(
3275
+ connector,
3276
+ networkId,
3277
+ addresses,
3278
+ lockStorageCoder
3279
+ );
3280
+ if (!lockStorageKeys.length) return [];
3281
+ const hotkeyByPair = new Map(
3282
+ lockStorageKeys.map(({ address, netuid, hotkey }) => [
3283
+ convictionLockKey(address, netuid),
3284
+ hotkey
3285
+ ])
3286
+ );
3287
+ const [lockModesByPair, lockStates] = await Promise.all([
3288
+ fetchConvictionLockModes(connector, networkId, lockStorageKeys, decayingLockStorageCoder),
3289
+ fetchColdkeyLockStates(connector, networkId, builder, lockStorageKeys)
3290
+ ]);
3291
+ return lockStates.flatMap(({ address, netuid, lockState }) => {
3292
+ const amount = lockState?.locked_mass ?? 0n;
3293
+ const convictionRaw = toBigIntValue(lockState?.conviction);
3294
+ if (amount <= 0n && convictionRaw <= 0n) return [];
3295
+ const hotkey = hotkeyByPair.get(convictionLockKey(address, netuid));
3296
+ if (!hotkey) return [];
3297
+ return [
3298
+ {
3299
+ address,
3300
+ netuid,
3301
+ lock: {
3302
+ amount,
3303
+ hotkey,
3304
+ lockType: lockModesByPair.get(convictionLockKey(address, netuid)) ?? "decaying",
3305
+ convictionRaw: convictionRaw.toString()
3306
+ }
3307
+ }
3308
+ ];
3309
+ });
3310
+ } catch (cause) {
3311
+ log_default.warn(`Failed to fetch Bittensor conviction locks on ${networkId}`, { cause });
3312
+ return [];
3313
+ }
3314
+ };
3315
+ var fetchConvictionLockStorageKeys = async (connector, networkId, addresses, storageCoder) => {
3316
+ const keysPerAddress = await Promise.all(
3317
+ addresses.map(async (address) => {
3318
+ let keyPrefix;
3319
+ try {
3320
+ keyPrefix = storageCoder.keys.enc(address);
3321
+ } catch (cause) {
3322
+ log_default.warn(
3323
+ `Failed to encode conviction Lock key prefix (address=${address}) on ${networkId}`,
3324
+ { cause }
3325
+ );
3326
+ return [];
3327
+ }
3328
+ try {
3329
+ const stateKeys = await connector.send(networkId, "state_getKeys", [
3330
+ keyPrefix
3331
+ ]);
3332
+ return stateKeys.flatMap((stateKey) => {
3333
+ try {
3334
+ const [, netuid, hotkey] = storageCoder.keys.dec(stateKey);
3335
+ return [{ address, netuid, hotkey }];
3336
+ } catch (cause) {
3337
+ log_default.warn(`Failed to decode conviction Lock key ${stateKey} on ${networkId}`, { cause });
3338
+ return [];
3339
+ }
3340
+ });
3341
+ } catch (cause) {
3342
+ log_default.warn(`Failed to fetch conviction Lock keys (address=${address}) on ${networkId}`, {
3343
+ cause
3344
+ });
3345
+ return [];
3346
+ }
3347
+ })
3348
+ );
3349
+ return keysPerAddress.flat();
3350
+ };
3351
+ var fetchConvictionLockModes = async (connector, networkId, pairs, storageCoder) => {
3352
+ const queries = pairs.map(
3353
+ ({ address, netuid }) => {
3354
+ let stateKey = null;
3355
+ try {
3356
+ stateKey = storageCoder.keys.enc(address, netuid);
3357
+ } catch (cause) {
3358
+ log_default.warn(
3359
+ `Failed to encode conviction DecayingLock key (netuid=${netuid}, address=${address}) on ${networkId}`,
3360
+ { cause }
3361
+ );
3362
+ }
3363
+ const key = convictionLockKey(address, netuid);
3364
+ return {
3365
+ stateKeys: [stateKey],
3366
+ decodeResult: (changes) => {
3367
+ const hexValue = changes[0];
3368
+ if (!hexValue) return [key, "decaying"];
3369
+ const decoded = (0, import_scale6.decodeScale)(
3370
+ storageCoder,
3371
+ hexValue,
3372
+ `Failed to decode DecayingLock for (netuid=${netuid}, address=${address}) on ${networkId}`
3373
+ );
3374
+ return [key, decoded === false ? "perpetual" : "decaying"];
3375
+ }
3376
+ };
3377
+ }
3378
+ );
3379
+ return new Map(await fetchRpcQueryPack(connector, networkId, queries));
3380
+ };
3381
+ var fetchColdkeyLockStates = async (connector, networkId, builder, pairs) => {
3382
+ return Promise.all(
3383
+ pairs.map(async ({ address, netuid }) => {
3384
+ try {
3385
+ const lockState = await fetchRuntimeCallResult(
3386
+ connector,
3387
+ networkId,
3388
+ builder,
3389
+ "StakeInfoRuntimeApi",
3390
+ "get_coldkey_lock",
3391
+ [address, netuid]
3392
+ );
3393
+ return { address, netuid, lockState };
3394
+ } catch (cause) {
3395
+ log_default.warn(
3396
+ `Failed to fetch get_coldkey_lock for (netuid=${netuid}, address=${address}) on ${networkId}`,
3397
+ { cause }
3398
+ );
3399
+ return { address, netuid, lockState: null };
3400
+ }
3401
+ })
3402
+ );
3403
+ };
3242
3404
 
3243
3405
  // src/modules/substrate-dtao/getDtaoTokenRates.ts
3244
3406
  var import_chaindata_provider34 = require("@talismn/chaindata-provider");
3245
3407
  var import_token_rates = require("@talismn/token-rates");
3246
3408
  var ONE_ALPHA = 10n ** TAO_DECIMALS;
3247
- var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
3409
+ var getAlphaChange24h = (currency, taoChange24h, alphaPriceChange24h) => {
3410
+ if (typeof alphaPriceChange24h !== "number" || !Number.isFinite(alphaPriceChange24h))
3411
+ return void 0;
3412
+ if (currency === "tao") return alphaPriceChange24h;
3413
+ if (typeof taoChange24h !== "number" || !Number.isFinite(taoChange24h)) return void 0;
3414
+ return ((1 + alphaPriceChange24h / 100) * (1 + taoChange24h / 100) - 1) * 100;
3415
+ };
3416
+ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice, alphaPriceChange24h) => {
3248
3417
  try {
3249
3418
  const taoTokenId = (0, import_chaindata_provider34.subNativeTokenId)(token.networkId);
3250
3419
  const taoTokenRates = tokenRates[taoTokenId];
@@ -3260,8 +3429,7 @@ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
3260
3429
  alphaRates[currency] = {
3261
3430
  price: taoRate.price * priceRatio,
3262
3431
  marketCap: taoRate.marketCap ? taoRate.marketCap * priceRatio : void 0,
3263
- change24h: void 0
3264
- // cannot be determined from TAO rates alone
3432
+ change24h: getAlphaChange24h(currency, taoRate.change24h, alphaPriceChange24h)
3265
3433
  };
3266
3434
  }
3267
3435
  }
@@ -3279,8 +3447,8 @@ var PLATFORM8 = import_chaindata_provider35.SubDTaoTokenSchema.shape.platform.va
3279
3447
 
3280
3448
  // src/modules/substrate-dtao/fetchBalances.ts
3281
3449
  var import_chaindata_provider37 = require("@talismn/chaindata-provider");
3282
- var import_scale6 = require("@talismn/scale");
3283
- var import_util5 = require("@talismn/util");
3450
+ var import_scale7 = require("@talismn/scale");
3451
+ var import_util7 = require("@talismn/util");
3284
3452
  var import_lodash_es19 = require("lodash-es");
3285
3453
 
3286
3454
  // src/modules/substrate-dtao/calculatePendingRootClaimable.ts
@@ -3385,6 +3553,7 @@ var fetchBalances8 = async ({
3385
3553
  []
3386
3554
  )
3387
3555
  ]);
3556
+ const dynamicInfoByNetuid = (0, import_lodash_es19.keyBy)(dynamicInfos.filter(import_util7.isNotNil), (info) => info.netuid);
3388
3557
  const rootHotkeys = (0, import_lodash_es19.uniq)(
3389
3558
  stakeInfos.flatMap(
3390
3559
  ([, stakes]) => stakes.filter((stake) => stake.netuid === ROOT_NETUID).map((stake) => stake.hotkey)
@@ -3404,13 +3573,10 @@ var fetchBalances8 = async ({
3404
3573
  }
3405
3574
  }
3406
3575
  }
3407
- const rootClaimedAmounts = addressHotkeyNetuidPairs.length && miniMetadata.data ? await fetchRootClaimedAmounts(
3408
- connector,
3409
- networkId,
3410
- miniMetadata.data,
3411
- addressHotkeyNetuidPairs
3412
- ) : /* @__PURE__ */ new Map();
3413
- const dynamicInfoByNetuid = (0, import_lodash_es19.keyBy)(dynamicInfos.filter(import_util5.isNotNil), (info) => info.netuid);
3576
+ const [rootClaimedAmounts, convictionLocks] = await Promise.all([
3577
+ addressHotkeyNetuidPairs.length && miniMetadata.data ? fetchRootClaimedAmounts(connector, networkId, miniMetadata.data, addressHotkeyNetuidPairs) : Promise.resolve(/* @__PURE__ */ new Map()),
3578
+ miniMetadata.data ? fetchConvictionLocks(connector, networkId, miniMetadata.data, addresses) : Promise.resolve([])
3579
+ ]);
3414
3580
  const upsertBalance = (acc, address, tokenId, balance) => {
3415
3581
  const key = `${address}:${tokenId}`;
3416
3582
  const recordedBalance = acc[key];
@@ -3421,6 +3587,9 @@ var fetchBalances8 = async ({
3421
3587
  // If the new balance has pendingRootClaim, use it (it's calculated from current state)
3422
3588
  ...balance.pendingRootClaim !== void 0 && {
3423
3589
  pendingRootClaim: balance.pendingRootClaim
3590
+ },
3591
+ ...balance.convictionLock !== void 0 && {
3592
+ convictionLock: balance.convictionLock
3424
3593
  }
3425
3594
  };
3426
3595
  } else {
@@ -3463,6 +3632,21 @@ var fetchBalances8 = async ({
3463
3632
  },
3464
3633
  {}
3465
3634
  );
3635
+ for (const { address, netuid, lock } of convictionLocks) {
3636
+ const dynamicInfo = dynamicInfoByNetuid[netuid];
3637
+ const scaledAlphaPrice = dynamicInfo ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in) : 0n;
3638
+ const balance = {
3639
+ address,
3640
+ tokenId: (0, import_chaindata_provider37.subDTaoTokenId)(networkId, netuid),
3641
+ baseTokenId: (0, import_chaindata_provider37.subDTaoTokenId)(networkId, netuid),
3642
+ stake: 0n,
3643
+ hotkey: lock.hotkey,
3644
+ netuid,
3645
+ scaledAlphaPrice,
3646
+ convictionLock: lock
3647
+ };
3648
+ upsertBalance(balancesRaw, address, balance.tokenId, balance);
3649
+ }
3466
3650
  const balances = Object.values(balancesRaw);
3467
3651
  const tokensById = (0, import_lodash_es19.keyBy)(
3468
3652
  tokensWithAddresses.map(([token]) => token),
@@ -3470,6 +3654,7 @@ var fetchBalances8 = async ({
3470
3654
  );
3471
3655
  const dynamicTokens = [];
3472
3656
  for (const bal of balances) {
3657
+ if (bal.tokenId === bal.baseTokenId) continue;
3473
3658
  if (!balanceDefs.some((def) => def.token.id === bal.tokenId)) {
3474
3659
  const baseToken = tokensById[bal.baseTokenId];
3475
3660
  if (baseToken) {
@@ -3490,6 +3675,8 @@ var fetchBalances8 = async ({
3490
3675
  };
3491
3676
  const stakeAmount = BigInt(stake?.stake?.toString() ?? "0");
3492
3677
  const pendingRootClaimAmount = BigInt(stake?.pendingRootClaim?.toString() ?? "0");
3678
+ const convictionLockAmount = BigInt(stake?.convictionLock?.amount?.toString() ?? "0");
3679
+ const convictionLockConviction = BigInt(stake?.convictionLock?.convictionRaw ?? "0");
3493
3680
  const hasZeroStake = stakeAmount === 0n;
3494
3681
  const hasPendingRootClaim = pendingRootClaimAmount > 0n;
3495
3682
  const balanceValue = {
@@ -3502,9 +3689,30 @@ var fetchBalances8 = async ({
3502
3689
  type: "locked",
3503
3690
  label: "Pending root claim",
3504
3691
  amount: pendingRootClaimAmount.toString(),
3692
+ // The pending claim is not part of the stake (free amount): on-chain it only becomes
3693
+ // stake once claimed (root_claim_on_subnet). Since it was never included in `free`,
3694
+ // it must not be subtracted from it either: flag it so it does not reduce the staked
3695
+ // position's transferable amount.
3696
+ includeInTransferable: true,
3505
3697
  meta
3506
3698
  };
3507
3699
  const values3 = [balanceValue, pendingRootClaimValue];
3700
+ if (stake?.convictionLock && (convictionLockAmount > 0n || convictionLockConviction > 0n)) {
3701
+ const convictionLockMeta = {
3702
+ ...meta,
3703
+ convictionLock: {
3704
+ type: "conviction-lock",
3705
+ hotkey: stake.convictionLock.hotkey,
3706
+ lockType: stake.convictionLock.lockType
3707
+ }
3708
+ };
3709
+ values3.push({
3710
+ type: "locked",
3711
+ label: getConvictionLockLabel(stake.convictionLock.lockType),
3712
+ amount: convictionLockAmount.toString(),
3713
+ meta: convictionLockMeta
3714
+ });
3715
+ }
3508
3716
  if (hasZeroStake && hasPendingRootClaim) {
3509
3717
  values3.push({
3510
3718
  type: "extra",
@@ -3542,7 +3750,7 @@ var fetchBalances8 = async ({
3542
3750
  }
3543
3751
  };
3544
3752
  var buildStorageCoder = (metadataRpc, pallet, entry) => {
3545
- const { builder } = (0, import_scale6.parseMetadataRpc)(metadataRpc);
3753
+ const { builder } = (0, import_scale7.parseMetadataRpc)(metadataRpc);
3546
3754
  return builder.buildStorage(pallet, entry);
3547
3755
  };
3548
3756
  var buildRootClaimableStorageCoder = async (_connector, networkId, metadataRpc) => {
@@ -3586,7 +3794,7 @@ var buildRootClaimableQueries = (networkId, hotkeys, storageCoder) => {
3586
3794
  if (!hexValue) {
3587
3795
  return [hotkey, /* @__PURE__ */ new Map()];
3588
3796
  }
3589
- const decoded = (0, import_scale6.decodeScale)(
3797
+ const decoded = (0, import_scale7.decodeScale)(
3590
3798
  storageCoder,
3591
3799
  hexValue,
3592
3800
  `Failed to decode RootClaimable for hotkey ${hotkey} on ${networkId}`
@@ -3630,7 +3838,7 @@ var buildRootClaimedQueries = (networkId, addressHotkeyNetuidPairs, storageCoder
3630
3838
  if (!hexValue) {
3631
3839
  return [address, hotkey, netuid, 0n];
3632
3840
  }
3633
- const decoded = (0, import_scale6.decodeScale)(
3841
+ const decoded = (0, import_scale7.decodeScale)(
3634
3842
  storageCoder,
3635
3843
  hexValue,
3636
3844
  `Failed to decode RootClaimed for (netuid=${netuid}, hotkey=${hotkey}, address=${address}) on ${networkId}`
@@ -3686,9 +3894,10 @@ var fetchRootClaimedAmounts = async (connector, networkId, metadataRpc, addressH
3686
3894
 
3687
3895
  // src/modules/substrate-dtao/fetchTokens.ts
3688
3896
  var import_chaindata_provider38 = require("@talismn/chaindata-provider");
3689
- var import_scale7 = require("@talismn/scale");
3690
- var import_util6 = require("@talismn/util");
3897
+ var import_scale8 = require("@talismn/scale");
3898
+ var import_util8 = require("@talismn/util");
3691
3899
  var import_lodash_es20 = require("lodash-es");
3900
+ var import_polkadot_api2 = require("polkadot-api");
3692
3901
  var NATIVE_TOKEN_SYMBOLS = {
3693
3902
  "bittensor": "TAO",
3694
3903
  "bittensor-testnet": "testTAO"
@@ -3712,10 +3921,10 @@ var fetchTokens8 = async ({
3712
3921
  []
3713
3922
  )
3714
3923
  ]);
3715
- return dynamicInfos.filter(import_util6.isNotNil).map((info) => {
3924
+ return dynamicInfos.filter(import_util8.isNotNil).map((info) => {
3716
3925
  const config = tokens.find((t) => t.netuid === info.netuid);
3717
3926
  let symbol = new TextDecoder().decode(Uint8Array.from(info.token_symbol));
3718
- const subnetName = info.subnet_identity?.subnet_name?.asText() ?? (info.netuid === 0 ? "Root" : `Subnet ${info.netuid}`);
3927
+ const subnetName = (info.subnet_identity?.subnet_name ? import_polkadot_api2.Binary.toText(info.subnet_identity.subnet_name) : void 0) ?? (info.netuid === 0 ? "Root" : `Subnet ${info.netuid}`);
3719
3928
  const name = `SN${info.netuid} | ${subnetName} ${symbol}`;
3720
3929
  if (info.netuid === 0 && NATIVE_TOKEN_SYMBOLS[networkId])
3721
3930
  symbol = NATIVE_TOKEN_SYMBOLS[networkId];
@@ -3740,10 +3949,10 @@ var fetchTokens8 = async ({
3740
3949
  });
3741
3950
  };
3742
3951
  var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
3743
- const { builder } = (0, import_scale7.parseMetadataRpc)(metadata);
3952
+ const { builder } = (0, import_scale8.parseMetadataRpc)(metadata);
3744
3953
  const transferToggleCodec = builder.buildStorage("SubtensorModule", "TransferToggle");
3745
3954
  const transferToggleKeys = await connector.send(networkId, "state_getKeys", [
3746
- (0, import_scale7.getStorageKeyPrefix)("SubtensorModule", "TransferToggle")
3955
+ (0, import_scale8.getStorageKeyPrefix)("SubtensorModule", "TransferToggle")
3747
3956
  ]);
3748
3957
  const transferToggleResults = await connector.send(
3749
3958
  networkId,
@@ -3762,7 +3971,7 @@ var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
3762
3971
 
3763
3972
  // src/modules/substrate-dtao/getMiniMetadata.ts
3764
3973
  var import_chaindata_provider39 = require("@talismn/chaindata-provider");
3765
- var import_scale8 = require("@talismn/scale");
3974
+ var import_scale9 = require("@talismn/scale");
3766
3975
  var getMiniMetadata7 = ({
3767
3976
  networkId,
3768
3977
  specVersion,
@@ -3776,7 +3985,7 @@ var getMiniMetadata7 = ({
3776
3985
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
3777
3986
  );
3778
3987
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
3779
- const { unifiedMetadata } = (0, import_scale8.parseMetadataRpc)(metadataRpc);
3988
+ const { unifiedMetadata } = (0, import_scale9.parseMetadataRpc)(metadataRpc);
3780
3989
  if (unifiedMetadata.version < 14)
3781
3990
  throw new Error(
3782
3991
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -3792,16 +4001,21 @@ var getMiniMetadata7 = ({
3792
4001
  };
3793
4002
  };
3794
4003
  var getData = (metadataRpc) => {
3795
- const { metadata, unifiedMetadata } = (0, import_scale8.parseMetadataRpc)(metadataRpc);
4004
+ const { metadata, unifiedMetadata } = (0, import_scale9.parseMetadataRpc)(metadataRpc);
3796
4005
  const isBittensor = unifiedMetadata.pallets.some(({ name }) => name === "SubtensorModule");
3797
4006
  if (!isBittensor) return null;
3798
- (0, import_scale8.compactMetadata)(
4007
+ (0, import_scale9.compactMetadata)(
3799
4008
  metadata,
3800
- [{ pallet: "SubtensorModule", items: ["TransferToggle", "RootClaimable", "RootClaimed"] }],
4009
+ [
4010
+ {
4011
+ pallet: "SubtensorModule",
4012
+ items: ["TransferToggle", "RootClaimable", "RootClaimed", "Lock", "DecayingLock"]
4013
+ }
4014
+ ],
3801
4015
  [
3802
4016
  {
3803
4017
  runtimeApi: "StakeInfoRuntimeApi",
3804
- methods: ["get_stake_info_for_coldkeys"]
4018
+ methods: ["get_stake_info_for_coldkeys", "get_coldkey_lock"]
3805
4019
  },
3806
4020
  {
3807
4021
  runtimeApi: "SubnetInfoRuntimeApi",
@@ -3809,14 +4023,14 @@ var getData = (metadataRpc) => {
3809
4023
  }
3810
4024
  ]
3811
4025
  );
3812
- return (0, import_scale8.encodeMetadata)(metadata);
4026
+ return (0, import_scale9.encodeMetadata)(metadata);
3813
4027
  };
3814
4028
 
3815
4029
  // src/modules/substrate-dtao/getTransferCallData.ts
3816
4030
  var import_utils3 = require("@polkadot-api/utils");
3817
4031
  var import_chaindata_provider40 = require("@talismn/chaindata-provider");
3818
- var import_scale9 = require("@talismn/scale");
3819
- var import_polkadot_api = require("polkadot-api");
4032
+ var import_scale10 = require("@talismn/scale");
4033
+ var import_polkadot_api3 = require("polkadot-api");
3820
4034
  var getTransferCallData7 = ({
3821
4035
  from: from2,
3822
4036
  to,
@@ -3828,7 +4042,7 @@ var getTransferCallData7 = ({
3828
4042
  throw new Error(`Token type ${token.type} is not ${MODULE_TYPE8}.`);
3829
4043
  const { netuid: subnetId, hotkey } = (0, import_chaindata_provider40.parseSubDTaoTokenId)(token.id);
3830
4044
  if (!hotkey) throw new Error(`Missing hotkey`);
3831
- const { builder } = (0, import_scale9.parseMetadataRpc)(metadataRpc);
4045
+ const { builder } = (0, import_scale10.parseMetadataRpc)(metadataRpc);
3832
4046
  const { codec, location } = builder.buildCall("SubtensorModule", "transfer_stake");
3833
4047
  const args = codec.enc({
3834
4048
  origin_netuid: subnetId,
@@ -3837,10 +4051,10 @@ var getTransferCallData7 = ({
3837
4051
  destination_netuid: subnetId,
3838
4052
  alpha_amount: value
3839
4053
  });
3840
- const callData = import_polkadot_api.Binary.fromBytes((0, import_utils3.mergeUint8)([new Uint8Array(location), args]));
4054
+ const callData = (0, import_utils3.mergeUint8)([new Uint8Array(location), args]);
3841
4055
  return {
3842
4056
  address: from2,
3843
- method: callData.asHex()
4057
+ method: import_polkadot_api3.Binary.toHex(callData)
3844
4058
  };
3845
4059
  };
3846
4060
 
@@ -3855,6 +4069,7 @@ var subscribeBalances7 = ({
3855
4069
  miniMetadata
3856
4070
  }) => {
3857
4071
  if (!tokensWithAddresses.length) return (0, import_rxjs9.of)({ success: [], errors: [] });
4072
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
3858
4073
  return new import_rxjs9.Observable((subscriber) => {
3859
4074
  const abortController = new AbortController();
3860
4075
  const poll = async () => {
@@ -3868,8 +4083,8 @@ var subscribeBalances7 = ({
3868
4083
  });
3869
4084
  if (abortController.signal.aborted) return;
3870
4085
  subscriber.next(balances);
3871
- setTimeout(poll, SUBSCRIPTION_INTERVAL7);
3872
4086
  } catch (error) {
4087
+ if (abortController.signal.aborted) return;
3873
4088
  log_default.error("Error", {
3874
4089
  module: MODULE_TYPE8,
3875
4090
  networkId,
@@ -3877,8 +4092,17 @@ var subscribeBalances7 = ({
3877
4092
  addressesByToken: tokensWithAddresses,
3878
4093
  error
3879
4094
  });
3880
- subscriber.error(error);
4095
+ const fetchError = error instanceof Error ? error : new Error(String(error));
4096
+ subscriber.next({
4097
+ success: [],
4098
+ errors: balanceDefs.map((def) => ({
4099
+ tokenId: def.token.id,
4100
+ address: def.address,
4101
+ error: fetchError
4102
+ }))
4103
+ });
3881
4104
  }
4105
+ if (!abortController.signal.aborted) setTimeout(poll, SUBSCRIPTION_INTERVAL7);
3882
4106
  };
3883
4107
  poll();
3884
4108
  return () => {
@@ -3910,7 +4134,7 @@ var SubDTaoTokenConfigSchema = import_v411.default.strictObject({
3910
4134
  function excludeFromTransferableAmount(locks) {
3911
4135
  if (typeof locks === "string") return BigInt(locks);
3912
4136
  if (!Array.isArray(locks)) locks = [locks];
3913
- return locks.filter((lock) => lock.includeInTransferable !== true).map((lock) => lock.amount.planck).reduce((max, lock) => import_util7.BigMath.max(max, lock), 0n);
4137
+ return locks.filter((lock) => lock.includeInTransferable !== true).map((lock) => lock.amount.planck).reduce((max, lock) => import_util9.BigMath.max(max, lock), 0n);
3914
4138
  }
3915
4139
  function excludeFromFeePayableLocks(locks) {
3916
4140
  if (typeof locks === "string") return [];
@@ -3938,7 +4162,7 @@ var Balances = class _Balances {
3938
4162
  if (balances instanceof Balance) return new _Balances([balances], hydrate);
3939
4163
  if (!Array.isArray(balances)) return new _Balances(Object.values(balances), hydrate);
3940
4164
  if (balances.length === 0) return this;
3941
- if (!(0, import_util7.isArrayOf)(balances, Balance))
4165
+ if (!(0, import_util9.isArrayOf)(balances, Balance))
3942
4166
  return new _Balances(
3943
4167
  balances.map((storage) => new Balance(storage)),
3944
4168
  hydrate
@@ -4132,7 +4356,7 @@ var Balance = class {
4132
4356
  if (hydrate !== void 0) this.#db = hydrate;
4133
4357
  };
4134
4358
  #format = (balance) => new BalanceFormatter(
4135
- (0, import_util7.isBigInt)(balance) ? balance.toString() : balance,
4359
+ (0, import_util9.isBigInt)(balance) ? balance.toString() : balance,
4136
4360
  this.decimals || void 0,
4137
4361
  this.rates
4138
4362
  );
@@ -4181,9 +4405,9 @@ var Balance = class {
4181
4405
  const totalSupply = extras.find((extra2) => extra2.label === "totalSupply")?.amount ?? "0";
4182
4406
  const reserve0 = extras.find((extra2) => extra2.label === "reserve0")?.amount ?? "0";
4183
4407
  const reserve1 = extras.find((extra2) => extra2.label === "reserve1")?.amount ?? "0";
4184
- const totalSupplyTokens = (0, import_bignumber2.default)(totalSupply).times(10 ** (-1 * decimals));
4185
- const reserve0Tokens = (0, import_bignumber2.default)(reserve0).times(10 ** (-1 * decimals0));
4186
- const reserve1Tokens = (0, import_bignumber2.default)(reserve1).times(10 ** (-1 * decimals1));
4408
+ const totalSupplyTokens = configureBigNumber_default(totalSupply).times(10 ** (-1 * decimals));
4409
+ const reserve0Tokens = configureBigNumber_default(reserve0).times(10 ** (-1 * decimals0));
4410
+ const reserve1Tokens = configureBigNumber_default(reserve1).times(10 ** (-1 * decimals1));
4187
4411
  const rates0Currencies = new Set(Object.keys(rates0));
4188
4412
  const rates1Currencies = new Set(Object.keys(rates1));
4189
4413
  const currencies = [...rates0Currencies].filter((c) => rates1Currencies.has(c));
@@ -4191,7 +4415,7 @@ var Balance = class {
4191
4415
  (currency) => [
4192
4416
  currency,
4193
4417
  // tvl (in a given currency) == reserve0*currencyRate0 + reserve1*currencyRate1
4194
- import_bignumber2.default.sum(
4418
+ configureBigNumber_default.sum(
4195
4419
  reserve0Tokens.times(rates0[currency]?.price ?? 0),
4196
4420
  reserve1Tokens.times(rates1[currency]?.price ?? 0)
4197
4421
  )
@@ -4277,7 +4501,7 @@ var Balance = class {
4277
4501
  /** The frozen balance of this token. Is included in the free amount. */
4278
4502
  get locked() {
4279
4503
  return this.#format(
4280
- this.locks.map(({ amount }) => amount.planck).reduce((a, b) => import_util7.BigMath.max(a, b), 0n)
4504
+ this.locks.map(({ amount }) => amount.planck).reduce((a, b) => import_util9.BigMath.max(a, b), 0n)
4281
4505
  );
4282
4506
  }
4283
4507
  get locks() {
@@ -4301,15 +4525,15 @@ var Balance = class {
4301
4525
  const oldTransferableCalculation = () => {
4302
4526
  if (this.locks.length === 0) return this.free;
4303
4527
  const excludeAmount = excludeFromTransferableAmount(this.locks);
4304
- return this.#format(import_util7.BigMath.max(this.free.planck - excludeAmount, 0n));
4528
+ return this.#format(import_util9.BigMath.max(this.free.planck - excludeAmount, 0n));
4305
4529
  };
4306
4530
  const newTransferableCalculation = () => {
4307
4531
  if (this.locks.length === 0) return this.free;
4308
- const untouchableAmount = import_util7.BigMath.max(
4532
+ const untouchableAmount = import_util9.BigMath.max(
4309
4533
  excludeFromTransferableAmount(this.locks) - this.reserved.planck,
4310
4534
  0n
4311
4535
  );
4312
- return this.#format(import_util7.BigMath.max(this.free.planck - untouchableAmount, 0n));
4536
+ return this.#format(import_util9.BigMath.max(this.free.planck - untouchableAmount, 0n));
4313
4537
  };
4314
4538
  if (this.#storage.useLegacyTransferableCalculation) return oldTransferableCalculation();
4315
4539
  return newTransferableCalculation();
@@ -4321,7 +4545,7 @@ var Balance = class {
4321
4545
  */
4322
4546
  get unavailable() {
4323
4547
  const oldCalculation = () => this.locked.planck + this.reserved.planck;
4324
- const newCalculation = () => import_util7.BigMath.max(this.locked.planck, this.reserved.planck);
4548
+ const newCalculation = () => import_util9.BigMath.max(this.locked.planck, this.reserved.planck);
4325
4549
  const baseUnavailable = this.#storage.useLegacyTransferableCalculation ? oldCalculation() : newCalculation();
4326
4550
  const nomPoolStakedPlancks = this.locks.some(
4327
4551
  (lock) => lock.source === "substrate-native-holds" && lock.label === "DelegatedStaking"
@@ -4331,8 +4555,8 @@ var Balance = class {
4331
4555
  /** The feePayable balance of this token. Is generally the free amount - the feeFrozen amount. */
4332
4556
  get feePayable() {
4333
4557
  if (this.locks.length === 0) return this.free;
4334
- const excludeAmount = excludeFromFeePayableLocks(this.locked.planck.toString()).map((lock) => BigInt(lock.amount)).reduce((max, lock) => import_util7.BigMath.max(max, lock), 0n);
4335
- return this.#format(import_util7.BigMath.max(this.free.planck - excludeAmount, 0n));
4558
+ const excludeAmount = excludeFromFeePayableLocks(this.locked.planck.toString()).map((lock) => BigInt(lock.amount)).reduce((max, lock) => import_util9.BigMath.max(max, lock), 0n);
4559
+ return this.#format(import_util9.BigMath.max(this.free.planck - excludeAmount, 0n));
4336
4560
  }
4337
4561
  };
4338
4562
  var BalanceValueGetter = class {
@@ -4355,7 +4579,7 @@ var BalanceFormatter = class {
4355
4579
  #decimals;
4356
4580
  #tokenRates;
4357
4581
  constructor(planck, decimals, fiatRatios) {
4358
- this.#planck = (0, import_util7.isBigInt)(planck) ? planck.toString() : planck ?? "0";
4582
+ this.#planck = (0, import_util9.isBigInt)(planck) ? planck.toString() : planck ?? "0";
4359
4583
  this.#decimals = decimals || 0;
4360
4584
  this.#tokenRates = fiatRatios || null;
4361
4585
  }
@@ -4364,7 +4588,7 @@ var BalanceFormatter = class {
4364
4588
  return BigInt(this.#planck);
4365
4589
  }
4366
4590
  get tokens() {
4367
- return (0, import_util7.planckToTokens)(this.#planck, this.#decimals);
4591
+ return (0, import_util9.planckToTokens)(this.#planck, this.#decimals);
4368
4592
  }
4369
4593
  fiat(currency) {
4370
4594
  if (!this.#tokenRates) return null;
@@ -4559,13 +4783,13 @@ var getValueId = (amount) => {
4559
4783
 
4560
4784
  // src/types/minimetadatas.ts
4561
4785
  var import_chaindata_provider43 = require("@talismn/chaindata-provider");
4562
- var import_scale10 = require("@talismn/scale");
4786
+ var import_scale11 = require("@talismn/scale");
4563
4787
  var deriveMiniMetadataId = ({
4564
4788
  source,
4565
4789
  chainId,
4566
4790
  specVersion
4567
- }) => (0, import_scale10.toHex)(
4568
- (0, import_scale10.Twox128)(new TextEncoder().encode(`${source}${chainId}${specVersion}${import_chaindata_provider43.MINIMETADATA_VERSION}`))
4791
+ }) => (0, import_scale11.toHex)(
4792
+ (0, import_scale11.Twox128)(new TextEncoder().encode(`${source}${chainId}${specVersion}${import_chaindata_provider43.MINIMETADATA_VERSION}`))
4569
4793
  ).slice(-32);
4570
4794
 
4571
4795
  // src/modules/substrate-assets/getMiniMetadata.ts
@@ -4582,7 +4806,7 @@ var getMiniMetadata8 = ({
4582
4806
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
4583
4807
  );
4584
4808
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
4585
- const { unifiedMetadata } = (0, import_scale11.parseMetadataRpc)(metadataRpc);
4809
+ const { unifiedMetadata } = (0, import_scale12.parseMetadataRpc)(metadataRpc);
4586
4810
  if (unifiedMetadata.version < 14)
4587
4811
  throw new Error(
4588
4812
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -4598,17 +4822,17 @@ var getMiniMetadata8 = ({
4598
4822
  };
4599
4823
  };
4600
4824
  var getData2 = (metadataRpc) => {
4601
- const { metadata, unifiedMetadata } = (0, import_scale11.parseMetadataRpc)(metadataRpc);
4825
+ const { metadata, unifiedMetadata } = (0, import_scale12.parseMetadataRpc)(metadataRpc);
4602
4826
  if (!hasStorageItems(unifiedMetadata, "Assets", ["Account", "Asset", "Metadata"])) return null;
4603
- (0, import_scale11.compactMetadata)(metadata, [{ pallet: "Assets", items: ["Account", "Asset", "Metadata"] }]);
4604
- return (0, import_scale11.encodeMetadata)(metadata);
4827
+ (0, import_scale12.compactMetadata)(metadata, [{ pallet: "Assets", items: ["Account", "Asset", "Metadata"] }]);
4828
+ return (0, import_scale12.encodeMetadata)(metadata);
4605
4829
  };
4606
4830
 
4607
4831
  // src/modules/substrate-assets/getTransferCallData.ts
4608
4832
  var import_utils4 = require("@polkadot-api/utils");
4609
4833
  var import_chaindata_provider45 = require("@talismn/chaindata-provider");
4610
- var import_scale12 = require("@talismn/scale");
4611
- var import_polkadot_api2 = require("polkadot-api");
4834
+ var import_scale13 = require("@talismn/scale");
4835
+ var import_polkadot_api4 = require("polkadot-api");
4612
4836
  var getTransferCallData8 = ({
4613
4837
  from: from2,
4614
4838
  to,
@@ -4619,14 +4843,14 @@ var getTransferCallData8 = ({
4619
4843
  }) => {
4620
4844
  if (!(0, import_chaindata_provider45.isTokenOfType)(token, MODULE_TYPE7))
4621
4845
  throw new Error(`Token type ${token.type} is not ${MODULE_TYPE7}.`);
4622
- const { builder } = (0, import_scale12.parseMetadataRpc)(metadataRpc);
4846
+ const { builder } = (0, import_scale13.parseMetadataRpc)(metadataRpc);
4623
4847
  const method = getTransferMethod(type);
4624
4848
  const { codec, location } = builder.buildCall("Assets", method);
4625
4849
  const args = getEncodedArgs(method, token.assetId, to, value, codec);
4626
- const callData = import_polkadot_api2.Binary.fromBytes((0, import_utils4.mergeUint8)([new Uint8Array(location), args]));
4850
+ const callData = (0, import_utils4.mergeUint8)([new Uint8Array(location), args]);
4627
4851
  return {
4628
4852
  address: from2,
4629
- method: callData.asHex()
4853
+ method: import_polkadot_api4.Binary.toHex(callData)
4630
4854
  };
4631
4855
  };
4632
4856
  var getTransferMethod = (type) => {
@@ -4666,13 +4890,13 @@ var getTransferEncodedArgs = (assetId, to, value, codec) => {
4666
4890
  () => ({
4667
4891
  id: Number(assetId),
4668
4892
  // for most networks
4669
- target: (0, import_polkadot_api2.Enum)("Id", to),
4893
+ target: (0, import_polkadot_api4.Enum)("Id", to),
4670
4894
  amount: BigInt(value)
4671
4895
  }),
4672
4896
  () => ({
4673
4897
  id: BigInt(assetId),
4674
4898
  // for Astar
4675
- target: (0, import_polkadot_api2.Enum)("Id", to),
4899
+ target: (0, import_polkadot_api4.Enum)("Id", to),
4676
4900
  amount: BigInt(value)
4677
4901
  }),
4678
4902
  () => ({
@@ -4688,13 +4912,13 @@ var getTransferAllEncodedArgs = (assetId, to, codec) => {
4688
4912
  () => ({
4689
4913
  id: Number(assetId),
4690
4914
  // for most networks
4691
- dest: (0, import_polkadot_api2.Enum)("Id", to),
4915
+ dest: (0, import_polkadot_api4.Enum)("Id", to),
4692
4916
  keep_alive: false
4693
4917
  }),
4694
4918
  () => ({
4695
4919
  id: BigInt(assetId),
4696
4920
  // for Astar
4697
- dest: (0, import_polkadot_api2.Enum)("Id", to),
4921
+ dest: (0, import_polkadot_api4.Enum)("Id", to),
4698
4922
  keep_alive: false
4699
4923
  }),
4700
4924
  () => ({
@@ -4750,8 +4974,8 @@ var MODULE_TYPE9 = import_chaindata_provider47.SubForeignAssetsTokenSchema.shape
4750
4974
  var PLATFORM9 = import_chaindata_provider47.SubForeignAssetsTokenSchema.shape.platform.value;
4751
4975
 
4752
4976
  // src/modules/substrate-foreignassets/buildQueries.ts
4753
- var import_scale13 = require("@talismn/scale");
4754
- var import_util8 = require("@talismn/util");
4977
+ var import_scale14 = require("@talismn/scale");
4978
+ var import_util10 = require("@talismn/util");
4755
4979
  var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4756
4980
  const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
4757
4981
  storage: ["ForeignAssets", "Account"]
@@ -4760,7 +4984,7 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4760
4984
  const scaleCoder = networkStorageCoders?.storage;
4761
4985
  const getStateKey = (onChainId) => {
4762
4986
  try {
4763
- return scaleCoder?.keys?.enc?.((0, import_scale13.papiParse)(onChainId), address);
4987
+ return scaleCoder?.keys?.enc?.((0, import_scale14.papiParse)(onChainId), address);
4764
4988
  } catch {
4765
4989
  return null;
4766
4990
  }
@@ -4773,7 +4997,7 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4773
4997
  return null;
4774
4998
  }
4775
4999
  const decodeResult = (changes) => {
4776
- const decoded = (0, import_scale13.decodeScale)(
5000
+ const decoded = (0, import_scale14.decodeScale)(
4777
5001
  scaleCoder,
4778
5002
  changes[0],
4779
5003
  `Failed to decode substrate-assets balance on chain ${networkId}`
@@ -4806,7 +5030,7 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4806
5030
  stateKeys: [stateKey],
4807
5031
  decodeResult
4808
5032
  };
4809
- }).filter(import_util8.isNotNil);
5033
+ }).filter(import_util10.isNotNil);
4810
5034
  };
4811
5035
 
4812
5036
  // src/modules/substrate-foreignassets/fetchBalances.ts
@@ -4881,8 +5105,9 @@ var fetchBalances9 = async ({
4881
5105
 
4882
5106
  // src/modules/substrate-foreignassets/fetchTokens.ts
4883
5107
  var import_chaindata_provider48 = require("@talismn/chaindata-provider");
4884
- var import_scale14 = require("@talismn/scale");
5108
+ var import_scale15 = require("@talismn/scale");
4885
5109
  var import_lodash_es22 = require("lodash-es");
5110
+ var import_polkadot_api5 = require("polkadot-api");
4886
5111
  var fetchTokens9 = async ({
4887
5112
  networkId,
4888
5113
  tokens,
@@ -4891,15 +5116,15 @@ var fetchTokens9 = async ({
4891
5116
  }) => {
4892
5117
  const anyMiniMetadata = miniMetadata;
4893
5118
  if (!anyMiniMetadata?.data) return [];
4894
- const { builder } = (0, import_scale14.parseMetadataRpc)(anyMiniMetadata.data);
5119
+ const { builder } = (0, import_scale15.parseMetadataRpc)(anyMiniMetadata.data);
4895
5120
  const assetCodec = builder.buildStorage("ForeignAssets", "Asset");
4896
5121
  const metadataCodec = builder.buildStorage("ForeignAssets", "Metadata");
4897
5122
  const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([
4898
5123
  connector.send(networkId, "state_getKeys", [
4899
- (0, import_scale14.getStorageKeyPrefix)("ForeignAssets", "Asset")
5124
+ (0, import_scale15.getStorageKeyPrefix)("ForeignAssets", "Asset")
4900
5125
  ]),
4901
5126
  connector.send(networkId, "state_getKeys", [
4902
- (0, import_scale14.getStorageKeyPrefix)("ForeignAssets", "Metadata")
5127
+ (0, import_scale15.getStorageKeyPrefix)("ForeignAssets", "Metadata")
4903
5128
  ])
4904
5129
  ]);
4905
5130
  const [assetStorageResults, metadataStorageResults] = await Promise.all([
@@ -4911,7 +5136,7 @@ var fetchTokens9 = async ({
4911
5136
  const assetByOnChainId = (0, import_lodash_es22.keyBy)(
4912
5137
  assetStorageEntries.map(([key, value]) => {
4913
5138
  const [decodedKey] = assetCodec.keys.dec(key);
4914
- const onChainId = (0, import_scale14.papiStringify)(decodedKey);
5139
+ const onChainId = (0, import_scale15.papiStringify)(decodedKey);
4915
5140
  const asset = assetCodec.value.dec(value);
4916
5141
  return { onChainId, existentialDeposit: asset.min_balance, isSufficient: asset.is_sufficient };
4917
5142
  }),
@@ -4920,14 +5145,14 @@ var fetchTokens9 = async ({
4920
5145
  const metadataByOnChainId = (0, import_lodash_es22.keyBy)(
4921
5146
  metadataStorageEntries.map(([key, value]) => {
4922
5147
  const [decodedKey] = metadataCodec.keys.dec(key);
4923
- const onChainId = (0, import_scale14.papiStringify)(decodedKey);
5148
+ const onChainId = (0, import_scale15.papiStringify)(decodedKey);
4924
5149
  const metadata = metadataCodec.value.dec(value);
4925
5150
  return {
4926
5151
  onChainId,
4927
5152
  decimals: metadata.decimals,
4928
5153
  isFrozen: metadata.is_frozen,
4929
- name: metadata.name?.asText(),
4930
- symbol: metadata.symbol?.asText()
5154
+ name: metadata.name ? import_polkadot_api5.Binary.toText(metadata.name) : void 0,
5155
+ symbol: metadata.symbol ? import_polkadot_api5.Binary.toText(metadata.symbol) : void 0
4931
5156
  };
4932
5157
  }),
4933
5158
  (a) => a.onChainId
@@ -4965,7 +5190,7 @@ var fetchTokens9 = async ({
4965
5190
 
4966
5191
  // src/modules/substrate-foreignassets/getMiniMetadata.ts
4967
5192
  var import_chaindata_provider49 = require("@talismn/chaindata-provider");
4968
- var import_scale15 = require("@talismn/scale");
5193
+ var import_scale16 = require("@talismn/scale");
4969
5194
  var getMiniMetadata9 = ({
4970
5195
  networkId,
4971
5196
  specVersion,
@@ -4979,7 +5204,7 @@ var getMiniMetadata9 = ({
4979
5204
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
4980
5205
  );
4981
5206
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
4982
- const { unifiedMetadata } = (0, import_scale15.parseMetadataRpc)(metadataRpc);
5207
+ const { unifiedMetadata } = (0, import_scale16.parseMetadataRpc)(metadataRpc);
4983
5208
  if (unifiedMetadata.version < 14)
4984
5209
  throw new Error(
4985
5210
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -4995,18 +5220,18 @@ var getMiniMetadata9 = ({
4995
5220
  };
4996
5221
  };
4997
5222
  var getData3 = (metadataRpc) => {
4998
- const { metadata, unifiedMetadata } = (0, import_scale15.parseMetadataRpc)(metadataRpc);
5223
+ const { metadata, unifiedMetadata } = (0, import_scale16.parseMetadataRpc)(metadataRpc);
4999
5224
  if (!hasStorageItems(unifiedMetadata, "ForeignAssets", ["Account", "Asset", "Metadata"]))
5000
5225
  return null;
5001
- (0, import_scale15.compactMetadata)(metadata, [{ pallet: "ForeignAssets", items: ["Account", "Asset", "Metadata"] }]);
5002
- return (0, import_scale15.encodeMetadata)(metadata);
5226
+ (0, import_scale16.compactMetadata)(metadata, [{ pallet: "ForeignAssets", items: ["Account", "Asset", "Metadata"] }]);
5227
+ return (0, import_scale16.encodeMetadata)(metadata);
5003
5228
  };
5004
5229
 
5005
5230
  // src/modules/substrate-foreignassets/getTransferCallData.ts
5006
5231
  var import_utils5 = require("@polkadot-api/utils");
5007
5232
  var import_chaindata_provider50 = require("@talismn/chaindata-provider");
5008
- var import_scale16 = require("@talismn/scale");
5009
- var import_polkadot_api3 = require("polkadot-api");
5233
+ var import_scale17 = require("@talismn/scale");
5234
+ var import_polkadot_api6 = require("polkadot-api");
5010
5235
  var getTransferCallData9 = ({
5011
5236
  from: from2,
5012
5237
  to,
@@ -5017,14 +5242,14 @@ var getTransferCallData9 = ({
5017
5242
  }) => {
5018
5243
  if (!(0, import_chaindata_provider50.isTokenOfType)(token, MODULE_TYPE9))
5019
5244
  throw new Error(`Token type ${token.type} is not ${MODULE_TYPE9}.`);
5020
- const { builder } = (0, import_scale16.parseMetadataRpc)(metadataRpc);
5245
+ const { builder } = (0, import_scale17.parseMetadataRpc)(metadataRpc);
5021
5246
  const method = getTransferMethod2(type);
5022
5247
  const { codec, location } = builder.buildCall("ForeignAssets", method);
5023
5248
  const args = getEncodedArgs2(method, token.onChainId, to, value, codec);
5024
- const callData = import_polkadot_api3.Binary.fromBytes((0, import_utils5.mergeUint8)([new Uint8Array(location), args]));
5249
+ const callData = (0, import_utils5.mergeUint8)([new Uint8Array(location), args]);
5025
5250
  return {
5026
5251
  address: from2,
5027
- method: callData.asHex()
5252
+ method: import_polkadot_api6.Binary.toHex(callData)
5028
5253
  };
5029
5254
  };
5030
5255
  var getTransferMethod2 = (type) => {
@@ -5064,13 +5289,13 @@ var getEncodedValue2 = (codec, possibleValue) => {
5064
5289
  var getTransferEncodedArgs2 = (onChainId, to, value, codec) => {
5065
5290
  return getEncodedValue2(codec, [
5066
5291
  () => ({
5067
- id: (0, import_scale16.papiParse)(onChainId),
5292
+ id: (0, import_scale17.papiParse)(onChainId),
5068
5293
  // for most networks
5069
- target: (0, import_polkadot_api3.Enum)("Id", to),
5294
+ target: (0, import_polkadot_api6.Enum)("Id", to),
5070
5295
  amount: BigInt(value)
5071
5296
  }),
5072
5297
  () => ({
5073
- id: (0, import_scale16.papiParse)(onChainId),
5298
+ id: (0, import_scale17.papiParse)(onChainId),
5074
5299
  // for Neuroweb
5075
5300
  target: to,
5076
5301
  amount: BigInt(value)
@@ -5080,13 +5305,13 @@ var getTransferEncodedArgs2 = (onChainId, to, value, codec) => {
5080
5305
  var getTransferAllEncodedArgs2 = (onChainId, to, codec) => {
5081
5306
  return getEncodedValue2(codec, [
5082
5307
  () => ({
5083
- id: (0, import_scale16.papiParse)(onChainId),
5308
+ id: (0, import_scale17.papiParse)(onChainId),
5084
5309
  // for most networks
5085
- dest: (0, import_polkadot_api3.Enum)("Id", to),
5310
+ dest: (0, import_polkadot_api6.Enum)("Id", to),
5086
5311
  keep_alive: false
5087
5312
  }),
5088
5313
  () => ({
5089
- id: (0, import_scale16.papiParse)(onChainId),
5314
+ id: (0, import_scale17.papiParse)(onChainId),
5090
5315
  // for Neuroweb
5091
5316
  dest: to,
5092
5317
  keep_alive: false
@@ -5253,8 +5478,9 @@ var fetchBalances10 = async ({
5253
5478
 
5254
5479
  // src/modules/substrate-hydration/fetchTokens.ts
5255
5480
  var import_chaindata_provider53 = require("@talismn/chaindata-provider");
5256
- var import_scale17 = require("@talismn/scale");
5481
+ var import_scale18 = require("@talismn/scale");
5257
5482
  var import_lodash_es24 = require("lodash-es");
5483
+ var import_polkadot_api7 = require("polkadot-api");
5258
5484
  var fetchTokens10 = async ({
5259
5485
  networkId,
5260
5486
  tokens,
@@ -5263,10 +5489,10 @@ var fetchTokens10 = async ({
5263
5489
  }) => {
5264
5490
  const anyMiniMetadata = miniMetadata;
5265
5491
  if (!anyMiniMetadata?.data) return [];
5266
- const { builder } = (0, import_scale17.parseMetadataRpc)(anyMiniMetadata.data);
5492
+ const { builder } = (0, import_scale18.parseMetadataRpc)(anyMiniMetadata.data);
5267
5493
  const assetsCodec = builder.buildStorage("AssetRegistry", "Assets");
5268
5494
  const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [
5269
- (0, import_scale17.getStorageKeyPrefix)("AssetRegistry", "Assets")
5495
+ (0, import_scale18.getStorageKeyPrefix)("AssetRegistry", "Assets")
5270
5496
  ]);
5271
5497
  const assetStorageResults = await connector.send(
5272
5498
  networkId,
@@ -5282,8 +5508,8 @@ var fetchTokens10 = async ({
5282
5508
  onChainId,
5283
5509
  assetType: asset.asset_type.type,
5284
5510
  isSufficient: asset.is_sufficient,
5285
- name: asset.name?.asText(),
5286
- symbol: asset.symbol?.asText(),
5511
+ name: asset.name ? import_polkadot_api7.Binary.toText(asset.name) : void 0,
5512
+ symbol: asset.symbol ? import_polkadot_api7.Binary.toText(asset.symbol) : void 0,
5287
5513
  decimals: asset.decimals,
5288
5514
  existentialDeposit: asset.existential_deposit.toString()
5289
5515
  };
@@ -5317,7 +5543,7 @@ var fetchTokens10 = async ({
5317
5543
 
5318
5544
  // src/modules/substrate-hydration/getMiniMetadata.ts
5319
5545
  var import_chaindata_provider54 = require("@talismn/chaindata-provider");
5320
- var import_scale18 = require("@talismn/scale");
5546
+ var import_scale19 = require("@talismn/scale");
5321
5547
  var getMiniMetadata10 = ({
5322
5548
  networkId,
5323
5549
  specVersion,
@@ -5331,7 +5557,7 @@ var getMiniMetadata10 = ({
5331
5557
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
5332
5558
  );
5333
5559
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
5334
- const { unifiedMetadata } = (0, import_scale18.parseMetadataRpc)(metadataRpc);
5560
+ const { unifiedMetadata } = (0, import_scale19.parseMetadataRpc)(metadataRpc);
5335
5561
  if (unifiedMetadata.version < 14)
5336
5562
  throw new Error(
5337
5563
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -5347,10 +5573,10 @@ var getMiniMetadata10 = ({
5347
5573
  };
5348
5574
  };
5349
5575
  var getData4 = (metadataRpc) => {
5350
- const { metadata, unifiedMetadata } = (0, import_scale18.parseMetadataRpc)(metadataRpc);
5576
+ const { metadata, unifiedMetadata } = (0, import_scale19.parseMetadataRpc)(metadataRpc);
5351
5577
  if (!hasStorageItem(unifiedMetadata, "AssetRegistry", "Assets") || !hasStorageItem(unifiedMetadata, "Tokens", "Accounts") || !hasRuntimeApi(unifiedMetadata, "CurrenciesApi", "accounts"))
5352
5578
  return null;
5353
- (0, import_scale18.compactMetadata)(
5579
+ (0, import_scale19.compactMetadata)(
5354
5580
  metadata,
5355
5581
  [
5356
5582
  { pallet: "AssetRegistry", items: ["Assets"] },
@@ -5365,14 +5591,14 @@ var getData4 = (metadataRpc) => {
5365
5591
  }
5366
5592
  ]
5367
5593
  );
5368
- return (0, import_scale18.encodeMetadata)(metadata);
5594
+ return (0, import_scale19.encodeMetadata)(metadata);
5369
5595
  };
5370
5596
 
5371
5597
  // src/modules/substrate-hydration/getTransferCallData.ts
5372
5598
  var import_utils6 = require("@polkadot-api/utils");
5373
5599
  var import_chaindata_provider55 = require("@talismn/chaindata-provider");
5374
- var import_scale19 = require("@talismn/scale");
5375
- var import_polkadot_api4 = require("polkadot-api");
5600
+ var import_scale20 = require("@talismn/scale");
5601
+ var import_polkadot_api8 = require("polkadot-api");
5376
5602
  var getTransferCallData10 = ({
5377
5603
  from: from2,
5378
5604
  to,
@@ -5382,17 +5608,17 @@ var getTransferCallData10 = ({
5382
5608
  }) => {
5383
5609
  if (!(0, import_chaindata_provider55.isTokenOfType)(token, MODULE_TYPE10))
5384
5610
  throw new Error(`Token type ${token.type} is not ${MODULE_TYPE10}.`);
5385
- const { builder } = (0, import_scale19.parseMetadataRpc)(metadataRpc);
5611
+ const { builder } = (0, import_scale20.parseMetadataRpc)(metadataRpc);
5386
5612
  const { codec, location } = builder.buildCall("Currencies", "transfer");
5387
5613
  const args = {
5388
5614
  dest: to,
5389
5615
  currency_id: token.onChainId,
5390
5616
  amount: BigInt(value)
5391
5617
  };
5392
- const callData = import_polkadot_api4.Binary.fromBytes((0, import_utils6.mergeUint8)([new Uint8Array(location), codec.enc(args)]));
5618
+ const callData = (0, import_utils6.mergeUint8)([new Uint8Array(location), codec.enc(args)]);
5393
5619
  return {
5394
5620
  address: from2,
5395
- method: callData.asHex()
5621
+ method: import_polkadot_api8.Binary.toHex(callData)
5396
5622
  };
5397
5623
  };
5398
5624
 
@@ -5464,8 +5690,9 @@ var MODULE_TYPE11 = import_chaindata_provider57.SubNativeTokenSchema.shape.type.
5464
5690
  var PLATFORM11 = import_chaindata_provider57.SubNativeTokenSchema.shape.platform.value;
5465
5691
 
5466
5692
  // src/modules/substrate-native/queries/buildBaseQueries.ts
5467
- var import_scale20 = require("@talismn/scale");
5468
- var import_util9 = require("@talismn/util");
5693
+ var import_scale21 = require("@talismn/scale");
5694
+ var import_util11 = require("@talismn/util");
5695
+ var import_polkadot_api9 = require("polkadot-api");
5469
5696
 
5470
5697
  // src/modules/substrate-native/util/lockTypes.ts
5471
5698
  var import_upperFirst = __toESM(require("lodash-es/upperFirst"));
@@ -5626,10 +5853,10 @@ var buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
5626
5853
  return { balance, nomPoolMemberInfo };
5627
5854
  }
5628
5855
  };
5629
- }).filter(import_util9.isNotNil);
5856
+ }).filter(import_util11.isNotNil);
5630
5857
  };
5631
5858
  var decodeBaseResult = (coder, value, networkId) => {
5632
- const decoded = (0, import_scale20.decodeScale)(
5859
+ const decoded = (0, import_scale21.decodeScale)(
5633
5860
  coder,
5634
5861
  value,
5635
5862
  `Failed to decode base native balance on chain ${networkId}`
@@ -5649,22 +5876,25 @@ var decodeBaseResult = (coder, value, networkId) => {
5649
5876
  return newValues;
5650
5877
  };
5651
5878
  var decodeLocksResult = (coder, value, networkId) => {
5652
- const decoded = (0, import_scale20.decodeScale)(
5879
+ const decoded = (0, import_scale21.decodeScale)(
5653
5880
  coder,
5654
5881
  value,
5655
5882
  `Failed to decode lock on chain ${networkId}`
5656
5883
  );
5657
- const locksQueryLocks = decoded?.map?.((lock) => ({
5658
- type: "locked",
5659
- source: "substrate-native-locks",
5660
- label: getLockedType(lock?.id?.asText?.()),
5661
- meta: { id: lock?.id?.asText?.() },
5662
- amount: (lock?.amount ?? 0n).toString()
5663
- })) ?? [];
5884
+ const locksQueryLocks = decoded?.map?.((lock) => {
5885
+ const id = lock?.id ? import_polkadot_api9.Binary.toText(import_polkadot_api9.Binary.fromHex(lock.id)) : void 0;
5886
+ return {
5887
+ type: "locked",
5888
+ source: "substrate-native-locks",
5889
+ label: getLockedType(id),
5890
+ meta: { id },
5891
+ amount: (lock?.amount ?? 0n).toString()
5892
+ };
5893
+ }) ?? [];
5664
5894
  return locksQueryLocks;
5665
5895
  };
5666
5896
  var decodeFreezesResult = (coder, value, networkId) => {
5667
- const decoded = (0, import_scale20.decodeScale)(
5897
+ const decoded = (0, import_scale21.decodeScale)(
5668
5898
  coder,
5669
5899
  value,
5670
5900
  `Failed to decode freeze on chain ${networkId}`
@@ -5678,7 +5908,7 @@ var decodeFreezesResult = (coder, value, networkId) => {
5678
5908
  return freezesValues;
5679
5909
  };
5680
5910
  var decodeHoldsResult = (coder, value, networkId) => {
5681
- const decoded = (0, import_scale20.decodeScale)(
5911
+ const decoded = (0, import_scale21.decodeScale)(
5682
5912
  coder,
5683
5913
  value,
5684
5914
  `Failed to decode holds on chain ${networkId}`
@@ -5694,7 +5924,7 @@ var decodeHoldsResult = (coder, value, networkId) => {
5694
5924
  return holdsValues;
5695
5925
  };
5696
5926
  var decodeStakingLedgerResult = (coder, value, networkId) => {
5697
- const decoded = (0, import_scale20.decodeScale)(
5927
+ const decoded = (0, import_scale21.decodeScale)(
5698
5928
  coder,
5699
5929
  value,
5700
5930
  `Failed to decode unbonding query on chain ${networkId}`
@@ -5711,7 +5941,7 @@ var decodeStakingLedgerResult = (coder, value, networkId) => {
5711
5941
  return stakingLedgerResults;
5712
5942
  };
5713
5943
  var decodePoolMemberResult = (coder, value, networkId) => {
5714
- const decoded = (0, import_scale20.decodeScale)(
5944
+ const decoded = (0, import_scale21.decodeScale)(
5715
5945
  coder,
5716
5946
  value,
5717
5947
  `Failed to decode poolMembers on chain ${networkId}`
@@ -5733,11 +5963,12 @@ var decodePoolMemberResult = (coder, value, networkId) => {
5733
5963
  };
5734
5964
 
5735
5965
  // src/modules/substrate-native/queries/buildNomPoolQueries.ts
5736
- var import_scale21 = require("@talismn/scale");
5966
+ var import_scale22 = require("@talismn/scale");
5967
+ var import_polkadot_api11 = require("polkadot-api");
5737
5968
 
5738
5969
  // src/modules/substrate-native/util/nompoolAccountId.ts
5739
5970
  var import_utils7 = require("@polkadot-api/utils");
5740
- var import_polkadot_api5 = require("polkadot-api");
5971
+ var import_polkadot_api10 = require("polkadot-api");
5741
5972
  var import_scale_ts = require("scale-ts");
5742
5973
  var nompoolAccountId = (palletId, poolId, index) => {
5743
5974
  const utf8Encoder = new TextEncoder();
@@ -5749,7 +5980,7 @@ var nompoolAccountId = (palletId, poolId, index) => {
5749
5980
  const remainingBytes = 32 - length;
5750
5981
  const encEmptyH256 = new Uint8Array(remainingBytes);
5751
5982
  const bytes = (0, import_utils7.mergeUint8)([encModPrefix, encPalletId, encIndex, encPoolId, encEmptyH256]);
5752
- return (0, import_polkadot_api5.AccountId)().dec(bytes);
5983
+ return (0, import_polkadot_api10.AccountId)().dec(bytes);
5753
5984
  };
5754
5985
  var nompoolStashAccountId = (palletId, poolId) => nompoolAccountId(palletId, poolId, 0);
5755
5986
 
@@ -5826,7 +6057,7 @@ var getNomPoolCoders = (networkId, miniMetadata) => {
5826
6057
  });
5827
6058
  };
5828
6059
  var decodePoolPoints = (coder, value, networkId) => {
5829
- const decoded = (0, import_scale21.decodeScale)(
6060
+ const decoded = (0, import_scale22.decodeScale)(
5830
6061
  coder,
5831
6062
  value,
5832
6063
  `Failed to decode bondedPools on chain ${networkId}`
@@ -5834,7 +6065,7 @@ var decodePoolPoints = (coder, value, networkId) => {
5834
6065
  return { poolPoints: decoded?.points.toString() };
5835
6066
  };
5836
6067
  var decodePoolStake = (coder, value, networkId) => {
5837
- const decoded = (0, import_scale21.decodeScale)(
6068
+ const decoded = (0, import_scale22.decodeScale)(
5838
6069
  coder,
5839
6070
  value,
5840
6071
  `Failed to decode ledger on chain ${networkId}`
@@ -5842,12 +6073,12 @@ var decodePoolStake = (coder, value, networkId) => {
5842
6073
  return { poolTotalActiveStake: decoded?.active.toString() };
5843
6074
  };
5844
6075
  var decodePoolMeta = (coder, value, networkId) => {
5845
- const decoded = (0, import_scale21.decodeScale)(
6076
+ const decoded = (0, import_scale22.decodeScale)(
5846
6077
  coder,
5847
6078
  value,
5848
6079
  `Failed to decode metadata on chain ${networkId}`
5849
6080
  );
5850
- const metadata = decoded?.asText();
6081
+ const metadata = decoded ? import_polkadot_api11.Binary.toText(decoded) : void 0;
5851
6082
  return { metadata };
5852
6083
  };
5853
6084
  var getNomPoolStateKeys = (coders, nomPoolMemberInfo, extra) => {
@@ -5961,7 +6192,8 @@ var getChainProperties = async (connector, networkId) => {
5961
6192
 
5962
6193
  // src/modules/substrate-native/getMiniMetadata.ts
5963
6194
  var import_chaindata_provider59 = require("@talismn/chaindata-provider");
5964
- var import_scale22 = require("@talismn/scale");
6195
+ var import_scale23 = require("@talismn/scale");
6196
+ var import_polkadot_api12 = require("polkadot-api");
5965
6197
  var getMiniMetadata11 = ({ networkId, specVersion, metadataRpc, config }) => {
5966
6198
  const source = MODULE_TYPE11;
5967
6199
  const chainId = networkId;
@@ -5971,7 +6203,7 @@ var getMiniMetadata11 = ({ networkId, specVersion, metadataRpc, config }) => {
5971
6203
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
5972
6204
  );
5973
6205
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
5974
- const { metadata, unifiedMetadata } = (0, import_scale22.parseMetadataRpc)(metadataRpc);
6206
+ const { metadata, unifiedMetadata } = (0, import_scale23.parseMetadataRpc)(metadataRpc);
5975
6207
  if (unifiedMetadata.version < 14)
5976
6208
  throw new Error(
5977
6209
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -5991,16 +6223,17 @@ var getMiniMetadata11 = ({ networkId, specVersion, metadataRpc, config }) => {
5991
6223
  "Balances",
5992
6224
  "ExistentialDeposit"
5993
6225
  )?.toString();
5994
- const nominationPoolsPalletId = tryGetConstantValue(
6226
+ const nominationPoolsPalletIdHex = tryGetConstantValue(
5995
6227
  metadataRpc,
5996
6228
  "NominationPools",
5997
6229
  "PalletId"
5998
- )?.asText();
6230
+ );
6231
+ const nominationPoolsPalletId = nominationPoolsPalletIdHex ? import_polkadot_api12.Binary.toText(import_polkadot_api12.Binary.fromHex(nominationPoolsPalletIdHex)) : void 0;
5999
6232
  const hasFreezesItem = Boolean(
6000
6233
  unifiedMetadata.pallets.find(({ name }) => name === "Balances")?.storage?.items.find(({ name }) => name === "Freezes")
6001
6234
  );
6002
6235
  const useLegacyTransferableCalculation = !hasFreezesItem;
6003
- (0, import_scale22.compactMetadata)(metadata, [
6236
+ (0, import_scale23.compactMetadata)(metadata, [
6004
6237
  { pallet: "System", constants: ["Version", "SS58Prefix"], items: ["Account"] },
6005
6238
  { pallet: "Balances", items: ["Reserves", "Holds", "Locks", "Freezes"] },
6006
6239
  { pallet: "NominationPools", items: ["PoolMembers", "BondedPools", "Metadata"] },
@@ -6012,7 +6245,7 @@ var getMiniMetadata11 = ({ networkId, specVersion, metadataRpc, config }) => {
6012
6245
  chainId,
6013
6246
  specVersion,
6014
6247
  version: import_chaindata_provider59.MINIMETADATA_VERSION,
6015
- data: (0, import_scale22.encodeMetadata)(metadata),
6248
+ data: (0, import_scale23.encodeMetadata)(metadata),
6016
6249
  extra: {
6017
6250
  useLegacyTransferableCalculation,
6018
6251
  existentialDeposit,
@@ -6024,8 +6257,8 @@ var getMiniMetadata11 = ({ networkId, specVersion, metadataRpc, config }) => {
6024
6257
  // src/modules/substrate-native/getTransferCallData.ts
6025
6258
  var import_utils8 = require("@polkadot-api/utils");
6026
6259
  var import_chaindata_provider60 = require("@talismn/chaindata-provider");
6027
- var import_scale23 = require("@talismn/scale");
6028
- var import_polkadot_api6 = require("polkadot-api");
6260
+ var import_scale24 = require("@talismn/scale");
6261
+ var import_polkadot_api13 = require("polkadot-api");
6029
6262
  var getTransferCallData11 = ({
6030
6263
  from: from2,
6031
6264
  to,
@@ -6036,14 +6269,14 @@ var getTransferCallData11 = ({
6036
6269
  }) => {
6037
6270
  if (!(0, import_chaindata_provider60.isTokenOfType)(token, MODULE_TYPE11))
6038
6271
  throw new Error(`Token type ${token.type} is not ${MODULE_TYPE11}.`);
6039
- const { unifiedMetadata, lookupFn, builder } = (0, import_scale23.parseMetadataRpc)(metadataRpc);
6272
+ const { unifiedMetadata, lookupFn, builder } = (0, import_scale24.parseMetadataRpc)(metadataRpc);
6040
6273
  const method = getTransferMethod3(type, unifiedMetadata, lookupFn);
6041
6274
  const { codec, location } = builder.buildCall("Balances", method);
6042
6275
  const args = getEncodedArgs3(method, to, value, codec);
6043
- const callData = import_polkadot_api6.Binary.fromBytes((0, import_utils8.mergeUint8)([new Uint8Array(location), args]));
6276
+ const callData = (0, import_utils8.mergeUint8)([new Uint8Array(location), args]);
6044
6277
  return {
6045
6278
  address: from2,
6046
- method: callData.asHex()
6279
+ method: import_polkadot_api13.Binary.toHex(callData)
6047
6280
  };
6048
6281
  };
6049
6282
  var getTransferMethod3 = (type, unifiedMetadata, lookupFn) => {
@@ -6089,7 +6322,7 @@ var getEncodedValue3 = (codec, possibleValue) => {
6089
6322
  var getTransferEncodedArgs3 = (to, value, codec) => {
6090
6323
  return getEncodedValue3(codec, [
6091
6324
  () => ({
6092
- dest: (0, import_polkadot_api6.Enum)("Id", to),
6325
+ dest: (0, import_polkadot_api13.Enum)("Id", to),
6093
6326
  value: BigInt(value)
6094
6327
  }),
6095
6328
  () => ({
@@ -6102,7 +6335,7 @@ var getTransferEncodedArgs3 = (to, value, codec) => {
6102
6335
  var getTransferAllEncodedArgs3 = (to, codec) => {
6103
6336
  return getEncodedValue3(codec, [
6104
6337
  () => ({
6105
- dest: (0, import_polkadot_api6.Enum)("Id", to),
6338
+ dest: (0, import_polkadot_api13.Enum)("Id", to),
6106
6339
  keep_alive: false
6107
6340
  }),
6108
6341
  () => ({
@@ -7336,7 +7569,7 @@ var fetchTokens12 = async ({
7336
7569
 
7337
7570
  // src/modules/substrate-psp22/getMiniMetadata.ts
7338
7571
  var import_chaindata_provider63 = require("@talismn/chaindata-provider");
7339
- var import_scale24 = require("@talismn/scale");
7572
+ var import_scale25 = require("@talismn/scale");
7340
7573
  var getMiniMetadata12 = ({
7341
7574
  networkId,
7342
7575
  specVersion,
@@ -7350,7 +7583,7 @@ var getMiniMetadata12 = ({
7350
7583
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
7351
7584
  );
7352
7585
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
7353
- const { unifiedMetadata } = (0, import_scale24.parseMetadataRpc)(metadataRpc);
7586
+ const { unifiedMetadata } = (0, import_scale25.parseMetadataRpc)(metadataRpc);
7354
7587
  if (unifiedMetadata.version < 14)
7355
7588
  throw new Error(
7356
7589
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -7371,13 +7604,13 @@ var import_api_contract3 = require("@polkadot/api-contract");
7371
7604
  var import_types19 = require("@polkadot/types");
7372
7605
  var import_utils9 = require("@polkadot-api/utils");
7373
7606
  var import_chaindata_provider64 = require("@talismn/chaindata-provider");
7374
- var import_scale25 = require("@talismn/scale");
7375
- var import_polkadot_api7 = require("polkadot-api");
7607
+ var import_scale26 = require("@talismn/scale");
7608
+ var import_polkadot_api14 = require("polkadot-api");
7376
7609
  var getTransferCallData12 = async ({ from: from2, to, value, token, metadataRpc, connector }) => {
7377
7610
  if (!(0, import_chaindata_provider64.isTokenOfType)(token, MODULE_TYPE12))
7378
7611
  throw new Error(`Token type ${token.type} is not ${MODULE_TYPE12}.`);
7379
7612
  const networkId = (0, import_chaindata_provider64.parseTokenId)(token.id).networkId;
7380
- const { builder } = (0, import_scale25.parseMetadataRpc)(metadataRpc);
7613
+ const { builder } = (0, import_scale26.parseMetadataRpc)(metadataRpc);
7381
7614
  const { codec, location } = builder.buildCall("Contracts", "call");
7382
7615
  const Psp22Abi = new import_api_contract3.Abi(psp22_default);
7383
7616
  const registry = new import_types19.TypeRegistry();
@@ -7390,19 +7623,19 @@ var getTransferCallData12 = async ({ from: from2, to, value, token, metadataRpc,
7390
7623
  const hexData = registry.createType("Vec<u8>", data).toHex();
7391
7624
  const dryRunResult = await contractCall(from2, token.contractAddress, data);
7392
7625
  const args = codec.enc({
7393
- dest: (0, import_polkadot_api7.Enum)("Id", token.contractAddress),
7626
+ dest: (0, import_polkadot_api14.Enum)("Id", token.contractAddress),
7394
7627
  value: 0,
7395
7628
  gas_limit: {
7396
7629
  ref_time: dryRunResult.gasRequired.refTime.toBigInt(),
7397
7630
  proof_size: dryRunResult.gasRequired.proofSize.toBigInt()
7398
7631
  },
7399
7632
  storage_deposit_limit: dryRunResult.storageDeposit.isCharge ? dryRunResult.storageDeposit.asCharge.toBigInt() : null,
7400
- data: import_polkadot_api7.Binary.fromHex(hexData)
7633
+ data: import_polkadot_api14.Binary.fromHex(hexData)
7401
7634
  });
7402
- const callData = import_polkadot_api7.Binary.fromBytes((0, import_utils9.mergeUint8)([new Uint8Array(location), args]));
7635
+ const callData = (0, import_utils9.mergeUint8)([new Uint8Array(location), args]);
7403
7636
  return {
7404
7637
  address: from2,
7405
- method: callData.asHex()
7638
+ method: import_polkadot_api14.Binary.toHex(callData)
7406
7639
  };
7407
7640
  };
7408
7641
 
@@ -7474,8 +7707,8 @@ var MODULE_TYPE13 = import_chaindata_provider66.SubTokensTokenSchema.shape.type.
7474
7707
  var PLATFORM13 = import_chaindata_provider66.SubTokensTokenSchema.shape.platform.value;
7475
7708
 
7476
7709
  // src/modules/substrate-tokens/buildQueries.ts
7477
- var import_scale26 = require("@talismn/scale");
7478
- var import_util13 = require("@talismn/util");
7710
+ var import_scale27 = require("@talismn/scale");
7711
+ var import_util15 = require("@talismn/util");
7479
7712
  var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
7480
7713
  const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
7481
7714
  storage: [miniMetadata.extra.palletId, "Accounts"]
@@ -7484,7 +7717,7 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
7484
7717
  const scaleCoder = networkStorageCoders?.storage;
7485
7718
  const getStateKey = (onChainId) => {
7486
7719
  try {
7487
- return scaleCoder.keys.enc(address, (0, import_scale26.papiParse)(onChainId));
7720
+ return scaleCoder.keys.enc(address, (0, import_scale27.papiParse)(onChainId));
7488
7721
  } catch {
7489
7722
  return null;
7490
7723
  }
@@ -7497,7 +7730,7 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
7497
7730
  return null;
7498
7731
  }
7499
7732
  const decodeResult = (changes) => {
7500
- const decoded = (0, import_scale26.decodeScale)(
7733
+ const decoded = (0, import_scale27.decodeScale)(
7501
7734
  scaleCoder,
7502
7735
  changes[0],
7503
7736
  `Failed to decode substrate-tokens balance on chain ${networkId}`
@@ -7523,7 +7756,7 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
7523
7756
  stateKeys: [stateKey],
7524
7757
  decodeResult
7525
7758
  };
7526
- }).filter(import_util13.isNotNil);
7759
+ }).filter(import_util15.isNotNil);
7527
7760
  };
7528
7761
 
7529
7762
  // src/modules/substrate-tokens/fetchBalances.ts
@@ -7621,7 +7854,7 @@ var fetchTokens13 = async ({
7621
7854
 
7622
7855
  // src/modules/substrate-tokens/getMiniMetadata.ts
7623
7856
  var import_chaindata_provider68 = require("@talismn/chaindata-provider");
7624
- var import_scale27 = require("@talismn/scale");
7857
+ var import_scale28 = require("@talismn/scale");
7625
7858
  var getMiniMetadata13 = ({ networkId, specVersion, metadataRpc, config }) => {
7626
7859
  const source = MODULE_TYPE13;
7627
7860
  const chainId = networkId;
@@ -7631,7 +7864,7 @@ var getMiniMetadata13 = ({ networkId, specVersion, metadataRpc, config }) => {
7631
7864
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
7632
7865
  );
7633
7866
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
7634
- const { unifiedMetadata } = (0, import_scale27.parseMetadataRpc)(metadataRpc);
7867
+ const { unifiedMetadata } = (0, import_scale28.parseMetadataRpc)(metadataRpc);
7635
7868
  if (unifiedMetadata.version < 14)
7636
7869
  throw new Error(
7637
7870
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -7648,26 +7881,26 @@ var getMiniMetadata13 = ({ networkId, specVersion, metadataRpc, config }) => {
7648
7881
  };
7649
7882
  };
7650
7883
  var getData5 = (metadataRpc, pallet) => {
7651
- const { metadata, unifiedMetadata } = (0, import_scale27.parseMetadataRpc)(metadataRpc);
7884
+ const { metadata, unifiedMetadata } = (0, import_scale28.parseMetadataRpc)(metadataRpc);
7652
7885
  if (!hasStorageItems(unifiedMetadata, pallet, ["Accounts"])) return null;
7653
- (0, import_scale27.compactMetadata)(metadata, [{ pallet, items: ["Accounts"] }]);
7654
- return (0, import_scale27.encodeMetadata)(metadata);
7886
+ (0, import_scale28.compactMetadata)(metadata, [{ pallet, items: ["Accounts"] }]);
7887
+ return (0, import_scale28.encodeMetadata)(metadata);
7655
7888
  };
7656
7889
 
7657
7890
  // src/modules/substrate-tokens/getTransferCallData.ts
7658
7891
  var import_utils10 = require("@polkadot-api/utils");
7659
7892
  var import_chaindata_provider69 = require("@talismn/chaindata-provider");
7660
- var import_scale28 = require("@talismn/scale");
7661
- var import_polkadot_api8 = require("polkadot-api");
7893
+ var import_scale29 = require("@talismn/scale");
7894
+ var import_polkadot_api15 = require("polkadot-api");
7662
7895
  var getTransferCallData13 = ({ from: from2, to, value, token, type, metadataRpc, config }) => {
7663
7896
  if (!(0, import_chaindata_provider69.isTokenOfType)(token, MODULE_TYPE13))
7664
7897
  throw new Error(`Token type ${token.type} is not ${MODULE_TYPE13}.`);
7665
- const { builder } = (0, import_scale28.parseMetadataRpc)(metadataRpc);
7898
+ const { builder } = (0, import_scale29.parseMetadataRpc)(metadataRpc);
7666
7899
  const options = getCallDataOptions(to, token, value, type, config);
7667
7900
  const callData = getCallDataFromOptions(builder, options);
7668
7901
  return {
7669
7902
  address: from2,
7670
- method: callData.asHex()
7903
+ method: import_polkadot_api15.Binary.toHex(callData)
7671
7904
  };
7672
7905
  };
7673
7906
  var getTransferMethod4 = (type) => {
@@ -7691,17 +7924,17 @@ var getCallDataFromOptions = (builder, options) => {
7691
7924
  };
7692
7925
  var buildCallData = (builder, pallet, method, args) => {
7693
7926
  const { location, codec } = builder.buildCall(pallet, method);
7694
- return import_polkadot_api8.Binary.fromBytes((0, import_utils10.mergeUint8)([new Uint8Array(location), codec.enc(args)]));
7927
+ return (0, import_utils10.mergeUint8)([new Uint8Array(location), codec.enc(args)]);
7695
7928
  };
7696
7929
  var getCallDataOptions = (to, token, value, type, config) => {
7697
- const onChainId = (0, import_scale28.papiParse)(token.onChainId);
7930
+ const onChainId = (0, import_scale29.papiParse)(token.onChainId);
7698
7931
  const method = getTransferMethod4(type);
7699
7932
  return [
7700
7933
  {
7701
7934
  pallet: "Currencies",
7702
7935
  method: "transfer",
7703
7936
  getArgs: () => ({
7704
- dest: (0, import_polkadot_api8.Enum)("Id", to),
7937
+ dest: (0, import_polkadot_api15.Enum)("Id", to),
7705
7938
  currency_id: onChainId,
7706
7939
  amount: BigInt(value)
7707
7940
  })
@@ -7719,11 +7952,11 @@ var getCallDataOptions = (to, token, value, type, config) => {
7719
7952
  pallet: "Tokens",
7720
7953
  method,
7721
7954
  getArgs: () => method === "transfer_all" ? {
7722
- dest: (0, import_polkadot_api8.Enum)("Id", to),
7955
+ dest: (0, import_polkadot_api15.Enum)("Id", to),
7723
7956
  currency_id: onChainId,
7724
7957
  keepAlive: false
7725
7958
  } : {
7726
- dest: (0, import_polkadot_api8.Enum)("Id", to),
7959
+ dest: (0, import_polkadot_api15.Enum)("Id", to),
7727
7960
  currency_id: onChainId,
7728
7961
  amount: BigInt(value)
7729
7962
  }
@@ -7747,11 +7980,11 @@ var getCallDataOptions = (to, token, value, type, config) => {
7747
7980
  pallet: config.palletId,
7748
7981
  method,
7749
7982
  getArgs: () => method === "transfer_all" ? {
7750
- dest: (0, import_polkadot_api8.Enum)("Id", to),
7983
+ dest: (0, import_polkadot_api15.Enum)("Id", to),
7751
7984
  currency_id: onChainId,
7752
7985
  keepAlive: false
7753
7986
  } : {
7754
- dest: (0, import_polkadot_api8.Enum)("Id", to),
7987
+ dest: (0, import_polkadot_api15.Enum)("Id", to),
7755
7988
  currency_id: onChainId,
7756
7989
  amount: BigInt(value)
7757
7990
  }
@@ -7835,7 +8068,7 @@ var BALANCE_MODULES = [
7835
8068
 
7836
8069
  // src/getMiniMetadatas/getMetadataRpc.ts
7837
8070
  var import_sapi = require("@talismn/sapi");
7838
- var import_util14 = require("@talismn/util");
8071
+ var import_util16 = require("@talismn/util");
7839
8072
  var CACHE = /* @__PURE__ */ new Map();
7840
8073
  var getMetadataRpc = async (chainConnector, networkId) => {
7841
8074
  if (CACHE.has(networkId)) return CACHE.get(networkId);
@@ -7849,7 +8082,7 @@ var getMetadataRpc = async (chainConnector, networkId) => {
7849
8082
  try {
7850
8083
  return await pResult;
7851
8084
  } catch (cause) {
7852
- if ((0, import_util14.isAbortError)(cause)) throw cause;
8085
+ if ((0, import_util16.isAbortError)(cause)) throw cause;
7853
8086
  throw new Error(`Failed to fetch metadataRpc for network ${networkId}`, { cause });
7854
8087
  } finally {
7855
8088
  CACHE.delete(networkId);
@@ -7938,16 +8171,16 @@ var BalancesProvider = class {
7938
8171
  this.#chaindataProvider = chaindataProvider;
7939
8172
  this.#chainConnectors = chainConnectors;
7940
8173
  this.#storage = new import_rxjs16.BehaviorSubject({
7941
- balances: (0, import_lodash_es30.keyBy)(storage.balances.filter(import_util15.isNotNil), (b) => getBalanceId(b)),
7942
- miniMetadatas: (0, import_lodash_es30.keyBy)(storage.miniMetadatas.filter(import_util15.isNotNil), (m) => m.id)
8174
+ balances: (0, import_lodash_es30.keyBy)(storage.balances.filter(import_util17.isNotNil), (b) => getBalanceId(b)),
8175
+ miniMetadatas: (0, import_lodash_es30.keyBy)(storage.miniMetadatas.filter(import_util17.isNotNil), (m) => m.id)
7943
8176
  });
7944
8177
  }
7945
8178
  get storage$() {
7946
8179
  return this.#storage.pipe(
7947
8180
  (0, import_rxjs16.map)(
7948
8181
  ({ balances, miniMetadatas }) => ({
7949
- balances: (0, import_lodash_es30.values)(balances).filter(import_util15.isNotNil).sort(sortByBalanceId),
7950
- miniMetadatas: (0, import_lodash_es30.values)(miniMetadatas).filter(import_util15.isNotNil).sort(sortByMiniMetadataId)
8182
+ balances: (0, import_lodash_es30.values)(balances).filter(import_util17.isNotNil).sort(sortByBalanceId),
8183
+ miniMetadatas: (0, import_lodash_es30.values)(miniMetadatas).filter(import_util17.isNotNil).sort(sortByMiniMetadataId)
7951
8184
  }),
7952
8185
  (0, import_rxjs16.shareReplay)(1)
7953
8186
  )
@@ -8048,7 +8281,7 @@ var BalancesProvider = class {
8048
8281
  }),
8049
8282
  (0, import_rxjs16.map)((results) => {
8050
8283
  const errorBalanceIds = results.flatMap((result) => result.failedBalanceIds);
8051
- const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(import_util15.isNotNil).map((b) => ({ ...b, status: "stale" }));
8284
+ const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(import_util17.isNotNil).map((b) => ({ ...b, status: "stale" }));
8052
8285
  return {
8053
8286
  status: results.some(({ status }) => status === "initialising") ? "initialising" : "live",
8054
8287
  balances: results.flatMap((result) => result.balances).concat(staleBalances).sort(sortByBalanceId),
@@ -8059,7 +8292,7 @@ var BalancesProvider = class {
8059
8292
  );
8060
8293
  }
8061
8294
  getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
8062
- return (0, import_util15.getSharedObservable)(
8295
+ return (0, import_util17.getSharedObservable)(
8063
8296
  `BalancesProvider.getPolkadotNetworkModuleBalances$`,
8064
8297
  { networkId, mod, tokensWithAddresses },
8065
8298
  () => {
@@ -8101,8 +8334,14 @@ var BalancesProvider = class {
8101
8334
  (0, import_rxjs16.map)(
8102
8335
  (results) => ({
8103
8336
  status: "live",
8104
- // exclude zero balances
8105
- balances: results.success.filter((b) => new Balance(b).total.planck > 0n),
8337
+ // exclude zero balances, but keep balances that only hold a lock
8338
+ // (eg dtao conviction locks, reported on the subnet's base token — including
8339
+ // zero-mass "ghost" locks with residual conviction, which still pin the hotkey
8340
+ // of future lock_stake calls)
8341
+ balances: results.success.filter((b) => {
8342
+ const balance = new Balance(b);
8343
+ return balance.total.planck > 0n || balance.locks.some((lock) => lock.amount.planck > 0n) || !!findDTaoConvictionLock(balance.locks);
8344
+ }),
8106
8345
  failedBalanceIds: results.errors.map(
8107
8346
  ({ tokenId, address }) => getBalanceId({ tokenId, address })
8108
8347
  )
@@ -8113,7 +8352,7 @@ var BalancesProvider = class {
8113
8352
  }),
8114
8353
  // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change
8115
8354
  (0, import_rxjs16.shareReplay)({ refCount: true, bufferSize: 1 }),
8116
- (0, import_util15.keepAlive)(0)
8355
+ (0, import_util17.keepAlive)(0)
8117
8356
  );
8118
8357
  return (0, import_rxjs16.defer)(
8119
8358
  () => moduleBalances$.pipe(
@@ -8128,7 +8367,7 @@ var BalancesProvider = class {
8128
8367
  );
8129
8368
  }
8130
8369
  getEthereumNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
8131
- return (0, import_util15.getSharedObservable)(
8370
+ return (0, import_util17.getSharedObservable)(
8132
8371
  `BalancesProvider.getEthereumNetworkModuleBalances$`,
8133
8372
  { networkId, mod, tokensWithAddresses },
8134
8373
  () => {
@@ -8172,7 +8411,7 @@ var BalancesProvider = class {
8172
8411
  }),
8173
8412
  // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change
8174
8413
  (0, import_rxjs16.shareReplay)({ refCount: true, bufferSize: 1 }),
8175
- (0, import_util15.keepAlive)(0)
8414
+ (0, import_util17.keepAlive)(0)
8176
8415
  );
8177
8416
  return (0, import_rxjs16.defer)(
8178
8417
  () => moduleBalances$.pipe(
@@ -8187,7 +8426,7 @@ var BalancesProvider = class {
8187
8426
  );
8188
8427
  }
8189
8428
  getSolanaNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
8190
- return (0, import_util15.getSharedObservable)(
8429
+ return (0, import_util17.getSharedObservable)(
8191
8430
  `BalancesProvider.getSolanaNetworkModuleBalances$`,
8192
8431
  { networkId, mod, tokensWithAddresses },
8193
8432
  () => {
@@ -8236,7 +8475,7 @@ var BalancesProvider = class {
8236
8475
  }),
8237
8476
  // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change
8238
8477
  (0, import_rxjs16.shareReplay)({ refCount: true, bufferSize: 1 }),
8239
- (0, import_util15.keepAlive)(0)
8478
+ (0, import_util17.keepAlive)(0)
8240
8479
  );
8241
8480
  return (0, import_rxjs16.defer)(
8242
8481
  () => moduleBalances$.pipe(
@@ -8274,7 +8513,7 @@ var BalancesProvider = class {
8274
8513
  this.#storage.next((0, import_lodash_es30.assign)({}, storage, { balances }));
8275
8514
  }
8276
8515
  getNetworkMiniMetadatas$(networkId) {
8277
- return (0, import_util15.getSharedObservable)(`BalancesProvider.getNetworkMiniMetadatas$`, { networkId }, () => {
8516
+ return (0, import_util17.getSharedObservable)(`BalancesProvider.getNetworkMiniMetadatas$`, { networkId }, () => {
8278
8517
  return this.#chaindataProvider.getNetworkById$(networkId).pipe(
8279
8518
  (0, import_rxjs16.switchMap)(
8280
8519
  (network) => (0, import_chaindata_provider71.isNetworkDot)(network) ? this.getNetworkSpecVersion$(networkId).pipe(
@@ -8368,7 +8607,7 @@ var BalancesProvider = class {
8368
8607
  return this.storedMiniMetadataMapById$.pipe(
8369
8608
  (0, import_rxjs16.map)((mapById) => {
8370
8609
  const miniMetadatas = miniMetadataIds.map((id) => mapById[id]);
8371
- return miniMetadatas.length && miniMetadatas.every(import_util15.isTruthy) ? miniMetadatas : null;
8610
+ return miniMetadatas.length && miniMetadatas.every(import_util17.isTruthy) ? miniMetadatas : null;
8372
8611
  }),
8373
8612
  // source changes very often
8374
8613
  (0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
@@ -8378,7 +8617,7 @@ var BalancesProvider = class {
8378
8617
  return this.#chaindataProvider.miniMetadatasMapById$.pipe(
8379
8618
  (0, import_rxjs16.map)((mapById) => {
8380
8619
  const miniMetadatas = miniMetadataIds.map((id) => mapById[id]);
8381
- return miniMetadatas.length && miniMetadatas.every(import_util15.isTruthy) ? miniMetadatas : null;
8620
+ return miniMetadatas.length && miniMetadatas.every(import_util17.isTruthy) ? miniMetadatas : null;
8382
8621
  })
8383
8622
  );
8384
8623
  }
@@ -8386,7 +8625,7 @@ var BalancesProvider = class {
8386
8625
  const balanceDefs = (0, import_lodash_es30.toPairs)(addressesByToken).flatMap(
8387
8626
  ([tokenId, addresses]) => addresses.map((address) => [tokenId, address])
8388
8627
  );
8389
- return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(import_util15.isNotNil).sort(sortByBalanceId);
8628
+ return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(import_util17.isNotNil).sort(sortByBalanceId);
8390
8629
  }
8391
8630
  cleanupAddressesByTokenId$(addressesByTokenId) {
8392
8631
  return this.#chaindataProvider.getNetworksMapById$().pipe(
@@ -8490,7 +8729,9 @@ var import_chaindata_provider72 = require("@talismn/chaindata-provider");
8490
8729
  excludeFromTransferableAmount,
8491
8730
  filterBaseLocks,
8492
8731
  filterMirrorTokens,
8732
+ findDTaoConvictionLock,
8493
8733
  getBalanceId,
8734
+ getConvictionLockLabel,
8494
8735
  getDTaoTokenRates,
8495
8736
  getLockTitle,
8496
8737
  getLockedType,
@@ -8498,6 +8739,7 @@ var import_chaindata_provider72 = require("@talismn/chaindata-provider");
8498
8739
  getValueId,
8499
8740
  includeInTotalExtraAmount,
8500
8741
  taoToAlpha,
8742
+ taoToAlphaCeil,
8501
8743
  uniswapV2PairAbi
8502
8744
  });
8503
8745
  //# sourceMappingURL=index.js.map