@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.d.mts +341 -31
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +356 -46
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +90 -56
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +89 -58
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
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
|
|
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
|
-
|
|
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
|
|
2566
|
-
|
|
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 = (
|
|
2573
|
-
const { unifiedMetadata, builder } =
|
|
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
|
|
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(
|
|
3641
|
+
data: getData$4(parsed),
|
|
3639
3642
|
extra: null
|
|
3640
3643
|
};
|
|
3641
3644
|
};
|
|
3642
|
-
const getData$4 = (
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
4807
|
+
data: getData$2(parsed),
|
|
4826
4808
|
extra: null
|
|
4827
4809
|
};
|
|
4828
4810
|
};
|
|
4829
|
-
const getData$2 = (
|
|
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
|
|
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(
|
|
5588
|
-
const nominationPoolsPalletIdHex = tryGetConstantValue(
|
|
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
|