@talismn/balances 3.0.5 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import BigNumber from "bignumber.js";
2
2
  import { EvmErc20TokenSchema, EvmNativeTokenSchema, EvmUniswapV2TokenSchema, MINIMETADATA_VERSION, MINIMETADATA_VERSION as MINIMETADATA_VERSION$1, SolNativeTokenSchema, SolSplTokenSchema, SolToken2022TokenSchema, SubAssetsTokenSchema, SubDTaoTokenSchema, SubForeignAssetsTokenSchema, SubHydrationTokenSchema, SubNativeTokenSchema, SubPsp22TokenSchema, SubTokensTokenSchema, TokenBaseSchema, TokenSchema, evmErc20TokenId, evmNativeTokenId, evmUniswapV2TokenId, getCleanToken, isAccountPlatformCompatibleWithNetwork, isNetworkDot, isTokenOfType, parseEvmErc20TokenId, parseSolSplTokenId, parseSolToken2022TokenId, parseSubDTaoTokenId, parseTokenId, solNativeTokenId, solSplTokenId, solToken2022TokenId, subAssetTokenId, subDTaoTokenId, subForeignAssetTokenId, subHydrationTokenId, subNativeTokenId, subPsp22TokenId, subTokensTokenId } from "@talismn/chaindata-provider";
3
- import { getAccountPlatformFromAddress, isAddressEqual, isEthereumAddress, isOnCurveSolanaAddress, isSolanaAddress, normalizeAddress } from "@talismn/crypto";
3
+ import { frontierH160ToSs58Mirror, frontierSs58ToTruncatedH160, getAccountPlatformFromAddress, isAddressEqual, isEthereumAddress, isOnCurveSolanaAddress, isSolanaAddress, normalizeAddress } from "@talismn/crypto";
4
4
  import { BigMath, LruMap, createTimeSlicer, forEachWithYield, getErrorMessage, getSharedObservable, isAbortError, isArrayOf, isBigInt, isErrorOfName, isNotNil, isTruthy, keepAlive, mapWithYield, planckToTokens, reportJsActivity, switchMapChunked, yieldToEventLoop } from "@talismn/util";
5
5
  import { assign, fromPairs, isEqual, keyBy, keys, mergeWith, omit, toPairs, uniq, values } from "lodash-es";
6
6
  import { BehaviorSubject, EMPTY, Observable, ReplaySubject, auditTime, catchError, combineLatest, defer, distinctUntilChanged, filter, firstValueFrom, from, map, of, shareReplay, startWith, switchMap, tap, timer } from "rxjs";
@@ -18,9 +18,9 @@ import { publicKey, sol } from "@metaplex-foundation/umi";
18
18
  import { TOKEN_2022_PROGRAM_ADDRESS, fetchMint, getMintDecoder as getMintDecoder$1, getTransferCheckedInstruction, getTransferCheckedWithFeeInstruction } from "@solana-program/token-2022";
19
19
  import { AccountId, Binary, Enum, getSs58AddressInfo } from "@polkadot-api/substrate-bindings";
20
20
  import { fromHex, mergeUint8, toHex as toHex$1 } from "@polkadot-api/utils";
21
+ import { fetchBestMetadata, fetchStorageKeysPaged } from "@talismn/sapi";
21
22
  import upperFirst from "lodash-es/upperFirst";
22
23
  import { Bytes, Enum as Enum$1, Result, Struct, compact, enhanceCodec, u128, u32 } from "scale-ts";
23
- import { fetchBestMetadata } from "@talismn/sapi";
24
24
  //#region src/configureBigNumber.ts
25
25
  BigNumber.set({ STRICT: false });
26
26
  var configureBigNumber_default = BigNumber;
@@ -415,7 +415,7 @@ var Balance = class {
415
415
  }
416
416
  /** The frozen balance of this token. Is included in the free amount. */
