@talismn/balances 1.3.6 → 1.4.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 +56 -11
- package/dist/index.d.ts +56 -11
- package/dist/index.js +1109 -589
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +940 -406
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -9
package/dist/index.mjs
CHANGED
|
@@ -7,20 +7,20 @@ import {
|
|
|
7
7
|
getAccountPlatformFromAddress,
|
|
8
8
|
normalizeAddress
|
|
9
9
|
} from "@talismn/crypto";
|
|
10
|
-
import { getSharedObservable, isNotNil as
|
|
11
|
-
import { assign as
|
|
10
|
+
import { getSharedObservable, isNotNil as isNotNil10, isTruthy, keepAlive } from "@talismn/util";
|
|
11
|
+
import { assign as assign12, fromPairs as fromPairs2, isEqual as isEqual11, keyBy as keyBy9, keys as keys3, toPairs as toPairs2, uniq as uniq6, values as values2 } from "lodash-es";
|
|
12
12
|
import {
|
|
13
13
|
BehaviorSubject as BehaviorSubject2,
|
|
14
14
|
catchError,
|
|
15
15
|
combineLatest,
|
|
16
16
|
defer,
|
|
17
|
-
distinctUntilChanged as
|
|
17
|
+
distinctUntilChanged as distinctUntilChanged11,
|
|
18
18
|
EMPTY,
|
|
19
19
|
filter,
|
|
20
20
|
firstValueFrom,
|
|
21
21
|
from,
|
|
22
22
|
map as map6,
|
|
23
|
-
of as
|
|
23
|
+
of as of15,
|
|
24
24
|
shareReplay,
|
|
25
25
|
startWith,
|
|
26
26
|
switchMap as switchMap2,
|
|
@@ -38,7 +38,7 @@ import anylogger from "anylogger";
|
|
|
38
38
|
// package.json
|
|
39
39
|
var package_default = {
|
|
40
40
|
name: "@talismn/balances",
|
|
41
|
-
version: "1.
|
|
41
|
+
version: "1.4.0",
|
|
42
42
|
author: "Talisman",
|
|
43
43
|
homepage: "https://talisman.xyz",
|
|
44
44
|
license: "GPL-3.0-or-later",
|
|
@@ -90,7 +90,6 @@ var package_default = {
|
|
|
90
90
|
devDependencies: {
|
|
91
91
|
"@polkadot/api-contract": "16.1.2",
|
|
92
92
|
"@polkadot/types": "16.1.2",
|
|
93
|
-
"@polkadot/util": "13.5.3",
|
|
94
93
|
"@talismn/tsconfig": "workspace:*",
|
|
95
94
|
"@types/lodash-es": "4.17.12",
|
|
96
95
|
typescript: "^5.6.3"
|
|
@@ -98,8 +97,6 @@ var package_default = {
|
|
|
98
97
|
peerDependencies: {
|
|
99
98
|
"@polkadot/api-contract": "*",
|
|
100
99
|
"@polkadot/types": "*",
|
|
101
|
-
"@polkadot/util": "*",
|
|
102
|
-
"@polkadot/util-crypto": "*",
|
|
103
100
|
"@substrate/txwrapper-core": "*"
|
|
104
101
|
},
|
|
105
102
|
types: "./dist/index.d.ts",
|
|
@@ -1852,8 +1849,8 @@ var fetchBalances4 = async ({
|
|
|
1852
1849
|
const results = await Promise.allSettled(
|
|
1853
1850
|
balanceDefs.map(async ({ token, address }) => {
|
|
1854
1851
|
try {
|
|
1855
|
-
const
|
|
1856
|
-
const lamports = await connection.getBalance(
|
|
1852
|
+
const publicKey3 = new PublicKey(address);
|
|
1853
|
+
const lamports = await connection.getBalance(publicKey3);
|
|
1857
1854
|
return {
|
|
1858
1855
|
address,
|
|
1859
1856
|
tokenId: token.id,
|
|
@@ -2009,8 +2006,8 @@ var MODULE_TYPE5 = SolSplTokenSchema.shape.type.value;
|
|
|
2009
2006
|
var PLATFORM5 = SolSplTokenSchema.shape.platform.value;
|
|
2010
2007
|
|
|
2011
2008
|
// src/modules/sol-spl/fetchBalances.ts
|
|
2012
|
-
import { PublicKey as
|
|
2013
|
-
import { solSplTokenId } from "@talismn/chaindata-provider";
|
|
2009
|
+
import { PublicKey as PublicKey4 } from "@solana/web3.js";
|
|
2010
|
+
import { SolSplTokenSchema as SolSplTokenSchema3, solSplTokenId } from "@talismn/chaindata-provider";
|
|
2014
2011
|
import { isNotNil as isNotNil2 } from "@talismn/util";
|
|
2015
2012
|
import { keyBy as keyBy2, uniq as uniq2 } from "lodash-es";
|
|
2016
2013
|
|
|
@@ -2172,8 +2169,77 @@ var getDetectedTokensIds$ = (address) => tokenIdsByAddress.pipe(
|
|
|
2172
2169
|
distinctUntilChanged5(isEqual5)
|
|
2173
2170
|
);
|
|
2174
2171
|
|
|
2172
|
+
// src/modules/sol-spl/onChainTokenMetadata.ts
|
|
2173
|
+
import { deserializeMetadata } from "@metaplex-foundation/mpl-token-metadata";
|
|
2174
|
+
import { publicKey, sol } from "@metaplex-foundation/umi";
|
|
2175
|
+
import { MintLayout } from "@solana/spl-token";
|
|
2176
|
+
import { PublicKey as PublicKey3 } from "@solana/web3.js";
|
|
2177
|
+
import { parseSolSplTokenId, SolSplTokenSchema as SolSplTokenSchema2 } from "@talismn/chaindata-provider";
|
|
2178
|
+
import z7 from "zod/v4";
|
|
2179
|
+
var TokenCacheSchema3 = z7.discriminatedUnion("isValid", [
|
|
2180
|
+
z7.strictObject({
|
|
2181
|
+
id: SolSplTokenSchema2.shape.id,
|
|
2182
|
+
isValid: z7.literal(true),
|
|
2183
|
+
...SolSplTokenSchema2.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
|
|
2184
|
+
}),
|
|
2185
|
+
z7.strictObject({
|
|
2186
|
+
id: SolSplTokenSchema2.shape.id,
|
|
2187
|
+
isValid: z7.literal(false)
|
|
2188
|
+
})
|
|
2189
|
+
]);
|
|
2190
|
+
var METAPLEX_PROGRAM_ID = new PublicKey3("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
|
|
2191
|
+
var ERROR_NO_MINT = "No mint info available";
|
|
2192
|
+
var ERROR_NO_METADATA = "No metadata account found";
|
|
2193
|
+
var ERROR_INVALID_DATA = "Invalid on-chain data";
|
|
2194
|
+
var fetchOnChainTokenData = async (connector, tokenId) => {
|
|
2195
|
+
try {
|
|
2196
|
+
const { networkId, mintAddress } = parseSolSplTokenId(tokenId);
|
|
2197
|
+
const connection = await connector.getConnection(networkId);
|
|
2198
|
+
if (!connection) {
|
|
2199
|
+
log_default.warn(`No connection found for network ${networkId}`);
|
|
2200
|
+
return null;
|
|
2201
|
+
}
|
|
2202
|
+
const mintPubKey = new PublicKey3(mintAddress);
|
|
2203
|
+
const mintInfo = await connection.getAccountInfo(mintPubKey);
|
|
2204
|
+
if (!mintInfo?.data) throw new Error(ERROR_NO_MINT);
|
|
2205
|
+
const mint = MintLayout.decode(mintInfo.data);
|
|
2206
|
+
const [metadataPDA] = PublicKey3.findProgramAddressSync(
|
|
2207
|
+
[Buffer.from("metadata"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],
|
|
2208
|
+
METAPLEX_PROGRAM_ID
|
|
2209
|
+
);
|
|
2210
|
+
const metadataAccount = await connection.getAccountInfo(new PublicKey3(metadataPDA));
|
|
2211
|
+
if (!metadataAccount) throw new Error(ERROR_NO_METADATA);
|
|
2212
|
+
const metadata = deserializeMetadata({
|
|
2213
|
+
publicKey: publicKey(metadataPDA),
|
|
2214
|
+
executable: metadataAccount.executable,
|
|
2215
|
+
owner: publicKey(metadataAccount.owner),
|
|
2216
|
+
lamports: sol(metadataAccount.lamports),
|
|
2217
|
+
data: metadataAccount.data
|
|
2218
|
+
});
|
|
2219
|
+
const parsed = TokenCacheSchema3.safeParse({
|
|
2220
|
+
id: tokenId,
|
|
2221
|
+
symbol: metadata.symbol.trim(),
|
|
2222
|
+
name: metadata.name.trim(),
|
|
2223
|
+
decimals: mint.decimals,
|
|
2224
|
+
isValid: true
|
|
2225
|
+
});
|
|
2226
|
+
if (!parsed.success) throw new Error(ERROR_INVALID_DATA);
|
|
2227
|
+
return parsed.data;
|
|
2228
|
+
} catch (err) {
|
|
2229
|
+
const msg = err.message;
|
|
2230
|
+
if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))
|
|
2231
|
+
return TokenCacheSchema3.parse({
|
|
2232
|
+
id: tokenId,
|
|
2233
|
+
isValid: false
|
|
2234
|
+
});
|
|
2235
|
+
log_default.warn("Failed to fetch sol-spl token data for %s", tokenId, { err });
|
|
2236
|
+
}
|
|
2237
|
+
return null;
|
|
2238
|
+
};
|
|
2239
|
+
|
|
2175
2240
|
// src/modules/sol-spl/fetchBalances.ts
|
|
2176
2241
|
var SPL_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
|
|
2242
|
+
var dynamicTokenMetadataCache = /* @__PURE__ */ new Map();
|
|
2177
2243
|
var fetchBalances5 = async ({
|
|
2178
2244
|
networkId,
|
|
2179
2245
|
tokensWithAddresses,
|
|
@@ -2183,18 +2249,22 @@ var fetchBalances5 = async ({
|
|
|
2183
2249
|
const connection = await connector.getConnection(networkId);
|
|
2184
2250
|
if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
|
|
2185
2251
|
const accountAddresses = uniq2(tokensWithAddresses.flatMap(([, addresses]) => addresses));
|
|
2252
|
+
const knownTokenIds = new Set(tokensWithAddresses.map(([token]) => token.id));
|
|
2253
|
+
const unknownMints = /* @__PURE__ */ new Set();
|
|
2186
2254
|
const balancesPerAddress = await Promise.all(
|
|
2187
2255
|
accountAddresses.map(async (address) => {
|
|
2188
|
-
const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new
|
|
2189
|
-
programId: new
|
|
2256
|
+
const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey4(address), {
|
|
2257
|
+
programId: new PublicKey4(SPL_PROGRAM_ID)
|
|
2190
2258
|
// SPL Token Program ID
|
|
2191
2259
|
});
|
|
2192
2260
|
const balances = tokenAccounts.value.map((d) => {
|
|
2193
2261
|
try {
|
|
2194
2262
|
const mintAddress = d.account.data.parsed.info.mint;
|
|
2195
2263
|
const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
|
|
2264
|
+
const tokenId = solSplTokenId(networkId, mintAddress);
|
|
2265
|
+
if (!knownTokenIds.has(tokenId) && value !== "0") unknownMints.add(mintAddress);
|
|
2196
2266
|
return {
|
|
2197
|
-
tokenId
|
|
2267
|
+
tokenId,
|
|
2198
2268
|
networkId,
|
|
2199
2269
|
address,
|
|
2200
2270
|
source: MODULE_TYPE5,
|
|
@@ -2217,6 +2287,42 @@ var fetchBalances5 = async ({
|
|
|
2217
2287
|
return [address, balances];
|
|
2218
2288
|
})
|
|
2219
2289
|
);
|
|
2290
|
+
const dynamicTokens = [];
|
|
2291
|
+
if (unknownMints.size) {
|
|
2292
|
+
await Promise.all(
|
|
2293
|
+
Array.from(unknownMints).map(async (mintAddress) => {
|
|
2294
|
+
const tokenId = solSplTokenId(networkId, mintAddress);
|
|
2295
|
+
let cached = dynamicTokenMetadataCache.get(tokenId);
|
|
2296
|
+
if (!cached) {
|
|
2297
|
+
const fetched = await fetchOnChainTokenData(connector, tokenId);
|
|
2298
|
+
if (fetched) {
|
|
2299
|
+
dynamicTokenMetadataCache.set(tokenId, fetched);
|
|
2300
|
+
cached = fetched;
|
|
2301
|
+
}
|
|
2302
|
+
}
|
|
2303
|
+
if (!cached || !cached.isValid) return;
|
|
2304
|
+
const token = {
|
|
2305
|
+
id: tokenId,
|
|
2306
|
+
type: MODULE_TYPE5,
|
|
2307
|
+
platform: PLATFORM5,
|
|
2308
|
+
networkId,
|
|
2309
|
+
mintAddress,
|
|
2310
|
+
isDefault: true,
|
|
2311
|
+
symbol: cached.symbol,
|
|
2312
|
+
decimals: cached.decimals,
|
|
2313
|
+
...cached.name !== void 0 ? { name: cached.name } : {},
|
|
2314
|
+
...cached.logo !== void 0 ? { logo: cached.logo } : {}
|
|
2315
|
+
};
|
|
2316
|
+
const parsed = SolSplTokenSchema3.safeParse(token);
|
|
2317
|
+
if (!parsed.success) {
|
|
2318
|
+
log_default.warn("Ignoring dynamic sol-spl token with invalid schema", { token });
|
|
2319
|
+
return;
|
|
2320
|
+
}
|
|
2321
|
+
dynamicTokens.push(parsed.data);
|
|
2322
|
+
})
|
|
2323
|
+
);
|
|
2324
|
+
}
|
|
2325
|
+
const registeredDynamicIds = new Set(dynamicTokens.map((t) => t.id));
|
|
2220
2326
|
const allBalancesByKey = keyBy2(
|
|
2221
2327
|
balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),
|
|
2222
2328
|
(b) => getBalanceKey(b.tokenId, b.address)
|
|
@@ -2233,34 +2339,16 @@ var fetchBalances5 = async ({
|
|
|
2233
2339
|
value: "0"
|
|
2234
2340
|
};
|
|
2235
2341
|
});
|
|
2236
|
-
|
|
2342
|
+
for (const balance of balancesPerAddress.flatMap(([, addressBalances]) => addressBalances)) {
|
|
2343
|
+
if (registeredDynamicIds.has(balance.tokenId)) success.push(balance);
|
|
2344
|
+
}
|
|
2345
|
+
return { success, errors: [], dynamicTokens };
|
|
2237
2346
|
};
|
|
2238
2347
|
var getBalanceKey = (tokenId, address) => `${tokenId}:${address}`;
|
|
2239
2348
|
|
|
2240
2349
|
// src/modules/sol-spl/fetchTokens.ts
|
|
2241
|
-
import {
|
|
2242
|
-
import { publicKey, sol } from "@metaplex-foundation/umi";
|
|
2243
|
-
import { MintLayout } from "@solana/spl-token";
|
|
2244
|
-
import { PublicKey as PublicKey4 } from "@solana/web3.js";
|
|
2245
|
-
import {
|
|
2246
|
-
parseSolSplTokenId,
|
|
2247
|
-
SolSplTokenSchema as SolSplTokenSchema2,
|
|
2248
|
-
solSplTokenId as solSplTokenId2
|
|
2249
|
-
} from "@talismn/chaindata-provider";
|
|
2350
|
+
import { SolSplTokenSchema as SolSplTokenSchema4, solSplTokenId as solSplTokenId2 } from "@talismn/chaindata-provider";
|
|
2250
2351
|
import { assign as assign5, omit as omit3 } from "lodash-es";
|
|
2251
|
-
import z7 from "zod/v4";
|
|
2252
|
-
var TokenCacheSchema3 = z7.discriminatedUnion("isValid", [
|
|
2253
|
-
z7.strictObject({
|
|
2254
|
-
id: SolSplTokenSchema2.shape.id,
|
|
2255
|
-
isValid: z7.literal(true),
|
|
2256
|
-
...SolSplTokenSchema2.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
|
|
2257
|
-
}),
|
|
2258
|
-
z7.strictObject({
|
|
2259
|
-
id: SolSplTokenSchema2.shape.id,
|
|
2260
|
-
isValid: z7.literal(false)
|
|
2261
|
-
})
|
|
2262
|
-
]);
|
|
2263
|
-
var METAPLEX_PROGRAM_ID = new PublicKey4("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
|
|
2264
2352
|
var fetchTokens5 = async ({
|
|
2265
2353
|
networkId,
|
|
2266
2354
|
tokens,
|
|
@@ -2288,7 +2376,7 @@ var fetchTokens5 = async ({
|
|
|
2288
2376
|
cached?.isValid ? omit3(cached, ["isValid"]) : {},
|
|
2289
2377
|
tokenConfig
|
|
2290
2378
|
);
|
|
2291
|
-
const parsed =
|
|
2379
|
+
const parsed = SolSplTokenSchema4.safeParse(token);
|
|
2292
2380
|
if (!parsed.success) {
|
|
2293
2381
|
log_default.warn("Ignoring token with invalid SolSplTokenSchema", {
|
|
2294
2382
|
token
|
|
@@ -2299,54 +2387,6 @@ var fetchTokens5 = async ({
|
|
|
2299
2387
|
}
|
|
2300
2388
|
return result;
|
|
2301
2389
|
};
|
|
2302
|
-
var ERROR_NO_MINT = "No mint info available";
|
|
2303
|
-
var ERROR_NO_METADATA = "No metadata account found";
|
|
2304
|
-
var ERROR_INVALID_DATA = "Invalid on-chain data";
|
|
2305
|
-
var fetchOnChainTokenData = async (connector, tokenId) => {
|
|
2306
|
-
try {
|
|
2307
|
-
const { networkId, mintAddress } = parseSolSplTokenId(tokenId);
|
|
2308
|
-
const connection = await connector.getConnection(networkId);
|
|
2309
|
-
if (!connection) {
|
|
2310
|
-
log_default.warn(`No connection found for network ${networkId}`);
|
|
2311
|
-
return null;
|
|
2312
|
-
}
|
|
2313
|
-
const mintPubKey = new PublicKey4(mintAddress);
|
|
2314
|
-
const mintInfo = await connection.getAccountInfo(mintPubKey);
|
|
2315
|
-
if (!mintInfo?.data) throw new Error(ERROR_NO_MINT);
|
|
2316
|
-
const mint = MintLayout.decode(mintInfo.data);
|
|
2317
|
-
const [metadataPDA] = PublicKey4.findProgramAddressSync(
|
|
2318
|
-
[Buffer.from("metadata"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],
|
|
2319
|
-
METAPLEX_PROGRAM_ID
|
|
2320
|
-
);
|
|
2321
|
-
const metadataAccount = await connection.getAccountInfo(new PublicKey4(metadataPDA));
|
|
2322
|
-
if (!metadataAccount) throw new Error(ERROR_NO_METADATA);
|
|
2323
|
-
const metadata = deserializeMetadata({
|
|
2324
|
-
publicKey: publicKey(metadataPDA),
|
|
2325
|
-
executable: metadataAccount.executable,
|
|
2326
|
-
owner: publicKey(metadataAccount.owner),
|
|
2327
|
-
lamports: sol(metadataAccount.lamports),
|
|
2328
|
-
data: metadataAccount.data
|
|
2329
|
-
});
|
|
2330
|
-
const parsed = TokenCacheSchema3.safeParse({
|
|
2331
|
-
id: tokenId,
|
|
2332
|
-
symbol: metadata.symbol.trim(),
|
|
2333
|
-
name: metadata.name.trim(),
|
|
2334
|
-
decimals: mint.decimals,
|
|
2335
|
-
isValid: true
|
|
2336
|
-
});
|
|
2337
|
-
if (!parsed.success) throw new Error(ERROR_INVALID_DATA);
|
|
2338
|
-
return parsed.data;
|
|
2339
|
-
} catch (err) {
|
|
2340
|
-
const msg = err.message;
|
|
2341
|
-
if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))
|
|
2342
|
-
return TokenCacheSchema3.parse({
|
|
2343
|
-
id: tokenId,
|
|
2344
|
-
isValid: false
|
|
2345
|
-
});
|
|
2346
|
-
log_default.warn("Failed to fetch sol-spl token data for %s", tokenId, { err });
|
|
2347
|
-
}
|
|
2348
|
-
return null;
|
|
2349
|
-
};
|
|
2350
2390
|
|
|
2351
2391
|
// src/modules/sol-spl/getMiniMetadata.ts
|
|
2352
2392
|
var getMiniMetadata5 = () => {
|
|
@@ -2457,21 +2497,496 @@ var SolSplBalanceModule = {
|
|
|
2457
2497
|
};
|
|
2458
2498
|
|
|
2459
2499
|
// src/modules/sol-spl/types.ts
|
|
2460
|
-
import { SolSplTokenSchema as
|
|
2500
|
+
import { SolSplTokenSchema as SolSplTokenSchema5 } from "@talismn/chaindata-provider";
|
|
2461
2501
|
import z8 from "zod/v4";
|
|
2462
2502
|
var SolSplTokenConfigSchema = z8.strictObject({
|
|
2463
|
-
mintAddress:
|
|
2503
|
+
mintAddress: SolSplTokenSchema5.shape.mintAddress,
|
|
2504
|
+
...TokenConfigBaseSchema.shape
|
|
2505
|
+
});
|
|
2506
|
+
|
|
2507
|
+
// src/modules/sol-token2022/config.ts
|
|
2508
|
+
import { SolToken2022TokenSchema } from "@talismn/chaindata-provider";
|
|
2509
|
+
var MODULE_TYPE6 = SolToken2022TokenSchema.shape.type.value;
|
|
2510
|
+
var PLATFORM6 = SolToken2022TokenSchema.shape.platform.value;
|
|
2511
|
+
|
|
2512
|
+
// src/modules/sol-token2022/fetchBalances.ts
|
|
2513
|
+
import { PublicKey as PublicKey7 } from "@solana/web3.js";
|
|
2514
|
+
import {
|
|
2515
|
+
SolToken2022TokenSchema as SolToken2022TokenSchema3,
|
|
2516
|
+
solToken2022TokenId
|
|
2517
|
+
} from "@talismn/chaindata-provider";
|
|
2518
|
+
import { isNotNil as isNotNil3 } from "@talismn/util";
|
|
2519
|
+
import { keyBy as keyBy3, uniq as uniq3 } from "lodash-es";
|
|
2520
|
+
|
|
2521
|
+
// src/modules/sol-token2022/onChainTokenMetadata.ts
|
|
2522
|
+
import { deserializeMetadata as deserializeMetadata2 } from "@metaplex-foundation/mpl-token-metadata";
|
|
2523
|
+
import { publicKey as publicKey2, sol as sol2 } from "@metaplex-foundation/umi";
|
|
2524
|
+
import { MintLayout as MintLayout2 } from "@solana/spl-token";
|
|
2525
|
+
import { PublicKey as PublicKey6 } from "@solana/web3.js";
|
|
2526
|
+
import { parseSolToken2022TokenId, SolToken2022TokenSchema as SolToken2022TokenSchema2 } from "@talismn/chaindata-provider";
|
|
2527
|
+
import z9 from "zod/v4";
|
|
2528
|
+
var TokenCacheSchema4 = z9.discriminatedUnion("isValid", [
|
|
2529
|
+
z9.strictObject({
|
|
2530
|
+
id: SolToken2022TokenSchema2.shape.id,
|
|
2531
|
+
isValid: z9.literal(true),
|
|
2532
|
+
...SolToken2022TokenSchema2.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
|
|
2533
|
+
}),
|
|
2534
|
+
z9.strictObject({
|
|
2535
|
+
id: SolToken2022TokenSchema2.shape.id,
|
|
2536
|
+
isValid: z9.literal(false)
|
|
2537
|
+
})
|
|
2538
|
+
]);
|
|
2539
|
+
var METAPLEX_PROGRAM_ID2 = new PublicKey6("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
|
|
2540
|
+
var ERROR_NO_MINT2 = "No mint info available";
|
|
2541
|
+
var ERROR_NO_METADATA2 = "No metadata account found";
|
|
2542
|
+
var ERROR_INVALID_DATA2 = "Invalid on-chain data";
|
|
2543
|
+
var fetchOnChainTokenData2 = async (connector, tokenId) => {
|
|
2544
|
+
try {
|
|
2545
|
+
const { networkId, mintAddress } = parseSolToken2022TokenId(tokenId);
|
|
2546
|
+
const connection = await connector.getConnection(networkId);
|
|
2547
|
+
if (!connection) {
|
|
2548
|
+
log_default.warn(`No connection found for network ${networkId}`);
|
|
2549
|
+
return null;
|
|
2550
|
+
}
|
|
2551
|
+
const mintPubKey = new PublicKey6(mintAddress);
|
|
2552
|
+
const mintInfo = await connection.getAccountInfo(mintPubKey);
|
|
2553
|
+
if (!mintInfo?.data) throw new Error(ERROR_NO_MINT2);
|
|
2554
|
+
const mint = MintLayout2.decode(mintInfo.data);
|
|
2555
|
+
const token2022Metadata = tryParseToken2022Metadata(mintInfo.data);
|
|
2556
|
+
if (token2022Metadata) {
|
|
2557
|
+
const parsed2 = TokenCacheSchema4.safeParse({
|
|
2558
|
+
id: tokenId,
|
|
2559
|
+
symbol: token2022Metadata.symbol.trim(),
|
|
2560
|
+
name: token2022Metadata.name.trim(),
|
|
2561
|
+
decimals: mint.decimals,
|
|
2562
|
+
isValid: true
|
|
2563
|
+
});
|
|
2564
|
+
if (parsed2.success) return parsed2.data;
|
|
2565
|
+
}
|
|
2566
|
+
const [metadataPDA] = PublicKey6.findProgramAddressSync(
|
|
2567
|
+
[Buffer.from("metadata"), METAPLEX_PROGRAM_ID2.toBuffer(), mintPubKey.toBuffer()],
|
|
2568
|
+
METAPLEX_PROGRAM_ID2
|
|
2569
|
+
);
|
|
2570
|
+
const metadataAccount = await connection.getAccountInfo(new PublicKey6(metadataPDA));
|
|
2571
|
+
if (!metadataAccount) throw new Error(ERROR_NO_METADATA2);
|
|
2572
|
+
const metadata = deserializeMetadata2({
|
|
2573
|
+
publicKey: publicKey2(metadataPDA),
|
|
2574
|
+
executable: metadataAccount.executable,
|
|
2575
|
+
owner: publicKey2(metadataAccount.owner),
|
|
2576
|
+
lamports: sol2(metadataAccount.lamports),
|
|
2577
|
+
data: metadataAccount.data
|
|
2578
|
+
});
|
|
2579
|
+
const parsed = TokenCacheSchema4.safeParse({
|
|
2580
|
+
id: tokenId,
|
|
2581
|
+
symbol: metadata.symbol.trim(),
|
|
2582
|
+
name: metadata.name.trim(),
|
|
2583
|
+
decimals: mint.decimals,
|
|
2584
|
+
isValid: true
|
|
2585
|
+
});
|
|
2586
|
+
if (!parsed.success) throw new Error(ERROR_INVALID_DATA2);
|
|
2587
|
+
return parsed.data;
|
|
2588
|
+
} catch (err) {
|
|
2589
|
+
const msg = err.message;
|
|
2590
|
+
if ([ERROR_NO_MINT2, ERROR_NO_METADATA2, ERROR_INVALID_DATA2].includes(msg))
|
|
2591
|
+
return TokenCacheSchema4.parse({
|
|
2592
|
+
id: tokenId,
|
|
2593
|
+
isValid: false
|
|
2594
|
+
});
|
|
2595
|
+
log_default.warn("Failed to fetch sol-token2022 token data for %s", tokenId, { err });
|
|
2596
|
+
}
|
|
2597
|
+
return null;
|
|
2598
|
+
};
|
|
2599
|
+
var tryParseToken2022Metadata = (data) => {
|
|
2600
|
+
try {
|
|
2601
|
+
const TLV_START = 166;
|
|
2602
|
+
if (data.length <= TLV_START) return null;
|
|
2603
|
+
let offset = TLV_START;
|
|
2604
|
+
while (offset + 4 <= data.length) {
|
|
2605
|
+
const extType = data.readUInt16LE(offset);
|
|
2606
|
+
const extLen = data.readUInt16LE(offset + 2);
|
|
2607
|
+
const extDataStart = offset + 4;
|
|
2608
|
+
if (extType === 19 && extDataStart + extLen <= data.length) {
|
|
2609
|
+
let pos = extDataStart;
|
|
2610
|
+
pos += 64;
|
|
2611
|
+
const readLenPrefixed = () => {
|
|
2612
|
+
if (pos + 4 > data.length) throw new Error("out of bounds");
|
|
2613
|
+
const len = data.readUInt32LE(pos);
|
|
2614
|
+
pos += 4;
|
|
2615
|
+
if (pos + len > data.length) throw new Error("out of bounds");
|
|
2616
|
+
const str = data.subarray(pos, pos + len).toString("utf8");
|
|
2617
|
+
pos += len;
|
|
2618
|
+
return str;
|
|
2619
|
+
};
|
|
2620
|
+
const name = readLenPrefixed();
|
|
2621
|
+
const symbol = readLenPrefixed();
|
|
2622
|
+
const uri = readLenPrefixed();
|
|
2623
|
+
if (name && symbol) return { name, symbol, uri };
|
|
2624
|
+
}
|
|
2625
|
+
offset = extDataStart + extLen;
|
|
2626
|
+
}
|
|
2627
|
+
} catch {
|
|
2628
|
+
}
|
|
2629
|
+
return null;
|
|
2630
|
+
};
|
|
2631
|
+
|
|
2632
|
+
// src/modules/sol-token2022/fetchBalances.ts
|
|
2633
|
+
var TOKEN_2022_PROGRAM_ID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
|
|
2634
|
+
var dynamicTokenMetadataCache2 = /* @__PURE__ */ new Map();
|
|
2635
|
+
var fetchBalances6 = async ({
|
|
2636
|
+
networkId,
|
|
2637
|
+
tokensWithAddresses,
|
|
2638
|
+
connector
|
|
2639
|
+
}) => {
|
|
2640
|
+
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
2641
|
+
const connection = await connector.getConnection(networkId);
|
|
2642
|
+
if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
|
|
2643
|
+
const accountAddresses = uniq3(tokensWithAddresses.flatMap(([, addresses]) => addresses));
|
|
2644
|
+
const knownTokenIds = new Set(tokensWithAddresses.map(([token]) => token.id));
|
|
2645
|
+
const unknownMints = /* @__PURE__ */ new Set();
|
|
2646
|
+
const balancesPerAddress = await Promise.all(
|
|
2647
|
+
accountAddresses.map(async (address) => {
|
|
2648
|
+
const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey7(address), {
|
|
2649
|
+
programId: new PublicKey7(TOKEN_2022_PROGRAM_ID)
|
|
2650
|
+
});
|
|
2651
|
+
const balances = tokenAccounts.value.map((d) => {
|
|
2652
|
+
try {
|
|
2653
|
+
const mintAddress = d.account.data.parsed.info.mint;
|
|
2654
|
+
const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
|
|
2655
|
+
const tokenId = solToken2022TokenId(networkId, mintAddress);
|
|
2656
|
+
if (!knownTokenIds.has(tokenId) && value !== "0") unknownMints.add(mintAddress);
|
|
2657
|
+
return {
|
|
2658
|
+
tokenId,
|
|
2659
|
+
networkId,
|
|
2660
|
+
address,
|
|
2661
|
+
source: MODULE_TYPE6,
|
|
2662
|
+
status: "live",
|
|
2663
|
+
value
|
|
2664
|
+
};
|
|
2665
|
+
} catch {
|
|
2666
|
+
log_default.warn("Failed to parse token amount", {
|
|
2667
|
+
address,
|
|
2668
|
+
d
|
|
2669
|
+
});
|
|
2670
|
+
return null;
|
|
2671
|
+
}
|
|
2672
|
+
}).filter(isNotNil3);
|
|
2673
|
+
setDetectedTokenIds(
|
|
2674
|
+
address,
|
|
2675
|
+
MODULE_TYPE6,
|
|
2676
|
+
balances.map((b) => b.tokenId)
|
|
2677
|
+
);
|
|
2678
|
+
return [address, balances];
|
|
2679
|
+
})
|
|
2680
|
+
);
|
|
2681
|
+
const dynamicTokens = [];
|
|
2682
|
+
if (unknownMints.size) {
|
|
2683
|
+
await Promise.all(
|
|
2684
|
+
Array.from(unknownMints).map(async (mintAddress) => {
|
|
2685
|
+
const tokenId = solToken2022TokenId(networkId, mintAddress);
|
|
2686
|
+
let cached = dynamicTokenMetadataCache2.get(tokenId);
|
|
2687
|
+
if (!cached) {
|
|
2688
|
+
const fetched = await fetchOnChainTokenData2(connector, tokenId);
|
|
2689
|
+
if (fetched) {
|
|
2690
|
+
dynamicTokenMetadataCache2.set(tokenId, fetched);
|
|
2691
|
+
cached = fetched;
|
|
2692
|
+
}
|
|
2693
|
+
}
|
|
2694
|
+
if (!cached || !cached.isValid) return;
|
|
2695
|
+
const token = {
|
|
2696
|
+
id: tokenId,
|
|
2697
|
+
type: MODULE_TYPE6,
|
|
2698
|
+
platform: PLATFORM6,
|
|
2699
|
+
networkId,
|
|
2700
|
+
mintAddress,
|
|
2701
|
+
isDefault: true,
|
|
2702
|
+
symbol: cached.symbol,
|
|
2703
|
+
decimals: cached.decimals,
|
|
2704
|
+
...cached.name !== void 0 ? { name: cached.name } : {},
|
|
2705
|
+
...cached.logo !== void 0 ? { logo: cached.logo } : {}
|
|
2706
|
+
};
|
|
2707
|
+
const parsed = SolToken2022TokenSchema3.safeParse(token);
|
|
2708
|
+
if (!parsed.success) {
|
|
2709
|
+
log_default.warn("Ignoring dynamic sol-token2022 token with invalid schema", { token });
|
|
2710
|
+
return;
|
|
2711
|
+
}
|
|
2712
|
+
dynamicTokens.push(parsed.data);
|
|
2713
|
+
})
|
|
2714
|
+
);
|
|
2715
|
+
}
|
|
2716
|
+
const registeredDynamicIds = new Set(dynamicTokens.map((t) => t.id));
|
|
2717
|
+
const allBalancesByKey = keyBy3(
|
|
2718
|
+
balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),
|
|
2719
|
+
(b) => getBalanceKey2(b.tokenId, b.address)
|
|
2720
|
+
);
|
|
2721
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
2722
|
+
const success = balanceDefs.map((bd) => {
|
|
2723
|
+
const found = allBalancesByKey[getBalanceKey2(bd.token.id, bd.address)];
|
|
2724
|
+
return found ?? {
|
|
2725
|
+
tokenId: bd.token.id,
|
|
2726
|
+
networkId: bd.token.networkId,
|
|
2727
|
+
address: bd.address,
|
|
2728
|
+
source: MODULE_TYPE6,
|
|
2729
|
+
status: "live",
|
|
2730
|
+
value: "0"
|
|
2731
|
+
};
|
|
2732
|
+
});
|
|
2733
|
+
for (const balance of balancesPerAddress.flatMap(([, addressBalances]) => addressBalances)) {
|
|
2734
|
+
if (registeredDynamicIds.has(balance.tokenId)) success.push(balance);
|
|
2735
|
+
}
|
|
2736
|
+
return { success, errors: [], dynamicTokens };
|
|
2737
|
+
};
|
|
2738
|
+
var getBalanceKey2 = (tokenId, address) => `${tokenId}:${address}`;
|
|
2739
|
+
|
|
2740
|
+
// src/modules/sol-token2022/fetchTokens.ts
|
|
2741
|
+
import {
|
|
2742
|
+
SolToken2022TokenSchema as SolToken2022TokenSchema4,
|
|
2743
|
+
solToken2022TokenId as solToken2022TokenId2
|
|
2744
|
+
} from "@talismn/chaindata-provider";
|
|
2745
|
+
import { assign as assign6, omit as omit4 } from "lodash-es";
|
|
2746
|
+
var fetchTokens6 = async ({
|
|
2747
|
+
networkId,
|
|
2748
|
+
tokens,
|
|
2749
|
+
connector,
|
|
2750
|
+
cache
|
|
2751
|
+
}) => {
|
|
2752
|
+
const result = [];
|
|
2753
|
+
for (const tokenConfig of tokens) {
|
|
2754
|
+
const tokenId = solToken2022TokenId2(networkId, tokenConfig.mintAddress);
|
|
2755
|
+
let cached = cache[tokenId] && TokenCacheSchema4.safeParse(cache[tokenId]).data;
|
|
2756
|
+
if (!cached) {
|
|
2757
|
+
const tokenInfo = await fetchOnChainTokenData2(connector, tokenId);
|
|
2758
|
+
if (tokenInfo) cache[tokenId] = tokenInfo;
|
|
2759
|
+
}
|
|
2760
|
+
cached = cache[tokenId] && TokenCacheSchema4.safeParse(cache[tokenId]).data;
|
|
2761
|
+
if (cached?.isValid === false) continue;
|
|
2762
|
+
const base = {
|
|
2763
|
+
id: tokenId,
|
|
2764
|
+
type: MODULE_TYPE6,
|
|
2765
|
+
platform: PLATFORM6,
|
|
2766
|
+
networkId
|
|
2767
|
+
};
|
|
2768
|
+
const token = assign6(
|
|
2769
|
+
base,
|
|
2770
|
+
cached?.isValid ? omit4(cached, ["isValid"]) : {},
|
|
2771
|
+
tokenConfig
|
|
2772
|
+
);
|
|
2773
|
+
const parsed = SolToken2022TokenSchema4.safeParse(token);
|
|
2774
|
+
if (!parsed.success) {
|
|
2775
|
+
log_default.warn("Ignoring token with invalid SolToken2022TokenSchema", {
|
|
2776
|
+
token
|
|
2777
|
+
});
|
|
2778
|
+
continue;
|
|
2779
|
+
}
|
|
2780
|
+
result.push(parsed.data);
|
|
2781
|
+
}
|
|
2782
|
+
return result;
|
|
2783
|
+
};
|
|
2784
|
+
|
|
2785
|
+
// src/modules/sol-token2022/getMiniMetadata.ts
|
|
2786
|
+
var getMiniMetadata6 = () => {
|
|
2787
|
+
throw new Error("MiniMetadata is not supported for solana tokens");
|
|
2788
|
+
};
|
|
2789
|
+
|
|
2790
|
+
// src/modules/sol-token2022/getTransferCallData.ts
|
|
2791
|
+
import {
|
|
2792
|
+
calculateEpochFee,
|
|
2793
|
+
createAssociatedTokenAccountInstruction as createAssociatedTokenAccountInstruction2,
|
|
2794
|
+
createTransferCheckedInstruction,
|
|
2795
|
+
createTransferCheckedWithFeeAndTransferHookInstruction,
|
|
2796
|
+
createTransferCheckedWithFeeInstruction,
|
|
2797
|
+
createTransferCheckedWithTransferHookInstruction,
|
|
2798
|
+
getAccount as getAccount2,
|
|
2799
|
+
getAssociatedTokenAddress as getAssociatedTokenAddress2,
|
|
2800
|
+
getMint,
|
|
2801
|
+
getNonTransferable,
|
|
2802
|
+
getTransferFeeConfig,
|
|
2803
|
+
getTransferHook,
|
|
2804
|
+
TOKEN_2022_PROGRAM_ID as TOKEN_2022_PROGRAM_ID2
|
|
2805
|
+
} from "@solana/spl-token";
|
|
2806
|
+
import { PublicKey as PublicKey8 } from "@solana/web3.js";
|
|
2807
|
+
import { isTokenOfType as isTokenOfType6 } from "@talismn/chaindata-provider";
|
|
2808
|
+
var getTransferCallData6 = async ({ from: from2, to, value, token, connector }) => {
|
|
2809
|
+
if (!isTokenOfType6(token, MODULE_TYPE6))
|
|
2810
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE6}.`);
|
|
2811
|
+
const connection = await connector.getConnection(token.networkId);
|
|
2812
|
+
const mintPubkey = new PublicKey8(token.mintAddress);
|
|
2813
|
+
const fromWallet = new PublicKey8(from2);
|
|
2814
|
+
const toWallet = new PublicKey8(to);
|
|
2815
|
+
const mintAccount = await getMint(connection, mintPubkey, void 0, TOKEN_2022_PROGRAM_ID2);
|
|
2816
|
+
const nonTransferable = getNonTransferable(mintAccount);
|
|
2817
|
+
if (nonTransferable) throw new Error("This token is non-transferable.");
|
|
2818
|
+
const transferFeeConfig = getTransferFeeConfig(mintAccount);
|
|
2819
|
+
const transferHook = getTransferHook(mintAccount);
|
|
2820
|
+
const instructions = [];
|
|
2821
|
+
const fromTokenAccount = await getAssociatedTokenAddress2(
|
|
2822
|
+
mintPubkey,
|
|
2823
|
+
fromWallet,
|
|
2824
|
+
false,
|
|
2825
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2826
|
+
);
|
|
2827
|
+
const toTokenAccount = await getAssociatedTokenAddress2(
|
|
2828
|
+
mintPubkey,
|
|
2829
|
+
toWallet,
|
|
2830
|
+
false,
|
|
2831
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2832
|
+
);
|
|
2833
|
+
if (!await tokenAccountExists2(connection, toTokenAccount)) {
|
|
2834
|
+
instructions.push(
|
|
2835
|
+
createAssociatedTokenAccountInstruction2(
|
|
2836
|
+
fromWallet,
|
|
2837
|
+
toTokenAccount,
|
|
2838
|
+
toWallet,
|
|
2839
|
+
mintPubkey,
|
|
2840
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2841
|
+
)
|
|
2842
|
+
);
|
|
2843
|
+
}
|
|
2844
|
+
const amount = BigInt(value);
|
|
2845
|
+
const transferFee = transferFeeConfig ? await calculateCurrentEpochTransferFee(connection, transferFeeConfig, amount) : 0n;
|
|
2846
|
+
if (transferFeeConfig && transferHook) {
|
|
2847
|
+
instructions.push(
|
|
2848
|
+
await createTransferCheckedWithFeeAndTransferHookInstruction(
|
|
2849
|
+
connection,
|
|
2850
|
+
fromTokenAccount,
|
|
2851
|
+
mintPubkey,
|
|
2852
|
+
toTokenAccount,
|
|
2853
|
+
fromWallet,
|
|
2854
|
+
amount,
|
|
2855
|
+
token.decimals,
|
|
2856
|
+
transferFee,
|
|
2857
|
+
[],
|
|
2858
|
+
void 0,
|
|
2859
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2860
|
+
)
|
|
2861
|
+
);
|
|
2862
|
+
} else if (transferFeeConfig) {
|
|
2863
|
+
instructions.push(
|
|
2864
|
+
createTransferCheckedWithFeeInstruction(
|
|
2865
|
+
fromTokenAccount,
|
|
2866
|
+
mintPubkey,
|
|
2867
|
+
toTokenAccount,
|
|
2868
|
+
fromWallet,
|
|
2869
|
+
amount,
|
|
2870
|
+
token.decimals,
|
|
2871
|
+
transferFee,
|
|
2872
|
+
[],
|
|
2873
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2874
|
+
)
|
|
2875
|
+
);
|
|
2876
|
+
} else if (transferHook) {
|
|
2877
|
+
instructions.push(
|
|
2878
|
+
await createTransferCheckedWithTransferHookInstruction(
|
|
2879
|
+
connection,
|
|
2880
|
+
fromTokenAccount,
|
|
2881
|
+
mintPubkey,
|
|
2882
|
+
toTokenAccount,
|
|
2883
|
+
fromWallet,
|
|
2884
|
+
amount,
|
|
2885
|
+
token.decimals,
|
|
2886
|
+
[],
|
|
2887
|
+
void 0,
|
|
2888
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2889
|
+
)
|
|
2890
|
+
);
|
|
2891
|
+
} else {
|
|
2892
|
+
instructions.push(
|
|
2893
|
+
createTransferCheckedInstruction(
|
|
2894
|
+
fromTokenAccount,
|
|
2895
|
+
mintPubkey,
|
|
2896
|
+
toTokenAccount,
|
|
2897
|
+
fromWallet,
|
|
2898
|
+
amount,
|
|
2899
|
+
token.decimals,
|
|
2900
|
+
[],
|
|
2901
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2902
|
+
)
|
|
2903
|
+
);
|
|
2904
|
+
}
|
|
2905
|
+
return instructions;
|
|
2906
|
+
};
|
|
2907
|
+
var tokenAccountExists2 = async (connection, address) => {
|
|
2908
|
+
try {
|
|
2909
|
+
await getAccount2(connection, address, void 0, TOKEN_2022_PROGRAM_ID2);
|
|
2910
|
+
return true;
|
|
2911
|
+
} catch {
|
|
2912
|
+
return false;
|
|
2913
|
+
}
|
|
2914
|
+
};
|
|
2915
|
+
var calculateToken2022TransferFee = (transferFeeConfig, epoch, amount) => {
|
|
2916
|
+
return calculateEpochFee(transferFeeConfig, epoch, amount);
|
|
2917
|
+
};
|
|
2918
|
+
var calculateCurrentEpochTransferFee = async (connection, transferFeeConfig, amount) => {
|
|
2919
|
+
const { epoch } = await connection.getEpochInfo();
|
|
2920
|
+
return calculateToken2022TransferFee(transferFeeConfig, BigInt(epoch), amount);
|
|
2921
|
+
};
|
|
2922
|
+
|
|
2923
|
+
// src/modules/sol-token2022/subscribeBalances.ts
|
|
2924
|
+
import { isEqual as isEqual7 } from "lodash-es";
|
|
2925
|
+
import { distinctUntilChanged as distinctUntilChanged7, Observable as Observable7, of as of7 } from "rxjs";
|
|
2926
|
+
var SUBSCRIPTION_INTERVAL6 = 6e3;
|
|
2927
|
+
var subscribeBalances6 = ({
|
|
2928
|
+
networkId,
|
|
2929
|
+
tokensWithAddresses,
|
|
2930
|
+
connector
|
|
2931
|
+
}) => {
|
|
2932
|
+
if (!tokensWithAddresses.length) return of7({ success: [], errors: [] });
|
|
2933
|
+
return new Observable7((subscriber) => {
|
|
2934
|
+
const abortController = new AbortController();
|
|
2935
|
+
const poll = async () => {
|
|
2936
|
+
try {
|
|
2937
|
+
if (abortController.signal.aborted) return;
|
|
2938
|
+
const balances = await fetchBalances6({
|
|
2939
|
+
networkId,
|
|
2940
|
+
tokensWithAddresses,
|
|
2941
|
+
connector
|
|
2942
|
+
});
|
|
2943
|
+
if (abortController.signal.aborted) return;
|
|
2944
|
+
subscriber.next(balances);
|
|
2945
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL6);
|
|
2946
|
+
} catch (error) {
|
|
2947
|
+
log_default.error("Error", {
|
|
2948
|
+
module: MODULE_TYPE6,
|
|
2949
|
+
networkId,
|
|
2950
|
+
addressesByToken: tokensWithAddresses,
|
|
2951
|
+
error
|
|
2952
|
+
});
|
|
2953
|
+
subscriber.error(error);
|
|
2954
|
+
}
|
|
2955
|
+
};
|
|
2956
|
+
poll();
|
|
2957
|
+
return () => {
|
|
2958
|
+
abortController.abort();
|
|
2959
|
+
};
|
|
2960
|
+
}).pipe(distinctUntilChanged7(isEqual7));
|
|
2961
|
+
};
|
|
2962
|
+
|
|
2963
|
+
// src/modules/sol-token2022/module.ts
|
|
2964
|
+
var SolToken2022BalanceModule = {
|
|
2965
|
+
type: MODULE_TYPE6,
|
|
2966
|
+
platform: PLATFORM6,
|
|
2967
|
+
getMiniMetadata: getMiniMetadata6,
|
|
2968
|
+
fetchTokens: fetchTokens6,
|
|
2969
|
+
fetchBalances: fetchBalances6,
|
|
2970
|
+
subscribeBalances: subscribeBalances6,
|
|
2971
|
+
getTransferCallData: getTransferCallData6
|
|
2972
|
+
};
|
|
2973
|
+
|
|
2974
|
+
// src/modules/sol-token2022/types.ts
|
|
2975
|
+
import { SolToken2022TokenSchema as SolToken2022TokenSchema5 } from "@talismn/chaindata-provider";
|
|
2976
|
+
import z10 from "zod/v4";
|
|
2977
|
+
var SolToken2022TokenConfigSchema = z10.strictObject({
|
|
2978
|
+
mintAddress: SolToken2022TokenSchema5.shape.mintAddress,
|
|
2464
2979
|
...TokenConfigBaseSchema.shape
|
|
2465
2980
|
});
|
|
2466
2981
|
|
|
2467
2982
|
// src/modules/substrate-assets/config.ts
|
|
2468
2983
|
import { SubAssetsTokenSchema } from "@talismn/chaindata-provider";
|
|
2469
|
-
var
|
|
2470
|
-
var
|
|
2984
|
+
var MODULE_TYPE7 = SubAssetsTokenSchema.shape.type.value;
|
|
2985
|
+
var PLATFORM7 = SubAssetsTokenSchema.shape.platform.value;
|
|
2471
2986
|
|
|
2472
2987
|
// src/modules/substrate-assets/buildQueries.ts
|
|
2473
2988
|
import { decodeScale } from "@talismn/scale";
|
|
2474
|
-
import { isNotNil as
|
|
2989
|
+
import { isNotNil as isNotNil4 } from "@talismn/util";
|
|
2475
2990
|
var buildQueries = (networkId, balanceDefs, miniMetadata) => {
|
|
2476
2991
|
const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
|
|
2477
2992
|
storage: ["Assets", "Account"]
|
|
@@ -2520,7 +3035,7 @@ var buildQueries = (networkId, balanceDefs, miniMetadata) => {
|
|
|
2520
3035
|
stateKeys: [stateKey],
|
|
2521
3036
|
decodeResult
|
|
2522
3037
|
};
|
|
2523
|
-
}).filter(
|
|
3038
|
+
}).filter(isNotNil4);
|
|
2524
3039
|
};
|
|
2525
3040
|
var tryEncode = (scaleCoder, ...args) => {
|
|
2526
3041
|
try {
|
|
@@ -2531,7 +3046,7 @@ var tryEncode = (scaleCoder, ...args) => {
|
|
|
2531
3046
|
};
|
|
2532
3047
|
|
|
2533
3048
|
// src/modules/substrate-assets/fetchBalances.ts
|
|
2534
|
-
var
|
|
3049
|
+
var fetchBalances7 = async ({
|
|
2535
3050
|
networkId,
|
|
2536
3051
|
tokensWithAddresses,
|
|
2537
3052
|
connector,
|
|
@@ -2540,7 +3055,7 @@ var fetchBalances6 = async ({
|
|
|
2540
3055
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
2541
3056
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
2542
3057
|
if (!miniMetadata?.data) {
|
|
2543
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
3058
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE7} balances on ${networkId}.`);
|
|
2544
3059
|
return {
|
|
2545
3060
|
success: [],
|
|
2546
3061
|
errors: balanceDefs.map((def) => ({
|
|
@@ -2550,20 +3065,20 @@ var fetchBalances6 = async ({
|
|
|
2550
3065
|
}))
|
|
2551
3066
|
};
|
|
2552
3067
|
}
|
|
2553
|
-
if (miniMetadata.source !==
|
|
2554
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
3068
|
+
if (miniMetadata.source !== MODULE_TYPE7) {
|
|
3069
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE7}.`);
|
|
2555
3070
|
return {
|
|
2556
3071
|
success: [],
|
|
2557
3072
|
errors: balanceDefs.map((def) => ({
|
|
2558
3073
|
tokenId: def.token.id,
|
|
2559
3074
|
address: def.address,
|
|
2560
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
3075
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE7}`)
|
|
2561
3076
|
}))
|
|
2562
3077
|
};
|
|
2563
3078
|
}
|
|
2564
3079
|
if (miniMetadata.chainId !== networkId) {
|
|
2565
3080
|
log_default.warn(
|
|
2566
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
3081
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE7}. Expected chainId is ${networkId}`
|
|
2567
3082
|
);
|
|
2568
3083
|
return {
|
|
2569
3084
|
success: [],
|
|
@@ -2587,7 +3102,7 @@ var fetchBalances6 = async ({
|
|
|
2587
3102
|
address: def.address,
|
|
2588
3103
|
networkId,
|
|
2589
3104
|
tokenId: def.token.id,
|
|
2590
|
-
source:
|
|
3105
|
+
source: MODULE_TYPE7,
|
|
2591
3106
|
status: "live",
|
|
2592
3107
|
values: [
|
|
2593
3108
|
{ type: "free", label: "free", amount: "0" },
|
|
@@ -2606,8 +3121,8 @@ import {
|
|
|
2606
3121
|
subAssetTokenId
|
|
2607
3122
|
} from "@talismn/chaindata-provider";
|
|
2608
3123
|
import { getStorageKeyPrefix, parseMetadataRpc as parseMetadataRpc3 } from "@talismn/scale";
|
|
2609
|
-
import { assign as
|
|
2610
|
-
var
|
|
3124
|
+
import { assign as assign7, keyBy as keyBy4, keys } from "lodash-es";
|
|
3125
|
+
var fetchTokens7 = async ({
|
|
2611
3126
|
networkId,
|
|
2612
3127
|
tokens,
|
|
2613
3128
|
connector,
|
|
@@ -2632,7 +3147,7 @@ var fetchTokens6 = async ({
|
|
|
2632
3147
|
]);
|
|
2633
3148
|
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
|
2634
3149
|
const metadataStorageEntries = metadataStorageResults.length ? metadataStorageResults[0].changes : [];
|
|
2635
|
-
const assetByAssetId =
|
|
3150
|
+
const assetByAssetId = keyBy4(
|
|
2636
3151
|
assetStorageEntries.map(([key, value]) => {
|
|
2637
3152
|
const [assetId] = assetCodec.keys.dec(key);
|
|
2638
3153
|
const asset = assetCodec.value.dec(value);
|
|
@@ -2640,7 +3155,7 @@ var fetchTokens6 = async ({
|
|
|
2640
3155
|
}),
|
|
2641
3156
|
(a) => a.assetId
|
|
2642
3157
|
);
|
|
2643
|
-
const metadataByAssetId =
|
|
3158
|
+
const metadataByAssetId = keyBy4(
|
|
2644
3159
|
metadataStorageEntries.map(([key, value]) => {
|
|
2645
3160
|
const [assetId] = metadataCodec.keys.dec(key);
|
|
2646
3161
|
const metadata = metadataCodec.value.dec(value);
|
|
@@ -2655,13 +3170,13 @@ var fetchTokens6 = async ({
|
|
|
2655
3170
|
(a) => a.assetId
|
|
2656
3171
|
);
|
|
2657
3172
|
const allTokens = keys(assetByAssetId).map(
|
|
2658
|
-
(assetId) =>
|
|
3173
|
+
(assetId) => assign7({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? void 0)
|
|
2659
3174
|
);
|
|
2660
|
-
const configTokenByAssetId =
|
|
3175
|
+
const configTokenByAssetId = keyBy4(tokens, (t) => t.assetId);
|
|
2661
3176
|
return allTokens.map(
|
|
2662
3177
|
(asset) => ({
|
|
2663
3178
|
id: subAssetTokenId(networkId, String(asset.assetId)),
|
|
2664
|
-
type:
|
|
3179
|
+
type: MODULE_TYPE7,
|
|
2665
3180
|
platform: "polkadot",
|
|
2666
3181
|
networkId,
|
|
2667
3182
|
assetId: String(asset.assetId),
|
|
@@ -2678,7 +3193,7 @@ var fetchTokens6 = async ({
|
|
|
2678
3193
|
return configToken || token.isSufficient;
|
|
2679
3194
|
}).map((token) => {
|
|
2680
3195
|
const configToken = configTokenByAssetId[token.assetId];
|
|
2681
|
-
return configToken ?
|
|
3196
|
+
return configToken ? assign7({}, token, configToken) : token;
|
|
2682
3197
|
}).filter((t) => {
|
|
2683
3198
|
const parsed = SubAssetsTokenSchema2.safeParse(t);
|
|
2684
3199
|
return parsed.success;
|
|
@@ -2754,8 +3269,8 @@ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
|
|
|
2754
3269
|
|
|
2755
3270
|
// src/modules/substrate-dtao/config.ts
|
|
2756
3271
|
import { SubDTaoTokenSchema } from "@talismn/chaindata-provider";
|
|
2757
|
-
var
|
|
2758
|
-
var
|
|
3272
|
+
var MODULE_TYPE8 = SubDTaoTokenSchema.shape.type.value;
|
|
3273
|
+
var PLATFORM8 = SubDTaoTokenSchema.shape.platform.value;
|
|
2759
3274
|
|
|
2760
3275
|
// src/modules/substrate-dtao/fetchBalances.ts
|
|
2761
3276
|
import {
|
|
@@ -2764,8 +3279,8 @@ import {
|
|
|
2764
3279
|
TokenSchema
|
|
2765
3280
|
} from "@talismn/chaindata-provider";
|
|
2766
3281
|
import { decodeScale as decodeScale2, parseMetadataRpc as parseMetadataRpc4 } from "@talismn/scale";
|
|
2767
|
-
import { isNotNil as
|
|
2768
|
-
import { keyBy as
|
|
3282
|
+
import { isNotNil as isNotNil5 } from "@talismn/util";
|
|
3283
|
+
import { keyBy as keyBy5, uniq as uniq4 } from "lodash-es";
|
|
2769
3284
|
|
|
2770
3285
|
// src/modules/substrate-dtao/calculatePendingRootClaimable.ts
|
|
2771
3286
|
import { subDTaoTokenId } from "@talismn/chaindata-provider";
|
|
@@ -2804,7 +3319,7 @@ var calculatePendingRootClaimable = ({
|
|
|
2804
3319
|
|
|
2805
3320
|
// src/modules/substrate-dtao/fetchBalances.ts
|
|
2806
3321
|
var ROOT_NETUID = 0;
|
|
2807
|
-
var
|
|
3322
|
+
var fetchBalances8 = async ({
|
|
2808
3323
|
networkId,
|
|
2809
3324
|
tokensWithAddresses,
|
|
2810
3325
|
connector,
|
|
@@ -2813,7 +3328,7 @@ var fetchBalances7 = async ({
|
|
|
2813
3328
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
2814
3329
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
2815
3330
|
if (!miniMetadata?.data) {
|
|
2816
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
3331
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE8} balances on ${networkId}.`, {
|
|
2817
3332
|
tokensWithAddresses
|
|
2818
3333
|
});
|
|
2819
3334
|
return {
|
|
@@ -2825,20 +3340,20 @@ var fetchBalances7 = async ({
|
|
|
2825
3340
|
}))
|
|
2826
3341
|
};
|
|
2827
3342
|
}
|
|
2828
|
-
if (miniMetadata.source !==
|
|
2829
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
3343
|
+
if (miniMetadata.source !== MODULE_TYPE8) {
|
|
3344
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE8}.`);
|
|
2830
3345
|
return {
|
|
2831
3346
|
success: [],
|
|
2832
3347
|
errors: balanceDefs.map((def) => ({
|
|
2833
3348
|
tokenId: def.token.id,
|
|
2834
3349
|
address: def.address,
|
|
2835
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
3350
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE8}`)
|
|
2836
3351
|
}))
|
|
2837
3352
|
};
|
|
2838
3353
|
}
|
|
2839
3354
|
if (miniMetadata.chainId !== networkId) {
|
|
2840
3355
|
log_default.warn(
|
|
2841
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
3356
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE8}. Expected chainId is ${networkId}`
|
|
2842
3357
|
);
|
|
2843
3358
|
return {
|
|
2844
3359
|
success: [],
|
|
@@ -2849,7 +3364,7 @@ var fetchBalances7 = async ({
|
|
|
2849
3364
|
}))
|
|
2850
3365
|
};
|
|
2851
3366
|
}
|
|
2852
|
-
const addresses =
|
|
3367
|
+
const addresses = uniq4(balanceDefs.map((def) => def.address));
|
|
2853
3368
|
try {
|
|
2854
3369
|
const [stakeInfos, dynamicInfos] = await Promise.all([
|
|
2855
3370
|
fetchRuntimeCallResult(
|
|
@@ -2869,7 +3384,7 @@ var fetchBalances7 = async ({
|
|
|
2869
3384
|
[]
|
|
2870
3385
|
)
|
|
2871
3386
|
]);
|
|
2872
|
-
const rootHotkeys =
|
|
3387
|
+
const rootHotkeys = uniq4(
|
|
2873
3388
|
stakeInfos.flatMap(
|
|
2874
3389
|
([, stakes]) => stakes.filter((stake) => stake.netuid === ROOT_NETUID).map((stake) => stake.hotkey)
|
|
2875
3390
|
)
|
|
@@ -2894,7 +3409,7 @@ var fetchBalances7 = async ({
|
|
|
2894
3409
|
miniMetadata.data,
|
|
2895
3410
|
addressHotkeyNetuidPairs
|
|
2896
3411
|
) : /* @__PURE__ */ new Map();
|
|
2897
|
-
const dynamicInfoByNetuid =
|
|
3412
|
+
const dynamicInfoByNetuid = keyBy5(dynamicInfos.filter(isNotNil5), (info) => info.netuid);
|
|
2898
3413
|
const upsertBalance = (acc, address, tokenId, balance) => {
|
|
2899
3414
|
const key = `${address}:${tokenId}`;
|
|
2900
3415
|
const recordedBalance = acc[key];
|
|
@@ -2948,7 +3463,7 @@ var fetchBalances7 = async ({
|
|
|
2948
3463
|
{}
|
|
2949
3464
|
);
|
|
2950
3465
|
const balances = Object.values(balancesRaw);
|
|
2951
|
-
const tokensById =
|
|
3466
|
+
const tokensById = keyBy5(
|
|
2952
3467
|
tokensWithAddresses.map(([token]) => token),
|
|
2953
3468
|
(t) => t.id
|
|
2954
3469
|
);
|
|
@@ -3002,7 +3517,7 @@ var fetchBalances7 = async ({
|
|
|
3002
3517
|
address: def.address,
|
|
3003
3518
|
networkId,
|
|
3004
3519
|
tokenId: def.token.id,
|
|
3005
|
-
source:
|
|
3520
|
+
source: MODULE_TYPE8,
|
|
3006
3521
|
status: "live",
|
|
3007
3522
|
values: values3
|
|
3008
3523
|
};
|
|
@@ -3174,13 +3689,13 @@ import {
|
|
|
3174
3689
|
subDTaoTokenId as subDTaoTokenId3
|
|
3175
3690
|
} from "@talismn/chaindata-provider";
|
|
3176
3691
|
import { getStorageKeyPrefix as getStorageKeyPrefix2, parseMetadataRpc as parseMetadataRpc5 } from "@talismn/scale";
|
|
3177
|
-
import { isNotNil as
|
|
3692
|
+
import { isNotNil as isNotNil6 } from "@talismn/util";
|
|
3178
3693
|
import { fromPairs } from "lodash-es";
|
|
3179
3694
|
var NATIVE_TOKEN_SYMBOLS = {
|
|
3180
3695
|
"bittensor": "TAO",
|
|
3181
3696
|
"bittensor-testnet": "testTAO"
|
|
3182
3697
|
};
|
|
3183
|
-
var
|
|
3698
|
+
var fetchTokens8 = async ({
|
|
3184
3699
|
networkId,
|
|
3185
3700
|
connector,
|
|
3186
3701
|
tokens,
|
|
@@ -3199,7 +3714,7 @@ var fetchTokens7 = async ({
|
|
|
3199
3714
|
[]
|
|
3200
3715
|
)
|
|
3201
3716
|
]);
|
|
3202
|
-
return dynamicInfos.filter(
|
|
3717
|
+
return dynamicInfos.filter(isNotNil6).map((info) => {
|
|
3203
3718
|
const config = tokens.find((t) => t.netuid === info.netuid);
|
|
3204
3719
|
let symbol = new TextDecoder().decode(Uint8Array.from(info.token_symbol));
|
|
3205
3720
|
const subnetName = info.subnet_identity?.subnet_name?.asText() ?? (info.netuid === 0 ? "Root" : `Subnet ${info.netuid}`);
|
|
@@ -3209,8 +3724,8 @@ var fetchTokens7 = async ({
|
|
|
3209
3724
|
const isTransferable = transferableTokensMap[info.netuid] ?? true;
|
|
3210
3725
|
const token = {
|
|
3211
3726
|
id: subDTaoTokenId3(networkId, info.netuid),
|
|
3212
|
-
type:
|
|
3213
|
-
platform:
|
|
3727
|
+
type: MODULE_TYPE8,
|
|
3728
|
+
platform: PLATFORM8,
|
|
3214
3729
|
networkId,
|
|
3215
3730
|
netuid: info.netuid,
|
|
3216
3731
|
isDefault: true,
|
|
@@ -3250,12 +3765,12 @@ var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
|
|
|
3250
3765
|
// src/modules/substrate-dtao/getMiniMetadata.ts
|
|
3251
3766
|
import { MINIMETADATA_VERSION } from "@talismn/chaindata-provider";
|
|
3252
3767
|
import { compactMetadata, encodeMetadata, parseMetadataRpc as parseMetadataRpc6 } from "@talismn/scale";
|
|
3253
|
-
var
|
|
3768
|
+
var getMiniMetadata7 = ({
|
|
3254
3769
|
networkId,
|
|
3255
3770
|
specVersion,
|
|
3256
3771
|
metadataRpc
|
|
3257
3772
|
}) => {
|
|
3258
|
-
const source =
|
|
3773
|
+
const source = MODULE_TYPE8;
|
|
3259
3774
|
const chainId = networkId;
|
|
3260
3775
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
3261
3776
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -3301,18 +3816,18 @@ var getData = (metadataRpc) => {
|
|
|
3301
3816
|
|
|
3302
3817
|
// src/modules/substrate-dtao/getTransferCallData.ts
|
|
3303
3818
|
import { mergeUint8 } from "@polkadot-api/utils";
|
|
3304
|
-
import { isTokenOfType as
|
|
3819
|
+
import { isTokenOfType as isTokenOfType7, parseSubDTaoTokenId } from "@talismn/chaindata-provider";
|
|
3305
3820
|
import { parseMetadataRpc as parseMetadataRpc7 } from "@talismn/scale";
|
|
3306
3821
|
import { Binary } from "polkadot-api";
|
|
3307
|
-
var
|
|
3822
|
+
var getTransferCallData7 = ({
|
|
3308
3823
|
from: from2,
|
|
3309
3824
|
to,
|
|
3310
3825
|
value,
|
|
3311
3826
|
token,
|
|
3312
3827
|
metadataRpc
|
|
3313
3828
|
}) => {
|
|
3314
|
-
if (!
|
|
3315
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
3829
|
+
if (!isTokenOfType7(token, MODULE_TYPE8))
|
|
3830
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE8}.`);
|
|
3316
3831
|
const { netuid: subnetId, hotkey } = parseSubDTaoTokenId(token.id);
|
|
3317
3832
|
if (!hotkey) throw new Error(`Missing hotkey`);
|
|
3318
3833
|
const { builder } = parseMetadataRpc7(metadataRpc);
|
|
@@ -3332,22 +3847,22 @@ var getTransferCallData6 = ({
|
|
|
3332
3847
|
};
|
|
3333
3848
|
|
|
3334
3849
|
// src/modules/substrate-dtao/subscribeBalances.ts
|
|
3335
|
-
import { isEqual as
|
|
3336
|
-
import { distinctUntilChanged as
|
|
3337
|
-
var
|
|
3338
|
-
var
|
|
3850
|
+
import { isEqual as isEqual8 } from "lodash-es";
|
|
3851
|
+
import { distinctUntilChanged as distinctUntilChanged8, Observable as Observable8, of as of8 } from "rxjs";
|
|
3852
|
+
var SUBSCRIPTION_INTERVAL7 = 6e3;
|
|
3853
|
+
var subscribeBalances7 = ({
|
|
3339
3854
|
networkId,
|
|
3340
3855
|
tokensWithAddresses,
|
|
3341
3856
|
connector,
|
|
3342
3857
|
miniMetadata
|
|
3343
3858
|
}) => {
|
|
3344
|
-
if (!tokensWithAddresses.length) return
|
|
3345
|
-
return new
|
|
3859
|
+
if (!tokensWithAddresses.length) return of8({ success: [], errors: [] });
|
|
3860
|
+
return new Observable8((subscriber) => {
|
|
3346
3861
|
const abortController = new AbortController();
|
|
3347
3862
|
const poll = async () => {
|
|
3348
3863
|
try {
|
|
3349
3864
|
if (abortController.signal.aborted) return;
|
|
3350
|
-
const balances = await
|
|
3865
|
+
const balances = await fetchBalances8({
|
|
3351
3866
|
networkId,
|
|
3352
3867
|
tokensWithAddresses,
|
|
3353
3868
|
connector,
|
|
@@ -3355,10 +3870,10 @@ var subscribeBalances6 = ({
|
|
|
3355
3870
|
});
|
|
3356
3871
|
if (abortController.signal.aborted) return;
|
|
3357
3872
|
subscriber.next(balances);
|
|
3358
|
-
setTimeout(poll,
|
|
3873
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL7);
|
|
3359
3874
|
} catch (error) {
|
|
3360
3875
|
log_default.error("Error", {
|
|
3361
|
-
module:
|
|
3876
|
+
module: MODULE_TYPE8,
|
|
3362
3877
|
networkId,
|
|
3363
3878
|
miniMetadata,
|
|
3364
3879
|
addressesByToken: tokensWithAddresses,
|
|
@@ -3371,24 +3886,24 @@ var subscribeBalances6 = ({
|
|
|
3371
3886
|
return () => {
|
|
3372
3887
|
abortController.abort();
|
|
3373
3888
|
};
|
|
3374
|
-
}).pipe(
|
|
3889
|
+
}).pipe(distinctUntilChanged8(isEqual8));
|
|
3375
3890
|
};
|
|
3376
3891
|
|
|
3377
3892
|
// src/modules/substrate-dtao/module.ts
|
|
3378
3893
|
var SubDTaoBalanceModule = {
|
|
3379
|
-
type:
|
|
3380
|
-
platform:
|
|
3381
|
-
getMiniMetadata:
|
|
3382
|
-
fetchTokens:
|
|
3383
|
-
fetchBalances:
|
|
3384
|
-
subscribeBalances:
|
|
3385
|
-
getTransferCallData:
|
|
3894
|
+
type: MODULE_TYPE8,
|
|
3895
|
+
platform: PLATFORM8,
|
|
3896
|
+
getMiniMetadata: getMiniMetadata7,
|
|
3897
|
+
fetchTokens: fetchTokens8,
|
|
3898
|
+
fetchBalances: fetchBalances8,
|
|
3899
|
+
subscribeBalances: subscribeBalances7,
|
|
3900
|
+
getTransferCallData: getTransferCallData7
|
|
3386
3901
|
};
|
|
3387
3902
|
|
|
3388
3903
|
// src/modules/substrate-dtao/types.ts
|
|
3389
3904
|
import { SubDTaoTokenSchema as SubDTaoTokenSchema3 } from "@talismn/chaindata-provider";
|
|
3390
|
-
import
|
|
3391
|
-
var SubDTaoTokenConfigSchema =
|
|
3905
|
+
import z11 from "zod/v4";
|
|
3906
|
+
var SubDTaoTokenConfigSchema = z11.strictObject({
|
|
3392
3907
|
netuid: SubDTaoTokenSchema3.shape.netuid,
|
|
3393
3908
|
...TokenConfigBaseSchema.shape
|
|
3394
3909
|
});
|
|
@@ -4056,12 +4571,12 @@ var deriveMiniMetadataId = ({
|
|
|
4056
4571
|
).slice(-32);
|
|
4057
4572
|
|
|
4058
4573
|
// src/modules/substrate-assets/getMiniMetadata.ts
|
|
4059
|
-
var
|
|
4574
|
+
var getMiniMetadata8 = ({
|
|
4060
4575
|
networkId,
|
|
4061
4576
|
specVersion,
|
|
4062
4577
|
metadataRpc
|
|
4063
4578
|
}) => {
|
|
4064
|
-
const source =
|
|
4579
|
+
const source = MODULE_TYPE7;
|
|
4065
4580
|
const chainId = networkId;
|
|
4066
4581
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
4067
4582
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -4093,10 +4608,10 @@ var getData2 = (metadataRpc) => {
|
|
|
4093
4608
|
|
|
4094
4609
|
// src/modules/substrate-assets/getTransferCallData.ts
|
|
4095
4610
|
import { mergeUint8 as mergeUint82 } from "@polkadot-api/utils";
|
|
4096
|
-
import { isTokenOfType as
|
|
4611
|
+
import { isTokenOfType as isTokenOfType8 } from "@talismn/chaindata-provider";
|
|
4097
4612
|
import { parseMetadataRpc as parseMetadataRpc9 } from "@talismn/scale";
|
|
4098
4613
|
import { Binary as Binary2, Enum } from "polkadot-api";
|
|
4099
|
-
var
|
|
4614
|
+
var getTransferCallData8 = ({
|
|
4100
4615
|
from: from2,
|
|
4101
4616
|
to,
|
|
4102
4617
|
value,
|
|
@@ -4104,8 +4619,8 @@ var getTransferCallData7 = ({
|
|
|
4104
4619
|
type,
|
|
4105
4620
|
metadataRpc
|
|
4106
4621
|
}) => {
|
|
4107
|
-
if (!
|
|
4108
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
4622
|
+
if (!isTokenOfType8(token, MODULE_TYPE7))
|
|
4623
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE7}.`);
|
|
4109
4624
|
const { builder } = parseMetadataRpc9(metadataRpc);
|
|
4110
4625
|
const method = getTransferMethod(type);
|
|
4111
4626
|
const { codec, location } = builder.buildCall("Assets", method);
|
|
@@ -4194,14 +4709,14 @@ var getTransferAllEncodedArgs = (assetId, to, codec) => {
|
|
|
4194
4709
|
};
|
|
4195
4710
|
|
|
4196
4711
|
// src/modules/substrate-assets/subscribeBalances.ts
|
|
4197
|
-
import { map as map2, of as
|
|
4198
|
-
var
|
|
4712
|
+
import { map as map2, of as of9 } from "rxjs";
|
|
4713
|
+
var subscribeBalances8 = ({
|
|
4199
4714
|
networkId,
|
|
4200
4715
|
tokensWithAddresses,
|
|
4201
4716
|
connector,
|
|
4202
4717
|
miniMetadata
|
|
4203
4718
|
}) => {
|
|
4204
|
-
if (!tokensWithAddresses.length) return
|
|
4719
|
+
if (!tokensWithAddresses.length) return of9({ success: [], errors: [] });
|
|
4205
4720
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4206
4721
|
const queries = buildQueries(networkId, balanceDefs, miniMetadata);
|
|
4207
4722
|
return getRpcQueryPack$(connector, networkId, queries).pipe(
|
|
@@ -4214,31 +4729,31 @@ var subscribeBalances7 = ({
|
|
|
4214
4729
|
|
|
4215
4730
|
// src/modules/substrate-assets/module.ts
|
|
4216
4731
|
var SubAssetsBalanceModule = {
|
|
4217
|
-
type:
|
|
4218
|
-
platform:
|
|
4219
|
-
getMiniMetadata:
|
|
4220
|
-
fetchTokens:
|
|
4221
|
-
fetchBalances:
|
|
4222
|
-
subscribeBalances:
|
|
4223
|
-
getTransferCallData:
|
|
4732
|
+
type: MODULE_TYPE7,
|
|
4733
|
+
platform: PLATFORM7,
|
|
4734
|
+
getMiniMetadata: getMiniMetadata8,
|
|
4735
|
+
fetchTokens: fetchTokens7,
|
|
4736
|
+
fetchBalances: fetchBalances7,
|
|
4737
|
+
subscribeBalances: subscribeBalances8,
|
|
4738
|
+
getTransferCallData: getTransferCallData8
|
|
4224
4739
|
};
|
|
4225
4740
|
|
|
4226
4741
|
// src/modules/substrate-assets/types.ts
|
|
4227
4742
|
import { SubAssetsTokenSchema as SubAssetsTokenSchema3 } from "@talismn/chaindata-provider";
|
|
4228
|
-
import
|
|
4229
|
-
var SubAssetsTokenConfigSchema =
|
|
4743
|
+
import z12 from "zod/v4";
|
|
4744
|
+
var SubAssetsTokenConfigSchema = z12.strictObject({
|
|
4230
4745
|
assetId: SubAssetsTokenSchema3.shape.assetId,
|
|
4231
4746
|
...TokenConfigBaseSchema.shape
|
|
4232
4747
|
});
|
|
4233
4748
|
|
|
4234
4749
|
// src/modules/substrate-foreignassets/config.ts
|
|
4235
4750
|
import { SubForeignAssetsTokenSchema } from "@talismn/chaindata-provider";
|
|
4236
|
-
var
|
|
4237
|
-
var
|
|
4751
|
+
var MODULE_TYPE9 = SubForeignAssetsTokenSchema.shape.type.value;
|
|
4752
|
+
var PLATFORM9 = SubForeignAssetsTokenSchema.shape.platform.value;
|
|
4238
4753
|
|
|
4239
4754
|
// src/modules/substrate-foreignassets/buildQueries.ts
|
|
4240
4755
|
import { decodeScale as decodeScale3, papiParse } from "@talismn/scale";
|
|
4241
|
-
import { isNotNil as
|
|
4756
|
+
import { isNotNil as isNotNil7 } from "@talismn/util";
|
|
4242
4757
|
var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
|
|
4243
4758
|
const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
|
|
4244
4759
|
storage: ["ForeignAssets", "Account"]
|
|
@@ -4293,11 +4808,11 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
4293
4808
|
stateKeys: [stateKey],
|
|
4294
4809
|
decodeResult
|
|
4295
4810
|
};
|
|
4296
|
-
}).filter(
|
|
4811
|
+
}).filter(isNotNil7);
|
|
4297
4812
|
};
|
|
4298
4813
|
|
|
4299
4814
|
// src/modules/substrate-foreignassets/fetchBalances.ts
|
|
4300
|
-
var
|
|
4815
|
+
var fetchBalances9 = async ({
|
|
4301
4816
|
networkId,
|
|
4302
4817
|
tokensWithAddresses,
|
|
4303
4818
|
connector,
|
|
@@ -4306,7 +4821,7 @@ var fetchBalances8 = async ({
|
|
|
4306
4821
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
4307
4822
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4308
4823
|
if (!miniMetadata?.data) {
|
|
4309
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
4824
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE9} balances on ${networkId}.`);
|
|
4310
4825
|
return {
|
|
4311
4826
|
success: [],
|
|
4312
4827
|
errors: balanceDefs.map((def) => ({
|
|
@@ -4316,20 +4831,20 @@ var fetchBalances8 = async ({
|
|
|
4316
4831
|
}))
|
|
4317
4832
|
};
|
|
4318
4833
|
}
|
|
4319
|
-
if (miniMetadata.source !==
|
|
4320
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
4834
|
+
if (miniMetadata.source !== MODULE_TYPE9) {
|
|
4835
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE9}.`);
|
|
4321
4836
|
return {
|
|
4322
4837
|
success: [],
|
|
4323
4838
|
errors: balanceDefs.map((def) => ({
|
|
4324
4839
|
tokenId: def.token.id,
|
|
4325
4840
|
address: def.address,
|
|
4326
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
4841
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE9}`)
|
|
4327
4842
|
}))
|
|
4328
4843
|
};
|
|
4329
4844
|
}
|
|
4330
4845
|
if (miniMetadata.chainId !== networkId) {
|
|
4331
4846
|
log_default.warn(
|
|
4332
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
4847
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE9}. Expected chainId is ${networkId}`
|
|
4333
4848
|
);
|
|
4334
4849
|
return {
|
|
4335
4850
|
success: [],
|
|
@@ -4353,7 +4868,7 @@ var fetchBalances8 = async ({
|
|
|
4353
4868
|
address: def.address,
|
|
4354
4869
|
networkId,
|
|
4355
4870
|
tokenId: def.token.id,
|
|
4356
|
-
source:
|
|
4871
|
+
source: MODULE_TYPE9,
|
|
4357
4872
|
status: "live",
|
|
4358
4873
|
values: [
|
|
4359
4874
|
{ type: "free", label: "free", amount: "0" },
|
|
@@ -4372,8 +4887,8 @@ import {
|
|
|
4372
4887
|
subForeignAssetTokenId
|
|
4373
4888
|
} from "@talismn/chaindata-provider";
|
|
4374
4889
|
import { getStorageKeyPrefix as getStorageKeyPrefix3, papiStringify, parseMetadataRpc as parseMetadataRpc10 } from "@talismn/scale";
|
|
4375
|
-
import { assign as
|
|
4376
|
-
var
|
|
4890
|
+
import { assign as assign8, keyBy as keyBy6, keys as keys2 } from "lodash-es";
|
|
4891
|
+
var fetchTokens9 = async ({
|
|
4377
4892
|
networkId,
|
|
4378
4893
|
tokens,
|
|
4379
4894
|
connector,
|
|
@@ -4398,7 +4913,7 @@ var fetchTokens8 = async ({
|
|
|
4398
4913
|
]);
|
|
4399
4914
|
const assetStorageEntries = assetStorageResults[0]?.changes ?? [];
|
|
4400
4915
|
const metadataStorageEntries = metadataStorageResults[0]?.changes ?? [];
|
|
4401
|
-
const assetByOnChainId =
|
|
4916
|
+
const assetByOnChainId = keyBy6(
|
|
4402
4917
|
assetStorageEntries.map(([key, value]) => {
|
|
4403
4918
|
const [decodedKey] = assetCodec.keys.dec(key);
|
|
4404
4919
|
const onChainId = papiStringify(decodedKey);
|
|
@@ -4407,7 +4922,7 @@ var fetchTokens8 = async ({
|
|
|
4407
4922
|
}),
|
|
4408
4923
|
(a) => a.onChainId
|
|
4409
4924
|
);
|
|
4410
|
-
const metadataByOnChainId =
|
|
4925
|
+
const metadataByOnChainId = keyBy6(
|
|
4411
4926
|
metadataStorageEntries.map(([key, value]) => {
|
|
4412
4927
|
const [decodedKey] = metadataCodec.keys.dec(key);
|
|
4413
4928
|
const onChainId = papiStringify(decodedKey);
|
|
@@ -4423,13 +4938,13 @@ var fetchTokens8 = async ({
|
|
|
4423
4938
|
(a) => a.onChainId
|
|
4424
4939
|
);
|
|
4425
4940
|
const allTokens = keys2(assetByOnChainId).map(
|
|
4426
|
-
(onChainId) =>
|
|
4941
|
+
(onChainId) => assign8({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? void 0)
|
|
4427
4942
|
);
|
|
4428
|
-
const configTokenByOnChainId =
|
|
4943
|
+
const configTokenByOnChainId = keyBy6(tokens, (t) => t.onChainId);
|
|
4429
4944
|
return allTokens.map(
|
|
4430
4945
|
(asset) => ({
|
|
4431
4946
|
id: subForeignAssetTokenId(networkId, asset.onChainId),
|
|
4432
|
-
type:
|
|
4947
|
+
type: MODULE_TYPE9,
|
|
4433
4948
|
platform: "polkadot",
|
|
4434
4949
|
networkId,
|
|
4435
4950
|
onChainId: String(asset.onChainId),
|
|
@@ -4446,7 +4961,7 @@ var fetchTokens8 = async ({
|
|
|
4446
4961
|
return configToken || token.isSufficient;
|
|
4447
4962
|
}).map((token) => {
|
|
4448
4963
|
const configToken = configTokenByOnChainId[token.onChainId];
|
|
4449
|
-
return configToken ?
|
|
4964
|
+
return configToken ? assign8({}, token, configToken) : token;
|
|
4450
4965
|
}).filter((t) => {
|
|
4451
4966
|
const parsed = SubForeignAssetsTokenSchema2.safeParse(t);
|
|
4452
4967
|
return parsed.success;
|
|
@@ -4456,12 +4971,12 @@ var fetchTokens8 = async ({
|
|
|
4456
4971
|
// src/modules/substrate-foreignassets/getMiniMetadata.ts
|
|
4457
4972
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION4 } from "@talismn/chaindata-provider";
|
|
4458
4973
|
import { compactMetadata as compactMetadata3, encodeMetadata as encodeMetadata3, parseMetadataRpc as parseMetadataRpc11 } from "@talismn/scale";
|
|
4459
|
-
var
|
|
4974
|
+
var getMiniMetadata9 = ({
|
|
4460
4975
|
networkId,
|
|
4461
4976
|
specVersion,
|
|
4462
4977
|
metadataRpc
|
|
4463
4978
|
}) => {
|
|
4464
|
-
const source =
|
|
4979
|
+
const source = MODULE_TYPE9;
|
|
4465
4980
|
const chainId = networkId;
|
|
4466
4981
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
4467
4982
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -4494,10 +5009,10 @@ var getData3 = (metadataRpc) => {
|
|
|
4494
5009
|
|
|
4495
5010
|
// src/modules/substrate-foreignassets/getTransferCallData.ts
|
|
4496
5011
|
import { mergeUint8 as mergeUint83 } from "@polkadot-api/utils";
|
|
4497
|
-
import { isTokenOfType as
|
|
5012
|
+
import { isTokenOfType as isTokenOfType9 } from "@talismn/chaindata-provider";
|
|
4498
5013
|
import { papiParse as papiParse2, parseMetadataRpc as parseMetadataRpc12 } from "@talismn/scale";
|
|
4499
5014
|
import { Binary as Binary3, Enum as Enum2 } from "polkadot-api";
|
|
4500
|
-
var
|
|
5015
|
+
var getTransferCallData9 = ({
|
|
4501
5016
|
from: from2,
|
|
4502
5017
|
to,
|
|
4503
5018
|
value,
|
|
@@ -4505,8 +5020,8 @@ var getTransferCallData8 = ({
|
|
|
4505
5020
|
type,
|
|
4506
5021
|
metadataRpc
|
|
4507
5022
|
}) => {
|
|
4508
|
-
if (!
|
|
4509
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
5023
|
+
if (!isTokenOfType9(token, MODULE_TYPE9))
|
|
5024
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE9}.`);
|
|
4510
5025
|
const { builder } = parseMetadataRpc12(metadataRpc);
|
|
4511
5026
|
const method = getTransferMethod2(type);
|
|
4512
5027
|
const { codec, location } = builder.buildCall("ForeignAssets", method);
|
|
@@ -4585,14 +5100,14 @@ var getTransferAllEncodedArgs2 = (onChainId, to, codec) => {
|
|
|
4585
5100
|
};
|
|
4586
5101
|
|
|
4587
5102
|
// src/modules/substrate-foreignassets/subscribeBalances.ts
|
|
4588
|
-
import { map as map3, of as
|
|
4589
|
-
var
|
|
5103
|
+
import { map as map3, of as of10 } from "rxjs";
|
|
5104
|
+
var subscribeBalances9 = ({
|
|
4590
5105
|
networkId,
|
|
4591
5106
|
tokensWithAddresses,
|
|
4592
5107
|
connector,
|
|
4593
5108
|
miniMetadata
|
|
4594
5109
|
}) => {
|
|
4595
|
-
if (!tokensWithAddresses.length) return
|
|
5110
|
+
if (!tokensWithAddresses.length) return of10({ success: [], errors: [] });
|
|
4596
5111
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4597
5112
|
const queries = buildQueries2(networkId, balanceDefs, miniMetadata);
|
|
4598
5113
|
return getRpcQueryPack$(connector, networkId, queries).pipe(
|
|
@@ -4605,31 +5120,31 @@ var subscribeBalances8 = ({
|
|
|
4605
5120
|
|
|
4606
5121
|
// src/modules/substrate-foreignassets/module.ts
|
|
4607
5122
|
var SubForeignAssetsBalanceModule = {
|
|
4608
|
-
type:
|
|
4609
|
-
platform:
|
|
4610
|
-
getMiniMetadata:
|
|
4611
|
-
fetchTokens:
|
|
4612
|
-
fetchBalances:
|
|
4613
|
-
subscribeBalances:
|
|
4614
|
-
getTransferCallData:
|
|
5123
|
+
type: MODULE_TYPE9,
|
|
5124
|
+
platform: PLATFORM9,
|
|
5125
|
+
getMiniMetadata: getMiniMetadata9,
|
|
5126
|
+
fetchTokens: fetchTokens9,
|
|
5127
|
+
fetchBalances: fetchBalances9,
|
|
5128
|
+
subscribeBalances: subscribeBalances9,
|
|
5129
|
+
getTransferCallData: getTransferCallData9
|
|
4615
5130
|
};
|
|
4616
5131
|
|
|
4617
5132
|
// src/modules/substrate-foreignassets/types.ts
|
|
4618
5133
|
import { SubForeignAssetsTokenSchema as SubForeignAssetsTokenSchema3 } from "@talismn/chaindata-provider";
|
|
4619
|
-
import
|
|
4620
|
-
var SubForeignAssetsTokenConfigSchema =
|
|
5134
|
+
import z13 from "zod/v4";
|
|
5135
|
+
var SubForeignAssetsTokenConfigSchema = z13.strictObject({
|
|
4621
5136
|
onChainId: SubForeignAssetsTokenSchema3.shape.onChainId,
|
|
4622
5137
|
...TokenConfigBaseSchema.shape
|
|
4623
5138
|
});
|
|
4624
5139
|
|
|
4625
5140
|
// src/modules/substrate-hydration/config.ts
|
|
4626
5141
|
import { SubHydrationTokenSchema } from "@talismn/chaindata-provider";
|
|
4627
|
-
var
|
|
4628
|
-
var
|
|
5142
|
+
var MODULE_TYPE10 = SubHydrationTokenSchema.shape.type.value;
|
|
5143
|
+
var PLATFORM10 = SubHydrationTokenSchema.shape.platform.value;
|
|
4629
5144
|
|
|
4630
5145
|
// src/modules/substrate-hydration/fetchBalances.ts
|
|
4631
|
-
import { keyBy as
|
|
4632
|
-
var
|
|
5146
|
+
import { keyBy as keyBy7, uniq as uniq5 } from "lodash-es";
|
|
5147
|
+
var fetchBalances10 = async ({
|
|
4633
5148
|
networkId,
|
|
4634
5149
|
tokensWithAddresses,
|
|
4635
5150
|
connector,
|
|
@@ -4638,7 +5153,7 @@ var fetchBalances9 = async ({
|
|
|
4638
5153
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
4639
5154
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4640
5155
|
if (!miniMetadata?.data) {
|
|
4641
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
5156
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE10} balances on ${networkId}.`, {
|
|
4642
5157
|
tokensWithAddresses
|
|
4643
5158
|
});
|
|
4644
5159
|
return {
|
|
@@ -4650,20 +5165,20 @@ var fetchBalances9 = async ({
|
|
|
4650
5165
|
}))
|
|
4651
5166
|
};
|
|
4652
5167
|
}
|
|
4653
|
-
if (miniMetadata.source !==
|
|
4654
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
5168
|
+
if (miniMetadata.source !== MODULE_TYPE10) {
|
|
5169
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE10}.`);
|
|
4655
5170
|
return {
|
|
4656
5171
|
success: [],
|
|
4657
5172
|
errors: balanceDefs.map((def) => ({
|
|
4658
5173
|
tokenId: def.token.id,
|
|
4659
5174
|
address: def.address,
|
|
4660
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
5175
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE10}`)
|
|
4661
5176
|
}))
|
|
4662
5177
|
};
|
|
4663
5178
|
}
|
|
4664
5179
|
if (miniMetadata.chainId !== networkId) {
|
|
4665
5180
|
log_default.warn(
|
|
4666
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
5181
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE10}. Expected chainId is ${networkId}`
|
|
4667
5182
|
);
|
|
4668
5183
|
return {
|
|
4669
5184
|
success: [],
|
|
@@ -4674,7 +5189,7 @@ var fetchBalances9 = async ({
|
|
|
4674
5189
|
}))
|
|
4675
5190
|
};
|
|
4676
5191
|
}
|
|
4677
|
-
const addresses =
|
|
5192
|
+
const addresses = uniq5(balanceDefs.map((def) => def.address));
|
|
4678
5193
|
try {
|
|
4679
5194
|
const res = await Promise.all(
|
|
4680
5195
|
addresses.map(
|
|
@@ -4690,16 +5205,16 @@ var fetchBalances9 = async ({
|
|
|
4690
5205
|
frozen: balance.frozen.toString()
|
|
4691
5206
|
})).filter((b) => b.onChainId !== void 0);
|
|
4692
5207
|
});
|
|
4693
|
-
const balancesByKey =
|
|
5208
|
+
const balancesByKey = keyBy7(fetchedBalances, (b) => `${b.address}:${b.onChainId}`);
|
|
4694
5209
|
const success = tokensWithAddresses.reduce((acc, [token, addresses2]) => {
|
|
4695
|
-
if (token.type ===
|
|
5210
|
+
if (token.type === MODULE_TYPE10)
|
|
4696
5211
|
for (const address of addresses2) {
|
|
4697
5212
|
const rawBalance = balancesByKey[`${address}:${token.onChainId}`];
|
|
4698
5213
|
const balance = {
|
|
4699
5214
|
address,
|
|
4700
5215
|
networkId,
|
|
4701
5216
|
tokenId: token.id,
|
|
4702
|
-
source:
|
|
5217
|
+
source: MODULE_TYPE10,
|
|
4703
5218
|
status: "live",
|
|
4704
5219
|
values: [
|
|
4705
5220
|
{
|
|
@@ -4747,8 +5262,8 @@ import {
|
|
|
4747
5262
|
subHydrationTokenId
|
|
4748
5263
|
} from "@talismn/chaindata-provider";
|
|
4749
5264
|
import { getStorageKeyPrefix as getStorageKeyPrefix4, parseMetadataRpc as parseMetadataRpc13 } from "@talismn/scale";
|
|
4750
|
-
import { assign as
|
|
4751
|
-
var
|
|
5265
|
+
import { assign as assign9, keyBy as keyBy8 } from "lodash-es";
|
|
5266
|
+
var fetchTokens10 = async ({
|
|
4752
5267
|
networkId,
|
|
4753
5268
|
tokens,
|
|
4754
5269
|
connector,
|
|
@@ -4767,7 +5282,7 @@ var fetchTokens9 = async ({
|
|
|
4767
5282
|
[allAssetStorageKeys]
|
|
4768
5283
|
);
|
|
4769
5284
|
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
|
4770
|
-
const configTokenByAssetId =
|
|
5285
|
+
const configTokenByAssetId = keyBy8(tokens, (t) => t.onChainId);
|
|
4771
5286
|
return assetStorageEntries.map(([key, value]) => {
|
|
4772
5287
|
const [onChainId] = assetsCodec.keys.dec(key);
|
|
4773
5288
|
const asset = assetsCodec.value.dec(value);
|
|
@@ -4783,7 +5298,7 @@ var fetchTokens9 = async ({
|
|
|
4783
5298
|
}).map(
|
|
4784
5299
|
(asset) => ({
|
|
4785
5300
|
id: subHydrationTokenId(networkId, asset.onChainId),
|
|
4786
|
-
type:
|
|
5301
|
+
type: MODULE_TYPE10,
|
|
4787
5302
|
platform: "polkadot",
|
|
4788
5303
|
networkId,
|
|
4789
5304
|
onChainId: asset.onChainId,
|
|
@@ -4801,7 +5316,7 @@ var fetchTokens9 = async ({
|
|
|
4801
5316
|
return configToken || token.isSufficient;
|
|
4802
5317
|
}).map((token) => {
|
|
4803
5318
|
const configToken = configTokenByAssetId[token.onChainId];
|
|
4804
|
-
return configToken ?
|
|
5319
|
+
return configToken ? assign9({}, token, configToken) : token;
|
|
4805
5320
|
}).filter((t) => {
|
|
4806
5321
|
const parsed = SubHydrationTokenSchema2.safeParse(t);
|
|
4807
5322
|
return parsed.success;
|
|
@@ -4811,12 +5326,12 @@ var fetchTokens9 = async ({
|
|
|
4811
5326
|
// src/modules/substrate-hydration/getMiniMetadata.ts
|
|
4812
5327
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION5 } from "@talismn/chaindata-provider";
|
|
4813
5328
|
import { compactMetadata as compactMetadata4, encodeMetadata as encodeMetadata4, parseMetadataRpc as parseMetadataRpc14 } from "@talismn/scale";
|
|
4814
|
-
var
|
|
5329
|
+
var getMiniMetadata10 = ({
|
|
4815
5330
|
networkId,
|
|
4816
5331
|
specVersion,
|
|
4817
5332
|
metadataRpc
|
|
4818
5333
|
}) => {
|
|
4819
|
-
const source =
|
|
5334
|
+
const source = MODULE_TYPE10;
|
|
4820
5335
|
const chainId = networkId;
|
|
4821
5336
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
4822
5337
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -4863,18 +5378,18 @@ var getData4 = (metadataRpc) => {
|
|
|
4863
5378
|
|
|
4864
5379
|
// src/modules/substrate-hydration/getTransferCallData.ts
|
|
4865
5380
|
import { mergeUint8 as mergeUint84 } from "@polkadot-api/utils";
|
|
4866
|
-
import { isTokenOfType as
|
|
5381
|
+
import { isTokenOfType as isTokenOfType10 } from "@talismn/chaindata-provider";
|
|
4867
5382
|
import { parseMetadataRpc as parseMetadataRpc15 } from "@talismn/scale";
|
|
4868
5383
|
import { Binary as Binary4 } from "polkadot-api";
|
|
4869
|
-
var
|
|
5384
|
+
var getTransferCallData10 = ({
|
|
4870
5385
|
from: from2,
|
|
4871
5386
|
to,
|
|
4872
5387
|
value,
|
|
4873
5388
|
token,
|
|
4874
5389
|
metadataRpc
|
|
4875
5390
|
}) => {
|
|
4876
|
-
if (!
|
|
4877
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
5391
|
+
if (!isTokenOfType10(token, MODULE_TYPE10))
|
|
5392
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE10}.`);
|
|
4878
5393
|
const { builder } = parseMetadataRpc15(metadataRpc);
|
|
4879
5394
|
const { codec, location } = builder.buildCall("Currencies", "transfer");
|
|
4880
5395
|
const args = {
|
|
@@ -4890,22 +5405,22 @@ var getTransferCallData9 = ({
|
|
|
4890
5405
|
};
|
|
4891
5406
|
|
|
4892
5407
|
// src/modules/substrate-hydration/subscribeBalances.ts
|
|
4893
|
-
import { isEqual as
|
|
4894
|
-
import { distinctUntilChanged as
|
|
4895
|
-
var
|
|
4896
|
-
var
|
|
5408
|
+
import { isEqual as isEqual9 } from "lodash-es";
|
|
5409
|
+
import { distinctUntilChanged as distinctUntilChanged9, Observable as Observable9, of as of11 } from "rxjs";
|
|
5410
|
+
var SUBSCRIPTION_INTERVAL8 = 6e3;
|
|
5411
|
+
var subscribeBalances10 = ({
|
|
4897
5412
|
networkId,
|
|
4898
5413
|
tokensWithAddresses,
|
|
4899
5414
|
connector,
|
|
4900
5415
|
miniMetadata
|
|
4901
5416
|
}) => {
|
|
4902
|
-
if (!tokensWithAddresses.length) return
|
|
4903
|
-
return new
|
|
5417
|
+
if (!tokensWithAddresses.length) return of11({ success: [], errors: [] });
|
|
5418
|
+
return new Observable9((subscriber) => {
|
|
4904
5419
|
const abortController = new AbortController();
|
|
4905
5420
|
const poll = async () => {
|
|
4906
5421
|
try {
|
|
4907
5422
|
if (abortController.signal.aborted) return;
|
|
4908
|
-
const balances = await
|
|
5423
|
+
const balances = await fetchBalances10({
|
|
4909
5424
|
networkId,
|
|
4910
5425
|
tokensWithAddresses,
|
|
4911
5426
|
connector,
|
|
@@ -4913,10 +5428,10 @@ var subscribeBalances9 = ({
|
|
|
4913
5428
|
});
|
|
4914
5429
|
if (abortController.signal.aborted) return;
|
|
4915
5430
|
subscriber.next(balances);
|
|
4916
|
-
setTimeout(poll,
|
|
5431
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL8);
|
|
4917
5432
|
} catch (error) {
|
|
4918
5433
|
log_default.error("Error", {
|
|
4919
|
-
module:
|
|
5434
|
+
module: MODULE_TYPE10,
|
|
4920
5435
|
networkId,
|
|
4921
5436
|
miniMetadata,
|
|
4922
5437
|
addressesByToken: tokensWithAddresses,
|
|
@@ -4929,36 +5444,36 @@ var subscribeBalances9 = ({
|
|
|
4929
5444
|
return () => {
|
|
4930
5445
|
abortController.abort();
|
|
4931
5446
|
};
|
|
4932
|
-
}).pipe(
|
|
5447
|
+
}).pipe(distinctUntilChanged9(isEqual9));
|
|
4933
5448
|
};
|
|
4934
5449
|
|
|
4935
5450
|
// src/modules/substrate-hydration/module.ts
|
|
4936
5451
|
var SubHydrationBalanceModule = {
|
|
4937
|
-
type:
|
|
4938
|
-
platform:
|
|
4939
|
-
getMiniMetadata:
|
|
4940
|
-
fetchTokens:
|
|
4941
|
-
fetchBalances:
|
|
4942
|
-
subscribeBalances:
|
|
4943
|
-
getTransferCallData:
|
|
5452
|
+
type: MODULE_TYPE10,
|
|
5453
|
+
platform: PLATFORM10,
|
|
5454
|
+
getMiniMetadata: getMiniMetadata10,
|
|
5455
|
+
fetchTokens: fetchTokens10,
|
|
5456
|
+
fetchBalances: fetchBalances10,
|
|
5457
|
+
subscribeBalances: subscribeBalances10,
|
|
5458
|
+
getTransferCallData: getTransferCallData10
|
|
4944
5459
|
};
|
|
4945
5460
|
|
|
4946
5461
|
// src/modules/substrate-hydration/types.ts
|
|
4947
5462
|
import { SubHydrationTokenSchema as SubHydrationTokenSchema3 } from "@talismn/chaindata-provider";
|
|
4948
|
-
import
|
|
4949
|
-
var SubHydrationTokenConfigSchema =
|
|
5463
|
+
import z14 from "zod/v4";
|
|
5464
|
+
var SubHydrationTokenConfigSchema = z14.strictObject({
|
|
4950
5465
|
onChainId: SubHydrationTokenSchema3.shape.onChainId,
|
|
4951
5466
|
...TokenConfigBaseSchema.shape
|
|
4952
5467
|
});
|
|
4953
5468
|
|
|
4954
5469
|
// src/modules/substrate-native/config.ts
|
|
4955
5470
|
import { SubNativeTokenSchema } from "@talismn/chaindata-provider";
|
|
4956
|
-
var
|
|
4957
|
-
var
|
|
5471
|
+
var MODULE_TYPE11 = SubNativeTokenSchema.shape.type.value;
|
|
5472
|
+
var PLATFORM11 = SubNativeTokenSchema.shape.platform.value;
|
|
4958
5473
|
|
|
4959
5474
|
// src/modules/substrate-native/queries/buildBaseQueries.ts
|
|
4960
5475
|
import { decodeScale as decodeScale4 } from "@talismn/scale";
|
|
4961
|
-
import { isNotNil as
|
|
5476
|
+
import { isNotNil as isNotNil8 } from "@talismn/util";
|
|
4962
5477
|
|
|
4963
5478
|
// src/modules/substrate-native/util/lockTypes.ts
|
|
4964
5479
|
import upperFirst from "lodash-es/upperFirst";
|
|
@@ -5119,7 +5634,7 @@ var buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
|
|
|
5119
5634
|
return { balance, nomPoolMemberInfo };
|
|
5120
5635
|
}
|
|
5121
5636
|
};
|
|
5122
|
-
}).filter(
|
|
5637
|
+
}).filter(isNotNil8);
|
|
5123
5638
|
};
|
|
5124
5639
|
var decodeBaseResult = (coder, value, networkId) => {
|
|
5125
5640
|
const decoded = decodeScale4(
|
|
@@ -5359,11 +5874,11 @@ var getNomPoolStateKeys = (coders, nomPoolMemberInfo, extra) => {
|
|
|
5359
5874
|
};
|
|
5360
5875
|
|
|
5361
5876
|
// src/modules/substrate-native/fetchBalances.ts
|
|
5362
|
-
var
|
|
5877
|
+
var fetchBalances11 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
5363
5878
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
5364
5879
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
5365
5880
|
if (!miniMetadata?.data) {
|
|
5366
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
5881
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE11} balances on ${networkId}.`);
|
|
5367
5882
|
return {
|
|
5368
5883
|
success: [],
|
|
5369
5884
|
errors: balanceDefs.map((def) => ({
|
|
@@ -5373,20 +5888,20 @@ var fetchBalances10 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
5373
5888
|
}))
|
|
5374
5889
|
};
|
|
5375
5890
|
}
|
|
5376
|
-
if (miniMetadata.source !==
|
|
5377
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
5891
|
+
if (miniMetadata.source !== MODULE_TYPE11) {
|
|
5892
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE11}.`);
|
|
5378
5893
|
return {
|
|
5379
5894
|
success: [],
|
|
5380
5895
|
errors: balanceDefs.map((def) => ({
|
|
5381
5896
|
tokenId: def.token.id,
|
|
5382
5897
|
address: def.address,
|
|
5383
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
5898
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE11}`)
|
|
5384
5899
|
}))
|
|
5385
5900
|
};
|
|
5386
5901
|
}
|
|
5387
5902
|
if (miniMetadata.chainId !== networkId) {
|
|
5388
5903
|
log_default.warn(
|
|
5389
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
5904
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE11}. Expected chainId is ${networkId}`
|
|
5390
5905
|
);
|
|
5391
5906
|
return {
|
|
5392
5907
|
success: [],
|
|
@@ -5409,9 +5924,9 @@ import {
|
|
|
5409
5924
|
SubNativeTokenSchema as SubNativeTokenSchema2,
|
|
5410
5925
|
subNativeTokenId as subNativeTokenId2
|
|
5411
5926
|
} from "@talismn/chaindata-provider";
|
|
5412
|
-
import { assign as
|
|
5413
|
-
import
|
|
5414
|
-
var
|
|
5927
|
+
import { assign as assign10 } from "lodash-es";
|
|
5928
|
+
import z15 from "zod/v4";
|
|
5929
|
+
var fetchTokens11 = async ({ networkId, tokens, connector, miniMetadata }) => {
|
|
5415
5930
|
if (miniMetadata.extra.disable) return [];
|
|
5416
5931
|
const { tokenSymbol: symbol, tokenDecimals: decimals } = await getChainProperties(
|
|
5417
5932
|
connector,
|
|
@@ -5431,22 +5946,22 @@ var fetchTokens10 = async ({ networkId, tokens, connector, miniMetadata }) => {
|
|
|
5431
5946
|
decimals,
|
|
5432
5947
|
existentialDeposit: miniMetadata.extra.existentialDeposit ?? "0"
|
|
5433
5948
|
};
|
|
5434
|
-
const token =
|
|
5949
|
+
const token = assign10(nativeToken, tokenConfig);
|
|
5435
5950
|
const parsed = SubNativeTokenSchema2.safeParse(token);
|
|
5436
5951
|
if (!parsed.success) {
|
|
5437
5952
|
return [];
|
|
5438
5953
|
}
|
|
5439
5954
|
return [parsed.data];
|
|
5440
5955
|
};
|
|
5441
|
-
var DotNetworkPropertiesSimple =
|
|
5442
|
-
tokenDecimals:
|
|
5443
|
-
tokenSymbol:
|
|
5956
|
+
var DotNetworkPropertiesSimple = z15.object({
|
|
5957
|
+
tokenDecimals: z15.number().optional().default(0),
|
|
5958
|
+
tokenSymbol: z15.string().optional().default("Unit")
|
|
5444
5959
|
});
|
|
5445
|
-
var DotNetworkPropertiesArray =
|
|
5446
|
-
tokenDecimals:
|
|
5447
|
-
tokenSymbol:
|
|
5960
|
+
var DotNetworkPropertiesArray = z15.object({
|
|
5961
|
+
tokenDecimals: z15.array(z15.number()).nonempty(),
|
|
5962
|
+
tokenSymbol: z15.array(z15.string()).nonempty()
|
|
5448
5963
|
});
|
|
5449
|
-
var DotNetworkPropertiesSchema =
|
|
5964
|
+
var DotNetworkPropertiesSchema = z15.union([DotNetworkPropertiesSimple, DotNetworkPropertiesArray]).transform((val) => ({
|
|
5450
5965
|
tokenDecimals: Array.isArray(val.tokenDecimals) ? val.tokenDecimals[0] : val.tokenDecimals,
|
|
5451
5966
|
tokenSymbol: Array.isArray(val.tokenSymbol) ? val.tokenSymbol[0] : val.tokenSymbol
|
|
5452
5967
|
}));
|
|
@@ -5458,8 +5973,8 @@ var getChainProperties = async (connector, networkId) => {
|
|
|
5458
5973
|
// src/modules/substrate-native/getMiniMetadata.ts
|
|
5459
5974
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION6 } from "@talismn/chaindata-provider";
|
|
5460
5975
|
import { compactMetadata as compactMetadata5, encodeMetadata as encodeMetadata5, parseMetadataRpc as parseMetadataRpc16 } from "@talismn/scale";
|
|
5461
|
-
var
|
|
5462
|
-
const source =
|
|
5976
|
+
var getMiniMetadata11 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
5977
|
+
const source = MODULE_TYPE11;
|
|
5463
5978
|
const chainId = networkId;
|
|
5464
5979
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
5465
5980
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -5519,12 +6034,12 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
5519
6034
|
|
|
5520
6035
|
// src/modules/substrate-native/getTransferCallData.ts
|
|
5521
6036
|
import { mergeUint8 as mergeUint86 } from "@polkadot-api/utils";
|
|
5522
|
-
import { isTokenOfType as
|
|
6037
|
+
import { isTokenOfType as isTokenOfType11 } from "@talismn/chaindata-provider";
|
|
5523
6038
|
import {
|
|
5524
6039
|
parseMetadataRpc as parseMetadataRpc17
|
|
5525
6040
|
} from "@talismn/scale";
|
|
5526
6041
|
import { Binary as Binary5, Enum as Enum3 } from "polkadot-api";
|
|
5527
|
-
var
|
|
6042
|
+
var getTransferCallData11 = ({
|
|
5528
6043
|
from: from2,
|
|
5529
6044
|
to,
|
|
5530
6045
|
value,
|
|
@@ -5532,8 +6047,8 @@ var getTransferCallData10 = ({
|
|
|
5532
6047
|
type,
|
|
5533
6048
|
metadataRpc
|
|
5534
6049
|
}) => {
|
|
5535
|
-
if (!
|
|
5536
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
6050
|
+
if (!isTokenOfType11(token, MODULE_TYPE11))
|
|
6051
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE11}.`);
|
|
5537
6052
|
const { unifiedMetadata, lookupFn, builder } = parseMetadataRpc17(metadataRpc);
|
|
5538
6053
|
const method = getTransferMethod3(type, unifiedMetadata, lookupFn);
|
|
5539
6054
|
const { codec, location } = builder.buildCall("Balances", method);
|
|
@@ -5611,9 +6126,9 @@ var getTransferAllEncodedArgs3 = (to, codec) => {
|
|
|
5611
6126
|
};
|
|
5612
6127
|
|
|
5613
6128
|
// src/modules/substrate-native/subscribeBalances.ts
|
|
5614
|
-
import { map as map4, of as
|
|
5615
|
-
var
|
|
5616
|
-
if (!tokensWithAddresses.length) return
|
|
6129
|
+
import { map as map4, of as of12, switchMap } from "rxjs";
|
|
6130
|
+
var subscribeBalances11 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
6131
|
+
if (!tokensWithAddresses.length) return of12({ success: [], errors: [] });
|
|
5617
6132
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
5618
6133
|
const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata);
|
|
5619
6134
|
return getRpcQueryPack$(connector, networkId, baseQueries).pipe(
|
|
@@ -5630,34 +6145,34 @@ var subscribeBalances10 = ({ networkId, tokensWithAddresses, connector, miniMeta
|
|
|
5630
6145
|
|
|
5631
6146
|
// src/modules/substrate-native/module.ts
|
|
5632
6147
|
var SubNativeBalanceModule = {
|
|
5633
|
-
type:
|
|
5634
|
-
platform:
|
|
5635
|
-
getMiniMetadata:
|
|
5636
|
-
fetchTokens:
|
|
5637
|
-
fetchBalances:
|
|
5638
|
-
subscribeBalances:
|
|
5639
|
-
getTransferCallData:
|
|
6148
|
+
type: MODULE_TYPE11,
|
|
6149
|
+
platform: PLATFORM11,
|
|
6150
|
+
getMiniMetadata: getMiniMetadata11,
|
|
6151
|
+
fetchTokens: fetchTokens11,
|
|
6152
|
+
fetchBalances: fetchBalances11,
|
|
6153
|
+
subscribeBalances: subscribeBalances11,
|
|
6154
|
+
getTransferCallData: getTransferCallData11
|
|
5640
6155
|
};
|
|
5641
6156
|
|
|
5642
6157
|
// src/modules/substrate-native/types.ts
|
|
5643
|
-
import
|
|
5644
|
-
var SubNativeTokenConfigSchema =
|
|
6158
|
+
import z16 from "zod/v4";
|
|
6159
|
+
var SubNativeTokenConfigSchema = z16.strictObject({
|
|
5645
6160
|
...TokenConfigBaseSchema.shape
|
|
5646
6161
|
});
|
|
5647
|
-
var SubNativeModuleConfigSchema =
|
|
5648
|
-
disable:
|
|
6162
|
+
var SubNativeModuleConfigSchema = z16.strictObject({
|
|
6163
|
+
disable: z16.boolean().optional()
|
|
5649
6164
|
});
|
|
5650
|
-
var SubNativeMiniMetadataExtraSchema =
|
|
5651
|
-
disable:
|
|
5652
|
-
useLegacyTransferableCalculation:
|
|
5653
|
-
existentialDeposit:
|
|
5654
|
-
nominationPoolsPalletId:
|
|
6165
|
+
var SubNativeMiniMetadataExtraSchema = z16.strictObject({
|
|
6166
|
+
disable: z16.boolean().optional(),
|
|
6167
|
+
useLegacyTransferableCalculation: z16.boolean().optional(),
|
|
6168
|
+
existentialDeposit: z16.string().optional(),
|
|
6169
|
+
nominationPoolsPalletId: z16.string().optional()
|
|
5655
6170
|
});
|
|
5656
6171
|
|
|
5657
6172
|
// src/modules/substrate-psp22/config.ts
|
|
5658
6173
|
import { SubPsp22TokenSchema } from "@talismn/chaindata-provider";
|
|
5659
|
-
var
|
|
5660
|
-
var
|
|
6174
|
+
var MODULE_TYPE12 = SubPsp22TokenSchema.shape.type.value;
|
|
6175
|
+
var PLATFORM12 = SubPsp22TokenSchema.shape.platform.value;
|
|
5661
6176
|
|
|
5662
6177
|
// src/modules/substrate-psp22/fetchBalances.ts
|
|
5663
6178
|
import { Abi } from "@polkadot/api-contract";
|
|
@@ -6661,7 +7176,17 @@ var psp22_default = {
|
|
|
6661
7176
|
};
|
|
6662
7177
|
|
|
6663
7178
|
// src/modules/substrate-psp22/util.ts
|
|
6664
|
-
|
|
7179
|
+
var u8aToHex = (value) => `0x${Array.from(value, (b) => b.toString(16).padStart(2, "0")).join("")}`;
|
|
7180
|
+
var u8aConcatStrict = (arrays) => {
|
|
7181
|
+
const length = arrays.reduce((total, arr) => total + arr.length, 0);
|
|
7182
|
+
const result = new Uint8Array(length);
|
|
7183
|
+
let offset = 0;
|
|
7184
|
+
for (const arr of arrays) {
|
|
7185
|
+
result.set(arr, offset);
|
|
7186
|
+
offset += arr.length;
|
|
7187
|
+
}
|
|
7188
|
+
return result;
|
|
7189
|
+
};
|
|
6665
7190
|
var makeContractCaller = ({
|
|
6666
7191
|
chainConnector,
|
|
6667
7192
|
chainId,
|
|
@@ -6690,7 +7215,7 @@ var makeContractCaller = ({
|
|
|
6690
7215
|
);
|
|
6691
7216
|
|
|
6692
7217
|
// src/modules/substrate-psp22/fetchBalances.ts
|
|
6693
|
-
var
|
|
7218
|
+
var fetchBalances12 = async ({
|
|
6694
7219
|
networkId,
|
|
6695
7220
|
tokensWithAddresses,
|
|
6696
7221
|
connector
|
|
@@ -6745,13 +7270,14 @@ var fetchBalances11 = async ({
|
|
|
6745
7270
|
// src/modules/substrate-psp22/fetchTokens.ts
|
|
6746
7271
|
import { Abi as Abi2 } from "@polkadot/api-contract";
|
|
6747
7272
|
import { TypeRegistry as TypeRegistry2 } from "@polkadot/types";
|
|
6748
|
-
import { hexToNumber, u8aToString } from "@polkadot/util";
|
|
6749
7273
|
import {
|
|
6750
7274
|
SubPsp22TokenSchema as SubPsp22TokenSchema2,
|
|
6751
7275
|
subPsp22TokenId
|
|
6752
7276
|
} from "@talismn/chaindata-provider";
|
|
6753
7277
|
import { values } from "lodash-es";
|
|
6754
|
-
var
|
|
7278
|
+
var hexToNumber = (hex) => Number(hex);
|
|
7279
|
+
var u8aToString = (value) => new TextDecoder().decode(value);
|
|
7280
|
+
var fetchTokens12 = async ({
|
|
6755
7281
|
networkId,
|
|
6756
7282
|
tokens,
|
|
6757
7283
|
connector
|
|
@@ -6827,12 +7353,12 @@ var fetchTokens11 = async ({
|
|
|
6827
7353
|
// src/modules/substrate-psp22/getMiniMetadata.ts
|
|
6828
7354
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION7 } from "@talismn/chaindata-provider";
|
|
6829
7355
|
import { parseMetadataRpc as parseMetadataRpc18 } from "@talismn/scale";
|
|
6830
|
-
var
|
|
7356
|
+
var getMiniMetadata12 = ({
|
|
6831
7357
|
networkId,
|
|
6832
7358
|
specVersion,
|
|
6833
7359
|
metadataRpc
|
|
6834
7360
|
}) => {
|
|
6835
|
-
const source =
|
|
7361
|
+
const source = MODULE_TYPE12;
|
|
6836
7362
|
const chainId = networkId;
|
|
6837
7363
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
6838
7364
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -6860,12 +7386,12 @@ var getMiniMetadata11 = ({
|
|
|
6860
7386
|
import { Abi as Abi3 } from "@polkadot/api-contract";
|
|
6861
7387
|
import { TypeRegistry as TypeRegistry3 } from "@polkadot/types";
|
|
6862
7388
|
import { mergeUint8 as mergeUint87 } from "@polkadot-api/utils";
|
|
6863
|
-
import { isTokenOfType as
|
|
7389
|
+
import { isTokenOfType as isTokenOfType12, parseTokenId as parseTokenId5 } from "@talismn/chaindata-provider";
|
|
6864
7390
|
import { parseMetadataRpc as parseMetadataRpc19 } from "@talismn/scale";
|
|
6865
7391
|
import { Binary as Binary6, Enum as Enum4 } from "polkadot-api";
|
|
6866
|
-
var
|
|
6867
|
-
if (!
|
|
6868
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
7392
|
+
var getTransferCallData12 = async ({ from: from2, to, value, token, metadataRpc, connector }) => {
|
|
7393
|
+
if (!isTokenOfType12(token, MODULE_TYPE12))
|
|
7394
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE12}.`);
|
|
6869
7395
|
const networkId = parseTokenId5(token.id).networkId;
|
|
6870
7396
|
const { builder } = parseMetadataRpc19(metadataRpc);
|
|
6871
7397
|
const { codec, location } = builder.buildCall("Contracts", "call");
|
|
@@ -6897,22 +7423,22 @@ var getTransferCallData11 = async ({ from: from2, to, value, token, metadataRpc,
|
|
|
6897
7423
|
};
|
|
6898
7424
|
|
|
6899
7425
|
// src/modules/substrate-psp22/subscribeBalances.ts
|
|
6900
|
-
import { isEqual as
|
|
6901
|
-
import { distinctUntilChanged as
|
|
6902
|
-
var
|
|
6903
|
-
var
|
|
7426
|
+
import { isEqual as isEqual10 } from "lodash-es";
|
|
7427
|
+
import { distinctUntilChanged as distinctUntilChanged10, Observable as Observable10, of as of13 } from "rxjs";
|
|
7428
|
+
var SUBSCRIPTION_INTERVAL9 = 6e3;
|
|
7429
|
+
var subscribeBalances12 = ({
|
|
6904
7430
|
networkId,
|
|
6905
7431
|
tokensWithAddresses,
|
|
6906
7432
|
connector,
|
|
6907
7433
|
miniMetadata
|
|
6908
7434
|
}) => {
|
|
6909
|
-
if (!tokensWithAddresses.length) return
|
|
6910
|
-
return new
|
|
7435
|
+
if (!tokensWithAddresses.length) return of13({ success: [], errors: [] });
|
|
7436
|
+
return new Observable10((subscriber) => {
|
|
6911
7437
|
const abortController = new AbortController();
|
|
6912
7438
|
const poll = async () => {
|
|
6913
7439
|
try {
|
|
6914
7440
|
if (abortController.signal.aborted) return;
|
|
6915
|
-
const balances = await
|
|
7441
|
+
const balances = await fetchBalances12({
|
|
6916
7442
|
networkId,
|
|
6917
7443
|
tokensWithAddresses,
|
|
6918
7444
|
connector,
|
|
@@ -6920,10 +7446,10 @@ var subscribeBalances11 = ({
|
|
|
6920
7446
|
});
|
|
6921
7447
|
if (abortController.signal.aborted) return;
|
|
6922
7448
|
subscriber.next(balances);
|
|
6923
|
-
setTimeout(poll,
|
|
7449
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL9);
|
|
6924
7450
|
} catch (error) {
|
|
6925
7451
|
log_default.error("Error", {
|
|
6926
|
-
module:
|
|
7452
|
+
module: MODULE_TYPE12,
|
|
6927
7453
|
networkId,
|
|
6928
7454
|
miniMetadata,
|
|
6929
7455
|
addressesByToken: tokensWithAddresses,
|
|
@@ -6936,36 +7462,36 @@ var subscribeBalances11 = ({
|
|
|
6936
7462
|
return () => {
|
|
6937
7463
|
abortController.abort();
|
|
6938
7464
|
};
|
|
6939
|
-
}).pipe(
|
|
7465
|
+
}).pipe(distinctUntilChanged10(isEqual10));
|
|
6940
7466
|
};
|
|
6941
7467
|
|
|
6942
7468
|
// src/modules/substrate-psp22/module.ts
|
|
6943
7469
|
var SubPsp22BalanceModule = {
|
|
6944
|
-
type:
|
|
6945
|
-
platform:
|
|
6946
|
-
getMiniMetadata:
|
|
6947
|
-
fetchTokens:
|
|
6948
|
-
fetchBalances:
|
|
6949
|
-
subscribeBalances:
|
|
6950
|
-
getTransferCallData:
|
|
7470
|
+
type: MODULE_TYPE12,
|
|
7471
|
+
platform: PLATFORM12,
|
|
7472
|
+
getMiniMetadata: getMiniMetadata12,
|
|
7473
|
+
fetchTokens: fetchTokens12,
|
|
7474
|
+
fetchBalances: fetchBalances12,
|
|
7475
|
+
subscribeBalances: subscribeBalances12,
|
|
7476
|
+
getTransferCallData: getTransferCallData12
|
|
6951
7477
|
};
|
|
6952
7478
|
|
|
6953
7479
|
// src/modules/substrate-psp22/types.ts
|
|
6954
7480
|
import { SubPsp22TokenSchema as SubPsp22TokenSchema3 } from "@talismn/chaindata-provider";
|
|
6955
|
-
import
|
|
6956
|
-
var SubPsp22TokenConfigSchema =
|
|
7481
|
+
import z17 from "zod/v4";
|
|
7482
|
+
var SubPsp22TokenConfigSchema = z17.strictObject({
|
|
6957
7483
|
contractAddress: SubPsp22TokenSchema3.shape.contractAddress,
|
|
6958
7484
|
...TokenConfigBaseSchema.shape
|
|
6959
7485
|
});
|
|
6960
7486
|
|
|
6961
7487
|
// src/modules/substrate-tokens/config.ts
|
|
6962
7488
|
import { SubTokensTokenSchema } from "@talismn/chaindata-provider";
|
|
6963
|
-
var
|
|
6964
|
-
var
|
|
7489
|
+
var MODULE_TYPE13 = SubTokensTokenSchema.shape.type.value;
|
|
7490
|
+
var PLATFORM13 = SubTokensTokenSchema.shape.platform.value;
|
|
6965
7491
|
|
|
6966
7492
|
// src/modules/substrate-tokens/buildQueries.ts
|
|
6967
7493
|
import { decodeScale as decodeScale6, papiParse as papiParse3 } from "@talismn/scale";
|
|
6968
|
-
import { isNotNil as
|
|
7494
|
+
import { isNotNil as isNotNil9 } from "@talismn/util";
|
|
6969
7495
|
var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
|
|
6970
7496
|
const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
|
|
6971
7497
|
storage: [miniMetadata.extra.palletId, "Accounts"]
|
|
@@ -7013,15 +7539,15 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
7013
7539
|
stateKeys: [stateKey],
|
|
7014
7540
|
decodeResult
|
|
7015
7541
|
};
|
|
7016
|
-
}).filter(
|
|
7542
|
+
}).filter(isNotNil9);
|
|
7017
7543
|
};
|
|
7018
7544
|
|
|
7019
7545
|
// src/modules/substrate-tokens/fetchBalances.ts
|
|
7020
|
-
var
|
|
7546
|
+
var fetchBalances13 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
7021
7547
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
7022
7548
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
7023
7549
|
if (!miniMetadata?.data) {
|
|
7024
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
7550
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE13} balances on ${networkId}.`);
|
|
7025
7551
|
return {
|
|
7026
7552
|
success: [],
|
|
7027
7553
|
errors: balanceDefs.map((def) => ({
|
|
@@ -7031,20 +7557,20 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
7031
7557
|
}))
|
|
7032
7558
|
};
|
|
7033
7559
|
}
|
|
7034
|
-
if (miniMetadata.source !==
|
|
7035
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
7560
|
+
if (miniMetadata.source !== MODULE_TYPE13) {
|
|
7561
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE13}.`);
|
|
7036
7562
|
return {
|
|
7037
7563
|
success: [],
|
|
7038
7564
|
errors: balanceDefs.map((def) => ({
|
|
7039
7565
|
tokenId: def.token.id,
|
|
7040
7566
|
address: def.address,
|
|
7041
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
7567
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE13}`)
|
|
7042
7568
|
}))
|
|
7043
7569
|
};
|
|
7044
7570
|
}
|
|
7045
7571
|
if (miniMetadata.chainId !== networkId) {
|
|
7046
7572
|
log_default.warn(
|
|
7047
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
7573
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE13}. Expected chainId is ${networkId}`
|
|
7048
7574
|
);
|
|
7049
7575
|
return {
|
|
7050
7576
|
success: [],
|
|
@@ -7068,7 +7594,7 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
7068
7594
|
address: def.address,
|
|
7069
7595
|
networkId,
|
|
7070
7596
|
tokenId: def.token.id,
|
|
7071
|
-
source:
|
|
7597
|
+
source: MODULE_TYPE13,
|
|
7072
7598
|
status: "live",
|
|
7073
7599
|
values: [
|
|
7074
7600
|
{ type: "free", label: "free", amount: "0" },
|
|
@@ -7083,19 +7609,19 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
7083
7609
|
|
|
7084
7610
|
// src/modules/substrate-tokens/fetchTokens.ts
|
|
7085
7611
|
import { subTokensTokenId } from "@talismn/chaindata-provider";
|
|
7086
|
-
import { assign as
|
|
7087
|
-
var
|
|
7612
|
+
import { assign as assign11 } from "lodash-es";
|
|
7613
|
+
var fetchTokens13 = async ({
|
|
7088
7614
|
networkId,
|
|
7089
7615
|
tokens,
|
|
7090
7616
|
miniMetadata
|
|
7091
7617
|
}) => {
|
|
7092
7618
|
if (!miniMetadata?.data) return [];
|
|
7093
7619
|
return tokens.map(
|
|
7094
|
-
(tokenConfig) =>
|
|
7620
|
+
(tokenConfig) => assign11(
|
|
7095
7621
|
{
|
|
7096
7622
|
id: subTokensTokenId(networkId, tokenConfig.onChainId),
|
|
7097
|
-
type:
|
|
7098
|
-
platform:
|
|
7623
|
+
type: MODULE_TYPE13,
|
|
7624
|
+
platform: PLATFORM13,
|
|
7099
7625
|
networkId,
|
|
7100
7626
|
onChainId: tokenConfig.onChainId,
|
|
7101
7627
|
symbol: tokenConfig.symbol ?? "Unit",
|
|
@@ -7112,8 +7638,8 @@ var fetchTokens12 = async ({
|
|
|
7112
7638
|
// src/modules/substrate-tokens/getMiniMetadata.ts
|
|
7113
7639
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION8 } from "@talismn/chaindata-provider";
|
|
7114
7640
|
import { compactMetadata as compactMetadata6, encodeMetadata as encodeMetadata6, parseMetadataRpc as parseMetadataRpc20 } from "@talismn/scale";
|
|
7115
|
-
var
|
|
7116
|
-
const source =
|
|
7641
|
+
var getMiniMetadata13 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
7642
|
+
const source = MODULE_TYPE13;
|
|
7117
7643
|
const chainId = networkId;
|
|
7118
7644
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
7119
7645
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -7146,12 +7672,12 @@ var getData5 = (metadataRpc, pallet) => {
|
|
|
7146
7672
|
|
|
7147
7673
|
// src/modules/substrate-tokens/getTransferCallData.ts
|
|
7148
7674
|
import { mergeUint8 as mergeUint88 } from "@polkadot-api/utils";
|
|
7149
|
-
import { isTokenOfType as
|
|
7675
|
+
import { isTokenOfType as isTokenOfType13 } from "@talismn/chaindata-provider";
|
|
7150
7676
|
import { papiParse as papiParse4, parseMetadataRpc as parseMetadataRpc21 } from "@talismn/scale";
|
|
7151
7677
|
import { Binary as Binary7, Enum as Enum5 } from "polkadot-api";
|
|
7152
|
-
var
|
|
7153
|
-
if (!
|
|
7154
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
7678
|
+
var getTransferCallData13 = ({ from: from2, to, value, token, type, metadataRpc, config }) => {
|
|
7679
|
+
if (!isTokenOfType13(token, MODULE_TYPE13))
|
|
7680
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE13}.`);
|
|
7155
7681
|
const { builder } = parseMetadataRpc21(metadataRpc);
|
|
7156
7682
|
const options = getCallDataOptions(to, token, value, type, config);
|
|
7157
7683
|
const callData = getCallDataFromOptions(builder, options);
|
|
@@ -7264,9 +7790,9 @@ var getCallDataOptions = (to, token, value, type, config) => {
|
|
|
7264
7790
|
};
|
|
7265
7791
|
|
|
7266
7792
|
// src/modules/substrate-tokens/subscribeBalances.ts
|
|
7267
|
-
import { map as map5, of as
|
|
7268
|
-
var
|
|
7269
|
-
if (!tokensWithAddresses.length) return
|
|
7793
|
+
import { map as map5, of as of14 } from "rxjs";
|
|
7794
|
+
var subscribeBalances13 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
7795
|
+
if (!tokensWithAddresses.length) return of14({ success: [], errors: [] });
|
|
7270
7796
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
7271
7797
|
const queries = buildQueries3(networkId, balanceDefs, miniMetadata);
|
|
7272
7798
|
return getRpcQueryPack$(connector, networkId, queries).pipe(
|
|
@@ -7279,31 +7805,31 @@ var subscribeBalances12 = ({ networkId, tokensWithAddresses, connector, miniMeta
|
|
|
7279
7805
|
|
|
7280
7806
|
// src/modules/substrate-tokens/module.ts
|
|
7281
7807
|
var SubTokensBalanceModule = {
|
|
7282
|
-
type:
|
|
7283
|
-
platform:
|
|
7284
|
-
getMiniMetadata:
|
|
7285
|
-
fetchTokens:
|
|
7286
|
-
fetchBalances:
|
|
7287
|
-
subscribeBalances:
|
|
7288
|
-
getTransferCallData:
|
|
7808
|
+
type: MODULE_TYPE13,
|
|
7809
|
+
platform: PLATFORM13,
|
|
7810
|
+
getMiniMetadata: getMiniMetadata13,
|
|
7811
|
+
fetchTokens: fetchTokens13,
|
|
7812
|
+
fetchBalances: fetchBalances13,
|
|
7813
|
+
subscribeBalances: subscribeBalances13,
|
|
7814
|
+
getTransferCallData: getTransferCallData13
|
|
7289
7815
|
};
|
|
7290
7816
|
|
|
7291
7817
|
// src/modules/substrate-tokens/types.ts
|
|
7292
7818
|
import { SubTokensTokenSchema as SubTokensTokenSchema2 } from "@talismn/chaindata-provider";
|
|
7293
|
-
import
|
|
7294
|
-
var SubTokensTokenConfigSchema =
|
|
7819
|
+
import z18 from "zod/v4";
|
|
7820
|
+
var SubTokensTokenConfigSchema = z18.strictObject({
|
|
7295
7821
|
onChainId: SubTokensTokenSchema2.shape.onChainId,
|
|
7296
7822
|
...TokenConfigBaseSchema.shape,
|
|
7297
7823
|
// force these 3 fields because in this module we wont pull anything from chain
|
|
7298
|
-
symbol:
|
|
7299
|
-
decimals:
|
|
7300
|
-
existentialDeposit:
|
|
7824
|
+
symbol: z18.string().nonempty(),
|
|
7825
|
+
decimals: z18.number(),
|
|
7826
|
+
existentialDeposit: z18.string().nonempty()
|
|
7301
7827
|
});
|
|
7302
|
-
var SubTokensModuleConfigSchema =
|
|
7303
|
-
palletId:
|
|
7828
|
+
var SubTokensModuleConfigSchema = z18.strictObject({
|
|
7829
|
+
palletId: z18.string().optional()
|
|
7304
7830
|
});
|
|
7305
|
-
var SubTokensMiniMetadataExtraSchema =
|
|
7306
|
-
palletId:
|
|
7831
|
+
var SubTokensMiniMetadataExtraSchema = z18.strictObject({
|
|
7832
|
+
palletId: z18.string()
|
|
7307
7833
|
});
|
|
7308
7834
|
|
|
7309
7835
|
// src/modules/index.ts
|
|
@@ -7319,7 +7845,8 @@ var BALANCE_MODULES = [
|
|
|
7319
7845
|
EvmUniswapV2BalanceModule,
|
|
7320
7846
|
EvmNativeBalanceModule,
|
|
7321
7847
|
SolNativeBalanceModule,
|
|
7322
|
-
SolSplBalanceModule
|
|
7848
|
+
SolSplBalanceModule,
|
|
7849
|
+
SolToken2022BalanceModule
|
|
7323
7850
|
];
|
|
7324
7851
|
|
|
7325
7852
|
// src/getMiniMetadatas/getMetadataRpc.ts
|
|
@@ -7427,16 +7954,16 @@ var BalancesProvider = class {
|
|
|
7427
7954
|
this.#chaindataProvider = chaindataProvider;
|
|
7428
7955
|
this.#chainConnectors = chainConnectors;
|
|
7429
7956
|
this.#storage = new BehaviorSubject2({
|
|
7430
|
-
balances:
|
|
7431
|
-
miniMetadatas:
|
|
7957
|
+
balances: keyBy9(storage.balances.filter(isNotNil10), (b) => getBalanceId(b)),
|
|
7958
|
+
miniMetadatas: keyBy9(storage.miniMetadatas.filter(isNotNil10), (m) => m.id)
|
|
7432
7959
|
});
|
|
7433
7960
|
}
|
|
7434
7961
|
get storage$() {
|
|
7435
7962
|
return this.#storage.pipe(
|
|
7436
7963
|
map6(
|
|
7437
7964
|
({ balances, miniMetadatas }) => ({
|
|
7438
|
-
balances: values2(balances).filter(
|
|
7439
|
-
miniMetadatas: values2(miniMetadatas).filter(
|
|
7965
|
+
balances: values2(balances).filter(isNotNil10).sort(sortByBalanceId),
|
|
7966
|
+
miniMetadatas: values2(miniMetadatas).filter(isNotNil10).sort(sortByMiniMetadataId)
|
|
7440
7967
|
}),
|
|
7441
7968
|
shareReplay(1)
|
|
7442
7969
|
)
|
|
@@ -7444,8 +7971,8 @@ var BalancesProvider = class {
|
|
|
7444
7971
|
}
|
|
7445
7972
|
get storedMiniMetadataMapById$() {
|
|
7446
7973
|
return this.#storage.pipe(
|
|
7447
|
-
map6((storage) =>
|
|
7448
|
-
|
|
7974
|
+
map6((storage) => keyBy9(storage.miniMetadatas, (m) => m.id)),
|
|
7975
|
+
distinctUntilChanged11(isEqual11),
|
|
7449
7976
|
shareReplay(1)
|
|
7450
7977
|
);
|
|
7451
7978
|
}
|
|
@@ -7465,7 +7992,7 @@ var BalancesProvider = class {
|
|
|
7465
7992
|
)
|
|
7466
7993
|
),
|
|
7467
7994
|
switchMap2((addressesByTokenIdByNetworkId) => {
|
|
7468
|
-
if (!keys3(addressesByTokenIdByNetworkId).length) return
|
|
7995
|
+
if (!keys3(addressesByTokenIdByNetworkId).length) return of15({ isStale: false, results: [] });
|
|
7469
7996
|
return combineLatest({
|
|
7470
7997
|
isStale: timer(3e4).pipe(
|
|
7471
7998
|
map6(() => true),
|
|
@@ -7490,7 +8017,7 @@ var BalancesProvider = class {
|
|
|
7490
8017
|
failedBalanceIds: results.flatMap((result) => result.failedBalanceIds)
|
|
7491
8018
|
})
|
|
7492
8019
|
),
|
|
7493
|
-
|
|
8020
|
+
distinctUntilChanged11(isEqual11)
|
|
7494
8021
|
);
|
|
7495
8022
|
}
|
|
7496
8023
|
fetchBalances(addressesByTokenId) {
|
|
@@ -7529,7 +8056,7 @@ var BalancesProvider = class {
|
|
|
7529
8056
|
}
|
|
7530
8057
|
default: {
|
|
7531
8058
|
log_default.warn("[balances] Unsupported network platform for module", { networkId, mod });
|
|
7532
|
-
return
|
|
8059
|
+
return of15({ status: "live", balances: [], failedBalanceIds: [] });
|
|
7533
8060
|
}
|
|
7534
8061
|
}
|
|
7535
8062
|
})
|
|
@@ -7537,14 +8064,14 @@ var BalancesProvider = class {
|
|
|
7537
8064
|
}),
|
|
7538
8065
|
map6((results) => {
|
|
7539
8066
|
const errorBalanceIds = results.flatMap((result) => result.failedBalanceIds);
|
|
7540
|
-
const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(
|
|
8067
|
+
const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(isNotNil10).map((b) => ({ ...b, status: "stale" }));
|
|
7541
8068
|
return {
|
|
7542
8069
|
status: results.some(({ status }) => status === "initialising") ? "initialising" : "live",
|
|
7543
8070
|
balances: results.flatMap((result) => result.balances).concat(staleBalances).sort(sortByBalanceId),
|
|
7544
8071
|
failedBalanceIds: []
|
|
7545
8072
|
};
|
|
7546
8073
|
}),
|
|
7547
|
-
|
|
8074
|
+
distinctUntilChanged11(isEqual11)
|
|
7548
8075
|
);
|
|
7549
8076
|
}
|
|
7550
8077
|
getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
|
|
@@ -7553,7 +8080,7 @@ var BalancesProvider = class {
|
|
|
7553
8080
|
{ networkId, mod, tokensWithAddresses },
|
|
7554
8081
|
() => {
|
|
7555
8082
|
if (!tokensWithAddresses.length)
|
|
7556
|
-
return
|
|
8083
|
+
return of15({ status: "live", balances: [], failedBalanceIds: [] });
|
|
7557
8084
|
const moduleAddressesByTokenId = fromPairs2(
|
|
7558
8085
|
tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
|
|
7559
8086
|
);
|
|
@@ -7563,7 +8090,7 @@ var BalancesProvider = class {
|
|
|
7563
8090
|
if (!this.#chainConnectors.substrate) {
|
|
7564
8091
|
log_default.warn("[balances] no substrate connector or miniMetadata for module", mod.type);
|
|
7565
8092
|
return defer(
|
|
7566
|
-
() =>
|
|
8093
|
+
() => of15({
|
|
7567
8094
|
status: "initialising",
|
|
7568
8095
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7569
8096
|
failedBalanceIds: []
|
|
@@ -7622,7 +8149,7 @@ var BalancesProvider = class {
|
|
|
7622
8149
|
{ networkId, mod, tokensWithAddresses },
|
|
7623
8150
|
() => {
|
|
7624
8151
|
if (!tokensWithAddresses.length)
|
|
7625
|
-
return
|
|
8152
|
+
return of15({ status: "live", balances: [], failedBalanceIds: [] });
|
|
7626
8153
|
const moduleAddressesByTokenId = fromPairs2(
|
|
7627
8154
|
tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
|
|
7628
8155
|
);
|
|
@@ -7632,7 +8159,7 @@ var BalancesProvider = class {
|
|
|
7632
8159
|
if (!this.#chainConnectors.evm) {
|
|
7633
8160
|
log_default.warn("[balances] no ethereum connector for module", mod.type);
|
|
7634
8161
|
return defer(
|
|
7635
|
-
() =>
|
|
8162
|
+
() => of15({
|
|
7636
8163
|
status: "initialising",
|
|
7637
8164
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7638
8165
|
failedBalanceIds: []
|
|
@@ -7681,7 +8208,7 @@ var BalancesProvider = class {
|
|
|
7681
8208
|
{ networkId, mod, tokensWithAddresses },
|
|
7682
8209
|
() => {
|
|
7683
8210
|
if (!tokensWithAddresses.length)
|
|
7684
|
-
return
|
|
8211
|
+
return of15({ status: "live", balances: [], failedBalanceIds: [] });
|
|
7685
8212
|
const moduleAddressesByTokenId = fromPairs2(
|
|
7686
8213
|
tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
|
|
7687
8214
|
);
|
|
@@ -7691,7 +8218,7 @@ var BalancesProvider = class {
|
|
|
7691
8218
|
if (!this.#chainConnectors.solana) {
|
|
7692
8219
|
log_default.warn("[balances] no solana connector for module", mod.type);
|
|
7693
8220
|
return defer(
|
|
7694
|
-
() =>
|
|
8221
|
+
() => of15({
|
|
7695
8222
|
status: "initialising",
|
|
7696
8223
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7697
8224
|
failedBalanceIds: []
|
|
@@ -7705,6 +8232,11 @@ var BalancesProvider = class {
|
|
|
7705
8232
|
}).pipe(
|
|
7706
8233
|
catchError(() => EMPTY),
|
|
7707
8234
|
// don't emit, let provider mark balances stale
|
|
8235
|
+
tap((results) => {
|
|
8236
|
+
if (results.dynamicTokens?.length) {
|
|
8237
|
+
this.#chaindataProvider.registerDynamicTokens(results.dynamicTokens);
|
|
8238
|
+
}
|
|
8239
|
+
}),
|
|
7708
8240
|
map6(
|
|
7709
8241
|
(results) => ({
|
|
7710
8242
|
status: "live",
|
|
@@ -7738,14 +8270,14 @@ var BalancesProvider = class {
|
|
|
7738
8270
|
if (balancesResult.status !== "live") return;
|
|
7739
8271
|
const storage = this.#storage.getValue();
|
|
7740
8272
|
const failedIds = new Set(balancesResult.failedBalanceIds);
|
|
7741
|
-
const balances =
|
|
8273
|
+
const balances = assign12(
|
|
7742
8274
|
{},
|
|
7743
8275
|
storage.balances,
|
|
7744
8276
|
// delete all balances expected in the result set (except the ones that failed). because if they are not present it means they are empty.
|
|
7745
8277
|
fromPairs2(
|
|
7746
8278
|
balanceIds.filter((bid) => !failedIds.has(bid)).map((balanceId) => [balanceId, void 0])
|
|
7747
8279
|
),
|
|
7748
|
-
|
|
8280
|
+
keyBy9(
|
|
7749
8281
|
// storage balances must have status "cache", because they are used as start value when initialising subsequent subscriptions
|
|
7750
8282
|
balancesResult.balances.map((b) => ({ ...b, status: "cache" })),
|
|
7751
8283
|
(b) => getBalanceId(b)
|
|
@@ -7755,7 +8287,7 @@ var BalancesProvider = class {
|
|
|
7755
8287
|
const balance = balances[errorBalanceId];
|
|
7756
8288
|
if (balance) balance.status = "stale";
|
|
7757
8289
|
}
|
|
7758
|
-
this.#storage.next(
|
|
8290
|
+
this.#storage.next(assign12({}, storage, { balances }));
|
|
7759
8291
|
}
|
|
7760
8292
|
getNetworkMiniMetadatas$(networkId) {
|
|
7761
8293
|
return getSharedObservable(`BalancesProvider.getNetworkMiniMetadatas$`, { networkId }, () => {
|
|
@@ -7763,11 +8295,11 @@ var BalancesProvider = class {
|
|
|
7763
8295
|
switchMap2(
|
|
7764
8296
|
(network) => isNetworkDot(network) ? this.getNetworkSpecVersion$(networkId).pipe(
|
|
7765
8297
|
switchMap2(
|
|
7766
|
-
(specVersion) => specVersion === null ?
|
|
8298
|
+
(specVersion) => specVersion === null ? of15([]) : this.getMiniMetadatas$(networkId, specVersion)
|
|
7767
8299
|
)
|
|
7768
|
-
) :
|
|
8300
|
+
) : of15([])
|
|
7769
8301
|
),
|
|
7770
|
-
|
|
8302
|
+
distinctUntilChanged11(isEqual11)
|
|
7771
8303
|
);
|
|
7772
8304
|
});
|
|
7773
8305
|
}
|
|
@@ -7783,7 +8315,7 @@ var BalancesProvider = class {
|
|
|
7783
8315
|
).pipe(
|
|
7784
8316
|
catchError(() => {
|
|
7785
8317
|
log_default.warn("Failed to fetch spec version for network", networkId);
|
|
7786
|
-
return
|
|
8318
|
+
return of15(null);
|
|
7787
8319
|
})
|
|
7788
8320
|
);
|
|
7789
8321
|
}
|
|
@@ -7800,9 +8332,9 @@ var BalancesProvider = class {
|
|
|
7800
8332
|
storedMiniMetadatas: this.getStoredMiniMetadatas$(miniMetadataIds)
|
|
7801
8333
|
}).pipe(
|
|
7802
8334
|
switchMap2(({ storedMiniMetadatas, defaultMiniMetadatas }) => {
|
|
7803
|
-
if (defaultMiniMetadatas) return
|
|
7804
|
-
if (storedMiniMetadatas) return
|
|
7805
|
-
if (!this.#chainConnectors.substrate) return
|
|
8335
|
+
if (defaultMiniMetadatas) return of15(defaultMiniMetadatas);
|
|
8336
|
+
if (storedMiniMetadatas) return of15(storedMiniMetadatas);
|
|
8337
|
+
if (!this.#chainConnectors.substrate) return of15([]);
|
|
7806
8338
|
return from(
|
|
7807
8339
|
withRetry(
|
|
7808
8340
|
() => (
|
|
@@ -7825,27 +8357,27 @@ var BalancesProvider = class {
|
|
|
7825
8357
|
).pipe(
|
|
7826
8358
|
catchError(() => {
|
|
7827
8359
|
log_default.warn("Failed to fetch metadata for network", networkId);
|
|
7828
|
-
return
|
|
8360
|
+
return of15([]);
|
|
7829
8361
|
}),
|
|
7830
8362
|
// and persist in storage for later reuse
|
|
7831
8363
|
tap((newMiniMetadatas) => {
|
|
7832
8364
|
if (!newMiniMetadatas.length) return;
|
|
7833
8365
|
const storage = this.#storage.getValue();
|
|
7834
|
-
const miniMetadatas =
|
|
8366
|
+
const miniMetadatas = assign12(
|
|
7835
8367
|
// keep minimetadatas of other networks
|
|
7836
|
-
|
|
8368
|
+
keyBy9(
|
|
7837
8369
|
values2(storage.miniMetadatas).filter((m) => m.chainId !== networkId),
|
|
7838
8370
|
(m) => m.id
|
|
7839
8371
|
),
|
|
7840
8372
|
// add the ones for our network
|
|
7841
|
-
|
|
8373
|
+
keyBy9(newMiniMetadatas, (m) => m.id)
|
|
7842
8374
|
);
|
|
7843
|
-
this.#storage.next(
|
|
8375
|
+
this.#storage.next(assign12({}, storage, { miniMetadatas }));
|
|
7844
8376
|
})
|
|
7845
8377
|
);
|
|
7846
8378
|
}),
|
|
7847
8379
|
// emit only when mini metadata changes, as a change here would restart all subscriptions for the network
|
|
7848
|
-
|
|
8380
|
+
distinctUntilChanged11(isEqual11)
|
|
7849
8381
|
);
|
|
7850
8382
|
}
|
|
7851
8383
|
getStoredMiniMetadatas$(miniMetadataIds) {
|
|
@@ -7855,7 +8387,7 @@ var BalancesProvider = class {
|
|
|
7855
8387
|
return miniMetadatas.length && miniMetadatas.every(isTruthy) ? miniMetadatas : null;
|
|
7856
8388
|
}),
|
|
7857
8389
|
// source changes very often
|
|
7858
|
-
|
|
8390
|
+
distinctUntilChanged11(isEqual11)
|
|
7859
8391
|
);
|
|
7860
8392
|
}
|
|
7861
8393
|
getDefaultMiniMetadatas$(miniMetadataIds) {
|
|
@@ -7870,7 +8402,7 @@ var BalancesProvider = class {
|
|
|
7870
8402
|
const balanceDefs = toPairs2(addressesByToken).flatMap(
|
|
7871
8403
|
([tokenId, addresses]) => addresses.map((address) => [tokenId, address])
|
|
7872
8404
|
);
|
|
7873
|
-
return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(
|
|
8405
|
+
return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(isNotNil10).sort(sortByBalanceId);
|
|
7874
8406
|
}
|
|
7875
8407
|
cleanupAddressesByTokenId$(addressesByTokenId) {
|
|
7876
8408
|
return this.#chaindataProvider.getNetworksMapById$().pipe(
|
|
@@ -7881,7 +8413,7 @@ var BalancesProvider = class {
|
|
|
7881
8413
|
const network = networksById[networkId];
|
|
7882
8414
|
return [
|
|
7883
8415
|
tokenId,
|
|
7884
|
-
|
|
8416
|
+
uniq6(addresses.map(normalizeAddress)).filter(
|
|
7885
8417
|
(address) => network && isAddressCompatibleWithNetwork(network, address)
|
|
7886
8418
|
)
|
|
7887
8419
|
];
|
|
@@ -7943,6 +8475,8 @@ export {
|
|
|
7943
8475
|
SolNativeTokenConfigSchema,
|
|
7944
8476
|
SolSplBalanceModule,
|
|
7945
8477
|
SolSplTokenConfigSchema,
|
|
8478
|
+
SolToken2022BalanceModule,
|
|
8479
|
+
SolToken2022TokenConfigSchema,
|
|
7946
8480
|
SubAssetsBalanceModule,
|
|
7947
8481
|
SubAssetsTokenConfigSchema,
|
|
7948
8482
|
SubDTaoBalanceModule,
|