@talismn/balances 0.0.0-pr2043-20250619072437 → 0.0.0-pr2043-20250619151012
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/declarations/src/BalanceModule.d.ts +7 -3
- package/dist/declarations/src/getMiniMetadata/index.d.ts +2 -1
- package/dist/declarations/src/modules/SubstrateAssetsModule.d.ts +2 -4
- package/dist/declarations/src/modules/SubstrateForeignAssetsModule.d.ts +2 -4
- package/dist/declarations/src/modules/SubstrateNativeModule/subscribeCrowdloans.d.ts +1 -1
- package/dist/declarations/src/modules/SubstrateNativeModule/subscribeNompoolStaking.d.ts +1 -1
- package/dist/declarations/src/modules/SubstrateNativeModule/subscribeSubtensorStaking.d.ts +1 -1
- package/dist/declarations/src/modules/SubstrateNativeModule/types.d.ts +3 -4
- package/dist/declarations/src/modules/SubstrateNativeModule/util/QueryCache.d.ts +4 -4
- package/dist/declarations/src/modules/SubstrateNativeModule/util/buildQueries.d.ts +3 -2
- package/dist/declarations/src/modules/SubstrateTokensModule.d.ts +3 -4
- package/dist/declarations/src/modules/index.d.ts +5 -17
- package/dist/declarations/src/modules/util/buildStorageCoders.d.ts +3 -4
- package/dist/declarations/src/modules/util/getAddresssesByTokenByNetwork.d.ts +3 -0
- package/dist/declarations/src/modules/util/index.d.ts +0 -1
- package/dist/declarations/src/types/balances.d.ts +0 -11
- package/dist/declarations/src/types/minimetadatas.d.ts +13 -8
- package/dist/talismn-balances.cjs.dev.js +178 -209
- package/dist/talismn-balances.cjs.prod.js +178 -209
- package/dist/talismn-balances.esm.js +175 -206
- package/package.json +6 -6
- package/dist/declarations/src/modules/SubstrateNativeModule/util/detectMiniMetadataChanges.d.ts +0 -2
- package/dist/declarations/src/modules/util/findChainMeta.d.ts +0 -8
@@ -8,12 +8,14 @@ var util = require('@talismn/util');
|
|
8
8
|
var BigNumber = require('bignumber.js');
|
9
9
|
var util$1 = require('@polkadot/util');
|
10
10
|
var utilCrypto = require('@polkadot/util-crypto');
|
11
|
+
var shared = require('@talismn/chaindata-provider/src/chaindata/shared');
|
12
|
+
var z = require('zod/v4');
|
11
13
|
var pako = require('pako');
|
12
14
|
var viem = require('viem');
|
15
|
+
var lodash = require('lodash');
|
13
16
|
var isEqual = require('lodash/isEqual');
|
14
17
|
var txwrapperCore = require('@substrate/txwrapper-core');
|
15
18
|
var scale = require('@talismn/scale');
|
16
|
-
var lodash = require('lodash');
|
17
19
|
var camelCase = require('lodash/camelCase');
|
18
20
|
var PQueue = require('p-queue');
|
19
21
|
var sapi = require('@talismn/sapi');
|
@@ -26,13 +28,13 @@ var chainConnector = require('@talismn/chain-connector');
|
|
26
28
|
var rxjs = require('rxjs');
|
27
29
|
var scaleTs = require('scale-ts');
|
28
30
|
var upperFirst = require('lodash/upperFirst');
|
29
|
-
var z = require('zod/v4');
|
30
31
|
var apiContract = require('@polkadot/api-contract');
|
31
32
|
|
32
33
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
33
34
|
|
34
35
|
var anylogger__default = /*#__PURE__*/_interopDefault(anylogger);
|
35
36
|
var BigNumber__default = /*#__PURE__*/_interopDefault(BigNumber);
|
37
|
+
var z__default = /*#__PURE__*/_interopDefault(z);
|
36
38
|
var pako__default = /*#__PURE__*/_interopDefault(pako);
|
37
39
|
var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
|
38
40
|
var camelCase__default = /*#__PURE__*/_interopDefault(camelCase);
|
@@ -40,7 +42,8 @@ var PQueue__default = /*#__PURE__*/_interopDefault(PQueue);
|
|
40
42
|
var groupBy__default = /*#__PURE__*/_interopDefault(groupBy);
|
41
43
|
var PromisePool__default = /*#__PURE__*/_interopDefault(PromisePool);
|
42
44
|
var upperFirst__default = /*#__PURE__*/_interopDefault(upperFirst);
|
43
|
-
|
45
|
+
|
46
|
+
// Record<string, unknown> | undefined
|
44
47
|
|
45
48
|
// TODO: Document default balances module purpose/usage
|
46
49
|
const DefaultBalanceModule = type => ({
|
@@ -126,7 +129,7 @@ class EvmTokenFetcher {
|
|
126
129
|
|
127
130
|
var pkg = {
|
128
131
|
name: "@talismn/balances",
|
129
|
-
version: "0.0.0-pr2043-
|
132
|
+
version: "0.0.0-pr2043-20250619151012"};
|
130
133
|
|
131
134
|
var log = anylogger__default.default(pkg.name);
|
132
135
|
|
@@ -410,13 +413,13 @@ class Balance {
|
|
410
413
|
return this.#storage.networkId;
|
411
414
|
}
|
412
415
|
get network() {
|
413
|
-
return this.#db?.networks
|
416
|
+
return this.#db?.networks?.[this.networkId] || null;
|
414
417
|
}
|
415
418
|
get tokenId() {
|
416
419
|
return this.#storage.tokenId;
|
417
420
|
}
|
418
421
|
get token() {
|
419
|
-
return this.#db?.tokens
|
422
|
+
return this.#db?.tokens?.[this.tokenId] || null;
|
420
423
|
}
|
421
424
|
get decimals() {
|
422
425
|
return this.token?.decimals || null;
|
@@ -936,6 +939,23 @@ const deriveMiniMetadataId = ({
|
|
936
939
|
specVersion,
|
937
940
|
libVersion
|
938
941
|
}) => util$1.u8aToHex(utilCrypto.xxhashAsU8a(new TextEncoder().encode(`${source}${chainId}${specVersion}${libVersion}`), 64), undefined, false);
|
942
|
+
const MiniMetadataBaseSchema = z__default.default.strictObject({
|
943
|
+
/** The DB id for this metadata */
|
944
|
+
id: z__default.default.string().nonempty(),
|
945
|
+
/** The balance module which created this miniMetadata */
|
946
|
+
source: z__default.default.string().nonempty(),
|
947
|
+
// TODO make it an enum of balance module types
|
948
|
+
/** The chain this miniMetadata came from */
|
949
|
+
chainId: chaindataProvider.DotNetworkSchema.shape.id,
|
950
|
+
/** The chain specVersion which this miniMetadata is valid for */
|
951
|
+
specVersion: chaindataProvider.DotNetworkSchema.shape.specVersion,
|
952
|
+
/** the version of the balances library used to craft the mini metadata */
|
953
|
+
libVersion: z__default.default.string().nonempty(),
|
954
|
+
/** The miniMetadata encoded as a hex string */
|
955
|
+
data: shared.HexStringSchema.nullable(),
|
956
|
+
// /** module specific information about the chain, such as pallet ids for specific features */
|
957
|
+
extra: z__default.default.any().nullable()
|
958
|
+
});
|
939
959
|
|
940
960
|
// for DB version 3, Wallet version 1.21.0
|
941
961
|
const upgradeRemoveSymbolFromNativeTokenId = async tx => {
|
@@ -1297,10 +1317,10 @@ const EvmErc20Module = hydrate => {
|
|
1297
1317
|
* In a future version of the balance libraries, we may build some kind of async scheduling system which will keep the chainmeta for each chain up to date without relying on a squid.
|
1298
1318
|
*/
|
1299
1319
|
async fetchEvmChainMeta(_chainId) {
|
1300
|
-
return
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1320
|
+
return {
|
1321
|
+
miniMetadata: null,
|
1322
|
+
extra: null
|
1323
|
+
};
|
1304
1324
|
},
|
1305
1325
|
/**
|
1306
1326
|
* This method is currently executed on [a squid](https://github.com/TalismanSociety/chaindata-squid/blob/0ee02818bf5caa7362e3f3664e55ef05ec8df078/src/steps/updateEvmNetworksFromGithub.ts#L338-L343).
|
@@ -1509,7 +1529,6 @@ const fetchBalances$3 = async (evmChainConnector, tokenAddressesByNetwork, erc20
|
|
1509
1529
|
source: "evm-erc20",
|
1510
1530
|
status: "live",
|
1511
1531
|
address: networkParams[i].address,
|
1512
|
-
// multiChainId: { evmChainId: evmNetworkId },
|
1513
1532
|
networkId,
|
1514
1533
|
tokenId: networkParams[i].token.id,
|
1515
1534
|
value: free
|
@@ -1595,15 +1614,6 @@ function groupAddressesByTokenByEvmNetwork$1(addressesByToken, tokens) {
|
|
1595
1614
|
const abiMulticall = viem.parseAbi(["struct Call { address target; bytes callData; }", "struct Call3 { address target; bool allowFailure; bytes callData; }", "struct Call3Value { address target; bool allowFailure; uint256 value; bytes callData; }", "struct Result { bool success; bytes returnData; }", "function aggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes[] memory returnData)", "function aggregate3(Call3[] calldata calls) public payable returns (Result[] memory returnData)", "function aggregate3Value(Call3Value[] calldata calls) public payable returns (Result[] memory returnData)", "function blockAndAggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)", "function getBasefee() view returns (uint256 basefee)", "function getBlockHash(uint256 blockNumber) view returns (bytes32 blockHash)", "function getBlockNumber() view returns (uint256 blockNumber)", "function getChainId() view returns (uint256 chainid)", "function getCurrentBlockCoinbase() view returns (address coinbase)", "function getCurrentBlockDifficulty() view returns (uint256 difficulty)", "function getCurrentBlockGasLimit() view returns (uint256 gaslimit)", "function getCurrentBlockTimestamp() view returns (uint256 timestamp)", "function getEthBalance(address addr) view returns (uint256 balance)", "function getLastBlockHash() view returns (bytes32 blockHash)", "function tryAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (Result[] memory returnData)", "function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)"]);
|
1596
1615
|
|
1597
1616
|
const moduleType$6 = "evm-native";
|
1598
|
-
|
1599
|
-
// export const evmNativeTokenId = (chainId: EvmNetworkId) =>
|
1600
|
-
// `${chainId}-evm-native`.toLowerCase().replace(/ /g, "-")
|
1601
|
-
|
1602
|
-
const getEvmNetworkIdFromTokenId = tokenId => {
|
1603
|
-
const evmNetworkId = tokenId.split(":")[0];
|
1604
|
-
if (!evmNetworkId) throw new Error(`Can't detect chainId for token ${tokenId}`);
|
1605
|
-
return evmNetworkId;
|
1606
|
-
};
|
1607
1617
|
const EvmNativeModule = hydrate => {
|
1608
1618
|
const {
|
1609
1619
|
chainConnectors,
|
@@ -1622,10 +1632,10 @@ const EvmNativeModule = hydrate => {
|
|
1622
1632
|
* In a future version of the balance libraries, we may build some kind of async scheduling system which will keep the chainmeta for each chain up to date without relying on a squid.
|
1623
1633
|
*/
|
1624
1634
|
async fetchEvmChainMeta(_chainId) {
|
1625
|
-
|
1626
|
-
|
1627
|
-
|
1628
|
-
|
1635
|
+
return {
|
1636
|
+
miniMetadata: null,
|
1637
|
+
extra: null
|
1638
|
+
};
|
1629
1639
|
},
|
1630
1640
|
/**
|
1631
1641
|
* This method is currently executed on [a squid](https://github.com/TalismanSociety/chaindata-squid/blob/0ee02818bf5caa7362e3f3664e55ef05ec8df078/src/steps/updateEvmNetworksFromGithub.ts#L338-L343).
|
@@ -1664,7 +1674,7 @@ const EvmNativeModule = hydrate => {
|
|
1664
1674
|
const initDelay = 500; // 500ms == 0.5 seconds
|
1665
1675
|
|
1666
1676
|
const tokens = await getModuleTokens();
|
1667
|
-
const ethAddressesByToken =
|
1677
|
+
const ethAddressesByToken = lodash.fromPairs(lodash.toPairs(addressesByToken).map(([tokenId, addresses]) => {
|
1668
1678
|
const ethAddresses = addresses.filter(util.isEthereumAddress);
|
1669
1679
|
if (ethAddresses.length === 0) return null;
|
1670
1680
|
const token = tokens[tokenId];
|
@@ -1678,7 +1688,7 @@ const EvmNativeModule = hydrate => {
|
|
1678
1688
|
let zeroBalanceSubscriptionIntervalCounter = 0;
|
1679
1689
|
|
1680
1690
|
// setup initialising balances for all active evm networks
|
1681
|
-
const activeEvmNetworkIds =
|
1691
|
+
const activeEvmNetworkIds = lodash.keys(ethAddressesByToken).map(chaindataProvider.networkIdFromTokenId);
|
1682
1692
|
const initialisingBalances = new Set(activeEvmNetworkIds);
|
1683
1693
|
const positiveBalanceNetworks = new Set(initialBalances?.map(b => b.networkId));
|
1684
1694
|
const poll = async () => {
|
@@ -1687,7 +1697,7 @@ const EvmNativeModule = hydrate => {
|
|
1687
1697
|
try {
|
1688
1698
|
// fetch balance for each network sequentially to prevent creating a big queue of http requests (browser can only handle 2 at a time)
|
1689
1699
|
for (const [tokenId, addresses] of Object.entries(ethAddressesByToken)) {
|
1690
|
-
const evmNetworkId =
|
1700
|
+
const evmNetworkId = chaindataProvider.networkIdFromTokenId(tokenId);
|
1691
1701
|
|
1692
1702
|
// a zero balance network is one that has initialised and does not have a positive balance
|
1693
1703
|
const isZeroBalanceNetwork = !initialisingBalances.has(evmNetworkId) && !positiveBalanceNetworks.has(evmNetworkId);
|
@@ -2405,14 +2415,12 @@ const EvmUniswapV2Module = hydrate => {
|
|
2405
2415
|
return {
|
2406
2416
|
...DefaultBalanceModule(moduleType$5),
|
2407
2417
|
async fetchEvmChainMeta(_chainId) {
|
2408
|
-
|
2409
|
-
|
2410
|
-
|
2411
|
-
|
2418
|
+
return {
|
2419
|
+
miniMetadata: null,
|
2420
|
+
extra: null
|
2421
|
+
};
|
2412
2422
|
},
|
2413
2423
|
async fetchEvmChainTokens(chainId, _chainMeta, moduleConfig) {
|
2414
|
-
//const { isTestnet } = chainMeta
|
2415
|
-
|
2416
2424
|
const tokens = {};
|
2417
2425
|
for (const tokenConfig of moduleConfig?.pools ?? []) {
|
2418
2426
|
const {
|
@@ -2769,7 +2777,8 @@ const fetchMiniMetadatas = async (chainConnector, chaindataProvider, chainId, sp
|
|
2769
2777
|
chainId,
|
2770
2778
|
specVersion,
|
2771
2779
|
libVersion,
|
2772
|
-
data: chainMeta?.miniMetadata ?? null
|
2780
|
+
data: chainMeta?.miniMetadata ?? null,
|
2781
|
+
extra: chainMeta?.extra ?? null
|
2773
2782
|
};
|
2774
2783
|
}));
|
2775
2784
|
} finally {
|
@@ -2838,40 +2847,15 @@ async function balances(balanceModule, addressesByToken, callback) {
|
|
2838
2847
|
return await balanceModule.fetchBalances(addressesByToken);
|
2839
2848
|
}
|
2840
2849
|
|
2841
|
-
/**
|
2842
|
-
* Given a `moduleType` and a `chain` from a chaindataProvider, this function will find the chainMeta
|
2843
|
-
* associated with the given balanceModule for the given chain.
|
2844
|
-
*/
|
2845
|
-
const findChainMeta = (miniMetadatas, moduleType, chain) => {
|
2846
|
-
if (!chain) return [undefined, undefined];
|
2847
|
-
if (!chain.specVersion) return [undefined, undefined];
|
2848
|
-
|
2849
|
-
// TODO: This is spaghetti to import this here, it should be injected into each balance module or something.
|
2850
|
-
const metadataId = deriveMiniMetadataId({
|
2851
|
-
source: moduleType,
|
2852
|
-
chainId: chain.id,
|
2853
|
-
specVersion: chain.specVersion,
|
2854
|
-
libVersion
|
2855
|
-
});
|
2856
|
-
|
2857
|
-
// TODO: Fix this (needs to fetch miniMetadata without being async)
|
2858
|
-
const miniMetadata = miniMetadatas.get(metadataId);
|
2859
|
-
const chainMeta = miniMetadata ? {
|
2860
|
-
miniMetadata: miniMetadata.data
|
2861
|
-
} : undefined;
|
2862
|
-
return [chainMeta, miniMetadata];
|
2863
|
-
};
|
2864
|
-
|
2865
2850
|
const buildStorageCoders = ({
|
2866
2851
|
chainIds,
|
2867
2852
|
chains,
|
2868
2853
|
miniMetadatas,
|
2869
|
-
moduleType,
|
2870
2854
|
coders
|
2871
2855
|
}) => new Map([...chainIds].flatMap(chainId => {
|
2872
2856
|
const chain = chains[chainId];
|
2873
2857
|
if (!chain) return [];
|
2874
|
-
const
|
2858
|
+
const miniMetadata = miniMetadatas.get(chainId); // findMiniMetadata<TBalanceModule>(miniMetadatas, moduleType, chain)
|
2875
2859
|
if (!miniMetadata) return [];
|
2876
2860
|
if (!miniMetadata.data) return [];
|
2877
2861
|
const metadata = scale.unifyMetadata(scale.decAnyMetadata(miniMetadata.data));
|
@@ -3107,6 +3091,10 @@ const decompress = data => {
|
|
3107
3091
|
};
|
3108
3092
|
|
3109
3093
|
const moduleType$4 = "substrate-assets";
|
3094
|
+
const UNSUPPORTED_CHAIN_META$3 = {
|
3095
|
+
miniMetadata: null,
|
3096
|
+
extra: null
|
3097
|
+
};
|
3110
3098
|
const SubAssetsModule = hydrate => {
|
3111
3099
|
const {
|
3112
3100
|
chainConnectors,
|
@@ -3118,7 +3106,7 @@ const SubAssetsModule = hydrate => {
|
|
3118
3106
|
...DefaultBalanceModule(moduleType$4),
|
3119
3107
|
// TODO make synchronous at the module definition level ?
|
3120
3108
|
async fetchSubstrateChainMeta(chainId, moduleConfig, metadataRpc) {
|
3121
|
-
if (!metadataRpc) return
|
3109
|
+
if (!metadataRpc) return UNSUPPORTED_CHAIN_META$3;
|
3122
3110
|
const metadata = scale.decAnyMetadata(metadataRpc);
|
3123
3111
|
scale.compactMetadata(metadata, [{
|
3124
3112
|
pallet: "Assets",
|
@@ -3126,7 +3114,8 @@ const SubAssetsModule = hydrate => {
|
|
3126
3114
|
}]);
|
3127
3115
|
const miniMetadata = scale.encodeMetadata(metadata);
|
3128
3116
|
return {
|
3129
|
-
miniMetadata
|
3117
|
+
miniMetadata,
|
3118
|
+
extra: null
|
3130
3119
|
};
|
3131
3120
|
},
|
3132
3121
|
async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
|
@@ -3391,6 +3380,10 @@ const tryEncode = (scaleCoder, ...args) => {
|
|
3391
3380
|
};
|
3392
3381
|
|
3393
3382
|
const moduleType$3 = "substrate-foreignassets";
|
3383
|
+
const UNSUPPORTED_CHAIN_META$2 = {
|
3384
|
+
miniMetadata: null,
|
3385
|
+
extra: null
|
3386
|
+
};
|
3394
3387
|
const SubForeignAssetsModule = hydrate => {
|
3395
3388
|
const {
|
3396
3389
|
chainConnectors,
|
@@ -3401,9 +3394,9 @@ const SubForeignAssetsModule = hydrate => {
|
|
3401
3394
|
return {
|
3402
3395
|
...DefaultBalanceModule(moduleType$3),
|
3403
3396
|
async fetchSubstrateChainMeta(chainId, moduleConfig, metadataRpc) {
|
3404
|
-
if (metadataRpc === undefined) return
|
3397
|
+
if (metadataRpc === undefined) return UNSUPPORTED_CHAIN_META$2;
|
3405
3398
|
const metadataVersion = scale.getMetadataVersion(metadataRpc);
|
3406
|
-
if (metadataVersion < 14) return
|
3399
|
+
if (metadataVersion < 14) return UNSUPPORTED_CHAIN_META$2;
|
3407
3400
|
const metadata = scale.decAnyMetadata(metadataRpc);
|
3408
3401
|
scale.compactMetadata(metadata, [{
|
3409
3402
|
pallet: "ForeignAssets",
|
@@ -3411,7 +3404,8 @@ const SubForeignAssetsModule = hydrate => {
|
|
3411
3404
|
}]);
|
3412
3405
|
const miniMetadata = scale.encodeMetadata(metadata);
|
3413
3406
|
return {
|
3414
|
-
miniMetadata
|
3407
|
+
miniMetadata,
|
3408
|
+
extra: null
|
3415
3409
|
};
|
3416
3410
|
},
|
3417
3411
|
async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
|
@@ -3655,6 +3649,16 @@ async function buildQueries$2(chainConnector, chaindataProvider$1, addressesByTo
|
|
3655
3649
|
}))).flat();
|
3656
3650
|
}
|
3657
3651
|
|
3652
|
+
const getAddresssesByTokenByNetwork = addressesByToken => {
|
3653
|
+
const addressesByTokenByNetwork = lodash.toPairs(addressesByToken).reduce((acc, [tokenId, addresses]) => {
|
3654
|
+
const networkId = chaindataProvider.parseTokenId(tokenId).networkId;
|
3655
|
+
if (!acc[networkId]) acc[networkId] = {};
|
3656
|
+
acc[networkId][tokenId] = addresses;
|
3657
|
+
return acc;
|
3658
|
+
}, {});
|
3659
|
+
return addressesByTokenByNetwork;
|
3660
|
+
};
|
3661
|
+
|
3658
3662
|
async function subscribeBase(queries, chainConnector, callback) {
|
3659
3663
|
const unsubscribe = await new RpcStateQueryHelper(chainConnector, queries).subscribe((error, result) => {
|
3660
3664
|
if (error) callback(error);
|
@@ -3681,16 +3685,21 @@ const asObservable = handler => (...args) => new rxjs.Observable(subscriber => {
|
|
3681
3685
|
*/
|
3682
3686
|
const crowdloanFundContributionsChildKey = fundIndex => util$1.u8aToHex(util$1.u8aConcat(":child_storage:default:", utilCrypto.blake2AsU8a(util$1.u8aConcat("crowdloan", scaleTs.u32.enc(fundIndex)))));
|
3683
3687
|
|
3684
|
-
|
3685
|
-
|
3686
|
-
const
|
3687
|
-
const
|
3688
|
+
// TODO make this method chain-specific
|
3689
|
+
async function subscribeCrowdloans(chaindataProvider$1, chainConnector, addressesByToken, callback, signal) {
|
3690
|
+
const allChains = await chaindataProvider$1.chainsById();
|
3691
|
+
const tokens = await chaindataProvider$1.tokensById();
|
3692
|
+
|
3693
|
+
// there should be only one network here when subscribing to balances, we've split it up by network at the top level
|
3694
|
+
const networkIds = lodash.keys(addressesByToken).map(tokenId => chaindataProvider.parseTokenId(tokenId).networkId);
|
3695
|
+
const miniMetadatas = new Map();
|
3696
|
+
for (const networkId of networkIds) miniMetadatas.set(networkId, await getMiniMetadata(chaindataProvider$1, chainConnector, networkId, "substrate-native"));
|
3688
3697
|
const crowdloanTokenIds = Object.entries(tokens).filter(([, token]) => {
|
3689
3698
|
// ignore non-native tokens
|
3690
3699
|
if (token.type !== "substrate-native") return;
|
3691
3700
|
// ignore tokens on chains with no crowdloans pallet
|
3692
|
-
const
|
3693
|
-
return typeof
|
3701
|
+
const miniMetadata = miniMetadatas.get(token.networkId);
|
3702
|
+
return typeof miniMetadata?.extra?.crowdloanPalletId === "string";
|
3694
3703
|
}).map(([tokenId]) => tokenId);
|
3695
3704
|
|
3696
3705
|
// crowdloan contributions can only be done by the native token on chains with the crowdloan pallet
|
@@ -3705,7 +3714,6 @@ async function subscribeCrowdloans(chaindataProvider, chainConnector, addressesB
|
|
3705
3714
|
chainIds: uniqueChainIds,
|
3706
3715
|
chains,
|
3707
3716
|
miniMetadatas,
|
3708
|
-
moduleType: "substrate-native",
|
3709
3717
|
coders: {
|
3710
3718
|
parachains: ["Paras", "Parachains"],
|
3711
3719
|
funds: ["Crowdloan", "Funds"]
|
@@ -3948,16 +3956,25 @@ const nompoolAccountId = (palletId, poolId, index) => {
|
|
3948
3956
|
/** The stash account for the nomination pool */
|
3949
3957
|
const nompoolStashAccountId = (palletId, poolId) => nompoolAccountId(palletId, poolId, 0);
|
3950
3958
|
|
3951
|
-
|
3952
|
-
|
3953
|
-
const
|
3954
|
-
const
|
3959
|
+
// TODO make this method chain-specific
|
3960
|
+
async function subscribeNompoolStaking(chaindataProvider$1, chainConnector, addressesByToken, callback, signal) {
|
3961
|
+
const allChains = await chaindataProvider$1.chainsById();
|
3962
|
+
const tokens = await chaindataProvider$1.tokensById();
|
3963
|
+
|
3964
|
+
// there should be only one network here when subscribing to balances, we've split it up by network at the top level
|
3965
|
+
const networkIds = lodash.keys(addressesByToken).map(tokenId => chaindataProvider.parseTokenId(tokenId).networkId);
|
3966
|
+
const miniMetadatas = new Map();
|
3967
|
+
for (const networkId of networkIds) {
|
3968
|
+
const miniMetadata = await getMiniMetadata(chaindataProvider$1, chainConnector, networkId, "substrate-native");
|
3969
|
+
miniMetadatas.set(networkId, miniMetadata);
|
3970
|
+
}
|
3955
3971
|
const nomPoolTokenIds = Object.entries(tokens).filter(([, token]) => {
|
3956
3972
|
// ignore non-native tokens
|
3957
3973
|
if (token.type !== "substrate-native") return false;
|
3974
|
+
|
3958
3975
|
// ignore tokens on chains with no nompools pallet
|
3959
|
-
const
|
3960
|
-
return typeof
|
3976
|
+
const miniMetadata = miniMetadatas.get(token.networkId);
|
3977
|
+
return typeof miniMetadata?.extra?.nominationPoolsPalletId === "string";
|
3961
3978
|
}).map(([tokenId]) => tokenId);
|
3962
3979
|
|
3963
3980
|
// staking can only be done by the native token on chains with the staking pallet
|
@@ -3972,7 +3989,6 @@ async function subscribeNompoolStaking(chaindataProvider, chainConnector, addres
|
|
3972
3989
|
chainIds: uniqueChainIds,
|
3973
3990
|
chains,
|
3974
3991
|
miniMetadatas,
|
3975
|
-
moduleType: "substrate-native",
|
3976
3992
|
coders: {
|
3977
3993
|
poolMembers: ["NominationPools", "PoolMembers"],
|
3978
3994
|
bondedPools: ["NominationPools", "BondedPools"],
|
@@ -4001,10 +4017,10 @@ async function subscribeNompoolStaking(chaindataProvider, chainConnector, addres
|
|
4001
4017
|
log.warn(`Chain ${chainId} for token ${tokenId} not found`);
|
4002
4018
|
continue;
|
4003
4019
|
}
|
4004
|
-
const
|
4020
|
+
const miniMetadata = miniMetadatas.get(chainId);
|
4005
4021
|
const {
|
4006
4022
|
nominationPoolsPalletId
|
4007
|
-
} =
|
4023
|
+
} = miniMetadata?.extra ?? {};
|
4008
4024
|
const subscribePoolMembers = (addresses, callback) => {
|
4009
4025
|
const scaleCoder = chainStorageCoders.get(chainId)?.poolMembers;
|
4010
4026
|
const queries = addresses.flatMap(address => {
|
@@ -4260,16 +4276,24 @@ const calculateTaoFromDynamicInfo = ({
|
|
4260
4276
|
});
|
4261
4277
|
};
|
4262
4278
|
|
4263
|
-
|
4264
|
-
|
4265
|
-
const
|
4266
|
-
const
|
4279
|
+
// TODO make this method chain-specific
|
4280
|
+
async function subscribeSubtensorStaking(chaindataProvider$1, chainConnector, addressesByToken, callback, signal) {
|
4281
|
+
const allChains = await chaindataProvider$1.chainsById();
|
4282
|
+
const tokens = await chaindataProvider$1.tokensById();
|
4283
|
+
|
4284
|
+
// there should be only one network here when subscribing to balances, we've split it up by network at the top level
|
4285
|
+
const networkIds = lodash.keys(addressesByToken).map(tokenId => chaindataProvider.parseTokenId(tokenId).networkId);
|
4286
|
+
const miniMetadatas = new Map();
|
4287
|
+
for (const networkId of networkIds) {
|
4288
|
+
const miniMetadata = await getMiniMetadata(chaindataProvider$1, chainConnector, networkId, "substrate-native");
|
4289
|
+
miniMetadatas.set(networkId, miniMetadata);
|
4290
|
+
}
|
4267
4291
|
const subtensorTokenIds = Object.entries(tokens).filter(([, token]) => {
|
4268
4292
|
// ignore non-native tokens
|
4269
4293
|
if (token.type !== "substrate-native") return false;
|
4270
4294
|
// ignore tokens on chains with no subtensor pallet
|
4271
|
-
const
|
4272
|
-
return
|
4295
|
+
const miniMetadata = miniMetadatas.get(token.networkId);
|
4296
|
+
return miniMetadata?.extra?.hasSubtensorPallet === true;
|
4273
4297
|
}).map(([tokenId]) => tokenId);
|
4274
4298
|
|
4275
4299
|
// staking can only be done by the native token on chains with the subtensor pallet
|
@@ -4292,17 +4316,13 @@ async function subscribeSubtensorStaking(chaindataProvider, chainConnector, addr
|
|
4292
4316
|
continue;
|
4293
4317
|
}
|
4294
4318
|
const chainId = token.networkId;
|
4295
|
-
if (!chainId) {
|
4296
|
-
log.warn(`Token ${tokenId} has no chain`);
|
4297
|
-
continue;
|
4298
|
-
}
|
4299
4319
|
const chain = chains[chainId];
|
4300
4320
|
if (!chain) {
|
4301
4321
|
log.warn(`Chain ${chainId} for token ${tokenId} not found`);
|
4302
4322
|
continue;
|
4303
4323
|
}
|
4304
|
-
const
|
4305
|
-
if (!
|
4324
|
+
const miniMetadata = miniMetadatas.get(token.networkId);
|
4325
|
+
if (!miniMetadata?.data) {
|
4306
4326
|
log.warn(`MiniMetadata for chain ${chainId} not found`);
|
4307
4327
|
continue;
|
4308
4328
|
}
|
@@ -4312,7 +4332,7 @@ async function subscribeSubtensorStaking(chaindataProvider, chainConnector, addr
|
|
4312
4332
|
expectErrors: true
|
4313
4333
|
} // don't pollute the wallet logs when this request fails
|
4314
4334
|
)
|
4315
|
-
},
|
4335
|
+
}, miniMetadata.data, token, chain.hasCheckMetadataHash, chain.signedExtensions, chain.registryTypes);
|
4316
4336
|
|
4317
4337
|
// sets the number of addresses to query in parallel (per chain, since each chain runs in parallel to the others)
|
4318
4338
|
const concurrency = 4;
|
@@ -4559,9 +4579,6 @@ const getLockTitle = (lock, {
|
|
4559
4579
|
|
4560
4580
|
const moduleType$2 = "substrate-native";
|
4561
4581
|
|
4562
|
-
// export const subNativeTokenId = (chainId: ChainId) =>
|
4563
|
-
// `${chainId}-substrate-native`.toLowerCase().replace(/ /g, "-")
|
4564
|
-
|
4565
4582
|
/**
|
4566
4583
|
* Function to merge two 'sub sources' of the same balance together, or
|
4567
4584
|
* two instances of the same balance with different values.
|
@@ -4648,10 +4665,10 @@ async function buildQueries$1(chains, tokens, chainStorageCoders, miniMetadatas,
|
|
4648
4665
|
log.warn(`Chain ${chainId} for token ${tokenId} not found`);
|
4649
4666
|
return outerResult;
|
4650
4667
|
}
|
4651
|
-
const
|
4668
|
+
const miniMetadata = miniMetadatas.get(chainId);
|
4652
4669
|
const {
|
4653
4670
|
useLegacyTransferableCalculation
|
4654
|
-
} =
|
4671
|
+
} = miniMetadata?.extra ?? {};
|
4655
4672
|
addresses.flat().forEach(address => {
|
4656
4673
|
const queryKey = `${tokenId}-${address}`;
|
4657
4674
|
// We share this balanceJson between the base and the lock query for this address
|
@@ -4931,73 +4948,19 @@ const updateStakingLocksUsingUnbondingLocks = values => {
|
|
4931
4948
|
return [...otherValues, ...stakingLocks];
|
4932
4949
|
};
|
4933
4950
|
|
4934
|
-
const detectMiniMetadataChanges = () => {
|
4935
|
-
let previousMap = null;
|
4936
|
-
return rxjs.pipe(rxjs.map(currMap => {
|
4937
|
-
if (!currMap) return null;
|
4938
|
-
const changes = new Set();
|
4939
|
-
if (previousMap) {
|
4940
|
-
// Check for added or changed keys/values
|
4941
|
-
for (const [key, value] of currMap) {
|
4942
|
-
if (!previousMap.has(key) || !isEqual__default.default(previousMap.get(key), value)) {
|
4943
|
-
changes.add(value.chainId);
|
4944
|
-
}
|
4945
|
-
}
|
4946
|
-
|
4947
|
-
// Check for removed keys
|
4948
|
-
for (const [key, value] of previousMap) {
|
4949
|
-
if (!currMap.has(key)) {
|
4950
|
-
changes.add(value.chainId);
|
4951
|
-
}
|
4952
|
-
}
|
4953
|
-
}
|
4954
|
-
previousMap = currMap;
|
4955
|
-
return changes.size > 0 ? changes : null;
|
4956
|
-
}),
|
4957
|
-
// Filter out null emissions (no changes)
|
4958
|
-
rxjs.filter(changes => changes !== null));
|
4959
|
-
};
|
4960
|
-
|
4961
|
-
// NOTE: `liveQuery` is not initialized until commonMetadataObservable is subscribed to.
|
4962
|
-
const commonMetadataObservable = rxjs.from(dexie.liveQuery(() => db.miniMetadatas.where("source").equals("substrate-native").toArray())).pipe(rxjs.map(items => new Map(items.map(item => [item.id, item]))),
|
4963
|
-
// `refCount: true` will unsubscribe from the DB when commonMetadataObservable has no more subscribers
|
4964
|
-
rxjs.shareReplay({
|
4965
|
-
bufferSize: 1,
|
4966
|
-
refCount: true
|
4967
|
-
}));
|
4968
4951
|
class QueryCache {
|
4952
|
+
#chaindataProvider;
|
4953
|
+
#chainConnector;
|
4954
|
+
miniMetadatas = new Map();
|
4969
4955
|
balanceQueryCache = new Map();
|
4970
|
-
metadataSub = null
|
4971
|
-
|
4956
|
+
// private metadataSub: Subscription | null = null
|
4957
|
+
|
4958
|
+
constructor(chaindataProvider, chainConnector) {
|
4972
4959
|
this.chaindataProvider = chaindataProvider;
|
4973
|
-
|
4974
|
-
|
4975
|
-
if (this.metadataSub) return;
|
4976
|
-
this.metadataSub = commonMetadataObservable.pipe(util.firstThenDebounce(500), detectMiniMetadataChanges(), rxjs.combineLatestWith(this.chaindataProvider.tokensObservable), rxjs.distinctUntilChanged()).subscribe(([miniMetadataChanges, tokens]) => {
|
4977
|
-
// invalidate cache entries for any chains with new metadata
|
4978
|
-
const tokensByChainId = tokens.filter(token => token.type === "substrate-native").reduce((result, token) => {
|
4979
|
-
if (!token.networkId) return result;
|
4980
|
-
result[token.networkId] ? result[token.networkId].push(token) : result[token.networkId] = [token];
|
4981
|
-
return result;
|
4982
|
-
}, {});
|
4983
|
-
miniMetadataChanges.forEach(chainId => {
|
4984
|
-
const chainTokens = tokensByChainId[chainId];
|
4985
|
-
if (!chainTokens) return;
|
4986
|
-
chainTokens.forEach(token => {
|
4987
|
-
const tokenId = token.id;
|
4988
|
-
const cacheKeys = this.balanceQueryCache.keys();
|
4989
|
-
for (const key of cacheKeys) {
|
4990
|
-
if (key.startsWith(`${tokenId}-`)) this.balanceQueryCache.delete(key);
|
4991
|
-
}
|
4992
|
-
});
|
4993
|
-
});
|
4994
|
-
});
|
4995
|
-
}
|
4996
|
-
destroy() {
|
4997
|
-
this.metadataSub?.unsubscribe();
|
4960
|
+
this.#chaindataProvider = chaindataProvider;
|
4961
|
+
this.#chainConnector = chainConnector;
|
4998
4962
|
}
|
4999
4963
|
async getQueries(addressesByToken) {
|
5000
|
-
this.ensureSetup();
|
5001
4964
|
const chains = await this.chaindataProvider.chainsById();
|
5002
4965
|
const tokens = await this.chaindataProvider.tokensById();
|
5003
4966
|
const queryResults = Object.entries(addressesByToken).reduce((result, [tokenId, addresses]) => {
|
@@ -5015,15 +4978,20 @@ class QueryCache {
|
|
5015
4978
|
existing: [],
|
5016
4979
|
newAddressesByToken: {}
|
5017
4980
|
});
|
4981
|
+
const byNetwork = getAddresssesByTokenByNetwork(addressesByToken);
|
4982
|
+
for (const networkId of lodash.keys(byNetwork)) {
|
4983
|
+
if (this.miniMetadatas.has(networkId)) continue;
|
4984
|
+
const miniMetadata = await getMiniMetadata(this.#chaindataProvider, this.#chainConnector, networkId, "substrate-native");
|
4985
|
+
this.miniMetadatas.set(networkId, miniMetadata);
|
4986
|
+
}
|
5018
4987
|
|
5019
4988
|
// build queries for token/address pairs which have not been queried before
|
5020
|
-
const miniMetadatas = await
|
5021
|
-
const uniqueChainIds = getUniqueChainIds(queryResults.newAddressesByToken, tokens)
|
4989
|
+
// const miniMetadatas = await firstValueFrom(commonMetadataObservable)
|
4990
|
+
const uniqueChainIds = lodash.keys(byNetwork); // getUniqueChainIds(queryResults.newAddressesByToken, tokens)
|
5022
4991
|
const chainStorageCoders = buildStorageCoders({
|
5023
4992
|
chainIds: uniqueChainIds,
|
5024
4993
|
chains,
|
5025
|
-
miniMetadatas,
|
5026
|
-
moduleType: "substrate-native",
|
4994
|
+
miniMetadatas: this.miniMetadatas,
|
5027
4995
|
coders: {
|
5028
4996
|
base: ["System", "Account"],
|
5029
4997
|
stakingLedger: ["Staking", "Ledger"],
|
@@ -5033,7 +5001,7 @@ class QueryCache {
|
|
5033
5001
|
freezes: ["Balances", "Freezes"]
|
5034
5002
|
}
|
5035
5003
|
});
|
5036
|
-
const queries = await buildQueries$1(chains, tokens, chainStorageCoders, miniMetadatas, queryResults.newAddressesByToken);
|
5004
|
+
const queries = await buildQueries$1(chains, tokens, chainStorageCoders, this.miniMetadatas, queryResults.newAddressesByToken);
|
5037
5005
|
// now update the cache
|
5038
5006
|
Object.entries(queries).forEach(([key, query]) => {
|
5039
5007
|
this.balanceQueryCache.set(key, query);
|
@@ -5084,6 +5052,10 @@ const getChainProperties = async (chainConnector, networkId) => {
|
|
5084
5052
|
|
5085
5053
|
const POLLING_WINDOW_SIZE = 20;
|
5086
5054
|
const MAX_SUBSCRIPTION_SIZE = 40;
|
5055
|
+
const UNSUPPORTED_CHAIN_META$1 = {
|
5056
|
+
miniMetadata: null,
|
5057
|
+
extra: null
|
5058
|
+
};
|
5087
5059
|
const SubNativeModule = hydrate => {
|
5088
5060
|
const {
|
5089
5061
|
chainConnectors,
|
@@ -5091,7 +5063,7 @@ const SubNativeModule = hydrate => {
|
|
5091
5063
|
} = hydrate;
|
5092
5064
|
const chainConnector$1 = chainConnectors.substrate;
|
5093
5065
|
util$1.assert(chainConnector$1, "This module requires a substrate chain connector");
|
5094
|
-
const queryCache = new QueryCache(chaindataProvider$1);
|
5066
|
+
const queryCache = new QueryCache(chaindataProvider$1, chainConnector$1);
|
5095
5067
|
const getModuleTokens = async () => {
|
5096
5068
|
return await chaindataProvider$1.tokensByIdForType(moduleType$2);
|
5097
5069
|
};
|
@@ -5269,13 +5241,13 @@ const SubNativeModule = hydrate => {
|
|
5269
5241
|
return {
|
5270
5242
|
...DefaultBalanceModule(moduleType$2),
|
5271
5243
|
async fetchSubstrateChainMeta(chainId, moduleConfig, metadataRpc) {
|
5272
|
-
if (!metadataRpc) return
|
5244
|
+
if (!metadataRpc) return UNSUPPORTED_CHAIN_META$1;
|
5273
5245
|
|
5274
5246
|
//
|
5275
5247
|
// process metadata into SCALE encoders/decoders
|
5276
5248
|
//
|
5277
5249
|
const metadataVersion = scale.getMetadataVersion(metadataRpc);
|
5278
|
-
if (metadataVersion < 14) return
|
5250
|
+
if (metadataVersion < 14) return UNSUPPORTED_CHAIN_META$1;
|
5279
5251
|
const metadata = scale.decAnyMetadata(metadataRpc);
|
5280
5252
|
const unifiedMetadata = scale.unifyMetadata(metadata);
|
5281
5253
|
|
@@ -5342,18 +5314,17 @@ const SubNativeModule = hydrate => {
|
|
5342
5314
|
}) => name === "Freezes"));
|
5343
5315
|
const useLegacyTransferableCalculation = !hasFreezesItem;
|
5344
5316
|
const chainMeta = {
|
5345
|
-
|
5346
|
-
|
5347
|
-
|
5348
|
-
|
5349
|
-
|
5350
|
-
|
5351
|
-
|
5352
|
-
|
5353
|
-
miniMetadata
|
5317
|
+
miniMetadata,
|
5318
|
+
extra: {
|
5319
|
+
useLegacyTransferableCalculation,
|
5320
|
+
existentialDeposit,
|
5321
|
+
nominationPoolsPalletId,
|
5322
|
+
crowdloanPalletId,
|
5323
|
+
hasSubtensorPallet
|
5324
|
+
}
|
5354
5325
|
};
|
5355
|
-
if (!useLegacyTransferableCalculation) delete chainMeta.useLegacyTransferableCalculation;
|
5356
|
-
if (!hasSubtensorPallet) delete chainMeta.hasSubtensorPallet;
|
5326
|
+
if (!useLegacyTransferableCalculation) delete chainMeta.extra?.useLegacyTransferableCalculation;
|
5327
|
+
if (!hasSubtensorPallet) delete chainMeta.extra?.hasSubtensorPallet;
|
5357
5328
|
return chainMeta;
|
5358
5329
|
},
|
5359
5330
|
async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
|
@@ -5364,7 +5335,7 @@ const SubNativeModule = hydrate => {
|
|
5364
5335
|
} = await getChainProperties(chainConnector$1, chainId);
|
5365
5336
|
const {
|
5366
5337
|
existentialDeposit
|
5367
|
-
} = chainMeta;
|
5338
|
+
} = chainMeta.extra ?? {};
|
5368
5339
|
const id = chaindataProvider.subNativeTokenId(chainId);
|
5369
5340
|
const nativeToken = {
|
5370
5341
|
id,
|
@@ -5390,19 +5361,11 @@ const SubNativeModule = hydrate => {
|
|
5390
5361
|
initialBalances
|
5391
5362
|
}, callback) {
|
5392
5363
|
util$1.assert(chainConnectors.substrate, "This module requires a substrate chain connector");
|
5393
|
-
const addressesByTokenByNetwork =
|
5394
|
-
const networkId = chaindataProvider.parseSubNativeTokenId(tokenId).networkId;
|
5395
|
-
if (!acc[networkId]) acc[networkId] = {};
|
5396
|
-
acc[networkId][tokenId] = addressesByToken[tokenId];
|
5397
|
-
return acc;
|
5398
|
-
}, {});
|
5364
|
+
const addressesByTokenByNetwork = getAddresssesByTokenByNetwork(addressesByToken);
|
5399
5365
|
const initialBalancesByNetwork = lodash.groupBy(initialBalances ?? [], "networkId");
|
5400
|
-
const
|
5401
|
-
abort,
|
5402
|
-
signal
|
5403
|
-
} = new AbortController();
|
5366
|
+
const controller = new AbortController();
|
5404
5367
|
const safeCallback = (error, result) => {
|
5405
|
-
if (signal.aborted) return;
|
5368
|
+
if (controller.signal.aborted) return;
|
5406
5369
|
// typescript isnt happy with fowarding parameters as is
|
5407
5370
|
return error ? callback(error, undefined) : callback(error, result);
|
5408
5371
|
};
|
@@ -5410,19 +5373,19 @@ const SubNativeModule = hydrate => {
|
|
5410
5373
|
try {
|
5411
5374
|
// this is what we want to be done separately for each network
|
5412
5375
|
// this will update the DB so minimetadata will be available when it's used, veeeeery far down the tree of subscribeChainBalances
|
5413
|
-
await getMiniMetadata(chaindataProvider$1, chainConnector$1, networkId, moduleType$2, signal);
|
5376
|
+
await getMiniMetadata(chaindataProvider$1, chainConnector$1, networkId, moduleType$2, controller.signal);
|
5414
5377
|
} catch (err) {
|
5415
|
-
if (!signal.aborted) log.warn("Failed to get native token miniMetadata for network", networkId, err);
|
5378
|
+
if (!controller.signal.aborted) log.warn("Failed to get native token miniMetadata for network", networkId, err);
|
5416
5379
|
return () => {};
|
5417
5380
|
}
|
5418
|
-
if (signal.aborted) return () => {};
|
5381
|
+
if (controller.signal.aborted) return () => {};
|
5419
5382
|
return subscribeChainBalances(networkId, {
|
5420
5383
|
addressesByToken: addressesByTokenByNetwork[networkId] ?? {},
|
5421
5384
|
initialBalances: initialBalancesByNetwork[networkId] ?? []
|
5422
5385
|
}, safeCallback);
|
5423
5386
|
}));
|
5424
5387
|
return () => {
|
5425
|
-
abort();
|
5388
|
+
controller.abort();
|
5426
5389
|
unsubsribeFns.then(fns => fns.forEach(unsubscribe => unsubscribe()));
|
5427
5390
|
};
|
5428
5391
|
},
|
@@ -6651,7 +6614,11 @@ const SubPsp22Module = hydrate => {
|
|
6651
6614
|
return {
|
6652
6615
|
...DefaultBalanceModule(moduleType$1),
|
6653
6616
|
async fetchSubstrateChainMeta(_chainId) {
|
6654
|
-
|
6617
|
+
// we dont need anything
|
6618
|
+
return {
|
6619
|
+
miniMetadata: null,
|
6620
|
+
extra: null
|
6621
|
+
};
|
6655
6622
|
},
|
6656
6623
|
async fetchSubstrateChainTokens(chainId, _chainMeta, moduleConfig) {
|
6657
6624
|
// const { isTestnet } = chainMeta
|
@@ -6885,6 +6852,10 @@ const fetchBalances = async (chainConnector, tokens, addressesByToken) => {
|
|
6885
6852
|
|
6886
6853
|
const moduleType = "substrate-tokens";
|
6887
6854
|
const defaultPalletId = "Tokens";
|
6855
|
+
const UNSUPPORTED_CHAIN_META = {
|
6856
|
+
miniMetadata: null,
|
6857
|
+
extra: {}
|
6858
|
+
};
|
6888
6859
|
const SubTokensModule = hydrate => {
|
6889
6860
|
const {
|
6890
6861
|
chainConnectors,
|
@@ -6895,7 +6866,7 @@ const SubTokensModule = hydrate => {
|
|
6895
6866
|
return {
|
6896
6867
|
...DefaultBalanceModule(moduleType),
|
6897
6868
|
async fetchSubstrateChainMeta(chainId, moduleConfig, metadataRpc) {
|
6898
|
-
if (metadataRpc === undefined) return
|
6869
|
+
if (metadataRpc === undefined) return UNSUPPORTED_CHAIN_META;
|
6899
6870
|
const metadata = scale.decAnyMetadata(metadataRpc);
|
6900
6871
|
const palletId = moduleConfig?.palletId ?? defaultPalletId;
|
6901
6872
|
scale.compactMetadata(metadata, [{
|
@@ -6903,11 +6874,11 @@ const SubTokensModule = hydrate => {
|
|
6903
6874
|
items: ["Accounts"]
|
6904
6875
|
}]);
|
6905
6876
|
const miniMetadata = scale.encodeMetadata(metadata);
|
6906
|
-
return
|
6907
|
-
miniMetadata
|
6908
|
-
|
6909
|
-
|
6910
|
-
|
6877
|
+
return {
|
6878
|
+
miniMetadata,
|
6879
|
+
extra: {
|
6880
|
+
palletId
|
6881
|
+
}
|
6911
6882
|
};
|
6912
6883
|
},
|
6913
6884
|
async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
|
@@ -6997,9 +6968,8 @@ const SubTokensModule = hydrate => {
|
|
6997
6968
|
const chainId = token.networkId;
|
6998
6969
|
const chain = await chaindataProvider$1.chainById(chainId);
|
6999
6970
|
util$1.assert(chain?.genesisHash, `Chain ${chainId} not found in store`);
|
7000
|
-
const
|
7001
|
-
const
|
7002
|
-
const tokensPallet = chainMeta?.palletId ?? defaultPalletId;
|
6971
|
+
const miniMetadata = await getMiniMetadata(chaindataProvider$1, chainConnector, chainId, moduleType);
|
6972
|
+
const tokensPallet = miniMetadata?.extra?.palletId ?? defaultPalletId;
|
7003
6973
|
const onChainId = (() => {
|
7004
6974
|
try {
|
7005
6975
|
return scale.papiParse(token.onChainId);
|
@@ -7104,8 +7074,7 @@ async function buildNetworkQueries(networkId, chainConnector, chaindataProvider,
|
|
7104
7074
|
const tokens = await chaindataProvider.tokensById();
|
7105
7075
|
if (!chain) return [];
|
7106
7076
|
signal?.throwIfAborted();
|
7107
|
-
const
|
7108
|
-
const palletId = tokensMetadata.palletId ?? defaultPalletId;
|
7077
|
+
const palletId = miniMetadata.extra.palletId ?? defaultPalletId;
|
7109
7078
|
const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
|
7110
7079
|
storage: [palletId, "Accounts"]
|
7111
7080
|
});
|
@@ -7196,6 +7165,7 @@ exports.EvmNativeModule = EvmNativeModule;
|
|
7196
7165
|
exports.EvmTokenFetcher = EvmTokenFetcher;
|
7197
7166
|
exports.EvmUniswapV2Module = EvmUniswapV2Module;
|
7198
7167
|
exports.FiatSumBalancesFormatter = FiatSumBalancesFormatter;
|
7168
|
+
exports.MiniMetadataBaseSchema = MiniMetadataBaseSchema;
|
7199
7169
|
exports.ONE_ALPHA_TOKEN = ONE_ALPHA_TOKEN;
|
7200
7170
|
exports.PlanckSumBalancesFormatter = PlanckSumBalancesFormatter;
|
7201
7171
|
exports.RpcStateQueryHelper = RpcStateQueryHelper;
|
@@ -7230,7 +7200,6 @@ exports.excludeFromFeePayableLocks = excludeFromFeePayableLocks;
|
|
7230
7200
|
exports.excludeFromTransferableAmount = excludeFromTransferableAmount;
|
7231
7201
|
exports.filterBaseLocks = filterBaseLocks;
|
7232
7202
|
exports.filterMirrorTokens = filterMirrorTokens;
|
7233
|
-
exports.findChainMeta = findChainMeta;
|
7234
7203
|
exports.getBalanceId = getBalanceId;
|
7235
7204
|
exports.getLockTitle = getLockTitle;
|
7236
7205
|
exports.getUniqueChainIds = getUniqueChainIds;
|