417
417
  get locked() {
418
- if (this.#cachedLocked === void 0) this.#cachedLocked = this.#format(this.locks.map(({ amount }) => amount.planck).reduce((a, b) => BigMath.max(a, b), 0n));
418
+ if (this.#cachedLocked === void 0) this.#cachedLocked = this.#format(excludeFromTransferableAmount(this.locks));
419
419
  return this.#cachedLocked;
420
420
  }
421
421
  get locks() {
@@ -484,7 +484,8 @@ var Balance = class {
484
484
  const newCalculation = () => BigMath.max(this.locked.planck, this.reserved.planck);
485
485
  const baseUnavailable = this.#storage.useLegacyTransferableCalculation ? oldCalculation() : newCalculation();
486
486
  const nomPoolStakedPlancks = this.locks.some((lock) => lock.source === "substrate-native-holds" && lock.label === "DelegatedStaking") ? 0n : this.nompools.map(({ amount }) => amount.planck).reduce((a, b) => a + b, 0n);
487
- return this.#format(baseUnavailable + nomPoolStakedPlancks);
487
+ const extra = this.getValue("extra");
488
+ return this.#format(baseUnavailable + nomPoolStakedPlancks + includeInTotalExtraAmount(extra));
488
489
  };
489
490
  /** The feePayable balance of this token. Is generally the free amount - the feeFrozen amount. */
490
491
  get feePayable() {
@@ -2562,15 +2563,16 @@ const hasRuntimeApi = (metadata, apiName, method) => {
2562
2563
  if (!api?.methods) return false;
2563
2564
  return api.methods.some((m) => m.name === method);
2564
2565
  };
2565
- const getConstantValue = (metadataRpc, pallet, constant) => {
2566
- const { unifiedMetadata, builder } = parseMetadataRpc(metadataRpc);
2566
+ const toParsedMetadata = (metadata) => typeof metadata === "string" ? parseMetadataRpc(metadata) : metadata;
2567
+ const getConstantValue = (metadata, pallet, constant) => {
2568
+ const { unifiedMetadata, builder } = toParsedMetadata(metadata);
2567
2569
  const codec = builder.buildConstant(pallet, constant);
2568
2570
  const encodedValue = unifiedMetadata.pallets.find(({ name }) => name === pallet)?.constants.find(({ name }) => name === constant)?.value;
2569
2571
  if (!encodedValue) throw new Error(`Constant ${pallet}.${constant} not found`);
2570
2572
  return codec.dec(encodedValue);
2571
2573
  };
2572
- const tryGetConstantValue = (metadataRpc, pallet, constant) => {
2573
- const { unifiedMetadata, builder } = parseMetadataRpc(metadataRpc);
2574
+ const tryGetConstantValue = (metadata, pallet, constant) => {
2575
+ const { unifiedMetadata, builder } = toParsedMetadata(metadata);
2574
2576
  const encodedValue = unifiedMetadata.pallets.find(({ name }) => name === pallet)?.constants.find(({ name }) => name === constant)?.value;
2575
2577
  if (!encodedValue) return null;
2576
2578
  return builder.buildConstant(pallet, constant).dec(encodedValue);
@@ -3620,14 +3622,15 @@ const deriveMiniMetadataId = ({ source, chainId, specVersion }) => toHex(Twox128
3620
3622
  const getMiniMetadata$6 = ({ networkId, specVersion, metadataRpc }) => {
3621
3623
  const source = MODULE_TYPE$6;
3622
3624
  const chainId = networkId;
3623
- const systemVersion = getConstantValue(metadataRpc, "System", "Version");
3625
+ const parsed = parseMetadataRpc(metadataRpc);
3626
+ const { unifiedMetadata } = parsed;
3627
+ const systemVersion = getConstantValue(parsed, "System", "Version");
3624
3628
  if (specVersion !== systemVersion.spec_version) throw new Error(`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`);
3625
3629
  const id = deriveMiniMetadataId({
3626
3630
  source,
3627
3631
  chainId,
3628
3632
  specVersion
3629
3633
  });
3630
- const { unifiedMetadata } = parseMetadataRpc(metadataRpc);
3631
3634
  if (unifiedMetadata.version < 14) throw new Error(`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`);
3632
3635
  return {
3633
3636
  id,
@@ -3635,12 +3638,11 @@ const getMiniMetadata$6 = ({ networkId, specVersion, metadataRpc }) => {
3635
3638
  chainId,
3636
3639
  specVersion,
3637
3640
  version: MINIMETADATA_VERSION$1,
3638
- data: getData$4(metadataRpc),
3641
+ data: getData$4(parsed),
3639
3642
  extra: null
3640
3643
  };
3641
3644
  };
3642
- const getData$4 = (metadataRpc) => {
3643
- const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc);
3645
+ const getData$4 = ({ metadata, unifiedMetadata }) => {
3644
3646
  if (!hasStorageItems(unifiedMetadata, "Assets", [
3645
3647
  "Account",
3646
3648
  "Asset",
@@ -3818,27 +3820,6 @@ const fetchBasketClaims = async (connector, networkId, metadataRpc, addresses, a
3818
3820
  }
3819
3821
  };
3820
3822
  //#endregion
3821
- //#region src/modules/substrate-dtao/fetchStorageKeysPaged.ts
3822
- const PAGE_SIZE = 1e3;
3823
- /**
3824
- * Prefix scan via state_getKeysPaged. The unpaged state_getKeys is classified as heavy storage
3825
- * work and rejected by some public nodes (eg the bittensor testnet one: "Storage work rate limit
3826
- * exceeded"), while the paged variant is universally allowed.
3827
- */
3828
- const fetchStorageKeysPaged = async (connector, networkId, keyPrefix, at) => {
3829
- const keys = [];
3830
- let startKey;
3831
- do {
3832
- const params = [keyPrefix, PAGE_SIZE];
3833
- if (startKey || at) params.push(startKey ?? null);
3834
- if (at) params.push(at);
3835
- const page = await connector.send(networkId, "state_getKeysPaged", params);
3836
- keys.push(...page);
3837
- startKey = page.length === PAGE_SIZE ? page[page.length - 1] : void 0;
3838
- } while (startKey);
3839
- return keys;
3840
- };
3841
- //#endregion
3842
3823
  //#region src/modules/substrate-dtao/convictionLocks.ts
3843
3824
  const convictionLockKey = (address, netuid) => `${address}:${netuid}`;
3844
3825
  const getConvictionLockLabel = (lockType) => lockType === "perpetual" ? "Perpetual Conviction Lock" : "Decaying Conviction Lock";
@@ -3935,7 +3916,7 @@ const fetchConvictionLockStorageKeys = async (connector, networkId, addresses, s
3935
3916
  }
3936
3917
  let stateKeys;
3937
3918
  try {
3938
- stateKeys = await fetchStorageKeysPaged(connector, networkId, keyPrefix, at);
3919
+ stateKeys = await fetchStorageKeysPaged((method, params) => connector.send(networkId, method, params), keyPrefix, { at });
3939
3920
  } catch (cause) {
3940
3921
  log_default.warn(`Failed to fetch conviction Lock keys (address=${address}) on ${networkId}`, { cause });
3941
3922
  throw cause;
@@ -4359,7 +4340,7 @@ const fetchTokens$5 = async ({ networkId, connector, tokens, miniMetadata }) =>
4359
4340
  const fetchTransferableTokensMap = async (connector, metadata, networkId) => {
4360
4341
  const { builder } = parseMetadataRpcCached(metadata);
4361
4342
  const transferToggleCodec = builder.buildStorage("SubtensorModule", "TransferToggle");
4362
- const transferToggleKeys = await fetchStorageKeysPaged(connector, networkId, getStorageKeyPrefix("SubtensorModule", "TransferToggle"));
4343
+ const transferToggleKeys = await fetchStorageKeysPaged((method, params) => connector.send(networkId, method, params), getStorageKeyPrefix("SubtensorModule", "TransferToggle"));
4363
4344
  const transferToggleResults = await connector.send(networkId, "state_queryStorageAt", [transferToggleKeys]);
4364
4345
  const transferToggleEntries = transferToggleResults.length ? transferToggleResults[0].changes : [];
4365
4346
  return fromPairs(transferToggleEntries.map(([key, value]) => {
@@ -4807,14 +4788,15 @@ const fetchTokens$4 = async ({ networkId, tokens, connector, miniMetadata }) =>
4807
4788
  const getMiniMetadata$4 = ({ networkId, specVersion, metadataRpc }) => {
4808
4789
  const source = MODULE_TYPE$4;
4809
4790
  const chainId = networkId;
4810
- const systemVersion = getConstantValue(metadataRpc, "System", "Version");
4791
+ const parsed = parseMetadataRpc(metadataRpc);
4792
+ const { unifiedMetadata } = parsed;
4793
+ const systemVersion = getConstantValue(parsed, "System", "Version");
4811
4794
  if (specVersion !== systemVersion.spec_version) throw new Error(`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`);
4812
4795
  const id = deriveMiniMetadataId({
4813
4796
  source,
4814
4797
  chainId,
4815
4798
  specVersion
4816
4799
  });
4817
- const { unifiedMetadata } = parseMetadataRpc(metadataRpc);
4818
4800
  if (unifiedMetadata.version < 14) throw new Error(`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`);
4819
4801
  return {
4820
4802
  id,
@@ -4822,12 +4804,11 @@ const getMiniMetadata$4 = ({ networkId, specVersion, metadataRpc }) => {
4822
4804
  chainId,
4823
4805
  specVersion,
4824
4806
  version: MINIMETADATA_VERSION$1,
4825
- data: getData$2(metadataRpc),
4807
+ data: getData$2(parsed),
4826
4808
  extra: null
4827
4809
  };
4828
4810
  };
4829
- const getData$2 = (metadataRpc) => {
4830
- const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc);
4811
+ const getData$2 = ({ metadata, unifiedMetadata }) => {
4831
4812
  if (!hasStorageItems(unifiedMetadata, "ForeignAssets", [
4832
4813
  "Account",
4833
4814
  "Asset",
@@ -5144,6 +5125,17 @@ const SubHydrationTokenConfigSchema = z.strictObject({
5144
5125
  ...TokenConfigBaseSchema.shape
5145
5126
  });
5146
5127
  //#endregion
5128
+ //#region src/modules/substrate-native/evmMirror.ts
5129
+ const EVM_MIRROR_LOCK_LABEL = "evm-mirror";
5130
+ const isEvmMirrorWithdrawableLock = (lock) => lock.meta?.type === "evm-mirror-withdrawable";
5131
+ const findEvmMirrorWithdrawable = (locks) => {
5132
+ const lock = locks?.find(isEvmMirrorWithdrawableLock);
5133
+ return lock ? {
5134
+ ...lock.meta,
5135
+ amount: lock.amount.planck
5136
+ } : null;
5137
+ };
5138
+ //#endregion
5147
5139
  //#region src/modules/substrate-native/config.ts
5148
5140
  const MODULE_TYPE$2 = SubNativeTokenSchema.shape.type.value;
5149
5141
  const PLATFORM$2 = SubNativeTokenSchema.shape.platform.value;
@@ -5189,7 +5181,7 @@ const baseLockLabels = ["fees", "misc"];
5189
5181
  const isBaseLock = (lock) => baseLockLabels.includes(lock.label);
5190
5182
  const isNonBaseLock = (lock) => !isBaseLock(lock);
5191
5183
  const filterBaseLocks = (locks) => {
5192
- if (!locks.some(isNonBaseLock)) return locks;
5184
+ if (!locks.some((lock) => isNonBaseLock(lock) && !lock.includeInTransferable)) return locks;
5193
5185
  return locks.filter(isNonBaseLock);
5194
5186
  };
5195
5187
  const getLockTitle = (lock, { balance } = {}) => {
@@ -5200,6 +5192,7 @@ const getLockTitle = (lock, { balance } = {}) => {
5200
5192
  if (lock.label === "nompools-unbonding") return "Pooled Staking";
5201
5193
  if (lock.label === "subtensor-staking") return "Root Staking";
5202
5194
  if (lock.label === "dapp-staking") return "DApp Staking";
5195
+ if (lock.label === "evm-mirror") return "EVM Balance";
5203
5196
  if (lock.label === "fees") return "Locked (Fees)";
5204
5197
  if (lock.label === "misc") return "Locked";
5205
5198
  if (lock.label.startsWith("other")) return "Locked";
@@ -5207,7 +5200,7 @@ const getLockTitle = (lock, { balance } = {}) => {
5207
5200
  };
5208
5201
  //#endregion
5209
5202
  //#region src/modules/substrate-native/queries/buildBaseQueries.ts
5210
- const buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
5203
+ const buildBaseQueries = (networkId, balanceDefs, miniMetadata, hasFrontierMirrorWithdraw = false) => {
5211
5204
  const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
5212
5205
  account: ["System", "Account"],
5213
5206
  stakingLedger: ["Staking", "Ledger"],
@@ -5219,6 +5212,7 @@ const buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
5219
5212
  });
5220
5213
  if (!networkStorageCoders) throw new Error(`No network storage coders found for networkId: ${networkId}`);
5221
5214
  return balanceDefs.map(({ token, address }) => {
5215
+ const evmMirror = hasFrontierMirrorWithdraw ? getEvmMirror(address) : null;
5222
5216
  const getStateKeys = () => {
5223
5217
  try {
5224
5218
  return [
@@ -5227,7 +5221,8 @@ const buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
5227
5221
  networkStorageCoders.freezes ? networkStorageCoders.freezes.keys.enc(address) : null,
5228
5222
  networkStorageCoders.holds ? networkStorageCoders.holds.keys.enc(address) : null,
5229
5223
  networkStorageCoders.stakingLedger ? networkStorageCoders.stakingLedger.keys.enc(address) : null,
5230
- networkStorageCoders.poolMembers ? networkStorageCoders.poolMembers.keys.enc(address) : null
5224
+ networkStorageCoders.poolMembers ? networkStorageCoders.poolMembers.keys.enc(address) : null,
5225
+ networkStorageCoders.account && evmMirror ? networkStorageCoders.account.keys.enc(frontierH160ToSs58Mirror(evmMirror.h160)) : null
5231
5226
  ];
5232
5227
  } catch {
5233
5228
  return [];
@@ -5246,7 +5241,7 @@ const buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
5246
5241
  useLegacyTransferableCalculation: miniMetadata.extra.useLegacyTransferableCalculation
5247
5242
  };
5248
5243
  let nomPoolMemberInfo = null;
5249
- const [accountChange, lockChange, freezesChange, holdsChange, stakingLedgerChange, nomPoolMemberChange] = changes;
5244
+ const [accountChange, lockChange, freezesChange, holdsChange, stakingLedgerChange, nomPoolMemberChange, evmMirrorAccountChange] = changes;
5250
5245
  if (networkStorageCoders.account) {
5251
5246
  const baseValues = decodeBaseResult(networkStorageCoders.account, accountChange, networkId);
5252
5247
  balance.values.push(...baseValues);
@@ -5271,6 +5266,10 @@ const buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
5271
5266
  const nomPoolMemberValue = decodePoolMemberResult(networkStorageCoders.poolMembers, nomPoolMemberChange, networkId);
5272
5267
  if (nomPoolMemberValue) nomPoolMemberInfo = nomPoolMemberValue;
5273
5268
  }
5269
+ if (networkStorageCoders.account && evmMirror && evmMirrorAccountChange) {
5270
+ const evmMirrorValues = decodeEvmMirrorResult(networkStorageCoders.account, evmMirrorAccountChange, evmMirror, networkId);
5271
+ balance.values.push(...evmMirrorValues);
5272
+ }
5274
5273
  return {
5275
5274
  balance,
5276
5275
  nomPoolMemberInfo
@@ -5308,6 +5307,35 @@ const decodeBaseResult = (coder, value, networkId) => {
5308
5307
  }
5309
5308
  ];
5310
5309
  };
5310
+ const getEvmMirror = (address) => {
5311
+ try {
5312
+ return {
5313
+ type: "evm-mirror-withdrawable",
5314
+ h160: frontierSs58ToTruncatedH160(address)
5315
+ };
5316
+ } catch {
5317
+ return null;
5318
+ }
5319
+ };
5320
+ const decodeEvmMirrorResult = (coder, value, meta, networkId) => {
5321
+ const free = decodeScale(coder, value, `Failed to decode EVM mirror balance on chain ${networkId}`)?.data?.free ?? 0n;
5322
+ if (free <= 0n) return [];
5323
+ const withdrawable = {
5324
+ source: "substrate-native-evm-mirror",
5325
+ label: EVM_MIRROR_LOCK_LABEL,
5326
+ amount: free.toString(),
5327
+ meta
5328
+ };
5329
+ return [{
5330
+ ...withdrawable,
5331
+ type: "locked",
5332
+ includeInTransferable: true
5333
+ }, {
5334
+ ...withdrawable,
5335
+ type: "extra",
5336
+ includeInTotal: true
5337
+ }];
5338
+ };
5311
5339
  const decodeLocksResult = (coder, value, networkId) => {
5312
5340
  return decodeScale(coder, value, `Failed to decode lock on chain ${networkId}`)?.map?.((lock) => {
5313
5341
  const id = lock?.id ? Binary.toText(Binary.fromHex(lock.id)) : void 0;
@@ -5475,7 +5503,7 @@ const getNomPoolStateKeys = (coders, nomPoolMemberInfo, extra) => {
5475
5503
  };
5476
5504
  //#endregion
5477
5505
  //#region src/modules/substrate-native/fetchBalances.ts
5478
- const fetchBalances$2 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
5506
+ const fetchBalances$2 = async ({ networkId, tokensWithAddresses, connector, miniMetadata, hasFrontierMirrorWithdraw }) => {
5479
5507
  if (!tokensWithAddresses.length) return {
5480
5508
  success: [],
5481
5509
  errors: []
@@ -5514,7 +5542,7 @@ const fetchBalances$2 = async ({ networkId, tokensWithAddresses, connector, mini
5514
5542
  }))
5515
5543
  };
5516
5544
  }
5517
- const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata);
5545
+ const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata, hasFrontierMirrorWithdraw);
5518
5546
  const partialBalances = await fetchRpcQueryPack(connector, networkId, baseQueries);
5519
5547
  const nomPoolQueries = buildNomPoolQueries(networkId, partialBalances, miniMetadata);
5520
5548
  return {
@@ -5566,14 +5594,15 @@ const getChainProperties = async (connector, networkId) => {
5566
5594
  const getMiniMetadata$2 = ({ networkId, specVersion, metadataRpc, config }) => {
5567
5595
  const source = MODULE_TYPE$2;
5568
5596
  const chainId = networkId;
5569
- const systemVersion = getConstantValue(metadataRpc, "System", "Version");
5597
+ const parsed = parseMetadataRpc(metadataRpc);
5598
+ const { metadata, unifiedMetadata } = parsed;
5599
+ const systemVersion = getConstantValue(parsed, "System", "Version");
5570
5600
  if (specVersion !== systemVersion.spec_version) throw new Error(`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`);
5571
5601
  const id = deriveMiniMetadataId({
5572
5602
  source,
5573
5603
  chainId,
5574
5604
  specVersion
5575
5605
  });
5576
- const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc);
5577
5606
  if (unifiedMetadata.version < 14) throw new Error(`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`);
5578
5607
  if (config?.disable) return {
5579
5608
  id,
@@ -5584,8 +5613,8 @@ const getMiniMetadata$2 = ({ networkId, specVersion, metadataRpc, config }) => {
5584
5613
  data: null,
5585
5614
  extra: { disable: true }
5586
5615
  };
5587
- const existentialDeposit = tryGetConstantValue(metadataRpc, "Balances", "ExistentialDeposit")?.toString();
5588
- const nominationPoolsPalletIdHex = tryGetConstantValue(metadataRpc, "NominationPools", "PalletId");
5616
+ const existentialDeposit = tryGetConstantValue(parsed, "Balances", "ExistentialDeposit")?.toString();
5617
+ const nominationPoolsPalletIdHex = tryGetConstantValue(parsed, "NominationPools", "PalletId");
5589
5618
  const nominationPoolsPalletId = nominationPoolsPalletIdHex ? Binary.toText(Binary.fromHex(nominationPoolsPalletIdHex)) : void 0;
5590
5619
  const useLegacyTransferableCalculation = !Boolean(unifiedMetadata.pallets.find(({ name }) => name === "Balances")?.storage?.items.find(({ name }) => name === "Freezes"));
5591
5620
  compactMetadata(metadata, [
@@ -5696,7 +5725,7 @@ const getTransferAllEncodedArgs = (to, codec) => {
5696
5725
  };
5697
5726
  //#endregion
5698
5727
  //#region src/modules/substrate-native/subscribeBalances.ts
5699
- const subscribeBalances$2 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
5728
+ const subscribeBalances$2 = ({ networkId, tokensWithAddresses, connector, miniMetadata, hasFrontierMirrorWithdraw }) => {
5700
5729
  if (!tokensWithAddresses.length) return of({
5701
5730
  success: [],
5702
5731
  errors: []
@@ -5704,7 +5733,7 @@ const subscribeBalances$2 = ({ networkId, tokensWithAddresses, connector, miniMe
5704
5733
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
5705
5734
  return defer(async () => {
5706
5735
  await yieldToEventLoop();
5707
- return buildBaseQueries(networkId, balanceDefs, miniMetadata);
5736
+ return buildBaseQueries(networkId, balanceDefs, miniMetadata, hasFrontierMirrorWithdraw);
5708
5737
  }).pipe(switchMap((baseQueries) => getRpcQueryPack$(connector, networkId, baseQueries)), switchMap((partialBalances) => {
5709
5738
  const nomPoolQueries = buildNomPoolQueries(networkId, partialBalances, miniMetadata);
5710
5739
  return getRpcQueryPack$(connector, networkId, nomPoolQueries);
@@ -6831,7 +6860,7 @@ var BalancesProvider = class {
6831
6860
  switch (mod.platform) {
6832
6861
  case "ethereum": return this.getEthereumNetworkModuleBalances$(networkId, tokensWithAddresses, mod);
6833
6862
  case "solana": return this.getSolanaNetworkModuleBalances$(networkId, tokensWithAddresses, mod);
6834
- case "polkadot": return this.getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod);
6863
+ case "polkadot": return this.getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod, isNetworkDot(network) && !!network.hasFrontierMirrorWithdraw);
6835
6864
  default:
6836
6865
  log_default.warn("[balances] Unsupported network platform for module", {
6837
6866
  networkId,
@@ -6856,11 +6885,12 @@ var BalancesProvider = class {
6856
6885
  };
6857
6886
  }, { label: `network balances ${networkId}` }), distinctUntilChanged(isEqualBalancesResult));
6858
6887
  }
6859
- getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
6888
+ getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod, hasFrontierMirrorWithdraw) {
6860
6889
  return getSharedObservable(`BalancesProvider.getPolkadotNetworkModuleBalances$`, {
6861
6890
  networkId,
6862
6891
  mod,
6863
- tokensWithAddresses
6892
+ tokensWithAddresses,
6893
+ hasFrontierMirrorWithdraw
6864
6894
  }, () => {
6865
6895
  if (!tokensWithAddresses.length) return of({
6866
6896
  status: "live",
@@ -6884,7 +6914,8 @@ var BalancesProvider = class {
6884
6914
  networkId,
6885
6915
  tokensWithAddresses,
6886
6916
  connector: this.#chainConnectors.substrate,
6887
- miniMetadata
6917
+ miniMetadata,
6918
+ hasFrontierMirrorWithdraw
6888
6919
  })), stabilizeModuleResults(mod.type === "substrate-dtao" ? void 0 : classifySmallAmountDrift(GENERIC_DRIFT_TOLERANCE_BPS)), catchError(() => EMPTY), tap((results) => {
6889
6920
  reportJsActivity(`module ${mod.type} ${networkId} (${results.success.length})`);
6890
6921
  if (results.dynamicTokens?.length) this.#chaindataProvider.registerDynamicTokens(results.dynamicTokens);
@@ -7232,6 +7263,6 @@ const mergeSortedBalanceArrays = async (arrays, slicer) => {
7232
7263
  };
7233
7264
  const sortByMiniMetadataId = (a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
7234
7265
  //#endregion
7235
- export { ALPHA_PRICE_SCALE, BALANCE_MODULES, Balance, BalanceFormatter, BalanceValueGetter, Balances, BalancesProvider, Change24hCurrencyFormatter, EvmErc20BalanceModule, EvmErc20TokenConfigSchema, EvmNativeBalanceModule, EvmNativeTokenConfigSchema, EvmUniswapV2BalanceModule, EvmUniswapV2TokenConfigSchema, FiatSumBalancesFormatter, MINIMETADATA_VERSION, PlanckSumBalancesFormatter, SolNativeBalanceModule, SolNativeTokenConfigSchema, SolSplBalanceModule, SolSplTokenConfigSchema, SolToken2022BalanceModule, SolToken2022TokenConfigSchema, SubAssetsBalanceModule, SubAssetsTokenConfigSchema, SubDTaoBalanceModule, SubDTaoTokenConfigSchema, SubForeignAssetsBalanceModule, SubForeignAssetsTokenConfigSchema, SubHydrationBalanceModule, SubHydrationTokenConfigSchema, SubNativeBalanceModule, SubNativeMiniMetadataExtraSchema, SubNativeModuleConfigSchema, SubNativeTokenConfigSchema, SubPsp22BalanceModule, SubPsp22TokenConfigSchema, SubTokensBalanceModule, SubTokensMiniMetadataExtraSchema, SubTokensModuleConfigSchema, SubTokensTokenConfigSchema, SumBalancesFormatter, TAO_DECIMALS, abiMulticall, alphaToTao, calculateToken2022TransferFee, deriveMiniMetadataId, erc20BalancesAggregatorAbi, excludeFromFeePayableLocks, excludeFromTransferableAmount, filterBaseLocks, filterMirrorTokens, findDTaoClaimablePlancks, findDTaoConvictionLock, findDTaoRootStakeHold, getBalanceFingerprint, getBalanceId, getBalanceStorageFingerprint, getConvictionLockLabel, getDTaoClaimablePlancks, getEpochTransferFee, getExtension, getLockTitle, getLockedType, getMintExtensions, getRawLocks, getRawTotalPlanck, getSweepStaleVariant, getTokenMetadata, getTransferFeeConfig, getTransferHook, getValueId, includeInTotalExtraAmount, isDTaoClaimableLock, isEqualBalanceArrays, isEqualBalancesResult, isEqualMiniMetadatas, isEqualModuleResults, isNonTransferable, taoToAlpha, taoToAlphaCeil, uniswapV2PairAbi };
7266
+ export { ALPHA_PRICE_SCALE, BALANCE_MODULES, Balance, BalanceFormatter, BalanceValueGetter, Balances, BalancesProvider, Change24hCurrencyFormatter, EVM_MIRROR_LOCK_LABEL, EvmErc20BalanceModule, EvmErc20TokenConfigSchema, EvmNativeBalanceModule, EvmNativeTokenConfigSchema, EvmUniswapV2BalanceModule, EvmUniswapV2TokenConfigSchema, FiatSumBalancesFormatter, MINIMETADATA_VERSION, PlanckSumBalancesFormatter, SolNativeBalanceModule, SolNativeTokenConfigSchema, SolSplBalanceModule, SolSplTokenConfigSchema, SolToken2022BalanceModule, SolToken2022TokenConfigSchema, SubAssetsBalanceModule, SubAssetsTokenConfigSchema, SubDTaoBalanceModule, SubDTaoTokenConfigSchema, SubForeignAssetsBalanceModule, SubForeignAssetsTokenConfigSchema, SubHydrationBalanceModule, SubHydrationTokenConfigSchema, SubNativeBalanceModule, SubNativeMiniMetadataExtraSchema, SubNativeModuleConfigSchema, SubNativeTokenConfigSchema, SubPsp22BalanceModule, SubPsp22TokenConfigSchema, SubTokensBalanceModule, SubTokensMiniMetadataExtraSchema, SubTokensModuleConfigSchema, SubTokensTokenConfigSchema, SumBalancesFormatter, TAO_DECIMALS, abiMulticall, alphaToTao, calculateToken2022TransferFee, deriveMiniMetadataId, erc20BalancesAggregatorAbi, excludeFromFeePayableLocks, excludeFromTransferableAmount, filterBaseLocks, filterMirrorTokens, findDTaoClaimablePlancks, findDTaoConvictionLock, findDTaoRootStakeHold, findEvmMirrorWithdrawable, getBalanceFingerprint, getBalanceId, getBalanceStorageFingerprint, getConvictionLockLabel, getDTaoClaimablePlancks, getEpochTransferFee, getExtension, getLockTitle, getLockedType, getMintExtensions, getRawLocks, getRawTotalPlanck, getSweepStaleVariant, getTokenMetadata, getTransferFeeConfig, getTransferHook, getValueId, includeInTotalExtraAmount, isDTaoClaimableLock, isEqualBalanceArrays, isEqualBalancesResult, isEqualMiniMetadatas, isEqualModuleResults, isEvmMirrorWithdrawableLock, isNonTransferable, taoToAlpha, taoToAlphaCeil, uniswapV2PairAbi };
7236
7267
 
7237
7268
  //# sourceMappingURL=index.mjs.map