@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.js CHANGED
@@ -45,12 +45,14 @@ __export(index_exports, {
45
45
  EvmUniswapV2BalanceModule: () => EvmUniswapV2BalanceModule,
46
46
  EvmUniswapV2TokenConfigSchema: () => EvmUniswapV2TokenConfigSchema,
47
47
  FiatSumBalancesFormatter: () => FiatSumBalancesFormatter,
48
- MINIMETADATA_VERSION: () => import_chaindata_provider65.MINIMETADATA_VERSION,
48
+ MINIMETADATA_VERSION: () => import_chaindata_provider72.MINIMETADATA_VERSION,
49
49
  PlanckSumBalancesFormatter: () => PlanckSumBalancesFormatter,
50
50
  SolNativeBalanceModule: () => SolNativeBalanceModule,
51
51
  SolNativeTokenConfigSchema: () => SolNativeTokenConfigSchema,
52
52
  SolSplBalanceModule: () => SolSplBalanceModule,
53
53
  SolSplTokenConfigSchema: () => SolSplTokenConfigSchema,
54
+ SolToken2022BalanceModule: () => SolToken2022BalanceModule,
55
+ SolToken2022TokenConfigSchema: () => SolToken2022TokenConfigSchema,
54
56
  SubAssetsBalanceModule: () => SubAssetsBalanceModule,
55
57
  SubAssetsTokenConfigSchema: () => SubAssetsTokenConfigSchema,
56
58
  SubDTaoBalanceModule: () => SubDTaoBalanceModule,
@@ -79,7 +81,9 @@ __export(index_exports, {
79
81
  excludeFromTransferableAmount: () => excludeFromTransferableAmount,
80
82
  filterBaseLocks: () => filterBaseLocks,
81
83
  filterMirrorTokens: () => filterMirrorTokens,
84
+ findDTaoConvictionLock: () => findDTaoConvictionLock,
82
85
  getBalanceId: () => getBalanceId,
86
+ getConvictionLockLabel: () => getConvictionLockLabel,
83
87
  getDTaoTokenRates: () => getDTaoTokenRates,
84
88
  getLockTitle: () => getLockTitle,
85
89
  getLockedType: () => getLockedType,
@@ -87,16 +91,22 @@ __export(index_exports, {
87
91
  getValueId: () => getValueId,
88
92
  includeInTotalExtraAmount: () => includeInTotalExtraAmount,
89
93
  taoToAlpha: () => taoToAlpha,
94
+ taoToAlphaCeil: () => taoToAlphaCeil,
90
95
  uniswapV2PairAbi: () => uniswapV2PairAbi
91
96
  });
92
97
  module.exports = __toCommonJS(index_exports);
93
98
 
99
+ // src/configureBigNumber.ts
100
+ var import_bignumber = __toESM(require("bignumber.js"));
101
+ import_bignumber.default.set({ STRICT: false });
102
+ var configureBigNumber_default = import_bignumber.default;
103
+
94
104
  // src/BalancesProvider.ts
95
- var import_chaindata_provider64 = require("@talismn/chaindata-provider");
105
+ var import_chaindata_provider71 = require("@talismn/chaindata-provider");
96
106
  var import_crypto8 = require("@talismn/crypto");
97
- var import_util16 = require("@talismn/util");
98
- var import_lodash_es27 = require("lodash-es");
99
- var import_rxjs15 = require("rxjs");
107
+ var import_util17 = require("@talismn/util");
108
+ var import_lodash_es30 = require("lodash-es");
109
+ var import_rxjs16 = require("rxjs");
100
110
  var import_viem9 = require("viem");
101
111
 
102
112
  // src/getMiniMetadatas/index.ts
@@ -108,7 +118,7 @@ var import_anylogger = __toESM(require("anylogger"));
108
118
  // package.json
109
119
  var package_default = {
110
120
  name: "@talismn/balances",
111
- version: "1.3.7",
121
+ version: "1.5.0",
112
122
  author: "Talisman",
113
123
  homepage: "https://talisman.xyz",
114
124
  license: "GPL-3.0-or-later",
@@ -136,9 +146,9 @@ var package_default = {
136
146
  },
137
147
  dependencies: {
138
148
  "@metaplex-foundation/mpl-token-metadata": "^3.4.0",
139
- "@metaplex-foundation/umi": "^1.2.0",
149
+ "@metaplex-foundation/umi": "^1.5.1",
140
150
  "@polkadot-api/utils": "0.2.0",
141
- "@solana/spl-token": "^0.4.13",
151
+ "@solana/spl-token": "^0.4.14",
142
152
  "@solana/web3.js": "^1.98.2",
143
153
  "@talismn/chain-connectors": "workspace:*",
144
154
  "@talismn/chaindata-provider": "workspace:*",
@@ -148,28 +158,26 @@ var package_default = {
148
158
  "@talismn/token-rates": "workspace:*",
149
159
  "@talismn/util": "workspace:*",
150
160
  anylogger: "^1.0.11",
151
- "bignumber.js": "^9.1.2",
152
- "lodash-es": "4.17.21",
161
+ "bignumber.js": "^11.1.3",
162
+ "lodash-es": "4.18.1",
153
163
  "p-queue": "8.1.0",
154
164
  "polkadot-api": "1.23.3",
155
- rxjs: "^7.8.1",
165
+ rxjs: "^7.8.2",
156
166
  "scale-ts": "^1.6.1",
157
- viem: "^2.27.3",
158
- zod: "^3.25.76"
167
+ viem: "2.52.2",
168
+ zod: "^4.4.3"
159
169
  },
160
170
  devDependencies: {
161
171
  "@polkadot/api-contract": "16.1.2",
162
172
  "@polkadot/types": "16.1.2",
163
- "@polkadot/util": "13.5.3",
164
173
  "@talismn/tsconfig": "workspace:*",
165
174
  "@types/lodash-es": "4.17.12",
166
- typescript: "^5.6.3"
175
+ "@types/node": "^24.5.1",
176
+ typescript: "^6.0.3"
167
177
  },
168
178
  peerDependencies: {
169
179
  "@polkadot/api-contract": "*",
170
180
  "@polkadot/types": "*",
171
- "@polkadot/util": "*",
172
- "@polkadot/util-crypto": "*",
173
181
  "@substrate/txwrapper-core": "*"
174
182
  },
175
183
  types: "./dist/index.d.ts",
@@ -1089,6 +1097,7 @@ var import_lodash_es = require("lodash-es");
1089
1097
  var import_v4 = __toESM(require("zod/v4"));
1090
1098
 
1091
1099
  // src/modules/evm-erc20/utils.ts
1100
+ var import_util = require("@talismn/util");
1092
1101
  var import_viem4 = require("viem");
1093
1102
  var getErc20ContractData = async (client, contractAddress) => {
1094
1103
  try {
@@ -1099,7 +1108,7 @@ var getErc20ContractData = async (client, contractAddress) => {
1099
1108
  contract.read.name()
1100
1109
  ]);
1101
1110
  } catch (e) {
1102
- if (e instanceof import_viem4.ContractFunctionExecutionError) {
1111
+ if ((0, import_util.isErrorOfName)(e, "ContractFunctionExecutionError")) {
1103
1112
  const contract = getTypedContract(client, import_viem4.erc20Abi_bytes32, contractAddress);
1104
1113
  var [bytesSymbol, decimals, nameSymbol] = await Promise.all([
1105
1114
  contract.read.symbol(),
@@ -1316,21 +1325,30 @@ var fetchBalances2 = async ({
1316
1325
  }
1317
1326
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
1318
1327
  if (client.chain?.contracts?.multicall3 && balanceDefs.length > 1) {
1319
- const multicall3 = client.chain.contracts.multicall3;
1320
- return fetchWithMulticall(client, balanceDefs, multicall3.address);
1328
+ try {
1329
+ return await fetchWithMulticall(
1330
+ client,
1331
+ balanceDefs,
1332
+ client.chain.contracts.multicall3.address
1333
+ );
1334
+ } catch {
1335
+ }
1321
1336
  }
1322
- return fetchWithoutMulticall(client, balanceDefs);
1337
+ return fetchWithGetBalance(client, balanceDefs);
1323
1338
  };
1324
- var fetchWithoutMulticall = async (client, balanceDefs) => {
1339
+ var fetchWithGetBalance = async (client, balanceDefs) => {
1325
1340
  if (balanceDefs.length === 0) return { success: [], errors: [] };
1326
1341
  const results = await Promise.allSettled(
1327
1342
  balanceDefs.map(async ({ token, address }) => {
1328
1343
  try {
1329
- const result = await client.getBalance({ address });
1344
+ const result = await client.request({
1345
+ method: "eth_getBalance",
1346
+ params: [address, "latest"]
1347
+ });
1330
1348
  const balance = {
1331
1349
  address,
1332
1350
  tokenId: token.id,
1333
- value: result.toString(),
1351
+ value: BigInt(result).toString(),
1334
1352
  source: MODULE_TYPE2,
1335
1353
  networkId: (0, import_chaindata_provider8.parseTokenId)(token.id).networkId,
1336
1354
  status: "live"
@@ -1364,55 +1382,28 @@ var fetchWithoutMulticall = async (client, balanceDefs) => {
1364
1382
  };
1365
1383
  var fetchWithMulticall = async (client, balanceDefs, multicall3Address) => {
1366
1384
  if (balanceDefs.length === 0) return { success: [], errors: [] };
1367
- try {
1368
- const callResults = await client.multicall({
1369
- contracts: balanceDefs.map(({ address }) => ({
1370
- address: multicall3Address,
1371
- abi: abiMulticall,
1372
- functionName: "getEthBalance",
1373
- args: [address]
1374
- }))
1375
- });
1376
- return callResults.reduce(
1377
- (acc, result, index) => {
1378
- if (result.status === "success") {
1379
- acc.success.push({
1380
- address: balanceDefs[index].address,
1381
- tokenId: balanceDefs[index].token.id,
1382
- value: result.result.toString(),
1383
- source: MODULE_TYPE2,
1384
- networkId: (0, import_chaindata_provider8.parseTokenId)(balanceDefs[index].token.id).networkId,
1385
- status: "live"
1386
- });
1387
- }
1388
- if (result.status === "failure") {
1389
- acc.errors.push({
1390
- tokenId: balanceDefs[index].token.id,
1391
- address: balanceDefs[index].address,
1392
- error: new BalanceFetchError(
1393
- `Failed to get balance for token ${balanceDefs[index].token.id} and address ${balanceDefs[index].address} on chain ${client.chain?.id}`,
1394
- balanceDefs[index].token.id,
1395
- balanceDefs[index].address,
1396
- result.error
1397
- )
1398
- });
1399
- }
1400
- return acc;
1401
- },
1402
- { success: [], errors: [] }
1403
- );
1404
- } catch (err) {
1405
- const errors = balanceDefs.map((balanceDef) => ({
1406
- tokenId: balanceDef.token.id,
1407
- address: balanceDef.address,
1408
- error: new BalanceFetchNetworkError(
1409
- `Failed to get balances for evm-erc20 tokens on chain ${client.chain?.id}`,
1410
- String(client.chain?.id),
1411
- err
1412
- )
1413
- }));
1414
- return { success: [], errors };
1415
- }
1385
+ const results = await client.multicall({
1386
+ allowFailure: false,
1387
+ contracts: balanceDefs.map(({ address }) => ({
1388
+ address: multicall3Address,
1389
+ abi: abiMulticall,
1390
+ functionName: "getEthBalance",
1391
+ args: [address]
1392
+ }))
1393
+ });
1394
+ return {
1395
+ success: results.map(
1396
+ (value, index) => ({
1397
+ address: balanceDefs[index].address,
1398
+ tokenId: balanceDefs[index].token.id,
1399
+ value: String(value),
1400
+ source: MODULE_TYPE2,
1401
+ networkId: (0, import_chaindata_provider8.parseTokenId)(balanceDefs[index].token.id).networkId,
1402
+ status: "live"
1403
+ })
1404
+ ),
1405
+ errors: []
1406
+ };
1416
1407
  };
1417
1408
 
1418
1409
  // src/modules/evm-native/fetchTokens.ts
@@ -1530,7 +1521,6 @@ var PLATFORM3 = import_chaindata_provider11.EvmUniswapV2TokenSchema.shape.platfo
1530
1521
  // src/modules/evm-uniswapv2/fetchBalances.ts
1531
1522
  var import_chaindata_provider12 = require("@talismn/chaindata-provider");
1532
1523
  var import_crypto5 = require("@talismn/crypto");
1533
- var import_bignumber = __toESM(require("bignumber.js"));
1534
1524
  var import_lodash_es5 = require("lodash-es");
1535
1525
  var import_viem6 = require("viem");
1536
1526
  var fetchBalances3 = async ({
@@ -1622,7 +1612,7 @@ var fetchPoolBalances = async (client, balanceDefs) => {
1622
1612
  label,
1623
1613
  amount
1624
1614
  });
1625
- const ratio = (0, import_bignumber.default)(String(balance)).div(totalSupply === 0n ? "1" : String(totalSupply));
1615
+ const ratio = configureBigNumber_default(String(balance)).div(totalSupply === 0n ? "1" : String(totalSupply));
1626
1616
  acc.success.push({
1627
1617
  address,
1628
1618
  tokenId: token.id,
@@ -1651,6 +1641,7 @@ var import_lodash_es6 = require("lodash-es");
1651
1641
  var import_v44 = __toESM(require("zod/v4"));
1652
1642
 
1653
1643
  // src/modules/evm-uniswapv2/utils.ts
1644
+ var import_util2 = require("@talismn/util");
1654
1645
  var import_viem7 = require("viem");
1655
1646
  var getErc20ContractData2 = async (client, contractAddress) => {
1656
1647
  try {
@@ -1661,7 +1652,7 @@ var getErc20ContractData2 = async (client, contractAddress) => {
1661
1652
  contract.read.name()
1662
1653
  ]);
1663
1654
  } catch (e) {
1664
- if (e instanceof import_viem7.ContractFunctionExecutionError) {
1655
+ if ((0, import_util2.isErrorOfName)(e, "ContractFunctionExecutionError")) {
1665
1656
  const contract = getTypedContract2(client, import_viem7.erc20Abi_bytes32, contractAddress);
1666
1657
  var [bytesSymbol, decimals, nameSymbol] = await Promise.all([
1667
1658
  contract.read.symbol(),
@@ -1901,8 +1892,8 @@ var fetchBalances4 = async ({
1901
1892
  const results = await Promise.allSettled(
1902
1893
  balanceDefs.map(async ({ token, address }) => {
1903
1894
  try {
1904
- const publicKey2 = new import_web3.PublicKey(address);
1905
- const lamports = await connection.getBalance(publicKey2);
1895
+ const publicKey3 = new import_web3.PublicKey(address);
1896
+ const lamports = await connection.getBalance(publicKey3);
1906
1897
  return {
1907
1898
  address,
1908
1899
  tokenId: token.id,
@@ -2055,9 +2046,9 @@ var MODULE_TYPE5 = import_chaindata_provider19.SolSplTokenSchema.shape.type.valu
2055
2046
  var PLATFORM5 = import_chaindata_provider19.SolSplTokenSchema.shape.platform.value;
2056
2047
 
2057
2048
  // src/modules/sol-spl/fetchBalances.ts
2058
- var import_web33 = require("@solana/web3.js");
2059
- var import_chaindata_provider21 = require("@talismn/chaindata-provider");
2060
- var import_util2 = require("@talismn/util");
2049
+ var import_web34 = require("@solana/web3.js");
2050
+ var import_chaindata_provider22 = require("@talismn/chaindata-provider");
2051
+ var import_util4 = require("@talismn/util");
2061
2052
  var import_lodash_es12 = require("lodash-es");
2062
2053
 
2063
2054
  // src/modules/shared/buildNetworkStorageCoders.ts
@@ -2095,9 +2086,9 @@ var buildNetworkStorageCoders = (chainId, miniMetadata, coders) => {
2095
2086
 
2096
2087
  // src/modules/shared/fetchRuntimeCallResult.ts
2097
2088
  var import_scale2 = require("@talismn/scale");
2098
- var fetchRuntimeCallResult = async (connector, networkId, metadataRpc, apiName, method, args) => {
2089
+ var fetchRuntimeCallResult = async (connector, networkId, metadataRpcOrBuilder, apiName, method, args) => {
2099
2090
  try {
2100
- const { builder } = (0, import_scale2.parseMetadataRpc)(metadataRpc);
2091
+ const builder = typeof metadataRpcOrBuilder === "string" ? (0, import_scale2.parseMetadataRpc)(metadataRpcOrBuilder).builder : metadataRpcOrBuilder;
2101
2092
  const call = builder.buildRuntimeCall(apiName, method);
2102
2093
  const hex = await connector.send(networkId, "state_call", [
2103
2094
  `${apiName}_${method}`,
@@ -2112,11 +2103,11 @@ var fetchRuntimeCallResult = async (connector, networkId, metadataRpc, apiName,
2112
2103
  };
2113
2104
 
2114
2105
  // src/modules/shared/rpcQueryPack.ts
2115
- var import_util = require("@talismn/util");
2106
+ var import_util3 = require("@talismn/util");
2116
2107
  var import_lodash_es10 = require("lodash-es");
2117
2108
  var import_rxjs5 = require("rxjs");
2118
2109
  var fetchRpcQueryPack = async (connector, networkId, queries) => {
2119
- const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(import_util.isNotNil);
2110
+ const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(import_util3.isNotNil);
2120
2111
  if (!allStateKeys.length)
2121
2112
  return queries.map(({ stateKeys, decodeResult }) => decodeResult(stateKeys.map(() => null)));
2122
2113
  const [result] = await connector.send(networkId, "state_queryStorageAt", [
@@ -2125,7 +2116,7 @@ var fetchRpcQueryPack = async (connector, networkId, queries) => {
2125
2116
  return decodeRpcQueryPack(queries, result);
2126
2117
  };
2127
2118
  var getRpcQueryPack$ = (connector, networkId, queries, timeout = false) => {
2128
- const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(import_util.isNotNil);
2119
+ const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(import_util3.isNotNil);
2129
2120
  if (!allStateKeys.length)
2130
2121
  return (0, import_rxjs5.of)(queries.map(({ stateKeys, decodeResult }) => decodeResult(stateKeys.map(() => null))));
2131
2122
  return new import_rxjs5.Observable((subscriber) => {
@@ -2168,17 +2159,17 @@ var decodeRpcQueryPack = (queries, result) => {
2168
2159
  var import_scale3 = require("@talismn/scale");
2169
2160
  var hasStorageItem = (metadata, palletName, itemName) => {
2170
2161
  const pallet = metadata.pallets.find((p) => p.name === palletName);
2171
- if (!pallet || !pallet.storage) return false;
2162
+ if (!pallet?.storage) return false;
2172
2163
  return pallet.storage.items.some((item) => item.name === itemName);
2173
2164
  };
2174
2165
  var hasStorageItems = (metadata, palletName, itemNames) => {
2175
2166
  const pallet = metadata.pallets.find((p) => p.name === palletName);
2176
- if (!pallet || !pallet.storage) return false;
2167
+ if (!pallet?.storage) return false;
2177
2168
  return itemNames.every((itemName) => pallet.storage?.items.some((item) => item.name === itemName));
2178
2169
  };
2179
2170
  var hasRuntimeApi = (metadata, apiName, method) => {
2180
2171
  const api = metadata.apis.find((api2) => api2.name === apiName);
2181
- if (!api || !api.methods) return false;
2172
+ if (!api?.methods) return false;
2182
2173
  return api.methods.some((m) => m.name === method);
2183
2174
  };
2184
2175
  var getConstantValue = (metadataRpc, pallet, constant) => {
@@ -2213,8 +2204,77 @@ var getDetectedTokensIds$ = (address) => tokenIdsByAddress.pipe(
2213
2204
  (0, import_rxjs6.distinctUntilChanged)(import_lodash_es11.isEqual)
2214
2205
  );
2215
2206
 
2207
+ // src/modules/sol-spl/onChainTokenMetadata.ts
2208
+ var import_mpl_token_metadata = require("@metaplex-foundation/mpl-token-metadata");
2209
+ var import_umi = require("@metaplex-foundation/umi");
2210
+ var import_spl_token = require("@solana/spl-token");
2211
+ var import_web33 = require("@solana/web3.js");
2212
+ var import_chaindata_provider21 = require("@talismn/chaindata-provider");
2213
+ var import_v47 = __toESM(require("zod/v4"));
2214
+ var TokenCacheSchema3 = import_v47.default.discriminatedUnion("isValid", [
2215
+ import_v47.default.strictObject({
2216
+ id: import_chaindata_provider21.SolSplTokenSchema.shape.id,
2217
+ isValid: import_v47.default.literal(true),
2218
+ ...import_chaindata_provider21.SolSplTokenSchema.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
2219
+ }),
2220
+ import_v47.default.strictObject({
2221
+ id: import_chaindata_provider21.SolSplTokenSchema.shape.id,
2222
+ isValid: import_v47.default.literal(false)
2223
+ })
2224
+ ]);
2225
+ var METAPLEX_PROGRAM_ID = new import_web33.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
2226
+ var ERROR_NO_MINT = "No mint info available";
2227
+ var ERROR_NO_METADATA = "No metadata account found";
2228
+ var ERROR_INVALID_DATA = "Invalid on-chain data";
2229
+ var fetchOnChainTokenData = async (connector, tokenId) => {
2230
+ try {
2231
+ const { networkId, mintAddress } = (0, import_chaindata_provider21.parseSolSplTokenId)(tokenId);
2232
+ const connection = await connector.getConnection(networkId);
2233
+ if (!connection) {
2234
+ log_default.warn(`No connection found for network ${networkId}`);
2235
+ return null;
2236
+ }
2237
+ const mintPubKey = new import_web33.PublicKey(mintAddress);
2238
+ const mintInfo = await connection.getAccountInfo(mintPubKey);
2239
+ if (!mintInfo?.data) throw new Error(ERROR_NO_MINT);
2240
+ const mint = import_spl_token.MintLayout.decode(mintInfo.data);
2241
+ const [metadataPDA] = import_web33.PublicKey.findProgramAddressSync(
2242
+ [Buffer.from("metadata"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],
2243
+ METAPLEX_PROGRAM_ID
2244
+ );
2245
+ const metadataAccount = await connection.getAccountInfo(new import_web33.PublicKey(metadataPDA));
2246
+ if (!metadataAccount) throw new Error(ERROR_NO_METADATA);
2247
+ const metadata = (0, import_mpl_token_metadata.deserializeMetadata)({
2248
+ publicKey: (0, import_umi.publicKey)(metadataPDA),
2249
+ executable: metadataAccount.executable,
2250
+ owner: (0, import_umi.publicKey)(metadataAccount.owner),
2251
+ lamports: (0, import_umi.sol)(metadataAccount.lamports),
2252
+ data: metadataAccount.data
2253
+ });
2254
+ const parsed = TokenCacheSchema3.safeParse({
2255
+ id: tokenId,
2256
+ symbol: metadata.symbol.trim(),
2257
+ name: metadata.name.trim(),
2258
+ decimals: mint.decimals,
2259
+ isValid: true
2260
+ });
2261
+ if (!parsed.success) throw new Error(ERROR_INVALID_DATA);
2262
+ return parsed.data;
2263
+ } catch (err) {
2264
+ const msg = err.message;
2265
+ if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))
2266
+ return TokenCacheSchema3.parse({
2267
+ id: tokenId,
2268
+ isValid: false
2269
+ });
2270
+ log_default.warn("Failed to fetch sol-spl token data for %s", tokenId, { err });
2271
+ }
2272
+ return null;
2273
+ };
2274
+
2216
2275
  // src/modules/sol-spl/fetchBalances.ts
2217
2276
  var SPL_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
2277
+ var dynamicTokenMetadataCache = /* @__PURE__ */ new Map();
2218
2278
  var fetchBalances5 = async ({
2219
2279
  networkId,
2220
2280
  tokensWithAddresses,
@@ -2224,18 +2284,22 @@ var fetchBalances5 = async ({
2224
2284
  const connection = await connector.getConnection(networkId);
2225
2285
  if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
2226
2286
  const accountAddresses = (0, import_lodash_es12.uniq)(tokensWithAddresses.flatMap(([, addresses]) => addresses));
2287
+ const knownTokenIds = new Set(tokensWithAddresses.map(([token]) => token.id));
2288
+ const unknownMints = /* @__PURE__ */ new Set();
2227
2289
  const balancesPerAddress = await Promise.all(
2228
2290
  accountAddresses.map(async (address) => {
2229
- const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new import_web33.PublicKey(address), {
2230
- programId: new import_web33.PublicKey(SPL_PROGRAM_ID)
2291
+ const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new import_web34.PublicKey(address), {
2292
+ programId: new import_web34.PublicKey(SPL_PROGRAM_ID)
2231
2293
  // SPL Token Program ID
2232
2294
  });
2233
2295
  const balances = tokenAccounts.value.map((d) => {
2234
2296
  try {
2235
2297
  const mintAddress = d.account.data.parsed.info.mint;
2236
2298
  const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
2299
+ const tokenId = (0, import_chaindata_provider22.solSplTokenId)(networkId, mintAddress);
2300
+ if (!knownTokenIds.has(tokenId) && value !== "0") unknownMints.add(mintAddress);
2237
2301
  return {
2238
- tokenId: (0, import_chaindata_provider21.solSplTokenId)(networkId, mintAddress),
2302
+ tokenId,
2239
2303
  networkId,
2240
2304
  address,
2241
2305
  source: MODULE_TYPE5,
@@ -2249,7 +2313,7 @@ var fetchBalances5 = async ({
2249
2313
  });
2250
2314
  return null;
2251
2315
  }
2252
- }).filter(import_util2.isNotNil);
2316
+ }).filter(import_util4.isNotNil);
2253
2317
  setDetectedTokenIds(
2254
2318
  address,
2255
2319
  MODULE_TYPE5,
@@ -2258,6 +2322,42 @@ var fetchBalances5 = async ({
2258
2322
  return [address, balances];
2259
2323
  })
2260
2324
  );
2325
+ const dynamicTokens = [];
2326
+ if (unknownMints.size) {
2327
+ await Promise.all(
2328
+ Array.from(unknownMints).map(async (mintAddress) => {
2329
+ const tokenId = (0, import_chaindata_provider22.solSplTokenId)(networkId, mintAddress);
2330
+ let cached = dynamicTokenMetadataCache.get(tokenId);
2331
+ if (!cached) {
2332
+ const fetched = await fetchOnChainTokenData(connector, tokenId);
2333
+ if (fetched) {
2334
+ dynamicTokenMetadataCache.set(tokenId, fetched);
2335
+ cached = fetched;
2336
+ }
2337
+ }
2338
+ if (!cached?.isValid) return;
2339
+ const token = {
2340
+ id: tokenId,
2341
+ type: MODULE_TYPE5,
2342
+ platform: PLATFORM5,
2343
+ networkId,
2344
+ mintAddress,
2345
+ isDefault: true,
2346
+ symbol: cached.symbol,
2347
+ decimals: cached.decimals,
2348
+ ...cached.name !== void 0 ? { name: cached.name } : {},
2349
+ ...cached.logo !== void 0 ? { logo: cached.logo } : {}
2350
+ };
2351
+ const parsed = import_chaindata_provider22.SolSplTokenSchema.safeParse(token);
2352
+ if (!parsed.success) {
2353
+ log_default.warn("Ignoring dynamic sol-spl token with invalid schema", { token });
2354
+ return;
2355
+ }
2356
+ dynamicTokens.push(parsed.data);
2357
+ })
2358
+ );
2359
+ }
2360
+ const registeredDynamicIds = new Set(dynamicTokens.map((t) => t.id));
2261
2361
  const allBalancesByKey = (0, import_lodash_es12.keyBy)(
2262
2362
  balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),
2263
2363
  (b) => getBalanceKey(b.tokenId, b.address)
@@ -2274,30 +2374,16 @@ var fetchBalances5 = async ({
2274
2374
  value: "0"
2275
2375
  };
2276
2376
  });
2277
- return { success, errors: [] };
2377
+ for (const balance of balancesPerAddress.flatMap(([, addressBalances]) => addressBalances)) {
2378
+ if (registeredDynamicIds.has(balance.tokenId)) success.push(balance);
2379
+ }
2380
+ return { success, errors: [], dynamicTokens };
2278
2381
  };
2279
2382
  var getBalanceKey = (tokenId, address) => `${tokenId}:${address}`;
2280
2383
 
2281
2384
  // src/modules/sol-spl/fetchTokens.ts
2282
- var import_mpl_token_metadata = require("@metaplex-foundation/mpl-token-metadata");
2283
- var import_umi = require("@metaplex-foundation/umi");
2284
- var import_spl_token = require("@solana/spl-token");
2285
- var import_web34 = require("@solana/web3.js");
2286
- var import_chaindata_provider22 = require("@talismn/chaindata-provider");
2385
+ var import_chaindata_provider23 = require("@talismn/chaindata-provider");
2287
2386
  var import_lodash_es13 = require("lodash-es");
2288
- var import_v47 = __toESM(require("zod/v4"));
2289
- var TokenCacheSchema3 = import_v47.default.discriminatedUnion("isValid", [
2290
- import_v47.default.strictObject({
2291
- id: import_chaindata_provider22.SolSplTokenSchema.shape.id,
2292
- isValid: import_v47.default.literal(true),
2293
- ...import_chaindata_provider22.SolSplTokenSchema.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
2294
- }),
2295
- import_v47.default.strictObject({
2296
- id: import_chaindata_provider22.SolSplTokenSchema.shape.id,
2297
- isValid: import_v47.default.literal(false)
2298
- })
2299
- ]);
2300
- var METAPLEX_PROGRAM_ID = new import_web34.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
2301
2387
  var fetchTokens5 = async ({
2302
2388
  networkId,
2303
2389
  tokens,
@@ -2306,7 +2392,7 @@ var fetchTokens5 = async ({
2306
2392
  }) => {
2307
2393
  const result = [];
2308
2394
  for (const tokenConfig of tokens) {
2309
- const tokenId = (0, import_chaindata_provider22.solSplTokenId)(networkId, tokenConfig.mintAddress);
2395
+ const tokenId = (0, import_chaindata_provider23.solSplTokenId)(networkId, tokenConfig.mintAddress);
2310
2396
  let cached = cache[tokenId] && TokenCacheSchema3.safeParse(cache[tokenId]).data;
2311
2397
  if (!cached) {
2312
2398
  const tokenInfo = await fetchOnChainTokenData(connector, tokenId);
@@ -2325,7 +2411,7 @@ var fetchTokens5 = async ({
2325
2411
  cached?.isValid ? (0, import_lodash_es13.omit)(cached, ["isValid"]) : {},
2326
2412
  tokenConfig
2327
2413
  );
2328
- const parsed = import_chaindata_provider22.SolSplTokenSchema.safeParse(token);
2414
+ const parsed = import_chaindata_provider23.SolSplTokenSchema.safeParse(token);
2329
2415
  if (!parsed.success) {
2330
2416
  log_default.warn("Ignoring token with invalid SolSplTokenSchema", {
2331
2417
  token
@@ -2336,54 +2422,6 @@ var fetchTokens5 = async ({
2336
2422
  }
2337
2423
  return result;
2338
2424
  };
2339
- var ERROR_NO_MINT = "No mint info available";
2340
- var ERROR_NO_METADATA = "No metadata account found";
2341
- var ERROR_INVALID_DATA = "Invalid on-chain data";
2342
- var fetchOnChainTokenData = async (connector, tokenId) => {
2343
- try {
2344
- const { networkId, mintAddress } = (0, import_chaindata_provider22.parseSolSplTokenId)(tokenId);
2345
- const connection = await connector.getConnection(networkId);
2346
- if (!connection) {
2347
- log_default.warn(`No connection found for network ${networkId}`);
2348
- return null;
2349
- }
2350
- const mintPubKey = new import_web34.PublicKey(mintAddress);
2351
- const mintInfo = await connection.getAccountInfo(mintPubKey);
2352
- if (!mintInfo?.data) throw new Error(ERROR_NO_MINT);
2353
- const mint = import_spl_token.MintLayout.decode(mintInfo.data);
2354
- const [metadataPDA] = import_web34.PublicKey.findProgramAddressSync(
2355
- [Buffer.from("metadata"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],
2356
- METAPLEX_PROGRAM_ID
2357
- );
2358
- const metadataAccount = await connection.getAccountInfo(new import_web34.PublicKey(metadataPDA));
2359
- if (!metadataAccount) throw new Error(ERROR_NO_METADATA);
2360
- const metadata = (0, import_mpl_token_metadata.deserializeMetadata)({
2361
- publicKey: (0, import_umi.publicKey)(metadataPDA),
2362
- executable: metadataAccount.executable,
2363
- owner: (0, import_umi.publicKey)(metadataAccount.owner),
2364
- lamports: (0, import_umi.sol)(metadataAccount.lamports),
2365
- data: metadataAccount.data
2366
- });
2367
- const parsed = TokenCacheSchema3.safeParse({
2368
- id: tokenId,
2369
- symbol: metadata.symbol.trim(),
2370
- name: metadata.name.trim(),
2371
- decimals: mint.decimals,
2372
- isValid: true
2373
- });
2374
- if (!parsed.success) throw new Error(ERROR_INVALID_DATA);
2375
- return parsed.data;
2376
- } catch (err) {
2377
- const msg = err.message;
2378
- if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))
2379
- return TokenCacheSchema3.parse({
2380
- id: tokenId,
2381
- isValid: false
2382
- });
2383
- log_default.warn("Failed to fetch sol-spl token data for %s", tokenId, { err });
2384
- }
2385
- return null;
2386
- };
2387
2425
 
2388
2426
  // src/modules/sol-spl/getMiniMetadata.ts
2389
2427
  var getMiniMetadata5 = () => {
@@ -2393,9 +2431,9 @@ var getMiniMetadata5 = () => {
2393
2431
  // src/modules/sol-spl/getTransferCallData.ts
2394
2432
  var import_spl_token2 = require("@solana/spl-token");
2395
2433
  var import_web35 = require("@solana/web3.js");
2396
- var import_chaindata_provider23 = require("@talismn/chaindata-provider");
2434
+ var import_chaindata_provider24 = require("@talismn/chaindata-provider");
2397
2435
  var getTransferCallData5 = async ({ from: from2, to, value, token, connector }) => {
2398
- if (!(0, import_chaindata_provider23.isTokenOfType)(token, MODULE_TYPE5))
2436
+ if (!(0, import_chaindata_provider24.isTokenOfType)(token, MODULE_TYPE5))
2399
2437
  throw new Error(`Token type ${token.type} is not ${MODULE_TYPE5}.`);
2400
2438
  const connection = await connector.getConnection(token.networkId);
2401
2439
  const instructions = [];
@@ -2488,81 +2526,536 @@ var SolSplBalanceModule = {
2488
2526
  };
2489
2527
 
2490
2528
  // src/modules/sol-spl/types.ts
2491
- var import_chaindata_provider24 = require("@talismn/chaindata-provider");
2529
+ var import_chaindata_provider25 = require("@talismn/chaindata-provider");
2492
2530
  var import_v48 = __toESM(require("zod/v4"));
2493
2531
  var SolSplTokenConfigSchema = import_v48.default.strictObject({
2494
- mintAddress: import_chaindata_provider24.SolSplTokenSchema.shape.mintAddress,
2532
+ mintAddress: import_chaindata_provider25.SolSplTokenSchema.shape.mintAddress,
2495
2533
  ...TokenConfigBaseSchema.shape
2496
2534
  });
2497
2535
 
2498
- // src/modules/substrate-assets/config.ts
2499
- var import_chaindata_provider25 = require("@talismn/chaindata-provider");
2500
- var MODULE_TYPE6 = import_chaindata_provider25.SubAssetsTokenSchema.shape.type.value;
2501
- var PLATFORM6 = import_chaindata_provider25.SubAssetsTokenSchema.shape.platform.value;
2536
+ // src/modules/sol-token2022/config.ts
2537
+ var import_chaindata_provider26 = require("@talismn/chaindata-provider");
2538
+ var MODULE_TYPE6 = import_chaindata_provider26.SolToken2022TokenSchema.shape.type.value;
2539
+ var PLATFORM6 = import_chaindata_provider26.SolToken2022TokenSchema.shape.platform.value;
2502
2540
 
2503
- // src/modules/substrate-assets/buildQueries.ts
2504
- var import_scale4 = require("@talismn/scale");
2505
- var import_util3 = require("@talismn/util");
2506
- var buildQueries = (networkId, balanceDefs, miniMetadata) => {
2507
- const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
2508
- storage: ["Assets", "Account"]
2509
- });
2510
- return balanceDefs.map(({ token, address }) => {
2511
- const scaleCoder = networkStorageCoders?.storage;
2512
- const stateKey = tryEncode(scaleCoder, Number(token.assetId), address) ?? // Asset Hub
2513
- tryEncode(scaleCoder, BigInt(token.assetId), address);
2514
- if (!stateKey) {
2515
- log_default.warn(
2516
- `Invalid assetId / address in ${networkId} storage query ${token.assetId} / ${address}`
2517
- );
2541
+ // src/modules/sol-token2022/fetchBalances.ts
2542
+ var import_web37 = require("@solana/web3.js");
2543
+ var import_chaindata_provider28 = require("@talismn/chaindata-provider");
2544
+ var import_util5 = require("@talismn/util");
2545
+ var import_lodash_es15 = require("lodash-es");
2546
+
2547
+ // src/modules/sol-token2022/onChainTokenMetadata.ts
2548
+ var import_mpl_token_metadata2 = require("@metaplex-foundation/mpl-token-metadata");
2549
+ var import_umi2 = require("@metaplex-foundation/umi");
2550
+ var import_spl_token3 = require("@solana/spl-token");
2551
+ var import_web36 = require("@solana/web3.js");
2552
+ var import_chaindata_provider27 = require("@talismn/chaindata-provider");
2553
+ var import_v49 = __toESM(require("zod/v4"));
2554
+ var TokenCacheSchema4 = import_v49.default.discriminatedUnion("isValid", [
2555
+ import_v49.default.strictObject({
2556
+ id: import_chaindata_provider27.SolToken2022TokenSchema.shape.id,
2557
+ isValid: import_v49.default.literal(true),
2558
+ ...import_chaindata_provider27.SolToken2022TokenSchema.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
2559
+ }),
2560
+ import_v49.default.strictObject({
2561
+ id: import_chaindata_provider27.SolToken2022TokenSchema.shape.id,
2562
+ isValid: import_v49.default.literal(false)
2563
+ })
2564
+ ]);
2565
+ var METAPLEX_PROGRAM_ID2 = new import_web36.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
2566
+ var ERROR_NO_MINT2 = "No mint info available";
2567
+ var ERROR_NO_METADATA2 = "No metadata account found";
2568
+ var ERROR_INVALID_DATA2 = "Invalid on-chain data";
2569
+ var fetchOnChainTokenData2 = async (connector, tokenId) => {
2570
+ try {
2571
+ const { networkId, mintAddress } = (0, import_chaindata_provider27.parseSolToken2022TokenId)(tokenId);
2572
+ const connection = await connector.getConnection(networkId);
2573
+ if (!connection) {
2574
+ log_default.warn(`No connection found for network ${networkId}`);
2518
2575
  return null;
2519
2576
  }
2520
- const decodeResult = (changes) => {
2521
- const decoded = (0, import_scale4.decodeScale)(
2522
- scaleCoder,
2523
- changes[0],
2524
- `Failed to decode substrate-assets balance on chain ${networkId}`
2525
- ) ?? {
2526
- balance: 0n,
2527
- is_frozen: false,
2528
- reason: { type: "Sufficient" },
2529
- status: { type: "Liquid" },
2530
- extra: void 0
2531
- };
2532
- const isFrozen = decoded?.status?.type === "Frozen";
2533
- const amount = (decoded?.balance ?? 0n).toString();
2534
- const free = amount;
2535
- const frozen = token.isFrozen || isFrozen ? amount : "0";
2536
- const balanceValues = [
2537
- { type: "free", label: "free", amount: free.toString() },
2538
- { type: "locked", label: "frozen", amount: frozen.toString() }
2539
- ];
2540
- const balance = {
2541
- source: "substrate-assets",
2542
- status: "live",
2543
- address,
2544
- networkId,
2545
- tokenId: token.id,
2546
- values: balanceValues
2547
- };
2548
- return balance;
2549
- };
2550
- return {
2551
- stateKeys: [stateKey],
2552
- decodeResult
2553
- };
2554
- }).filter(import_util3.isNotNil);
2555
- };
2556
- var tryEncode = (scaleCoder, ...args) => {
2557
- try {
2558
- return scaleCoder?.keys?.enc?.(...args);
2559
- } catch {
2560
- return null;
2577
+ const mintPubKey = new import_web36.PublicKey(mintAddress);
2578
+ const mintInfo = await connection.getAccountInfo(mintPubKey);
2579
+ if (!mintInfo?.data) throw new Error(ERROR_NO_MINT2);
2580
+ const mint = import_spl_token3.MintLayout.decode(mintInfo.data);
2581
+ const token2022Metadata = tryParseToken2022Metadata(mintInfo.data);
2582
+ if (token2022Metadata) {
2583
+ const parsed2 = TokenCacheSchema4.safeParse({
2584
+ id: tokenId,
2585
+ symbol: token2022Metadata.symbol.trim(),
2586
+ name: token2022Metadata.name.trim(),
2587
+ decimals: mint.decimals,
2588
+ isValid: true
2589
+ });
2590
+ if (parsed2.success) return parsed2.data;
2591
+ }
2592
+ const [metadataPDA] = import_web36.PublicKey.findProgramAddressSync(
2593
+ [Buffer.from("metadata"), METAPLEX_PROGRAM_ID2.toBuffer(), mintPubKey.toBuffer()],
2594
+ METAPLEX_PROGRAM_ID2
2595
+ );
2596
+ const metadataAccount = await connection.getAccountInfo(new import_web36.PublicKey(metadataPDA));
2597
+ if (!metadataAccount) throw new Error(ERROR_NO_METADATA2);
2598
+ const metadata = (0, import_mpl_token_metadata2.deserializeMetadata)({
2599
+ publicKey: (0, import_umi2.publicKey)(metadataPDA),
2600
+ executable: metadataAccount.executable,
2601
+ owner: (0, import_umi2.publicKey)(metadataAccount.owner),
2602
+ lamports: (0, import_umi2.sol)(metadataAccount.lamports),
2603
+ data: metadataAccount.data
2604
+ });
2605
+ const parsed = TokenCacheSchema4.safeParse({
2606
+ id: tokenId,
2607
+ symbol: metadata.symbol.trim(),
2608
+ name: metadata.name.trim(),
2609
+ decimals: mint.decimals,
2610
+ isValid: true
2611
+ });
2612
+ if (!parsed.success) throw new Error(ERROR_INVALID_DATA2);
2613
+ return parsed.data;
2614
+ } catch (err) {
2615
+ const msg = err.message;
2616
+ if ([ERROR_NO_MINT2, ERROR_NO_METADATA2, ERROR_INVALID_DATA2].includes(msg))
2617
+ return TokenCacheSchema4.parse({
2618
+ id: tokenId,
2619
+ isValid: false
2620
+ });
2621
+ log_default.warn("Failed to fetch sol-token2022 token data for %s", tokenId, { err });
2622
+ }
2623
+ return null;
2624
+ };
2625
+ var tryParseToken2022Metadata = (data) => {
2626
+ try {
2627
+ const TLV_START = 166;
2628
+ if (data.length <= TLV_START) return null;
2629
+ let offset = TLV_START;
2630
+ while (offset + 4 <= data.length) {
2631
+ const extType = data.readUInt16LE(offset);
2632
+ const extLen = data.readUInt16LE(offset + 2);
2633
+ const extDataStart = offset + 4;
2634
+ if (extType === 19 && extDataStart + extLen <= data.length) {
2635
+ let pos = extDataStart;
2636
+ pos += 64;
2637
+ const readLenPrefixed = () => {
2638
+ if (pos + 4 > data.length) throw new Error("out of bounds");
2639
+ const len = data.readUInt32LE(pos);
2640
+ pos += 4;
2641
+ if (pos + len > data.length) throw new Error("out of bounds");
2642
+ const str = data.subarray(pos, pos + len).toString("utf8");
2643
+ pos += len;
2644
+ return str;
2645
+ };
2646
+ const name = readLenPrefixed();
2647
+ const symbol = readLenPrefixed();
2648
+ const uri = readLenPrefixed();
2649
+ if (name && symbol) return { name, symbol, uri };
2650
+ }
2651
+ offset = extDataStart + extLen;
2652
+ }
2653
+ } catch {
2654
+ }
2655
+ return null;
2656
+ };
2657
+
2658
+ // src/modules/sol-token2022/fetchBalances.ts
2659
+ var TOKEN_2022_PROGRAM_ID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
2660
+ var dynamicTokenMetadataCache2 = /* @__PURE__ */ new Map();
2661
+ var fetchBalances6 = async ({
2662
+ networkId,
2663
+ tokensWithAddresses,
2664
+ connector
2665
+ }) => {
2666
+ if (!tokensWithAddresses.length) return { success: [], errors: [] };
2667
+ const connection = await connector.getConnection(networkId);
2668
+ if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
2669
+ const accountAddresses = (0, import_lodash_es15.uniq)(tokensWithAddresses.flatMap(([, addresses]) => addresses));
2670
+ const knownTokenIds = new Set(tokensWithAddresses.map(([token]) => token.id));
2671
+ const unknownMints = /* @__PURE__ */ new Set();
2672
+ const balancesPerAddress = await Promise.all(
2673
+ accountAddresses.map(async (address) => {
2674
+ const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new import_web37.PublicKey(address), {
2675
+ programId: new import_web37.PublicKey(TOKEN_2022_PROGRAM_ID)
2676
+ });
2677
+ const balances = tokenAccounts.value.map((d) => {
2678
+ try {
2679
+ const mintAddress = d.account.data.parsed.info.mint;
2680
+ const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
2681
+ const tokenId = (0, import_chaindata_provider28.solToken2022TokenId)(networkId, mintAddress);
2682
+ if (!knownTokenIds.has(tokenId) && value !== "0") unknownMints.add(mintAddress);
2683
+ return {
2684
+ tokenId,
2685
+ networkId,
2686
+ address,
2687
+ source: MODULE_TYPE6,
2688
+ status: "live",
2689
+ value
2690
+ };
2691
+ } catch {
2692
+ log_default.warn("Failed to parse token amount", {
2693
+ address,
2694
+ d
2695
+ });
2696
+ return null;
2697
+ }
2698
+ }).filter(import_util5.isNotNil);
2699
+ setDetectedTokenIds(
2700
+ address,
2701
+ MODULE_TYPE6,
2702
+ balances.map((b) => b.tokenId)
2703
+ );
2704
+ return [address, balances];
2705
+ })
2706
+ );
2707
+ const dynamicTokens = [];
2708
+ if (unknownMints.size) {
2709
+ await Promise.all(
2710
+ Array.from(unknownMints).map(async (mintAddress) => {
2711
+ const tokenId = (0, import_chaindata_provider28.solToken2022TokenId)(networkId, mintAddress);
2712
+ let cached = dynamicTokenMetadataCache2.get(tokenId);
2713
+ if (!cached) {
2714
+ const fetched = await fetchOnChainTokenData2(connector, tokenId);
2715
+ if (fetched) {
2716
+ dynamicTokenMetadataCache2.set(tokenId, fetched);
2717
+ cached = fetched;
2718
+ }
2719
+ }
2720
+ if (!cached?.isValid) return;
2721
+ const token = {
2722
+ id: tokenId,
2723
+ type: MODULE_TYPE6,
2724
+ platform: PLATFORM6,
2725
+ networkId,
2726
+ mintAddress,
2727
+ isDefault: true,
2728
+ symbol: cached.symbol,
2729
+ decimals: cached.decimals,
2730
+ ...cached.name !== void 0 ? { name: cached.name } : {},
2731
+ ...cached.logo !== void 0 ? { logo: cached.logo } : {}
2732
+ };
2733
+ const parsed = import_chaindata_provider28.SolToken2022TokenSchema.safeParse(token);
2734
+ if (!parsed.success) {
2735
+ log_default.warn("Ignoring dynamic sol-token2022 token with invalid schema", { token });
2736
+ return;
2737
+ }
2738
+ dynamicTokens.push(parsed.data);
2739
+ })
2740
+ );
2741
+ }
2742
+ const registeredDynamicIds = new Set(dynamicTokens.map((t) => t.id));
2743
+ const allBalancesByKey = (0, import_lodash_es15.keyBy)(
2744
+ balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),
2745
+ (b) => getBalanceKey2(b.tokenId, b.address)
2746
+ );
2747
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
2748
+ const success = balanceDefs.map((bd) => {
2749
+ const found = allBalancesByKey[getBalanceKey2(bd.token.id, bd.address)];
2750
+ return found ?? {
2751
+ tokenId: bd.token.id,
2752
+ networkId: bd.token.networkId,
2753
+ address: bd.address,
2754
+ source: MODULE_TYPE6,
2755
+ status: "live",
2756
+ value: "0"
2757
+ };
2758
+ });
2759
+ for (const balance of balancesPerAddress.flatMap(([, addressBalances]) => addressBalances)) {
2760
+ if (registeredDynamicIds.has(balance.tokenId)) success.push(balance);
2761
+ }
2762
+ return { success, errors: [], dynamicTokens };
2763
+ };
2764
+ var getBalanceKey2 = (tokenId, address) => `${tokenId}:${address}`;
2765
+
2766
+ // src/modules/sol-token2022/fetchTokens.ts
2767
+ var import_chaindata_provider29 = require("@talismn/chaindata-provider");
2768
+ var import_lodash_es16 = require("lodash-es");
2769
+ var fetchTokens6 = async ({
2770
+ networkId,
2771
+ tokens,
2772
+ connector,
2773
+ cache
2774
+ }) => {
2775
+ const result = [];
2776
+ for (const tokenConfig of tokens) {
2777
+ const tokenId = (0, import_chaindata_provider29.solToken2022TokenId)(networkId, tokenConfig.mintAddress);
2778
+ let cached = cache[tokenId] && TokenCacheSchema4.safeParse(cache[tokenId]).data;
2779
+ if (!cached) {
2780
+ const tokenInfo = await fetchOnChainTokenData2(connector, tokenId);
2781
+ if (tokenInfo) cache[tokenId] = tokenInfo;
2782
+ }
2783
+ cached = cache[tokenId] && TokenCacheSchema4.safeParse(cache[tokenId]).data;
2784
+ if (cached?.isValid === false) continue;
2785
+ const base = {
2786
+ id: tokenId,
2787
+ type: MODULE_TYPE6,
2788
+ platform: PLATFORM6,
2789
+ networkId
2790
+ };
2791
+ const token = (0, import_lodash_es16.assign)(
2792
+ base,
2793
+ cached?.isValid ? (0, import_lodash_es16.omit)(cached, ["isValid"]) : {},
2794
+ tokenConfig
2795
+ );
2796
+ const parsed = import_chaindata_provider29.SolToken2022TokenSchema.safeParse(token);
2797
+ if (!parsed.success) {
2798
+ log_default.warn("Ignoring token with invalid SolToken2022TokenSchema", {
2799
+ token
2800
+ });
2801
+ continue;
2802
+ }
2803
+ result.push(parsed.data);
2804
+ }
2805
+ return result;
2806
+ };
2807
+
2808
+ // src/modules/sol-token2022/getMiniMetadata.ts
2809
+ var getMiniMetadata6 = () => {
2810
+ throw new Error("MiniMetadata is not supported for solana tokens");
2811
+ };
2812
+
2813
+ // src/modules/sol-token2022/getTransferCallData.ts
2814
+ var import_spl_token4 = require("@solana/spl-token");
2815
+ var import_web38 = require("@solana/web3.js");
2816
+ var import_chaindata_provider30 = require("@talismn/chaindata-provider");
2817
+ var getTransferCallData6 = async ({ from: from2, to, value, token, connector }) => {
2818
+ if (!(0, import_chaindata_provider30.isTokenOfType)(token, MODULE_TYPE6))
2819
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE6}.`);
2820
+ const connection = await connector.getConnection(token.networkId);
2821
+ const mintPubkey = new import_web38.PublicKey(token.mintAddress);
2822
+ const fromWallet = new import_web38.PublicKey(from2);
2823
+ const toWallet = new import_web38.PublicKey(to);
2824
+ const mintAccount = await (0, import_spl_token4.getMint)(connection, mintPubkey, void 0, import_spl_token4.TOKEN_2022_PROGRAM_ID);
2825
+ const nonTransferable = (0, import_spl_token4.getNonTransferable)(mintAccount);
2826
+ if (nonTransferable) throw new Error("This token is non-transferable.");
2827
+ const transferFeeConfig = (0, import_spl_token4.getTransferFeeConfig)(mintAccount);
2828
+ const transferHook = (0, import_spl_token4.getTransferHook)(mintAccount);
2829
+ const instructions = [];
2830
+ const fromTokenAccount = await (0, import_spl_token4.getAssociatedTokenAddress)(
2831
+ mintPubkey,
2832
+ fromWallet,
2833
+ false,
2834
+ import_spl_token4.TOKEN_2022_PROGRAM_ID
2835
+ );
2836
+ const toTokenAccount = await (0, import_spl_token4.getAssociatedTokenAddress)(
2837
+ mintPubkey,
2838
+ toWallet,
2839
+ false,
2840
+ import_spl_token4.TOKEN_2022_PROGRAM_ID
2841
+ );
2842
+ if (!await tokenAccountExists2(connection, toTokenAccount)) {
2843
+ instructions.push(
2844
+ (0, import_spl_token4.createAssociatedTokenAccountInstruction)(
2845
+ fromWallet,
2846
+ toTokenAccount,
2847
+ toWallet,
2848
+ mintPubkey,
2849
+ import_spl_token4.TOKEN_2022_PROGRAM_ID
2850
+ )
2851
+ );
2852
+ }
2853
+ const amount = BigInt(value);
2854
+ const transferFee = transferFeeConfig ? await calculateCurrentEpochTransferFee(connection, transferFeeConfig, amount) : 0n;
2855
+ if (transferFeeConfig && transferHook) {
2856
+ instructions.push(
2857
+ await (0, import_spl_token4.createTransferCheckedWithFeeAndTransferHookInstruction)(
2858
+ connection,
2859
+ fromTokenAccount,
2860
+ mintPubkey,
2861
+ toTokenAccount,
2862
+ fromWallet,
2863
+ amount,
2864
+ token.decimals,
2865
+ transferFee,
2866
+ [],
2867
+ void 0,
2868
+ import_spl_token4.TOKEN_2022_PROGRAM_ID
2869
+ )
2870
+ );
2871
+ } else if (transferFeeConfig) {
2872
+ instructions.push(
2873
+ (0, import_spl_token4.createTransferCheckedWithFeeInstruction)(
2874
+ fromTokenAccount,
2875
+ mintPubkey,
2876
+ toTokenAccount,
2877
+ fromWallet,
2878
+ amount,
2879
+ token.decimals,
2880
+ transferFee,
2881
+ [],
2882
+ import_spl_token4.TOKEN_2022_PROGRAM_ID
2883
+ )
2884
+ );
2885
+ } else if (transferHook) {
2886
+ instructions.push(
2887
+ await (0, import_spl_token4.createTransferCheckedWithTransferHookInstruction)(
2888
+ connection,
2889
+ fromTokenAccount,
2890
+ mintPubkey,
2891
+ toTokenAccount,
2892
+ fromWallet,
2893
+ amount,
2894
+ token.decimals,
2895
+ [],
2896
+ void 0,
2897
+ import_spl_token4.TOKEN_2022_PROGRAM_ID
2898
+ )
2899
+ );
2900
+ } else {
2901
+ instructions.push(
2902
+ (0, import_spl_token4.createTransferCheckedInstruction)(
2903
+ fromTokenAccount,
2904
+ mintPubkey,
2905
+ toTokenAccount,
2906
+ fromWallet,
2907
+ amount,
2908
+ token.decimals,
2909
+ [],
2910
+ import_spl_token4.TOKEN_2022_PROGRAM_ID
2911
+ )
2912
+ );
2913
+ }
2914
+ return instructions;
2915
+ };
2916
+ var tokenAccountExists2 = async (connection, address) => {
2917
+ try {
2918
+ await (0, import_spl_token4.getAccount)(connection, address, void 0, import_spl_token4.TOKEN_2022_PROGRAM_ID);
2919
+ return true;
2920
+ } catch {
2921
+ return false;
2922
+ }
2923
+ };
2924
+ var calculateToken2022TransferFee = (transferFeeConfig, epoch, amount) => {
2925
+ return (0, import_spl_token4.calculateEpochFee)(transferFeeConfig, epoch, amount);
2926
+ };
2927
+ var calculateCurrentEpochTransferFee = async (connection, transferFeeConfig, amount) => {
2928
+ const { epoch } = await connection.getEpochInfo();
2929
+ return calculateToken2022TransferFee(transferFeeConfig, BigInt(epoch), amount);
2930
+ };
2931
+
2932
+ // src/modules/sol-token2022/subscribeBalances.ts
2933
+ var import_lodash_es17 = require("lodash-es");
2934
+ var import_rxjs8 = require("rxjs");
2935
+ var SUBSCRIPTION_INTERVAL6 = 6e3;
2936
+ var subscribeBalances6 = ({
2937
+ networkId,
2938
+ tokensWithAddresses,
2939
+ connector
2940
+ }) => {
2941
+ if (!tokensWithAddresses.length) return (0, import_rxjs8.of)({ success: [], errors: [] });
2942
+ return new import_rxjs8.Observable((subscriber) => {
2943
+ const abortController = new AbortController();
2944
+ const poll = async () => {
2945
+ try {
2946
+ if (abortController.signal.aborted) return;
2947
+ const balances = await fetchBalances6({
2948
+ networkId,
2949
+ tokensWithAddresses,
2950
+ connector
2951
+ });
2952
+ if (abortController.signal.aborted) return;
2953
+ subscriber.next(balances);
2954
+ setTimeout(poll, SUBSCRIPTION_INTERVAL6);
2955
+ } catch (error) {
2956
+ log_default.error("Error", {
2957
+ module: MODULE_TYPE6,
2958
+ networkId,
2959
+ addressesByToken: tokensWithAddresses,
2960
+ error
2961
+ });
2962
+ subscriber.error(error);
2963
+ }
2964
+ };
2965
+ poll();
2966
+ return () => {
2967
+ abortController.abort();
2968
+ };
2969
+ }).pipe((0, import_rxjs8.distinctUntilChanged)(import_lodash_es17.isEqual));
2970
+ };
2971
+
2972
+ // src/modules/sol-token2022/module.ts
2973
+ var SolToken2022BalanceModule = {
2974
+ type: MODULE_TYPE6,
2975
+ platform: PLATFORM6,
2976
+ getMiniMetadata: getMiniMetadata6,
2977
+ fetchTokens: fetchTokens6,
2978
+ fetchBalances: fetchBalances6,
2979
+ subscribeBalances: subscribeBalances6,
2980
+ getTransferCallData: getTransferCallData6
2981
+ };
2982
+
2983
+ // src/modules/sol-token2022/types.ts
2984
+ var import_chaindata_provider31 = require("@talismn/chaindata-provider");
2985
+ var import_v410 = __toESM(require("zod/v4"));
2986
+ var SolToken2022TokenConfigSchema = import_v410.default.strictObject({
2987
+ mintAddress: import_chaindata_provider31.SolToken2022TokenSchema.shape.mintAddress,
2988
+ ...TokenConfigBaseSchema.shape
2989
+ });
2990
+
2991
+ // src/modules/substrate-assets/config.ts
2992
+ var import_chaindata_provider32 = require("@talismn/chaindata-provider");
2993
+ var MODULE_TYPE7 = import_chaindata_provider32.SubAssetsTokenSchema.shape.type.value;
2994
+ var PLATFORM7 = import_chaindata_provider32.SubAssetsTokenSchema.shape.platform.value;
2995
+
2996
+ // src/modules/substrate-assets/buildQueries.ts
2997
+ var import_scale4 = require("@talismn/scale");
2998
+ var import_util6 = require("@talismn/util");
2999
+ var buildQueries = (networkId, balanceDefs, miniMetadata) => {
3000
+ const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
3001
+ storage: ["Assets", "Account"]
3002
+ });
3003
+ return balanceDefs.map(({ token, address }) => {
3004
+ const scaleCoder = networkStorageCoders?.storage;
3005
+ const stateKey = tryEncode(scaleCoder, Number(token.assetId), address) ?? // Asset Hub
3006
+ tryEncode(scaleCoder, BigInt(token.assetId), address);
3007
+ if (!stateKey) {
3008
+ log_default.warn(
3009
+ `Invalid assetId / address in ${networkId} storage query ${token.assetId} / ${address}`
3010
+ );
3011
+ return null;
3012
+ }
3013
+ const decodeResult = (changes) => {
3014
+ const decoded = (0, import_scale4.decodeScale)(
3015
+ scaleCoder,
3016
+ changes[0],
3017
+ `Failed to decode substrate-assets balance on chain ${networkId}`
3018
+ ) ?? {
3019
+ balance: 0n,
3020
+ is_frozen: false,
3021
+ reason: { type: "Sufficient" },
3022
+ status: { type: "Liquid" },
3023
+ extra: void 0
3024
+ };
3025
+ const isFrozen = decoded?.status?.type === "Frozen";
3026
+ const amount = (decoded?.balance ?? 0n).toString();
3027
+ const free = amount;
3028
+ const frozen = token.isFrozen || isFrozen ? amount : "0";
3029
+ const balanceValues = [
3030
+ { type: "free", label: "free", amount: free.toString() },
3031
+ { type: "locked", label: "frozen", amount: frozen.toString() }
3032
+ ];
3033
+ const balance = {
3034
+ source: "substrate-assets",
3035
+ status: "live",
3036
+ address,
3037
+ networkId,
3038
+ tokenId: token.id,
3039
+ values: balanceValues
3040
+ };
3041
+ return balance;
3042
+ };
3043
+ return {
3044
+ stateKeys: [stateKey],
3045
+ decodeResult
3046
+ };
3047
+ }).filter(import_util6.isNotNil);
3048
+ };
3049
+ var tryEncode = (scaleCoder, ...args) => {
3050
+ try {
3051
+ return scaleCoder?.keys?.enc?.(...args);
3052
+ } catch {
3053
+ return null;
2561
3054
  }
2562
3055
  };
2563
3056
 
2564
3057
  // src/modules/substrate-assets/fetchBalances.ts
2565
- var fetchBalances6 = async ({
3058
+ var fetchBalances7 = async ({
2566
3059
  networkId,
2567
3060
  tokensWithAddresses,
2568
3061
  connector,
@@ -2571,7 +3064,7 @@ var fetchBalances6 = async ({
2571
3064
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
2572
3065
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
2573
3066
  if (!miniMetadata?.data) {
2574
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE6} balances on ${networkId}.`);
3067
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE7} balances on ${networkId}.`);
2575
3068
  return {
2576
3069
  success: [],
2577
3070
  errors: balanceDefs.map((def) => ({
@@ -2581,20 +3074,20 @@ var fetchBalances6 = async ({
2581
3074
  }))
2582
3075
  };
2583
3076
  }
2584
- if (miniMetadata.source !== MODULE_TYPE6) {
2585
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE6}.`);
3077
+ if (miniMetadata.source !== MODULE_TYPE7) {
3078
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE7}.`);
2586
3079
  return {
2587
3080
  success: [],
2588
3081
  errors: balanceDefs.map((def) => ({
2589
3082
  tokenId: def.token.id,
2590
3083
  address: def.address,
2591
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE6}`)
3084
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE7}`)
2592
3085
  }))
2593
3086
  };
2594
3087
  }
2595
3088
  if (miniMetadata.chainId !== networkId) {
2596
3089
  log_default.warn(
2597
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE6}. Expected chainId is ${networkId}`
3090
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE7}. Expected chainId is ${networkId}`
2598
3091
  );
2599
3092
  return {
2600
3093
  success: [],
@@ -2618,7 +3111,7 @@ var fetchBalances6 = async ({
2618
3111
  address: def.address,
2619
3112
  networkId,
2620
3113
  tokenId: def.token.id,
2621
- source: MODULE_TYPE6,
3114
+ source: MODULE_TYPE7,
2622
3115
  status: "live",
2623
3116
  values: [
2624
3117
  { type: "free", label: "free", amount: "0" },
@@ -2632,10 +3125,10 @@ var fetchBalances6 = async ({
2632
3125
  };
2633
3126
 
2634
3127
  // src/modules/substrate-assets/fetchTokens.ts
2635
- var import_chaindata_provider26 = require("@talismn/chaindata-provider");
3128
+ var import_chaindata_provider33 = require("@talismn/chaindata-provider");
2636
3129
  var import_scale5 = require("@talismn/scale");
2637
- var import_lodash_es15 = require("lodash-es");
2638
- var fetchTokens6 = async ({
3130
+ var import_lodash_es18 = require("lodash-es");
3131
+ var fetchTokens7 = async ({
2639
3132
  networkId,
2640
3133
  tokens,
2641
3134
  connector,
@@ -2660,7 +3153,7 @@ var fetchTokens6 = async ({
2660
3153
  ]);
2661
3154
  const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
2662
3155
  const metadataStorageEntries = metadataStorageResults.length ? metadataStorageResults[0].changes : [];
2663
- const assetByAssetId = (0, import_lodash_es15.keyBy)(
3156
+ const assetByAssetId = (0, import_lodash_es18.keyBy)(
2664
3157
  assetStorageEntries.map(([key, value]) => {
2665
3158
  const [assetId] = assetCodec.keys.dec(key);
2666
3159
  const asset = assetCodec.value.dec(value);
@@ -2668,7 +3161,7 @@ var fetchTokens6 = async ({
2668
3161
  }),
2669
3162
  (a) => a.assetId
2670
3163
  );
2671
- const metadataByAssetId = (0, import_lodash_es15.keyBy)(
3164
+ const metadataByAssetId = (0, import_lodash_es18.keyBy)(
2672
3165
  metadataStorageEntries.map(([key, value]) => {
2673
3166
  const [assetId] = metadataCodec.keys.dec(key);
2674
3167
  const metadata = metadataCodec.value.dec(value);
@@ -2682,14 +3175,14 @@ var fetchTokens6 = async ({
2682
3175
  }),
2683
3176
  (a) => a.assetId
2684
3177
  );
2685
- const allTokens = (0, import_lodash_es15.keys)(assetByAssetId).map(
2686
- (assetId) => (0, import_lodash_es15.assign)({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? void 0)
3178
+ const allTokens = (0, import_lodash_es18.keys)(assetByAssetId).map(
3179
+ (assetId) => (0, import_lodash_es18.assign)({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? void 0)
2687
3180
  );
2688
- const configTokenByAssetId = (0, import_lodash_es15.keyBy)(tokens, (t) => t.assetId);
3181
+ const configTokenByAssetId = (0, import_lodash_es18.keyBy)(tokens, (t) => t.assetId);
2689
3182
  return allTokens.map(
2690
3183
  (asset) => ({
2691
- id: (0, import_chaindata_provider26.subAssetTokenId)(networkId, String(asset.assetId)),
2692
- type: MODULE_TYPE6,
3184
+ id: (0, import_chaindata_provider33.subAssetTokenId)(networkId, String(asset.assetId)),
3185
+ type: MODULE_TYPE7,
2693
3186
  platform: "polkadot",
2694
3187
  networkId,
2695
3188
  assetId: String(asset.assetId),
@@ -2706,22 +3199,21 @@ var fetchTokens6 = async ({
2706
3199
  return configToken || token.isSufficient;
2707
3200
  }).map((token) => {
2708
3201
  const configToken = configTokenByAssetId[token.assetId];
2709
- return configToken ? (0, import_lodash_es15.assign)({}, token, configToken) : token;
3202
+ return configToken ? (0, import_lodash_es18.assign)({}, token, configToken) : token;
2710
3203
  }).filter((t) => {
2711
- const parsed = import_chaindata_provider26.SubAssetsTokenSchema.safeParse(t);
3204
+ const parsed = import_chaindata_provider33.SubAssetsTokenSchema.safeParse(t);
2712
3205
  return parsed.success;
2713
3206
  });
2714
3207
  };
2715
3208
 
2716
3209
  // src/modules/substrate-assets/getMiniMetadata.ts
2717
- var import_chaindata_provider37 = require("@talismn/chaindata-provider");
2718
- var import_scale11 = require("@talismn/scale");
3210
+ var import_chaindata_provider44 = require("@talismn/chaindata-provider");
3211
+ var import_scale12 = require("@talismn/scale");
2719
3212
 
2720
3213
  // src/types/balances.ts
2721
- var import_chaindata_provider35 = require("@talismn/chaindata-provider");
3214
+ var import_chaindata_provider42 = require("@talismn/chaindata-provider");
2722
3215
  var import_token_rates2 = require("@talismn/token-rates");
2723
- var import_util6 = require("@talismn/util");
2724
- var import_bignumber2 = __toESM(require("bignumber.js"));
3216
+ var import_util9 = require("@talismn/util");
2725
3217
 
2726
3218
  // src/modules/substrate-dtao/alphaPrice.ts
2727
3219
  var TAO_DECIMALS = 9n;
@@ -2738,14 +3230,191 @@ var taoToAlpha = (tao, scaledAlphaPrice) => {
2738
3230
  if (!tao || !scaledAlphaPrice) return 0n;
2739
3231
  return tao * ALPHA_PRICE_SCALE / scaledAlphaPrice;
2740
3232
  };
3233
+ var taoToAlphaCeil = (tao, scaledAlphaPrice) => {
3234
+ if (!tao || !scaledAlphaPrice) return 0n;
3235
+ return (tao * ALPHA_PRICE_SCALE + scaledAlphaPrice - 1n) / scaledAlphaPrice;
3236
+ };
3237
+
3238
+ // src/modules/substrate-dtao/convictionLocks.ts
3239
+ var import_scale6 = require("@talismn/scale");
3240
+ var convictionLockKey = (address, netuid) => `${address}:${netuid}`;
3241
+ var getConvictionLockLabel = (lockType) => lockType === "perpetual" ? "Perpetual Conviction Lock" : "Decaying Conviction Lock";
3242
+ var findDTaoConvictionLock = (locks) => {
3243
+ for (const lock of locks ?? []) {
3244
+ const meta = lock.meta;
3245
+ if (meta?.convictionLock?.type !== "conviction-lock") continue;
3246
+ const lockType = meta.convictionLock.lockType;
3247
+ return {
3248
+ amount: lock.amount.planck,
3249
+ hotkey: meta.convictionLock.hotkey,
3250
+ lockType,
3251
+ label: getConvictionLockLabel(lockType)
3252
+ };
3253
+ }
3254
+ return null;
3255
+ };
3256
+ var toBigIntValue = (value) => {
3257
+ if (typeof value === "bigint") return value;
3258
+ if (value && typeof value === "object" && "bits" in value) {
3259
+ const bits = value.bits;
3260
+ if (typeof bits === "bigint") return bits;
3261
+ }
3262
+ return 0n;
3263
+ };
3264
+ var fetchConvictionLocks = async (connector, networkId, metadataRpc, addresses) => {
3265
+ if (!addresses.length) return [];
3266
+ const { unifiedMetadata, builder } = (0, import_scale6.parseMetadataRpc)(metadataRpc);
3267
+ if (!hasRuntimeApi(unifiedMetadata, "StakeInfoRuntimeApi", "get_coldkey_lock") || !hasStorageItems(unifiedMetadata, "SubtensorModule", ["Lock", "DecayingLock"])) {
3268
+ return [];
3269
+ }
3270
+ try {
3271
+ const lockStorageCoder = builder.buildStorage("SubtensorModule", "Lock");
3272
+ const decayingLockStorageCoder = builder.buildStorage("SubtensorModule", "DecayingLock");
3273
+ const lockStorageKeys = await fetchConvictionLockStorageKeys(
3274
+ connector,
3275
+ networkId,
3276
+ addresses,
3277
+ lockStorageCoder
3278
+ );
3279
+ if (!lockStorageKeys.length) return [];
3280
+ const hotkeyByPair = new Map(
3281
+ lockStorageKeys.map(({ address, netuid, hotkey }) => [
3282
+ convictionLockKey(address, netuid),
3283
+ hotkey
3284
+ ])
3285
+ );
3286
+ const [lockModesByPair, lockStates] = await Promise.all([
3287
+ fetchConvictionLockModes(connector, networkId, lockStorageKeys, decayingLockStorageCoder),
3288
+ fetchColdkeyLockStates(connector, networkId, builder, lockStorageKeys)
3289
+ ]);
3290
+ return lockStates.flatMap(({ address, netuid, lockState }) => {
3291
+ const amount = lockState?.locked_mass ?? 0n;
3292
+ const convictionRaw = toBigIntValue(lockState?.conviction);
3293
+ if (amount <= 0n && convictionRaw <= 0n) return [];
3294
+ const hotkey = hotkeyByPair.get(convictionLockKey(address, netuid));
3295
+ if (!hotkey) return [];
3296
+ return [
3297
+ {
3298
+ address,
3299
+ netuid,
3300
+ lock: {
3301
+ amount,
3302
+ hotkey,
3303
+ lockType: lockModesByPair.get(convictionLockKey(address, netuid)) ?? "decaying",
3304
+ convictionRaw: convictionRaw.toString()
3305
+ }
3306
+ }
3307
+ ];
3308
+ });
3309
+ } catch (cause) {
3310
+ log_default.warn(`Failed to fetch Bittensor conviction locks on ${networkId}`, { cause });
3311
+ return [];
3312
+ }
3313
+ };
3314
+ var fetchConvictionLockStorageKeys = async (connector, networkId, addresses, storageCoder) => {
3315
+ const keysPerAddress = await Promise.all(
3316
+ addresses.map(async (address) => {
3317
+ let keyPrefix;
3318
+ try {
3319
+ keyPrefix = storageCoder.keys.enc(address);
3320
+ } catch (cause) {
3321
+ log_default.warn(
3322
+ `Failed to encode conviction Lock key prefix (address=${address}) on ${networkId}`,
3323
+ { cause }
3324
+ );
3325
+ return [];
3326
+ }
3327
+ try {
3328
+ const stateKeys = await connector.send(networkId, "state_getKeys", [
3329
+ keyPrefix
3330
+ ]);
3331
+ return stateKeys.flatMap((stateKey) => {
3332
+ try {
3333
+ const [, netuid, hotkey] = storageCoder.keys.dec(stateKey);
3334
+ return [{ address, netuid, hotkey }];
3335
+ } catch (cause) {
3336
+ log_default.warn(`Failed to decode conviction Lock key ${stateKey} on ${networkId}`, { cause });
3337
+ return [];
3338
+ }
3339
+ });
3340
+ } catch (cause) {
3341
+ log_default.warn(`Failed to fetch conviction Lock keys (address=${address}) on ${networkId}`, {
3342
+ cause
3343
+ });
3344
+ return [];
3345
+ }
3346
+ })
3347
+ );
3348
+ return keysPerAddress.flat();
3349
+ };
3350
+ var fetchConvictionLockModes = async (connector, networkId, pairs, storageCoder) => {
3351
+ const queries = pairs.map(
3352
+ ({ address, netuid }) => {
3353
+ let stateKey = null;
3354
+ try {
3355
+ stateKey = storageCoder.keys.enc(address, netuid);
3356
+ } catch (cause) {
3357
+ log_default.warn(
3358
+ `Failed to encode conviction DecayingLock key (netuid=${netuid}, address=${address}) on ${networkId}`,
3359
+ { cause }
3360
+ );
3361
+ }
3362
+ const key = convictionLockKey(address, netuid);
3363
+ return {
3364
+ stateKeys: [stateKey],
3365
+ decodeResult: (changes) => {
3366
+ const hexValue = changes[0];
3367
+ if (!hexValue) return [key, "decaying"];
3368
+ const decoded = (0, import_scale6.decodeScale)(
3369
+ storageCoder,
3370
+ hexValue,
3371
+ `Failed to decode DecayingLock for (netuid=${netuid}, address=${address}) on ${networkId}`
3372
+ );
3373
+ return [key, decoded === false ? "perpetual" : "decaying"];
3374
+ }
3375
+ };
3376
+ }
3377
+ );
3378
+ return new Map(await fetchRpcQueryPack(connector, networkId, queries));
3379
+ };
3380
+ var fetchColdkeyLockStates = async (connector, networkId, builder, pairs) => {
3381
+ return Promise.all(
3382
+ pairs.map(async ({ address, netuid }) => {
3383
+ try {
3384
+ const lockState = await fetchRuntimeCallResult(
3385
+ connector,
3386
+ networkId,
3387
+ builder,
3388
+ "StakeInfoRuntimeApi",
3389
+ "get_coldkey_lock",
3390
+ [address, netuid]
3391
+ );
3392
+ return { address, netuid, lockState };
3393
+ } catch (cause) {
3394
+ log_default.warn(
3395
+ `Failed to fetch get_coldkey_lock for (netuid=${netuid}, address=${address}) on ${networkId}`,
3396
+ { cause }
3397
+ );
3398
+ return { address, netuid, lockState: null };
3399
+ }
3400
+ })
3401
+ );
3402
+ };
2741
3403
 
2742
3404
  // src/modules/substrate-dtao/getDtaoTokenRates.ts
2743
- var import_chaindata_provider27 = require("@talismn/chaindata-provider");
3405
+ var import_chaindata_provider34 = require("@talismn/chaindata-provider");
2744
3406
  var import_token_rates = require("@talismn/token-rates");
2745
3407
  var ONE_ALPHA = 10n ** TAO_DECIMALS;
2746
- var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
3408
+ var getAlphaChange24h = (currency, taoChange24h, alphaPriceChange24h) => {
3409
+ if (typeof alphaPriceChange24h !== "number" || !Number.isFinite(alphaPriceChange24h))
3410
+ return void 0;
3411
+ if (currency === "tao") return alphaPriceChange24h;
3412
+ if (typeof taoChange24h !== "number" || !Number.isFinite(taoChange24h)) return void 0;
3413
+ return ((1 + alphaPriceChange24h / 100) * (1 + taoChange24h / 100) - 1) * 100;
3414
+ };
3415
+ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice, alphaPriceChange24h) => {
2747
3416
  try {
2748
- const taoTokenId = (0, import_chaindata_provider27.subNativeTokenId)(token.networkId);
3417
+ const taoTokenId = (0, import_chaindata_provider34.subNativeTokenId)(token.networkId);
2749
3418
  const taoTokenRates = tokenRates[taoTokenId];
2750
3419
  if (!taoTokenRates) return null;
2751
3420
  if (token.netuid === 0) return structuredClone(taoTokenRates);
@@ -2759,8 +3428,7 @@ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
2759
3428
  alphaRates[currency] = {
2760
3429
  price: taoRate.price * priceRatio,
2761
3430
  marketCap: taoRate.marketCap ? taoRate.marketCap * priceRatio : void 0,
2762
- change24h: void 0
2763
- // cannot be determined from TAO rates alone
3431
+ change24h: getAlphaChange24h(currency, taoRate.change24h, alphaPriceChange24h)
2764
3432
  };
2765
3433
  }
2766
3434
  }
@@ -2772,18 +3440,18 @@ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
2772
3440
  };
2773
3441
 
2774
3442
  // src/modules/substrate-dtao/config.ts
2775
- var import_chaindata_provider28 = require("@talismn/chaindata-provider");
2776
- var MODULE_TYPE7 = import_chaindata_provider28.SubDTaoTokenSchema.shape.type.value;
2777
- var PLATFORM7 = import_chaindata_provider28.SubDTaoTokenSchema.shape.platform.value;
3443
+ var import_chaindata_provider35 = require("@talismn/chaindata-provider");
3444
+ var MODULE_TYPE8 = import_chaindata_provider35.SubDTaoTokenSchema.shape.type.value;
3445
+ var PLATFORM8 = import_chaindata_provider35.SubDTaoTokenSchema.shape.platform.value;
2778
3446
 
2779
3447
  // src/modules/substrate-dtao/fetchBalances.ts
2780
- var import_chaindata_provider30 = require("@talismn/chaindata-provider");
2781
- var import_scale6 = require("@talismn/scale");
2782
- var import_util4 = require("@talismn/util");
2783
- var import_lodash_es16 = require("lodash-es");
3448
+ var import_chaindata_provider37 = require("@talismn/chaindata-provider");
3449
+ var import_scale7 = require("@talismn/scale");
3450
+ var import_util7 = require("@talismn/util");
3451
+ var import_lodash_es19 = require("lodash-es");
2784
3452
 
2785
3453
  // src/modules/substrate-dtao/calculatePendingRootClaimable.ts
2786
- var import_chaindata_provider29 = require("@talismn/chaindata-provider");
3454
+ var import_chaindata_provider36 = require("@talismn/chaindata-provider");
2787
3455
  var calculatePendingRootClaimable = ({
2788
3456
  stake,
2789
3457
  hotkey,
@@ -2805,8 +3473,8 @@ var calculatePendingRootClaimable = ({
2805
3473
  const pendingRootClaim = totalClaimable > alreadyClaimed ? totalClaimable - alreadyClaimed : 0n;
2806
3474
  pendingRootClaimBalances.push({
2807
3475
  address,
2808
- tokenId: (0, import_chaindata_provider29.subDTaoTokenId)(networkId, netuid, hotkey),
2809
- baseTokenId: (0, import_chaindata_provider29.subDTaoTokenId)(networkId, netuid),
3476
+ tokenId: (0, import_chaindata_provider36.subDTaoTokenId)(networkId, netuid, hotkey),
3477
+ baseTokenId: (0, import_chaindata_provider36.subDTaoTokenId)(networkId, netuid),
2810
3478
  hotkey,
2811
3479
  netuid,
2812
3480
  scaledAlphaPrice,
@@ -2819,7 +3487,7 @@ var calculatePendingRootClaimable = ({
2819
3487
 
2820
3488
  // src/modules/substrate-dtao/fetchBalances.ts
2821
3489
  var ROOT_NETUID = 0;
2822
- var fetchBalances7 = async ({
3490
+ var fetchBalances8 = async ({
2823
3491
  networkId,
2824
3492
  tokensWithAddresses,
2825
3493
  connector,
@@ -2828,7 +3496,7 @@ var fetchBalances7 = async ({
2828
3496
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
2829
3497
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
2830
3498
  if (!miniMetadata?.data) {
2831
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE7} balances on ${networkId}.`, {
3499
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE8} balances on ${networkId}.`, {
2832
3500
  tokensWithAddresses
2833
3501
  });
2834
3502
  return {
@@ -2840,20 +3508,20 @@ var fetchBalances7 = async ({
2840
3508
  }))
2841
3509
  };
2842
3510
  }
2843
- if (miniMetadata.source !== MODULE_TYPE7) {
2844
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE7}.`);
3511
+ if (miniMetadata.source !== MODULE_TYPE8) {
3512
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE8}.`);
2845
3513
  return {
2846
3514
  success: [],
2847
3515
  errors: balanceDefs.map((def) => ({
2848
3516
  tokenId: def.token.id,
2849
3517
  address: def.address,
2850
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE7}`)
3518
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE8}`)
2851
3519
  }))
2852
3520
  };
2853
3521
  }
2854
3522
  if (miniMetadata.chainId !== networkId) {
2855
3523
  log_default.warn(
2856
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE7}. Expected chainId is ${networkId}`
3524
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE8}. Expected chainId is ${networkId}`
2857
3525
  );
2858
3526
  return {
2859
3527
  success: [],
@@ -2864,7 +3532,7 @@ var fetchBalances7 = async ({
2864
3532
  }))
2865
3533
  };
2866
3534
  }
2867
- const addresses = (0, import_lodash_es16.uniq)(balanceDefs.map((def) => def.address));
3535
+ const addresses = (0, import_lodash_es19.uniq)(balanceDefs.map((def) => def.address));
2868
3536
  try {
2869
3537
  const [stakeInfos, dynamicInfos] = await Promise.all([
2870
3538
  fetchRuntimeCallResult(
@@ -2884,7 +3552,8 @@ var fetchBalances7 = async ({
2884
3552
  []
2885
3553
  )
2886
3554
  ]);
2887
- const rootHotkeys = (0, import_lodash_es16.uniq)(
3555
+ const dynamicInfoByNetuid = (0, import_lodash_es19.keyBy)(dynamicInfos.filter(import_util7.isNotNil), (info) => info.netuid);
3556
+ const rootHotkeys = (0, import_lodash_es19.uniq)(
2888
3557
  stakeInfos.flatMap(
2889
3558
  ([, stakes]) => stakes.filter((stake) => stake.netuid === ROOT_NETUID).map((stake) => stake.hotkey)
2890
3559
  )
@@ -2903,13 +3572,10 @@ var fetchBalances7 = async ({
2903
3572
  }
2904
3573
  }
2905
3574
  }
2906
- const rootClaimedAmounts = addressHotkeyNetuidPairs.length && miniMetadata.data ? await fetchRootClaimedAmounts(
2907
- connector,
2908
- networkId,
2909
- miniMetadata.data,
2910
- addressHotkeyNetuidPairs
2911
- ) : /* @__PURE__ */ new Map();
2912
- const dynamicInfoByNetuid = (0, import_lodash_es16.keyBy)(dynamicInfos.filter(import_util4.isNotNil), (info) => info.netuid);
3575
+ const [rootClaimedAmounts, convictionLocks] = await Promise.all([
3576
+ addressHotkeyNetuidPairs.length && miniMetadata.data ? fetchRootClaimedAmounts(connector, networkId, miniMetadata.data, addressHotkeyNetuidPairs) : Promise.resolve(/* @__PURE__ */ new Map()),
3577
+ miniMetadata.data ? fetchConvictionLocks(connector, networkId, miniMetadata.data, addresses) : Promise.resolve([])
3578
+ ]);
2913
3579
  const upsertBalance = (acc, address, tokenId, balance) => {
2914
3580
  const key = `${address}:${tokenId}`;
2915
3581
  const recordedBalance = acc[key];
@@ -2920,6 +3586,9 @@ var fetchBalances7 = async ({
2920
3586
  // If the new balance has pendingRootClaim, use it (it's calculated from current state)
2921
3587
  ...balance.pendingRootClaim !== void 0 && {
2922
3588
  pendingRootClaim: balance.pendingRootClaim
3589
+ },
3590
+ ...balance.convictionLock !== void 0 && {
3591
+ convictionLock: balance.convictionLock
2923
3592
  }
2924
3593
  };
2925
3594
  } else {
@@ -2933,8 +3602,8 @@ var fetchBalances7 = async ({
2933
3602
  const scaledAlphaPrice = dynamicInfo ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in) : 0n;
2934
3603
  const balance = {
2935
3604
  address,
2936
- tokenId: (0, import_chaindata_provider30.subDTaoTokenId)(networkId, stake.netuid, stake.hotkey),
2937
- baseTokenId: (0, import_chaindata_provider30.subDTaoTokenId)(networkId, stake.netuid),
3605
+ tokenId: (0, import_chaindata_provider37.subDTaoTokenId)(networkId, stake.netuid, stake.hotkey),
3606
+ baseTokenId: (0, import_chaindata_provider37.subDTaoTokenId)(networkId, stake.netuid),
2938
3607
  stake: stake.stake,
2939
3608
  hotkey: stake.hotkey,
2940
3609
  netuid: stake.netuid,
@@ -2962,18 +3631,34 @@ var fetchBalances7 = async ({
2962
3631
  },
2963
3632
  {}
2964
3633
  );
3634
+ for (const { address, netuid, lock } of convictionLocks) {
3635
+ const dynamicInfo = dynamicInfoByNetuid[netuid];
3636
+ const scaledAlphaPrice = dynamicInfo ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in) : 0n;
3637
+ const balance = {
3638
+ address,
3639
+ tokenId: (0, import_chaindata_provider37.subDTaoTokenId)(networkId, netuid),
3640
+ baseTokenId: (0, import_chaindata_provider37.subDTaoTokenId)(networkId, netuid),
3641
+ stake: 0n,
3642
+ hotkey: lock.hotkey,
3643
+ netuid,
3644
+ scaledAlphaPrice,
3645
+ convictionLock: lock
3646
+ };
3647
+ upsertBalance(balancesRaw, address, balance.tokenId, balance);
3648
+ }
2965
3649
  const balances = Object.values(balancesRaw);
2966
- const tokensById = (0, import_lodash_es16.keyBy)(
3650
+ const tokensById = (0, import_lodash_es19.keyBy)(
2967
3651
  tokensWithAddresses.map(([token]) => token),
2968
3652
  (t) => t.id
2969
3653
  );
2970
3654
  const dynamicTokens = [];
2971
3655
  for (const bal of balances) {
3656
+ if (bal.tokenId === bal.baseTokenId) continue;
2972
3657
  if (!balanceDefs.some((def) => def.token.id === bal.tokenId)) {
2973
3658
  const baseToken = tokensById[bal.baseTokenId];
2974
3659
  if (baseToken) {
2975
- const cleanToken = (0, import_chaindata_provider30.getCleanToken)(baseToken);
2976
- const newToken = import_chaindata_provider30.TokenSchema.parse({
3660
+ const cleanToken = (0, import_chaindata_provider37.getCleanToken)(baseToken);
3661
+ const newToken = import_chaindata_provider37.TokenSchema.parse({
2977
3662
  ...cleanToken,
2978
3663
  id: bal.tokenId,
2979
3664
  hotkey: bal.hotkey
@@ -2989,6 +3674,8 @@ var fetchBalances7 = async ({
2989
3674
  };
2990
3675
  const stakeAmount = BigInt(stake?.stake?.toString() ?? "0");
2991
3676
  const pendingRootClaimAmount = BigInt(stake?.pendingRootClaim?.toString() ?? "0");
3677
+ const convictionLockAmount = BigInt(stake?.convictionLock?.amount?.toString() ?? "0");
3678
+ const convictionLockConviction = BigInt(stake?.convictionLock?.convictionRaw ?? "0");
2992
3679
  const hasZeroStake = stakeAmount === 0n;
2993
3680
  const hasPendingRootClaim = pendingRootClaimAmount > 0n;
2994
3681
  const balanceValue = {
@@ -3001,9 +3688,30 @@ var fetchBalances7 = async ({
3001
3688
  type: "locked",
3002
3689
  label: "Pending root claim",
3003
3690
  amount: pendingRootClaimAmount.toString(),
3691
+ // The pending claim is not part of the stake (free amount): on-chain it only becomes
3692
+ // stake once claimed (root_claim_on_subnet). Since it was never included in `free`,
3693
+ // it must not be subtracted from it either: flag it so it does not reduce the staked
3694
+ // position's transferable amount.
3695
+ includeInTransferable: true,
3004
3696
  meta
3005
3697
  };
3006
3698
  const values3 = [balanceValue, pendingRootClaimValue];
3699
+ if (stake?.convictionLock && (convictionLockAmount > 0n || convictionLockConviction > 0n)) {
3700
+ const convictionLockMeta = {
3701
+ ...meta,
3702
+ convictionLock: {
3703
+ type: "conviction-lock",
3704
+ hotkey: stake.convictionLock.hotkey,
3705
+ lockType: stake.convictionLock.lockType
3706
+ }
3707
+ };
3708
+ values3.push({
3709
+ type: "locked",
3710
+ label: getConvictionLockLabel(stake.convictionLock.lockType),
3711
+ amount: convictionLockAmount.toString(),
3712
+ meta: convictionLockMeta
3713
+ });
3714
+ }
3007
3715
  if (hasZeroStake && hasPendingRootClaim) {
3008
3716
  values3.push({
3009
3717
  type: "extra",
@@ -3017,7 +3725,7 @@ var fetchBalances7 = async ({
3017
3725
  address: def.address,
3018
3726
  networkId,
3019
3727
  tokenId: def.token.id,
3020
- source: MODULE_TYPE7,
3728
+ source: MODULE_TYPE8,
3021
3729
  status: "live",
3022
3730
  values: values3
3023
3731
  };
@@ -3041,7 +3749,7 @@ var fetchBalances7 = async ({
3041
3749
  }
3042
3750
  };
3043
3751
  var buildStorageCoder = (metadataRpc, pallet, entry) => {
3044
- const { builder } = (0, import_scale6.parseMetadataRpc)(metadataRpc);
3752
+ const { builder } = (0, import_scale7.parseMetadataRpc)(metadataRpc);
3045
3753
  return builder.buildStorage(pallet, entry);
3046
3754
  };
3047
3755
  var buildRootClaimableStorageCoder = async (_connector, networkId, metadataRpc) => {
@@ -3085,7 +3793,7 @@ var buildRootClaimableQueries = (networkId, hotkeys, storageCoder) => {
3085
3793
  if (!hexValue) {
3086
3794
  return [hotkey, /* @__PURE__ */ new Map()];
3087
3795
  }
3088
- const decoded = (0, import_scale6.decodeScale)(
3796
+ const decoded = (0, import_scale7.decodeScale)(
3089
3797
  storageCoder,
3090
3798
  hexValue,
3091
3799
  `Failed to decode RootClaimable for hotkey ${hotkey} on ${networkId}`
@@ -3129,7 +3837,7 @@ var buildRootClaimedQueries = (networkId, addressHotkeyNetuidPairs, storageCoder
3129
3837
  if (!hexValue) {
3130
3838
  return [address, hotkey, netuid, 0n];
3131
3839
  }
3132
- const decoded = (0, import_scale6.decodeScale)(
3840
+ const decoded = (0, import_scale7.decodeScale)(
3133
3841
  storageCoder,
3134
3842
  hexValue,
3135
3843
  `Failed to decode RootClaimed for (netuid=${netuid}, hotkey=${hotkey}, address=${address}) on ${networkId}`
@@ -3184,15 +3892,15 @@ var fetchRootClaimedAmounts = async (connector, networkId, metadataRpc, addressH
3184
3892
  };
3185
3893
 
3186
3894
  // src/modules/substrate-dtao/fetchTokens.ts
3187
- var import_chaindata_provider31 = require("@talismn/chaindata-provider");
3188
- var import_scale7 = require("@talismn/scale");
3189
- var import_util5 = require("@talismn/util");
3190
- var import_lodash_es17 = require("lodash-es");
3895
+ var import_chaindata_provider38 = require("@talismn/chaindata-provider");
3896
+ var import_scale8 = require("@talismn/scale");
3897
+ var import_util8 = require("@talismn/util");
3898
+ var import_lodash_es20 = require("lodash-es");
3191
3899
  var NATIVE_TOKEN_SYMBOLS = {
3192
3900
  "bittensor": "TAO",
3193
3901
  "bittensor-testnet": "testTAO"
3194
3902
  };
3195
- var fetchTokens7 = async ({
3903
+ var fetchTokens8 = async ({
3196
3904
  networkId,
3197
3905
  connector,
3198
3906
  tokens,
@@ -3211,7 +3919,7 @@ var fetchTokens7 = async ({
3211
3919
  []
3212
3920
  )
3213
3921
  ]);
3214
- return dynamicInfos.filter(import_util5.isNotNil).map((info) => {
3922
+ return dynamicInfos.filter(import_util8.isNotNil).map((info) => {
3215
3923
  const config = tokens.find((t) => t.netuid === info.netuid);
3216
3924
  let symbol = new TextDecoder().decode(Uint8Array.from(info.token_symbol));
3217
3925
  const subnetName = info.subnet_identity?.subnet_name?.asText() ?? (info.netuid === 0 ? "Root" : `Subnet ${info.netuid}`);
@@ -3220,9 +3928,9 @@ var fetchTokens7 = async ({
3220
3928
  symbol = NATIVE_TOKEN_SYMBOLS[networkId];
3221
3929
  const isTransferable = transferableTokensMap[info.netuid] ?? true;
3222
3930
  const token = {
3223
- id: (0, import_chaindata_provider31.subDTaoTokenId)(networkId, info.netuid),
3224
- type: MODULE_TYPE7,
3225
- platform: PLATFORM7,
3931
+ id: (0, import_chaindata_provider38.subDTaoTokenId)(networkId, info.netuid),
3932
+ type: MODULE_TYPE8,
3933
+ platform: PLATFORM8,
3226
3934
  networkId,
3227
3935
  netuid: info.netuid,
3228
3936
  isDefault: true,
@@ -3234,15 +3942,15 @@ var fetchTokens7 = async ({
3234
3942
  };
3235
3943
  return Object.assign({}, token, config);
3236
3944
  }).filter((t) => {
3237
- const parsed = import_chaindata_provider31.SubDTaoTokenSchema.safeParse(t);
3945
+ const parsed = import_chaindata_provider38.SubDTaoTokenSchema.safeParse(t);
3238
3946
  return parsed.success;
3239
3947
  });
3240
3948
  };
3241
3949
  var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
3242
- const { builder } = (0, import_scale7.parseMetadataRpc)(metadata);
3950
+ const { builder } = (0, import_scale8.parseMetadataRpc)(metadata);
3243
3951
  const transferToggleCodec = builder.buildStorage("SubtensorModule", "TransferToggle");
3244
3952
  const transferToggleKeys = await connector.send(networkId, "state_getKeys", [
3245
- (0, import_scale7.getStorageKeyPrefix)("SubtensorModule", "TransferToggle")
3953
+ (0, import_scale8.getStorageKeyPrefix)("SubtensorModule", "TransferToggle")
3246
3954
  ]);
3247
3955
  const transferToggleResults = await connector.send(
3248
3956
  networkId,
@@ -3250,7 +3958,7 @@ var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
3250
3958
  [transferToggleKeys]
3251
3959
  );
3252
3960
  const transferToggleEntries = transferToggleResults.length ? transferToggleResults[0].changes : [];
3253
- return (0, import_lodash_es17.fromPairs)(
3961
+ return (0, import_lodash_es20.fromPairs)(
3254
3962
  transferToggleEntries.map(([key, value]) => {
3255
3963
  const [netuid] = transferToggleCodec.keys.dec(key);
3256
3964
  const isTransferable = transferToggleCodec.value.dec(value);
@@ -3260,14 +3968,14 @@ var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
3260
3968
  };
3261
3969
 
3262
3970
  // src/modules/substrate-dtao/getMiniMetadata.ts
3263
- var import_chaindata_provider32 = require("@talismn/chaindata-provider");
3264
- var import_scale8 = require("@talismn/scale");
3265
- var getMiniMetadata6 = ({
3971
+ var import_chaindata_provider39 = require("@talismn/chaindata-provider");
3972
+ var import_scale9 = require("@talismn/scale");
3973
+ var getMiniMetadata7 = ({
3266
3974
  networkId,
3267
3975
  specVersion,
3268
3976
  metadataRpc
3269
3977
  }) => {
3270
- const source = MODULE_TYPE7;
3978
+ const source = MODULE_TYPE8;
3271
3979
  const chainId = networkId;
3272
3980
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
3273
3981
  if (specVersion !== systemVersion.spec_version)
@@ -3275,7 +3983,7 @@ var getMiniMetadata6 = ({
3275
3983
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
3276
3984
  );
3277
3985
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
3278
- const { unifiedMetadata } = (0, import_scale8.parseMetadataRpc)(metadataRpc);
3986
+ const { unifiedMetadata } = (0, import_scale9.parseMetadataRpc)(metadataRpc);
3279
3987
  if (unifiedMetadata.version < 14)
3280
3988
  throw new Error(
3281
3989
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -3285,22 +3993,27 @@ var getMiniMetadata6 = ({
3285
3993
  source,
3286
3994
  chainId,
3287
3995
  specVersion,
3288
- version: import_chaindata_provider32.MINIMETADATA_VERSION,
3996
+ version: import_chaindata_provider39.MINIMETADATA_VERSION,
3289
3997
  data: getData(metadataRpc),
3290
3998
  extra: null
3291
3999
  };
3292
4000
  };
3293
4001
  var getData = (metadataRpc) => {
3294
- const { metadata, unifiedMetadata } = (0, import_scale8.parseMetadataRpc)(metadataRpc);
4002
+ const { metadata, unifiedMetadata } = (0, import_scale9.parseMetadataRpc)(metadataRpc);
3295
4003
  const isBittensor = unifiedMetadata.pallets.some(({ name }) => name === "SubtensorModule");
3296
4004
  if (!isBittensor) return null;
3297
- (0, import_scale8.compactMetadata)(
4005
+ (0, import_scale9.compactMetadata)(
3298
4006
  metadata,
3299
- [{ pallet: "SubtensorModule", items: ["TransferToggle", "RootClaimable", "RootClaimed"] }],
4007
+ [
4008
+ {
4009
+ pallet: "SubtensorModule",
4010
+ items: ["TransferToggle", "RootClaimable", "RootClaimed", "Lock", "DecayingLock"]
4011
+ }
4012
+ ],
3300
4013
  [
3301
4014
  {
3302
4015
  runtimeApi: "StakeInfoRuntimeApi",
3303
- methods: ["get_stake_info_for_coldkeys"]
4016
+ methods: ["get_stake_info_for_coldkeys", "get_coldkey_lock"]
3304
4017
  },
3305
4018
  {
3306
4019
  runtimeApi: "SubnetInfoRuntimeApi",
@@ -3308,26 +4021,26 @@ var getData = (metadataRpc) => {
3308
4021
  }
3309
4022
  ]
3310
4023
  );
3311
- return (0, import_scale8.encodeMetadata)(metadata);
4024
+ return (0, import_scale9.encodeMetadata)(metadata);
3312
4025
  };
3313
4026
 
3314
4027
  // src/modules/substrate-dtao/getTransferCallData.ts
3315
4028
  var import_utils3 = require("@polkadot-api/utils");
3316
- var import_chaindata_provider33 = require("@talismn/chaindata-provider");
3317
- var import_scale9 = require("@talismn/scale");
4029
+ var import_chaindata_provider40 = require("@talismn/chaindata-provider");
4030
+ var import_scale10 = require("@talismn/scale");
3318
4031
  var import_polkadot_api = require("polkadot-api");
3319
- var getTransferCallData6 = ({
4032
+ var getTransferCallData7 = ({
3320
4033
  from: from2,
3321
4034
  to,
3322
4035
  value,
3323
4036
  token,
3324
4037
  metadataRpc
3325
4038
  }) => {
3326
- if (!(0, import_chaindata_provider33.isTokenOfType)(token, MODULE_TYPE7))
3327
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE7}.`);
3328
- const { netuid: subnetId, hotkey } = (0, import_chaindata_provider33.parseSubDTaoTokenId)(token.id);
4039
+ if (!(0, import_chaindata_provider40.isTokenOfType)(token, MODULE_TYPE8))
4040
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE8}.`);
4041
+ const { netuid: subnetId, hotkey } = (0, import_chaindata_provider40.parseSubDTaoTokenId)(token.id);
3329
4042
  if (!hotkey) throw new Error(`Missing hotkey`);
3330
- const { builder } = (0, import_scale9.parseMetadataRpc)(metadataRpc);
4043
+ const { builder } = (0, import_scale10.parseMetadataRpc)(metadataRpc);
3331
4044
  const { codec, location } = builder.buildCall("SubtensorModule", "transfer_stake");
3332
4045
  const args = codec.enc({
3333
4046
  origin_netuid: subnetId,
@@ -3344,22 +4057,23 @@ var getTransferCallData6 = ({
3344
4057
  };
3345
4058
 
3346
4059
  // src/modules/substrate-dtao/subscribeBalances.ts
3347
- var import_lodash_es18 = require("lodash-es");
3348
- var import_rxjs8 = require("rxjs");
3349
- var SUBSCRIPTION_INTERVAL6 = 6e3;
3350
- var subscribeBalances6 = ({
4060
+ var import_lodash_es21 = require("lodash-es");
4061
+ var import_rxjs9 = require("rxjs");
4062
+ var SUBSCRIPTION_INTERVAL7 = 6e3;
4063
+ var subscribeBalances7 = ({
3351
4064
  networkId,
3352
4065
  tokensWithAddresses,
3353
4066
  connector,
3354
4067
  miniMetadata
3355
4068
  }) => {
3356
- if (!tokensWithAddresses.length) return (0, import_rxjs8.of)({ success: [], errors: [] });
3357
- return new import_rxjs8.Observable((subscriber) => {
4069
+ if (!tokensWithAddresses.length) return (0, import_rxjs9.of)({ success: [], errors: [] });
4070
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
4071
+ return new import_rxjs9.Observable((subscriber) => {
3358
4072
  const abortController = new AbortController();
3359
4073
  const poll = async () => {
3360
4074
  try {
3361
4075
  if (abortController.signal.aborted) return;
3362
- const balances = await fetchBalances7({
4076
+ const balances = await fetchBalances8({
3363
4077
  networkId,
3364
4078
  tokensWithAddresses,
3365
4079
  connector,
@@ -3367,41 +4081,50 @@ var subscribeBalances6 = ({
3367
4081
  });
3368
4082
  if (abortController.signal.aborted) return;
3369
4083
  subscriber.next(balances);
3370
- setTimeout(poll, SUBSCRIPTION_INTERVAL6);
3371
4084
  } catch (error) {
4085
+ if (abortController.signal.aborted) return;
3372
4086
  log_default.error("Error", {
3373
- module: MODULE_TYPE7,
4087
+ module: MODULE_TYPE8,
3374
4088
  networkId,
3375
4089
  miniMetadata,
3376
4090
  addressesByToken: tokensWithAddresses,
3377
4091
  error
3378
4092
  });
3379
- subscriber.error(error);
4093
+ const fetchError = error instanceof Error ? error : new Error(String(error));
4094
+ subscriber.next({
4095
+ success: [],
4096
+ errors: balanceDefs.map((def) => ({
4097
+ tokenId: def.token.id,
4098
+ address: def.address,
4099
+ error: fetchError
4100
+ }))
4101
+ });
3380
4102
  }
4103
+ if (!abortController.signal.aborted) setTimeout(poll, SUBSCRIPTION_INTERVAL7);
3381
4104
  };
3382
4105
  poll();
3383
4106
  return () => {
3384
4107
  abortController.abort();
3385
4108
  };
3386
- }).pipe((0, import_rxjs8.distinctUntilChanged)(import_lodash_es18.isEqual));
4109
+ }).pipe((0, import_rxjs9.distinctUntilChanged)(import_lodash_es21.isEqual));
3387
4110
  };
3388
4111
 
3389
4112
  // src/modules/substrate-dtao/module.ts
3390
4113
  var SubDTaoBalanceModule = {
3391
- type: MODULE_TYPE7,
3392
- platform: PLATFORM7,
3393
- getMiniMetadata: getMiniMetadata6,
3394
- fetchTokens: fetchTokens7,
3395
- fetchBalances: fetchBalances7,
3396
- subscribeBalances: subscribeBalances6,
3397
- getTransferCallData: getTransferCallData6
4114
+ type: MODULE_TYPE8,
4115
+ platform: PLATFORM8,
4116
+ getMiniMetadata: getMiniMetadata7,
4117
+ fetchTokens: fetchTokens8,
4118
+ fetchBalances: fetchBalances8,
4119
+ subscribeBalances: subscribeBalances7,
4120
+ getTransferCallData: getTransferCallData7
3398
4121
  };
3399
4122
 
3400
4123
  // src/modules/substrate-dtao/types.ts
3401
- var import_chaindata_provider34 = require("@talismn/chaindata-provider");
3402
- var import_v49 = __toESM(require("zod/v4"));
3403
- var SubDTaoTokenConfigSchema = import_v49.default.strictObject({
3404
- netuid: import_chaindata_provider34.SubDTaoTokenSchema.shape.netuid,
4124
+ var import_chaindata_provider41 = require("@talismn/chaindata-provider");
4125
+ var import_v411 = __toESM(require("zod/v4"));
4126
+ var SubDTaoTokenConfigSchema = import_v411.default.strictObject({
4127
+ netuid: import_chaindata_provider41.SubDTaoTokenSchema.shape.netuid,
3405
4128
  ...TokenConfigBaseSchema.shape
3406
4129
  });
3407
4130
 
@@ -3409,7 +4132,7 @@ var SubDTaoTokenConfigSchema = import_v49.default.strictObject({
3409
4132
  function excludeFromTransferableAmount(locks) {
3410
4133
  if (typeof locks === "string") return BigInt(locks);
3411
4134
  if (!Array.isArray(locks)) locks = [locks];
3412
- return locks.filter((lock) => lock.includeInTransferable !== true).map((lock) => lock.amount.planck).reduce((max, lock) => import_util6.BigMath.max(max, lock), 0n);
4135
+ return locks.filter((lock) => lock.includeInTransferable !== true).map((lock) => lock.amount.planck).reduce((max, lock) => import_util9.BigMath.max(max, lock), 0n);
3413
4136
  }
3414
4137
  function excludeFromFeePayableLocks(locks) {
3415
4138
  if (typeof locks === "string") return [];
@@ -3437,7 +4160,7 @@ var Balances = class _Balances {
3437
4160
  if (balances instanceof Balance) return new _Balances([balances], hydrate);
3438
4161
  if (!Array.isArray(balances)) return new _Balances(Object.values(balances), hydrate);
3439
4162
  if (balances.length === 0) return this;
3440
- if (!(0, import_util6.isArrayOf)(balances, Balance))
4163
+ if (!(0, import_util9.isArrayOf)(balances, Balance))
3441
4164
  return new _Balances(
3442
4165
  balances.map((storage) => new Balance(storage)),
3443
4166
  hydrate
@@ -3631,7 +4354,7 @@ var Balance = class {
3631
4354
  if (hydrate !== void 0) this.#db = hydrate;
3632
4355
  };
3633
4356
  #format = (balance) => new BalanceFormatter(
3634
- (0, import_util6.isBigInt)(balance) ? balance.toString() : balance,
4357
+ (0, import_util9.isBigInt)(balance) ? balance.toString() : balance,
3635
4358
  this.decimals || void 0,
3636
4359
  this.rates
3637
4360
  );
@@ -3667,8 +4390,8 @@ var Balance = class {
3667
4390
  }
3668
4391
  get rates() {
3669
4392
  if (this.isSource("evm-uniswapv2") && this.token?.type === "evm-uniswapv2") {
3670
- const tokenId0 = (0, import_chaindata_provider35.evmErc20TokenId)(this.networkId, this.token.tokenAddress0);
3671
- const tokenId1 = (0, import_chaindata_provider35.evmErc20TokenId)(this.networkId, this.token.tokenAddress1);
4393
+ const tokenId0 = (0, import_chaindata_provider42.evmErc20TokenId)(this.networkId, this.token.tokenAddress0);
4394
+ const tokenId1 = (0, import_chaindata_provider42.evmErc20TokenId)(this.networkId, this.token.tokenAddress1);
3672
4395
  const decimals = this.token.decimals;
3673
4396
  const decimals0 = this.token.decimals0;
3674
4397
  const decimals1 = this.token.decimals1;
@@ -3680,9 +4403,9 @@ var Balance = class {
3680
4403
  const totalSupply = extras.find((extra2) => extra2.label === "totalSupply")?.amount ?? "0";
3681
4404
  const reserve0 = extras.find((extra2) => extra2.label === "reserve0")?.amount ?? "0";
3682
4405
  const reserve1 = extras.find((extra2) => extra2.label === "reserve1")?.amount ?? "0";
3683
- const totalSupplyTokens = (0, import_bignumber2.default)(totalSupply).times(10 ** (-1 * decimals));
3684
- const reserve0Tokens = (0, import_bignumber2.default)(reserve0).times(10 ** (-1 * decimals0));
3685
- const reserve1Tokens = (0, import_bignumber2.default)(reserve1).times(10 ** (-1 * decimals1));
4406
+ const totalSupplyTokens = configureBigNumber_default(totalSupply).times(10 ** (-1 * decimals));
4407
+ const reserve0Tokens = configureBigNumber_default(reserve0).times(10 ** (-1 * decimals0));
4408
+ const reserve1Tokens = configureBigNumber_default(reserve1).times(10 ** (-1 * decimals1));
3686
4409
  const rates0Currencies = new Set(Object.keys(rates0));
3687
4410
  const rates1Currencies = new Set(Object.keys(rates1));
3688
4411
  const currencies = [...rates0Currencies].filter((c) => rates1Currencies.has(c));
@@ -3690,7 +4413,7 @@ var Balance = class {
3690
4413
  (currency) => [
3691
4414
  currency,
3692
4415
  // tvl (in a given currency) == reserve0*currencyRate0 + reserve1*currencyRate1
3693
- import_bignumber2.default.sum(
4416
+ configureBigNumber_default.sum(
3694
4417
  reserve0Tokens.times(rates0[currency]?.price ?? 0),
3695
4418
  reserve1Tokens.times(rates1[currency]?.price ?? 0)
3696
4419
  )
@@ -3776,7 +4499,7 @@ var Balance = class {
3776
4499
  /** The frozen balance of this token. Is included in the free amount. */
3777
4500
  get locked() {
3778
4501
  return this.#format(
3779
- this.locks.map(({ amount }) => amount.planck).reduce((a, b) => import_util6.BigMath.max(a, b), 0n)
4502
+ this.locks.map(({ amount }) => amount.planck).reduce((a, b) => import_util9.BigMath.max(a, b), 0n)
3780
4503
  );
3781
4504
  }
3782
4505
  get locks() {
@@ -3800,15 +4523,15 @@ var Balance = class {
3800
4523
  const oldTransferableCalculation = () => {
3801
4524
  if (this.locks.length === 0) return this.free;
3802
4525
  const excludeAmount = excludeFromTransferableAmount(this.locks);
3803
- return this.#format(import_util6.BigMath.max(this.free.planck - excludeAmount, 0n));
4526
+ return this.#format(import_util9.BigMath.max(this.free.planck - excludeAmount, 0n));
3804
4527
  };
3805
4528
  const newTransferableCalculation = () => {
3806
4529
  if (this.locks.length === 0) return this.free;
3807
- const untouchableAmount = import_util6.BigMath.max(
4530
+ const untouchableAmount = import_util9.BigMath.max(
3808
4531
  excludeFromTransferableAmount(this.locks) - this.reserved.planck,
3809
4532
  0n
3810
4533
  );
3811
- return this.#format(import_util6.BigMath.max(this.free.planck - untouchableAmount, 0n));
4534
+ return this.#format(import_util9.BigMath.max(this.free.planck - untouchableAmount, 0n));
3812
4535
  };
3813
4536
  if (this.#storage.useLegacyTransferableCalculation) return oldTransferableCalculation();
3814
4537
  return newTransferableCalculation();
@@ -3820,7 +4543,7 @@ var Balance = class {
3820
4543
  */
3821
4544
  get unavailable() {
3822
4545
  const oldCalculation = () => this.locked.planck + this.reserved.planck;
3823
- const newCalculation = () => import_util6.BigMath.max(this.locked.planck, this.reserved.planck);
4546
+ const newCalculation = () => import_util9.BigMath.max(this.locked.planck, this.reserved.planck);
3824
4547
  const baseUnavailable = this.#storage.useLegacyTransferableCalculation ? oldCalculation() : newCalculation();
3825
4548
  const nomPoolStakedPlancks = this.locks.some(
3826
4549
  (lock) => lock.source === "substrate-native-holds" && lock.label === "DelegatedStaking"
@@ -3830,8 +4553,8 @@ var Balance = class {
3830
4553
  /** The feePayable balance of this token. Is generally the free amount - the feeFrozen amount. */
3831
4554
  get feePayable() {
3832
4555
  if (this.locks.length === 0) return this.free;
3833
- const excludeAmount = excludeFromFeePayableLocks(this.locked.planck.toString()).map((lock) => BigInt(lock.amount)).reduce((max, lock) => import_util6.BigMath.max(max, lock), 0n);
3834
- return this.#format(import_util6.BigMath.max(this.free.planck - excludeAmount, 0n));
4556
+ const excludeAmount = excludeFromFeePayableLocks(this.locked.planck.toString()).map((lock) => BigInt(lock.amount)).reduce((max, lock) => import_util9.BigMath.max(max, lock), 0n);
4557
+ return this.#format(import_util9.BigMath.max(this.free.planck - excludeAmount, 0n));
3835
4558
  }
3836
4559
  };
3837
4560
  var BalanceValueGetter = class {
@@ -3854,7 +4577,7 @@ var BalanceFormatter = class {
3854
4577
  #decimals;
3855
4578
  #tokenRates;
3856
4579
  constructor(planck, decimals, fiatRatios) {
3857
- this.#planck = (0, import_util6.isBigInt)(planck) ? planck.toString() : planck ?? "0";
4580
+ this.#planck = (0, import_util9.isBigInt)(planck) ? planck.toString() : planck ?? "0";
3858
4581
  this.#decimals = decimals || 0;
3859
4582
  this.#tokenRates = fiatRatios || null;
3860
4583
  }
@@ -3863,7 +4586,7 @@ var BalanceFormatter = class {
3863
4586
  return BigInt(this.#planck);
3864
4587
  }
3865
4588
  get tokens() {
3866
- return (0, import_util6.planckToTokens)(this.#planck, this.#decimals);
4589
+ return (0, import_util9.planckToTokens)(this.#planck, this.#decimals);
3867
4590
  }
3868
4591
  fiat(currency) {
3869
4592
  if (!this.#tokenRates) return null;
@@ -4057,23 +4780,23 @@ var getValueId = (amount) => {
4057
4780
  };
4058
4781
 
4059
4782
  // src/types/minimetadatas.ts
4060
- var import_chaindata_provider36 = require("@talismn/chaindata-provider");
4061
- var import_scale10 = require("@talismn/scale");
4783
+ var import_chaindata_provider43 = require("@talismn/chaindata-provider");
4784
+ var import_scale11 = require("@talismn/scale");
4062
4785
  var deriveMiniMetadataId = ({
4063
4786
  source,
4064
4787
  chainId,
4065
4788
  specVersion
4066
- }) => (0, import_scale10.toHex)(
4067
- (0, import_scale10.Twox128)(new TextEncoder().encode(`${source}${chainId}${specVersion}${import_chaindata_provider36.MINIMETADATA_VERSION}`))
4789
+ }) => (0, import_scale11.toHex)(
4790
+ (0, import_scale11.Twox128)(new TextEncoder().encode(`${source}${chainId}${specVersion}${import_chaindata_provider43.MINIMETADATA_VERSION}`))
4068
4791
  ).slice(-32);
4069
4792
 
4070
4793
  // src/modules/substrate-assets/getMiniMetadata.ts
4071
- var getMiniMetadata7 = ({
4794
+ var getMiniMetadata8 = ({
4072
4795
  networkId,
4073
4796
  specVersion,
4074
4797
  metadataRpc
4075
4798
  }) => {
4076
- const source = MODULE_TYPE6;
4799
+ const source = MODULE_TYPE7;
4077
4800
  const chainId = networkId;
4078
4801
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
4079
4802
  if (specVersion !== systemVersion.spec_version)
@@ -4081,7 +4804,7 @@ var getMiniMetadata7 = ({
4081
4804
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
4082
4805
  );
4083
4806
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
4084
- const { unifiedMetadata } = (0, import_scale11.parseMetadataRpc)(metadataRpc);
4807
+ const { unifiedMetadata } = (0, import_scale12.parseMetadataRpc)(metadataRpc);
4085
4808
  if (unifiedMetadata.version < 14)
4086
4809
  throw new Error(
4087
4810
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -4091,24 +4814,24 @@ var getMiniMetadata7 = ({
4091
4814
  source,
4092
4815
  chainId,
4093
4816
  specVersion,
4094
- version: import_chaindata_provider37.MINIMETADATA_VERSION,
4817
+ version: import_chaindata_provider44.MINIMETADATA_VERSION,
4095
4818
  data: getData2(metadataRpc),
4096
4819
  extra: null
4097
4820
  };
4098
4821
  };
4099
4822
  var getData2 = (metadataRpc) => {
4100
- const { metadata, unifiedMetadata } = (0, import_scale11.parseMetadataRpc)(metadataRpc);
4823
+ const { metadata, unifiedMetadata } = (0, import_scale12.parseMetadataRpc)(metadataRpc);
4101
4824
  if (!hasStorageItems(unifiedMetadata, "Assets", ["Account", "Asset", "Metadata"])) return null;
4102
- (0, import_scale11.compactMetadata)(metadata, [{ pallet: "Assets", items: ["Account", "Asset", "Metadata"] }]);
4103
- return (0, import_scale11.encodeMetadata)(metadata);
4825
+ (0, import_scale12.compactMetadata)(metadata, [{ pallet: "Assets", items: ["Account", "Asset", "Metadata"] }]);
4826
+ return (0, import_scale12.encodeMetadata)(metadata);
4104
4827
  };
4105
4828
 
4106
4829
  // src/modules/substrate-assets/getTransferCallData.ts
4107
4830
  var import_utils4 = require("@polkadot-api/utils");
4108
- var import_chaindata_provider38 = require("@talismn/chaindata-provider");
4109
- var import_scale12 = require("@talismn/scale");
4831
+ var import_chaindata_provider45 = require("@talismn/chaindata-provider");
4832
+ var import_scale13 = require("@talismn/scale");
4110
4833
  var import_polkadot_api2 = require("polkadot-api");
4111
- var getTransferCallData7 = ({
4834
+ var getTransferCallData8 = ({
4112
4835
  from: from2,
4113
4836
  to,
4114
4837
  value,
@@ -4116,9 +4839,9 @@ var getTransferCallData7 = ({
4116
4839
  type,
4117
4840
  metadataRpc
4118
4841
  }) => {
4119
- if (!(0, import_chaindata_provider38.isTokenOfType)(token, MODULE_TYPE6))
4120
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE6}.`);
4121
- const { builder } = (0, import_scale12.parseMetadataRpc)(metadataRpc);
4842
+ if (!(0, import_chaindata_provider45.isTokenOfType)(token, MODULE_TYPE7))
4843
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE7}.`);
4844
+ const { builder } = (0, import_scale13.parseMetadataRpc)(metadataRpc);
4122
4845
  const method = getTransferMethod(type);
4123
4846
  const { codec, location } = builder.buildCall("Assets", method);
4124
4847
  const args = getEncodedArgs(method, token.assetId, to, value, codec);
@@ -4206,18 +4929,18 @@ var getTransferAllEncodedArgs = (assetId, to, codec) => {
4206
4929
  };
4207
4930
 
4208
4931
  // src/modules/substrate-assets/subscribeBalances.ts
4209
- var import_rxjs9 = require("rxjs");
4210
- var subscribeBalances7 = ({
4932
+ var import_rxjs10 = require("rxjs");
4933
+ var subscribeBalances8 = ({
4211
4934
  networkId,
4212
4935
  tokensWithAddresses,
4213
4936
  connector,
4214
4937
  miniMetadata
4215
4938
  }) => {
4216
- if (!tokensWithAddresses.length) return (0, import_rxjs9.of)({ success: [], errors: [] });
4939
+ if (!tokensWithAddresses.length) return (0, import_rxjs10.of)({ success: [], errors: [] });
4217
4940
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
4218
4941
  const queries = buildQueries(networkId, balanceDefs, miniMetadata);
4219
4942
  return getRpcQueryPack$(connector, networkId, queries).pipe(
4220
- (0, import_rxjs9.map)((balances) => ({
4943
+ (0, import_rxjs10.map)((balances) => ({
4221
4944
  success: balances,
4222
4945
  errors: []
4223
4946
  }))
@@ -4226,31 +4949,31 @@ var subscribeBalances7 = ({
4226
4949
 
4227
4950
  // src/modules/substrate-assets/module.ts
4228
4951
  var SubAssetsBalanceModule = {
4229
- type: MODULE_TYPE6,
4230
- platform: PLATFORM6,
4231
- getMiniMetadata: getMiniMetadata7,
4232
- fetchTokens: fetchTokens6,
4233
- fetchBalances: fetchBalances6,
4234
- subscribeBalances: subscribeBalances7,
4235
- getTransferCallData: getTransferCallData7
4952
+ type: MODULE_TYPE7,
4953
+ platform: PLATFORM7,
4954
+ getMiniMetadata: getMiniMetadata8,
4955
+ fetchTokens: fetchTokens7,
4956
+ fetchBalances: fetchBalances7,
4957
+ subscribeBalances: subscribeBalances8,
4958
+ getTransferCallData: getTransferCallData8
4236
4959
  };
4237
4960
 
4238
4961
  // src/modules/substrate-assets/types.ts
4239
- var import_chaindata_provider39 = require("@talismn/chaindata-provider");
4240
- var import_v410 = __toESM(require("zod/v4"));
4241
- var SubAssetsTokenConfigSchema = import_v410.default.strictObject({
4242
- assetId: import_chaindata_provider39.SubAssetsTokenSchema.shape.assetId,
4962
+ var import_chaindata_provider46 = require("@talismn/chaindata-provider");
4963
+ var import_v412 = __toESM(require("zod/v4"));
4964
+ var SubAssetsTokenConfigSchema = import_v412.default.strictObject({
4965
+ assetId: import_chaindata_provider46.SubAssetsTokenSchema.shape.assetId,
4243
4966
  ...TokenConfigBaseSchema.shape
4244
4967
  });
4245
4968
 
4246
4969
  // src/modules/substrate-foreignassets/config.ts
4247
- var import_chaindata_provider40 = require("@talismn/chaindata-provider");
4248
- var MODULE_TYPE8 = import_chaindata_provider40.SubForeignAssetsTokenSchema.shape.type.value;
4249
- var PLATFORM8 = import_chaindata_provider40.SubForeignAssetsTokenSchema.shape.platform.value;
4970
+ var import_chaindata_provider47 = require("@talismn/chaindata-provider");
4971
+ var MODULE_TYPE9 = import_chaindata_provider47.SubForeignAssetsTokenSchema.shape.type.value;
4972
+ var PLATFORM9 = import_chaindata_provider47.SubForeignAssetsTokenSchema.shape.platform.value;
4250
4973
 
4251
4974
  // src/modules/substrate-foreignassets/buildQueries.ts
4252
- var import_scale13 = require("@talismn/scale");
4253
- var import_util7 = require("@talismn/util");
4975
+ var import_scale14 = require("@talismn/scale");
4976
+ var import_util10 = require("@talismn/util");
4254
4977
  var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4255
4978
  const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
4256
4979
  storage: ["ForeignAssets", "Account"]
@@ -4259,7 +4982,7 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4259
4982
  const scaleCoder = networkStorageCoders?.storage;
4260
4983
  const getStateKey = (onChainId) => {
4261
4984
  try {
4262
- return scaleCoder?.keys?.enc?.((0, import_scale13.papiParse)(onChainId), address);
4985
+ return scaleCoder?.keys?.enc?.((0, import_scale14.papiParse)(onChainId), address);
4263
4986
  } catch {
4264
4987
  return null;
4265
4988
  }
@@ -4272,7 +4995,7 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4272
4995
  return null;
4273
4996
  }
4274
4997
  const decodeResult = (changes) => {
4275
- const decoded = (0, import_scale13.decodeScale)(
4998
+ const decoded = (0, import_scale14.decodeScale)(
4276
4999
  scaleCoder,
4277
5000
  changes[0],
4278
5001
  `Failed to decode substrate-assets balance on chain ${networkId}`
@@ -4305,11 +5028,11 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
4305
5028
  stateKeys: [stateKey],
4306
5029
  decodeResult
4307
5030
  };
4308
- }).filter(import_util7.isNotNil);
5031
+ }).filter(import_util10.isNotNil);
4309
5032
  };
4310
5033
 
4311
5034
  // src/modules/substrate-foreignassets/fetchBalances.ts
4312
- var fetchBalances8 = async ({
5035
+ var fetchBalances9 = async ({
4313
5036
  networkId,
4314
5037
  tokensWithAddresses,
4315
5038
  connector,
@@ -4318,7 +5041,7 @@ var fetchBalances8 = async ({
4318
5041
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
4319
5042
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
4320
5043
  if (!miniMetadata?.data) {
4321
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE8} balances on ${networkId}.`);
5044
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE9} balances on ${networkId}.`);
4322
5045
  return {
4323
5046
  success: [],
4324
5047
  errors: balanceDefs.map((def) => ({
@@ -4328,20 +5051,20 @@ var fetchBalances8 = async ({
4328
5051
  }))
4329
5052
  };
4330
5053
  }
4331
- if (miniMetadata.source !== MODULE_TYPE8) {
4332
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE8}.`);
5054
+ if (miniMetadata.source !== MODULE_TYPE9) {
5055
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE9}.`);
4333
5056
  return {
4334
5057
  success: [],
4335
5058
  errors: balanceDefs.map((def) => ({
4336
5059
  tokenId: def.token.id,
4337
5060
  address: def.address,
4338
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE8}`)
5061
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE9}`)
4339
5062
  }))
4340
5063
  };
4341
5064
  }
4342
5065
  if (miniMetadata.chainId !== networkId) {
4343
5066
  log_default.warn(
4344
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE8}. Expected chainId is ${networkId}`
5067
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE9}. Expected chainId is ${networkId}`
4345
5068
  );
4346
5069
  return {
4347
5070
  success: [],
@@ -4365,7 +5088,7 @@ var fetchBalances8 = async ({
4365
5088
  address: def.address,
4366
5089
  networkId,
4367
5090
  tokenId: def.token.id,
4368
- source: MODULE_TYPE8,
5091
+ source: MODULE_TYPE9,
4369
5092
  status: "live",
4370
5093
  values: [
4371
5094
  { type: "free", label: "free", amount: "0" },
@@ -4379,10 +5102,10 @@ var fetchBalances8 = async ({
4379
5102
  };
4380
5103
 
4381
5104
  // src/modules/substrate-foreignassets/fetchTokens.ts
4382
- var import_chaindata_provider41 = require("@talismn/chaindata-provider");
4383
- var import_scale14 = require("@talismn/scale");
4384
- var import_lodash_es19 = require("lodash-es");
4385
- var fetchTokens8 = async ({
5105
+ var import_chaindata_provider48 = require("@talismn/chaindata-provider");
5106
+ var import_scale15 = require("@talismn/scale");
5107
+ var import_lodash_es22 = require("lodash-es");
5108
+ var fetchTokens9 = async ({
4386
5109
  networkId,
4387
5110
  tokens,
4388
5111
  connector,
@@ -4390,15 +5113,15 @@ var fetchTokens8 = async ({
4390
5113
  }) => {
4391
5114
  const anyMiniMetadata = miniMetadata;
4392
5115
  if (!anyMiniMetadata?.data) return [];
4393
- const { builder } = (0, import_scale14.parseMetadataRpc)(anyMiniMetadata.data);
5116
+ const { builder } = (0, import_scale15.parseMetadataRpc)(anyMiniMetadata.data);
4394
5117
  const assetCodec = builder.buildStorage("ForeignAssets", "Asset");
4395
5118
  const metadataCodec = builder.buildStorage("ForeignAssets", "Metadata");
4396
5119
  const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([
4397
5120
  connector.send(networkId, "state_getKeys", [
4398
- (0, import_scale14.getStorageKeyPrefix)("ForeignAssets", "Asset")
5121
+ (0, import_scale15.getStorageKeyPrefix)("ForeignAssets", "Asset")
4399
5122
  ]),
4400
5123
  connector.send(networkId, "state_getKeys", [
4401
- (0, import_scale14.getStorageKeyPrefix)("ForeignAssets", "Metadata")
5124
+ (0, import_scale15.getStorageKeyPrefix)("ForeignAssets", "Metadata")
4402
5125
  ])
4403
5126
  ]);
4404
5127
  const [assetStorageResults, metadataStorageResults] = await Promise.all([
@@ -4407,19 +5130,19 @@ var fetchTokens8 = async ({
4407
5130
  ]);
4408
5131
  const assetStorageEntries = assetStorageResults[0]?.changes ?? [];
4409
5132
  const metadataStorageEntries = metadataStorageResults[0]?.changes ?? [];
4410
- const assetByOnChainId = (0, import_lodash_es19.keyBy)(
5133
+ const assetByOnChainId = (0, import_lodash_es22.keyBy)(
4411
5134
  assetStorageEntries.map(([key, value]) => {
4412
5135
  const [decodedKey] = assetCodec.keys.dec(key);
4413
- const onChainId = (0, import_scale14.papiStringify)(decodedKey);
5136
+ const onChainId = (0, import_scale15.papiStringify)(decodedKey);
4414
5137
  const asset = assetCodec.value.dec(value);
4415
5138
  return { onChainId, existentialDeposit: asset.min_balance, isSufficient: asset.is_sufficient };
4416
5139
  }),
4417
5140
  (a) => a.onChainId
4418
5141
  );
4419
- const metadataByOnChainId = (0, import_lodash_es19.keyBy)(
5142
+ const metadataByOnChainId = (0, import_lodash_es22.keyBy)(
4420
5143
  metadataStorageEntries.map(([key, value]) => {
4421
5144
  const [decodedKey] = metadataCodec.keys.dec(key);
4422
- const onChainId = (0, import_scale14.papiStringify)(decodedKey);
5145
+ const onChainId = (0, import_scale15.papiStringify)(decodedKey);
4423
5146
  const metadata = metadataCodec.value.dec(value);
4424
5147
  return {
4425
5148
  onChainId,
@@ -4431,14 +5154,14 @@ var fetchTokens8 = async ({
4431
5154
  }),
4432
5155
  (a) => a.onChainId
4433
5156
  );
4434
- const allTokens = (0, import_lodash_es19.keys)(assetByOnChainId).map(
4435
- (onChainId) => (0, import_lodash_es19.assign)({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? void 0)
5157
+ const allTokens = (0, import_lodash_es22.keys)(assetByOnChainId).map(
5158
+ (onChainId) => (0, import_lodash_es22.assign)({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? void 0)
4436
5159
  );
4437
- const configTokenByOnChainId = (0, import_lodash_es19.keyBy)(tokens, (t) => t.onChainId);
5160
+ const configTokenByOnChainId = (0, import_lodash_es22.keyBy)(tokens, (t) => t.onChainId);
4438
5161
  return allTokens.map(
4439
5162
  (asset) => ({
4440
- id: (0, import_chaindata_provider41.subForeignAssetTokenId)(networkId, asset.onChainId),
4441
- type: MODULE_TYPE8,
5163
+ id: (0, import_chaindata_provider48.subForeignAssetTokenId)(networkId, asset.onChainId),
5164
+ type: MODULE_TYPE9,
4442
5165
  platform: "polkadot",
4443
5166
  networkId,
4444
5167
  onChainId: String(asset.onChainId),
@@ -4455,22 +5178,22 @@ var fetchTokens8 = async ({
4455
5178
  return configToken || token.isSufficient;
4456
5179
  }).map((token) => {
4457
5180
  const configToken = configTokenByOnChainId[token.onChainId];
4458
- return configToken ? (0, import_lodash_es19.assign)({}, token, configToken) : token;
5181
+ return configToken ? (0, import_lodash_es22.assign)({}, token, configToken) : token;
4459
5182
  }).filter((t) => {
4460
- const parsed = import_chaindata_provider41.SubForeignAssetsTokenSchema.safeParse(t);
5183
+ const parsed = import_chaindata_provider48.SubForeignAssetsTokenSchema.safeParse(t);
4461
5184
  return parsed.success;
4462
5185
  });
4463
5186
  };
4464
5187
 
4465
5188
  // src/modules/substrate-foreignassets/getMiniMetadata.ts
4466
- var import_chaindata_provider42 = require("@talismn/chaindata-provider");
4467
- var import_scale15 = require("@talismn/scale");
4468
- var getMiniMetadata8 = ({
5189
+ var import_chaindata_provider49 = require("@talismn/chaindata-provider");
5190
+ var import_scale16 = require("@talismn/scale");
5191
+ var getMiniMetadata9 = ({
4469
5192
  networkId,
4470
5193
  specVersion,
4471
5194
  metadataRpc
4472
5195
  }) => {
4473
- const source = MODULE_TYPE8;
5196
+ const source = MODULE_TYPE9;
4474
5197
  const chainId = networkId;
4475
5198
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
4476
5199
  if (specVersion !== systemVersion.spec_version)
@@ -4478,7 +5201,7 @@ var getMiniMetadata8 = ({
4478
5201
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
4479
5202
  );
4480
5203
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
4481
- const { unifiedMetadata } = (0, import_scale15.parseMetadataRpc)(metadataRpc);
5204
+ const { unifiedMetadata } = (0, import_scale16.parseMetadataRpc)(metadataRpc);
4482
5205
  if (unifiedMetadata.version < 14)
4483
5206
  throw new Error(
4484
5207
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -4488,25 +5211,25 @@ var getMiniMetadata8 = ({
4488
5211
  source,
4489
5212
  chainId,
4490
5213
  specVersion,
4491
- version: import_chaindata_provider42.MINIMETADATA_VERSION,
5214
+ version: import_chaindata_provider49.MINIMETADATA_VERSION,
4492
5215
  data: getData3(metadataRpc),
4493
5216
  extra: null
4494
5217
  };
4495
5218
  };
4496
5219
  var getData3 = (metadataRpc) => {
4497
- const { metadata, unifiedMetadata } = (0, import_scale15.parseMetadataRpc)(metadataRpc);
5220
+ const { metadata, unifiedMetadata } = (0, import_scale16.parseMetadataRpc)(metadataRpc);
4498
5221
  if (!hasStorageItems(unifiedMetadata, "ForeignAssets", ["Account", "Asset", "Metadata"]))
4499
5222
  return null;
4500
- (0, import_scale15.compactMetadata)(metadata, [{ pallet: "ForeignAssets", items: ["Account", "Asset", "Metadata"] }]);
4501
- return (0, import_scale15.encodeMetadata)(metadata);
5223
+ (0, import_scale16.compactMetadata)(metadata, [{ pallet: "ForeignAssets", items: ["Account", "Asset", "Metadata"] }]);
5224
+ return (0, import_scale16.encodeMetadata)(metadata);
4502
5225
  };
4503
5226
 
4504
5227
  // src/modules/substrate-foreignassets/getTransferCallData.ts
4505
5228
  var import_utils5 = require("@polkadot-api/utils");
4506
- var import_chaindata_provider43 = require("@talismn/chaindata-provider");
4507
- var import_scale16 = require("@talismn/scale");
5229
+ var import_chaindata_provider50 = require("@talismn/chaindata-provider");
5230
+ var import_scale17 = require("@talismn/scale");
4508
5231
  var import_polkadot_api3 = require("polkadot-api");
4509
- var getTransferCallData8 = ({
5232
+ var getTransferCallData9 = ({
4510
5233
  from: from2,
4511
5234
  to,
4512
5235
  value,
@@ -4514,9 +5237,9 @@ var getTransferCallData8 = ({
4514
5237
  type,
4515
5238
  metadataRpc
4516
5239
  }) => {
4517
- if (!(0, import_chaindata_provider43.isTokenOfType)(token, MODULE_TYPE8))
4518
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE8}.`);
4519
- const { builder } = (0, import_scale16.parseMetadataRpc)(metadataRpc);
5240
+ if (!(0, import_chaindata_provider50.isTokenOfType)(token, MODULE_TYPE9))
5241
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE9}.`);
5242
+ const { builder } = (0, import_scale17.parseMetadataRpc)(metadataRpc);
4520
5243
  const method = getTransferMethod2(type);
4521
5244
  const { codec, location } = builder.buildCall("ForeignAssets", method);
4522
5245
  const args = getEncodedArgs2(method, token.onChainId, to, value, codec);
@@ -4563,13 +5286,13 @@ var getEncodedValue2 = (codec, possibleValue) => {
4563
5286
  var getTransferEncodedArgs2 = (onChainId, to, value, codec) => {
4564
5287
  return getEncodedValue2(codec, [
4565
5288
  () => ({
4566
- id: (0, import_scale16.papiParse)(onChainId),
5289
+ id: (0, import_scale17.papiParse)(onChainId),
4567
5290
  // for most networks
4568
5291
  target: (0, import_polkadot_api3.Enum)("Id", to),
4569
5292
  amount: BigInt(value)
4570
5293
  }),
4571
5294
  () => ({
4572
- id: (0, import_scale16.papiParse)(onChainId),
5295
+ id: (0, import_scale17.papiParse)(onChainId),
4573
5296
  // for Neuroweb
4574
5297
  target: to,
4575
5298
  amount: BigInt(value)
@@ -4579,13 +5302,13 @@ var getTransferEncodedArgs2 = (onChainId, to, value, codec) => {
4579
5302
  var getTransferAllEncodedArgs2 = (onChainId, to, codec) => {
4580
5303
  return getEncodedValue2(codec, [
4581
5304
  () => ({
4582
- id: (0, import_scale16.papiParse)(onChainId),
5305
+ id: (0, import_scale17.papiParse)(onChainId),
4583
5306
  // for most networks
4584
5307
  dest: (0, import_polkadot_api3.Enum)("Id", to),
4585
5308
  keep_alive: false
4586
5309
  }),
4587
5310
  () => ({
4588
- id: (0, import_scale16.papiParse)(onChainId),
5311
+ id: (0, import_scale17.papiParse)(onChainId),
4589
5312
  // for Neuroweb
4590
5313
  dest: to,
4591
5314
  keep_alive: false
@@ -4594,18 +5317,18 @@ var getTransferAllEncodedArgs2 = (onChainId, to, codec) => {
4594
5317
  };
4595
5318
 
4596
5319
  // src/modules/substrate-foreignassets/subscribeBalances.ts
4597
- var import_rxjs10 = require("rxjs");
4598
- var subscribeBalances8 = ({
5320
+ var import_rxjs11 = require("rxjs");
5321
+ var subscribeBalances9 = ({
4599
5322
  networkId,
4600
5323
  tokensWithAddresses,
4601
5324
  connector,
4602
5325
  miniMetadata
4603
5326
  }) => {
4604
- if (!tokensWithAddresses.length) return (0, import_rxjs10.of)({ success: [], errors: [] });
5327
+ if (!tokensWithAddresses.length) return (0, import_rxjs11.of)({ success: [], errors: [] });
4605
5328
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
4606
5329
  const queries = buildQueries2(networkId, balanceDefs, miniMetadata);
4607
5330
  return getRpcQueryPack$(connector, networkId, queries).pipe(
4608
- (0, import_rxjs10.map)((balances) => ({
5331
+ (0, import_rxjs11.map)((balances) => ({
4609
5332
  success: balances,
4610
5333
  errors: []
4611
5334
  }))
@@ -4614,31 +5337,31 @@ var subscribeBalances8 = ({
4614
5337
 
4615
5338
  // src/modules/substrate-foreignassets/module.ts
4616
5339
  var SubForeignAssetsBalanceModule = {
4617
- type: MODULE_TYPE8,
4618
- platform: PLATFORM8,
4619
- getMiniMetadata: getMiniMetadata8,
4620
- fetchTokens: fetchTokens8,
4621
- fetchBalances: fetchBalances8,
4622
- subscribeBalances: subscribeBalances8,
4623
- getTransferCallData: getTransferCallData8
5340
+ type: MODULE_TYPE9,
5341
+ platform: PLATFORM9,
5342
+ getMiniMetadata: getMiniMetadata9,
5343
+ fetchTokens: fetchTokens9,
5344
+ fetchBalances: fetchBalances9,
5345
+ subscribeBalances: subscribeBalances9,
5346
+ getTransferCallData: getTransferCallData9
4624
5347
  };
4625
5348
 
4626
5349
  // src/modules/substrate-foreignassets/types.ts
4627
- var import_chaindata_provider44 = require("@talismn/chaindata-provider");
4628
- var import_v411 = __toESM(require("zod/v4"));
4629
- var SubForeignAssetsTokenConfigSchema = import_v411.default.strictObject({
4630
- onChainId: import_chaindata_provider44.SubForeignAssetsTokenSchema.shape.onChainId,
5350
+ var import_chaindata_provider51 = require("@talismn/chaindata-provider");
5351
+ var import_v413 = __toESM(require("zod/v4"));
5352
+ var SubForeignAssetsTokenConfigSchema = import_v413.default.strictObject({
5353
+ onChainId: import_chaindata_provider51.SubForeignAssetsTokenSchema.shape.onChainId,
4631
5354
  ...TokenConfigBaseSchema.shape
4632
5355
  });
4633
5356
 
4634
5357
  // src/modules/substrate-hydration/config.ts
4635
- var import_chaindata_provider45 = require("@talismn/chaindata-provider");
4636
- var MODULE_TYPE9 = import_chaindata_provider45.SubHydrationTokenSchema.shape.type.value;
4637
- var PLATFORM9 = import_chaindata_provider45.SubHydrationTokenSchema.shape.platform.value;
5358
+ var import_chaindata_provider52 = require("@talismn/chaindata-provider");
5359
+ var MODULE_TYPE10 = import_chaindata_provider52.SubHydrationTokenSchema.shape.type.value;
5360
+ var PLATFORM10 = import_chaindata_provider52.SubHydrationTokenSchema.shape.platform.value;
4638
5361
 
4639
5362
  // src/modules/substrate-hydration/fetchBalances.ts
4640
- var import_lodash_es20 = require("lodash-es");
4641
- var fetchBalances9 = async ({
5363
+ var import_lodash_es23 = require("lodash-es");
5364
+ var fetchBalances10 = async ({
4642
5365
  networkId,
4643
5366
  tokensWithAddresses,
4644
5367
  connector,
@@ -4647,7 +5370,7 @@ var fetchBalances9 = async ({
4647
5370
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
4648
5371
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
4649
5372
  if (!miniMetadata?.data) {
4650
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE9} balances on ${networkId}.`, {
5373
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE10} balances on ${networkId}.`, {
4651
5374
  tokensWithAddresses
4652
5375
  });
4653
5376
  return {
@@ -4659,20 +5382,20 @@ var fetchBalances9 = async ({
4659
5382
  }))
4660
5383
  };
4661
5384
  }
4662
- if (miniMetadata.source !== MODULE_TYPE9) {
4663
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE9}.`);
5385
+ if (miniMetadata.source !== MODULE_TYPE10) {
5386
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE10}.`);
4664
5387
  return {
4665
5388
  success: [],
4666
5389
  errors: balanceDefs.map((def) => ({
4667
5390
  tokenId: def.token.id,
4668
5391
  address: def.address,
4669
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE9}`)
5392
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE10}`)
4670
5393
  }))
4671
5394
  };
4672
5395
  }
4673
5396
  if (miniMetadata.chainId !== networkId) {
4674
5397
  log_default.warn(
4675
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE9}. Expected chainId is ${networkId}`
5398
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE10}. Expected chainId is ${networkId}`
4676
5399
  );
4677
5400
  return {
4678
5401
  success: [],
@@ -4683,7 +5406,7 @@ var fetchBalances9 = async ({
4683
5406
  }))
4684
5407
  };
4685
5408
  }
4686
- const addresses = (0, import_lodash_es20.uniq)(balanceDefs.map((def) => def.address));
5409
+ const addresses = (0, import_lodash_es23.uniq)(balanceDefs.map((def) => def.address));
4687
5410
  try {
4688
5411
  const res = await Promise.all(
4689
5412
  addresses.map(
@@ -4699,16 +5422,16 @@ var fetchBalances9 = async ({
4699
5422
  frozen: balance.frozen.toString()
4700
5423
  })).filter((b) => b.onChainId !== void 0);
4701
5424
  });
4702
- const balancesByKey = (0, import_lodash_es20.keyBy)(fetchedBalances, (b) => `${b.address}:${b.onChainId}`);
5425
+ const balancesByKey = (0, import_lodash_es23.keyBy)(fetchedBalances, (b) => `${b.address}:${b.onChainId}`);
4703
5426
  const success = tokensWithAddresses.reduce((acc, [token, addresses2]) => {
4704
- if (token.type === MODULE_TYPE9)
5427
+ if (token.type === MODULE_TYPE10)
4705
5428
  for (const address of addresses2) {
4706
5429
  const rawBalance = balancesByKey[`${address}:${token.onChainId}`];
4707
5430
  const balance = {
4708
5431
  address,
4709
5432
  networkId,
4710
5433
  tokenId: token.id,
4711
- source: MODULE_TYPE9,
5434
+ source: MODULE_TYPE10,
4712
5435
  status: "live",
4713
5436
  values: [
4714
5437
  {
@@ -4751,10 +5474,10 @@ var fetchBalances9 = async ({
4751
5474
  };
4752
5475
 
4753
5476
  // src/modules/substrate-hydration/fetchTokens.ts
4754
- var import_chaindata_provider46 = require("@talismn/chaindata-provider");
4755
- var import_scale17 = require("@talismn/scale");
4756
- var import_lodash_es21 = require("lodash-es");
4757
- var fetchTokens9 = async ({
5477
+ var import_chaindata_provider53 = require("@talismn/chaindata-provider");
5478
+ var import_scale18 = require("@talismn/scale");
5479
+ var import_lodash_es24 = require("lodash-es");
5480
+ var fetchTokens10 = async ({
4758
5481
  networkId,
4759
5482
  tokens,
4760
5483
  connector,
@@ -4762,10 +5485,10 @@ var fetchTokens9 = async ({
4762
5485
  }) => {
4763
5486
  const anyMiniMetadata = miniMetadata;
4764
5487
  if (!anyMiniMetadata?.data) return [];
4765
- const { builder } = (0, import_scale17.parseMetadataRpc)(anyMiniMetadata.data);
5488
+ const { builder } = (0, import_scale18.parseMetadataRpc)(anyMiniMetadata.data);
4766
5489
  const assetsCodec = builder.buildStorage("AssetRegistry", "Assets");
4767
5490
  const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [
4768
- (0, import_scale17.getStorageKeyPrefix)("AssetRegistry", "Assets")
5491
+ (0, import_scale18.getStorageKeyPrefix)("AssetRegistry", "Assets")
4769
5492
  ]);
4770
5493
  const assetStorageResults = await connector.send(
4771
5494
  networkId,
@@ -4773,7 +5496,7 @@ var fetchTokens9 = async ({
4773
5496
  [allAssetStorageKeys]
4774
5497
  );
4775
5498
  const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
4776
- const configTokenByAssetId = (0, import_lodash_es21.keyBy)(tokens, (t) => t.onChainId);
5499
+ const configTokenByAssetId = (0, import_lodash_es24.keyBy)(tokens, (t) => t.onChainId);
4777
5500
  return assetStorageEntries.map(([key, value]) => {
4778
5501
  const [onChainId] = assetsCodec.keys.dec(key);
4779
5502
  const asset = assetsCodec.value.dec(value);
@@ -4788,8 +5511,8 @@ var fetchTokens9 = async ({
4788
5511
  };
4789
5512
  }).map(
4790
5513
  (asset) => ({
4791
- id: (0, import_chaindata_provider46.subHydrationTokenId)(networkId, asset.onChainId),
4792
- type: MODULE_TYPE9,
5514
+ id: (0, import_chaindata_provider53.subHydrationTokenId)(networkId, asset.onChainId),
5515
+ type: MODULE_TYPE10,
4793
5516
  platform: "polkadot",
4794
5517
  networkId,
4795
5518
  onChainId: asset.onChainId,
@@ -4807,22 +5530,22 @@ var fetchTokens9 = async ({
4807
5530
  return configToken || token.isSufficient;
4808
5531
  }).map((token) => {
4809
5532
  const configToken = configTokenByAssetId[token.onChainId];
4810
- return configToken ? (0, import_lodash_es21.assign)({}, token, configToken) : token;
5533
+ return configToken ? (0, import_lodash_es24.assign)({}, token, configToken) : token;
4811
5534
  }).filter((t) => {
4812
- const parsed = import_chaindata_provider46.SubHydrationTokenSchema.safeParse(t);
5535
+ const parsed = import_chaindata_provider53.SubHydrationTokenSchema.safeParse(t);
4813
5536
  return parsed.success;
4814
5537
  });
4815
5538
  };
4816
5539
 
4817
5540
  // src/modules/substrate-hydration/getMiniMetadata.ts
4818
- var import_chaindata_provider47 = require("@talismn/chaindata-provider");
4819
- var import_scale18 = require("@talismn/scale");
4820
- var getMiniMetadata9 = ({
5541
+ var import_chaindata_provider54 = require("@talismn/chaindata-provider");
5542
+ var import_scale19 = require("@talismn/scale");
5543
+ var getMiniMetadata10 = ({
4821
5544
  networkId,
4822
5545
  specVersion,
4823
5546
  metadataRpc
4824
5547
  }) => {
4825
- const source = MODULE_TYPE9;
5548
+ const source = MODULE_TYPE10;
4826
5549
  const chainId = networkId;
4827
5550
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
4828
5551
  if (specVersion !== systemVersion.spec_version)
@@ -4830,7 +5553,7 @@ var getMiniMetadata9 = ({
4830
5553
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
4831
5554
  );
4832
5555
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
4833
- const { unifiedMetadata } = (0, import_scale18.parseMetadataRpc)(metadataRpc);
5556
+ const { unifiedMetadata } = (0, import_scale19.parseMetadataRpc)(metadataRpc);
4834
5557
  if (unifiedMetadata.version < 14)
4835
5558
  throw new Error(
4836
5559
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -4840,16 +5563,16 @@ var getMiniMetadata9 = ({
4840
5563
  source,
4841
5564
  chainId,
4842
5565
  specVersion,
4843
- version: import_chaindata_provider47.MINIMETADATA_VERSION,
5566
+ version: import_chaindata_provider54.MINIMETADATA_VERSION,
4844
5567
  data: getData4(metadataRpc),
4845
5568
  extra: null
4846
5569
  };
4847
5570
  };
4848
5571
  var getData4 = (metadataRpc) => {
4849
- const { metadata, unifiedMetadata } = (0, import_scale18.parseMetadataRpc)(metadataRpc);
5572
+ const { metadata, unifiedMetadata } = (0, import_scale19.parseMetadataRpc)(metadataRpc);
4850
5573
  if (!hasStorageItem(unifiedMetadata, "AssetRegistry", "Assets") || !hasStorageItem(unifiedMetadata, "Tokens", "Accounts") || !hasRuntimeApi(unifiedMetadata, "CurrenciesApi", "accounts"))
4851
5574
  return null;
4852
- (0, import_scale18.compactMetadata)(
5575
+ (0, import_scale19.compactMetadata)(
4853
5576
  metadata,
4854
5577
  [
4855
5578
  { pallet: "AssetRegistry", items: ["Assets"] },
@@ -4864,24 +5587,24 @@ var getData4 = (metadataRpc) => {
4864
5587
  }
4865
5588
  ]
4866
5589
  );
4867
- return (0, import_scale18.encodeMetadata)(metadata);
5590
+ return (0, import_scale19.encodeMetadata)(metadata);
4868
5591
  };
4869
5592
 
4870
5593
  // src/modules/substrate-hydration/getTransferCallData.ts
4871
5594
  var import_utils6 = require("@polkadot-api/utils");
4872
- var import_chaindata_provider48 = require("@talismn/chaindata-provider");
4873
- var import_scale19 = require("@talismn/scale");
5595
+ var import_chaindata_provider55 = require("@talismn/chaindata-provider");
5596
+ var import_scale20 = require("@talismn/scale");
4874
5597
  var import_polkadot_api4 = require("polkadot-api");
4875
- var getTransferCallData9 = ({
5598
+ var getTransferCallData10 = ({
4876
5599
  from: from2,
4877
5600
  to,
4878
5601
  value,
4879
5602
  token,
4880
5603
  metadataRpc
4881
5604
  }) => {
4882
- if (!(0, import_chaindata_provider48.isTokenOfType)(token, MODULE_TYPE9))
4883
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE9}.`);
4884
- const { builder } = (0, import_scale19.parseMetadataRpc)(metadataRpc);
5605
+ if (!(0, import_chaindata_provider55.isTokenOfType)(token, MODULE_TYPE10))
5606
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE10}.`);
5607
+ const { builder } = (0, import_scale20.parseMetadataRpc)(metadataRpc);
4885
5608
  const { codec, location } = builder.buildCall("Currencies", "transfer");
4886
5609
  const args = {
4887
5610
  dest: to,
@@ -4896,22 +5619,22 @@ var getTransferCallData9 = ({
4896
5619
  };
4897
5620
 
4898
5621
  // src/modules/substrate-hydration/subscribeBalances.ts
4899
- var import_lodash_es22 = require("lodash-es");
4900
- var import_rxjs11 = require("rxjs");
4901
- var SUBSCRIPTION_INTERVAL7 = 6e3;
4902
- var subscribeBalances9 = ({
5622
+ var import_lodash_es25 = require("lodash-es");
5623
+ var import_rxjs12 = require("rxjs");
5624
+ var SUBSCRIPTION_INTERVAL8 = 6e3;
5625
+ var subscribeBalances10 = ({
4903
5626
  networkId,
4904
5627
  tokensWithAddresses,
4905
5628
  connector,
4906
5629
  miniMetadata
4907
5630
  }) => {
4908
- if (!tokensWithAddresses.length) return (0, import_rxjs11.of)({ success: [], errors: [] });
4909
- return new import_rxjs11.Observable((subscriber) => {
5631
+ if (!tokensWithAddresses.length) return (0, import_rxjs12.of)({ success: [], errors: [] });
5632
+ return new import_rxjs12.Observable((subscriber) => {
4910
5633
  const abortController = new AbortController();
4911
5634
  const poll = async () => {
4912
5635
  try {
4913
5636
  if (abortController.signal.aborted) return;
4914
- const balances = await fetchBalances9({
5637
+ const balances = await fetchBalances10({
4915
5638
  networkId,
4916
5639
  tokensWithAddresses,
4917
5640
  connector,
@@ -4919,10 +5642,10 @@ var subscribeBalances9 = ({
4919
5642
  });
4920
5643
  if (abortController.signal.aborted) return;
4921
5644
  subscriber.next(balances);
4922
- setTimeout(poll, SUBSCRIPTION_INTERVAL7);
5645
+ setTimeout(poll, SUBSCRIPTION_INTERVAL8);
4923
5646
  } catch (error) {
4924
5647
  log_default.error("Error", {
4925
- module: MODULE_TYPE9,
5648
+ module: MODULE_TYPE10,
4926
5649
  networkId,
4927
5650
  miniMetadata,
4928
5651
  addressesByToken: tokensWithAddresses,
@@ -4935,36 +5658,36 @@ var subscribeBalances9 = ({
4935
5658
  return () => {
4936
5659
  abortController.abort();
4937
5660
  };
4938
- }).pipe((0, import_rxjs11.distinctUntilChanged)(import_lodash_es22.isEqual));
5661
+ }).pipe((0, import_rxjs12.distinctUntilChanged)(import_lodash_es25.isEqual));
4939
5662
  };
4940
5663
 
4941
5664
  // src/modules/substrate-hydration/module.ts
4942
5665
  var SubHydrationBalanceModule = {
4943
- type: MODULE_TYPE9,
4944
- platform: PLATFORM9,
4945
- getMiniMetadata: getMiniMetadata9,
4946
- fetchTokens: fetchTokens9,
4947
- fetchBalances: fetchBalances9,
4948
- subscribeBalances: subscribeBalances9,
4949
- getTransferCallData: getTransferCallData9
5666
+ type: MODULE_TYPE10,
5667
+ platform: PLATFORM10,
5668
+ getMiniMetadata: getMiniMetadata10,
5669
+ fetchTokens: fetchTokens10,
5670
+ fetchBalances: fetchBalances10,
5671
+ subscribeBalances: subscribeBalances10,
5672
+ getTransferCallData: getTransferCallData10
4950
5673
  };
4951
5674
 
4952
5675
  // src/modules/substrate-hydration/types.ts
4953
- var import_chaindata_provider49 = require("@talismn/chaindata-provider");
4954
- var import_v412 = __toESM(require("zod/v4"));
4955
- var SubHydrationTokenConfigSchema = import_v412.default.strictObject({
4956
- onChainId: import_chaindata_provider49.SubHydrationTokenSchema.shape.onChainId,
5676
+ var import_chaindata_provider56 = require("@talismn/chaindata-provider");
5677
+ var import_v414 = __toESM(require("zod/v4"));
5678
+ var SubHydrationTokenConfigSchema = import_v414.default.strictObject({
5679
+ onChainId: import_chaindata_provider56.SubHydrationTokenSchema.shape.onChainId,
4957
5680
  ...TokenConfigBaseSchema.shape
4958
5681
  });
4959
5682
 
4960
5683
  // src/modules/substrate-native/config.ts
4961
- var import_chaindata_provider50 = require("@talismn/chaindata-provider");
4962
- var MODULE_TYPE10 = import_chaindata_provider50.SubNativeTokenSchema.shape.type.value;
4963
- var PLATFORM10 = import_chaindata_provider50.SubNativeTokenSchema.shape.platform.value;
5684
+ var import_chaindata_provider57 = require("@talismn/chaindata-provider");
5685
+ var MODULE_TYPE11 = import_chaindata_provider57.SubNativeTokenSchema.shape.type.value;
5686
+ var PLATFORM11 = import_chaindata_provider57.SubNativeTokenSchema.shape.platform.value;
4964
5687
 
4965
5688
  // src/modules/substrate-native/queries/buildBaseQueries.ts
4966
- var import_scale20 = require("@talismn/scale");
4967
- var import_util8 = require("@talismn/util");
5689
+ var import_scale21 = require("@talismn/scale");
5690
+ var import_util11 = require("@talismn/util");
4968
5691
 
4969
5692
  // src/modules/substrate-native/util/lockTypes.ts
4970
5693
  var import_upperFirst = __toESM(require("lodash-es/upperFirst"));
@@ -5125,10 +5848,10 @@ var buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
5125
5848
  return { balance, nomPoolMemberInfo };
5126
5849
  }
5127
5850
  };
5128
- }).filter(import_util8.isNotNil);
5851
+ }).filter(import_util11.isNotNil);
5129
5852
  };
5130
5853
  var decodeBaseResult = (coder, value, networkId) => {
5131
- const decoded = (0, import_scale20.decodeScale)(
5854
+ const decoded = (0, import_scale21.decodeScale)(
5132
5855
  coder,
5133
5856
  value,
5134
5857
  `Failed to decode base native balance on chain ${networkId}`
@@ -5148,7 +5871,7 @@ var decodeBaseResult = (coder, value, networkId) => {
5148
5871
  return newValues;
5149
5872
  };
5150
5873
  var decodeLocksResult = (coder, value, networkId) => {
5151
- const decoded = (0, import_scale20.decodeScale)(
5874
+ const decoded = (0, import_scale21.decodeScale)(
5152
5875
  coder,
5153
5876
  value,
5154
5877
  `Failed to decode lock on chain ${networkId}`
@@ -5163,7 +5886,7 @@ var decodeLocksResult = (coder, value, networkId) => {
5163
5886
  return locksQueryLocks;
5164
5887
  };
5165
5888
  var decodeFreezesResult = (coder, value, networkId) => {
5166
- const decoded = (0, import_scale20.decodeScale)(
5889
+ const decoded = (0, import_scale21.decodeScale)(
5167
5890
  coder,
5168
5891
  value,
5169
5892
  `Failed to decode freeze on chain ${networkId}`
@@ -5177,7 +5900,7 @@ var decodeFreezesResult = (coder, value, networkId) => {
5177
5900
  return freezesValues;
5178
5901
  };
5179
5902
  var decodeHoldsResult = (coder, value, networkId) => {
5180
- const decoded = (0, import_scale20.decodeScale)(
5903
+ const decoded = (0, import_scale21.decodeScale)(
5181
5904
  coder,
5182
5905
  value,
5183
5906
  `Failed to decode holds on chain ${networkId}`
@@ -5193,7 +5916,7 @@ var decodeHoldsResult = (coder, value, networkId) => {
5193
5916
  return holdsValues;
5194
5917
  };
5195
5918
  var decodeStakingLedgerResult = (coder, value, networkId) => {
5196
- const decoded = (0, import_scale20.decodeScale)(
5919
+ const decoded = (0, import_scale21.decodeScale)(
5197
5920
  coder,
5198
5921
  value,
5199
5922
  `Failed to decode unbonding query on chain ${networkId}`
@@ -5210,7 +5933,7 @@ var decodeStakingLedgerResult = (coder, value, networkId) => {
5210
5933
  return stakingLedgerResults;
5211
5934
  };
5212
5935
  var decodePoolMemberResult = (coder, value, networkId) => {
5213
- const decoded = (0, import_scale20.decodeScale)(
5936
+ const decoded = (0, import_scale21.decodeScale)(
5214
5937
  coder,
5215
5938
  value,
5216
5939
  `Failed to decode poolMembers on chain ${networkId}`
@@ -5232,7 +5955,7 @@ var decodePoolMemberResult = (coder, value, networkId) => {
5232
5955
  };
5233
5956
 
5234
5957
  // src/modules/substrate-native/queries/buildNomPoolQueries.ts
5235
- var import_scale21 = require("@talismn/scale");
5958
+ var import_scale22 = require("@talismn/scale");
5236
5959
 
5237
5960
  // src/modules/substrate-native/util/nompoolAccountId.ts
5238
5961
  var import_utils7 = require("@polkadot-api/utils");
@@ -5325,7 +6048,7 @@ var getNomPoolCoders = (networkId, miniMetadata) => {
5325
6048
  });
5326
6049
  };
5327
6050
  var decodePoolPoints = (coder, value, networkId) => {
5328
- const decoded = (0, import_scale21.decodeScale)(
6051
+ const decoded = (0, import_scale22.decodeScale)(
5329
6052
  coder,
5330
6053
  value,
5331
6054
  `Failed to decode bondedPools on chain ${networkId}`
@@ -5333,7 +6056,7 @@ var decodePoolPoints = (coder, value, networkId) => {
5333
6056
  return { poolPoints: decoded?.points.toString() };
5334
6057
  };
5335
6058
  var decodePoolStake = (coder, value, networkId) => {
5336
- const decoded = (0, import_scale21.decodeScale)(
6059
+ const decoded = (0, import_scale22.decodeScale)(
5337
6060
  coder,
5338
6061
  value,
5339
6062
  `Failed to decode ledger on chain ${networkId}`
@@ -5341,7 +6064,7 @@ var decodePoolStake = (coder, value, networkId) => {
5341
6064
  return { poolTotalActiveStake: decoded?.active.toString() };
5342
6065
  };
5343
6066
  var decodePoolMeta = (coder, value, networkId) => {
5344
- const decoded = (0, import_scale21.decodeScale)(
6067
+ const decoded = (0, import_scale22.decodeScale)(
5345
6068
  coder,
5346
6069
  value,
5347
6070
  `Failed to decode metadata on chain ${networkId}`
@@ -5365,11 +6088,11 @@ var getNomPoolStateKeys = (coders, nomPoolMemberInfo, extra) => {
5365
6088
  };
5366
6089
 
5367
6090
  // src/modules/substrate-native/fetchBalances.ts
5368
- var fetchBalances10 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
6091
+ var fetchBalances11 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
5369
6092
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
5370
6093
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
5371
6094
  if (!miniMetadata?.data) {
5372
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE10} balances on ${networkId}.`);
6095
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE11} balances on ${networkId}.`);
5373
6096
  return {
5374
6097
  success: [],
5375
6098
  errors: balanceDefs.map((def) => ({
@@ -5379,20 +6102,20 @@ var fetchBalances10 = async ({ networkId, tokensWithAddresses, connector, miniMe
5379
6102
  }))
5380
6103
  };
5381
6104
  }
5382
- if (miniMetadata.source !== MODULE_TYPE10) {
5383
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE10}.`);
6105
+ if (miniMetadata.source !== MODULE_TYPE11) {
6106
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE11}.`);
5384
6107
  return {
5385
6108
  success: [],
5386
6109
  errors: balanceDefs.map((def) => ({
5387
6110
  tokenId: def.token.id,
5388
6111
  address: def.address,
5389
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE10}`)
6112
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE11}`)
5390
6113
  }))
5391
6114
  };
5392
6115
  }
5393
6116
  if (miniMetadata.chainId !== networkId) {
5394
6117
  log_default.warn(
5395
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE10}. Expected chainId is ${networkId}`
6118
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE11}. Expected chainId is ${networkId}`
5396
6119
  );
5397
6120
  return {
5398
6121
  success: [],
@@ -5411,10 +6134,10 @@ var fetchBalances10 = async ({ networkId, tokensWithAddresses, connector, miniMe
5411
6134
  };
5412
6135
 
5413
6136
  // src/modules/substrate-native/fetchTokens.ts
5414
- var import_chaindata_provider51 = require("@talismn/chaindata-provider");
5415
- var import_lodash_es23 = require("lodash-es");
5416
- var import_v413 = __toESM(require("zod/v4"));
5417
- var fetchTokens10 = async ({ networkId, tokens, connector, miniMetadata }) => {
6137
+ var import_chaindata_provider58 = require("@talismn/chaindata-provider");
6138
+ var import_lodash_es26 = require("lodash-es");
6139
+ var import_v415 = __toESM(require("zod/v4"));
6140
+ var fetchTokens11 = async ({ networkId, tokens, connector, miniMetadata }) => {
5418
6141
  if (miniMetadata.extra.disable) return [];
5419
6142
  const { tokenSymbol: symbol, tokenDecimals: decimals } = await getChainProperties(
5420
6143
  connector,
@@ -5424,7 +6147,7 @@ var fetchTokens10 = async ({ networkId, tokens, connector, miniMetadata }) => {
5424
6147
  log_default.warn(`Substrate native module: existentialDeposit is undefined for ${networkId}, using 0`);
5425
6148
  const tokenConfig = tokens[0];
5426
6149
  const nativeToken = {
5427
- id: (0, import_chaindata_provider51.subNativeTokenId)(networkId),
6150
+ id: (0, import_chaindata_provider58.subNativeTokenId)(networkId),
5428
6151
  type: "substrate-native",
5429
6152
  platform: "polkadot",
5430
6153
  networkId,
@@ -5434,22 +6157,22 @@ var fetchTokens10 = async ({ networkId, tokens, connector, miniMetadata }) => {
5434
6157
  decimals,
5435
6158
  existentialDeposit: miniMetadata.extra.existentialDeposit ?? "0"
5436
6159
  };
5437
- const token = (0, import_lodash_es23.assign)(nativeToken, tokenConfig);
5438
- const parsed = import_chaindata_provider51.SubNativeTokenSchema.safeParse(token);
6160
+ const token = (0, import_lodash_es26.assign)(nativeToken, tokenConfig);
6161
+ const parsed = import_chaindata_provider58.SubNativeTokenSchema.safeParse(token);
5439
6162
  if (!parsed.success) {
5440
6163
  return [];
5441
6164
  }
5442
6165
  return [parsed.data];
5443
6166
  };
5444
- var DotNetworkPropertiesSimple = import_v413.default.object({
5445
- tokenDecimals: import_v413.default.number().optional().default(0),
5446
- tokenSymbol: import_v413.default.string().optional().default("Unit")
6167
+ var DotNetworkPropertiesSimple = import_v415.default.object({
6168
+ tokenDecimals: import_v415.default.number().optional().default(0),
6169
+ tokenSymbol: import_v415.default.string().optional().default("Unit")
5447
6170
  });
5448
- var DotNetworkPropertiesArray = import_v413.default.object({
5449
- tokenDecimals: import_v413.default.array(import_v413.default.number()).nonempty(),
5450
- tokenSymbol: import_v413.default.array(import_v413.default.string()).nonempty()
6171
+ var DotNetworkPropertiesArray = import_v415.default.object({
6172
+ tokenDecimals: import_v415.default.array(import_v415.default.number()).nonempty(),
6173
+ tokenSymbol: import_v415.default.array(import_v415.default.string()).nonempty()
5451
6174
  });
5452
- var DotNetworkPropertiesSchema = import_v413.default.union([DotNetworkPropertiesSimple, DotNetworkPropertiesArray]).transform((val) => ({
6175
+ var DotNetworkPropertiesSchema = import_v415.default.union([DotNetworkPropertiesSimple, DotNetworkPropertiesArray]).transform((val) => ({
5453
6176
  tokenDecimals: Array.isArray(val.tokenDecimals) ? val.tokenDecimals[0] : val.tokenDecimals,
5454
6177
  tokenSymbol: Array.isArray(val.tokenSymbol) ? val.tokenSymbol[0] : val.tokenSymbol
5455
6178
  }));
@@ -5459,10 +6182,10 @@ var getChainProperties = async (connector, networkId) => {
5459
6182
  };
5460
6183
 
5461
6184
  // src/modules/substrate-native/getMiniMetadata.ts
5462
- var import_chaindata_provider52 = require("@talismn/chaindata-provider");
5463
- var import_scale22 = require("@talismn/scale");
5464
- var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
5465
- const source = MODULE_TYPE10;
6185
+ var import_chaindata_provider59 = require("@talismn/chaindata-provider");
6186
+ var import_scale23 = require("@talismn/scale");
6187
+ var getMiniMetadata11 = ({ networkId, specVersion, metadataRpc, config }) => {
6188
+ const source = MODULE_TYPE11;
5466
6189
  const chainId = networkId;
5467
6190
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
5468
6191
  if (specVersion !== systemVersion.spec_version)
@@ -5470,7 +6193,7 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
5470
6193
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
5471
6194
  );
5472
6195
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
5473
- const { metadata, unifiedMetadata } = (0, import_scale22.parseMetadataRpc)(metadataRpc);
6196
+ const { metadata, unifiedMetadata } = (0, import_scale23.parseMetadataRpc)(metadataRpc);
5474
6197
  if (unifiedMetadata.version < 14)
5475
6198
  throw new Error(
5476
6199
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -5481,7 +6204,7 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
5481
6204
  source,
5482
6205
  chainId,
5483
6206
  specVersion,
5484
- version: import_chaindata_provider52.MINIMETADATA_VERSION,
6207
+ version: import_chaindata_provider59.MINIMETADATA_VERSION,
5485
6208
  data: null,
5486
6209
  extra: { disable: true }
5487
6210
  };
@@ -5499,7 +6222,7 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
5499
6222
  unifiedMetadata.pallets.find(({ name }) => name === "Balances")?.storage?.items.find(({ name }) => name === "Freezes")
5500
6223
  );
5501
6224
  const useLegacyTransferableCalculation = !hasFreezesItem;
5502
- (0, import_scale22.compactMetadata)(metadata, [
6225
+ (0, import_scale23.compactMetadata)(metadata, [
5503
6226
  { pallet: "System", constants: ["Version", "SS58Prefix"], items: ["Account"] },
5504
6227
  { pallet: "Balances", items: ["Reserves", "Holds", "Locks", "Freezes"] },
5505
6228
  { pallet: "NominationPools", items: ["PoolMembers", "BondedPools", "Metadata"] },
@@ -5510,8 +6233,8 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
5510
6233
  source,
5511
6234
  chainId,
5512
6235
  specVersion,
5513
- version: import_chaindata_provider52.MINIMETADATA_VERSION,
5514
- data: (0, import_scale22.encodeMetadata)(metadata),
6236
+ version: import_chaindata_provider59.MINIMETADATA_VERSION,
6237
+ data: (0, import_scale23.encodeMetadata)(metadata),
5515
6238
  extra: {
5516
6239
  useLegacyTransferableCalculation,
5517
6240
  existentialDeposit,
@@ -5522,10 +6245,10 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
5522
6245
 
5523
6246
  // src/modules/substrate-native/getTransferCallData.ts
5524
6247
  var import_utils8 = require("@polkadot-api/utils");
5525
- var import_chaindata_provider53 = require("@talismn/chaindata-provider");
5526
- var import_scale23 = require("@talismn/scale");
6248
+ var import_chaindata_provider60 = require("@talismn/chaindata-provider");
6249
+ var import_scale24 = require("@talismn/scale");
5527
6250
  var import_polkadot_api6 = require("polkadot-api");
5528
- var getTransferCallData10 = ({
6251
+ var getTransferCallData11 = ({
5529
6252
  from: from2,
5530
6253
  to,
5531
6254
  value,
@@ -5533,9 +6256,9 @@ var getTransferCallData10 = ({
5533
6256
  type,
5534
6257
  metadataRpc
5535
6258
  }) => {
5536
- if (!(0, import_chaindata_provider53.isTokenOfType)(token, MODULE_TYPE10))
5537
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE10}.`);
5538
- const { unifiedMetadata, lookupFn, builder } = (0, import_scale23.parseMetadataRpc)(metadataRpc);
6259
+ if (!(0, import_chaindata_provider60.isTokenOfType)(token, MODULE_TYPE11))
6260
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE11}.`);
6261
+ const { unifiedMetadata, lookupFn, builder } = (0, import_scale24.parseMetadataRpc)(metadataRpc);
5539
6262
  const method = getTransferMethod3(type, unifiedMetadata, lookupFn);
5540
6263
  const { codec, location } = builder.buildCall("Balances", method);
5541
6264
  const args = getEncodedArgs3(method, to, value, codec);
@@ -5612,17 +6335,17 @@ var getTransferAllEncodedArgs3 = (to, codec) => {
5612
6335
  };
5613
6336
 
5614
6337
  // src/modules/substrate-native/subscribeBalances.ts
5615
- var import_rxjs12 = require("rxjs");
5616
- var subscribeBalances10 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
5617
- if (!tokensWithAddresses.length) return (0, import_rxjs12.of)({ success: [], errors: [] });
6338
+ var import_rxjs13 = require("rxjs");
6339
+ var subscribeBalances11 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
6340
+ if (!tokensWithAddresses.length) return (0, import_rxjs13.of)({ success: [], errors: [] });
5618
6341
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
5619
6342
  const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata);
5620
6343
  return getRpcQueryPack$(connector, networkId, baseQueries).pipe(
5621
- (0, import_rxjs12.switchMap)((partialBalances) => {
6344
+ (0, import_rxjs13.switchMap)((partialBalances) => {
5622
6345
  const nomPoolQueries = buildNomPoolQueries(networkId, partialBalances, miniMetadata);
5623
6346
  return getRpcQueryPack$(connector, networkId, nomPoolQueries);
5624
6347
  }),
5625
- (0, import_rxjs12.map)((balances) => ({
6348
+ (0, import_rxjs13.map)((balances) => ({
5626
6349
  success: balances,
5627
6350
  errors: []
5628
6351
  }))
@@ -5631,34 +6354,34 @@ var subscribeBalances10 = ({ networkId, tokensWithAddresses, connector, miniMeta
5631
6354
 
5632
6355
  // src/modules/substrate-native/module.ts
5633
6356
  var SubNativeBalanceModule = {
5634
- type: MODULE_TYPE10,
5635
- platform: PLATFORM10,
5636
- getMiniMetadata: getMiniMetadata10,
5637
- fetchTokens: fetchTokens10,
5638
- fetchBalances: fetchBalances10,
5639
- subscribeBalances: subscribeBalances10,
5640
- getTransferCallData: getTransferCallData10
6357
+ type: MODULE_TYPE11,
6358
+ platform: PLATFORM11,
6359
+ getMiniMetadata: getMiniMetadata11,
6360
+ fetchTokens: fetchTokens11,
6361
+ fetchBalances: fetchBalances11,
6362
+ subscribeBalances: subscribeBalances11,
6363
+ getTransferCallData: getTransferCallData11
5641
6364
  };
5642
6365
 
5643
6366
  // src/modules/substrate-native/types.ts
5644
- var import_v414 = __toESM(require("zod/v4"));
5645
- var SubNativeTokenConfigSchema = import_v414.default.strictObject({
6367
+ var import_v416 = __toESM(require("zod/v4"));
6368
+ var SubNativeTokenConfigSchema = import_v416.default.strictObject({
5646
6369
  ...TokenConfigBaseSchema.shape
5647
6370
  });
5648
- var SubNativeModuleConfigSchema = import_v414.default.strictObject({
5649
- disable: import_v414.default.boolean().optional()
6371
+ var SubNativeModuleConfigSchema = import_v416.default.strictObject({
6372
+ disable: import_v416.default.boolean().optional()
5650
6373
  });
5651
- var SubNativeMiniMetadataExtraSchema = import_v414.default.strictObject({
5652
- disable: import_v414.default.boolean().optional(),
5653
- useLegacyTransferableCalculation: import_v414.default.boolean().optional(),
5654
- existentialDeposit: import_v414.default.string().optional(),
5655
- nominationPoolsPalletId: import_v414.default.string().optional()
6374
+ var SubNativeMiniMetadataExtraSchema = import_v416.default.strictObject({
6375
+ disable: import_v416.default.boolean().optional(),
6376
+ useLegacyTransferableCalculation: import_v416.default.boolean().optional(),
6377
+ existentialDeposit: import_v416.default.string().optional(),
6378
+ nominationPoolsPalletId: import_v416.default.string().optional()
5656
6379
  });
5657
6380
 
5658
6381
  // src/modules/substrate-psp22/config.ts
5659
- var import_chaindata_provider54 = require("@talismn/chaindata-provider");
5660
- var MODULE_TYPE11 = import_chaindata_provider54.SubPsp22TokenSchema.shape.type.value;
5661
- var PLATFORM11 = import_chaindata_provider54.SubPsp22TokenSchema.shape.platform.value;
6382
+ var import_chaindata_provider61 = require("@talismn/chaindata-provider");
6383
+ var MODULE_TYPE12 = import_chaindata_provider61.SubPsp22TokenSchema.shape.type.value;
6384
+ var PLATFORM12 = import_chaindata_provider61.SubPsp22TokenSchema.shape.platform.value;
5662
6385
 
5663
6386
  // src/modules/substrate-psp22/fetchBalances.ts
5664
6387
  var import_api_contract = require("@polkadot/api-contract");
@@ -6662,7 +7385,17 @@ var psp22_default = {
6662
7385
  };
6663
7386
 
6664
7387
  // src/modules/substrate-psp22/util.ts
6665
- var import_util9 = require("@polkadot/util");
7388
+ var u8aToHex = (value) => `0x${Array.from(value, (b) => b.toString(16).padStart(2, "0")).join("")}`;
7389
+ var u8aConcatStrict = (arrays) => {
7390
+ const length = arrays.reduce((total, arr) => total + arr.length, 0);
7391
+ const result = new Uint8Array(length);
7392
+ let offset = 0;
7393
+ for (const arr of arrays) {
7394
+ result.set(arr, offset);
7395
+ offset += arr.length;
7396
+ }
7397
+ return result;
7398
+ };
6666
7399
  var makeContractCaller = ({
6667
7400
  chainConnector,
6668
7401
  chainId,
@@ -6671,8 +7404,8 @@ var makeContractCaller = ({
6671
7404
  "ContractExecResult",
6672
7405
  await chainConnector.send(chainId, "state_call", [
6673
7406
  "ContractsApi_call",
6674
- (0, import_util9.u8aToHex)(
6675
- (0, import_util9.u8aConcatStrict)([
7407
+ u8aToHex(
7408
+ u8aConcatStrict([
6676
7409
  // origin
6677
7410
  registry.createType("AccountId", callFrom).toU8a(),
6678
7411
  // dest
@@ -6691,7 +7424,7 @@ var makeContractCaller = ({
6691
7424
  );
6692
7425
 
6693
7426
  // src/modules/substrate-psp22/fetchBalances.ts
6694
- var fetchBalances11 = async ({
7427
+ var fetchBalances12 = async ({
6695
7428
  networkId,
6696
7429
  tokensWithAddresses,
6697
7430
  connector
@@ -6746,10 +7479,11 @@ var fetchBalances11 = async ({
6746
7479
  // src/modules/substrate-psp22/fetchTokens.ts
6747
7480
  var import_api_contract2 = require("@polkadot/api-contract");
6748
7481
  var import_types17 = require("@polkadot/types");
6749
- var import_util11 = require("@polkadot/util");
6750
- var import_chaindata_provider55 = require("@talismn/chaindata-provider");
6751
- var import_lodash_es24 = require("lodash-es");
6752
- var fetchTokens11 = async ({
7482
+ var import_chaindata_provider62 = require("@talismn/chaindata-provider");
7483
+ var import_lodash_es27 = require("lodash-es");
7484
+ var hexToNumber = (hex) => Number(hex);
7485
+ var u8aToString = (value) => new TextDecoder().decode(value);
7486
+ var fetchTokens12 = async ({
6753
7487
  networkId,
6754
7488
  tokens,
6755
7489
  connector
@@ -6783,7 +7517,7 @@ var fetchTokens11 = async ({
6783
7517
  )
6784
7518
  ]);
6785
7519
  const symbolData = symbolResult.toJSON()?.result?.ok?.data;
6786
- symbol = typeof symbolData === "string" && symbolData.startsWith("0x") ? (0, import_util11.u8aToString)(
7520
+ symbol = typeof symbolData === "string" && symbolData.startsWith("0x") ? u8aToString(
6787
7521
  registry.createType(
6788
7522
  "Option<Vec<u8>>",
6789
7523
  // biome-ignore lint/suspicious/noExplicitAny: legacy
@@ -6791,9 +7525,9 @@ var fetchTokens11 = async ({
6791
7525
  )?.value
6792
7526
  )?.replace(/\p{C}/gu, "") : symbol;
6793
7527
  const decimalsData = decimalsResult.toJSON()?.result?.ok?.data;
6794
- decimals = typeof decimalsData === "string" && decimalsData.startsWith("0x") ? (0, import_util11.hexToNumber)(decimalsData) : decimals;
7528
+ decimals = typeof decimalsData === "string" && decimalsData.startsWith("0x") ? hexToNumber(decimalsData) : decimals;
6795
7529
  })();
6796
- const id = (0, import_chaindata_provider55.subPsp22TokenId)(networkId, contractAddress);
7530
+ const id = (0, import_chaindata_provider62.subPsp22TokenId)(networkId, contractAddress);
6797
7531
  const token = {
6798
7532
  id,
6799
7533
  type: "substrate-psp22",
@@ -6816,21 +7550,21 @@ var fetchTokens11 = async ({
6816
7550
  );
6817
7551
  }
6818
7552
  }
6819
- return (0, import_lodash_es24.values)(tokenList).filter((t) => {
6820
- const parsed = import_chaindata_provider55.SubPsp22TokenSchema.safeParse(t);
7553
+ return (0, import_lodash_es27.values)(tokenList).filter((t) => {
7554
+ const parsed = import_chaindata_provider62.SubPsp22TokenSchema.safeParse(t);
6821
7555
  return parsed.success;
6822
7556
  });
6823
7557
  };
6824
7558
 
6825
7559
  // src/modules/substrate-psp22/getMiniMetadata.ts
6826
- var import_chaindata_provider56 = require("@talismn/chaindata-provider");
6827
- var import_scale24 = require("@talismn/scale");
6828
- var getMiniMetadata11 = ({
7560
+ var import_chaindata_provider63 = require("@talismn/chaindata-provider");
7561
+ var import_scale25 = require("@talismn/scale");
7562
+ var getMiniMetadata12 = ({
6829
7563
  networkId,
6830
7564
  specVersion,
6831
7565
  metadataRpc
6832
7566
  }) => {
6833
- const source = MODULE_TYPE11;
7567
+ const source = MODULE_TYPE12;
6834
7568
  const chainId = networkId;
6835
7569
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
6836
7570
  if (specVersion !== systemVersion.spec_version)
@@ -6838,7 +7572,7 @@ var getMiniMetadata11 = ({
6838
7572
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
6839
7573
  );
6840
7574
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
6841
- const { unifiedMetadata } = (0, import_scale24.parseMetadataRpc)(metadataRpc);
7575
+ const { unifiedMetadata } = (0, import_scale25.parseMetadataRpc)(metadataRpc);
6842
7576
  if (unifiedMetadata.version < 14)
6843
7577
  throw new Error(
6844
7578
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -6848,7 +7582,7 @@ var getMiniMetadata11 = ({
6848
7582
  source,
6849
7583
  chainId,
6850
7584
  specVersion,
6851
- version: import_chaindata_provider56.MINIMETADATA_VERSION,
7585
+ version: import_chaindata_provider63.MINIMETADATA_VERSION,
6852
7586
  data: null,
6853
7587
  extra: null
6854
7588
  };
@@ -6858,14 +7592,14 @@ var getMiniMetadata11 = ({
6858
7592
  var import_api_contract3 = require("@polkadot/api-contract");
6859
7593
  var import_types19 = require("@polkadot/types");
6860
7594
  var import_utils9 = require("@polkadot-api/utils");
6861
- var import_chaindata_provider57 = require("@talismn/chaindata-provider");
6862
- var import_scale25 = require("@talismn/scale");
7595
+ var import_chaindata_provider64 = require("@talismn/chaindata-provider");
7596
+ var import_scale26 = require("@talismn/scale");
6863
7597
  var import_polkadot_api7 = require("polkadot-api");
6864
- var getTransferCallData11 = async ({ from: from2, to, value, token, metadataRpc, connector }) => {
6865
- if (!(0, import_chaindata_provider57.isTokenOfType)(token, MODULE_TYPE11))
6866
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE11}.`);
6867
- const networkId = (0, import_chaindata_provider57.parseTokenId)(token.id).networkId;
6868
- const { builder } = (0, import_scale25.parseMetadataRpc)(metadataRpc);
7598
+ var getTransferCallData12 = async ({ from: from2, to, value, token, metadataRpc, connector }) => {
7599
+ if (!(0, import_chaindata_provider64.isTokenOfType)(token, MODULE_TYPE12))
7600
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE12}.`);
7601
+ const networkId = (0, import_chaindata_provider64.parseTokenId)(token.id).networkId;
7602
+ const { builder } = (0, import_scale26.parseMetadataRpc)(metadataRpc);
6869
7603
  const { codec, location } = builder.buildCall("Contracts", "call");
6870
7604
  const Psp22Abi = new import_api_contract3.Abi(psp22_default);
6871
7605
  const registry = new import_types19.TypeRegistry();
@@ -6895,22 +7629,22 @@ var getTransferCallData11 = async ({ from: from2, to, value, token, metadataRpc,
6895
7629
  };
6896
7630
 
6897
7631
  // src/modules/substrate-psp22/subscribeBalances.ts
6898
- var import_lodash_es25 = require("lodash-es");
6899
- var import_rxjs13 = require("rxjs");
6900
- var SUBSCRIPTION_INTERVAL8 = 6e3;
6901
- var subscribeBalances11 = ({
7632
+ var import_lodash_es28 = require("lodash-es");
7633
+ var import_rxjs14 = require("rxjs");
7634
+ var SUBSCRIPTION_INTERVAL9 = 6e3;
7635
+ var subscribeBalances12 = ({
6902
7636
  networkId,
6903
7637
  tokensWithAddresses,
6904
7638
  connector,
6905
7639
  miniMetadata
6906
7640
  }) => {
6907
- if (!tokensWithAddresses.length) return (0, import_rxjs13.of)({ success: [], errors: [] });
6908
- return new import_rxjs13.Observable((subscriber) => {
7641
+ if (!tokensWithAddresses.length) return (0, import_rxjs14.of)({ success: [], errors: [] });
7642
+ return new import_rxjs14.Observable((subscriber) => {
6909
7643
  const abortController = new AbortController();
6910
7644
  const poll = async () => {
6911
7645
  try {
6912
7646
  if (abortController.signal.aborted) return;
6913
- const balances = await fetchBalances11({
7647
+ const balances = await fetchBalances12({
6914
7648
  networkId,
6915
7649
  tokensWithAddresses,
6916
7650
  connector,
@@ -6918,10 +7652,10 @@ var subscribeBalances11 = ({
6918
7652
  });
6919
7653
  if (abortController.signal.aborted) return;
6920
7654
  subscriber.next(balances);
6921
- setTimeout(poll, SUBSCRIPTION_INTERVAL8);
7655
+ setTimeout(poll, SUBSCRIPTION_INTERVAL9);
6922
7656
  } catch (error) {
6923
7657
  log_default.error("Error", {
6924
- module: MODULE_TYPE11,
7658
+ module: MODULE_TYPE12,
6925
7659
  networkId,
6926
7660
  miniMetadata,
6927
7661
  addressesByToken: tokensWithAddresses,
@@ -6934,36 +7668,36 @@ var subscribeBalances11 = ({
6934
7668
  return () => {
6935
7669
  abortController.abort();
6936
7670
  };
6937
- }).pipe((0, import_rxjs13.distinctUntilChanged)(import_lodash_es25.isEqual));
7671
+ }).pipe((0, import_rxjs14.distinctUntilChanged)(import_lodash_es28.isEqual));
6938
7672
  };
6939
7673
 
6940
7674
  // src/modules/substrate-psp22/module.ts
6941
7675
  var SubPsp22BalanceModule = {
6942
- type: MODULE_TYPE11,
6943
- platform: PLATFORM11,
6944
- getMiniMetadata: getMiniMetadata11,
6945
- fetchTokens: fetchTokens11,
6946
- fetchBalances: fetchBalances11,
6947
- subscribeBalances: subscribeBalances11,
6948
- getTransferCallData: getTransferCallData11
7676
+ type: MODULE_TYPE12,
7677
+ platform: PLATFORM12,
7678
+ getMiniMetadata: getMiniMetadata12,
7679
+ fetchTokens: fetchTokens12,
7680
+ fetchBalances: fetchBalances12,
7681
+ subscribeBalances: subscribeBalances12,
7682
+ getTransferCallData: getTransferCallData12
6949
7683
  };
6950
7684
 
6951
7685
  // src/modules/substrate-psp22/types.ts
6952
- var import_chaindata_provider58 = require("@talismn/chaindata-provider");
6953
- var import_v415 = __toESM(require("zod/v4"));
6954
- var SubPsp22TokenConfigSchema = import_v415.default.strictObject({
6955
- contractAddress: import_chaindata_provider58.SubPsp22TokenSchema.shape.contractAddress,
7686
+ var import_chaindata_provider65 = require("@talismn/chaindata-provider");
7687
+ var import_v417 = __toESM(require("zod/v4"));
7688
+ var SubPsp22TokenConfigSchema = import_v417.default.strictObject({
7689
+ contractAddress: import_chaindata_provider65.SubPsp22TokenSchema.shape.contractAddress,
6956
7690
  ...TokenConfigBaseSchema.shape
6957
7691
  });
6958
7692
 
6959
7693
  // src/modules/substrate-tokens/config.ts
6960
- var import_chaindata_provider59 = require("@talismn/chaindata-provider");
6961
- var MODULE_TYPE12 = import_chaindata_provider59.SubTokensTokenSchema.shape.type.value;
6962
- var PLATFORM12 = import_chaindata_provider59.SubTokensTokenSchema.shape.platform.value;
7694
+ var import_chaindata_provider66 = require("@talismn/chaindata-provider");
7695
+ var MODULE_TYPE13 = import_chaindata_provider66.SubTokensTokenSchema.shape.type.value;
7696
+ var PLATFORM13 = import_chaindata_provider66.SubTokensTokenSchema.shape.platform.value;
6963
7697
 
6964
7698
  // src/modules/substrate-tokens/buildQueries.ts
6965
- var import_scale26 = require("@talismn/scale");
6966
- var import_util14 = require("@talismn/util");
7699
+ var import_scale27 = require("@talismn/scale");
7700
+ var import_util15 = require("@talismn/util");
6967
7701
  var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
6968
7702
  const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
6969
7703
  storage: [miniMetadata.extra.palletId, "Accounts"]
@@ -6972,7 +7706,7 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
6972
7706
  const scaleCoder = networkStorageCoders?.storage;
6973
7707
  const getStateKey = (onChainId) => {
6974
7708
  try {
6975
- return scaleCoder.keys.enc(address, (0, import_scale26.papiParse)(onChainId));
7709
+ return scaleCoder.keys.enc(address, (0, import_scale27.papiParse)(onChainId));
6976
7710
  } catch {
6977
7711
  return null;
6978
7712
  }
@@ -6985,7 +7719,7 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
6985
7719
  return null;
6986
7720
  }
6987
7721
  const decodeResult = (changes) => {
6988
- const decoded = (0, import_scale26.decodeScale)(
7722
+ const decoded = (0, import_scale27.decodeScale)(
6989
7723
  scaleCoder,
6990
7724
  changes[0],
6991
7725
  `Failed to decode substrate-tokens balance on chain ${networkId}`
@@ -7011,15 +7745,15 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
7011
7745
  stateKeys: [stateKey],
7012
7746
  decodeResult
7013
7747
  };
7014
- }).filter(import_util14.isNotNil);
7748
+ }).filter(import_util15.isNotNil);
7015
7749
  };
7016
7750
 
7017
7751
  // src/modules/substrate-tokens/fetchBalances.ts
7018
- var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
7752
+ var fetchBalances13 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
7019
7753
  if (!tokensWithAddresses.length) return { success: [], errors: [] };
7020
7754
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
7021
7755
  if (!miniMetadata?.data) {
7022
- log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE12} balances on ${networkId}.`);
7756
+ log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE13} balances on ${networkId}.`);
7023
7757
  return {
7024
7758
  success: [],
7025
7759
  errors: balanceDefs.map((def) => ({
@@ -7029,20 +7763,20 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
7029
7763
  }))
7030
7764
  };
7031
7765
  }
7032
- if (miniMetadata.source !== MODULE_TYPE12) {
7033
- log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE12}.`);
7766
+ if (miniMetadata.source !== MODULE_TYPE13) {
7767
+ log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE13}.`);
7034
7768
  return {
7035
7769
  success: [],
7036
7770
  errors: balanceDefs.map((def) => ({
7037
7771
  tokenId: def.token.id,
7038
7772
  address: def.address,
7039
- error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE12}`)
7773
+ error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE13}`)
7040
7774
  }))
7041
7775
  };
7042
7776
  }
7043
7777
  if (miniMetadata.chainId !== networkId) {
7044
7778
  log_default.warn(
7045
- `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE12}. Expected chainId is ${networkId}`
7779
+ `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE13}. Expected chainId is ${networkId}`
7046
7780
  );
7047
7781
  return {
7048
7782
  success: [],
@@ -7066,7 +7800,7 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
7066
7800
  address: def.address,
7067
7801
  networkId,
7068
7802
  tokenId: def.token.id,
7069
- source: MODULE_TYPE12,
7803
+ source: MODULE_TYPE13,
7070
7804
  status: "live",
7071
7805
  values: [
7072
7806
  { type: "free", label: "free", amount: "0" },
@@ -7080,20 +7814,20 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
7080
7814
  };
7081
7815
 
7082
7816
  // src/modules/substrate-tokens/fetchTokens.ts
7083
- var import_chaindata_provider60 = require("@talismn/chaindata-provider");
7084
- var import_lodash_es26 = require("lodash-es");
7085
- var fetchTokens12 = async ({
7817
+ var import_chaindata_provider67 = require("@talismn/chaindata-provider");
7818
+ var import_lodash_es29 = require("lodash-es");
7819
+ var fetchTokens13 = async ({
7086
7820
  networkId,
7087
7821
  tokens,
7088
7822
  miniMetadata
7089
7823
  }) => {
7090
7824
  if (!miniMetadata?.data) return [];
7091
7825
  return tokens.map(
7092
- (tokenConfig) => (0, import_lodash_es26.assign)(
7826
+ (tokenConfig) => (0, import_lodash_es29.assign)(
7093
7827
  {
7094
- id: (0, import_chaindata_provider60.subTokensTokenId)(networkId, tokenConfig.onChainId),
7095
- type: MODULE_TYPE12,
7096
- platform: PLATFORM12,
7828
+ id: (0, import_chaindata_provider67.subTokensTokenId)(networkId, tokenConfig.onChainId),
7829
+ type: MODULE_TYPE13,
7830
+ platform: PLATFORM13,
7097
7831
  networkId,
7098
7832
  onChainId: tokenConfig.onChainId,
7099
7833
  symbol: tokenConfig.symbol ?? "Unit",
@@ -7108,10 +7842,10 @@ var fetchTokens12 = async ({
7108
7842
  };
7109
7843
 
7110
7844
  // src/modules/substrate-tokens/getMiniMetadata.ts
7111
- var import_chaindata_provider61 = require("@talismn/chaindata-provider");
7112
- var import_scale27 = require("@talismn/scale");
7113
- var getMiniMetadata12 = ({ networkId, specVersion, metadataRpc, config }) => {
7114
- const source = MODULE_TYPE12;
7845
+ var import_chaindata_provider68 = require("@talismn/chaindata-provider");
7846
+ var import_scale28 = require("@talismn/scale");
7847
+ var getMiniMetadata13 = ({ networkId, specVersion, metadataRpc, config }) => {
7848
+ const source = MODULE_TYPE13;
7115
7849
  const chainId = networkId;
7116
7850
  const systemVersion = getConstantValue(metadataRpc, "System", "Version");
7117
7851
  if (specVersion !== systemVersion.spec_version)
@@ -7119,7 +7853,7 @@ var getMiniMetadata12 = ({ networkId, specVersion, metadataRpc, config }) => {
7119
7853
  `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
7120
7854
  );
7121
7855
  const id = deriveMiniMetadataId({ source, chainId, specVersion });
7122
- const { unifiedMetadata } = (0, import_scale27.parseMetadataRpc)(metadataRpc);
7856
+ const { unifiedMetadata } = (0, import_scale28.parseMetadataRpc)(metadataRpc);
7123
7857
  if (unifiedMetadata.version < 14)
7124
7858
  throw new Error(
7125
7859
  `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
@@ -7130,27 +7864,27 @@ var getMiniMetadata12 = ({ networkId, specVersion, metadataRpc, config }) => {
7130
7864
  source,
7131
7865
  chainId,
7132
7866
  specVersion,
7133
- version: import_chaindata_provider61.MINIMETADATA_VERSION,
7867
+ version: import_chaindata_provider68.MINIMETADATA_VERSION,
7134
7868
  data: getData5(metadataRpc, extra.palletId),
7135
7869
  extra
7136
7870
  };
7137
7871
  };
7138
7872
  var getData5 = (metadataRpc, pallet) => {
7139
- const { metadata, unifiedMetadata } = (0, import_scale27.parseMetadataRpc)(metadataRpc);
7873
+ const { metadata, unifiedMetadata } = (0, import_scale28.parseMetadataRpc)(metadataRpc);
7140
7874
  if (!hasStorageItems(unifiedMetadata, pallet, ["Accounts"])) return null;
7141
- (0, import_scale27.compactMetadata)(metadata, [{ pallet, items: ["Accounts"] }]);
7142
- return (0, import_scale27.encodeMetadata)(metadata);
7875
+ (0, import_scale28.compactMetadata)(metadata, [{ pallet, items: ["Accounts"] }]);
7876
+ return (0, import_scale28.encodeMetadata)(metadata);
7143
7877
  };
7144
7878
 
7145
7879
  // src/modules/substrate-tokens/getTransferCallData.ts
7146
7880
  var import_utils10 = require("@polkadot-api/utils");
7147
- var import_chaindata_provider62 = require("@talismn/chaindata-provider");
7148
- var import_scale28 = require("@talismn/scale");
7881
+ var import_chaindata_provider69 = require("@talismn/chaindata-provider");
7882
+ var import_scale29 = require("@talismn/scale");
7149
7883
  var import_polkadot_api8 = require("polkadot-api");
7150
- var getTransferCallData12 = ({ from: from2, to, value, token, type, metadataRpc, config }) => {
7151
- if (!(0, import_chaindata_provider62.isTokenOfType)(token, MODULE_TYPE12))
7152
- throw new Error(`Token type ${token.type} is not ${MODULE_TYPE12}.`);
7153
- const { builder } = (0, import_scale28.parseMetadataRpc)(metadataRpc);
7884
+ var getTransferCallData13 = ({ from: from2, to, value, token, type, metadataRpc, config }) => {
7885
+ if (!(0, import_chaindata_provider69.isTokenOfType)(token, MODULE_TYPE13))
7886
+ throw new Error(`Token type ${token.type} is not ${MODULE_TYPE13}.`);
7887
+ const { builder } = (0, import_scale29.parseMetadataRpc)(metadataRpc);
7154
7888
  const options = getCallDataOptions(to, token, value, type, config);
7155
7889
  const callData = getCallDataFromOptions(builder, options);
7156
7890
  return {
@@ -7182,7 +7916,7 @@ var buildCallData = (builder, pallet, method, args) => {
7182
7916
  return import_polkadot_api8.Binary.fromBytes((0, import_utils10.mergeUint8)([new Uint8Array(location), codec.enc(args)]));
7183
7917
  };
7184
7918
  var getCallDataOptions = (to, token, value, type, config) => {
7185
- const onChainId = (0, import_scale28.papiParse)(token.onChainId);
7919
+ const onChainId = (0, import_scale29.papiParse)(token.onChainId);
7186
7920
  const method = getTransferMethod4(type);
7187
7921
  return [
7188
7922
  {
@@ -7262,13 +7996,13 @@ var getCallDataOptions = (to, token, value, type, config) => {
7262
7996
  };
7263
7997
 
7264
7998
  // src/modules/substrate-tokens/subscribeBalances.ts
7265
- var import_rxjs14 = require("rxjs");
7266
- var subscribeBalances12 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
7267
- if (!tokensWithAddresses.length) return (0, import_rxjs14.of)({ success: [], errors: [] });
7999
+ var import_rxjs15 = require("rxjs");
8000
+ var subscribeBalances13 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
8001
+ if (!tokensWithAddresses.length) return (0, import_rxjs15.of)({ success: [], errors: [] });
7268
8002
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
7269
8003
  const queries = buildQueries3(networkId, balanceDefs, miniMetadata);
7270
8004
  return getRpcQueryPack$(connector, networkId, queries).pipe(
7271
- (0, import_rxjs14.map)((balances) => ({
8005
+ (0, import_rxjs15.map)((balances) => ({
7272
8006
  success: balances,
7273
8007
  errors: []
7274
8008
  }))
@@ -7277,31 +8011,31 @@ var subscribeBalances12 = ({ networkId, tokensWithAddresses, connector, miniMeta
7277
8011
 
7278
8012
  // src/modules/substrate-tokens/module.ts
7279
8013
  var SubTokensBalanceModule = {
7280
- type: MODULE_TYPE12,
7281
- platform: PLATFORM12,
7282
- getMiniMetadata: getMiniMetadata12,
7283
- fetchTokens: fetchTokens12,
7284
- fetchBalances: fetchBalances12,
7285
- subscribeBalances: subscribeBalances12,
7286
- getTransferCallData: getTransferCallData12
8014
+ type: MODULE_TYPE13,
8015
+ platform: PLATFORM13,
8016
+ getMiniMetadata: getMiniMetadata13,
8017
+ fetchTokens: fetchTokens13,
8018
+ fetchBalances: fetchBalances13,
8019
+ subscribeBalances: subscribeBalances13,
8020
+ getTransferCallData: getTransferCallData13
7287
8021
  };
7288
8022
 
7289
8023
  // src/modules/substrate-tokens/types.ts
7290
- var import_chaindata_provider63 = require("@talismn/chaindata-provider");
7291
- var import_v416 = __toESM(require("zod/v4"));
7292
- var SubTokensTokenConfigSchema = import_v416.default.strictObject({
7293
- onChainId: import_chaindata_provider63.SubTokensTokenSchema.shape.onChainId,
8024
+ var import_chaindata_provider70 = require("@talismn/chaindata-provider");
8025
+ var import_v418 = __toESM(require("zod/v4"));
8026
+ var SubTokensTokenConfigSchema = import_v418.default.strictObject({
8027
+ onChainId: import_chaindata_provider70.SubTokensTokenSchema.shape.onChainId,
7294
8028
  ...TokenConfigBaseSchema.shape,
7295
8029
  // force these 3 fields because in this module we wont pull anything from chain
7296
- symbol: import_v416.default.string().nonempty(),
7297
- decimals: import_v416.default.number(),
7298
- existentialDeposit: import_v416.default.string().nonempty()
8030
+ symbol: import_v418.default.string().nonempty(),
8031
+ decimals: import_v418.default.number(),
8032
+ existentialDeposit: import_v418.default.string().nonempty()
7299
8033
  });
7300
- var SubTokensModuleConfigSchema = import_v416.default.strictObject({
7301
- palletId: import_v416.default.string().optional()
8034
+ var SubTokensModuleConfigSchema = import_v418.default.strictObject({
8035
+ palletId: import_v418.default.string().optional()
7302
8036
  });
7303
- var SubTokensMiniMetadataExtraSchema = import_v416.default.strictObject({
7304
- palletId: import_v416.default.string()
8037
+ var SubTokensMiniMetadataExtraSchema = import_v418.default.strictObject({
8038
+ palletId: import_v418.default.string()
7305
8039
  });
7306
8040
 
7307
8041
  // src/modules/index.ts
@@ -7317,12 +8051,13 @@ var BALANCE_MODULES = [
7317
8051
  EvmUniswapV2BalanceModule,
7318
8052
  EvmNativeBalanceModule,
7319
8053
  SolNativeBalanceModule,
7320
- SolSplBalanceModule
8054
+ SolSplBalanceModule,
8055
+ SolToken2022BalanceModule
7321
8056
  ];
7322
8057
 
7323
8058
  // src/getMiniMetadatas/getMetadataRpc.ts
7324
8059
  var import_sapi = require("@talismn/sapi");
7325
- var import_util15 = require("@talismn/util");
8060
+ var import_util16 = require("@talismn/util");
7326
8061
  var CACHE = /* @__PURE__ */ new Map();
7327
8062
  var getMetadataRpc = async (chainConnector, networkId) => {
7328
8063
  if (CACHE.has(networkId)) return CACHE.get(networkId);
@@ -7336,7 +8071,7 @@ var getMetadataRpc = async (chainConnector, networkId) => {
7336
8071
  try {
7337
8072
  return await pResult;
7338
8073
  } catch (cause) {
7339
- if ((0, import_util15.isAbortError)(cause)) throw cause;
8074
+ if ((0, import_util16.isAbortError)(cause)) throw cause;
7340
8075
  throw new Error(`Failed to fetch metadataRpc for network ${networkId}`, { cause });
7341
8076
  } finally {
7342
8077
  CACHE.delete(networkId);
@@ -7424,37 +8159,37 @@ var BalancesProvider = class {
7424
8159
  constructor(chaindataProvider, chainConnectors, storage = DEFAULT_STORAGE) {
7425
8160
  this.#chaindataProvider = chaindataProvider;
7426
8161
  this.#chainConnectors = chainConnectors;
7427
- this.#storage = new import_rxjs15.BehaviorSubject({
7428
- balances: (0, import_lodash_es27.keyBy)(storage.balances.filter(import_util16.isNotNil), (b) => getBalanceId(b)),
7429
- miniMetadatas: (0, import_lodash_es27.keyBy)(storage.miniMetadatas.filter(import_util16.isNotNil), (m) => m.id)
8162
+ this.#storage = new import_rxjs16.BehaviorSubject({
8163
+ balances: (0, import_lodash_es30.keyBy)(storage.balances.filter(import_util17.isNotNil), (b) => getBalanceId(b)),
8164
+ miniMetadatas: (0, import_lodash_es30.keyBy)(storage.miniMetadatas.filter(import_util17.isNotNil), (m) => m.id)
7430
8165
  });
7431
8166
  }
7432
8167
  get storage$() {
7433
8168
  return this.#storage.pipe(
7434
- (0, import_rxjs15.map)(
8169
+ (0, import_rxjs16.map)(
7435
8170
  ({ balances, miniMetadatas }) => ({
7436
- balances: (0, import_lodash_es27.values)(balances).filter(import_util16.isNotNil).sort(sortByBalanceId),
7437
- miniMetadatas: (0, import_lodash_es27.values)(miniMetadatas).filter(import_util16.isNotNil).sort(sortByMiniMetadataId)
8171
+ balances: (0, import_lodash_es30.values)(balances).filter(import_util17.isNotNil).sort(sortByBalanceId),
8172
+ miniMetadatas: (0, import_lodash_es30.values)(miniMetadatas).filter(import_util17.isNotNil).sort(sortByMiniMetadataId)
7438
8173
  }),
7439
- (0, import_rxjs15.shareReplay)(1)
8174
+ (0, import_rxjs16.shareReplay)(1)
7440
8175
  )
7441
8176
  );
7442
8177
  }
7443
8178
  get storedMiniMetadataMapById$() {
7444
8179
  return this.#storage.pipe(
7445
- (0, import_rxjs15.map)((storage) => (0, import_lodash_es27.keyBy)(storage.miniMetadatas, (m) => m.id)),
7446
- (0, import_rxjs15.distinctUntilChanged)(import_lodash_es27.isEqual),
7447
- (0, import_rxjs15.shareReplay)(1)
8180
+ (0, import_rxjs16.map)((storage) => (0, import_lodash_es30.keyBy)(storage.miniMetadatas, (m) => m.id)),
8181
+ (0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual),
8182
+ (0, import_rxjs16.shareReplay)(1)
7448
8183
  );
7449
8184
  }
7450
8185
  // this is the only public method
7451
8186
  getBalances$(addressesByTokenId) {
7452
8187
  return this.cleanupAddressesByTokenId$(addressesByTokenId).pipe(
7453
- (0, import_rxjs15.map)(
8188
+ (0, import_rxjs16.map)(
7454
8189
  // split by network
7455
- (addressesByTokenId2) => (0, import_lodash_es27.toPairs)(addressesByTokenId2).reduce(
8190
+ (addressesByTokenId2) => (0, import_lodash_es30.toPairs)(addressesByTokenId2).reduce(
7456
8191
  (acc, [tokenId, addresses]) => {
7457
- const networkId = (0, import_chaindata_provider64.parseTokenId)(tokenId).networkId;
8192
+ const networkId = (0, import_chaindata_provider71.parseTokenId)(tokenId).networkId;
7458
8193
  if (!acc[networkId]) acc[networkId] = {};
7459
8194
  acc[networkId][tokenId] = addresses;
7460
8195
  return acc;
@@ -7462,21 +8197,21 @@ var BalancesProvider = class {
7462
8197
  {}
7463
8198
  )
7464
8199
  ),
7465
- (0, import_rxjs15.switchMap)((addressesByTokenIdByNetworkId) => {
7466
- if (!(0, import_lodash_es27.keys)(addressesByTokenIdByNetworkId).length) return (0, import_rxjs15.of)({ isStale: false, results: [] });
7467
- return (0, import_rxjs15.combineLatest)({
7468
- isStale: (0, import_rxjs15.timer)(3e4).pipe(
7469
- (0, import_rxjs15.map)(() => true),
7470
- (0, import_rxjs15.startWith)(false)
8200
+ (0, import_rxjs16.switchMap)((addressesByTokenIdByNetworkId) => {
8201
+ if (!(0, import_lodash_es30.keys)(addressesByTokenIdByNetworkId).length) return (0, import_rxjs16.of)({ isStale: false, results: [] });
8202
+ return (0, import_rxjs16.combineLatest)({
8203
+ isStale: (0, import_rxjs16.timer)(3e4).pipe(
8204
+ (0, import_rxjs16.map)(() => true),
8205
+ (0, import_rxjs16.startWith)(false)
7471
8206
  ),
7472
- results: (0, import_rxjs15.combineLatest)(
7473
- (0, import_lodash_es27.toPairs)(addressesByTokenIdByNetworkId).map(
8207
+ results: (0, import_rxjs16.combineLatest)(
8208
+ (0, import_lodash_es30.toPairs)(addressesByTokenIdByNetworkId).map(
7474
8209
  ([networkId]) => this.getNetworkBalances$(networkId, addressesByTokenIdByNetworkId[networkId])
7475
8210
  )
7476
8211
  )
7477
8212
  });
7478
8213
  }),
7479
- (0, import_rxjs15.map)(
8214
+ (0, import_rxjs16.map)(
7480
8215
  // combine
7481
8216
  ({ isStale, results }) => ({
7482
8217
  status: !isStale && results.some(({ status }) => status === "initialising") ? "initialising" : "live",
@@ -7488,14 +8223,14 @@ var BalancesProvider = class {
7488
8223
  failedBalanceIds: results.flatMap((result) => result.failedBalanceIds)
7489
8224
  })
7490
8225
  ),
7491
- (0, import_rxjs15.distinctUntilChanged)(import_lodash_es27.isEqual)
8226
+ (0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
7492
8227
  );
7493
8228
  }
7494
8229
  fetchBalances(addressesByTokenId) {
7495
- return (0, import_rxjs15.firstValueFrom)(
8230
+ return (0, import_rxjs16.firstValueFrom)(
7496
8231
  this.getBalances$(addressesByTokenId).pipe(
7497
- (0, import_rxjs15.filter)(({ status }) => status === "live"),
7498
- (0, import_rxjs15.map)(({ balances }) => balances)
8232
+ (0, import_rxjs16.filter)(({ status }) => status === "live"),
8233
+ (0, import_rxjs16.map)(({ balances }) => balances)
7499
8234
  )
7500
8235
  );
7501
8236
  }
@@ -7505,12 +8240,12 @@ var BalancesProvider = class {
7505
8240
  getNetworkBalances$(networkId, addressesByTokenId) {
7506
8241
  const network$ = this.#chaindataProvider.getNetworkById$(networkId);
7507
8242
  const tokensMapById$ = this.#chaindataProvider.getTokensMapById$();
7508
- return (0, import_rxjs15.combineLatest)([network$, tokensMapById$]).pipe(
7509
- (0, import_rxjs15.switchMap)(([network, tokensMapById]) => {
7510
- const tokensAndAddresses = (0, import_lodash_es27.toPairs)(addressesByTokenId).map(
8243
+ return (0, import_rxjs16.combineLatest)([network$, tokensMapById$]).pipe(
8244
+ (0, import_rxjs16.switchMap)(([network, tokensMapById]) => {
8245
+ const tokensAndAddresses = (0, import_lodash_es30.toPairs)(addressesByTokenId).map(
7511
8246
  ([tokenId, addresses]) => [tokensMapById[tokenId], addresses]
7512
8247
  );
7513
- return (0, import_rxjs15.combineLatest)(
8248
+ return (0, import_rxjs16.combineLatest)(
7514
8249
  BALANCE_MODULES.filter((mod) => mod.platform === network?.platform).map((mod) => {
7515
8250
  const tokensWithAddresses = tokensAndAddresses.filter(
7516
8251
  ([token]) => token.type === mod.type
@@ -7527,41 +8262,41 @@ var BalancesProvider = class {
7527
8262
  }
7528
8263
  default: {
7529
8264
  log_default.warn("[balances] Unsupported network platform for module", { networkId, mod });
7530
- return (0, import_rxjs15.of)({ status: "live", balances: [], failedBalanceIds: [] });
8265
+ return (0, import_rxjs16.of)({ status: "live", balances: [], failedBalanceIds: [] });
7531
8266
  }
7532
8267
  }
7533
8268
  })
7534
8269
  );
7535
8270
  }),
7536
- (0, import_rxjs15.map)((results) => {
8271
+ (0, import_rxjs16.map)((results) => {
7537
8272
  const errorBalanceIds = results.flatMap((result) => result.failedBalanceIds);
7538
- const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(import_util16.isNotNil).map((b) => ({ ...b, status: "stale" }));
8273
+ const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(import_util17.isNotNil).map((b) => ({ ...b, status: "stale" }));
7539
8274
  return {
7540
8275
  status: results.some(({ status }) => status === "initialising") ? "initialising" : "live",
7541
8276
  balances: results.flatMap((result) => result.balances).concat(staleBalances).sort(sortByBalanceId),
7542
8277
  failedBalanceIds: []
7543
8278
  };
7544
8279
  }),
7545
- (0, import_rxjs15.distinctUntilChanged)(import_lodash_es27.isEqual)
8280
+ (0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
7546
8281
  );
7547
8282
  }
7548
8283
  getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
7549
- return (0, import_util16.getSharedObservable)(
8284
+ return (0, import_util17.getSharedObservable)(
7550
8285
  `BalancesProvider.getPolkadotNetworkModuleBalances$`,
7551
8286
  { networkId, mod, tokensWithAddresses },
7552
8287
  () => {
7553
8288
  if (!tokensWithAddresses.length)
7554
- return (0, import_rxjs15.of)({ status: "live", balances: [], failedBalanceIds: [] });
7555
- const moduleAddressesByTokenId = (0, import_lodash_es27.fromPairs)(
8289
+ return (0, import_rxjs16.of)({ status: "live", balances: [], failedBalanceIds: [] });
8290
+ const moduleAddressesByTokenId = (0, import_lodash_es30.fromPairs)(
7556
8291
  tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
7557
8292
  );
7558
- const balanceIds = (0, import_lodash_es27.toPairs)(moduleAddressesByTokenId).flatMap(
8293
+ const balanceIds = (0, import_lodash_es30.toPairs)(moduleAddressesByTokenId).flatMap(
7559
8294
  ([tokenId, addresses]) => addresses.map((address) => getBalanceId({ tokenId, address }))
7560
8295
  );
7561
8296
  if (!this.#chainConnectors.substrate) {
7562
8297
  log_default.warn("[balances] no substrate connector or miniMetadata for module", mod.type);
7563
- return (0, import_rxjs15.defer)(
7564
- () => (0, import_rxjs15.of)({
8298
+ return (0, import_rxjs16.defer)(
8299
+ () => (0, import_rxjs16.of)({
7565
8300
  status: "initialising",
7566
8301
  balances: this.getStoredBalances(moduleAddressesByTokenId),
7567
8302
  failedBalanceIds: []
@@ -7569,8 +8304,8 @@ var BalancesProvider = class {
7569
8304
  );
7570
8305
  }
7571
8306
  const moduleBalances$ = this.getNetworkMiniMetadatas$(networkId).pipe(
7572
- (0, import_rxjs15.map)((miniMetadatas) => miniMetadatas.find((m) => m.source === mod.type)),
7573
- (0, import_rxjs15.switchMap)(
8307
+ (0, import_rxjs16.map)((miniMetadatas) => miniMetadatas.find((m) => m.source === mod.type)),
8308
+ (0, import_rxjs16.switchMap)(
7574
8309
  (miniMetadata) => mod.subscribeBalances({
7575
8310
  networkId,
7576
8311
  tokensWithAddresses,
@@ -7578,33 +8313,39 @@ var BalancesProvider = class {
7578
8313
  miniMetadata
7579
8314
  })
7580
8315
  ),
7581
- (0, import_rxjs15.catchError)(() => import_rxjs15.EMPTY),
8316
+ (0, import_rxjs16.catchError)(() => import_rxjs16.EMPTY),
7582
8317
  // don't emit, let provider mark balances stale
7583
- (0, import_rxjs15.tap)((results) => {
8318
+ (0, import_rxjs16.tap)((results) => {
7584
8319
  if (results.dynamicTokens?.length) {
7585
8320
  this.#chaindataProvider.registerDynamicTokens(results.dynamicTokens);
7586
8321
  }
7587
8322
  }),
7588
- (0, import_rxjs15.map)(
8323
+ (0, import_rxjs16.map)(
7589
8324
  (results) => ({
7590
8325
  status: "live",
7591
- // exclude zero balances
7592
- balances: results.success.filter((b) => new Balance(b).total.planck > 0n),
8326
+ // exclude zero balances, but keep balances that only hold a lock
8327
+ // (eg dtao conviction locks, reported on the subnet's base token — including
8328
+ // zero-mass "ghost" locks with residual conviction, which still pin the hotkey
8329
+ // of future lock_stake calls)
8330
+ balances: results.success.filter((b) => {
8331
+ const balance = new Balance(b);
8332
+ return balance.total.planck > 0n || balance.locks.some((lock) => lock.amount.planck > 0n) || !!findDTaoConvictionLock(balance.locks);
8333
+ }),
7593
8334
  failedBalanceIds: results.errors.map(
7594
8335
  ({ tokenId, address }) => getBalanceId({ tokenId, address })
7595
8336
  )
7596
8337
  })
7597
8338
  ),
7598
- (0, import_rxjs15.tap)((results) => {
8339
+ (0, import_rxjs16.tap)((results) => {
7599
8340
  this.updateStorage$(balanceIds, results);
7600
8341
  }),
7601
8342
  // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change
7602
- (0, import_rxjs15.shareReplay)({ refCount: true, bufferSize: 1 }),
7603
- (0, import_util16.keepAlive)(0)
8343
+ (0, import_rxjs16.shareReplay)({ refCount: true, bufferSize: 1 }),
8344
+ (0, import_util17.keepAlive)(0)
7604
8345
  );
7605
- return (0, import_rxjs15.defer)(
8346
+ return (0, import_rxjs16.defer)(
7606
8347
  () => moduleBalances$.pipe(
7607
- (0, import_rxjs15.startWith)({
8348
+ (0, import_rxjs16.startWith)({
7608
8349
  status: "initialising",
7609
8350
  balances: this.getStoredBalances(moduleAddressesByTokenId),
7610
8351
  failedBalanceIds: []
@@ -7615,22 +8356,22 @@ var BalancesProvider = class {
7615
8356
  );
7616
8357
  }
7617
8358
  getEthereumNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
7618
- return (0, import_util16.getSharedObservable)(
8359
+ return (0, import_util17.getSharedObservable)(
7619
8360
  `BalancesProvider.getEthereumNetworkModuleBalances$`,
7620
8361
  { networkId, mod, tokensWithAddresses },
7621
8362
  () => {
7622
8363
  if (!tokensWithAddresses.length)
7623
- return (0, import_rxjs15.of)({ status: "live", balances: [], failedBalanceIds: [] });
7624
- const moduleAddressesByTokenId = (0, import_lodash_es27.fromPairs)(
8364
+ return (0, import_rxjs16.of)({ status: "live", balances: [], failedBalanceIds: [] });
8365
+ const moduleAddressesByTokenId = (0, import_lodash_es30.fromPairs)(
7625
8366
  tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
7626
8367
  );
7627
- const balanceIds = (0, import_lodash_es27.toPairs)(moduleAddressesByTokenId).flatMap(
8368
+ const balanceIds = (0, import_lodash_es30.toPairs)(moduleAddressesByTokenId).flatMap(
7628
8369
  ([tokenId, addresses]) => addresses.map((address) => getBalanceId({ tokenId, address }))
7629
8370
  );
7630
8371
  if (!this.#chainConnectors.evm) {
7631
8372
  log_default.warn("[balances] no ethereum connector for module", mod.type);
7632
- return (0, import_rxjs15.defer)(
7633
- () => (0, import_rxjs15.of)({
8373
+ return (0, import_rxjs16.defer)(
8374
+ () => (0, import_rxjs16.of)({
7634
8375
  status: "initialising",
7635
8376
  balances: this.getStoredBalances(moduleAddressesByTokenId),
7636
8377
  failedBalanceIds: []
@@ -7642,9 +8383,9 @@ var BalancesProvider = class {
7642
8383
  tokensWithAddresses,
7643
8384
  connector: this.#chainConnectors.evm
7644
8385
  }).pipe(
7645
- (0, import_rxjs15.catchError)(() => import_rxjs15.EMPTY),
8386
+ (0, import_rxjs16.catchError)(() => import_rxjs16.EMPTY),
7646
8387
  // don't emit, let provider mark balances stale
7647
- (0, import_rxjs15.map)(
8388
+ (0, import_rxjs16.map)(
7648
8389
  (results) => ({
7649
8390
  status: "live",
7650
8391
  // exclude zero balances
@@ -7654,16 +8395,16 @@ var BalancesProvider = class {
7654
8395
  )
7655
8396
  })
7656
8397
  ),
7657
- (0, import_rxjs15.tap)((results) => {
8398
+ (0, import_rxjs16.tap)((results) => {
7658
8399
  this.updateStorage$(balanceIds, results);
7659
8400
  }),
7660
8401
  // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change
7661
- (0, import_rxjs15.shareReplay)({ refCount: true, bufferSize: 1 }),
7662
- (0, import_util16.keepAlive)(0)
8402
+ (0, import_rxjs16.shareReplay)({ refCount: true, bufferSize: 1 }),
8403
+ (0, import_util17.keepAlive)(0)
7663
8404
  );
7664
- return (0, import_rxjs15.defer)(
8405
+ return (0, import_rxjs16.defer)(
7665
8406
  () => moduleBalances$.pipe(
7666
- (0, import_rxjs15.startWith)({
8407
+ (0, import_rxjs16.startWith)({
7667
8408
  status: "initialising",
7668
8409
  balances: this.getStoredBalances(moduleAddressesByTokenId),
7669
8410
  failedBalanceIds: []
@@ -7674,22 +8415,22 @@ var BalancesProvider = class {
7674
8415
  );
7675
8416
  }
7676
8417
  getSolanaNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
7677
- return (0, import_util16.getSharedObservable)(
8418
+ return (0, import_util17.getSharedObservable)(
7678
8419
  `BalancesProvider.getSolanaNetworkModuleBalances$`,
7679
8420
  { networkId, mod, tokensWithAddresses },
7680
8421
  () => {
7681
8422
  if (!tokensWithAddresses.length)
7682
- return (0, import_rxjs15.of)({ status: "live", balances: [], failedBalanceIds: [] });
7683
- const moduleAddressesByTokenId = (0, import_lodash_es27.fromPairs)(
8423
+ return (0, import_rxjs16.of)({ status: "live", balances: [], failedBalanceIds: [] });
8424
+ const moduleAddressesByTokenId = (0, import_lodash_es30.fromPairs)(
7684
8425
  tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
7685
8426
  );
7686
- const balanceIds = (0, import_lodash_es27.toPairs)(moduleAddressesByTokenId).flatMap(
8427
+ const balanceIds = (0, import_lodash_es30.toPairs)(moduleAddressesByTokenId).flatMap(
7687
8428
  ([tokenId, addresses]) => addresses.map((address) => getBalanceId({ tokenId, address }))
7688
8429
  );
7689
8430
  if (!this.#chainConnectors.solana) {
7690
8431
  log_default.warn("[balances] no solana connector for module", mod.type);
7691
- return (0, import_rxjs15.defer)(
7692
- () => (0, import_rxjs15.of)({
8432
+ return (0, import_rxjs16.defer)(
8433
+ () => (0, import_rxjs16.of)({
7693
8434
  status: "initialising",
7694
8435
  balances: this.getStoredBalances(moduleAddressesByTokenId),
7695
8436
  failedBalanceIds: []
@@ -7701,9 +8442,14 @@ var BalancesProvider = class {
7701
8442
  tokensWithAddresses,
7702
8443
  connector: this.#chainConnectors.solana
7703
8444
  }).pipe(
7704
- (0, import_rxjs15.catchError)(() => import_rxjs15.EMPTY),
8445
+ (0, import_rxjs16.catchError)(() => import_rxjs16.EMPTY),
7705
8446
  // don't emit, let provider mark balances stale
7706
- (0, import_rxjs15.map)(
8447
+ (0, import_rxjs16.tap)((results) => {
8448
+ if (results.dynamicTokens?.length) {
8449
+ this.#chaindataProvider.registerDynamicTokens(results.dynamicTokens);
8450
+ }
8451
+ }),
8452
+ (0, import_rxjs16.map)(
7707
8453
  (results) => ({
7708
8454
  status: "live",
7709
8455
  // exclude zero balances
@@ -7713,16 +8459,16 @@ var BalancesProvider = class {
7713
8459
  )
7714
8460
  })
7715
8461
  ),
7716
- (0, import_rxjs15.tap)((results) => {
8462
+ (0, import_rxjs16.tap)((results) => {
7717
8463
  this.updateStorage$(balanceIds, results);
7718
8464
  }),
7719
8465
  // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change
7720
- (0, import_rxjs15.shareReplay)({ refCount: true, bufferSize: 1 }),
7721
- (0, import_util16.keepAlive)(0)
8466
+ (0, import_rxjs16.shareReplay)({ refCount: true, bufferSize: 1 }),
8467
+ (0, import_util17.keepAlive)(0)
7722
8468
  );
7723
- return (0, import_rxjs15.defer)(
8469
+ return (0, import_rxjs16.defer)(
7724
8470
  () => moduleBalances$.pipe(
7725
- (0, import_rxjs15.startWith)({
8471
+ (0, import_rxjs16.startWith)({
7726
8472
  status: "initialising",
7727
8473
  balances: this.getStoredBalances(moduleAddressesByTokenId),
7728
8474
  failedBalanceIds: []
@@ -7736,14 +8482,14 @@ var BalancesProvider = class {
7736
8482
  if (balancesResult.status !== "live") return;
7737
8483
  const storage = this.#storage.getValue();
7738
8484
  const failedIds = new Set(balancesResult.failedBalanceIds);
7739
- const balances = (0, import_lodash_es27.assign)(
8485
+ const balances = (0, import_lodash_es30.assign)(
7740
8486
  {},
7741
8487
  storage.balances,
7742
8488
  // delete all balances expected in the result set (except the ones that failed). because if they are not present it means they are empty.
7743
- (0, import_lodash_es27.fromPairs)(
8489
+ (0, import_lodash_es30.fromPairs)(
7744
8490
  balanceIds.filter((bid) => !failedIds.has(bid)).map((balanceId) => [balanceId, void 0])
7745
8491
  ),
7746
- (0, import_lodash_es27.keyBy)(
8492
+ (0, import_lodash_es30.keyBy)(
7747
8493
  // storage balances must have status "cache", because they are used as start value when initialising subsequent subscriptions
7748
8494
  balancesResult.balances.map((b) => ({ ...b, status: "cache" })),
7749
8495
  (b) => getBalanceId(b)
@@ -7753,24 +8499,24 @@ var BalancesProvider = class {
7753
8499
  const balance = balances[errorBalanceId];
7754
8500
  if (balance) balance.status = "stale";
7755
8501
  }
7756
- this.#storage.next((0, import_lodash_es27.assign)({}, storage, { balances }));
8502
+ this.#storage.next((0, import_lodash_es30.assign)({}, storage, { balances }));
7757
8503
  }
7758
8504
  getNetworkMiniMetadatas$(networkId) {
7759
- return (0, import_util16.getSharedObservable)(`BalancesProvider.getNetworkMiniMetadatas$`, { networkId }, () => {
8505
+ return (0, import_util17.getSharedObservable)(`BalancesProvider.getNetworkMiniMetadatas$`, { networkId }, () => {
7760
8506
  return this.#chaindataProvider.getNetworkById$(networkId).pipe(
7761
- (0, import_rxjs15.switchMap)(
7762
- (network) => (0, import_chaindata_provider64.isNetworkDot)(network) ? this.getNetworkSpecVersion$(networkId).pipe(
7763
- (0, import_rxjs15.switchMap)(
7764
- (specVersion) => specVersion === null ? (0, import_rxjs15.of)([]) : this.getMiniMetadatas$(networkId, specVersion)
8507
+ (0, import_rxjs16.switchMap)(
8508
+ (network) => (0, import_chaindata_provider71.isNetworkDot)(network) ? this.getNetworkSpecVersion$(networkId).pipe(
8509
+ (0, import_rxjs16.switchMap)(
8510
+ (specVersion) => specVersion === null ? (0, import_rxjs16.of)([]) : this.getMiniMetadatas$(networkId, specVersion)
7765
8511
  )
7766
- ) : (0, import_rxjs15.of)([])
8512
+ ) : (0, import_rxjs16.of)([])
7767
8513
  ),
7768
- (0, import_rxjs15.distinctUntilChanged)(import_lodash_es27.isEqual)
8514
+ (0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
7769
8515
  );
7770
8516
  });
7771
8517
  }
7772
8518
  getNetworkSpecVersion$(networkId) {
7773
- return (0, import_rxjs15.from)(
8519
+ return (0, import_rxjs16.from)(
7774
8520
  (0, import_viem9.withRetry)(() => getSpecVersion(this.#chainConnectors.substrate, networkId), {
7775
8521
  delay: 2e3,
7776
8522
  shouldRetry: (err) => {
@@ -7779,9 +8525,9 @@ var BalancesProvider = class {
7779
8525
  }
7780
8526
  })
7781
8527
  ).pipe(
7782
- (0, import_rxjs15.catchError)(() => {
8528
+ (0, import_rxjs16.catchError)(() => {
7783
8529
  log_default.warn("Failed to fetch spec version for network", networkId);
7784
- return (0, import_rxjs15.of)(null);
8530
+ return (0, import_rxjs16.of)(null);
7785
8531
  })
7786
8532
  );
7787
8533
  }
@@ -7793,15 +8539,15 @@ var BalancesProvider = class {
7793
8539
  source: mod.type
7794
8540
  })
7795
8541
  );
7796
- return (0, import_rxjs15.combineLatest)({
8542
+ return (0, import_rxjs16.combineLatest)({
7797
8543
  defaultMiniMetadatas: this.getDefaultMiniMetadatas$(miniMetadataIds),
7798
8544
  storedMiniMetadatas: this.getStoredMiniMetadatas$(miniMetadataIds)
7799
8545
  }).pipe(
7800
- (0, import_rxjs15.switchMap)(({ storedMiniMetadatas, defaultMiniMetadatas }) => {
7801
- if (defaultMiniMetadatas) return (0, import_rxjs15.of)(defaultMiniMetadatas);
7802
- if (storedMiniMetadatas) return (0, import_rxjs15.of)(storedMiniMetadatas);
7803
- if (!this.#chainConnectors.substrate) return (0, import_rxjs15.of)([]);
7804
- return (0, import_rxjs15.from)(
8546
+ (0, import_rxjs16.switchMap)(({ storedMiniMetadatas, defaultMiniMetadatas }) => {
8547
+ if (defaultMiniMetadatas) return (0, import_rxjs16.of)(defaultMiniMetadatas);
8548
+ if (storedMiniMetadatas) return (0, import_rxjs16.of)(storedMiniMetadatas);
8549
+ if (!this.#chainConnectors.substrate) return (0, import_rxjs16.of)([]);
8550
+ return (0, import_rxjs16.from)(
7805
8551
  (0, import_viem9.withRetry)(
7806
8552
  () => (
7807
8553
  // can fail if metadata cant be fetched
@@ -7821,65 +8567,65 @@ var BalancesProvider = class {
7821
8567
  }
7822
8568
  )
7823
8569
  ).pipe(
7824
- (0, import_rxjs15.catchError)(() => {
8570
+ (0, import_rxjs16.catchError)(() => {
7825
8571
  log_default.warn("Failed to fetch metadata for network", networkId);
7826
- return (0, import_rxjs15.of)([]);
8572
+ return (0, import_rxjs16.of)([]);
7827
8573
  }),
7828
8574
  // and persist in storage for later reuse
7829
- (0, import_rxjs15.tap)((newMiniMetadatas) => {
8575
+ (0, import_rxjs16.tap)((newMiniMetadatas) => {
7830
8576
  if (!newMiniMetadatas.length) return;
7831
8577
  const storage = this.#storage.getValue();
7832
- const miniMetadatas = (0, import_lodash_es27.assign)(
8578
+ const miniMetadatas = (0, import_lodash_es30.assign)(
7833
8579
  // keep minimetadatas of other networks
7834
- (0, import_lodash_es27.keyBy)(
7835
- (0, import_lodash_es27.values)(storage.miniMetadatas).filter((m) => m.chainId !== networkId),
8580
+ (0, import_lodash_es30.keyBy)(
8581
+ (0, import_lodash_es30.values)(storage.miniMetadatas).filter((m) => m.chainId !== networkId),
7836
8582
  (m) => m.id
7837
8583
  ),
7838
8584
  // add the ones for our network
7839
- (0, import_lodash_es27.keyBy)(newMiniMetadatas, (m) => m.id)
8585
+ (0, import_lodash_es30.keyBy)(newMiniMetadatas, (m) => m.id)
7840
8586
  );
7841
- this.#storage.next((0, import_lodash_es27.assign)({}, storage, { miniMetadatas }));
8587
+ this.#storage.next((0, import_lodash_es30.assign)({}, storage, { miniMetadatas }));
7842
8588
  })
7843
8589
  );
7844
8590
  }),
7845
8591
  // emit only when mini metadata changes, as a change here would restart all subscriptions for the network
7846
- (0, import_rxjs15.distinctUntilChanged)(import_lodash_es27.isEqual)
8592
+ (0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
7847
8593
  );
7848
8594
  }
7849
8595
  getStoredMiniMetadatas$(miniMetadataIds) {
7850
8596
  return this.storedMiniMetadataMapById$.pipe(
7851
- (0, import_rxjs15.map)((mapById) => {
8597
+ (0, import_rxjs16.map)((mapById) => {
7852
8598
  const miniMetadatas = miniMetadataIds.map((id) => mapById[id]);
7853
- return miniMetadatas.length && miniMetadatas.every(import_util16.isTruthy) ? miniMetadatas : null;
8599
+ return miniMetadatas.length && miniMetadatas.every(import_util17.isTruthy) ? miniMetadatas : null;
7854
8600
  }),
7855
8601
  // source changes very often
7856
- (0, import_rxjs15.distinctUntilChanged)(import_lodash_es27.isEqual)
8602
+ (0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
7857
8603
  );
7858
8604
  }
7859
8605
  getDefaultMiniMetadatas$(miniMetadataIds) {
7860
8606
  return this.#chaindataProvider.miniMetadatasMapById$.pipe(
7861
- (0, import_rxjs15.map)((mapById) => {
8607
+ (0, import_rxjs16.map)((mapById) => {
7862
8608
  const miniMetadatas = miniMetadataIds.map((id) => mapById[id]);
7863
- return miniMetadatas.length && miniMetadatas.every(import_util16.isTruthy) ? miniMetadatas : null;
8609
+ return miniMetadatas.length && miniMetadatas.every(import_util17.isTruthy) ? miniMetadatas : null;
7864
8610
  })
7865
8611
  );
7866
8612
  }
7867
8613
  getStoredBalances(addressesByToken) {
7868
- const balanceDefs = (0, import_lodash_es27.toPairs)(addressesByToken).flatMap(
8614
+ const balanceDefs = (0, import_lodash_es30.toPairs)(addressesByToken).flatMap(
7869
8615
  ([tokenId, addresses]) => addresses.map((address) => [tokenId, address])
7870
8616
  );
7871
- return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(import_util16.isNotNil).sort(sortByBalanceId);
8617
+ return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(import_util17.isNotNil).sort(sortByBalanceId);
7872
8618
  }
7873
8619
  cleanupAddressesByTokenId$(addressesByTokenId) {
7874
8620
  return this.#chaindataProvider.getNetworksMapById$().pipe(
7875
- (0, import_rxjs15.map)((networksById) => {
7876
- return (0, import_lodash_es27.fromPairs)(
7877
- (0, import_lodash_es27.toPairs)(addressesByTokenId).map(([tokenId, addresses]) => {
7878
- const networkId = (0, import_chaindata_provider64.parseTokenId)(tokenId).networkId;
8621
+ (0, import_rxjs16.map)((networksById) => {
8622
+ return (0, import_lodash_es30.fromPairs)(
8623
+ (0, import_lodash_es30.toPairs)(addressesByTokenId).map(([tokenId, addresses]) => {
8624
+ const networkId = (0, import_chaindata_provider71.parseTokenId)(tokenId).networkId;
7879
8625
  const network = networksById[networkId];
7880
8626
  return [
7881
8627
  tokenId,
7882
- (0, import_lodash_es27.uniq)(addresses.map(import_crypto8.normalizeAddress)).filter(
8628
+ (0, import_lodash_es30.uniq)(addresses.map(import_crypto8.normalizeAddress)).filter(
7883
8629
  (address) => network && isAddressCompatibleWithNetwork(network, address)
7884
8630
  )
7885
8631
  ];
@@ -7918,7 +8664,7 @@ var sortByBalanceId = (a, b) => getBalanceId(a).localeCompare(getBalanceId(b));
7918
8664
  var sortByMiniMetadataId = (a, b) => a.id.localeCompare(b.id);
7919
8665
 
7920
8666
  // src/version.ts
7921
- var import_chaindata_provider65 = require("@talismn/chaindata-provider");
8667
+ var import_chaindata_provider72 = require("@talismn/chaindata-provider");
7922
8668
  // Annotate the CommonJS export names for ESM import in node:
7923
8669
  0 && (module.exports = {
7924
8670
  ALPHA_PRICE_SCALE,
@@ -7942,6 +8688,8 @@ var import_chaindata_provider65 = require("@talismn/chaindata-provider");
7942
8688
  SolNativeTokenConfigSchema,
7943
8689
  SolSplBalanceModule,
7944
8690
  SolSplTokenConfigSchema,
8691
+ SolToken2022BalanceModule,
8692
+ SolToken2022TokenConfigSchema,
7945
8693
  SubAssetsBalanceModule,
7946
8694
  SubAssetsTokenConfigSchema,
7947
8695
  SubDTaoBalanceModule,
@@ -7970,7 +8718,9 @@ var import_chaindata_provider65 = require("@talismn/chaindata-provider");
7970
8718
  excludeFromTransferableAmount,
7971
8719
  filterBaseLocks,
7972
8720
  filterMirrorTokens,
8721
+ findDTaoConvictionLock,
7973
8722
  getBalanceId,
8723
+ getConvictionLockLabel,
7974
8724
  getDTaoTokenRates,
7975
8725
  getLockTitle,
7976
8726
  getLockedType,
@@ -7978,6 +8728,7 @@ var import_chaindata_provider65 = require("@talismn/chaindata-provider");
7978
8728
  getValueId,
7979
8729
  includeInTotalExtraAmount,
7980
8730
  taoToAlpha,
8731
+ taoToAlphaCeil,
7981
8732
  uniswapV2PairAbi
7982
8733
  });
7983
8734
  //# sourceMappingURL=index.js.map