@talismn/balances 1.3.7 → 1.5.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.mjs CHANGED
@@ -1,3 +1,8 @@
1
+ // src/configureBigNumber.ts
2
+ import BigNumber from "bignumber.js";
3
+ BigNumber.set({ STRICT: false });
4
+ var configureBigNumber_default = BigNumber;
5
+
1
6
  // src/BalancesProvider.ts
2
7
  import {
3
8
  isNetworkDot,
@@ -7,20 +12,20 @@ import {
7
12
  getAccountPlatformFromAddress,
8
13
  normalizeAddress
9
14
  } from "@talismn/crypto";
10
- import { getSharedObservable, isNotNil as isNotNil9, isTruthy, keepAlive } from "@talismn/util";
11
- import { assign as assign11, fromPairs as fromPairs2, isEqual as isEqual10, keyBy as keyBy8, keys as keys3, toPairs as toPairs2, uniq as uniq5, values as values2 } from "lodash-es";
15
+ import { getSharedObservable, isNotNil as isNotNil10, isTruthy, keepAlive } from "@talismn/util";
16
+ import { assign as assign12, fromPairs as fromPairs2, isEqual as isEqual11, keyBy as keyBy9, keys as keys3, toPairs as toPairs2, uniq as uniq6, values as values2 } from "lodash-es";
12
17
  import {
13
18
  BehaviorSubject as BehaviorSubject2,
14
19
  catchError,
15
20
  combineLatest,
16
21
  defer,
17
- distinctUntilChanged as distinctUntilChanged10,
22
+ distinctUntilChanged as distinctUntilChanged11,
18
23
  EMPTY,
19
24
  filter,
20
25
  firstValueFrom,
21
26
  from,
22
27
  map as map6,
23
- of as of14,
28
+ of as of15,
24
29
  shareReplay,
25
30
  startWith,
26
31
  switchMap as switchMap2,
@@ -38,7 +43,7 @@ import anylogger from "anylogger";
38
43
  // package.json
39
44
  var package_default = {
40
45
  name: "@talismn/balances",
41
- version: "1.3.7",
46
+ version: "1.5.0",
42
47
  author: "Talisman",
43
48
  homepage: "https://talisman.xyz",
44
49
  license: "GPL-3.0-or-later",
@@ -66,9 +71,9 @@ var package_default = {
66
71
  },
67
72
  dependencies: {
68
73
  "@metaplex-foundation/mpl-token-metadata": "^3.4.0",
69
- "@metaplex-foundation/umi": "^1.2.0",
74
+ "@metaplex-foundation/umi": "^1.5.1",
70
75
  "@polkadot-api/utils": "0.2.0",
71
- "@solana/spl-token": "^0.4.13",
76
+ "@solana/spl-token": "^0.4.14",
72
77
  "@solana/web3.js": "^1.98.2",
73
78
  "@talismn/chain-connectors": "workspace:*",
74
79
  "@talismn/chaindata-provider": "workspace:*",
@@ -78,28 +83,26 @@ var package_default = {
78
83
  "@talismn/token-rates": "workspace:*",
79
84
  "@talismn/util": "workspace:*",
80
85
  anylogger: "^1.0.11",
81
- "bignumber.js": "^9.1.2",
82
- "lodash-es": "4.17.21",
86
+ "bignumber.js": "^11.1.3",
87
+ "lodash-es": "4.18.1",
83
88
  "p-queue": "8.1.0",
84
89
  "polkadot-api": "1.23.3",
85
- rxjs: "^7.8.1",
90
+ rxjs: "^7.8.2",
86
91
  "scale-ts": "^1.6.1",
87
- viem: "^2.27.3",
88
- zod: "^3.25.76"
92
+ viem: "2.52.2",
93
+ zod: "^4.4.3"
89
94
  },
90
95
  devDependencies: {
91
96
  "@polkadot/api-contract": "16.1.2",
92
97
  "@polkadot/types": "16.1.2",
93
- "@polkadot/util": "13.5.3",
94
98
  "@talismn/tsconfig": "workspace:*",
95
99
  "@types/lodash-es": "4.17.12",
96
- typescript: "^5.6.3"
100
+ "@types/node": "^24.5.1",
101
+ typescript: "^6.0.3"
97
102
  },
98
103
  peerDependencies: {
99
104
  "@polkadot/api-contract": "*",
100
105
  "@polkadot/types": "*",
101
- "@polkadot/util": "*",
102
- "@polkadot/util-crypto": "*",
103
106
  "@substrate/txwrapper-core": "*"
104
107
  },
105
108
  types: "./dist/index.d.ts",
@@ -1022,13 +1025,8 @@ import { assign, omit } from "lodash-es";
1022
1025
  import z from "zod/v4";
1023
1026
 
1024
1027
  // src/modules/evm-erc20/utils.ts
1025
- import {
1026
- ContractFunctionExecutionError,
1027
- erc20Abi as erc20Abi2,
1028
- erc20Abi_bytes32,
1029
- getContract,
1030
- hexToString
1031
- } from "viem";
1028
+ import { isErrorOfName } from "@talismn/util";
1029
+ import { erc20Abi as erc20Abi2, erc20Abi_bytes32, getContract, hexToString } from "viem";
1032
1030
  var getErc20ContractData = async (client, contractAddress) => {
1033
1031
  try {
1034
1032
  const contract = getTypedContract(client, erc20Abi2, contractAddress);
@@ -1038,7 +1036,7 @@ var getErc20ContractData = async (client, contractAddress) => {
1038
1036
  contract.read.name()
1039
1037
  ]);
1040
1038
  } catch (e) {
1041
- if (e instanceof ContractFunctionExecutionError) {
1039
+ if (isErrorOfName(e, "ContractFunctionExecutionError")) {
1042
1040
  const contract = getTypedContract(client, erc20Abi_bytes32, contractAddress);
1043
1041
  var [bytesSymbol, decimals, nameSymbol] = await Promise.all([
1044
1042
  contract.read.symbol(),
@@ -1255,21 +1253,30 @@ var fetchBalances2 = async ({
1255
1253
  }
1256
1254
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
1257
1255
  if (client.chain?.contracts?.multicall3 && balanceDefs.length > 1) {
1258
- const multicall3 = client.chain.contracts.multicall3;
1259
- return fetchWithMulticall(client, balanceDefs, multicall3.address);
1256
+ try {
1257
+ return await fetchWithMulticall(
1258
+ client,
1259
+ balanceDefs,
1260
+ client.chain.contracts.multicall3.address
1261
+ );
1262
+ } catch {
1263
+ }
1260
1264
  }
1261
- return fetchWithoutMulticall(client, balanceDefs);
1265
+ return fetchWithGetBalance(client, balanceDefs);
1262
1266
  };
1263
- var fetchWithoutMulticall = async (client, balanceDefs) => {
1267
+ var fetchWithGetBalance = async (client, balanceDefs) => {
1264
1268
  if (balanceDefs.length === 0) return { success: [], errors: [] };
1265
1269
  const results = await Promise.allSettled(
1266
1270
  balanceDefs.map(async ({ token, address }) => {
1267
1271
  try {
1268
- const result = await client.getBalance({ address });
1272
+ const result = await client.request({
1273
+ method: "eth_getBalance",
1274
+ params: [address, "latest"]
1275
+ });
1269
1276
  const balance = {
1270
1277
  address,
1271
1278
  tokenId: token.id,
1272
- value: result.toString(),
1279
+ value: BigInt(result).toString(),
1273
1280
  source: MODULE_TYPE2,
1274
1281
  networkId: parseTokenId2(token.id).networkId,
1275
1282
  status: "live"
@@ -1303,55 +1310,28 @@ var fetchWithoutMulticall = async (client, balanceDefs) => {
1303
1310
  };
1304
1311
  var fetchWithMulticall = async (client, balanceDefs, multicall3Address) => {
1305
1312
  if (balanceDefs.length === 0) return { success: [], errors: [] };
1306
- try {
1307
- const callResults = await client.multicall({
1308
- contracts: balanceDefs.map(({ address }) => ({
1309
- address: multicall3Address,
1310
- abi: abiMulticall,
1311
- functionName: "getEthBalance",
1312
- args: [address]
1313
- }))
1314
- });
1315
- return callResults.reduce(
1316
- (acc, result, index) => {
1317
- if (result.status === "success") {
1318
- acc.success.push({
1319
- address: balanceDefs[index].address,
1320
- tokenId: balanceDefs[index].token.id,
1321
- value: result.result.toString(),
1322
- source: MODULE_TYPE2,
1323
- networkId: parseTokenId2(balanceDefs[index].token.id).networkId,
1324
- status: "live"
1325
- });
1326
- }
1327
- if (result.status === "failure") {
1328
- acc.errors.push({
1329
- tokenId: balanceDefs[index].token.id,
1330
- address: balanceDefs[index].address,
1331
- error: new BalanceFetchError(
1332
- `Failed to get balance for token ${balanceDefs[index].token.id} and address ${balanceDefs[index].address} on chain ${client.chain?.id}`,
1333
- balanceDefs[index].token.id,
1334
- balanceDefs[index].address,
1335
- result.error
1336
- )
1337
- });
1338
- }
1339
- return acc;
1340
- },
1341
- { success: [], errors: [] }
1342
- );
1343
- } catch (err) {
1344
- const errors = balanceDefs.map((balanceDef) => ({
1345
- tokenId: balanceDef.token.id,
1346
- address: balanceDef.address,
1347
- error: new BalanceFetchNetworkError(
1348
- `Failed to get balances for evm-erc20 tokens on chain ${client.chain?.id}`,
1349
- String(client.chain?.id),
1350
- err
1351
- )
1352
- }));
1353
- return { success: [], errors };
1354
- }
1313
+ const results = await client.multicall({
1314
+ allowFailure: false,
1315
+ contracts: balanceDefs.map(({ address }) => ({
1316
+ address: multicall3Address,
1317
+ abi: abiMulticall,
1318
+ functionName: "getEthBalance",
1319
+ args: [address]
1320
+ }))
1321
+ });
1322
+ return {
1323
+ success: results.map(
1324
+ (value, index) => ({
1325
+ address: balanceDefs[index].address,
1326
+ tokenId: balanceDefs[index].token.id,
1327
+ value: String(value),
1328
+ source: MODULE_TYPE2,
1329
+ networkId: parseTokenId2(balanceDefs[index].token.id).networkId,
1330
+ status: "live"
1331
+ })
1332
+ ),
1333
+ errors: []
1334
+ };
1355
1335
  };
1356
1336
 
1357
1337
  // src/modules/evm-native/fetchTokens.ts
@@ -1472,7 +1452,6 @@ var PLATFORM3 = EvmUniswapV2TokenSchema.shape.platform.value;
1472
1452
  // src/modules/evm-uniswapv2/fetchBalances.ts
1473
1453
  import { parseTokenId as parseTokenId3 } from "@talismn/chaindata-provider";
1474
1454
  import { isEthereumAddress as isEthereumAddress5 } from "@talismn/crypto";
1475
- import BigNumber from "bignumber.js";
1476
1455
  import { keyBy, uniq } from "lodash-es";
1477
1456
  import { getContract as getContract2 } from "viem";
1478
1457
  var fetchBalances3 = async ({
@@ -1564,7 +1543,7 @@ var fetchPoolBalances = async (client, balanceDefs) => {
1564
1543
  label,
1565
1544
  amount
1566
1545
  });
1567
- const ratio = BigNumber(String(balance)).div(totalSupply === 0n ? "1" : String(totalSupply));
1546
+ const ratio = configureBigNumber_default(String(balance)).div(totalSupply === 0n ? "1" : String(totalSupply));
1568
1547
  acc.success.push({
1569
1548
  address,
1570
1549
  tokenId: token.id,
@@ -1596,13 +1575,8 @@ import { assign as assign3, omit as omit2 } from "lodash-es";
1596
1575
  import z4 from "zod/v4";
1597
1576
 
1598
1577
  // src/modules/evm-uniswapv2/utils.ts
1599
- import {
1600
- ContractFunctionExecutionError as ContractFunctionExecutionError2,
1601
- erc20Abi as erc20Abi4,
1602
- erc20Abi_bytes32 as erc20Abi_bytes322,
1603
- getContract as getContract3,
1604
- hexToString as hexToString2
1605
- } from "viem";
1578
+ import { isErrorOfName as isErrorOfName2 } from "@talismn/util";
1579
+ import { erc20Abi as erc20Abi4, erc20Abi_bytes32 as erc20Abi_bytes322, getContract as getContract3, hexToString as hexToString2 } from "viem";
1606
1580
  var getErc20ContractData2 = async (client, contractAddress) => {
1607
1581
  try {
1608
1582
  const contract = getTypedContract2(client, erc20Abi4, contractAddress);
@@ -1612,7 +1586,7 @@ var getErc20ContractData2 = async (client, contractAddress) => {
1612
1586
  contract.read.name()
1613
1587
  ]);
1614
1588
  } catch (e) {
1615
- if (e instanceof ContractFunctionExecutionError2) {
1589
+ if (isErrorOfName2(e, "ContractFunctionExecutionError")) {
1616
1590
  const contract = getTypedContract2(client, erc20Abi_bytes322, contractAddress);
1617
1591
  var [bytesSymbol, decimals, nameSymbol] = await Promise.all([
1618
1592
  contract.read.symbol(),
@@ -1852,8 +1826,8 @@ var fetchBalances4 = async ({
1852
1826
  const results = await Promise.allSettled(
1853
1827
  balanceDefs.map(async ({ token, address }) => {
1854
1828
  try {
1855
- const publicKey2 = new PublicKey(address);
1856
- const lamports = await connection.getBalance(publicKey2);
1829
+ const publicKey3 = new PublicKey(address);
1830
+ const lamports = await connection.getBalance(publicKey3);
1857
1831
  return {
1858
1832
  address,
1859
1833
  tokenId: token.id,
@@ -2009,8 +1983,8 @@ var MODULE_TYPE5 = SolSplTokenSchema.shape.type.value;
2009
1983
  var PLATFORM5 = SolSplTokenSchema.shape.platform.value;
2010
1984
 
2011
1985
  // src/modules/sol-spl/fetchBalances.ts
2012
- import { PublicKey as PublicKey3 } from "@solana/web3.js";
2013
- import { solSplTokenId } from "@talismn/chaindata-provider";
1986
+ import { PublicKey as PublicKey4 } from "@solana/web3.js";
1987
+ import { SolSplTokenSchema as SolSplTokenSchema3, solSplTokenId } from "@talismn/chaindata-provider";
2014
1988
  import { isNotNil as isNotNil2 } from "@talismn/util";
2015
1989
  import { keyBy as keyBy2, uniq as uniq2 } from "lodash-es";
2016
1990
 
@@ -2054,9 +2028,9 @@ var buildNetworkStorageCoders = (chainId, miniMetadata, coders) => {
2054
2028
 
2055
2029
  // src/modules/shared/fetchRuntimeCallResult.ts
2056
2030
  import { parseMetadataRpc, toHex } from "@talismn/scale";
2057
- var fetchRuntimeCallResult = async (connector, networkId, metadataRpc, apiName, method, args) => {
2031
+ var fetchRuntimeCallResult = async (connector, networkId, metadataRpcOrBuilder, apiName, method, args) => {
2058
2032
  try {
2059
- const { builder } = parseMetadataRpc(metadataRpc);
2033
+ const builder = typeof metadataRpcOrBuilder === "string" ? parseMetadataRpc(metadataRpcOrBuilder).builder : metadataRpcOrBuilder;
2060
2034
  const call = builder.buildRuntimeCall(apiName, method);
2061
2035
  const hex = await connector.send(networkId, "state_call", [
2062
2036
  `${apiName}_${method}`,
@@ -2127,17 +2101,17 @@ var decodeRpcQueryPack = (queries, result) => {
2127
2101
  import { parseMetadataRpc as parseMetadataRpc2 } from "@talismn/scale";
2128
2102
  var hasStorageItem = (metadata, palletName, itemName) => {
2129
2103
  const pallet = metadata.pallets.find((p) => p.name === palletName);
2130
- if (!pallet || !pallet.storage) return false;
2104
+ if (!pallet?.storage) return false;
2131
2105
  return pallet.storage.items.some((item) => item.name === itemName);
2132
2106
  };
2133
2107
  var hasStorageItems = (metadata, palletName, itemNames) => {
2134
2108
  const pallet = metadata.pallets.find((p) => p.name === palletName);
2135
- if (!pallet || !pallet.storage) return false;
2109
+ if (!pallet?.storage) return false;
2136
2110
  return itemNames.every((itemName) => pallet.storage?.items.some((item) => item.name === itemName));
2137
2111
  };
2138
2112
  var hasRuntimeApi = (metadata, apiName, method) => {
2139
2113
  const api = metadata.apis.find((api2) => api2.name === apiName);
2140
- if (!api || !api.methods) return false;
2114
+ if (!api?.methods) return false;
2141
2115
  return api.methods.some((m) => m.name === method);
2142
2116
  };
2143
2117
  var getConstantValue = (metadataRpc, pallet, constant) => {
@@ -2172,8 +2146,77 @@ var getDetectedTokensIds$ = (address) => tokenIdsByAddress.pipe(
2172
2146
  distinctUntilChanged5(isEqual5)
2173
2147
  );
2174
2148
 
2149
+ // src/modules/sol-spl/onChainTokenMetadata.ts
2150
+ import { deserializeMetadata } from "@metaplex-foundation/mpl-token-metadata";
2151
+ import { publicKey, sol } from "@metaplex-foundation/umi";
2152
+ import { MintLayout } from "@solana/spl-token";
2153
+ import { PublicKey as PublicKey3 } from "@solana/web3.js";
2154
+ import { parseSolSplTokenId, SolSplTokenSchema as SolSplTokenSchema2 } from "@talismn/chaindata-provider";
2155
+ import z7 from "zod/v4";
2156
+ var TokenCacheSchema3 = z7.discriminatedUnion("isValid", [
2157
+ z7.strictObject({
2158
+ id: SolSplTokenSchema2.shape.id,
2159
+ isValid: z7.literal(true),
2160
+ ...SolSplTokenSchema2.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
2161
+ }),
2162
+ z7.strictObject({
2163
+ id: SolSplTokenSchema2.shape.id,
2164
+ isValid: z7.literal(false)
2165
+ })
2166
+ ]);
2167
+ var METAPLEX_PROGRAM_ID = new PublicKey3("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
2168
+ var ERROR_NO_MINT = "No mint info available";
2169
+ var ERROR_NO_METADATA = "No metadata account found";
2170
+ var ERROR_INVALID_DATA = "Invalid on-chain data";
2171
+ var fetchOnChainTokenData = async (connector, tokenId) => {
2172
+ try {
2173
+ const { networkId, mintAddress } = parseSolSplTokenId(tokenId);
2174
+ const connection = await connector.getConnection(networkId);
2175
+ if (!connection) {
2176
+ log_default.warn(`No connection found for network ${networkId}`);
2177
+ return null;
2178
+ }
2179
+ const mintPubKey = new PublicKey3(mintAddress);
2180
+ const mintInfo = await connection.getAccountInfo(mintPubKey);
2181
+ if (!mintInfo?.data) throw new Error(ERROR_NO_MINT);
2182
+ const mint = MintLayout.decode(mintInfo.data);
2183
+ const [metadataPDA] = PublicKey3.findProgramAddressSync(
2184
+ [Buffer.from("metadata"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],
2185
+ METAPLEX_PROGRAM_ID
2186
+ );
2187
+ const metadataAccount = await connection.getAccountInfo(new PublicKey3(metadataPDA));
2188
+ if (!metadataAccount) throw new Error(ERROR_NO_METADATA);
2189
+ const metadata = deserializeMetadata({
2190
+ publicKey: publicKey(metadataPDA),
2191
+ executable: metadataAccount.executable,
2192
+ owner: publicKey(metadataAccount.owner),
2193
+ lamports: sol(metadataAccount.lamports),
2194
+ data: metadataAccount.data
2195
+ });
2196
+ const parsed = TokenCacheSchema3.safeParse({
2197
+ id: tokenId,
2198
+ symbol: metadata.symbol.trim(),
2199
+ name: metadata.name.trim(),
2200
+ decimals: mint.decimals,
2201
+ isValid: true
2202
+ });
2203
+ if (!parsed.success) throw new Error(ERROR_INVALID_DATA);
2204
+ return parsed.data;
2205
+ } catch (err) {
2206
+ const msg = err.message;
2207
+ if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))
2208
+ return TokenCacheSchema3.parse({
2209
+ id: tokenId,
2210
+ isValid: false
2211
+ });
2212
+ log_default.warn("Failed to fetch sol-spl token data for %s", tokenId, { err });
2213
+ }
2214
+ return null;
2215
+ };
2216
+
2175
2217
  // src/modules/sol-spl/fetchBalances.ts
2176
2218
  var SPL_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
2219
+ var dynamicTokenMetadataCache = /* @__PURE__ */ new Map();
2177
2220
  var fetchBalances5 = async ({
2178
2221
  networkId,
2179
2222
  tokensWithAddresses,
@@ -2183,18 +2226,22 @@ var fetchBalances5 = async ({
2183
2226
  const connection = await connector.getConnection(networkId);
2184
2227
  if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
2185
2228
  const accountAddresses = uniq2(tokensWithAddresses.flatMap(([, addresses]) => addresses));
2229
+ const knownTokenIds = new Set(tokensWithAddresses.map(([token]) => token.id));
2230
+ const unknownMints = /* @__PURE__ */ new Set();
2186
2231
  const balancesPerAddress = await Promise.all(
2187
2232
  accountAddresses.map(async (address) => {
2188
- const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey3(address), {
2189
- programId: new PublicKey3(SPL_PROGRAM_ID)
2233
+ const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey4(address), {
2234
+ programId: new PublicKey4(SPL_PROGRAM_ID)
2190
2235
  // SPL Token Program ID
2191
2236
  });
2192
2237
  const balances = tokenAccounts.value.map((d) => {
2193
2238
  try {
2194
2239
  const mintAddress = d.account.data.parsed.info.mint;
2195
2240
  const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
2241
+ const tokenId = solSplTokenId(networkId, mintAddress);
2242
+ if (!knownTokenIds.has(tokenId) && value !== "0") unknownMints.add(mintAddress);
2196
2243
  return {
2197
- tokenId: solSplTokenId(networkId, mintAddress),
2244
+ tokenId,
2198
2245
  networkId,
2199
2246
  address,
2200
2247
  source: MODULE_TYPE5,
@@ -2217,6 +2264,42 @@ var fetchBalances5 = async ({
2217
2264
  return [address, balances];
2218
2265
  })
2219
2266
  );
2267
+ const dynamicTokens = [];
2268
+ if (unknownMints.size) {
2269
+ await Promise.all(
2270
+ Array.from(unknownMints).map(async (mintAddress) => {
2271
+ const tokenId = solSplTokenId(networkId, mintAddress);
2272
+ let cached = dynamicTokenMetadataCache.get(tokenId);
2273
+ if (!cached) {
2274
+ const fetched = await fetchOnChainTokenData(connector, tokenId);
2275
+ if (fetched) {
2276
+ dynamicTokenMetadataCache.set(tokenId, fetched);
2277
+ cached = fetched;
2278
+ }
2279
+ }
2280
+ if (!cached?.isValid) return;
2281
+ const token = {
2282
+ id: tokenId,
2283
+ type: MODULE_TYPE5,
2284
+ platform: PLATFORM5,
2285
+ networkId,
2286
+ mintAddress,
2287
+ isDefault: true,
2288
+ symbol: cached.symbol,
2289
+ decimals: cached.decimals,
2290
+ ...cached.name !== void 0 ? { name: cached.name } : {},
2291
+ ...cached.logo !== void 0 ? { logo: cached.logo } : {}
2292
+ };
2293
+ const parsed = SolSplTokenSchema3.safeParse(token);
2294
+ if (!parsed.success) {
2295
+ log_default.warn("Ignoring dynamic sol-spl token with invalid schema", { token });
2296
+ return;
2297
+ }
2298
+ dynamicTokens.push(parsed.data);
2299
+ })
2300
+ );
2301
+ }
2302
+ const registeredDynamicIds = new Set(dynamicTokens.map((t) => t.id));
2220
2303
  const allBalancesByKey = keyBy2(
2221
2304
  balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),
2222
2305
  (b) => getBalanceKey(b.tokenId, b.address)
@@ -2233,34 +2316,16 @@ var fetchBalances5 = async ({
2233
2316
  value: "0"
2234
2317
  };
2235
2318
  });
2236
- return { success, errors: [] };
2319
+ for (const balance of balancesPerAddress.flatMap(([, addressBalances]) => addressBalances)) {
2320
+ if (registeredDynamicIds.has(balance.tokenId)) success.push(balance);
2321
+ }
2322
+ return { success, errors: [], dynamicTokens };
2237
2323
  };
2238
2324
  var getBalanceKey = (tokenId, address) => `${tokenId}:${address}`;
2239
2325
 
2240
2326
  // src/modules/sol-spl/fetchTokens.ts
2241
- import { deserializeMetadata } from "@metaplex-foundation/mpl-token-metadata";
2242
- import { publicKey, sol } from "@metaplex-foundation/umi";
2243
- import { MintLayout } from "@solana/spl-token";
2244
- import { PublicKey as PublicKey4 } from "@solana/web3.js";
2245
- import {
2246
- parseSolSplTokenId,
2247
- SolSplTokenSchema as SolSplTokenSchema2,
2248
- solSplTokenId as solSplTokenId2
2249
- } from "@talismn/chaindata-provider";
2327
+ import { SolSplTokenSchema as SolSplTokenSchema4, solSplTokenId as solSplTokenId2 } from "@talismn/chaindata-provider";
2250
2328
  import { assign as assign5, omit as omit3 } from "lodash-es";
2251
- import z7 from "zod/v4";
2252
- var TokenCacheSchema3 = z7.discriminatedUnion("isValid", [
2253
- z7.strictObject({
2254
- id: SolSplTokenSchema2.shape.id,
2255
- isValid: z7.literal(true),
2256
- ...SolSplTokenSchema2.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
2257
- }),
2258
- z7.strictObject({
2259
- id: SolSplTokenSchema2.shape.id,
2260
- isValid: z7.literal(false)
2261
- })
2262
- ]);
2263
- var METAPLEX_PROGRAM_ID = new PublicKey4("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
2264
2329
  var fetchTokens5 = async ({
2265
2330
  networkId,
2266
2331
  tokens,
@@ -2288,7 +2353,7 @@ var fetchTokens5 = async ({
2288
2353
  cached?.isValid ? omit3(cached, ["isValid"]) : {},
2289
2354
  tokenConfig
2290
2355
  );
2291
- const parsed = SolSplTokenSchema2.safeParse(token);
2356
+ const parsed = SolSplTokenSchema4.safeParse(token);
2292
2357
  if (!parsed.success) {
2293
2358
  log_default.warn("Ignoring token with invalid SolSplTokenSchema", {
2294
2359
  token
@@ -2299,54 +2364,6 @@ var fetchTokens5 = async ({
2299
2364
  }
2300
2365
  return result;
2301
2366
  };
2302
- var ERROR_NO_MINT = "No mint info available";
2303
- var ERROR_NO_METADATA = "No metadata account found";
2304
- var ERROR_INVALID_DATA = "Invalid on-chain data";
2305
- var fetchOnChainTokenData = async (connector, tokenId) => {
2306
- try {
2307
- const { networkId, mintAddress } = parseSolSplTokenId(tokenId);
2308
- const connection = await connector.getConnection(networkId);
2309
- if (!connection) {
2310
- log_default.warn(`No connection found for network ${networkId}`);
2311
- return null;
2312
- }
2313
- const mintPubKey = new PublicKey4(mintAddress);
2314
- const mintInfo = await connection.getAccountInfo(mintPubKey);
2315
- if (!mintInfo?.data) throw new Error(ERROR_NO_MINT);
2316
- const mint = MintLayout.decode(mintInfo.data);
2317
- const [metadataPDA] = PublicKey4.findProgramAddressSync(
2318
- [Buffer.from("metadata"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],
2319
- METAPLEX_PROGRAM_ID
2320
- );
2321
- const metadataAccount = await connection.getAccountInfo(new PublicKey4(metadataPDA));
2322
- if (!metadataAccount) throw new Error(ERROR_NO_METADATA);
2323
- const metadata = deserializeMetadata({
2324
- publicKey: publicKey(metadataPDA),
2325
- executable: metadataAccount.executable,
2326
- owner: publicKey(metadataAccount.owner),
2327
- lamports: sol(metadataAccount.lamports),
2328
- data: metadataAccount.data
2329
- });
2330
- const parsed = TokenCacheSchema3.safeParse({
2331
- id: tokenId,
2332
- symbol: metadata.symbol.trim(),
2333
- name: metadata.name.trim(),
2334
- decimals: mint.decimals,
2335
- isValid: true
2336
- });
2337
- if (!parsed.success) throw new Error(ERROR_INVALID_DATA);
2338
- return parsed.data;
2339
- } catch (err) {
2340
- const msg = err.message;
2341
- if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))
2342
- return TokenCacheSchema3.parse({
2343
- id: tokenId,
2344
- isValid: false
2345
- });
2346
- log_default.warn("Failed to fetch sol-spl token data for %s", tokenId, { err });
2347
- }
2348
- return null;
2349
- };
2350
2367
 
2351
2368
  // src/modules/sol-spl/getMiniMetadata.ts
2352
2369
  var getMiniMetadata5 = () => {
@@ -2457,90 +2474,565 @@ var SolSplBalanceModule = {
2457
2474
  };
2458
2475
 
2459
2476
  // src/modules/sol-spl/types.ts
2460
- import { SolSplTokenSchema as SolSplTokenSchema3 } from "@talismn/chaindata-provider";
2477
+ import { SolSplTokenSchema as SolSplTokenSchema5 } from "@talismn/chaindata-provider";
2461
2478
  import z8 from "zod/v4";
2462
2479
  var SolSplTokenConfigSchema = z8.strictObject({
2463
- mintAddress: SolSplTokenSchema3.shape.mintAddress,
2480
+ mintAddress: SolSplTokenSchema5.shape.mintAddress,
2464
2481
  ...TokenConfigBaseSchema.shape
2465
2482
  });
2466
2483
 
2467
- // src/modules/substrate-assets/config.ts
2468
- import { SubAssetsTokenSchema } from "@talismn/chaindata-provider";
2469
- var MODULE_TYPE6 = SubAssetsTokenSchema.shape.type.value;
2470
- var PLATFORM6 = SubAssetsTokenSchema.shape.platform.value;
2484
+ // src/modules/sol-token2022/config.ts
2485
+ import { SolToken2022TokenSchema } from "@talismn/chaindata-provider";
2486
+ var MODULE_TYPE6 = SolToken2022TokenSchema.shape.type.value;
2487
+ var PLATFORM6 = SolToken2022TokenSchema.shape.platform.value;
2471
2488
 
2472
- // src/modules/substrate-assets/buildQueries.ts
2473
- import { decodeScale } from "@talismn/scale";
2489
+ // src/modules/sol-token2022/fetchBalances.ts
2490
+ import { PublicKey as PublicKey7 } from "@solana/web3.js";
2491
+ import {
2492
+ SolToken2022TokenSchema as SolToken2022TokenSchema3,
2493
+ solToken2022TokenId
2494
+ } from "@talismn/chaindata-provider";
2474
2495
  import { isNotNil as isNotNil3 } from "@talismn/util";
2475
- var buildQueries = (networkId, balanceDefs, miniMetadata) => {
2476
- const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
2477
- storage: ["Assets", "Account"]
2478
- });
2479
- return balanceDefs.map(({ token, address }) => {
2480
- const scaleCoder = networkStorageCoders?.storage;
2481
- const stateKey = tryEncode(scaleCoder, Number(token.assetId), address) ?? // Asset Hub
2482
- tryEncode(scaleCoder, BigInt(token.assetId), address);
2483
- if (!stateKey) {
2484
- log_default.warn(
2485
- `Invalid assetId / address in ${networkId} storage query ${token.assetId} / ${address}`
2486
- );
2496
+ import { keyBy as keyBy3, uniq as uniq3 } from "lodash-es";
2497
+
2498
+ // src/modules/sol-token2022/onChainTokenMetadata.ts
2499
+ import { deserializeMetadata as deserializeMetadata2 } from "@metaplex-foundation/mpl-token-metadata";
2500
+ import { publicKey as publicKey2, sol as sol2 } from "@metaplex-foundation/umi";
2501
+ import { MintLayout as MintLayout2 } from "@solana/spl-token";
2502
+ import { PublicKey as PublicKey6 } from "@solana/web3.js";
2503
+ import { parseSolToken2022TokenId, SolToken2022TokenSchema as SolToken2022TokenSchema2 } from "@talismn/chaindata-provider";
2504
+ import z9 from "zod/v4";
2505
+ var TokenCacheSchema4 = z9.discriminatedUnion("isValid", [
2506
+ z9.strictObject({
2507
+ id: SolToken2022TokenSchema2.shape.id,
2508
+ isValid: z9.literal(true),
2509
+ ...SolToken2022TokenSchema2.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
2510
+ }),
2511
+ z9.strictObject({
2512
+ id: SolToken2022TokenSchema2.shape.id,
2513
+ isValid: z9.literal(false)
2514
+ })
2515
+ ]);
2516
+ var METAPLEX_PROGRAM_ID2 = new PublicKey6("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
2517
+ var ERROR_NO_MINT2 = "No mint info available";
2518
+ var ERROR_NO_METADATA2 = "No metadata account found";
2519
+ var ERROR_INVALID_DATA2 = "Invalid on-chain data";
2520
+ var fetchOnChainTokenData2 = async (connector, tokenId) => {
2521
+ try {
2522
+ const { networkId, mintAddress } = parseSolToken2022TokenId(tokenId);
2523
+ const connection = await connector.getConnection(networkId);
2524
+ if (!connection) {
2525
+ log_default.warn(`No connection found for network ${networkId}`);
2487
2526
  return null;
2488
2527
  }
2489
- const decodeResult = (changes) => {
2490
- const decoded = decodeScale(
2491
- scaleCoder,
2492
- changes[0],
2493
- `Failed to decode substrate-assets balance on chain ${networkId}`
2494
- ) ?? {
2495
- balance: 0n,
2496
- is_frozen: false,
2497
- reason: { type: "Sufficient" },
2498
- status: { type: "Liquid" },
2499
- extra: void 0
2500
- };
2501
- const isFrozen = decoded?.status?.type === "Frozen";
2502
- const amount = (decoded?.balance ?? 0n).toString();
2503
- const free = amount;
2504
- const frozen = token.isFrozen || isFrozen ? amount : "0";
2505
- const balanceValues = [
2506
- { type: "free", label: "free", amount: free.toString() },
2507
- { type: "locked", label: "frozen", amount: frozen.toString() }
2508
- ];
2509
- const balance = {
2510
- source: "substrate-assets",
2511
- status: "live",
2512
- address,
2513
- networkId,
2514
- tokenId: token.id,
2515
- values: balanceValues
2516
- };
2517
- return balance;
2518
- };
2519
- return {
2520
- stateKeys: [stateKey],
2521
- decodeResult
2522
- };
2523
- }).filter(isNotNil3);
2524
- };
2525
- var tryEncode = (scaleCoder, ...args) => {
2526
- try {
2527
- return scaleCoder?.keys?.enc?.(...args);
2528
- } catch {
2529
- return null;
2530
- }
2531
- };
2532
-
2533
- // src/modules/substrate-assets/fetchBalances.ts
2534
- var fetchBalances6 = async ({
2535
- networkId,
2536
- tokensWithAddresses,
2537
- connector,
2538
- miniMetadata
2539
- }) => {
2540
- if (!tokensWithAddresses.length) return { success: [], errors: [] };
2541
- const balanceDefs = getBalanceDefs(tokensWithAddresses);
2528
+ const mintPubKey = new PublicKey6(mintAddress);
2529
+ const mintInfo = await connection.getAccountInfo(mintPubKey);
2530
+ if (!mintInfo?.data) throw new Error(ERROR_NO_MINT2);
2531
+ const mint = MintLayout2.decode(mintInfo.data);
2532
+ const token2022Metadata = tryParseToken2022Metadata(mintInfo.data);
2533
+ if (token2022Metadata) {
2534
+ const parsed2 = TokenCacheSchema4.safeParse({
2535
+ id: tokenId,
2536
+ symbol: token2022Metadata.symbol.trim(),
2537
+ name: token2022Metadata.name.trim(),
2538
+ decimals: mint.decimals,
2539
+ isValid: true
2540
+ });
2541
+ if (parsed2.success) return parsed2.data;
2542
+ }
2543
+ const [metadataPDA] = PublicKey6.findProgramAddressSync(
2544
+ [Buffer.from("metadata"), METAPLEX_PROGRAM_ID2.toBuffer(), mintPubKey.toBuffer()],
2545
+ METAPLEX_PROGRAM_ID2
2546
+ );
2547
+ const metadataAccount = await connection.getAccountInfo(new PublicKey6(metadataPDA));
2548
+ if (!metadataAccount) throw new Error(ERROR_NO_METADATA2);
2549
+ const metadata = deserializeMetadata2({
2550
+ publicKey: publicKey2(metadataPDA),
2551
+ executable: metadataAccount.executable,
2552
+ owner: publicKey2(metadataAccount.owner),
2553
+ lamports: sol2(metadataAccount.lamports),
2554
+ data: metadataAccount.data
2555
+ });
2556
+ const parsed = TokenCacheSchema4.safeParse({
2557
+ id: tokenId,
2558
+ symbol: metadata.symbol.trim(),
2559
+ name: metadata.name.trim(),
2560
+ decimals: mint.decimals,
2561
+ isValid: true
2562
+ });
2563
+ if (!parsed.success) throw new Error(ERROR_INVALID_DATA2);
2564
+ return parsed.data;
2565
+ } catch (err) {
2566
+ const msg = err.message;
2567
+ if ([ERROR_NO_MINT2, ERROR_NO_METADATA2, ERROR_INVALID_DATA2].includes(msg))
2568
+ return TokenCacheSchema4.parse({
2569
+ id: tokenId,
2570
+ isValid: false
2571
+ });
2572
+ log_default.warn("Failed to fetch sol-token2022 token data for %s", tokenId, { err });
2573
+ }
2574
+ return null;
2575
+ };
2576
+ var tryParseToken2022Metadata = (data) => {
2577
+ try {
2578
+ const TLV_START = 166;
2579
+ if (data.length <= TLV_START) return null;
2580
+ let offset = TLV_START;
2581
+ while (offset + 4 <= data.length) {
2582
+ const extType = data.readUInt16LE(offset);
2583
+ const extLen = data.readUInt16LE(offset + 2);
2584
+ const extDataStart = offset + 4;
2585
+ if (extType === 19 && extDataStart + extLen <= data.length) {
2586
+ let pos = extDataStart;
2587
+ pos += 64;
2588
+ const readLenPrefixed = () => {
2589
+ if (pos + 4 > data.length) throw new Error("out of bounds");
2590
+ const len = data.readUInt32LE(pos);
2591
+ pos += 4;
2592
+ if (pos + len > data.length) throw new Error("out of bounds");
2593
+ const str = data.subarray(pos, pos + len).toString("utf8");
2594
+ pos += len;
2595
+ return str;
2596
+ };
2597
+ const name = readLenPrefixed();
2598
+ const symbol = readLenPrefixed();
2599
+ const uri = readLenPrefixed();
2600
+ if (name && symbol) return { name, symbol, uri };
2601
+ }
2602
+ offset = extDataStart + extLen;
2603
+ }
2604
+ } catch {
2605
+ }
2606
+ return null;
2607
+ };
2608
+
2609
+ // src/modules/sol-token2022/fetchBalances.ts
2610
+ var TOKEN_2022_PROGRAM_ID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
2611
+ var dynamicTokenMetadataCache2 = /* @__PURE__ */ new Map();
2612
+ var fetchBalances6 = async ({
2613
+ networkId,
2614
+ tokensWithAddresses,
2615
+ connector
2616
+ }) => {
2617
+ if (!tokensWithAddresses.length) return { success: [], errors: [] };
2618
+ const connection = await connector.getConnection(networkId);
2619
+ if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
2620
+ const accountAddresses = uniq3(tokensWithAddresses.flatMap(([, addresses]) => addresses));
2621
+ const knownTokenIds = new Set(tokensWithAddresses.map(([token]) => token.id));
2622
+ const unknownMints = /* @__PURE__ */ new Set();
2623
+ const balancesPerAddress = await Promise.all(
2624
+ accountAddresses.map(async (address) => {
2625
+ const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey7(address), {
2626
+ programId: new PublicKey7(TOKEN_2022_PROGRAM_ID)
2627
+ });
2628
+ const balances = tokenAccounts.value.map((d) => {
2629
+ try {
2630
+ const mintAddress = d.account.data.parsed.info.mint;
2631
+ const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
2632
+ const tokenId = solToken2022TokenId(networkId, mintAddress);
2633
+ if (!knownTokenIds.has(tokenId) && value !== "0") unknownMints.add(mintAddress);
2634
+ return {
2635
+ tokenId,
2636
+ networkId,
2637
+ address,
2638
+ source: MODULE_TYPE6,
2639
+ status: "live",
2640
+ value
2641
+ };
2642
+ } catch {
2643
+ log_default.warn("Failed to parse token amount", {
2644
+ address,
2645
+ d
2646
+ });
2647
+ return null;
2648
+ }
2649
+ }).filter(isNotNil3);
2650
+ setDetectedTokenIds(
2651
+ address,
2652
+ MODULE_TYPE6,
2653
+ balances.map((b) => b.tokenId)
2654
+ );
2655
+ return [address, balances];
2656
+ })
2657
+ );
2658
+ const dynamicTokens = [];
2659
+ if (unknownMints.size) {
2660
+ await Promise.all(
2661
+ Array.from(unknownMints).map(async (mintAddress) => {
2662
+ const tokenId = solToken2022TokenId(networkId, mintAddress);
2663
+ let cached = dynamicTokenMetadataCache2.get(tokenId);
2664
+ if (!cached) {
2665
+ const fetched = await fetchOnChainTokenData2(connector, tokenId);
2666
+ if (fetched) {
2667
+ dynamicTokenMetadataCache2.set(tokenId, fetched);
2668
+ cached = fetched;
2669
+ }
2670
+ }
2671
+ if (!cached?.isValid) return;
2672
+ const token = {
2673
+ id: tokenId,
2674
+ type: MODULE_TYPE6,
2675
+ platform: PLATFORM6,
2676
+ networkId,
2677
+ mintAddress,
2678
+ isDefault: true,
2679
+ symbol: cached.symbol,
2680
+ decimals: cached.decimals,
2681
+ ...cached.name !== void 0 ? { name: cached.name } : {},
2682
+ ...cached.logo !== void 0 ? { logo: cached.logo } : {}
2683
+ };
2684
+ const parsed = SolToken2022TokenSchema3.safeParse(token);
2685
+ if (!parsed.success) {
2686
+ log_default.warn("Ignoring dynamic sol-token2022 token with invalid schema", { token });
2687
+ return;
2688
+ }
2689
+ dynamicTokens.push(parsed.data);
2690
+ })
2691
+ );
2692
+ }
2693
+ const registeredDynamicIds = new Set(dynamicTokens.map((t) => t.id));
2694
+ const allBalancesByKey = keyBy3(
2695
+ balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),
2696
+ (b) => getBalanceKey2(b.tokenId, b.address)
2697
+ );
2698
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
2699
+ const success = balanceDefs.map((bd) => {
2700
+ const found = allBalancesByKey[getBalanceKey2(bd.token.id, bd.address)];
2701
+ return found ?? {
2702
+ tokenId: bd.token.id,
2703
+ networkId: bd.token.networkId,
2704
+ address: bd.address,
2705
+ source: MODULE_TYPE6,
2706
+ status: "live",
2707
+ value: "0"
2708
+ };
2709
+ });
2710
+ for (const balance of balancesPerAddress.flatMap(([, addressBalances]) => addressBalances)) {
2711
+ if (registeredDynamicIds.has(balance.tokenId)) success.push(balance);
2712
+ }
2713
+ return { success, errors: [], dynamicTokens };
2714
+ };
2715
+ var getBalanceKey2 = (tokenId, address) => `${tokenId}:${address}`;
2716
+
2717
+ // src/modules/sol-token2022/fetchTokens.ts
2718
+ import {
2719
+ SolToken2022TokenSchema as SolToken2022TokenSchema4,
2720
+ solToken2022TokenId as solToken2022TokenId2
2721
+ } from "@talismn/chaindata-provider";
2722
+ import { assign as assign6, omit as omit4 } from "lodash-es";
2723
+ var fetchTokens6 = async ({
2724
+ networkId,
2725
+ tokens,
2726
+ connector,
2727
+ cache
2728
+ }) => {
2729
+ const result = [];
2730
+ for (const tokenConfig of tokens) {
2731
+ const tokenId = solToken2022TokenId2(networkId, tokenConfig.mintAddress);
2732
+ let cached = cache[tokenId] && TokenCacheSchema4.safeParse(cache[tokenId]).data;
2733
+ if (!cached) {
2734
+ const tokenInfo = await fetchOnChainTokenData2(connector, tokenId);
2735
+ if (tokenInfo) cache[tokenId] = tokenInfo;
2736
+ }
2737
+ cached = cache[tokenId] && TokenCacheSchema4.safeParse(cache[tokenId]).data;
2738
+ if (cached?.isValid === false) continue;
2739
+ const base = {
2740
+ id: tokenId,
2741
+ type: MODULE_TYPE6,
2742
+ platform: PLATFORM6,
2743
+ networkId
2744
+ };
2745
+ const token = assign6(
2746
+ base,
2747
+ cached?.isValid ? omit4(cached, ["isValid"]) : {},
2748
+ tokenConfig
2749
+ );
2750
+ const parsed = SolToken2022TokenSchema4.safeParse(token);
2751
+ if (!parsed.success) {
2752
+ log_default.warn("Ignoring token with invalid SolToken2022TokenSchema", {
2753
+ token
2754
+ });
2755
+ continue;
2756
+ }
2757
+ result.push(parsed.data);
2758
+ }
2759
+ return result;
2760
+ };
2761
+
2762
+ // src/modules/sol-token2022/getMiniMetadata.ts
2763
+ var getMiniMetadata6 = () => {
2764
+ throw new Error("MiniMetadata is not supported for solana tokens");
2765
+ };
2766
+
2767
+ // src/modules/sol-token2022/getTransferCallData.ts
2768
+ import {
2769
+ calculateEpochFee,
2770
+ createAssociatedTokenAccountInstruction as createAssociatedTokenAccountInstruction2,
2771
+ createTransferCheckedInstruction,
2772
+ createTransferCheckedWithFeeAndTransferHookInstruction,
2773
+ createTransferCheckedWithFeeInstruction,
2774
+ createTransferCheckedWithTransferHookInstruction,
2775
+ getAccount as getAccount2,
2776
+ getAssociatedTokenAddress as getAssociatedTokenAddress2,
2777
+ getMint,
2778
+ getNonTransferable,
2779
+ getTransferFeeConfig,
2780
+ getTransferHook,
2781
+ TOKEN_2022_PROGRAM_ID as TOKEN_2022_PROGRAM_ID2
2782
+ } from "@solana/spl-token";
2783
+ import { PublicKey as PublicKey8 } from "@solana/web3.js";
2784
+ import { isTokenOfType as isTokenOfType6 } from "@talismn/chaindata-provider";
2785
+ var getTransferCallData6 = async ({ from: from2, to, value, token, connector }) => {
2786
+ if (!isTokenOfType6(token, MODULE_TYPE6))
2787
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE6}.`);
2788
+ const connection = await connector.getConnection(token.networkId);
2789
+ const mintPubkey = new PublicKey8(token.mintAddress);
2790
+ const fromWallet = new PublicKey8(from2);
2791
+ const toWallet = new PublicKey8(to);
2792
+ const mintAccount = await getMint(connection, mintPubkey, void 0, TOKEN_2022_PROGRAM_ID2);
2793
+ const nonTransferable = getNonTransferable(mintAccount);
2794
+ if (nonTransferable) throw new Error("This token is non-transferable.");
2795
+ const transferFeeConfig = getTransferFeeConfig(mintAccount);
2796
+ const transferHook = getTransferHook(mintAccount);
2797
+ const instructions = [];
2798
+ const fromTokenAccount = await getAssociatedTokenAddress2(
2799
+ mintPubkey,
2800
+ fromWallet,
2801
+ false,
2802
+ TOKEN_2022_PROGRAM_ID2
2803
+ );
2804
+ const toTokenAccount = await getAssociatedTokenAddress2(
2805
+ mintPubkey,
2806
+ toWallet,
2807
+ false,
2808
+ TOKEN_2022_PROGRAM_ID2
2809
+ );
2810
+ if (!await tokenAccountExists2(connection, toTokenAccount)) {
2811
+ instructions.push(
2812
+ createAssociatedTokenAccountInstruction2(
2813
+ fromWallet,
2814
+ toTokenAccount,
2815
+ toWallet,
2816
+ mintPubkey,
2817
+ TOKEN_2022_PROGRAM_ID2
2818
+ )
2819
+ );
2820
+ }
2821
+ const amount = BigInt(value);
2822
+ const transferFee = transferFeeConfig ? await calculateCurrentEpochTransferFee(connection, transferFeeConfig, amount) : 0n;
2823
+ if (transferFeeConfig && transferHook) {
2824
+ instructions.push(
2825
+ await createTransferCheckedWithFeeAndTransferHookInstruction(
2826
+ connection,
2827
+ fromTokenAccount,
2828
+ mintPubkey,
2829
+ toTokenAccount,
2830
+ fromWallet,
2831
+ amount,
2832
+ token.decimals,
2833
+ transferFee,
2834
+ [],
2835
+ void 0,
2836
+ TOKEN_2022_PROGRAM_ID2
2837
+ )
2838
+ );
2839
+ } else if (transferFeeConfig) {
2840
+ instructions.push(
2841
+ createTransferCheckedWithFeeInstruction(
2842
+ fromTokenAccount,
2843
+ mintPubkey,
2844
+ toTokenAccount,
2845
+ fromWallet,
2846
+ amount,
2847
+ token.decimals,
2848
+ transferFee,
2849
+ [],
2850
+ TOKEN_2022_PROGRAM_ID2
2851
+ )
2852
+ );
2853
+ } else if (transferHook) {
2854
+ instructions.push(
2855
+ await createTransferCheckedWithTransferHookInstruction(
2856
+ connection,
2857
+ fromTokenAccount,
2858
+ mintPubkey,
2859
+ toTokenAccount,
2860
+ fromWallet,
2861
+ amount,
2862
+ token.decimals,
2863
+ [],
2864
+ void 0,
2865
+ TOKEN_2022_PROGRAM_ID2
2866
+ )
2867
+ );
2868
+ } else {
2869
+ instructions.push(
2870
+ createTransferCheckedInstruction(
2871
+ fromTokenAccount,
2872
+ mintPubkey,
2873
+ toTokenAccount,
2874
+ fromWallet,
2875
+ amount,
2876
+ token.decimals,
2877
+ [],
2878
+ TOKEN_2022_PROGRAM_ID2
2879
+ )
2880
+ );
2881
+ }
2882
+ return instructions;
2883
+ };
2884
+ var tokenAccountExists2 = async (connection, address) => {
2885
+ try {
2886
+ await getAccount2(connection, address, void 0, TOKEN_2022_PROGRAM_ID2);
2887
+ return true;
2888
+ } catch {
2889
+ return false;
2890
+ }
2891
+ };
2892
+ var calculateToken2022TransferFee = (transferFeeConfig, epoch, amount) => {
2893
+ return calculateEpochFee(transferFeeConfig, epoch, amount);
2894
+ };
2895
+ var calculateCurrentEpochTransferFee = async (connection, transferFeeConfig, amount) => {
2896
+ const { epoch } = await connection.getEpochInfo();
2897
+ return calculateToken2022TransferFee(transferFeeConfig, BigInt(epoch), amount);
2898
+ };
2899
+
2900
+ // src/modules/sol-token2022/subscribeBalances.ts
2901
+ import { isEqual as isEqual7 } from "lodash-es";
2902
+ import { distinctUntilChanged as distinctUntilChanged7, Observable as Observable7, of as of7 } from "rxjs";
2903
+ var SUBSCRIPTION_INTERVAL6 = 6e3;
2904
+ var subscribeBalances6 = ({
2905
+ networkId,
2906
+ tokensWithAddresses,
2907
+ connector
2908
+ }) => {
2909
+ if (!tokensWithAddresses.length) return of7({ success: [], errors: [] });
2910
+ return new Observable7((subscriber) => {
2911
+ const abortController = new AbortController();
2912
+ const poll = async () => {
2913
+ try {
2914
+ if (abortController.signal.aborted) return;
2915
+ const balances = await fetchBalances6({
2916
+ networkId,
2917
+ tokensWithAddresses,
2918
+ connector
2919
+ });
2920
+ if (abortController.signal.aborted) return;
2921
+ subscriber.next(balances);
2922
+ setTimeout(poll, SUBSCRIPTION_INTERVAL6);
2923
+ } catch (error) {
2924
+ log_default.error("Error", {
2925
+ module: MODULE_TYPE6,
2926
+ networkId,
2927
+ addressesByToken: tokensWithAddresses,
2928
+ error
2929
+ });
2930
+ subscriber.error(error);
2931
+ }
2932
+ };
2933
+ poll();
2934
+ return () => {
2935
+ abortController.abort();
2936
+ };
2937
+ }).pipe(distinctUntilChanged7(isEqual7));
2938
+ };
2939
+
2940
+ // src/modules/sol-token2022/module.ts
2941
+ var SolToken2022BalanceModule = {
2942
+ type: MODULE_TYPE6,
2943
+ platform: PLATFORM6,
2944
+ getMiniMetadata: getMiniMetadata6,
2945
+ fetchTokens: fetchTokens6,
2946
+ fetchBalances: fetchBalances6,
2947
+ subscribeBalances: subscribeBalances6,
2948
+ getTransferCallData: getTransferCallData6
2949
+ };
2950
+
2951
+ // src/modules/sol-token2022/types.ts
2952
+ import { SolToken2022TokenSchema as SolToken2022TokenSchema5 } from "@talismn/chaindata-provider";
2953
+ import z10 from "zod/v4";
2954
+ var SolToken2022TokenConfigSchema = z10.strictObject({
2955
+ mintAddress: SolToken2022TokenSchema5.shape.mintAddress,
2956
+ ...TokenConfigBaseSchema.shape
2957
+ });
2958
+
2959
+ // src/modules/substrate-assets/config.ts
2960
+ import { SubAssetsTokenSchema } from "@talismn/chaindata-provider";
2961
+ var MODULE_TYPE7 = SubAssetsTokenSchema.shape.type.value;
2962
+ var PLATFORM7 = SubAssetsTokenSchema.shape.platform.value;
2963
+
2964
+ // src/modules/substrate-assets/buildQueries.ts
2965
+ import { decodeScale } from "@talismn/scale";
2966
+ import { isNotNil as isNotNil4 } from "@talismn/util";
2967
+ var buildQueries = (networkId, balanceDefs, miniMetadata) => {
2968
+ const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
2969
+ storage: ["Assets", "Account"]
2970
+ });
2971
+ return balanceDefs.map(({ token, address }) => {
2972
+ const scaleCoder = networkStorageCoders?.storage;
2973
+ const stateKey = tryEncode(scaleCoder, Number(token.assetId), address) ?? // Asset Hub
2974
+ tryEncode(scaleCoder, BigInt(token.assetId), address);
2975
+ if (!stateKey) {
2976
+ log_default.warn(
2977
+ `Invalid assetId / address in ${networkId} storage query ${token.assetId} / ${address}`
2978
+ );
2979
+ return null;
2980
+ }
2981
+ const decodeResult = (changes) => {
2982
+ const decoded = decodeScale(
2983
+ scaleCoder,
2984
+ changes[0],
2985
+ `Failed to decode substrate-assets balance on chain ${networkId}`
2986
+ ) ?? {
2987
+ balance: 0n,
2988
+ is_frozen: false,
2989
+ reason: { type: "Sufficient" },
2990
+ status: { type: "Liquid" },
2991
+ extra: void 0
2992
+ };
2993
+ const isFrozen = decoded?.status?.type === "Frozen";
2994
+ const amount = (decoded?.balance ?? 0n).toString();
2995
+ const free = amount;
2996
+ const frozen = token.isFrozen || isFrozen ? amount : "0";
2997
+ const balanceValues = [
2998
+ { type: "free", label: "free", amount: free.toString() },
2999
+ { type: "locked", label: "frozen", amount: frozen.toString() }
3000
+ ];
3001
+ const balance = {
3002
+ source: "substrate-assets",
3003
+ status: "live",
3004
+ address,
3005
+ networkId,
3006
+ tokenId: token.id,
3007
+ values: balanceValues
3008
+ };
3009
+ return balance;
3010
+ };
3011
+ return {
3012
+ stateKeys: [stateKey],
3013
+ decodeResult
3014
+ };
3015
+ }).filter(isNotNil4);
3016
+ };
3017
+ var tryEncode = (scaleCoder, ...args) => {
3018
+ try {
3019
+ return scaleCoder?.keys?.enc?.(...args);
3020
+ } catch {
3021
+ return null;
3022
+ }
3023
+ };
3024
+
3025
+ // src/modules/substrate-assets/fetchBalances.ts
3026
+ var fetchBalances7 = async ({
3027
+ networkId,
3028
+ tokensWithAddresses,
3029
+ connector,
3030
+ miniMetadata
3031
+ }) => {
3032
+ if (!tokensWithAddresses.length) return { success: [], errors: [] };
3033
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
2542
3034
  if (!miniMetadata?.data) {
2543
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE6} balances on ${networkId}.`);
3035
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE7} balances on ${networkId}.`);
2544
3036
  return {
2545
3037
  success: [],
2546
3038
  errors: balanceDefs.map((def) => ({
@@ -2550,20 +3042,20 @@ var fetchBalances6 = async ({
2550
3042
  }))
2551
3043
  };
2552
3044
  }
2553
- if (miniMetadata.source !== MODULE_TYPE6) {
2554
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE6}.`);
3045
+ if (miniMetadata.source !== MODULE_TYPE7) {
3046
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE7}.`);
2555
3047
  return {
2556
3048
  success: [],
2557
3049
  errors: balanceDefs.map((def) => ({
2558
3050
  tokenId: def.token.id,
2559
3051
  address: def.address,
2560
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE6}`)
3052
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE7}`)
2561
3053
  }))
2562
3054
  };
2563
3055
  }
2564
3056
  if (miniMetadata.chainId !== networkId) {
2565
3057
  log_default.warn(
2566
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE6}. Expected chainId is ${networkId}`
3058
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE7}. Expected chainId is ${networkId}`
2567
3059
  );
2568
3060
  return {
2569
3061
  success: [],
@@ -2587,7 +3079,7 @@ var fetchBalances6 = async ({
2587
3079
  address: def.address,
2588
3080
  networkId,
2589
3081
  tokenId: def.token.id,
2590
- source: MODULE_TYPE6,
3082
+ source: MODULE_TYPE7,
2591
3083
  status: "live",
2592
3084
  values: [
2593
3085
  { type: "free", label: "free", amount: "0" },
@@ -2606,8 +3098,8 @@ import {
2606
3098
  subAssetTokenId
2607
3099
  } from "@talismn/chaindata-provider";
2608
3100
  import { getStorageKeyPrefix, parseMetadataRpc as parseMetadataRpc3 } from "@talismn/scale";
2609
- import { assign as assign6, keyBy as keyBy3, keys } from "lodash-es";
2610
- var fetchTokens6 = async ({
3101
+ import { assign as assign7, keyBy as keyBy4, keys } from "lodash-es";
3102
+ var fetchTokens7 = async ({
2611
3103
  networkId,
2612
3104
  tokens,
2613
3105
  connector,
@@ -2632,7 +3124,7 @@ var fetchTokens6 = async ({
2632
3124
  ]);
2633
3125
  const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
2634
3126
  const metadataStorageEntries = metadataStorageResults.length ? metadataStorageResults[0].changes : [];
2635
- const assetByAssetId = keyBy3(
3127
+ const assetByAssetId = keyBy4(
2636
3128
  assetStorageEntries.map(([key, value]) => {
2637
3129
  const [assetId] = assetCodec.keys.dec(key);
2638
3130
  const asset = assetCodec.value.dec(value);
@@ -2640,7 +3132,7 @@ var fetchTokens6 = async ({
2640
3132
  }),
2641
3133
  (a) => a.assetId
2642
3134
  );
2643
- const metadataByAssetId = keyBy3(
3135
+ const metadataByAssetId = keyBy4(
2644
3136
  metadataStorageEntries.map(([key, value]) => {
2645
3137
  const [assetId] = metadataCodec.keys.dec(key);
2646
3138
  const metadata = metadataCodec.value.dec(value);
@@ -2655,13 +3147,13 @@ var fetchTokens6 = async ({
2655
3147
  (a) => a.assetId
2656
3148
  );
2657
3149
  const allTokens = keys(assetByAssetId).map(
2658
- (assetId) => assign6({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? void 0)
3150
+ (assetId) => assign7({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? void 0)
2659
3151
  );
2660
- const configTokenByAssetId = keyBy3(tokens, (t) => t.assetId);
3152
+ const configTokenByAssetId = keyBy4(tokens, (t) => t.assetId);
2661
3153
  return allTokens.map(
2662
3154
  (asset) => ({
2663
3155
  id: subAssetTokenId(networkId, String(asset.assetId)),
2664
- type: MODULE_TYPE6,
3156
+ type: MODULE_TYPE7,
2665
3157
  platform: "polkadot",
2666
3158
  networkId,
2667
3159
  assetId: String(asset.assetId),
@@ -2678,7 +3170,7 @@ var fetchTokens6 = async ({
2678
3170
  return configToken || token.isSufficient;
2679
3171
  }).map((token) => {
2680
3172
  const configToken = configTokenByAssetId[token.assetId];
2681
- return configToken ? assign6({}, token, configToken) : token;
3173
+ return configToken ? assign7({}, token, configToken) : token;
2682
3174
  }).filter((t) => {
2683
3175
  const parsed = SubAssetsTokenSchema2.safeParse(t);
2684
3176
  return parsed.success;
@@ -2687,7 +3179,7 @@ var fetchTokens6 = async ({
2687
3179
 
2688
3180
  // src/modules/substrate-assets/getMiniMetadata.ts
2689
3181
  import { MINIMETADATA_VERSION as MINIMETADATA_VERSION3 } from "@talismn/chaindata-provider";
2690
- import { compactMetadata as compactMetadata2, encodeMetadata as encodeMetadata2, parseMetadataRpc as parseMetadataRpc8 } from "@talismn/scale";
3182
+ import { compactMetadata as compactMetadata2, encodeMetadata as encodeMetadata2, parseMetadataRpc as parseMetadataRpc9 } from "@talismn/scale";
2691
3183
 
2692
3184
  // src/types/balances.ts
2693
3185
  import { evmErc20TokenId as evmErc20TokenId2 } from "@talismn/chaindata-provider";
@@ -2700,7 +3192,6 @@ import {
2700
3192
  isBigInt,
2701
3193
  planckToTokens
2702
3194
  } from "@talismn/util";
2703
- import BigNumber2 from "bignumber.js";
2704
3195
 
2705
3196
  // src/modules/substrate-dtao/alphaPrice.ts
2706
3197
  var TAO_DECIMALS = 9n;
@@ -2717,6 +3208,179 @@ var taoToAlpha = (tao, scaledAlphaPrice) => {
2717
3208
  if (!tao || !scaledAlphaPrice) return 0n;
2718
3209
  return tao * ALPHA_PRICE_SCALE / scaledAlphaPrice;
2719
3210
  };
3211
+ var taoToAlphaCeil = (tao, scaledAlphaPrice) => {
3212
+ if (!tao || !scaledAlphaPrice) return 0n;
3213
+ return (tao * ALPHA_PRICE_SCALE + scaledAlphaPrice - 1n) / scaledAlphaPrice;
3214
+ };
3215
+
3216
+ // src/modules/substrate-dtao/convictionLocks.ts
3217
+ import {
3218
+ decodeScale as decodeScale2,
3219
+ parseMetadataRpc as parseMetadataRpc4
3220
+ } from "@talismn/scale";
3221
+ var convictionLockKey = (address, netuid) => `${address}:${netuid}`;
3222
+ var getConvictionLockLabel = (lockType) => lockType === "perpetual" ? "Perpetual Conviction Lock" : "Decaying Conviction Lock";
3223
+ var findDTaoConvictionLock = (locks) => {
3224
+ for (const lock of locks ?? []) {
3225
+ const meta = lock.meta;
3226
+ if (meta?.convictionLock?.type !== "conviction-lock") continue;
3227
+ const lockType = meta.convictionLock.lockType;
3228
+ return {
3229
+ amount: lock.amount.planck,
3230
+ hotkey: meta.convictionLock.hotkey,
3231
+ lockType,
3232
+ label: getConvictionLockLabel(lockType)
3233
+ };
3234
+ }
3235
+ return null;
3236
+ };
3237
+ var toBigIntValue = (value) => {
3238
+ if (typeof value === "bigint") return value;
3239
+ if (value && typeof value === "object" && "bits" in value) {
3240
+ const bits = value.bits;
3241
+ if (typeof bits === "bigint") return bits;
3242
+ }
3243
+ return 0n;
3244
+ };
3245
+ var fetchConvictionLocks = async (connector, networkId, metadataRpc, addresses) => {
3246
+ if (!addresses.length) return [];
3247
+ const { unifiedMetadata, builder } = parseMetadataRpc4(metadataRpc);
3248
+ if (!hasRuntimeApi(unifiedMetadata, "StakeInfoRuntimeApi", "get_coldkey_lock") || !hasStorageItems(unifiedMetadata, "SubtensorModule", ["Lock", "DecayingLock"])) {
3249
+ return [];
3250
+ }
3251
+ try {
3252
+ const lockStorageCoder = builder.buildStorage("SubtensorModule", "Lock");
3253
+ const decayingLockStorageCoder = builder.buildStorage("SubtensorModule", "DecayingLock");
3254
+ const lockStorageKeys = await fetchConvictionLockStorageKeys(
3255
+ connector,
3256
+ networkId,
3257
+ addresses,
3258
+ lockStorageCoder
3259
+ );
3260
+ if (!lockStorageKeys.length) return [];
3261
+ const hotkeyByPair = new Map(
3262
+ lockStorageKeys.map(({ address, netuid, hotkey }) => [
3263
+ convictionLockKey(address, netuid),
3264
+ hotkey
3265
+ ])
3266
+ );
3267
+ const [lockModesByPair, lockStates] = await Promise.all([
3268
+ fetchConvictionLockModes(connector, networkId, lockStorageKeys, decayingLockStorageCoder),
3269
+ fetchColdkeyLockStates(connector, networkId, builder, lockStorageKeys)
3270
+ ]);
3271
+ return lockStates.flatMap(({ address, netuid, lockState }) => {
3272
+ const amount = lockState?.locked_mass ?? 0n;
3273
+ const convictionRaw = toBigIntValue(lockState?.conviction);
3274
+ if (amount <= 0n && convictionRaw <= 0n) return [];
3275
+ const hotkey = hotkeyByPair.get(convictionLockKey(address, netuid));
3276
+ if (!hotkey) return [];
3277
+ return [
3278
+ {
3279
+ address,
3280
+ netuid,
3281
+ lock: {
3282
+ amount,
3283
+ hotkey,
3284
+ lockType: lockModesByPair.get(convictionLockKey(address, netuid)) ?? "decaying",
3285
+ convictionRaw: convictionRaw.toString()
3286
+ }
3287
+ }
3288
+ ];
3289
+ });
3290
+ } catch (cause) {
3291
+ log_default.warn(`Failed to fetch Bittensor conviction locks on ${networkId}`, { cause });
3292
+ return [];
3293
+ }
3294
+ };
3295
+ var fetchConvictionLockStorageKeys = async (connector, networkId, addresses, storageCoder) => {
3296
+ const keysPerAddress = await Promise.all(
3297
+ addresses.map(async (address) => {
3298
+ let keyPrefix;
3299
+ try {
3300
+ keyPrefix = storageCoder.keys.enc(address);
3301
+ } catch (cause) {
3302
+ log_default.warn(
3303
+ `Failed to encode conviction Lock key prefix (address=${address}) on ${networkId}`,
3304
+ { cause }
3305
+ );
3306
+ return [];
3307
+ }
3308
+ try {
3309
+ const stateKeys = await connector.send(networkId, "state_getKeys", [
3310
+ keyPrefix
3311
+ ]);
3312
+ return stateKeys.flatMap((stateKey) => {
3313
+ try {
3314
+ const [, netuid, hotkey] = storageCoder.keys.dec(stateKey);
3315
+ return [{ address, netuid, hotkey }];
3316
+ } catch (cause) {
3317
+ log_default.warn(`Failed to decode conviction Lock key ${stateKey} on ${networkId}`, { cause });
3318
+ return [];
3319
+ }
3320
+ });
3321
+ } catch (cause) {
3322
+ log_default.warn(`Failed to fetch conviction Lock keys (address=${address}) on ${networkId}`, {
3323
+ cause
3324
+ });
3325
+ return [];
3326
+ }
3327
+ })
3328
+ );
3329
+ return keysPerAddress.flat();
3330
+ };
3331
+ var fetchConvictionLockModes = async (connector, networkId, pairs, storageCoder) => {
3332
+ const queries = pairs.map(
3333
+ ({ address, netuid }) => {
3334
+ let stateKey = null;
3335
+ try {
3336
+ stateKey = storageCoder.keys.enc(address, netuid);
3337
+ } catch (cause) {
3338
+ log_default.warn(
3339
+ `Failed to encode conviction DecayingLock key (netuid=${netuid}, address=${address}) on ${networkId}`,
3340
+ { cause }
3341
+ );
3342
+ }
3343
+ const key = convictionLockKey(address, netuid);
3344
+ return {
3345
+ stateKeys: [stateKey],
3346
+ decodeResult: (changes) => {
3347
+ const hexValue = changes[0];
3348
+ if (!hexValue) return [key, "decaying"];
3349
+ const decoded = decodeScale2(
3350
+ storageCoder,
3351
+ hexValue,
3352
+ `Failed to decode DecayingLock for (netuid=${netuid}, address=${address}) on ${networkId}`
3353
+ );
3354
+ return [key, decoded === false ? "perpetual" : "decaying"];
3355
+ }
3356
+ };
3357
+ }
3358
+ );
3359
+ return new Map(await fetchRpcQueryPack(connector, networkId, queries));
3360
+ };
3361
+ var fetchColdkeyLockStates = async (connector, networkId, builder, pairs) => {
3362
+ return Promise.all(
3363
+ pairs.map(async ({ address, netuid }) => {
3364
+ try {
3365
+ const lockState = await fetchRuntimeCallResult(
3366
+ connector,
3367
+ networkId,
3368
+ builder,
3369
+ "StakeInfoRuntimeApi",
3370
+ "get_coldkey_lock",
3371
+ [address, netuid]
3372
+ );
3373
+ return { address, netuid, lockState };
3374
+ } catch (cause) {
3375
+ log_default.warn(
3376
+ `Failed to fetch get_coldkey_lock for (netuid=${netuid}, address=${address}) on ${networkId}`,
3377
+ { cause }
3378
+ );
3379
+ return { address, netuid, lockState: null };
3380
+ }
3381
+ })
3382
+ );
3383
+ };
2720
3384
 
2721
3385
  // src/modules/substrate-dtao/getDtaoTokenRates.ts
2722
3386
  import { subNativeTokenId } from "@talismn/chaindata-provider";
@@ -2724,7 +3388,14 @@ import {
2724
3388
  newTokenRates
2725
3389
  } from "@talismn/token-rates";
2726
3390
  var ONE_ALPHA = 10n ** TAO_DECIMALS;
2727
- var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
3391
+ var getAlphaChange24h = (currency, taoChange24h, alphaPriceChange24h) => {
3392
+ if (typeof alphaPriceChange24h !== "number" || !Number.isFinite(alphaPriceChange24h))
3393
+ return void 0;
3394
+ if (currency === "tao") return alphaPriceChange24h;
3395
+ if (typeof taoChange24h !== "number" || !Number.isFinite(taoChange24h)) return void 0;
3396
+ return ((1 + alphaPriceChange24h / 100) * (1 + taoChange24h / 100) - 1) * 100;
3397
+ };
3398
+ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice, alphaPriceChange24h) => {
2728
3399
  try {
2729
3400
  const taoTokenId = subNativeTokenId(token.networkId);
2730
3401
  const taoTokenRates = tokenRates[taoTokenId];
@@ -2740,8 +3411,7 @@ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
2740
3411
  alphaRates[currency] = {
2741
3412
  price: taoRate.price * priceRatio,
2742
3413
  marketCap: taoRate.marketCap ? taoRate.marketCap * priceRatio : void 0,
2743
- change24h: void 0
2744
- // cannot be determined from TAO rates alone
3414
+ change24h: getAlphaChange24h(currency, taoRate.change24h, alphaPriceChange24h)
2745
3415
  };
2746
3416
  }
2747
3417
  }
@@ -2754,8 +3424,8 @@ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
2754
3424
 
2755
3425
  // src/modules/substrate-dtao/config.ts
2756
3426
  import { SubDTaoTokenSchema } from "@talismn/chaindata-provider";
2757
- var MODULE_TYPE7 = SubDTaoTokenSchema.shape.type.value;
2758
- var PLATFORM7 = SubDTaoTokenSchema.shape.platform.value;
3427
+ var MODULE_TYPE8 = SubDTaoTokenSchema.shape.type.value;
3428
+ var PLATFORM8 = SubDTaoTokenSchema.shape.platform.value;
2759
3429
 
2760
3430
  // src/modules/substrate-dtao/fetchBalances.ts
2761
3431
  import {
@@ -2763,9 +3433,9 @@ import {
2763
3433
  subDTaoTokenId as subDTaoTokenId2,
2764
3434
  TokenSchema
2765
3435
  } from "@talismn/chaindata-provider";
2766
- import { decodeScale as decodeScale2, parseMetadataRpc as parseMetadataRpc4 } from "@talismn/scale";
2767
- import { isNotNil as isNotNil4 } from "@talismn/util";
2768
- import { keyBy as keyBy4, uniq as uniq3 } from "lodash-es";
3436
+ import { decodeScale as decodeScale3, parseMetadataRpc as parseMetadataRpc5 } from "@talismn/scale";
3437
+ import { isNotNil as isNotNil5 } from "@talismn/util";
3438
+ import { keyBy as keyBy5, uniq as uniq4 } from "lodash-es";
2769
3439
 
2770
3440
  // src/modules/substrate-dtao/calculatePendingRootClaimable.ts
2771
3441
  import { subDTaoTokenId } from "@talismn/chaindata-provider";
@@ -2804,7 +3474,7 @@ var calculatePendingRootClaimable = ({
2804
3474
 
2805
3475
  // src/modules/substrate-dtao/fetchBalances.ts
2806
3476
  var ROOT_NETUID = 0;
2807
- var fetchBalances7 = async ({
3477
+ var fetchBalances8 = async ({
2808
3478
  networkId,
2809
3479
  tokensWithAddresses,
2810
3480
  connector,
@@ -2813,7 +3483,7 @@ var fetchBalances7 = async ({
2813
3483
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
2814
3484
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
2815
3485
  if (!miniMetadata?.data) {
2816
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE7} balances on ${networkId}.`, {
3486
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE8} balances on ${networkId}.`, {
2817
3487
  tokensWithAddresses
2818
3488
  });
2819
3489
  return {
@@ -2825,20 +3495,20 @@ var fetchBalances7 = async ({
2825
3495
  }))
2826
3496
  };
2827
3497
  }
2828
- if (miniMetadata.source !== MODULE_TYPE7) {
2829
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE7}.`);
3498
+ if (miniMetadata.source !== MODULE_TYPE8) {
3499
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE8}.`);
2830
3500
  return {
2831
3501
  success: [],
2832
3502
  errors: balanceDefs.map((def) => ({
2833
3503
  tokenId: def.token.id,
2834
3504
  address: def.address,
2835
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE7}`)
3505
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE8}`)
2836
3506
  }))
2837
3507
  };
2838
3508
  }
2839
3509
  if (miniMetadata.chainId !== networkId) {
2840
3510
  log_default.warn(
2841
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE7}. Expected chainId is ${networkId}`
3511
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE8}. Expected chainId is ${networkId}`
2842
3512
  );
2843
3513
  return {
2844
3514
  success: [],
@@ -2849,7 +3519,7 @@ var fetchBalances7 = async ({
2849
3519
  }))
2850
3520
  };
2851
3521
  }
2852
- const addresses = uniq3(balanceDefs.map((def) => def.address));
3522
+ const addresses = uniq4(balanceDefs.map((def) => def.address));
2853
3523
  try {
2854
3524
  const [stakeInfos, dynamicInfos] = await Promise.all([
2855
3525
  fetchRuntimeCallResult(
@@ -2869,7 +3539,8 @@ var fetchBalances7 = async ({
2869
3539
  []
2870
3540
  )
2871
3541
  ]);
2872
- const rootHotkeys = uniq3(
3542
+ const dynamicInfoByNetuid = keyBy5(dynamicInfos.filter(isNotNil5), (info) => info.netuid);
3543
+ const rootHotkeys = uniq4(
2873
3544
  stakeInfos.flatMap(
2874
3545
  ([, stakes]) => stakes.filter((stake) => stake.netuid === ROOT_NETUID).map((stake) => stake.hotkey)
2875
3546
  )
@@ -2888,13 +3559,10 @@ var fetchBalances7 = async ({
2888
3559
  }
2889
3560
  }
2890
3561
  }
2891
- const rootClaimedAmounts = addressHotkeyNetuidPairs.length && miniMetadata.data ? await fetchRootClaimedAmounts(
2892
- connector,
2893
- networkId,
2894
- miniMetadata.data,
2895
- addressHotkeyNetuidPairs
2896
- ) : /* @__PURE__ */ new Map();
2897
- const dynamicInfoByNetuid = keyBy4(dynamicInfos.filter(isNotNil4), (info) => info.netuid);
3562
+ const [rootClaimedAmounts, convictionLocks] = await Promise.all([
3563
+ addressHotkeyNetuidPairs.length && miniMetadata.data ? fetchRootClaimedAmounts(connector, networkId, miniMetadata.data, addressHotkeyNetuidPairs) : Promise.resolve(/* @__PURE__ */ new Map()),
3564
+ miniMetadata.data ? fetchConvictionLocks(connector, networkId, miniMetadata.data, addresses) : Promise.resolve([])
3565
+ ]);
2898
3566
  const upsertBalance = (acc, address, tokenId, balance) => {
2899
3567
  const key = `${address}:${tokenId}`;
2900
3568
  const recordedBalance = acc[key];
@@ -2905,6 +3573,9 @@ var fetchBalances7 = async ({
2905
3573
  // If the new balance has pendingRootClaim, use it (it's calculated from current state)
2906
3574
  ...balance.pendingRootClaim !== void 0 && {
2907
3575
  pendingRootClaim: balance.pendingRootClaim
3576
+ },
3577
+ ...balance.convictionLock !== void 0 && {
3578
+ convictionLock: balance.convictionLock
2908
3579
  }
2909
3580
  };
2910
3581
  } else {
@@ -2947,13 +3618,29 @@ var fetchBalances7 = async ({
2947
3618
  },
2948
3619
  {}
2949
3620
  );
3621
+ for (const { address, netuid, lock } of convictionLocks) {
3622
+ const dynamicInfo = dynamicInfoByNetuid[netuid];
3623
+ const scaledAlphaPrice = dynamicInfo ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in) : 0n;
3624
+ const balance = {
3625
+ address,
3626
+ tokenId: subDTaoTokenId2(networkId, netuid),
3627
+ baseTokenId: subDTaoTokenId2(networkId, netuid),
3628
+ stake: 0n,
3629
+ hotkey: lock.hotkey,
3630
+ netuid,
3631
+ scaledAlphaPrice,
3632
+ convictionLock: lock
3633
+ };
3634
+ upsertBalance(balancesRaw, address, balance.tokenId, balance);
3635
+ }
2950
3636
  const balances = Object.values(balancesRaw);
2951
- const tokensById = keyBy4(
3637
+ const tokensById = keyBy5(
2952
3638
  tokensWithAddresses.map(([token]) => token),
2953
3639
  (t) => t.id
2954
3640
  );
2955
3641
  const dynamicTokens = [];
2956
3642
  for (const bal of balances) {
3643
+ if (bal.tokenId === bal.baseTokenId) continue;
2957
3644
  if (!balanceDefs.some((def) => def.token.id === bal.tokenId)) {
2958
3645
  const baseToken = tokensById[bal.baseTokenId];
2959
3646
  if (baseToken) {
@@ -2974,6 +3661,8 @@ var fetchBalances7 = async ({
2974
3661
  };
2975
3662
  const stakeAmount = BigInt(stake?.stake?.toString() ?? "0");
2976
3663
  const pendingRootClaimAmount = BigInt(stake?.pendingRootClaim?.toString() ?? "0");
3664
+ const convictionLockAmount = BigInt(stake?.convictionLock?.amount?.toString() ?? "0");
3665
+ const convictionLockConviction = BigInt(stake?.convictionLock?.convictionRaw ?? "0");
2977
3666
  const hasZeroStake = stakeAmount === 0n;
2978
3667
  const hasPendingRootClaim = pendingRootClaimAmount > 0n;
2979
3668
  const balanceValue = {
@@ -2986,9 +3675,30 @@ var fetchBalances7 = async ({
2986
3675
  type: "locked",
2987
3676
  label: "Pending root claim",
2988
3677
  amount: pendingRootClaimAmount.toString(),
3678
+ // The pending claim is not part of the stake (free amount): on-chain it only becomes
3679
+ // stake once claimed (root_claim_on_subnet). Since it was never included in `free`,
3680
+ // it must not be subtracted from it either: flag it so it does not reduce the staked
3681
+ // position's transferable amount.
3682
+ includeInTransferable: true,
2989
3683
  meta
2990
3684
  };
2991
3685
  const values3 = [balanceValue, pendingRootClaimValue];
3686
+ if (stake?.convictionLock && (convictionLockAmount > 0n || convictionLockConviction > 0n)) {
3687
+ const convictionLockMeta = {
3688
+ ...meta,
3689
+ convictionLock: {
3690
+ type: "conviction-lock",
3691
+ hotkey: stake.convictionLock.hotkey,
3692
+ lockType: stake.convictionLock.lockType
3693
+ }
3694
+ };
3695
+ values3.push({
3696
+ type: "locked",
3697
+ label: getConvictionLockLabel(stake.convictionLock.lockType),
3698
+ amount: convictionLockAmount.toString(),
3699
+ meta: convictionLockMeta
3700
+ });
3701
+ }
2992
3702
  if (hasZeroStake && hasPendingRootClaim) {
2993
3703
  values3.push({
2994
3704
  type: "extra",
@@ -3002,7 +3712,7 @@ var fetchBalances7 = async ({
3002
3712
  address: def.address,
3003
3713
  networkId,
3004
3714
  tokenId: def.token.id,
3005
- source: MODULE_TYPE7,
3715
+ source: MODULE_TYPE8,
3006
3716
  status: "live",
3007
3717
  values: values3
3008
3718
  };
@@ -3026,7 +3736,7 @@ var fetchBalances7 = async ({
3026
3736
  }
3027
3737
  };
3028
3738
  var buildStorageCoder = (metadataRpc, pallet, entry) => {
3029
- const { builder } = parseMetadataRpc4(metadataRpc);
3739
+ const { builder } = parseMetadataRpc5(metadataRpc);
3030
3740
  return builder.buildStorage(pallet, entry);
3031
3741
  };
3032
3742
  var buildRootClaimableStorageCoder = async (_connector, networkId, metadataRpc) => {
@@ -3070,7 +3780,7 @@ var buildRootClaimableQueries = (networkId, hotkeys, storageCoder) => {
3070
3780
  if (!hexValue) {
3071
3781
  return [hotkey, /* @__PURE__ */ new Map()];
3072
3782
  }
3073
- const decoded = decodeScale2(
3783
+ const decoded = decodeScale3(
3074
3784
  storageCoder,
3075
3785
  hexValue,
3076
3786
  `Failed to decode RootClaimable for hotkey ${hotkey} on ${networkId}`
@@ -3114,7 +3824,7 @@ var buildRootClaimedQueries = (networkId, addressHotkeyNetuidPairs, storageCoder
3114
3824
  if (!hexValue) {
3115
3825
  return [address, hotkey, netuid, 0n];
3116
3826
  }
3117
- const decoded = decodeScale2(
3827
+ const decoded = decodeScale3(
3118
3828
  storageCoder,
3119
3829
  hexValue,
3120
3830
  `Failed to decode RootClaimed for (netuid=${netuid}, hotkey=${hotkey}, address=${address}) on ${networkId}`
@@ -3173,14 +3883,14 @@ import {
3173
3883
  SubDTaoTokenSchema as SubDTaoTokenSchema2,
3174
3884
  subDTaoTokenId as subDTaoTokenId3
3175
3885
  } from "@talismn/chaindata-provider";
3176
- import { getStorageKeyPrefix as getStorageKeyPrefix2, parseMetadataRpc as parseMetadataRpc5 } from "@talismn/scale";
3177
- import { isNotNil as isNotNil5 } from "@talismn/util";
3886
+ import { getStorageKeyPrefix as getStorageKeyPrefix2, parseMetadataRpc as parseMetadataRpc6 } from "@talismn/scale";
3887
+ import { isNotNil as isNotNil6 } from "@talismn/util";
3178
3888
  import { fromPairs } from "lodash-es";
3179
3889
  var NATIVE_TOKEN_SYMBOLS = {
3180
3890
  "bittensor": "TAO",
3181
3891
  "bittensor-testnet": "testTAO"
3182
3892
  };
3183
- var fetchTokens7 = async ({
3893
+ var fetchTokens8 = async ({
3184
3894
  networkId,
3185
3895
  connector,
3186
3896
  tokens,
@@ -3199,7 +3909,7 @@ var fetchTokens7 = async ({
3199
3909
  []
3200
3910
  )
3201
3911
  ]);
3202
- return dynamicInfos.filter(isNotNil5).map((info) => {
3912
+ return dynamicInfos.filter(isNotNil6).map((info) => {
3203
3913
  const config = tokens.find((t) => t.netuid === info.netuid);
3204
3914
  let symbol = new TextDecoder().decode(Uint8Array.from(info.token_symbol));
3205
3915
  const subnetName = info.subnet_identity?.subnet_name?.asText() ?? (info.netuid === 0 ? "Root" : `Subnet ${info.netuid}`);
@@ -3209,8 +3919,8 @@ var fetchTokens7 = async ({
3209
3919
  const isTransferable = transferableTokensMap[info.netuid] ?? true;
3210
3920
  const token = {
3211
3921
  id: subDTaoTokenId3(networkId, info.netuid),
3212
- type: MODULE_TYPE7,
3213
- platform: PLATFORM7,
3922
+ type: MODULE_TYPE8,
3923
+ platform: PLATFORM8,
3214
3924
  networkId,
3215
3925
  netuid: info.netuid,
3216
3926
  isDefault: true,
@@ -3227,7 +3937,7 @@ var fetchTokens7 = async ({
3227
3937
  });
3228
3938
  };
3229
3939
  var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
3230
- const { builder } = parseMetadataRpc5(metadata);
3940
+ const { builder } = parseMetadataRpc6(metadata);
3231
3941
  const transferToggleCodec = builder.buildStorage("SubtensorModule", "TransferToggle");
3232
3942
  const transferToggleKeys = await connector.send(networkId, "state_getKeys", [
3233
3943
  getStorageKeyPrefix2("SubtensorModule", "TransferToggle")
@@ -3249,13 +3959,13 @@ var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
3249
3959
 
3250
3960
  // src/modules/substrate-dtao/getMiniMetadata.ts
3251
3961
  import { MINIMETADATA_VERSION } from "@talismn/chaindata-provider";
3252
- import { compactMetadata, encodeMetadata, parseMetadataRpc as parseMetadataRpc6 } from "@talismn/scale";
3253
- var getMiniMetadata6 = ({
3962
+ import { compactMetadata, encodeMetadata, parseMetadataRpc as parseMetadataRpc7 } from "@talismn/scale";
3963
+ var getMiniMetadata7 = ({
3254
3964
  networkId,
3255
3965
  specVersion,
3256
3966
  metadataRpc
3257
3967
  }) => {
3258
- const source = MODULE_TYPE7;
3968
+ const source = MODULE_TYPE8;
3259
3969
  const chainId = networkId;
3260
3970
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
3261
3971
  if (specVersion !== systemVersion.spec_version)
@@ -3263,7 +3973,7 @@ var getMiniMetadata6 = ({
3263
3973
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
3264
3974
  );
3265
3975
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
3266
- const { unifiedMetadata } = parseMetadataRpc6(metadataRpc);
3976
+ const { unifiedMetadata } = parseMetadataRpc7(metadataRpc);
3267
3977
  if (unifiedMetadata.version < 14)
3268
3978
  throw new Error(
3269
3979
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -3279,16 +3989,21 @@ var getMiniMetadata6 = ({
3279
3989
  };
3280
3990
  };
3281
3991
  var getData = (metadataRpc) => {
3282
- const { metadata, unifiedMetadata } = parseMetadataRpc6(metadataRpc);
3992
+ const { metadata, unifiedMetadata } = parseMetadataRpc7(metadataRpc);
3283
3993
  const isBittensor = unifiedMetadata.pallets.some(({ name }) => name === "SubtensorModule");
3284
3994
  if (!isBittensor) return null;
3285
3995
  compactMetadata(
3286
3996
  metadata,
3287
- [{ pallet: "SubtensorModule", items: ["TransferToggle", "RootClaimable", "RootClaimed"] }],
3997
+ [
3998
+ {
3999
+ pallet: "SubtensorModule",
4000
+ items: ["TransferToggle", "RootClaimable", "RootClaimed", "Lock", "DecayingLock"]
4001
+ }
4002
+ ],
3288
4003
  [
3289
4004
  {
3290
4005
  runtimeApi: "StakeInfoRuntimeApi",
3291
- methods: ["get_stake_info_for_coldkeys"]
4006
+ methods: ["get_stake_info_for_coldkeys", "get_coldkey_lock"]
3292
4007
  },
3293
4008
  {
3294
4009
  runtimeApi: "SubnetInfoRuntimeApi",
@@ -3301,21 +4016,21 @@ var getData = (metadataRpc) => {
3301
4016
 
3302
4017
  // src/modules/substrate-dtao/getTransferCallData.ts
3303
4018
  import { mergeUint8 } from "@polkadot-api/utils";
3304
- import { isTokenOfType as isTokenOfType6, parseSubDTaoTokenId } from "@talismn/chaindata-provider";
3305
- import { parseMetadataRpc as parseMetadataRpc7 } from "@talismn/scale";
4019
+ import { isTokenOfType as isTokenOfType7, parseSubDTaoTokenId } from "@talismn/chaindata-provider";
4020
+ import { parseMetadataRpc as parseMetadataRpc8 } from "@talismn/scale";
3306
4021
  import { Binary } from "polkadot-api";
3307
- var getTransferCallData6 = ({
4022
+ var getTransferCallData7 = ({
3308
4023
  from: from2,
3309
4024
  to,
3310
4025
  value,
3311
4026
  token,
3312
4027
  metadataRpc
3313
4028
  }) => {
3314
- if (!isTokenOfType6(token, MODULE_TYPE7))
3315
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE7}.`);
4029
+ if (!isTokenOfType7(token, MODULE_TYPE8))
4030
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE8}.`);
3316
4031
  const { netuid: subnetId, hotkey } = parseSubDTaoTokenId(token.id);
3317
4032
  if (!hotkey) throw new Error(`Missing hotkey`);
3318
- const { builder } = parseMetadataRpc7(metadataRpc);
4033
+ const { builder } = parseMetadataRpc8(metadataRpc);
3319
4034
  const { codec, location } = builder.buildCall("SubtensorModule", "transfer_stake");
3320
4035
  const args = codec.enc({
3321
4036
  origin_netuid: subnetId,
@@ -3332,22 +4047,23 @@ var getTransferCallData6 = ({
3332
4047
  };
3333
4048
 
3334
4049
  // src/modules/substrate-dtao/subscribeBalances.ts
3335
- import { isEqual as isEqual7 } from "lodash-es";
3336
- import { distinctUntilChanged as distinctUntilChanged7, Observable as Observable7, of as of7 } from "rxjs";
3337
- var SUBSCRIPTION_INTERVAL6 = 6e3;
3338
- var subscribeBalances6 = ({
4050
+ import { isEqual as isEqual8 } from "lodash-es";
4051
+ import { distinctUntilChanged as distinctUntilChanged8, Observable as Observable8, of as of8 } from "rxjs";
4052
+ var SUBSCRIPTION_INTERVAL7 = 6e3;
4053
+ var subscribeBalances7 = ({
3339
4054
  networkId,
3340
4055
  tokensWithAddresses,
3341
4056
  connector,
3342
4057
  miniMetadata
3343
4058
  }) => {
3344
- if (!tokensWithAddresses.length) return of7({ success: [], errors: [] });
3345
- return new Observable7((subscriber) => {
4059
+ if (!tokensWithAddresses.length) return of8({ success: [], errors: [] });
4060
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
4061
+ return new Observable8((subscriber) => {
3346
4062
  const abortController = new AbortController();
3347
4063
  const poll = async () => {
3348
4064
  try {
3349
4065
  if (abortController.signal.aborted) return;
3350
- const balances = await fetchBalances7({
4066
+ const balances = await fetchBalances8({
3351
4067
  networkId,
3352
4068
  tokensWithAddresses,
3353
4069
  connector,
@@ -3355,40 +4071,49 @@ var subscribeBalances6 = ({
3355
4071
  });
3356
4072
  if (abortController.signal.aborted) return;
3357
4073
  subscriber.next(balances);
3358
- setTimeout(poll, SUBSCRIPTION_INTERVAL6);
3359
4074
  } catch (error) {
4075
+ if (abortController.signal.aborted) return;
3360
4076
  log_default.error("Error", {
3361
- module: MODULE_TYPE7,
4077
+ module: MODULE_TYPE8,
3362
4078
  networkId,
3363
4079
  miniMetadata,
3364
4080
  addressesByToken: tokensWithAddresses,
3365
4081
  error
3366
4082
  });
3367
- subscriber.error(error);
4083
+ const fetchError = error instanceof Error ? error : new Error(String(error));
4084
+ subscriber.next({
4085
+ success: [],
4086
+ errors: balanceDefs.map((def) => ({
4087
+ tokenId: def.token.id,
4088
+ address: def.address,
4089
+ error: fetchError
4090
+ }))
4091
+ });
3368
4092
  }
4093
+ if (!abortController.signal.aborted) setTimeout(poll, SUBSCRIPTION_INTERVAL7);
3369
4094
  };
3370
4095
  poll();
3371
4096
  return () => {
3372
4097
  abortController.abort();
3373
4098
  };
3374
- }).pipe(distinctUntilChanged7(isEqual7));
4099
+ }).pipe(distinctUntilChanged8(isEqual8));
3375
4100
  };
3376
4101
 
3377
4102
  // src/modules/substrate-dtao/module.ts
3378
4103
  var SubDTaoBalanceModule = {
3379
- type: MODULE_TYPE7,
3380
- platform: PLATFORM7,
3381
- getMiniMetadata: getMiniMetadata6,
3382
- fetchTokens: fetchTokens7,
3383
- fetchBalances: fetchBalances7,
3384
- subscribeBalances: subscribeBalances6,
3385
- getTransferCallData: getTransferCallData6
4104
+ type: MODULE_TYPE8,
4105
+ platform: PLATFORM8,
4106
+ getMiniMetadata: getMiniMetadata7,
4107
+ fetchTokens: fetchTokens8,
4108
+ fetchBalances: fetchBalances8,
4109
+ subscribeBalances: subscribeBalances7,
4110
+ getTransferCallData: getTransferCallData7
3386
4111
  };
3387
4112
 
3388
4113
  // src/modules/substrate-dtao/types.ts
3389
4114
  import { SubDTaoTokenSchema as SubDTaoTokenSchema3 } from "@talismn/chaindata-provider";
3390
- import z9 from "zod/v4";
3391
- var SubDTaoTokenConfigSchema = z9.strictObject({
4115
+ import z11 from "zod/v4";
4116
+ var SubDTaoTokenConfigSchema = z11.strictObject({
3392
4117
  netuid: SubDTaoTokenSchema3.shape.netuid,
3393
4118
  ...TokenConfigBaseSchema.shape
3394
4119
  });
@@ -3668,9 +4393,9 @@ var Balance = class {
3668
4393
  const totalSupply = extras.find((extra2) => extra2.label === "totalSupply")?.amount ?? "0";
3669
4394
  const reserve0 = extras.find((extra2) => extra2.label === "reserve0")?.amount ?? "0";
3670
4395
  const reserve1 = extras.find((extra2) => extra2.label === "reserve1")?.amount ?? "0";
3671
- const totalSupplyTokens = BigNumber2(totalSupply).times(10 ** (-1 * decimals));
3672
- const reserve0Tokens = BigNumber2(reserve0).times(10 ** (-1 * decimals0));
3673
- const reserve1Tokens = BigNumber2(reserve1).times(10 ** (-1 * decimals1));
4396
+ const totalSupplyTokens = configureBigNumber_default(totalSupply).times(10 ** (-1 * decimals));
4397
+ const reserve0Tokens = configureBigNumber_default(reserve0).times(10 ** (-1 * decimals0));
4398
+ const reserve1Tokens = configureBigNumber_default(reserve1).times(10 ** (-1 * decimals1));
3674
4399
  const rates0Currencies = new Set(Object.keys(rates0));
3675
4400
  const rates1Currencies = new Set(Object.keys(rates1));
3676
4401
  const currencies = [...rates0Currencies].filter((c) => rates1Currencies.has(c));
@@ -3678,7 +4403,7 @@ var Balance = class {
3678
4403
  (currency) => [
3679
4404
  currency,
3680
4405
  // tvl (in a given currency) == reserve0*currencyRate0 + reserve1*currencyRate1
3681
- BigNumber2.sum(
4406
+ configureBigNumber_default.sum(
3682
4407
  reserve0Tokens.times(rates0[currency]?.price ?? 0),
3683
4408
  reserve1Tokens.times(rates1[currency]?.price ?? 0)
3684
4409
  )
@@ -4056,12 +4781,12 @@ var deriveMiniMetadataId = ({
4056
4781
  ).slice(-32);
4057
4782
 
4058
4783
  // src/modules/substrate-assets/getMiniMetadata.ts
4059
- var getMiniMetadata7 = ({
4784
+ var getMiniMetadata8 = ({
4060
4785
  networkId,
4061
4786
  specVersion,
4062
4787
  metadataRpc
4063
4788
  }) => {
4064
- const source = MODULE_TYPE6;
4789
+ const source = MODULE_TYPE7;
4065
4790
  const chainId = networkId;
4066
4791
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
4067
4792
  if (specVersion !== systemVersion.spec_version)
@@ -4069,7 +4794,7 @@ var getMiniMetadata7 = ({
4069
4794
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
4070
4795
  );
4071
4796
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
4072
- const { unifiedMetadata } = parseMetadataRpc8(metadataRpc);
4797
+ const { unifiedMetadata } = parseMetadataRpc9(metadataRpc);
4073
4798
  if (unifiedMetadata.version < 14)
4074
4799
  throw new Error(
4075
4800
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -4085,7 +4810,7 @@ var getMiniMetadata7 = ({
4085
4810
  };
4086
4811
  };
4087
4812
  var getData2 = (metadataRpc) => {
4088
- const { metadata, unifiedMetadata } = parseMetadataRpc8(metadataRpc);
4813
+ const { metadata, unifiedMetadata } = parseMetadataRpc9(metadataRpc);
4089
4814
  if (!hasStorageItems(unifiedMetadata, "Assets", ["Account", "Asset", "Metadata"])) return null;
4090
4815
  compactMetadata2(metadata, [{ pallet: "Assets", items: ["Account", "Asset", "Metadata"] }]);
4091
4816
  return encodeMetadata2(metadata);
@@ -4093,10 +4818,10 @@ var getData2 = (metadataRpc) => {
4093
4818
 
4094
4819
  // src/modules/substrate-assets/getTransferCallData.ts
4095
4820
  import { mergeUint8 as mergeUint82 } from "@polkadot-api/utils";
4096
- import { isTokenOfType as isTokenOfType7 } from "@talismn/chaindata-provider";
4097
- import { parseMetadataRpc as parseMetadataRpc9 } from "@talismn/scale";
4821
+ import { isTokenOfType as isTokenOfType8 } from "@talismn/chaindata-provider";
4822
+ import { parseMetadataRpc as parseMetadataRpc10 } from "@talismn/scale";
4098
4823
  import { Binary as Binary2, Enum } from "polkadot-api";
4099
- var getTransferCallData7 = ({
4824
+ var getTransferCallData8 = ({
4100
4825
  from: from2,
4101
4826
  to,
4102
4827
  value,
@@ -4104,9 +4829,9 @@ var getTransferCallData7 = ({
4104
4829
  type,
4105
4830
  metadataRpc
4106
4831
  }) => {
4107
- if (!isTokenOfType7(token, MODULE_TYPE6))
4108
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE6}.`);
4109
- const { builder } = parseMetadataRpc9(metadataRpc);
4832
+ if (!isTokenOfType8(token, MODULE_TYPE7))
4833
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE7}.`);
4834
+ const { builder } = parseMetadataRpc10(metadataRpc);
4110
4835
  const method = getTransferMethod(type);
4111
4836
  const { codec, location } = builder.buildCall("Assets", method);
4112
4837
  const args = getEncodedArgs(method, token.assetId, to, value, codec);
@@ -4194,14 +4919,14 @@ var getTransferAllEncodedArgs = (assetId, to, codec) => {
4194
4919
  };
4195
4920
 
4196
4921
  // src/modules/substrate-assets/subscribeBalances.ts
4197
- import { map as map2, of as of8 } from "rxjs";
4198
- var subscribeBalances7 = ({
4922
+ import { map as map2, of as of9 } from "rxjs";
4923
+ var subscribeBalances8 = ({
4199
4924
  networkId,
4200
4925
  tokensWithAddresses,
4201
4926
  connector,
4202
4927
  miniMetadata
4203
4928
  }) => {
4204
- if (!tokensWithAddresses.length) return of8({ success: [], errors: [] });
4929
+ if (!tokensWithAddresses.length) return of9({ success: [], errors: [] });
4205
4930
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
4206
4931
  const queries = buildQueries(networkId, balanceDefs, miniMetadata);
4207
4932
  return getRpcQueryPack$(connector, networkId, queries).pipe(
@@ -4214,31 +4939,31 @@ var subscribeBalances7 = ({
4214
4939
 
4215
4940
  // src/modules/substrate-assets/module.ts
4216
4941
  var SubAssetsBalanceModule = {
4217
- type: MODULE_TYPE6,
4218
- platform: PLATFORM6,
4219
- getMiniMetadata: getMiniMetadata7,
4220
- fetchTokens: fetchTokens6,
4221
- fetchBalances: fetchBalances6,
4222
- subscribeBalances: subscribeBalances7,
4223
- getTransferCallData: getTransferCallData7
4942
+ type: MODULE_TYPE7,
4943
+ platform: PLATFORM7,
4944
+ getMiniMetadata: getMiniMetadata8,
4945
+ fetchTokens: fetchTokens7,
4946
+ fetchBalances: fetchBalances7,
4947
+ subscribeBalances: subscribeBalances8,
4948
+ getTransferCallData: getTransferCallData8
4224
4949
  };
4225
4950
 
4226
4951
  // src/modules/substrate-assets/types.ts
4227
4952
  import { SubAssetsTokenSchema as SubAssetsTokenSchema3 } from "@talismn/chaindata-provider";
4228
- import z10 from "zod/v4";
4229
- var SubAssetsTokenConfigSchema = z10.strictObject({
4953
+ import z12 from "zod/v4";
4954
+ var SubAssetsTokenConfigSchema = z12.strictObject({
4230
4955
  assetId: SubAssetsTokenSchema3.shape.assetId,
4231
4956
  ...TokenConfigBaseSchema.shape
4232
4957
  });
4233
4958
 
4234
4959
  // src/modules/substrate-foreignassets/config.ts
4235
4960
  import { SubForeignAssetsTokenSchema } from "@talismn/chaindata-provider";
4236
- var MODULE_TYPE8 = SubForeignAssetsTokenSchema.shape.type.value;
4237
- var PLATFORM8 = SubForeignAssetsTokenSchema.shape.platform.value;
4961
+ var MODULE_TYPE9 = SubForeignAssetsTokenSchema.shape.type.value;
4962
+ var PLATFORM9 = SubForeignAssetsTokenSchema.shape.platform.value;
4238
4963
 
4239
4964
  // src/modules/substrate-foreignassets/buildQueries.ts
4240
- import { decodeScale as decodeScale3, papiParse } from "@talismn/scale";
4241
- import { isNotNil as isNotNil6 } from "@talismn/util";
4965
+ import { decodeScale as decodeScale4, papiParse } from "@talismn/scale";
4966
+ import { isNotNil as isNotNil7 } from "@talismn/util";
4242
4967
  var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4243
4968
  const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
4244
4969
  storage: ["ForeignAssets", "Account"]
@@ -4260,7 +4985,7 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4260
4985
  return null;
4261
4986
  }
4262
4987
  const decodeResult = (changes) => {
4263
- const decoded = decodeScale3(
4988
+ const decoded = decodeScale4(
4264
4989
  scaleCoder,
4265
4990
  changes[0],
4266
4991
  `Failed to decode substrate-assets balance on chain ${networkId}`
@@ -4293,11 +5018,11 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4293
5018
  stateKeys: [stateKey],
4294
5019
  decodeResult
4295
5020
  };
4296
- }).filter(isNotNil6);
5021
+ }).filter(isNotNil7);
4297
5022
  };
4298
5023
 
4299
5024
  // src/modules/substrate-foreignassets/fetchBalances.ts
4300
- var fetchBalances8 = async ({
5025
+ var fetchBalances9 = async ({
4301
5026
  networkId,
4302
5027
  tokensWithAddresses,
4303
5028
  connector,
@@ -4306,7 +5031,7 @@ var fetchBalances8 = async ({
4306
5031
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
4307
5032
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
4308
5033
  if (!miniMetadata?.data) {
4309
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE8} balances on ${networkId}.`);
5034
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE9} balances on ${networkId}.`);
4310
5035
  return {
4311
5036
  success: [],
4312
5037
  errors: balanceDefs.map((def) => ({
@@ -4316,20 +5041,20 @@ var fetchBalances8 = async ({
4316
5041
  }))
4317
5042
  };
4318
5043
  }
4319
- if (miniMetadata.source !== MODULE_TYPE8) {
4320
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE8}.`);
5044
+ if (miniMetadata.source !== MODULE_TYPE9) {
5045
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE9}.`);
4321
5046
  return {
4322
5047
  success: [],
4323
5048
  errors: balanceDefs.map((def) => ({
4324
5049
  tokenId: def.token.id,
4325
5050
  address: def.address,
4326
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE8}`)
5051
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE9}`)
4327
5052
  }))
4328
5053
  };
4329
5054
  }
4330
5055
  if (miniMetadata.chainId !== networkId) {
4331
5056
  log_default.warn(
4332
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE8}. Expected chainId is ${networkId}`
5057
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE9}. Expected chainId is ${networkId}`
4333
5058
  );
4334
5059
  return {
4335
5060
  success: [],
@@ -4353,7 +5078,7 @@ var fetchBalances8 = async ({
4353
5078
  address: def.address,
4354
5079
  networkId,
4355
5080
  tokenId: def.token.id,
4356
- source: MODULE_TYPE8,
5081
+ source: MODULE_TYPE9,
4357
5082
  status: "live",
4358
5083
  values: [
4359
5084
  { type: "free", label: "free", amount: "0" },
@@ -4371,9 +5096,9 @@ import {
4371
5096
  SubForeignAssetsTokenSchema as SubForeignAssetsTokenSchema2,
4372
5097
  subForeignAssetTokenId
4373
5098
  } from "@talismn/chaindata-provider";
4374
- import { getStorageKeyPrefix as getStorageKeyPrefix3, papiStringify, parseMetadataRpc as parseMetadataRpc10 } from "@talismn/scale";
4375
- import { assign as assign7, keyBy as keyBy5, keys as keys2 } from "lodash-es";
4376
- var fetchTokens8 = async ({
5099
+ import { getStorageKeyPrefix as getStorageKeyPrefix3, papiStringify, parseMetadataRpc as parseMetadataRpc11 } from "@talismn/scale";
5100
+ import { assign as assign8, keyBy as keyBy6, keys as keys2 } from "lodash-es";
5101
+ var fetchTokens9 = async ({
4377
5102
  networkId,
4378
5103
  tokens,
4379
5104
  connector,
@@ -4381,7 +5106,7 @@ var fetchTokens8 = async ({
4381
5106
  }) => {
4382
5107
  const anyMiniMetadata = miniMetadata;
4383
5108
  if (!anyMiniMetadata?.data) return [];
4384
- const { builder } = parseMetadataRpc10(anyMiniMetadata.data);
5109
+ const { builder } = parseMetadataRpc11(anyMiniMetadata.data);
4385
5110
  const assetCodec = builder.buildStorage("ForeignAssets", "Asset");
4386
5111
  const metadataCodec = builder.buildStorage("ForeignAssets", "Metadata");
4387
5112
  const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([
@@ -4398,7 +5123,7 @@ var fetchTokens8 = async ({
4398
5123
  ]);
4399
5124
  const assetStorageEntries = assetStorageResults[0]?.changes ?? [];
4400
5125
  const metadataStorageEntries = metadataStorageResults[0]?.changes ?? [];
4401
- const assetByOnChainId = keyBy5(
5126
+ const assetByOnChainId = keyBy6(
4402
5127
  assetStorageEntries.map(([key, value]) => {
4403
5128
  const [decodedKey] = assetCodec.keys.dec(key);
4404
5129
  const onChainId = papiStringify(decodedKey);
@@ -4407,7 +5132,7 @@ var fetchTokens8 = async ({
4407
5132
  }),
4408
5133
  (a) => a.onChainId
4409
5134
  );
4410
- const metadataByOnChainId = keyBy5(
5135
+ const metadataByOnChainId = keyBy6(
4411
5136
  metadataStorageEntries.map(([key, value]) => {
4412
5137
  const [decodedKey] = metadataCodec.keys.dec(key);
4413
5138
  const onChainId = papiStringify(decodedKey);
@@ -4423,13 +5148,13 @@ var fetchTokens8 = async ({
4423
5148
  (a) => a.onChainId
4424
5149
  );
4425
5150
  const allTokens = keys2(assetByOnChainId).map(
4426
- (onChainId) => assign7({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? void 0)
5151
+ (onChainId) => assign8({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? void 0)
4427
5152
  );
4428
- const configTokenByOnChainId = keyBy5(tokens, (t) => t.onChainId);
5153
+ const configTokenByOnChainId = keyBy6(tokens, (t) => t.onChainId);
4429
5154
  return allTokens.map(
4430
5155
  (asset) => ({
4431
5156
  id: subForeignAssetTokenId(networkId, asset.onChainId),
4432
- type: MODULE_TYPE8,
5157
+ type: MODULE_TYPE9,
4433
5158
  platform: "polkadot",
4434
5159
  networkId,
4435
5160
  onChainId: String(asset.onChainId),
@@ -4446,7 +5171,7 @@ var fetchTokens8 = async ({
4446
5171
  return configToken || token.isSufficient;
4447
5172
  }).map((token) => {
4448
5173
  const configToken = configTokenByOnChainId[token.onChainId];
4449
- return configToken ? assign7({}, token, configToken) : token;
5174
+ return configToken ? assign8({}, token, configToken) : token;
4450
5175
  }).filter((t) => {
4451
5176
  const parsed = SubForeignAssetsTokenSchema2.safeParse(t);
4452
5177
  return parsed.success;
@@ -4455,13 +5180,13 @@ var fetchTokens8 = async ({
4455
5180
 
4456
5181
  // src/modules/substrate-foreignassets/getMiniMetadata.ts
4457
5182
  import { MINIMETADATA_VERSION as MINIMETADATA_VERSION4 } from "@talismn/chaindata-provider";
4458
- import { compactMetadata as compactMetadata3, encodeMetadata as encodeMetadata3, parseMetadataRpc as parseMetadataRpc11 } from "@talismn/scale";
4459
- var getMiniMetadata8 = ({
5183
+ import { compactMetadata as compactMetadata3, encodeMetadata as encodeMetadata3, parseMetadataRpc as parseMetadataRpc12 } from "@talismn/scale";
5184
+ var getMiniMetadata9 = ({
4460
5185
  networkId,
4461
5186
  specVersion,
4462
5187
  metadataRpc
4463
5188
  }) => {
4464
- const source = MODULE_TYPE8;
5189
+ const source = MODULE_TYPE9;
4465
5190
  const chainId = networkId;
4466
5191
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
4467
5192
  if (specVersion !== systemVersion.spec_version)
@@ -4469,7 +5194,7 @@ var getMiniMetadata8 = ({
4469
5194
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
4470
5195
  );
4471
5196
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
4472
- const { unifiedMetadata } = parseMetadataRpc11(metadataRpc);
5197
+ const { unifiedMetadata } = parseMetadataRpc12(metadataRpc);
4473
5198
  if (unifiedMetadata.version < 14)
4474
5199
  throw new Error(
4475
5200
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -4485,7 +5210,7 @@ var getMiniMetadata8 = ({
4485
5210
  };
4486
5211
  };
4487
5212
  var getData3 = (metadataRpc) => {
4488
- const { metadata, unifiedMetadata } = parseMetadataRpc11(metadataRpc);
5213
+ const { metadata, unifiedMetadata } = parseMetadataRpc12(metadataRpc);
4489
5214
  if (!hasStorageItems(unifiedMetadata, "ForeignAssets", ["Account", "Asset", "Metadata"]))
4490
5215
  return null;
4491
5216
  compactMetadata3(metadata, [{ pallet: "ForeignAssets", items: ["Account", "Asset", "Metadata"] }]);
@@ -4494,10 +5219,10 @@ var getData3 = (metadataRpc) => {
4494
5219
 
4495
5220
  // src/modules/substrate-foreignassets/getTransferCallData.ts
4496
5221
  import { mergeUint8 as mergeUint83 } from "@polkadot-api/utils";
4497
- import { isTokenOfType as isTokenOfType8 } from "@talismn/chaindata-provider";
4498
- import { papiParse as papiParse2, parseMetadataRpc as parseMetadataRpc12 } from "@talismn/scale";
5222
+ import { isTokenOfType as isTokenOfType9 } from "@talismn/chaindata-provider";
5223
+ import { papiParse as papiParse2, parseMetadataRpc as parseMetadataRpc13 } from "@talismn/scale";
4499
5224
  import { Binary as Binary3, Enum as Enum2 } from "polkadot-api";
4500
- var getTransferCallData8 = ({
5225
+ var getTransferCallData9 = ({
4501
5226
  from: from2,
4502
5227
  to,
4503
5228
  value,
@@ -4505,9 +5230,9 @@ var getTransferCallData8 = ({
4505
5230
  type,
4506
5231
  metadataRpc
4507
5232
  }) => {
4508
- if (!isTokenOfType8(token, MODULE_TYPE8))
4509
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE8}.`);
4510
- const { builder } = parseMetadataRpc12(metadataRpc);
5233
+ if (!isTokenOfType9(token, MODULE_TYPE9))
5234
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE9}.`);
5235
+ const { builder } = parseMetadataRpc13(metadataRpc);
4511
5236
  const method = getTransferMethod2(type);
4512
5237
  const { codec, location } = builder.buildCall("ForeignAssets", method);
4513
5238
  const args = getEncodedArgs2(method, token.onChainId, to, value, codec);
@@ -4585,14 +5310,14 @@ var getTransferAllEncodedArgs2 = (onChainId, to, codec) => {
4585
5310
  };
4586
5311
 
4587
5312
  // src/modules/substrate-foreignassets/subscribeBalances.ts
4588
- import { map as map3, of as of9 } from "rxjs";
4589
- var subscribeBalances8 = ({
5313
+ import { map as map3, of as of10 } from "rxjs";
5314
+ var subscribeBalances9 = ({
4590
5315
  networkId,
4591
5316
  tokensWithAddresses,
4592
5317
  connector,
4593
5318
  miniMetadata
4594
5319
  }) => {
4595
- if (!tokensWithAddresses.length) return of9({ success: [], errors: [] });
5320
+ if (!tokensWithAddresses.length) return of10({ success: [], errors: [] });
4596
5321
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
4597
5322
  const queries = buildQueries2(networkId, balanceDefs, miniMetadata);
4598
5323
  return getRpcQueryPack$(connector, networkId, queries).pipe(
@@ -4605,31 +5330,31 @@ var subscribeBalances8 = ({
4605
5330
 
4606
5331
  // src/modules/substrate-foreignassets/module.ts
4607
5332
  var SubForeignAssetsBalanceModule = {
4608
- type: MODULE_TYPE8,
4609
- platform: PLATFORM8,
4610
- getMiniMetadata: getMiniMetadata8,
4611
- fetchTokens: fetchTokens8,
4612
- fetchBalances: fetchBalances8,
4613
- subscribeBalances: subscribeBalances8,
4614
- getTransferCallData: getTransferCallData8
5333
+ type: MODULE_TYPE9,
5334
+ platform: PLATFORM9,
5335
+ getMiniMetadata: getMiniMetadata9,
5336
+ fetchTokens: fetchTokens9,
5337
+ fetchBalances: fetchBalances9,
5338
+ subscribeBalances: subscribeBalances9,
5339
+ getTransferCallData: getTransferCallData9
4615
5340
  };
4616
5341
 
4617
5342
  // src/modules/substrate-foreignassets/types.ts
4618
5343
  import { SubForeignAssetsTokenSchema as SubForeignAssetsTokenSchema3 } from "@talismn/chaindata-provider";
4619
- import z11 from "zod/v4";
4620
- var SubForeignAssetsTokenConfigSchema = z11.strictObject({
5344
+ import z13 from "zod/v4";
5345
+ var SubForeignAssetsTokenConfigSchema = z13.strictObject({
4621
5346
  onChainId: SubForeignAssetsTokenSchema3.shape.onChainId,
4622
5347
  ...TokenConfigBaseSchema.shape
4623
5348
  });
4624
5349
 
4625
5350
  // src/modules/substrate-hydration/config.ts
4626
5351
  import { SubHydrationTokenSchema } from "@talismn/chaindata-provider";
4627
- var MODULE_TYPE9 = SubHydrationTokenSchema.shape.type.value;
4628
- var PLATFORM9 = SubHydrationTokenSchema.shape.platform.value;
5352
+ var MODULE_TYPE10 = SubHydrationTokenSchema.shape.type.value;
5353
+ var PLATFORM10 = SubHydrationTokenSchema.shape.platform.value;
4629
5354
 
4630
5355
  // src/modules/substrate-hydration/fetchBalances.ts
4631
- import { keyBy as keyBy6, uniq as uniq4 } from "lodash-es";
4632
- var fetchBalances9 = async ({
5356
+ import { keyBy as keyBy7, uniq as uniq5 } from "lodash-es";
5357
+ var fetchBalances10 = async ({
4633
5358
  networkId,
4634
5359
  tokensWithAddresses,
4635
5360
  connector,
@@ -4638,7 +5363,7 @@ var fetchBalances9 = async ({
4638
5363
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
4639
5364
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
4640
5365
  if (!miniMetadata?.data) {
4641
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE9} balances on ${networkId}.`, {
5366
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE10} balances on ${networkId}.`, {
4642
5367
  tokensWithAddresses
4643
5368
  });
4644
5369
  return {
@@ -4650,20 +5375,20 @@ var fetchBalances9 = async ({
4650
5375
  }))
4651
5376
  };
4652
5377
  }
4653
- if (miniMetadata.source !== MODULE_TYPE9) {
4654
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE9}.`);
5378
+ if (miniMetadata.source !== MODULE_TYPE10) {
5379
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE10}.`);
4655
5380
  return {
4656
5381
  success: [],
4657
5382
  errors: balanceDefs.map((def) => ({
4658
5383
  tokenId: def.token.id,
4659
5384
  address: def.address,
4660
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE9}`)
5385
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE10}`)
4661
5386
  }))
4662
5387
  };
4663
5388
  }
4664
5389
  if (miniMetadata.chainId !== networkId) {
4665
5390
  log_default.warn(
4666
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE9}. Expected chainId is ${networkId}`
5391
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE10}. Expected chainId is ${networkId}`
4667
5392
  );
4668
5393
  return {
4669
5394
  success: [],
@@ -4674,7 +5399,7 @@ var fetchBalances9 = async ({
4674
5399
  }))
4675
5400
  };
4676
5401
  }
4677
- const addresses = uniq4(balanceDefs.map((def) => def.address));
5402
+ const addresses = uniq5(balanceDefs.map((def) => def.address));
4678
5403
  try {
4679
5404
  const res = await Promise.all(
4680
5405
  addresses.map(
@@ -4690,16 +5415,16 @@ var fetchBalances9 = async ({
4690
5415
  frozen: balance.frozen.toString()
4691
5416
  })).filter((b) => b.onChainId !== void 0);
4692
5417
  });
4693
- const balancesByKey = keyBy6(fetchedBalances, (b) => `${b.address}:${b.onChainId}`);
5418
+ const balancesByKey = keyBy7(fetchedBalances, (b) => `${b.address}:${b.onChainId}`);
4694
5419
  const success = tokensWithAddresses.reduce((acc, [token, addresses2]) => {
4695
- if (token.type === MODULE_TYPE9)
5420
+ if (token.type === MODULE_TYPE10)
4696
5421
  for (const address of addresses2) {
4697
5422
  const rawBalance = balancesByKey[`${address}:${token.onChainId}`];
4698
5423
  const balance = {
4699
5424
  address,
4700
5425
  networkId,
4701
5426
  tokenId: token.id,
4702
- source: MODULE_TYPE9,
5427
+ source: MODULE_TYPE10,
4703
5428
  status: "live",
4704
5429
  values: [
4705
5430
  {
@@ -4746,9 +5471,9 @@ import {
4746
5471
  SubHydrationTokenSchema as SubHydrationTokenSchema2,
4747
5472
  subHydrationTokenId
4748
5473
  } from "@talismn/chaindata-provider";
4749
- import { getStorageKeyPrefix as getStorageKeyPrefix4, parseMetadataRpc as parseMetadataRpc13 } from "@talismn/scale";
4750
- import { assign as assign8, keyBy as keyBy7 } from "lodash-es";
4751
- var fetchTokens9 = async ({
5474
+ import { getStorageKeyPrefix as getStorageKeyPrefix4, parseMetadataRpc as parseMetadataRpc14 } from "@talismn/scale";
5475
+ import { assign as assign9, keyBy as keyBy8 } from "lodash-es";
5476
+ var fetchTokens10 = async ({
4752
5477
  networkId,
4753
5478
  tokens,
4754
5479
  connector,
@@ -4756,7 +5481,7 @@ var fetchTokens9 = async ({
4756
5481
  }) => {
4757
5482
  const anyMiniMetadata = miniMetadata;
4758
5483
  if (!anyMiniMetadata?.data) return [];
4759
- const { builder } = parseMetadataRpc13(anyMiniMetadata.data);
5484
+ const { builder } = parseMetadataRpc14(anyMiniMetadata.data);
4760
5485
  const assetsCodec = builder.buildStorage("AssetRegistry", "Assets");
4761
5486
  const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [
4762
5487
  getStorageKeyPrefix4("AssetRegistry", "Assets")
@@ -4767,7 +5492,7 @@ var fetchTokens9 = async ({
4767
5492
  [allAssetStorageKeys]
4768
5493
  );
4769
5494
  const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
4770
- const configTokenByAssetId = keyBy7(tokens, (t) => t.onChainId);
5495
+ const configTokenByAssetId = keyBy8(tokens, (t) => t.onChainId);
4771
5496
  return assetStorageEntries.map(([key, value]) => {
4772
5497
  const [onChainId] = assetsCodec.keys.dec(key);
4773
5498
  const asset = assetsCodec.value.dec(value);
@@ -4783,7 +5508,7 @@ var fetchTokens9 = async ({
4783
5508
  }).map(
4784
5509
  (asset) => ({
4785
5510
  id: subHydrationTokenId(networkId, asset.onChainId),
4786
- type: MODULE_TYPE9,
5511
+ type: MODULE_TYPE10,
4787
5512
  platform: "polkadot",
4788
5513
  networkId,
4789
5514
  onChainId: asset.onChainId,
@@ -4801,7 +5526,7 @@ var fetchTokens9 = async ({
4801
5526
  return configToken || token.isSufficient;
4802
5527
  }).map((token) => {
4803
5528
  const configToken = configTokenByAssetId[token.onChainId];
4804
- return configToken ? assign8({}, token, configToken) : token;
5529
+ return configToken ? assign9({}, token, configToken) : token;
4805
5530
  }).filter((t) => {
4806
5531
  const parsed = SubHydrationTokenSchema2.safeParse(t);
4807
5532
  return parsed.success;
@@ -4810,13 +5535,13 @@ var fetchTokens9 = async ({
4810
5535
 
4811
5536
  // src/modules/substrate-hydration/getMiniMetadata.ts
4812
5537
  import { MINIMETADATA_VERSION as MINIMETADATA_VERSION5 } from "@talismn/chaindata-provider";
4813
- import { compactMetadata as compactMetadata4, encodeMetadata as encodeMetadata4, parseMetadataRpc as parseMetadataRpc14 } from "@talismn/scale";
4814
- var getMiniMetadata9 = ({
5538
+ import { compactMetadata as compactMetadata4, encodeMetadata as encodeMetadata4, parseMetadataRpc as parseMetadataRpc15 } from "@talismn/scale";
5539
+ var getMiniMetadata10 = ({
4815
5540
  networkId,
4816
5541
  specVersion,
4817
5542
  metadataRpc
4818
5543
  }) => {
4819
- const source = MODULE_TYPE9;
5544
+ const source = MODULE_TYPE10;
4820
5545
  const chainId = networkId;
4821
5546
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
4822
5547
  if (specVersion !== systemVersion.spec_version)
@@ -4824,7 +5549,7 @@ var getMiniMetadata9 = ({
4824
5549
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
4825
5550
  );
4826
5551
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
4827
- const { unifiedMetadata } = parseMetadataRpc14(metadataRpc);
5552
+ const { unifiedMetadata } = parseMetadataRpc15(metadataRpc);
4828
5553
  if (unifiedMetadata.version < 14)
4829
5554
  throw new Error(
4830
5555
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -4840,7 +5565,7 @@ var getMiniMetadata9 = ({
4840
5565
  };
4841
5566
  };
4842
5567
  var getData4 = (metadataRpc) => {
4843
- const { metadata, unifiedMetadata } = parseMetadataRpc14(metadataRpc);
5568
+ const { metadata, unifiedMetadata } = parseMetadataRpc15(metadataRpc);
4844
5569
  if (!hasStorageItem(unifiedMetadata, "AssetRegistry", "Assets") || !hasStorageItem(unifiedMetadata, "Tokens", "Accounts") || !hasRuntimeApi(unifiedMetadata, "CurrenciesApi", "accounts"))
4845
5570
  return null;
4846
5571
  compactMetadata4(
@@ -4863,19 +5588,19 @@ var getData4 = (metadataRpc) => {
4863
5588
 
4864
5589
  // src/modules/substrate-hydration/getTransferCallData.ts
4865
5590
  import { mergeUint8 as mergeUint84 } from "@polkadot-api/utils";
4866
- import { isTokenOfType as isTokenOfType9 } from "@talismn/chaindata-provider";
4867
- import { parseMetadataRpc as parseMetadataRpc15 } from "@talismn/scale";
5591
+ import { isTokenOfType as isTokenOfType10 } from "@talismn/chaindata-provider";
5592
+ import { parseMetadataRpc as parseMetadataRpc16 } from "@talismn/scale";
4868
5593
  import { Binary as Binary4 } from "polkadot-api";
4869
- var getTransferCallData9 = ({
5594
+ var getTransferCallData10 = ({
4870
5595
  from: from2,
4871
5596
  to,
4872
5597
  value,
4873
5598
  token,
4874
5599
  metadataRpc
4875
5600
  }) => {
4876
- if (!isTokenOfType9(token, MODULE_TYPE9))
4877
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE9}.`);
4878
- const { builder } = parseMetadataRpc15(metadataRpc);
5601
+ if (!isTokenOfType10(token, MODULE_TYPE10))
5602
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE10}.`);
5603
+ const { builder } = parseMetadataRpc16(metadataRpc);
4879
5604
  const { codec, location } = builder.buildCall("Currencies", "transfer");
4880
5605
  const args = {
4881
5606
  dest: to,
@@ -4890,22 +5615,22 @@ var getTransferCallData9 = ({
4890
5615
  };
4891
5616
 
4892
5617
  // src/modules/substrate-hydration/subscribeBalances.ts
4893
- import { isEqual as isEqual8 } from "lodash-es";
4894
- import { distinctUntilChanged as distinctUntilChanged8, Observable as Observable8, of as of10 } from "rxjs";
4895
- var SUBSCRIPTION_INTERVAL7 = 6e3;
4896
- var subscribeBalances9 = ({
5618
+ import { isEqual as isEqual9 } from "lodash-es";
5619
+ import { distinctUntilChanged as distinctUntilChanged9, Observable as Observable9, of as of11 } from "rxjs";
5620
+ var SUBSCRIPTION_INTERVAL8 = 6e3;
5621
+ var subscribeBalances10 = ({
4897
5622
  networkId,
4898
5623
  tokensWithAddresses,
4899
5624
  connector,
4900
5625
  miniMetadata
4901
5626
  }) => {
4902
- if (!tokensWithAddresses.length) return of10({ success: [], errors: [] });
4903
- return new Observable8((subscriber) => {
5627
+ if (!tokensWithAddresses.length) return of11({ success: [], errors: [] });
5628
+ return new Observable9((subscriber) => {
4904
5629
  const abortController = new AbortController();
4905
5630
  const poll = async () => {
4906
5631
  try {
4907
5632
  if (abortController.signal.aborted) return;
4908
- const balances = await fetchBalances9({
5633
+ const balances = await fetchBalances10({
4909
5634
  networkId,
4910
5635
  tokensWithAddresses,
4911
5636
  connector,
@@ -4913,10 +5638,10 @@ var subscribeBalances9 = ({
4913
5638
  });
4914
5639
  if (abortController.signal.aborted) return;
4915
5640
  subscriber.next(balances);
4916
- setTimeout(poll, SUBSCRIPTION_INTERVAL7);
5641
+ setTimeout(poll, SUBSCRIPTION_INTERVAL8);
4917
5642
  } catch (error) {
4918
5643
  log_default.error("Error", {
4919
- module: MODULE_TYPE9,
5644
+ module: MODULE_TYPE10,
4920
5645
  networkId,
4921
5646
  miniMetadata,
4922
5647
  addressesByToken: tokensWithAddresses,
@@ -4929,36 +5654,36 @@ var subscribeBalances9 = ({
4929
5654
  return () => {
4930
5655
  abortController.abort();
4931
5656
  };
4932
- }).pipe(distinctUntilChanged8(isEqual8));
5657
+ }).pipe(distinctUntilChanged9(isEqual9));
4933
5658
  };
4934
5659
 
4935
5660
  // src/modules/substrate-hydration/module.ts
4936
5661
  var SubHydrationBalanceModule = {
4937
- type: MODULE_TYPE9,
4938
- platform: PLATFORM9,
4939
- getMiniMetadata: getMiniMetadata9,
4940
- fetchTokens: fetchTokens9,
4941
- fetchBalances: fetchBalances9,
4942
- subscribeBalances: subscribeBalances9,
4943
- getTransferCallData: getTransferCallData9
5662
+ type: MODULE_TYPE10,
5663
+ platform: PLATFORM10,
5664
+ getMiniMetadata: getMiniMetadata10,
5665
+ fetchTokens: fetchTokens10,
5666
+ fetchBalances: fetchBalances10,
5667
+ subscribeBalances: subscribeBalances10,
5668
+ getTransferCallData: getTransferCallData10
4944
5669
  };
4945
5670
 
4946
5671
  // src/modules/substrate-hydration/types.ts
4947
5672
  import { SubHydrationTokenSchema as SubHydrationTokenSchema3 } from "@talismn/chaindata-provider";
4948
- import z12 from "zod/v4";
4949
- var SubHydrationTokenConfigSchema = z12.strictObject({
5673
+ import z14 from "zod/v4";
5674
+ var SubHydrationTokenConfigSchema = z14.strictObject({
4950
5675
  onChainId: SubHydrationTokenSchema3.shape.onChainId,
4951
5676
  ...TokenConfigBaseSchema.shape
4952
5677
  });
4953
5678
 
4954
5679
  // src/modules/substrate-native/config.ts
4955
5680
  import { SubNativeTokenSchema } from "@talismn/chaindata-provider";
4956
- var MODULE_TYPE10 = SubNativeTokenSchema.shape.type.value;
4957
- var PLATFORM10 = SubNativeTokenSchema.shape.platform.value;
5681
+ var MODULE_TYPE11 = SubNativeTokenSchema.shape.type.value;
5682
+ var PLATFORM11 = SubNativeTokenSchema.shape.platform.value;
4958
5683
 
4959
5684
  // src/modules/substrate-native/queries/buildBaseQueries.ts
4960
- import { decodeScale as decodeScale4 } from "@talismn/scale";
4961
- import { isNotNil as isNotNil7 } from "@talismn/util";
5685
+ import { decodeScale as decodeScale5 } from "@talismn/scale";
5686
+ import { isNotNil as isNotNil8 } from "@talismn/util";
4962
5687
 
4963
5688
  // src/modules/substrate-native/util/lockTypes.ts
4964
5689
  import upperFirst from "lodash-es/upperFirst";
@@ -5119,10 +5844,10 @@ var buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
5119
5844
  return { balance, nomPoolMemberInfo };
5120
5845
  }
5121
5846
  };
5122
- }).filter(isNotNil7);
5847
+ }).filter(isNotNil8);
5123
5848
  };
5124
5849
  var decodeBaseResult = (coder, value, networkId) => {
5125
- const decoded = decodeScale4(
5850
+ const decoded = decodeScale5(
5126
5851
  coder,
5127
5852
  value,
5128
5853
  `Failed to decode base native balance on chain ${networkId}`
@@ -5142,7 +5867,7 @@ var decodeBaseResult = (coder, value, networkId) => {
5142
5867
  return newValues;
5143
5868
  };
5144
5869
  var decodeLocksResult = (coder, value, networkId) => {
5145
- const decoded = decodeScale4(
5870
+ const decoded = decodeScale5(
5146
5871
  coder,
5147
5872
  value,
5148
5873
  `Failed to decode lock on chain ${networkId}`
@@ -5157,7 +5882,7 @@ var decodeLocksResult = (coder, value, networkId) => {
5157
5882
  return locksQueryLocks;
5158
5883
  };
5159
5884
  var decodeFreezesResult = (coder, value, networkId) => {
5160
- const decoded = decodeScale4(
5885
+ const decoded = decodeScale5(
5161
5886
  coder,
5162
5887
  value,
5163
5888
  `Failed to decode freeze on chain ${networkId}`
@@ -5171,7 +5896,7 @@ var decodeFreezesResult = (coder, value, networkId) => {
5171
5896
  return freezesValues;
5172
5897
  };
5173
5898
  var decodeHoldsResult = (coder, value, networkId) => {
5174
- const decoded = decodeScale4(
5899
+ const decoded = decodeScale5(
5175
5900
  coder,
5176
5901
  value,
5177
5902
  `Failed to decode holds on chain ${networkId}`
@@ -5187,7 +5912,7 @@ var decodeHoldsResult = (coder, value, networkId) => {
5187
5912
  return holdsValues;
5188
5913
  };
5189
5914
  var decodeStakingLedgerResult = (coder, value, networkId) => {
5190
- const decoded = decodeScale4(
5915
+ const decoded = decodeScale5(
5191
5916
  coder,
5192
5917
  value,
5193
5918
  `Failed to decode unbonding query on chain ${networkId}`
@@ -5204,7 +5929,7 @@ var decodeStakingLedgerResult = (coder, value, networkId) => {
5204
5929
  return stakingLedgerResults;
5205
5930
  };
5206
5931
  var decodePoolMemberResult = (coder, value, networkId) => {
5207
- const decoded = decodeScale4(
5932
+ const decoded = decodeScale5(
5208
5933
  coder,
5209
5934
  value,
5210
5935
  `Failed to decode poolMembers on chain ${networkId}`
@@ -5226,7 +5951,7 @@ var decodePoolMemberResult = (coder, value, networkId) => {
5226
5951
  };
5227
5952
 
5228
5953
  // src/modules/substrate-native/queries/buildNomPoolQueries.ts
5229
- import { decodeScale as decodeScale5 } from "@talismn/scale";
5954
+ import { decodeScale as decodeScale6 } from "@talismn/scale";
5230
5955
 
5231
5956
  // src/modules/substrate-native/util/nompoolAccountId.ts
5232
5957
  import { mergeUint8 as mergeUint85 } from "@polkadot-api/utils";
@@ -5319,7 +6044,7 @@ var getNomPoolCoders = (networkId, miniMetadata) => {
5319
6044
  });
5320
6045
  };
5321
6046
  var decodePoolPoints = (coder, value, networkId) => {
5322
- const decoded = decodeScale5(
6047
+ const decoded = decodeScale6(
5323
6048
  coder,
5324
6049
  value,
5325
6050
  `Failed to decode bondedPools on chain ${networkId}`
@@ -5327,7 +6052,7 @@ var decodePoolPoints = (coder, value, networkId) => {
5327
6052
  return { poolPoints: decoded?.points.toString() };
5328
6053
  };
5329
6054
  var decodePoolStake = (coder, value, networkId) => {
5330
- const decoded = decodeScale5(
6055
+ const decoded = decodeScale6(
5331
6056
  coder,
5332
6057
  value,
5333
6058
  `Failed to decode ledger on chain ${networkId}`
@@ -5335,7 +6060,7 @@ var decodePoolStake = (coder, value, networkId) => {
5335
6060
  return { poolTotalActiveStake: decoded?.active.toString() };
5336
6061
  };
5337
6062
  var decodePoolMeta = (coder, value, networkId) => {
5338
- const decoded = decodeScale5(
6063
+ const decoded = decodeScale6(
5339
6064
  coder,
5340
6065
  value,
5341
6066
  `Failed to decode metadata on chain ${networkId}`
@@ -5359,11 +6084,11 @@ var getNomPoolStateKeys = (coders, nomPoolMemberInfo, extra) => {
5359
6084
  };
5360
6085
 
5361
6086
  // src/modules/substrate-native/fetchBalances.ts
5362
- var fetchBalances10 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
6087
+ var fetchBalances11 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
5363
6088
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
5364
6089
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
5365
6090
  if (!miniMetadata?.data) {
5366
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE10} balances on ${networkId}.`);
6091
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE11} balances on ${networkId}.`);
5367
6092
  return {
5368
6093
  success: [],
5369
6094
  errors: balanceDefs.map((def) => ({
@@ -5373,20 +6098,20 @@ var fetchBalances10 = async ({ networkId, tokensWithAddresses, connector, miniMe
5373
6098
  }))
5374
6099
  };
5375
6100
  }
5376
- if (miniMetadata.source !== MODULE_TYPE10) {
5377
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE10}.`);
6101
+ if (miniMetadata.source !== MODULE_TYPE11) {
6102
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE11}.`);
5378
6103
  return {
5379
6104
  success: [],
5380
6105
  errors: balanceDefs.map((def) => ({
5381
6106
  tokenId: def.token.id,
5382
6107
  address: def.address,
5383
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE10}`)
6108
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE11}`)
5384
6109
  }))
5385
6110
  };
5386
6111
  }
5387
6112
  if (miniMetadata.chainId !== networkId) {
5388
6113
  log_default.warn(
5389
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE10}. Expected chainId is ${networkId}`
6114
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE11}. Expected chainId is ${networkId}`
5390
6115
  );
5391
6116
  return {
5392
6117
  success: [],
@@ -5409,9 +6134,9 @@ import {
5409
6134
  SubNativeTokenSchema as SubNativeTokenSchema2,
5410
6135
  subNativeTokenId as subNativeTokenId2
5411
6136
  } from "@talismn/chaindata-provider";
5412
- import { assign as assign9 } from "lodash-es";
5413
- import z13 from "zod/v4";
5414
- var fetchTokens10 = async ({ networkId, tokens, connector, miniMetadata }) => {
6137
+ import { assign as assign10 } from "lodash-es";
6138
+ import z15 from "zod/v4";
6139
+ var fetchTokens11 = async ({ networkId, tokens, connector, miniMetadata }) => {
5415
6140
  if (miniMetadata.extra.disable) return [];
5416
6141
  const { tokenSymbol: symbol, tokenDecimals: decimals } = await getChainProperties(
5417
6142
  connector,
@@ -5431,22 +6156,22 @@ var fetchTokens10 = async ({ networkId, tokens, connector, miniMetadata }) => {
5431
6156
  decimals,
5432
6157
  existentialDeposit: miniMetadata.extra.existentialDeposit ?? "0"
5433
6158
  };
5434
- const token = assign9(nativeToken, tokenConfig);
6159
+ const token = assign10(nativeToken, tokenConfig);
5435
6160
  const parsed = SubNativeTokenSchema2.safeParse(token);
5436
6161
  if (!parsed.success) {
5437
6162
  return [];
5438
6163
  }
5439
6164
  return [parsed.data];
5440
6165
  };
5441
- var DotNetworkPropertiesSimple = z13.object({
5442
- tokenDecimals: z13.number().optional().default(0),
5443
- tokenSymbol: z13.string().optional().default("Unit")
6166
+ var DotNetworkPropertiesSimple = z15.object({
6167
+ tokenDecimals: z15.number().optional().default(0),
6168
+ tokenSymbol: z15.string().optional().default("Unit")
5444
6169
  });
5445
- var DotNetworkPropertiesArray = z13.object({
5446
- tokenDecimals: z13.array(z13.number()).nonempty(),
5447
- tokenSymbol: z13.array(z13.string()).nonempty()
6170
+ var DotNetworkPropertiesArray = z15.object({
6171
+ tokenDecimals: z15.array(z15.number()).nonempty(),
6172
+ tokenSymbol: z15.array(z15.string()).nonempty()
5448
6173
  });
5449
- var DotNetworkPropertiesSchema = z13.union([DotNetworkPropertiesSimple, DotNetworkPropertiesArray]).transform((val) => ({
6174
+ var DotNetworkPropertiesSchema = z15.union([DotNetworkPropertiesSimple, DotNetworkPropertiesArray]).transform((val) => ({
5450
6175
  tokenDecimals: Array.isArray(val.tokenDecimals) ? val.tokenDecimals[0] : val.tokenDecimals,
5451
6176
  tokenSymbol: Array.isArray(val.tokenSymbol) ? val.tokenSymbol[0] : val.tokenSymbol
5452
6177
  }));
@@ -5457,9 +6182,9 @@ var getChainProperties = async (connector, networkId) => {
5457
6182
 
5458
6183
  // src/modules/substrate-native/getMiniMetadata.ts
5459
6184
  import { MINIMETADATA_VERSION as MINIMETADATA_VERSION6 } from "@talismn/chaindata-provider";
5460
- import { compactMetadata as compactMetadata5, encodeMetadata as encodeMetadata5, parseMetadataRpc as parseMetadataRpc16 } from "@talismn/scale";
5461
- var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
5462
- const source = MODULE_TYPE10;
6185
+ import { compactMetadata as compactMetadata5, encodeMetadata as encodeMetadata5, parseMetadataRpc as parseMetadataRpc17 } from "@talismn/scale";
6186
+ var getMiniMetadata11 = ({ networkId, specVersion, metadataRpc, config }) => {
6187
+ const source = MODULE_TYPE11;
5463
6188
  const chainId = networkId;
5464
6189
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
5465
6190
  if (specVersion !== systemVersion.spec_version)
@@ -5467,7 +6192,7 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
5467
6192
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
5468
6193
  );
5469
6194
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
5470
- const { metadata, unifiedMetadata } = parseMetadataRpc16(metadataRpc);
6195
+ const { metadata, unifiedMetadata } = parseMetadataRpc17(metadataRpc);
5471
6196
  if (unifiedMetadata.version < 14)
5472
6197
  throw new Error(
5473
6198
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -5519,12 +6244,12 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
5519
6244
 
5520
6245
  // src/modules/substrate-native/getTransferCallData.ts
5521
6246
  import { mergeUint8 as mergeUint86 } from "@polkadot-api/utils";
5522
- import { isTokenOfType as isTokenOfType10 } from "@talismn/chaindata-provider";
6247
+ import { isTokenOfType as isTokenOfType11 } from "@talismn/chaindata-provider";
5523
6248
  import {
5524
- parseMetadataRpc as parseMetadataRpc17
6249
+ parseMetadataRpc as parseMetadataRpc18
5525
6250
  } from "@talismn/scale";
5526
6251
  import { Binary as Binary5, Enum as Enum3 } from "polkadot-api";
5527
- var getTransferCallData10 = ({
6252
+ var getTransferCallData11 = ({
5528
6253
  from: from2,
5529
6254
  to,
5530
6255
  value,
@@ -5532,9 +6257,9 @@ var getTransferCallData10 = ({
5532
6257
  type,
5533
6258
  metadataRpc
5534
6259
  }) => {
5535
- if (!isTokenOfType10(token, MODULE_TYPE10))
5536
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE10}.`);
5537
- const { unifiedMetadata, lookupFn, builder } = parseMetadataRpc17(metadataRpc);
6260
+ if (!isTokenOfType11(token, MODULE_TYPE11))
6261
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE11}.`);
6262
+ const { unifiedMetadata, lookupFn, builder } = parseMetadataRpc18(metadataRpc);
5538
6263
  const method = getTransferMethod3(type, unifiedMetadata, lookupFn);
5539
6264
  const { codec, location } = builder.buildCall("Balances", method);
5540
6265
  const args = getEncodedArgs3(method, to, value, codec);
@@ -5611,9 +6336,9 @@ var getTransferAllEncodedArgs3 = (to, codec) => {
5611
6336
  };
5612
6337
 
5613
6338
  // src/modules/substrate-native/subscribeBalances.ts
5614
- import { map as map4, of as of11, switchMap } from "rxjs";
5615
- var subscribeBalances10 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
5616
- if (!tokensWithAddresses.length) return of11({ success: [], errors: [] });
6339
+ import { map as map4, of as of12, switchMap } from "rxjs";
6340
+ var subscribeBalances11 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
6341
+ if (!tokensWithAddresses.length) return of12({ success: [], errors: [] });
5617
6342
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
5618
6343
  const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata);
5619
6344
  return getRpcQueryPack$(connector, networkId, baseQueries).pipe(
@@ -5630,34 +6355,34 @@ var subscribeBalances10 = ({ networkId, tokensWithAddresses, connector, miniMeta
5630
6355
 
5631
6356
  // src/modules/substrate-native/module.ts
5632
6357
  var SubNativeBalanceModule = {
5633
- type: MODULE_TYPE10,
5634
- platform: PLATFORM10,
5635
- getMiniMetadata: getMiniMetadata10,
5636
- fetchTokens: fetchTokens10,
5637
- fetchBalances: fetchBalances10,
5638
- subscribeBalances: subscribeBalances10,
5639
- getTransferCallData: getTransferCallData10
6358
+ type: MODULE_TYPE11,
6359
+ platform: PLATFORM11,
6360
+ getMiniMetadata: getMiniMetadata11,
6361
+ fetchTokens: fetchTokens11,
6362
+ fetchBalances: fetchBalances11,
6363
+ subscribeBalances: subscribeBalances11,
6364
+ getTransferCallData: getTransferCallData11
5640
6365
  };
5641
6366
 
5642
6367
  // src/modules/substrate-native/types.ts
5643
- import z14 from "zod/v4";
5644
- var SubNativeTokenConfigSchema = z14.strictObject({
6368
+ import z16 from "zod/v4";
6369
+ var SubNativeTokenConfigSchema = z16.strictObject({
5645
6370
  ...TokenConfigBaseSchema.shape
5646
6371
  });
5647
- var SubNativeModuleConfigSchema = z14.strictObject({
5648
- disable: z14.boolean().optional()
6372
+ var SubNativeModuleConfigSchema = z16.strictObject({
6373
+ disable: z16.boolean().optional()
5649
6374
  });
5650
- var SubNativeMiniMetadataExtraSchema = z14.strictObject({
5651
- disable: z14.boolean().optional(),
5652
- useLegacyTransferableCalculation: z14.boolean().optional(),
5653
- existentialDeposit: z14.string().optional(),
5654
- nominationPoolsPalletId: z14.string().optional()
6375
+ var SubNativeMiniMetadataExtraSchema = z16.strictObject({
6376
+ disable: z16.boolean().optional(),
6377
+ useLegacyTransferableCalculation: z16.boolean().optional(),
6378
+ existentialDeposit: z16.string().optional(),
6379
+ nominationPoolsPalletId: z16.string().optional()
5655
6380
  });
5656
6381
 
5657
6382
  // src/modules/substrate-psp22/config.ts
5658
6383
  import { SubPsp22TokenSchema } from "@talismn/chaindata-provider";
5659
- var MODULE_TYPE11 = SubPsp22TokenSchema.shape.type.value;
5660
- var PLATFORM11 = SubPsp22TokenSchema.shape.platform.value;
6384
+ var MODULE_TYPE12 = SubPsp22TokenSchema.shape.type.value;
6385
+ var PLATFORM12 = SubPsp22TokenSchema.shape.platform.value;
5661
6386
 
5662
6387
  // src/modules/substrate-psp22/fetchBalances.ts
5663
6388
  import { Abi } from "@polkadot/api-contract";
@@ -6661,7 +7386,17 @@ var psp22_default = {
6661
7386
  };
6662
7387
 
6663
7388
  // src/modules/substrate-psp22/util.ts
6664
- import { u8aConcatStrict, u8aToHex } from "@polkadot/util";
7389
+ var u8aToHex = (value) => `0x${Array.from(value, (b) => b.toString(16).padStart(2, "0")).join("")}`;
7390
+ var u8aConcatStrict = (arrays) => {
7391
+ const length = arrays.reduce((total, arr) => total + arr.length, 0);
7392
+ const result = new Uint8Array(length);
7393
+ let offset = 0;
7394
+ for (const arr of arrays) {
7395
+ result.set(arr, offset);
7396
+ offset += arr.length;
7397
+ }
7398
+ return result;
7399
+ };
6665
7400
  var makeContractCaller = ({
6666
7401
  chainConnector,
6667
7402
  chainId,
@@ -6690,7 +7425,7 @@ var makeContractCaller = ({
6690
7425
  );
6691
7426
 
6692
7427
  // src/modules/substrate-psp22/fetchBalances.ts
6693
- var fetchBalances11 = async ({
7428
+ var fetchBalances12 = async ({
6694
7429
  networkId,
6695
7430
  tokensWithAddresses,
6696
7431
  connector
@@ -6745,13 +7480,14 @@ var fetchBalances11 = async ({
6745
7480
  // src/modules/substrate-psp22/fetchTokens.ts
6746
7481
  import { Abi as Abi2 } from "@polkadot/api-contract";
6747
7482
  import { TypeRegistry as TypeRegistry2 } from "@polkadot/types";
6748
- import { hexToNumber, u8aToString } from "@polkadot/util";
6749
7483
  import {
6750
7484
  SubPsp22TokenSchema as SubPsp22TokenSchema2,
6751
7485
  subPsp22TokenId
6752
7486
  } from "@talismn/chaindata-provider";
6753
7487
  import { values } from "lodash-es";
6754
- var fetchTokens11 = async ({
7488
+ var hexToNumber = (hex) => Number(hex);
7489
+ var u8aToString = (value) => new TextDecoder().decode(value);
7490
+ var fetchTokens12 = async ({
6755
7491
  networkId,
6756
7492
  tokens,
6757
7493
  connector
@@ -6826,13 +7562,13 @@ var fetchTokens11 = async ({
6826
7562
 
6827
7563
  // src/modules/substrate-psp22/getMiniMetadata.ts
6828
7564
  import { MINIMETADATA_VERSION as MINIMETADATA_VERSION7 } from "@talismn/chaindata-provider";
6829
- import { parseMetadataRpc as parseMetadataRpc18 } from "@talismn/scale";
6830
- var getMiniMetadata11 = ({
7565
+ import { parseMetadataRpc as parseMetadataRpc19 } from "@talismn/scale";
7566
+ var getMiniMetadata12 = ({
6831
7567
  networkId,
6832
7568
  specVersion,
6833
7569
  metadataRpc
6834
7570
  }) => {
6835
- const source = MODULE_TYPE11;
7571
+ const source = MODULE_TYPE12;
6836
7572
  const chainId = networkId;
6837
7573
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
6838
7574
  if (specVersion !== systemVersion.spec_version)
@@ -6840,7 +7576,7 @@ var getMiniMetadata11 = ({
6840
7576
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
6841
7577
  );
6842
7578
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
6843
- const { unifiedMetadata } = parseMetadataRpc18(metadataRpc);
7579
+ const { unifiedMetadata } = parseMetadataRpc19(metadataRpc);
6844
7580
  if (unifiedMetadata.version < 14)
6845
7581
  throw new Error(
6846
7582
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -6860,14 +7596,14 @@ var getMiniMetadata11 = ({
6860
7596
  import { Abi as Abi3 } from "@polkadot/api-contract";
6861
7597
  import { TypeRegistry as TypeRegistry3 } from "@polkadot/types";
6862
7598
  import { mergeUint8 as mergeUint87 } from "@polkadot-api/utils";
6863
- import { isTokenOfType as isTokenOfType11, parseTokenId as parseTokenId5 } from "@talismn/chaindata-provider";
6864
- import { parseMetadataRpc as parseMetadataRpc19 } from "@talismn/scale";
7599
+ import { isTokenOfType as isTokenOfType12, parseTokenId as parseTokenId5 } from "@talismn/chaindata-provider";
7600
+ import { parseMetadataRpc as parseMetadataRpc20 } from "@talismn/scale";
6865
7601
  import { Binary as Binary6, Enum as Enum4 } from "polkadot-api";
6866
- var getTransferCallData11 = async ({ from: from2, to, value, token, metadataRpc, connector }) => {
6867
- if (!isTokenOfType11(token, MODULE_TYPE11))
6868
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE11}.`);
7602
+ var getTransferCallData12 = async ({ from: from2, to, value, token, metadataRpc, connector }) => {
7603
+ if (!isTokenOfType12(token, MODULE_TYPE12))
7604
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE12}.`);
6869
7605
  const networkId = parseTokenId5(token.id).networkId;
6870
- const { builder } = parseMetadataRpc19(metadataRpc);
7606
+ const { builder } = parseMetadataRpc20(metadataRpc);
6871
7607
  const { codec, location } = builder.buildCall("Contracts", "call");
6872
7608
  const Psp22Abi = new Abi3(psp22_default);
6873
7609
  const registry = new TypeRegistry3();
@@ -6897,22 +7633,22 @@ var getTransferCallData11 = async ({ from: from2, to, value, token, metadataRpc,
6897
7633
  };
6898
7634
 
6899
7635
  // src/modules/substrate-psp22/subscribeBalances.ts
6900
- import { isEqual as isEqual9 } from "lodash-es";
6901
- import { distinctUntilChanged as distinctUntilChanged9, Observable as Observable9, of as of12 } from "rxjs";
6902
- var SUBSCRIPTION_INTERVAL8 = 6e3;
6903
- var subscribeBalances11 = ({
7636
+ import { isEqual as isEqual10 } from "lodash-es";
7637
+ import { distinctUntilChanged as distinctUntilChanged10, Observable as Observable10, of as of13 } from "rxjs";
7638
+ var SUBSCRIPTION_INTERVAL9 = 6e3;
7639
+ var subscribeBalances12 = ({
6904
7640
  networkId,
6905
7641
  tokensWithAddresses,
6906
7642
  connector,
6907
7643
  miniMetadata
6908
7644
  }) => {
6909
- if (!tokensWithAddresses.length) return of12({ success: [], errors: [] });
6910
- return new Observable9((subscriber) => {
7645
+ if (!tokensWithAddresses.length) return of13({ success: [], errors: [] });
7646
+ return new Observable10((subscriber) => {
6911
7647
  const abortController = new AbortController();
6912
7648
  const poll = async () => {
6913
7649
  try {
6914
7650
  if (abortController.signal.aborted) return;
6915
- const balances = await fetchBalances11({
7651
+ const balances = await fetchBalances12({
6916
7652
  networkId,
6917
7653
  tokensWithAddresses,
6918
7654
  connector,
@@ -6920,10 +7656,10 @@ var subscribeBalances11 = ({
6920
7656
  });
6921
7657
  if (abortController.signal.aborted) return;
6922
7658
  subscriber.next(balances);
6923
- setTimeout(poll, SUBSCRIPTION_INTERVAL8);
7659
+ setTimeout(poll, SUBSCRIPTION_INTERVAL9);
6924
7660
  } catch (error) {
6925
7661
  log_default.error("Error", {
6926
- module: MODULE_TYPE11,
7662
+ module: MODULE_TYPE12,
6927
7663
  networkId,
6928
7664
  miniMetadata,
6929
7665
  addressesByToken: tokensWithAddresses,
@@ -6936,36 +7672,36 @@ var subscribeBalances11 = ({
6936
7672
  return () => {
6937
7673
  abortController.abort();
6938
7674
  };
6939
- }).pipe(distinctUntilChanged9(isEqual9));
7675
+ }).pipe(distinctUntilChanged10(isEqual10));
6940
7676
  };
6941
7677
 
6942
7678
  // src/modules/substrate-psp22/module.ts
6943
7679
  var SubPsp22BalanceModule = {
6944
- type: MODULE_TYPE11,
6945
- platform: PLATFORM11,
6946
- getMiniMetadata: getMiniMetadata11,
6947
- fetchTokens: fetchTokens11,
6948
- fetchBalances: fetchBalances11,
6949
- subscribeBalances: subscribeBalances11,
6950
- getTransferCallData: getTransferCallData11
7680
+ type: MODULE_TYPE12,
7681
+ platform: PLATFORM12,
7682
+ getMiniMetadata: getMiniMetadata12,
7683
+ fetchTokens: fetchTokens12,
7684
+ fetchBalances: fetchBalances12,
7685
+ subscribeBalances: subscribeBalances12,
7686
+ getTransferCallData: getTransferCallData12
6951
7687
  };
6952
7688
 
6953
7689
  // src/modules/substrate-psp22/types.ts
6954
7690
  import { SubPsp22TokenSchema as SubPsp22TokenSchema3 } from "@talismn/chaindata-provider";
6955
- import z15 from "zod/v4";
6956
- var SubPsp22TokenConfigSchema = z15.strictObject({
7691
+ import z17 from "zod/v4";
7692
+ var SubPsp22TokenConfigSchema = z17.strictObject({
6957
7693
  contractAddress: SubPsp22TokenSchema3.shape.contractAddress,
6958
7694
  ...TokenConfigBaseSchema.shape
6959
7695
  });
6960
7696
 
6961
7697
  // src/modules/substrate-tokens/config.ts
6962
7698
  import { SubTokensTokenSchema } from "@talismn/chaindata-provider";
6963
- var MODULE_TYPE12 = SubTokensTokenSchema.shape.type.value;
6964
- var PLATFORM12 = SubTokensTokenSchema.shape.platform.value;
7699
+ var MODULE_TYPE13 = SubTokensTokenSchema.shape.type.value;
7700
+ var PLATFORM13 = SubTokensTokenSchema.shape.platform.value;
6965
7701
 
6966
7702
  // src/modules/substrate-tokens/buildQueries.ts
6967
- import { decodeScale as decodeScale6, papiParse as papiParse3 } from "@talismn/scale";
6968
- import { isNotNil as isNotNil8 } from "@talismn/util";
7703
+ import { decodeScale as decodeScale7, papiParse as papiParse3 } from "@talismn/scale";
7704
+ import { isNotNil as isNotNil9 } from "@talismn/util";
6969
7705
  var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
6970
7706
  const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
6971
7707
  storage: [miniMetadata.extra.palletId, "Accounts"]
@@ -6987,7 +7723,7 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
6987
7723
  return null;
6988
7724
  }
6989
7725
  const decodeResult = (changes) => {
6990
- const decoded = decodeScale6(
7726
+ const decoded = decodeScale7(
6991
7727
  scaleCoder,
6992
7728
  changes[0],
6993
7729
  `Failed to decode substrate-tokens balance on chain ${networkId}`
@@ -7013,15 +7749,15 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
7013
7749
  stateKeys: [stateKey],
7014
7750
  decodeResult
7015
7751
  };
7016
- }).filter(isNotNil8);
7752
+ }).filter(isNotNil9);
7017
7753
  };
7018
7754
 
7019
7755
  // src/modules/substrate-tokens/fetchBalances.ts
7020
- var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
7756
+ var fetchBalances13 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
7021
7757
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
7022
7758
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
7023
7759
  if (!miniMetadata?.data) {
7024
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE12} balances on ${networkId}.`);
7760
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE13} balances on ${networkId}.`);
7025
7761
  return {
7026
7762
  success: [],
7027
7763
  errors: balanceDefs.map((def) => ({
@@ -7031,20 +7767,20 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
7031
7767
  }))
7032
7768
  };
7033
7769
  }
7034
- if (miniMetadata.source !== MODULE_TYPE12) {
7035
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE12}.`);
7770
+ if (miniMetadata.source !== MODULE_TYPE13) {
7771
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE13}.`);
7036
7772
  return {
7037
7773
  success: [],
7038
7774
  errors: balanceDefs.map((def) => ({
7039
7775
  tokenId: def.token.id,
7040
7776
  address: def.address,
7041
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE12}`)
7777
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE13}`)
7042
7778
  }))
7043
7779
  };
7044
7780
  }
7045
7781
  if (miniMetadata.chainId !== networkId) {
7046
7782
  log_default.warn(
7047
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE12}. Expected chainId is ${networkId}`
7783
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE13}. Expected chainId is ${networkId}`
7048
7784
  );
7049
7785
  return {
7050
7786
  success: [],
@@ -7068,7 +7804,7 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
7068
7804
  address: def.address,
7069
7805
  networkId,
7070
7806
  tokenId: def.token.id,
7071
- source: MODULE_TYPE12,
7807
+ source: MODULE_TYPE13,
7072
7808
  status: "live",
7073
7809
  values: [
7074
7810
  { type: "free", label: "free", amount: "0" },
@@ -7083,19 +7819,19 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
7083
7819
 
7084
7820
  // src/modules/substrate-tokens/fetchTokens.ts
7085
7821
  import { subTokensTokenId } from "@talismn/chaindata-provider";
7086
- import { assign as assign10 } from "lodash-es";
7087
- var fetchTokens12 = async ({
7822
+ import { assign as assign11 } from "lodash-es";
7823
+ var fetchTokens13 = async ({
7088
7824
  networkId,
7089
7825
  tokens,
7090
7826
  miniMetadata
7091
7827
  }) => {
7092
7828
  if (!miniMetadata?.data) return [];
7093
7829
  return tokens.map(
7094
- (tokenConfig) => assign10(
7830
+ (tokenConfig) => assign11(
7095
7831
  {
7096
7832
  id: subTokensTokenId(networkId, tokenConfig.onChainId),
7097
- type: MODULE_TYPE12,
7098
- platform: PLATFORM12,
7833
+ type: MODULE_TYPE13,
7834
+ platform: PLATFORM13,
7099
7835
  networkId,
7100
7836
  onChainId: tokenConfig.onChainId,
7101
7837
  symbol: tokenConfig.symbol ?? "Unit",
@@ -7111,9 +7847,9 @@ var fetchTokens12 = async ({
7111
7847
 
7112
7848
  // src/modules/substrate-tokens/getMiniMetadata.ts
7113
7849
  import { MINIMETADATA_VERSION as MINIMETADATA_VERSION8 } from "@talismn/chaindata-provider";
7114
- import { compactMetadata as compactMetadata6, encodeMetadata as encodeMetadata6, parseMetadataRpc as parseMetadataRpc20 } from "@talismn/scale";
7115
- var getMiniMetadata12 = ({ networkId, specVersion, metadataRpc, config }) => {
7116
- const source = MODULE_TYPE12;
7850
+ import { compactMetadata as compactMetadata6, encodeMetadata as encodeMetadata6, parseMetadataRpc as parseMetadataRpc21 } from "@talismn/scale";
7851
+ var getMiniMetadata13 = ({ networkId, specVersion, metadataRpc, config }) => {
7852
+ const source = MODULE_TYPE13;
7117
7853
  const chainId = networkId;
7118
7854
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
7119
7855
  if (specVersion !== systemVersion.spec_version)
@@ -7121,7 +7857,7 @@ var getMiniMetadata12 = ({ networkId, specVersion, metadataRpc, config }) => {
7121
7857
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
7122
7858
  );
7123
7859
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
7124
- const { unifiedMetadata } = parseMetadataRpc20(metadataRpc);
7860
+ const { unifiedMetadata } = parseMetadataRpc21(metadataRpc);
7125
7861
  if (unifiedMetadata.version < 14)
7126
7862
  throw new Error(
7127
7863
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -7138,7 +7874,7 @@ var getMiniMetadata12 = ({ networkId, specVersion, metadataRpc, config }) => {
7138
7874
  };
7139
7875
  };
7140
7876
  var getData5 = (metadataRpc, pallet) => {
7141
- const { metadata, unifiedMetadata } = parseMetadataRpc20(metadataRpc);
7877
+ const { metadata, unifiedMetadata } = parseMetadataRpc21(metadataRpc);
7142
7878
  if (!hasStorageItems(unifiedMetadata, pallet, ["Accounts"])) return null;
7143
7879
  compactMetadata6(metadata, [{ pallet, items: ["Accounts"] }]);
7144
7880
  return encodeMetadata6(metadata);
@@ -7146,13 +7882,13 @@ var getData5 = (metadataRpc, pallet) => {
7146
7882
 
7147
7883
  // src/modules/substrate-tokens/getTransferCallData.ts
7148
7884
  import { mergeUint8 as mergeUint88 } from "@polkadot-api/utils";
7149
- import { isTokenOfType as isTokenOfType12 } from "@talismn/chaindata-provider";
7150
- import { papiParse as papiParse4, parseMetadataRpc as parseMetadataRpc21 } from "@talismn/scale";
7885
+ import { isTokenOfType as isTokenOfType13 } from "@talismn/chaindata-provider";
7886
+ import { papiParse as papiParse4, parseMetadataRpc as parseMetadataRpc22 } from "@talismn/scale";
7151
7887
  import { Binary as Binary7, Enum as Enum5 } from "polkadot-api";
7152
- var getTransferCallData12 = ({ from: from2, to, value, token, type, metadataRpc, config }) => {
7153
- if (!isTokenOfType12(token, MODULE_TYPE12))
7154
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE12}.`);
7155
- const { builder } = parseMetadataRpc21(metadataRpc);
7888
+ var getTransferCallData13 = ({ from: from2, to, value, token, type, metadataRpc, config }) => {
7889
+ if (!isTokenOfType13(token, MODULE_TYPE13))
7890
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE13}.`);
7891
+ const { builder } = parseMetadataRpc22(metadataRpc);
7156
7892
  const options = getCallDataOptions(to, token, value, type, config);
7157
7893
  const callData = getCallDataFromOptions(builder, options);
7158
7894
  return {
@@ -7264,9 +8000,9 @@ var getCallDataOptions = (to, token, value, type, config) => {
7264
8000
  };
7265
8001
 
7266
8002
  // src/modules/substrate-tokens/subscribeBalances.ts
7267
- import { map as map5, of as of13 } from "rxjs";
7268
- var subscribeBalances12 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
7269
- if (!tokensWithAddresses.length) return of13({ success: [], errors: [] });
8003
+ import { map as map5, of as of14 } from "rxjs";
8004
+ var subscribeBalances13 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
8005
+ if (!tokensWithAddresses.length) return of14({ success: [], errors: [] });
7270
8006
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
7271
8007
  const queries = buildQueries3(networkId, balanceDefs, miniMetadata);
7272
8008
  return getRpcQueryPack$(connector, networkId, queries).pipe(
@@ -7279,31 +8015,31 @@ var subscribeBalances12 = ({ networkId, tokensWithAddresses, connector, miniMeta
7279
8015
 
7280
8016
  // src/modules/substrate-tokens/module.ts
7281
8017
  var SubTokensBalanceModule = {
7282
- type: MODULE_TYPE12,
7283
- platform: PLATFORM12,
7284
- getMiniMetadata: getMiniMetadata12,
7285
- fetchTokens: fetchTokens12,
7286
- fetchBalances: fetchBalances12,
7287
- subscribeBalances: subscribeBalances12,
7288
- getTransferCallData: getTransferCallData12
8018
+ type: MODULE_TYPE13,
8019
+ platform: PLATFORM13,
8020
+ getMiniMetadata: getMiniMetadata13,
8021
+ fetchTokens: fetchTokens13,
8022
+ fetchBalances: fetchBalances13,
8023
+ subscribeBalances: subscribeBalances13,
8024
+ getTransferCallData: getTransferCallData13
7289
8025
  };
7290
8026
 
7291
8027
  // src/modules/substrate-tokens/types.ts
7292
8028
  import { SubTokensTokenSchema as SubTokensTokenSchema2 } from "@talismn/chaindata-provider";
7293
- import z16 from "zod/v4";
7294
- var SubTokensTokenConfigSchema = z16.strictObject({
8029
+ import z18 from "zod/v4";
8030
+ var SubTokensTokenConfigSchema = z18.strictObject({
7295
8031
  onChainId: SubTokensTokenSchema2.shape.onChainId,
7296
8032
  ...TokenConfigBaseSchema.shape,
7297
8033
  // force these 3 fields because in this module we wont pull anything from chain
7298
- symbol: z16.string().nonempty(),
7299
- decimals: z16.number(),
7300
- existentialDeposit: z16.string().nonempty()
8034
+ symbol: z18.string().nonempty(),
8035
+ decimals: z18.number(),
8036
+ existentialDeposit: z18.string().nonempty()
7301
8037
  });
7302
- var SubTokensModuleConfigSchema = z16.strictObject({
7303
- palletId: z16.string().optional()
8038
+ var SubTokensModuleConfigSchema = z18.strictObject({
8039
+ palletId: z18.string().optional()
7304
8040
  });
7305
- var SubTokensMiniMetadataExtraSchema = z16.strictObject({
7306
- palletId: z16.string()
8041
+ var SubTokensMiniMetadataExtraSchema = z18.strictObject({
8042
+ palletId: z18.string()
7307
8043
  });
7308
8044
 
7309
8045
  // src/modules/index.ts
@@ -7319,7 +8055,8 @@ var BALANCE_MODULES = [
7319
8055
  EvmUniswapV2BalanceModule,
7320
8056
  EvmNativeBalanceModule,
7321
8057
  SolNativeBalanceModule,
7322
- SolSplBalanceModule
8058
+ SolSplBalanceModule,
8059
+ SolToken2022BalanceModule
7323
8060
  ];
7324
8061
 
7325
8062
  // src/getMiniMetadatas/getMetadataRpc.ts
@@ -7427,16 +8164,16 @@ var BalancesProvider = class {
7427
8164
  this.#chaindataProvider = chaindataProvider;
7428
8165
  this.#chainConnectors = chainConnectors;
7429
8166
  this.#storage = new BehaviorSubject2({
7430
- balances: keyBy8(storage.balances.filter(isNotNil9), (b) => getBalanceId(b)),
7431
- miniMetadatas: keyBy8(storage.miniMetadatas.filter(isNotNil9), (m) => m.id)
8167
+ balances: keyBy9(storage.balances.filter(isNotNil10), (b) => getBalanceId(b)),
8168
+ miniMetadatas: keyBy9(storage.miniMetadatas.filter(isNotNil10), (m) => m.id)
7432
8169
  });
7433
8170
  }
7434
8171
  get storage$() {
7435
8172
  return this.#storage.pipe(
7436
8173
  map6(
7437
8174
  ({ balances, miniMetadatas }) => ({
7438
- balances: values2(balances).filter(isNotNil9).sort(sortByBalanceId),
7439
- miniMetadatas: values2(miniMetadatas).filter(isNotNil9).sort(sortByMiniMetadataId)
8175
+ balances: values2(balances).filter(isNotNil10).sort(sortByBalanceId),
8176
+ miniMetadatas: values2(miniMetadatas).filter(isNotNil10).sort(sortByMiniMetadataId)
7440
8177
  }),
7441
8178
  shareReplay(1)
7442
8179
  )
@@ -7444,8 +8181,8 @@ var BalancesProvider = class {
7444
8181
  }
7445
8182
  get storedMiniMetadataMapById$() {
7446
8183
  return this.#storage.pipe(
7447
- map6((storage) => keyBy8(storage.miniMetadatas, (m) => m.id)),
7448
- distinctUntilChanged10(isEqual10),
8184
+ map6((storage) => keyBy9(storage.miniMetadatas, (m) => m.id)),
8185
+ distinctUntilChanged11(isEqual11),
7449
8186
  shareReplay(1)
7450
8187
  );
7451
8188
  }
@@ -7465,7 +8202,7 @@ var BalancesProvider = class {
7465
8202
  )
7466
8203
  ),
7467
8204
  switchMap2((addressesByTokenIdByNetworkId) => {
7468
- if (!keys3(addressesByTokenIdByNetworkId).length) return of14({ isStale: false, results: [] });
8205
+ if (!keys3(addressesByTokenIdByNetworkId).length) return of15({ isStale: false, results: [] });
7469
8206
  return combineLatest({
7470
8207
  isStale: timer(3e4).pipe(
7471
8208
  map6(() => true),
@@ -7490,7 +8227,7 @@ var BalancesProvider = class {
7490
8227
  failedBalanceIds: results.flatMap((result) => result.failedBalanceIds)
7491
8228
  })
7492
8229
  ),
7493
- distinctUntilChanged10(isEqual10)
8230
+ distinctUntilChanged11(isEqual11)
7494
8231
  );
7495
8232
  }
7496
8233
  fetchBalances(addressesByTokenId) {
@@ -7529,7 +8266,7 @@ var BalancesProvider = class {
7529
8266
  }
7530
8267
  default: {
7531
8268
  log_default.warn("[balances] Unsupported network platform for module", { networkId, mod });
7532
- return of14({ status: "live", balances: [], failedBalanceIds: [] });
8269
+ return of15({ status: "live", balances: [], failedBalanceIds: [] });
7533
8270
  }
7534
8271
  }
7535
8272
  })
@@ -7537,14 +8274,14 @@ var BalancesProvider = class {
7537
8274
  }),
7538
8275
  map6((results) => {
7539
8276
  const errorBalanceIds = results.flatMap((result) => result.failedBalanceIds);
7540
- const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(isNotNil9).map((b) => ({ ...b, status: "stale" }));
8277
+ const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(isNotNil10).map((b) => ({ ...b, status: "stale" }));
7541
8278
  return {
7542
8279
  status: results.some(({ status }) => status === "initialising") ? "initialising" : "live",
7543
8280
  balances: results.flatMap((result) => result.balances).concat(staleBalances).sort(sortByBalanceId),
7544
8281
  failedBalanceIds: []
7545
8282
  };
7546
8283
  }),
7547
- distinctUntilChanged10(isEqual10)
8284
+ distinctUntilChanged11(isEqual11)
7548
8285
  );
7549
8286
  }
7550
8287
  getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
@@ -7553,7 +8290,7 @@ var BalancesProvider = class {
7553
8290
  { networkId, mod, tokensWithAddresses },
7554
8291
  () => {
7555
8292
  if (!tokensWithAddresses.length)
7556
- return of14({ status: "live", balances: [], failedBalanceIds: [] });
8293
+ return of15({ status: "live", balances: [], failedBalanceIds: [] });
7557
8294
  const moduleAddressesByTokenId = fromPairs2(
7558
8295
  tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
7559
8296
  );
@@ -7563,7 +8300,7 @@ var BalancesProvider = class {
7563
8300
  if (!this.#chainConnectors.substrate) {
7564
8301
  log_default.warn("[balances] no substrate connector or miniMetadata for module", mod.type);
7565
8302
  return defer(
7566
- () => of14({
8303
+ () => of15({
7567
8304
  status: "initialising",
7568
8305
  balances: this.getStoredBalances(moduleAddressesByTokenId),
7569
8306
  failedBalanceIds: []
@@ -7590,8 +8327,14 @@ var BalancesProvider = class {
7590
8327
  map6(
7591
8328
  (results) => ({
7592
8329
  status: "live",
7593
- // exclude zero balances
7594
- balances: results.success.filter((b) => new Balance(b).total.planck > 0n),
8330
+ // exclude zero balances, but keep balances that only hold a lock
8331
+ // (eg dtao conviction locks, reported on the subnet's base token — including
8332
+ // zero-mass "ghost" locks with residual conviction, which still pin the hotkey
8333
+ // of future lock_stake calls)
8334
+ balances: results.success.filter((b) => {
8335
+ const balance = new Balance(b);
8336
+ return balance.total.planck > 0n || balance.locks.some((lock) => lock.amount.planck > 0n) || !!findDTaoConvictionLock(balance.locks);
8337
+ }),
7595
8338
  failedBalanceIds: results.errors.map(
7596
8339
  ({ tokenId, address }) => getBalanceId({ tokenId, address })
7597
8340
  )
@@ -7622,7 +8365,7 @@ var BalancesProvider = class {
7622
8365
  { networkId, mod, tokensWithAddresses },
7623
8366
  () => {
7624
8367
  if (!tokensWithAddresses.length)
7625
- return of14({ status: "live", balances: [], failedBalanceIds: [] });
8368
+ return of15({ status: "live", balances: [], failedBalanceIds: [] });
7626
8369
  const moduleAddressesByTokenId = fromPairs2(
7627
8370
  tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
7628
8371
  );
@@ -7632,7 +8375,7 @@ var BalancesProvider = class {
7632
8375
  if (!this.#chainConnectors.evm) {
7633
8376
  log_default.warn("[balances] no ethereum connector for module", mod.type);
7634
8377
  return defer(
7635
- () => of14({
8378
+ () => of15({
7636
8379
  status: "initialising",
7637
8380
  balances: this.getStoredBalances(moduleAddressesByTokenId),
7638
8381
  failedBalanceIds: []
@@ -7681,7 +8424,7 @@ var BalancesProvider = class {
7681
8424
  { networkId, mod, tokensWithAddresses },
7682
8425
  () => {
7683
8426
  if (!tokensWithAddresses.length)
7684
- return of14({ status: "live", balances: [], failedBalanceIds: [] });
8427
+ return of15({ status: "live", balances: [], failedBalanceIds: [] });
7685
8428
  const moduleAddressesByTokenId = fromPairs2(
7686
8429
  tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
7687
8430
  );
@@ -7691,7 +8434,7 @@ var BalancesProvider = class {
7691
8434
  if (!this.#chainConnectors.solana) {
7692
8435
  log_default.warn("[balances] no solana connector for module", mod.type);
7693
8436
  return defer(
7694
- () => of14({
8437
+ () => of15({
7695
8438
  status: "initialising",
7696
8439
  balances: this.getStoredBalances(moduleAddressesByTokenId),
7697
8440
  failedBalanceIds: []
@@ -7705,6 +8448,11 @@ var BalancesProvider = class {
7705
8448
  }).pipe(
7706
8449
  catchError(() => EMPTY),
7707
8450
  // don't emit, let provider mark balances stale
8451
+ tap((results) => {
8452
+ if (results.dynamicTokens?.length) {
8453
+ this.#chaindataProvider.registerDynamicTokens(results.dynamicTokens);
8454
+ }
8455
+ }),
7708
8456
  map6(
7709
8457
  (results) => ({
7710
8458
  status: "live",
@@ -7738,14 +8486,14 @@ var BalancesProvider = class {
7738
8486
  if (balancesResult.status !== "live") return;
7739
8487
  const storage = this.#storage.getValue();
7740
8488
  const failedIds = new Set(balancesResult.failedBalanceIds);
7741
- const balances = assign11(
8489
+ const balances = assign12(
7742
8490
  {},
7743
8491
  storage.balances,
7744
8492
  // delete all balances expected in the result set (except the ones that failed). because if they are not present it means they are empty.
7745
8493
  fromPairs2(
7746
8494
  balanceIds.filter((bid) => !failedIds.has(bid)).map((balanceId) => [balanceId, void 0])
7747
8495
  ),
7748
- keyBy8(
8496
+ keyBy9(
7749
8497
  // storage balances must have status "cache", because they are used as start value when initialising subsequent subscriptions
7750
8498
  balancesResult.balances.map((b) => ({ ...b, status: "cache" })),
7751
8499
  (b) => getBalanceId(b)
@@ -7755,7 +8503,7 @@ var BalancesProvider = class {
7755
8503
  const balance = balances[errorBalanceId];
7756
8504
  if (balance) balance.status = "stale";
7757
8505
  }
7758
- this.#storage.next(assign11({}, storage, { balances }));
8506
+ this.#storage.next(assign12({}, storage, { balances }));
7759
8507
  }
7760
8508
  getNetworkMiniMetadatas$(networkId) {
7761
8509
  return getSharedObservable(`BalancesProvider.getNetworkMiniMetadatas$`, { networkId }, () => {
@@ -7763,11 +8511,11 @@ var BalancesProvider = class {
7763
8511
  switchMap2(
7764
8512
  (network) => isNetworkDot(network) ? this.getNetworkSpecVersion$(networkId).pipe(
7765
8513
  switchMap2(
7766
- (specVersion) => specVersion === null ? of14([]) : this.getMiniMetadatas$(networkId, specVersion)
8514
+ (specVersion) => specVersion === null ? of15([]) : this.getMiniMetadatas$(networkId, specVersion)
7767
8515
  )
7768
- ) : of14([])
8516
+ ) : of15([])
7769
8517
  ),
7770
- distinctUntilChanged10(isEqual10)
8518
+ distinctUntilChanged11(isEqual11)
7771
8519
  );
7772
8520
  });
7773
8521
  }
@@ -7783,7 +8531,7 @@ var BalancesProvider = class {
7783
8531
  ).pipe(
7784
8532
  catchError(() => {
7785
8533
  log_default.warn("Failed to fetch spec version for network", networkId);
7786
- return of14(null);
8534
+ return of15(null);
7787
8535
  })
7788
8536
  );
7789
8537
  }
@@ -7800,9 +8548,9 @@ var BalancesProvider = class {
7800
8548
  storedMiniMetadatas: this.getStoredMiniMetadatas$(miniMetadataIds)
7801
8549
  }).pipe(
7802
8550
  switchMap2(({ storedMiniMetadatas, defaultMiniMetadatas }) => {
7803
- if (defaultMiniMetadatas) return of14(defaultMiniMetadatas);
7804
- if (storedMiniMetadatas) return of14(storedMiniMetadatas);
7805
- if (!this.#chainConnectors.substrate) return of14([]);
8551
+ if (defaultMiniMetadatas) return of15(defaultMiniMetadatas);
8552
+ if (storedMiniMetadatas) return of15(storedMiniMetadatas);
8553
+ if (!this.#chainConnectors.substrate) return of15([]);
7806
8554
  return from(
7807
8555
  withRetry(
7808
8556
  () => (
@@ -7825,27 +8573,27 @@ var BalancesProvider = class {
7825
8573
  ).pipe(
7826
8574
  catchError(() => {
7827
8575
  log_default.warn("Failed to fetch metadata for network", networkId);
7828
- return of14([]);
8576
+ return of15([]);
7829
8577
  }),
7830
8578
  // and persist in storage for later reuse
7831
8579
  tap((newMiniMetadatas) => {
7832
8580
  if (!newMiniMetadatas.length) return;
7833
8581
  const storage = this.#storage.getValue();
7834
- const miniMetadatas = assign11(
8582
+ const miniMetadatas = assign12(
7835
8583
  // keep minimetadatas of other networks
7836
- keyBy8(
8584
+ keyBy9(
7837
8585
  values2(storage.miniMetadatas).filter((m) => m.chainId !== networkId),
7838
8586
  (m) => m.id
7839
8587
  ),
7840
8588
  // add the ones for our network
7841
- keyBy8(newMiniMetadatas, (m) => m.id)
8589
+ keyBy9(newMiniMetadatas, (m) => m.id)
7842
8590
  );
7843
- this.#storage.next(assign11({}, storage, { miniMetadatas }));
8591
+ this.#storage.next(assign12({}, storage, { miniMetadatas }));
7844
8592
  })
7845
8593
  );
7846
8594
  }),
7847
8595
  // emit only when mini metadata changes, as a change here would restart all subscriptions for the network
7848
- distinctUntilChanged10(isEqual10)
8596
+ distinctUntilChanged11(isEqual11)
7849
8597
  );
7850
8598
  }
7851
8599
  getStoredMiniMetadatas$(miniMetadataIds) {
@@ -7855,7 +8603,7 @@ var BalancesProvider = class {
7855
8603
  return miniMetadatas.length && miniMetadatas.every(isTruthy) ? miniMetadatas : null;
7856
8604
  }),
7857
8605
  // source changes very often
7858
- distinctUntilChanged10(isEqual10)
8606
+ distinctUntilChanged11(isEqual11)
7859
8607
  );
7860
8608
  }
7861
8609
  getDefaultMiniMetadatas$(miniMetadataIds) {
@@ -7870,7 +8618,7 @@ var BalancesProvider = class {
7870
8618
  const balanceDefs = toPairs2(addressesByToken).flatMap(
7871
8619
  ([tokenId, addresses]) => addresses.map((address) => [tokenId, address])
7872
8620
  );
7873
- return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(isNotNil9).sort(sortByBalanceId);
8621
+ return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(isNotNil10).sort(sortByBalanceId);
7874
8622
  }
7875
8623
  cleanupAddressesByTokenId$(addressesByTokenId) {
7876
8624
  return this.#chaindataProvider.getNetworksMapById$().pipe(
@@ -7881,7 +8629,7 @@ var BalancesProvider = class {
7881
8629
  const network = networksById[networkId];
7882
8630
  return [
7883
8631
  tokenId,
7884
- uniq5(addresses.map(normalizeAddress)).filter(
8632
+ uniq6(addresses.map(normalizeAddress)).filter(
7885
8633
  (address) => network && isAddressCompatibleWithNetwork(network, address)
7886
8634
  )
7887
8635
  ];
@@ -7943,6 +8691,8 @@ export {
7943
8691
  SolNativeTokenConfigSchema,
7944
8692
  SolSplBalanceModule,
7945
8693
  SolSplTokenConfigSchema,
8694
+ SolToken2022BalanceModule,
8695
+ SolToken2022TokenConfigSchema,
7946
8696
  SubAssetsBalanceModule,
7947
8697
  SubAssetsTokenConfigSchema,
7948
8698
  SubDTaoBalanceModule,
@@ -7971,7 +8721,9 @@ export {
7971
8721
  excludeFromTransferableAmount,
7972
8722
  filterBaseLocks,
7973
8723
  filterMirrorTokens,
8724
+ findDTaoConvictionLock,
7974
8725
  getBalanceId,
8726
+ getConvictionLockLabel,
7975
8727
  getDTaoTokenRates,
7976
8728
  getLockTitle,
7977
8729
  getLockedType,
@@ -7979,6 +8731,7 @@ export {
7979
8731
  getValueId,
7980
8732
  includeInTotalExtraAmount,
7981
8733
  taoToAlpha,
8734
+ taoToAlphaCeil,
7982
8735
  uniswapV2PairAbi
7983
8736
  };
7984
8737
  //# sourceMappingURL=index.mjs.map