@talismn/balances 1.3.7 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +117 -22
- package/dist/index.d.ts +117 -22
- package/dist/index.js +1576 -825
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1388 -635
- package/dist/index.mjs.map +1 -1
- package/package.json +17 -19
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
// src/configureBigNumber.ts
|
|
2
|
+
import BigNumber from "bignumber.js";
|
|
3
|
+
BigNumber.set({ STRICT: false });
|
|
4
|
+
var configureBigNumber_default = BigNumber;
|
|
5
|
+
|
|
1
6
|
// src/BalancesProvider.ts
|
|
2
7
|
import {
|
|
3
8
|
isNetworkDot,
|
|
@@ -7,20 +12,20 @@ import {
|
|
|
7
12
|
getAccountPlatformFromAddress,
|
|
8
13
|
normalizeAddress
|
|
9
14
|
} from "@talismn/crypto";
|
|
10
|
-
import { getSharedObservable, isNotNil as
|
|
11
|
-
import { assign as
|
|
15
|
+
import { getSharedObservable, isNotNil as isNotNil10, isTruthy, keepAlive } from "@talismn/util";
|
|
16
|
+
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
17
|
import {
|
|
13
18
|
BehaviorSubject as BehaviorSubject2,
|
|
14
19
|
catchError,
|
|
15
20
|
combineLatest,
|
|
16
21
|
defer,
|
|
17
|
-
distinctUntilChanged as
|
|
22
|
+
distinctUntilChanged as distinctUntilChanged11,
|
|
18
23
|
EMPTY,
|
|
19
24
|
filter,
|
|
20
25
|
firstValueFrom,
|
|
21
26
|
from,
|
|
22
27
|
map as map6,
|
|
23
|
-
of as
|
|
28
|
+
of as of15,
|
|
24
29
|
shareReplay,
|
|
25
30
|
startWith,
|
|
26
31
|
switchMap as switchMap2,
|
|
@@ -38,7 +43,7 @@ import anylogger from "anylogger";
|
|
|
38
43
|
// package.json
|
|
39
44
|
var package_default = {
|
|
40
45
|
name: "@talismn/balances",
|
|
41
|
-
version: "1.
|
|
46
|
+
version: "1.5.0",
|
|
42
47
|
author: "Talisman",
|
|
43
48
|
homepage: "https://talisman.xyz",
|
|
44
49
|
license: "GPL-3.0-or-later",
|
|
@@ -66,9 +71,9 @@ var package_default = {
|
|
|
66
71
|
},
|
|
67
72
|
dependencies: {
|
|
68
73
|
"@metaplex-foundation/mpl-token-metadata": "^3.4.0",
|
|
69
|
-
"@metaplex-foundation/umi": "^1.
|
|
74
|
+
"@metaplex-foundation/umi": "^1.5.1",
|
|
70
75
|
"@polkadot-api/utils": "0.2.0",
|
|
71
|
-
"@solana/spl-token": "^0.4.
|
|
76
|
+
"@solana/spl-token": "^0.4.14",
|
|
72
77
|
"@solana/web3.js": "^1.98.2",
|
|
73
78
|
"@talismn/chain-connectors": "workspace:*",
|
|
74
79
|
"@talismn/chaindata-provider": "workspace:*",
|
|
@@ -78,28 +83,26 @@ var package_default = {
|
|
|
78
83
|
"@talismn/token-rates": "workspace:*",
|
|
79
84
|
"@talismn/util": "workspace:*",
|
|
80
85
|
anylogger: "^1.0.11",
|
|
81
|
-
"bignumber.js": "^
|
|
82
|
-
"lodash-es": "4.
|
|
86
|
+
"bignumber.js": "^11.1.3",
|
|
87
|
+
"lodash-es": "4.18.1",
|
|
83
88
|
"p-queue": "8.1.0",
|
|
84
89
|
"polkadot-api": "1.23.3",
|
|
85
|
-
rxjs: "^7.8.
|
|
90
|
+
rxjs: "^7.8.2",
|
|
86
91
|
"scale-ts": "^1.6.1",
|
|
87
|
-
viem: "
|
|
88
|
-
zod: "^
|
|
92
|
+
viem: "2.52.2",
|
|
93
|
+
zod: "^4.4.3"
|
|
89
94
|
},
|
|
90
95
|
devDependencies: {
|
|
91
96
|
"@polkadot/api-contract": "16.1.2",
|
|
92
97
|
"@polkadot/types": "16.1.2",
|
|
93
|
-
"@polkadot/util": "13.5.3",
|
|
94
98
|
"@talismn/tsconfig": "workspace:*",
|
|
95
99
|
"@types/lodash-es": "4.17.12",
|
|
96
|
-
|
|
100
|
+
"@types/node": "^24.5.1",
|
|
101
|
+
typescript: "^6.0.3"
|
|
97
102
|
},
|
|
98
103
|
peerDependencies: {
|
|
99
104
|
"@polkadot/api-contract": "*",
|
|
100
105
|
"@polkadot/types": "*",
|
|
101
|
-
"@polkadot/util": "*",
|
|
102
|
-
"@polkadot/util-crypto": "*",
|
|
103
106
|
"@substrate/txwrapper-core": "*"
|
|
104
107
|
},
|
|
105
108
|
types: "./dist/index.d.ts",
|
|
@@ -1022,13 +1025,8 @@ import { assign, omit } from "lodash-es";
|
|
|
1022
1025
|
import z from "zod/v4";
|
|
1023
1026
|
|
|
1024
1027
|
// src/modules/evm-erc20/utils.ts
|
|
1025
|
-
import {
|
|
1026
|
-
|
|
1027
|
-
erc20Abi as erc20Abi2,
|
|
1028
|
-
erc20Abi_bytes32,
|
|
1029
|
-
getContract,
|
|
1030
|
-
hexToString
|
|
1031
|
-
} from "viem";
|
|
1028
|
+
import { isErrorOfName } from "@talismn/util";
|
|
1029
|
+
import { erc20Abi as erc20Abi2, erc20Abi_bytes32, getContract, hexToString } from "viem";
|
|
1032
1030
|
var getErc20ContractData = async (client, contractAddress) => {
|
|
1033
1031
|
try {
|
|
1034
1032
|
const contract = getTypedContract(client, erc20Abi2, contractAddress);
|
|
@@ -1038,7 +1036,7 @@ var getErc20ContractData = async (client, contractAddress) => {
|
|
|
1038
1036
|
contract.read.name()
|
|
1039
1037
|
]);
|
|
1040
1038
|
} catch (e) {
|
|
1041
|
-
if (e
|
|
1039
|
+
if (isErrorOfName(e, "ContractFunctionExecutionError")) {
|
|
1042
1040
|
const contract = getTypedContract(client, erc20Abi_bytes32, contractAddress);
|
|
1043
1041
|
var [bytesSymbol, decimals, nameSymbol] = await Promise.all([
|
|
1044
1042
|
contract.read.symbol(),
|
|
@@ -1255,21 +1253,30 @@ var fetchBalances2 = async ({
|
|
|
1255
1253
|
}
|
|
1256
1254
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
1257
1255
|
if (client.chain?.contracts?.multicall3 && balanceDefs.length > 1) {
|
|
1258
|
-
|
|
1259
|
-
|
|
1256
|
+
try {
|
|
1257
|
+
return await fetchWithMulticall(
|
|
1258
|
+
client,
|
|
1259
|
+
balanceDefs,
|
|
1260
|
+
client.chain.contracts.multicall3.address
|
|
1261
|
+
);
|
|
1262
|
+
} catch {
|
|
1263
|
+
}
|
|
1260
1264
|
}
|
|
1261
|
-
return
|
|
1265
|
+
return fetchWithGetBalance(client, balanceDefs);
|
|
1262
1266
|
};
|
|
1263
|
-
var
|
|
1267
|
+
var fetchWithGetBalance = async (client, balanceDefs) => {
|
|
1264
1268
|
if (balanceDefs.length === 0) return { success: [], errors: [] };
|
|
1265
1269
|
const results = await Promise.allSettled(
|
|
1266
1270
|
balanceDefs.map(async ({ token, address }) => {
|
|
1267
1271
|
try {
|
|
1268
|
-
const result = await client.
|
|
1272
|
+
const result = await client.request({
|
|
1273
|
+
method: "eth_getBalance",
|
|
1274
|
+
params: [address, "latest"]
|
|
1275
|
+
});
|
|
1269
1276
|
const balance = {
|
|
1270
1277
|
address,
|
|
1271
1278
|
tokenId: token.id,
|
|
1272
|
-
value: result.toString(),
|
|
1279
|
+
value: BigInt(result).toString(),
|
|
1273
1280
|
source: MODULE_TYPE2,
|
|
1274
1281
|
networkId: parseTokenId2(token.id).networkId,
|
|
1275
1282
|
status: "live"
|
|
@@ -1303,55 +1310,28 @@ var fetchWithoutMulticall = async (client, balanceDefs) => {
|
|
|
1303
1310
|
};
|
|
1304
1311
|
var fetchWithMulticall = async (client, balanceDefs, multicall3Address) => {
|
|
1305
1312
|
if (balanceDefs.length === 0) return { success: [], errors: [] };
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
acc.errors.push({
|
|
1329
|
-
tokenId: balanceDefs[index].token.id,
|
|
1330
|
-
address: balanceDefs[index].address,
|
|
1331
|
-
error: new BalanceFetchError(
|
|
1332
|
-
`Failed to get balance for token ${balanceDefs[index].token.id} and address ${balanceDefs[index].address} on chain ${client.chain?.id}`,
|
|
1333
|
-
balanceDefs[index].token.id,
|
|
1334
|
-
balanceDefs[index].address,
|
|
1335
|
-
result.error
|
|
1336
|
-
)
|
|
1337
|
-
});
|
|
1338
|
-
}
|
|
1339
|
-
return acc;
|
|
1340
|
-
},
|
|
1341
|
-
{ success: [], errors: [] }
|
|
1342
|
-
);
|
|
1343
|
-
} catch (err) {
|
|
1344
|
-
const errors = balanceDefs.map((balanceDef) => ({
|
|
1345
|
-
tokenId: balanceDef.token.id,
|
|
1346
|
-
address: balanceDef.address,
|
|
1347
|
-
error: new BalanceFetchNetworkError(
|
|
1348
|
-
`Failed to get balances for evm-erc20 tokens on chain ${client.chain?.id}`,
|
|
1349
|
-
String(client.chain?.id),
|
|
1350
|
-
err
|
|
1351
|
-
)
|
|
1352
|
-
}));
|
|
1353
|
-
return { success: [], errors };
|
|
1354
|
-
}
|
|
1313
|
+
const results = await client.multicall({
|
|
1314
|
+
allowFailure: false,
|
|
1315
|
+
contracts: balanceDefs.map(({ address }) => ({
|
|
1316
|
+
address: multicall3Address,
|
|
1317
|
+
abi: abiMulticall,
|
|
1318
|
+
functionName: "getEthBalance",
|
|
1319
|
+
args: [address]
|
|
1320
|
+
}))
|
|
1321
|
+
});
|
|
1322
|
+
return {
|
|
1323
|
+
success: results.map(
|
|
1324
|
+
(value, index) => ({
|
|
1325
|
+
address: balanceDefs[index].address,
|
|
1326
|
+
tokenId: balanceDefs[index].token.id,
|
|
1327
|
+
value: String(value),
|
|
1328
|
+
source: MODULE_TYPE2,
|
|
1329
|
+
networkId: parseTokenId2(balanceDefs[index].token.id).networkId,
|
|
1330
|
+
status: "live"
|
|
1331
|
+
})
|
|
1332
|
+
),
|
|
1333
|
+
errors: []
|
|
1334
|
+
};
|
|
1355
1335
|
};
|
|
1356
1336
|
|
|
1357
1337
|
// src/modules/evm-native/fetchTokens.ts
|
|
@@ -1472,7 +1452,6 @@ var PLATFORM3 = EvmUniswapV2TokenSchema.shape.platform.value;
|
|
|
1472
1452
|
// src/modules/evm-uniswapv2/fetchBalances.ts
|
|
1473
1453
|
import { parseTokenId as parseTokenId3 } from "@talismn/chaindata-provider";
|
|
1474
1454
|
import { isEthereumAddress as isEthereumAddress5 } from "@talismn/crypto";
|
|
1475
|
-
import BigNumber from "bignumber.js";
|
|
1476
1455
|
import { keyBy, uniq } from "lodash-es";
|
|
1477
1456
|
import { getContract as getContract2 } from "viem";
|
|
1478
1457
|
var fetchBalances3 = async ({
|
|
@@ -1564,7 +1543,7 @@ var fetchPoolBalances = async (client, balanceDefs) => {
|
|
|
1564
1543
|
label,
|
|
1565
1544
|
amount
|
|
1566
1545
|
});
|
|
1567
|
-
const ratio =
|
|
1546
|
+
const ratio = configureBigNumber_default(String(balance)).div(totalSupply === 0n ? "1" : String(totalSupply));
|
|
1568
1547
|
acc.success.push({
|
|
1569
1548
|
address,
|
|
1570
1549
|
tokenId: token.id,
|
|
@@ -1596,13 +1575,8 @@ import { assign as assign3, omit as omit2 } from "lodash-es";
|
|
|
1596
1575
|
import z4 from "zod/v4";
|
|
1597
1576
|
|
|
1598
1577
|
// src/modules/evm-uniswapv2/utils.ts
|
|
1599
|
-
import {
|
|
1600
|
-
|
|
1601
|
-
erc20Abi as erc20Abi4,
|
|
1602
|
-
erc20Abi_bytes32 as erc20Abi_bytes322,
|
|
1603
|
-
getContract as getContract3,
|
|
1604
|
-
hexToString as hexToString2
|
|
1605
|
-
} from "viem";
|
|
1578
|
+
import { isErrorOfName as isErrorOfName2 } from "@talismn/util";
|
|
1579
|
+
import { erc20Abi as erc20Abi4, erc20Abi_bytes32 as erc20Abi_bytes322, getContract as getContract3, hexToString as hexToString2 } from "viem";
|
|
1606
1580
|
var getErc20ContractData2 = async (client, contractAddress) => {
|
|
1607
1581
|
try {
|
|
1608
1582
|
const contract = getTypedContract2(client, erc20Abi4, contractAddress);
|
|
@@ -1612,7 +1586,7 @@ var getErc20ContractData2 = async (client, contractAddress) => {
|
|
|
1612
1586
|
contract.read.name()
|
|
1613
1587
|
]);
|
|
1614
1588
|
} catch (e) {
|
|
1615
|
-
if (e
|
|
1589
|
+
if (isErrorOfName2(e, "ContractFunctionExecutionError")) {
|
|
1616
1590
|
const contract = getTypedContract2(client, erc20Abi_bytes322, contractAddress);
|
|
1617
1591
|
var [bytesSymbol, decimals, nameSymbol] = await Promise.all([
|
|
1618
1592
|
contract.read.symbol(),
|
|
@@ -1852,8 +1826,8 @@ var fetchBalances4 = async ({
|
|
|
1852
1826
|
const results = await Promise.allSettled(
|
|
1853
1827
|
balanceDefs.map(async ({ token, address }) => {
|
|
1854
1828
|
try {
|
|
1855
|
-
const
|
|
1856
|
-
const lamports = await connection.getBalance(
|
|
1829
|
+
const publicKey3 = new PublicKey(address);
|
|
1830
|
+
const lamports = await connection.getBalance(publicKey3);
|
|
1857
1831
|
return {
|
|
1858
1832
|
address,
|
|
1859
1833
|
tokenId: token.id,
|
|
@@ -2009,8 +1983,8 @@ var MODULE_TYPE5 = SolSplTokenSchema.shape.type.value;
|
|
|
2009
1983
|
var PLATFORM5 = SolSplTokenSchema.shape.platform.value;
|
|
2010
1984
|
|
|
2011
1985
|
// src/modules/sol-spl/fetchBalances.ts
|
|
2012
|
-
import { PublicKey as
|
|
2013
|
-
import { solSplTokenId } from "@talismn/chaindata-provider";
|
|
1986
|
+
import { PublicKey as PublicKey4 } from "@solana/web3.js";
|
|
1987
|
+
import { SolSplTokenSchema as SolSplTokenSchema3, solSplTokenId } from "@talismn/chaindata-provider";
|
|
2014
1988
|
import { isNotNil as isNotNil2 } from "@talismn/util";
|
|
2015
1989
|
import { keyBy as keyBy2, uniq as uniq2 } from "lodash-es";
|
|
2016
1990
|
|
|
@@ -2054,9 +2028,9 @@ var buildNetworkStorageCoders = (chainId, miniMetadata, coders) => {
|
|
|
2054
2028
|
|
|
2055
2029
|
// src/modules/shared/fetchRuntimeCallResult.ts
|
|
2056
2030
|
import { parseMetadataRpc, toHex } from "@talismn/scale";
|
|
2057
|
-
var fetchRuntimeCallResult = async (connector, networkId,
|
|
2031
|
+
var fetchRuntimeCallResult = async (connector, networkId, metadataRpcOrBuilder, apiName, method, args) => {
|
|
2058
2032
|
try {
|
|
2059
|
-
const
|
|
2033
|
+
const builder = typeof metadataRpcOrBuilder === "string" ? parseMetadataRpc(metadataRpcOrBuilder).builder : metadataRpcOrBuilder;
|
|
2060
2034
|
const call = builder.buildRuntimeCall(apiName, method);
|
|
2061
2035
|
const hex = await connector.send(networkId, "state_call", [
|
|
2062
2036
|
`${apiName}_${method}`,
|
|
@@ -2127,17 +2101,17 @@ var decodeRpcQueryPack = (queries, result) => {
|
|
|
2127
2101
|
import { parseMetadataRpc as parseMetadataRpc2 } from "@talismn/scale";
|
|
2128
2102
|
var hasStorageItem = (metadata, palletName, itemName) => {
|
|
2129
2103
|
const pallet = metadata.pallets.find((p) => p.name === palletName);
|
|
2130
|
-
if (!pallet
|
|
2104
|
+
if (!pallet?.storage) return false;
|
|
2131
2105
|
return pallet.storage.items.some((item) => item.name === itemName);
|
|
2132
2106
|
};
|
|
2133
2107
|
var hasStorageItems = (metadata, palletName, itemNames) => {
|
|
2134
2108
|
const pallet = metadata.pallets.find((p) => p.name === palletName);
|
|
2135
|
-
if (!pallet
|
|
2109
|
+
if (!pallet?.storage) return false;
|
|
2136
2110
|
return itemNames.every((itemName) => pallet.storage?.items.some((item) => item.name === itemName));
|
|
2137
2111
|
};
|
|
2138
2112
|
var hasRuntimeApi = (metadata, apiName, method) => {
|
|
2139
2113
|
const api = metadata.apis.find((api2) => api2.name === apiName);
|
|
2140
|
-
if (!api
|
|
2114
|
+
if (!api?.methods) return false;
|
|
2141
2115
|
return api.methods.some((m) => m.name === method);
|
|
2142
2116
|
};
|
|
2143
2117
|
var getConstantValue = (metadataRpc, pallet, constant) => {
|
|
@@ -2172,8 +2146,77 @@ var getDetectedTokensIds$ = (address) => tokenIdsByAddress.pipe(
|
|
|
2172
2146
|
distinctUntilChanged5(isEqual5)
|
|
2173
2147
|
);
|
|
2174
2148
|
|
|
2149
|
+
// src/modules/sol-spl/onChainTokenMetadata.ts
|
|
2150
|
+
import { deserializeMetadata } from "@metaplex-foundation/mpl-token-metadata";
|
|
2151
|
+
import { publicKey, sol } from "@metaplex-foundation/umi";
|
|
2152
|
+
import { MintLayout } from "@solana/spl-token";
|
|
2153
|
+
import { PublicKey as PublicKey3 } from "@solana/web3.js";
|
|
2154
|
+
import { parseSolSplTokenId, SolSplTokenSchema as SolSplTokenSchema2 } from "@talismn/chaindata-provider";
|
|
2155
|
+
import z7 from "zod/v4";
|
|
2156
|
+
var TokenCacheSchema3 = z7.discriminatedUnion("isValid", [
|
|
2157
|
+
z7.strictObject({
|
|
2158
|
+
id: SolSplTokenSchema2.shape.id,
|
|
2159
|
+
isValid: z7.literal(true),
|
|
2160
|
+
...SolSplTokenSchema2.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
|
|
2161
|
+
}),
|
|
2162
|
+
z7.strictObject({
|
|
2163
|
+
id: SolSplTokenSchema2.shape.id,
|
|
2164
|
+
isValid: z7.literal(false)
|
|
2165
|
+
})
|
|
2166
|
+
]);
|
|
2167
|
+
var METAPLEX_PROGRAM_ID = new PublicKey3("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
|
|
2168
|
+
var ERROR_NO_MINT = "No mint info available";
|
|
2169
|
+
var ERROR_NO_METADATA = "No metadata account found";
|
|
2170
|
+
var ERROR_INVALID_DATA = "Invalid on-chain data";
|
|
2171
|
+
var fetchOnChainTokenData = async (connector, tokenId) => {
|
|
2172
|
+
try {
|
|
2173
|
+
const { networkId, mintAddress } = parseSolSplTokenId(tokenId);
|
|
2174
|
+
const connection = await connector.getConnection(networkId);
|
|
2175
|
+
if (!connection) {
|
|
2176
|
+
log_default.warn(`No connection found for network ${networkId}`);
|
|
2177
|
+
return null;
|
|
2178
|
+
}
|
|
2179
|
+
const mintPubKey = new PublicKey3(mintAddress);
|
|
2180
|
+
const mintInfo = await connection.getAccountInfo(mintPubKey);
|
|
2181
|
+
if (!mintInfo?.data) throw new Error(ERROR_NO_MINT);
|
|
2182
|
+
const mint = MintLayout.decode(mintInfo.data);
|
|
2183
|
+
const [metadataPDA] = PublicKey3.findProgramAddressSync(
|
|
2184
|
+
[Buffer.from("metadata"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],
|
|
2185
|
+
METAPLEX_PROGRAM_ID
|
|
2186
|
+
);
|
|
2187
|
+
const metadataAccount = await connection.getAccountInfo(new PublicKey3(metadataPDA));
|
|
2188
|
+
if (!metadataAccount) throw new Error(ERROR_NO_METADATA);
|
|
2189
|
+
const metadata = deserializeMetadata({
|
|
2190
|
+
publicKey: publicKey(metadataPDA),
|
|
2191
|
+
executable: metadataAccount.executable,
|
|
2192
|
+
owner: publicKey(metadataAccount.owner),
|
|
2193
|
+
lamports: sol(metadataAccount.lamports),
|
|
2194
|
+
data: metadataAccount.data
|
|
2195
|
+
});
|
|
2196
|
+
const parsed = TokenCacheSchema3.safeParse({
|
|
2197
|
+
id: tokenId,
|
|
2198
|
+
symbol: metadata.symbol.trim(),
|
|
2199
|
+
name: metadata.name.trim(),
|
|
2200
|
+
decimals: mint.decimals,
|
|
2201
|
+
isValid: true
|
|
2202
|
+
});
|
|
2203
|
+
if (!parsed.success) throw new Error(ERROR_INVALID_DATA);
|
|
2204
|
+
return parsed.data;
|
|
2205
|
+
} catch (err) {
|
|
2206
|
+
const msg = err.message;
|
|
2207
|
+
if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))
|
|
2208
|
+
return TokenCacheSchema3.parse({
|
|
2209
|
+
id: tokenId,
|
|
2210
|
+
isValid: false
|
|
2211
|
+
});
|
|
2212
|
+
log_default.warn("Failed to fetch sol-spl token data for %s", tokenId, { err });
|
|
2213
|
+
}
|
|
2214
|
+
return null;
|
|
2215
|
+
};
|
|
2216
|
+
|
|
2175
2217
|
// src/modules/sol-spl/fetchBalances.ts
|
|
2176
2218
|
var SPL_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
|
|
2219
|
+
var dynamicTokenMetadataCache = /* @__PURE__ */ new Map();
|
|
2177
2220
|
var fetchBalances5 = async ({
|
|
2178
2221
|
networkId,
|
|
2179
2222
|
tokensWithAddresses,
|
|
@@ -2183,18 +2226,22 @@ var fetchBalances5 = async ({
|
|
|
2183
2226
|
const connection = await connector.getConnection(networkId);
|
|
2184
2227
|
if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
|
|
2185
2228
|
const accountAddresses = uniq2(tokensWithAddresses.flatMap(([, addresses]) => addresses));
|
|
2229
|
+
const knownTokenIds = new Set(tokensWithAddresses.map(([token]) => token.id));
|
|
2230
|
+
const unknownMints = /* @__PURE__ */ new Set();
|
|
2186
2231
|
const balancesPerAddress = await Promise.all(
|
|
2187
2232
|
accountAddresses.map(async (address) => {
|
|
2188
|
-
const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new
|
|
2189
|
-
programId: new
|
|
2233
|
+
const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey4(address), {
|
|
2234
|
+
programId: new PublicKey4(SPL_PROGRAM_ID)
|
|
2190
2235
|
// SPL Token Program ID
|
|
2191
2236
|
});
|
|
2192
2237
|
const balances = tokenAccounts.value.map((d) => {
|
|
2193
2238
|
try {
|
|
2194
2239
|
const mintAddress = d.account.data.parsed.info.mint;
|
|
2195
2240
|
const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
|
|
2241
|
+
const tokenId = solSplTokenId(networkId, mintAddress);
|
|
2242
|
+
if (!knownTokenIds.has(tokenId) && value !== "0") unknownMints.add(mintAddress);
|
|
2196
2243
|
return {
|
|
2197
|
-
tokenId
|
|
2244
|
+
tokenId,
|
|
2198
2245
|
networkId,
|
|
2199
2246
|
address,
|
|
2200
2247
|
source: MODULE_TYPE5,
|
|
@@ -2217,6 +2264,42 @@ var fetchBalances5 = async ({
|
|
|
2217
2264
|
return [address, balances];
|
|
2218
2265
|
})
|
|
2219
2266
|
);
|
|
2267
|
+
const dynamicTokens = [];
|
|
2268
|
+
if (unknownMints.size) {
|
|
2269
|
+
await Promise.all(
|
|
2270
|
+
Array.from(unknownMints).map(async (mintAddress) => {
|
|
2271
|
+
const tokenId = solSplTokenId(networkId, mintAddress);
|
|
2272
|
+
let cached = dynamicTokenMetadataCache.get(tokenId);
|
|
2273
|
+
if (!cached) {
|
|
2274
|
+
const fetched = await fetchOnChainTokenData(connector, tokenId);
|
|
2275
|
+
if (fetched) {
|
|
2276
|
+
dynamicTokenMetadataCache.set(tokenId, fetched);
|
|
2277
|
+
cached = fetched;
|
|
2278
|
+
}
|
|
2279
|
+
}
|
|
2280
|
+
if (!cached?.isValid) return;
|
|
2281
|
+
const token = {
|
|
2282
|
+
id: tokenId,
|
|
2283
|
+
type: MODULE_TYPE5,
|
|
2284
|
+
platform: PLATFORM5,
|
|
2285
|
+
networkId,
|
|
2286
|
+
mintAddress,
|
|
2287
|
+
isDefault: true,
|
|
2288
|
+
symbol: cached.symbol,
|
|
2289
|
+
decimals: cached.decimals,
|
|
2290
|
+
...cached.name !== void 0 ? { name: cached.name } : {},
|
|
2291
|
+
...cached.logo !== void 0 ? { logo: cached.logo } : {}
|
|
2292
|
+
};
|
|
2293
|
+
const parsed = SolSplTokenSchema3.safeParse(token);
|
|
2294
|
+
if (!parsed.success) {
|
|
2295
|
+
log_default.warn("Ignoring dynamic sol-spl token with invalid schema", { token });
|
|
2296
|
+
return;
|
|
2297
|
+
}
|
|
2298
|
+
dynamicTokens.push(parsed.data);
|
|
2299
|
+
})
|
|
2300
|
+
);
|
|
2301
|
+
}
|
|
2302
|
+
const registeredDynamicIds = new Set(dynamicTokens.map((t) => t.id));
|
|
2220
2303
|
const allBalancesByKey = keyBy2(
|
|
2221
2304
|
balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),
|
|
2222
2305
|
(b) => getBalanceKey(b.tokenId, b.address)
|
|
@@ -2233,34 +2316,16 @@ var fetchBalances5 = async ({
|
|
|
2233
2316
|
value: "0"
|
|
2234
2317
|
};
|
|
2235
2318
|
});
|
|
2236
|
-
|
|
2319
|
+
for (const balance of balancesPerAddress.flatMap(([, addressBalances]) => addressBalances)) {
|
|
2320
|
+
if (registeredDynamicIds.has(balance.tokenId)) success.push(balance);
|
|
2321
|
+
}
|
|
2322
|
+
return { success, errors: [], dynamicTokens };
|
|
2237
2323
|
};
|
|
2238
2324
|
var getBalanceKey = (tokenId, address) => `${tokenId}:${address}`;
|
|
2239
2325
|
|
|
2240
2326
|
// 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";
|
|
2327
|
+
import { SolSplTokenSchema as SolSplTokenSchema4, solSplTokenId as solSplTokenId2 } from "@talismn/chaindata-provider";
|
|
2250
2328
|
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
2329
|
var fetchTokens5 = async ({
|
|
2265
2330
|
networkId,
|
|
2266
2331
|
tokens,
|
|
@@ -2288,7 +2353,7 @@ var fetchTokens5 = async ({
|
|
|
2288
2353
|
cached?.isValid ? omit3(cached, ["isValid"]) : {},
|
|
2289
2354
|
tokenConfig
|
|
2290
2355
|
);
|
|
2291
|
-
const parsed =
|
|
2356
|
+
const parsed = SolSplTokenSchema4.safeParse(token);
|
|
2292
2357
|
if (!parsed.success) {
|
|
2293
2358
|
log_default.warn("Ignoring token with invalid SolSplTokenSchema", {
|
|
2294
2359
|
token
|
|
@@ -2299,54 +2364,6 @@ var fetchTokens5 = async ({
|
|
|
2299
2364
|
}
|
|
2300
2365
|
return result;
|
|
2301
2366
|
};
|
|
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
2367
|
|
|
2351
2368
|
// src/modules/sol-spl/getMiniMetadata.ts
|
|
2352
2369
|
var getMiniMetadata5 = () => {
|
|
@@ -2457,90 +2474,565 @@ var SolSplBalanceModule = {
|
|
|
2457
2474
|
};
|
|
2458
2475
|
|
|
2459
2476
|
// src/modules/sol-spl/types.ts
|
|
2460
|
-
import { SolSplTokenSchema as
|
|
2477
|
+
import { SolSplTokenSchema as SolSplTokenSchema5 } from "@talismn/chaindata-provider";
|
|
2461
2478
|
import z8 from "zod/v4";
|
|
2462
2479
|
var SolSplTokenConfigSchema = z8.strictObject({
|
|
2463
|
-
mintAddress:
|
|
2480
|
+
mintAddress: SolSplTokenSchema5.shape.mintAddress,
|
|
2464
2481
|
...TokenConfigBaseSchema.shape
|
|
2465
2482
|
});
|
|
2466
2483
|
|
|
2467
|
-
// src/modules/
|
|
2468
|
-
import {
|
|
2469
|
-
var MODULE_TYPE6 =
|
|
2470
|
-
var PLATFORM6 =
|
|
2484
|
+
// src/modules/sol-token2022/config.ts
|
|
2485
|
+
import { SolToken2022TokenSchema } from "@talismn/chaindata-provider";
|
|
2486
|
+
var MODULE_TYPE6 = SolToken2022TokenSchema.shape.type.value;
|
|
2487
|
+
var PLATFORM6 = SolToken2022TokenSchema.shape.platform.value;
|
|
2471
2488
|
|
|
2472
|
-
// src/modules/
|
|
2473
|
-
import {
|
|
2489
|
+
// src/modules/sol-token2022/fetchBalances.ts
|
|
2490
|
+
import { PublicKey as PublicKey7 } from "@solana/web3.js";
|
|
2491
|
+
import {
|
|
2492
|
+
SolToken2022TokenSchema as SolToken2022TokenSchema3,
|
|
2493
|
+
solToken2022TokenId
|
|
2494
|
+
} from "@talismn/chaindata-provider";
|
|
2474
2495
|
import { isNotNil as isNotNil3 } from "@talismn/util";
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
|
|
2486
|
-
|
|
2496
|
+
import { keyBy as keyBy3, uniq as uniq3 } from "lodash-es";
|
|
2497
|
+
|
|
2498
|
+
// src/modules/sol-token2022/onChainTokenMetadata.ts
|
|
2499
|
+
import { deserializeMetadata as deserializeMetadata2 } from "@metaplex-foundation/mpl-token-metadata";
|
|
2500
|
+
import { publicKey as publicKey2, sol as sol2 } from "@metaplex-foundation/umi";
|
|
2501
|
+
import { MintLayout as MintLayout2 } from "@solana/spl-token";
|
|
2502
|
+
import { PublicKey as PublicKey6 } from "@solana/web3.js";
|
|
2503
|
+
import { parseSolToken2022TokenId, SolToken2022TokenSchema as SolToken2022TokenSchema2 } from "@talismn/chaindata-provider";
|
|
2504
|
+
import z9 from "zod/v4";
|
|
2505
|
+
var TokenCacheSchema4 = z9.discriminatedUnion("isValid", [
|
|
2506
|
+
z9.strictObject({
|
|
2507
|
+
id: SolToken2022TokenSchema2.shape.id,
|
|
2508
|
+
isValid: z9.literal(true),
|
|
2509
|
+
...SolToken2022TokenSchema2.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
|
|
2510
|
+
}),
|
|
2511
|
+
z9.strictObject({
|
|
2512
|
+
id: SolToken2022TokenSchema2.shape.id,
|
|
2513
|
+
isValid: z9.literal(false)
|
|
2514
|
+
})
|
|
2515
|
+
]);
|
|
2516
|
+
var METAPLEX_PROGRAM_ID2 = new PublicKey6("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
|
|
2517
|
+
var ERROR_NO_MINT2 = "No mint info available";
|
|
2518
|
+
var ERROR_NO_METADATA2 = "No metadata account found";
|
|
2519
|
+
var ERROR_INVALID_DATA2 = "Invalid on-chain data";
|
|
2520
|
+
var fetchOnChainTokenData2 = async (connector, tokenId) => {
|
|
2521
|
+
try {
|
|
2522
|
+
const { networkId, mintAddress } = parseSolToken2022TokenId(tokenId);
|
|
2523
|
+
const connection = await connector.getConnection(networkId);
|
|
2524
|
+
if (!connection) {
|
|
2525
|
+
log_default.warn(`No connection found for network ${networkId}`);
|
|
2487
2526
|
return null;
|
|
2488
2527
|
}
|
|
2489
|
-
const
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2528
|
+
const mintPubKey = new PublicKey6(mintAddress);
|
|
2529
|
+
const mintInfo = await connection.getAccountInfo(mintPubKey);
|
|
2530
|
+
if (!mintInfo?.data) throw new Error(ERROR_NO_MINT2);
|
|
2531
|
+
const mint = MintLayout2.decode(mintInfo.data);
|
|
2532
|
+
const token2022Metadata = tryParseToken2022Metadata(mintInfo.data);
|
|
2533
|
+
if (token2022Metadata) {
|
|
2534
|
+
const parsed2 = TokenCacheSchema4.safeParse({
|
|
2535
|
+
id: tokenId,
|
|
2536
|
+
symbol: token2022Metadata.symbol.trim(),
|
|
2537
|
+
name: token2022Metadata.name.trim(),
|
|
2538
|
+
decimals: mint.decimals,
|
|
2539
|
+
isValid: true
|
|
2540
|
+
});
|
|
2541
|
+
if (parsed2.success) return parsed2.data;
|
|
2542
|
+
}
|
|
2543
|
+
const [metadataPDA] = PublicKey6.findProgramAddressSync(
|
|
2544
|
+
[Buffer.from("metadata"), METAPLEX_PROGRAM_ID2.toBuffer(), mintPubKey.toBuffer()],
|
|
2545
|
+
METAPLEX_PROGRAM_ID2
|
|
2546
|
+
);
|
|
2547
|
+
const metadataAccount = await connection.getAccountInfo(new PublicKey6(metadataPDA));
|
|
2548
|
+
if (!metadataAccount) throw new Error(ERROR_NO_METADATA2);
|
|
2549
|
+
const metadata = deserializeMetadata2({
|
|
2550
|
+
publicKey: publicKey2(metadataPDA),
|
|
2551
|
+
executable: metadataAccount.executable,
|
|
2552
|
+
owner: publicKey2(metadataAccount.owner),
|
|
2553
|
+
lamports: sol2(metadataAccount.lamports),
|
|
2554
|
+
data: metadataAccount.data
|
|
2555
|
+
});
|
|
2556
|
+
const parsed = TokenCacheSchema4.safeParse({
|
|
2557
|
+
id: tokenId,
|
|
2558
|
+
symbol: metadata.symbol.trim(),
|
|
2559
|
+
name: metadata.name.trim(),
|
|
2560
|
+
decimals: mint.decimals,
|
|
2561
|
+
isValid: true
|
|
2562
|
+
});
|
|
2563
|
+
if (!parsed.success) throw new Error(ERROR_INVALID_DATA2);
|
|
2564
|
+
return parsed.data;
|
|
2565
|
+
} catch (err) {
|
|
2566
|
+
const msg = err.message;
|
|
2567
|
+
if ([ERROR_NO_MINT2, ERROR_NO_METADATA2, ERROR_INVALID_DATA2].includes(msg))
|
|
2568
|
+
return TokenCacheSchema4.parse({
|
|
2569
|
+
id: tokenId,
|
|
2570
|
+
isValid: false
|
|
2571
|
+
});
|
|
2572
|
+
log_default.warn("Failed to fetch sol-token2022 token data for %s", tokenId, { err });
|
|
2573
|
+
}
|
|
2574
|
+
return null;
|
|
2575
|
+
};
|
|
2576
|
+
var tryParseToken2022Metadata = (data) => {
|
|
2577
|
+
try {
|
|
2578
|
+
const TLV_START = 166;
|
|
2579
|
+
if (data.length <= TLV_START) return null;
|
|
2580
|
+
let offset = TLV_START;
|
|
2581
|
+
while (offset + 4 <= data.length) {
|
|
2582
|
+
const extType = data.readUInt16LE(offset);
|
|
2583
|
+
const extLen = data.readUInt16LE(offset + 2);
|
|
2584
|
+
const extDataStart = offset + 4;
|
|
2585
|
+
if (extType === 19 && extDataStart + extLen <= data.length) {
|
|
2586
|
+
let pos = extDataStart;
|
|
2587
|
+
pos += 64;
|
|
2588
|
+
const readLenPrefixed = () => {
|
|
2589
|
+
if (pos + 4 > data.length) throw new Error("out of bounds");
|
|
2590
|
+
const len = data.readUInt32LE(pos);
|
|
2591
|
+
pos += 4;
|
|
2592
|
+
if (pos + len > data.length) throw new Error("out of bounds");
|
|
2593
|
+
const str = data.subarray(pos, pos + len).toString("utf8");
|
|
2594
|
+
pos += len;
|
|
2595
|
+
return str;
|
|
2596
|
+
};
|
|
2597
|
+
const name = readLenPrefixed();
|
|
2598
|
+
const symbol = readLenPrefixed();
|
|
2599
|
+
const uri = readLenPrefixed();
|
|
2600
|
+
if (name && symbol) return { name, symbol, uri };
|
|
2601
|
+
}
|
|
2602
|
+
offset = extDataStart + extLen;
|
|
2603
|
+
}
|
|
2604
|
+
} catch {
|
|
2605
|
+
}
|
|
2606
|
+
return null;
|
|
2607
|
+
};
|
|
2608
|
+
|
|
2609
|
+
// src/modules/sol-token2022/fetchBalances.ts
|
|
2610
|
+
var TOKEN_2022_PROGRAM_ID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
|
|
2611
|
+
var dynamicTokenMetadataCache2 = /* @__PURE__ */ new Map();
|
|
2612
|
+
var fetchBalances6 = async ({
|
|
2613
|
+
networkId,
|
|
2614
|
+
tokensWithAddresses,
|
|
2615
|
+
connector
|
|
2616
|
+
}) => {
|
|
2617
|
+
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
2618
|
+
const connection = await connector.getConnection(networkId);
|
|
2619
|
+
if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
|
|
2620
|
+
const accountAddresses = uniq3(tokensWithAddresses.flatMap(([, addresses]) => addresses));
|
|
2621
|
+
const knownTokenIds = new Set(tokensWithAddresses.map(([token]) => token.id));
|
|
2622
|
+
const unknownMints = /* @__PURE__ */ new Set();
|
|
2623
|
+
const balancesPerAddress = await Promise.all(
|
|
2624
|
+
accountAddresses.map(async (address) => {
|
|
2625
|
+
const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey7(address), {
|
|
2626
|
+
programId: new PublicKey7(TOKEN_2022_PROGRAM_ID)
|
|
2627
|
+
});
|
|
2628
|
+
const balances = tokenAccounts.value.map((d) => {
|
|
2629
|
+
try {
|
|
2630
|
+
const mintAddress = d.account.data.parsed.info.mint;
|
|
2631
|
+
const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
|
|
2632
|
+
const tokenId = solToken2022TokenId(networkId, mintAddress);
|
|
2633
|
+
if (!knownTokenIds.has(tokenId) && value !== "0") unknownMints.add(mintAddress);
|
|
2634
|
+
return {
|
|
2635
|
+
tokenId,
|
|
2636
|
+
networkId,
|
|
2637
|
+
address,
|
|
2638
|
+
source: MODULE_TYPE6,
|
|
2639
|
+
status: "live",
|
|
2640
|
+
value
|
|
2641
|
+
};
|
|
2642
|
+
} catch {
|
|
2643
|
+
log_default.warn("Failed to parse token amount", {
|
|
2644
|
+
address,
|
|
2645
|
+
d
|
|
2646
|
+
});
|
|
2647
|
+
return null;
|
|
2648
|
+
}
|
|
2649
|
+
}).filter(isNotNil3);
|
|
2650
|
+
setDetectedTokenIds(
|
|
2651
|
+
address,
|
|
2652
|
+
MODULE_TYPE6,
|
|
2653
|
+
balances.map((b) => b.tokenId)
|
|
2654
|
+
);
|
|
2655
|
+
return [address, balances];
|
|
2656
|
+
})
|
|
2657
|
+
);
|
|
2658
|
+
const dynamicTokens = [];
|
|
2659
|
+
if (unknownMints.size) {
|
|
2660
|
+
await Promise.all(
|
|
2661
|
+
Array.from(unknownMints).map(async (mintAddress) => {
|
|
2662
|
+
const tokenId = solToken2022TokenId(networkId, mintAddress);
|
|
2663
|
+
let cached = dynamicTokenMetadataCache2.get(tokenId);
|
|
2664
|
+
if (!cached) {
|
|
2665
|
+
const fetched = await fetchOnChainTokenData2(connector, tokenId);
|
|
2666
|
+
if (fetched) {
|
|
2667
|
+
dynamicTokenMetadataCache2.set(tokenId, fetched);
|
|
2668
|
+
cached = fetched;
|
|
2669
|
+
}
|
|
2670
|
+
}
|
|
2671
|
+
if (!cached?.isValid) return;
|
|
2672
|
+
const token = {
|
|
2673
|
+
id: tokenId,
|
|
2674
|
+
type: MODULE_TYPE6,
|
|
2675
|
+
platform: PLATFORM6,
|
|
2676
|
+
networkId,
|
|
2677
|
+
mintAddress,
|
|
2678
|
+
isDefault: true,
|
|
2679
|
+
symbol: cached.symbol,
|
|
2680
|
+
decimals: cached.decimals,
|
|
2681
|
+
...cached.name !== void 0 ? { name: cached.name } : {},
|
|
2682
|
+
...cached.logo !== void 0 ? { logo: cached.logo } : {}
|
|
2683
|
+
};
|
|
2684
|
+
const parsed = SolToken2022TokenSchema3.safeParse(token);
|
|
2685
|
+
if (!parsed.success) {
|
|
2686
|
+
log_default.warn("Ignoring dynamic sol-token2022 token with invalid schema", { token });
|
|
2687
|
+
return;
|
|
2688
|
+
}
|
|
2689
|
+
dynamicTokens.push(parsed.data);
|
|
2690
|
+
})
|
|
2691
|
+
);
|
|
2692
|
+
}
|
|
2693
|
+
const registeredDynamicIds = new Set(dynamicTokens.map((t) => t.id));
|
|
2694
|
+
const allBalancesByKey = keyBy3(
|
|
2695
|
+
balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),
|
|
2696
|
+
(b) => getBalanceKey2(b.tokenId, b.address)
|
|
2697
|
+
);
|
|
2698
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
2699
|
+
const success = balanceDefs.map((bd) => {
|
|
2700
|
+
const found = allBalancesByKey[getBalanceKey2(bd.token.id, bd.address)];
|
|
2701
|
+
return found ?? {
|
|
2702
|
+
tokenId: bd.token.id,
|
|
2703
|
+
networkId: bd.token.networkId,
|
|
2704
|
+
address: bd.address,
|
|
2705
|
+
source: MODULE_TYPE6,
|
|
2706
|
+
status: "live",
|
|
2707
|
+
value: "0"
|
|
2708
|
+
};
|
|
2709
|
+
});
|
|
2710
|
+
for (const balance of balancesPerAddress.flatMap(([, addressBalances]) => addressBalances)) {
|
|
2711
|
+
if (registeredDynamicIds.has(balance.tokenId)) success.push(balance);
|
|
2712
|
+
}
|
|
2713
|
+
return { success, errors: [], dynamicTokens };
|
|
2714
|
+
};
|
|
2715
|
+
var getBalanceKey2 = (tokenId, address) => `${tokenId}:${address}`;
|
|
2716
|
+
|
|
2717
|
+
// src/modules/sol-token2022/fetchTokens.ts
|
|
2718
|
+
import {
|
|
2719
|
+
SolToken2022TokenSchema as SolToken2022TokenSchema4,
|
|
2720
|
+
solToken2022TokenId as solToken2022TokenId2
|
|
2721
|
+
} from "@talismn/chaindata-provider";
|
|
2722
|
+
import { assign as assign6, omit as omit4 } from "lodash-es";
|
|
2723
|
+
var fetchTokens6 = async ({
|
|
2724
|
+
networkId,
|
|
2725
|
+
tokens,
|
|
2726
|
+
connector,
|
|
2727
|
+
cache
|
|
2728
|
+
}) => {
|
|
2729
|
+
const result = [];
|
|
2730
|
+
for (const tokenConfig of tokens) {
|
|
2731
|
+
const tokenId = solToken2022TokenId2(networkId, tokenConfig.mintAddress);
|
|
2732
|
+
let cached = cache[tokenId] && TokenCacheSchema4.safeParse(cache[tokenId]).data;
|
|
2733
|
+
if (!cached) {
|
|
2734
|
+
const tokenInfo = await fetchOnChainTokenData2(connector, tokenId);
|
|
2735
|
+
if (tokenInfo) cache[tokenId] = tokenInfo;
|
|
2736
|
+
}
|
|
2737
|
+
cached = cache[tokenId] && TokenCacheSchema4.safeParse(cache[tokenId]).data;
|
|
2738
|
+
if (cached?.isValid === false) continue;
|
|
2739
|
+
const base = {
|
|
2740
|
+
id: tokenId,
|
|
2741
|
+
type: MODULE_TYPE6,
|
|
2742
|
+
platform: PLATFORM6,
|
|
2743
|
+
networkId
|
|
2744
|
+
};
|
|
2745
|
+
const token = assign6(
|
|
2746
|
+
base,
|
|
2747
|
+
cached?.isValid ? omit4(cached, ["isValid"]) : {},
|
|
2748
|
+
tokenConfig
|
|
2749
|
+
);
|
|
2750
|
+
const parsed = SolToken2022TokenSchema4.safeParse(token);
|
|
2751
|
+
if (!parsed.success) {
|
|
2752
|
+
log_default.warn("Ignoring token with invalid SolToken2022TokenSchema", {
|
|
2753
|
+
token
|
|
2754
|
+
});
|
|
2755
|
+
continue;
|
|
2756
|
+
}
|
|
2757
|
+
result.push(parsed.data);
|
|
2758
|
+
}
|
|
2759
|
+
return result;
|
|
2760
|
+
};
|
|
2761
|
+
|
|
2762
|
+
// src/modules/sol-token2022/getMiniMetadata.ts
|
|
2763
|
+
var getMiniMetadata6 = () => {
|
|
2764
|
+
throw new Error("MiniMetadata is not supported for solana tokens");
|
|
2765
|
+
};
|
|
2766
|
+
|
|
2767
|
+
// src/modules/sol-token2022/getTransferCallData.ts
|
|
2768
|
+
import {
|
|
2769
|
+
calculateEpochFee,
|
|
2770
|
+
createAssociatedTokenAccountInstruction as createAssociatedTokenAccountInstruction2,
|
|
2771
|
+
createTransferCheckedInstruction,
|
|
2772
|
+
createTransferCheckedWithFeeAndTransferHookInstruction,
|
|
2773
|
+
createTransferCheckedWithFeeInstruction,
|
|
2774
|
+
createTransferCheckedWithTransferHookInstruction,
|
|
2775
|
+
getAccount as getAccount2,
|
|
2776
|
+
getAssociatedTokenAddress as getAssociatedTokenAddress2,
|
|
2777
|
+
getMint,
|
|
2778
|
+
getNonTransferable,
|
|
2779
|
+
getTransferFeeConfig,
|
|
2780
|
+
getTransferHook,
|
|
2781
|
+
TOKEN_2022_PROGRAM_ID as TOKEN_2022_PROGRAM_ID2
|
|
2782
|
+
} from "@solana/spl-token";
|
|
2783
|
+
import { PublicKey as PublicKey8 } from "@solana/web3.js";
|
|
2784
|
+
import { isTokenOfType as isTokenOfType6 } from "@talismn/chaindata-provider";
|
|
2785
|
+
var getTransferCallData6 = async ({ from: from2, to, value, token, connector }) => {
|
|
2786
|
+
if (!isTokenOfType6(token, MODULE_TYPE6))
|
|
2787
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE6}.`);
|
|
2788
|
+
const connection = await connector.getConnection(token.networkId);
|
|
2789
|
+
const mintPubkey = new PublicKey8(token.mintAddress);
|
|
2790
|
+
const fromWallet = new PublicKey8(from2);
|
|
2791
|
+
const toWallet = new PublicKey8(to);
|
|
2792
|
+
const mintAccount = await getMint(connection, mintPubkey, void 0, TOKEN_2022_PROGRAM_ID2);
|
|
2793
|
+
const nonTransferable = getNonTransferable(mintAccount);
|
|
2794
|
+
if (nonTransferable) throw new Error("This token is non-transferable.");
|
|
2795
|
+
const transferFeeConfig = getTransferFeeConfig(mintAccount);
|
|
2796
|
+
const transferHook = getTransferHook(mintAccount);
|
|
2797
|
+
const instructions = [];
|
|
2798
|
+
const fromTokenAccount = await getAssociatedTokenAddress2(
|
|
2799
|
+
mintPubkey,
|
|
2800
|
+
fromWallet,
|
|
2801
|
+
false,
|
|
2802
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2803
|
+
);
|
|
2804
|
+
const toTokenAccount = await getAssociatedTokenAddress2(
|
|
2805
|
+
mintPubkey,
|
|
2806
|
+
toWallet,
|
|
2807
|
+
false,
|
|
2808
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2809
|
+
);
|
|
2810
|
+
if (!await tokenAccountExists2(connection, toTokenAccount)) {
|
|
2811
|
+
instructions.push(
|
|
2812
|
+
createAssociatedTokenAccountInstruction2(
|
|
2813
|
+
fromWallet,
|
|
2814
|
+
toTokenAccount,
|
|
2815
|
+
toWallet,
|
|
2816
|
+
mintPubkey,
|
|
2817
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2818
|
+
)
|
|
2819
|
+
);
|
|
2820
|
+
}
|
|
2821
|
+
const amount = BigInt(value);
|
|
2822
|
+
const transferFee = transferFeeConfig ? await calculateCurrentEpochTransferFee(connection, transferFeeConfig, amount) : 0n;
|
|
2823
|
+
if (transferFeeConfig && transferHook) {
|
|
2824
|
+
instructions.push(
|
|
2825
|
+
await createTransferCheckedWithFeeAndTransferHookInstruction(
|
|
2826
|
+
connection,
|
|
2827
|
+
fromTokenAccount,
|
|
2828
|
+
mintPubkey,
|
|
2829
|
+
toTokenAccount,
|
|
2830
|
+
fromWallet,
|
|
2831
|
+
amount,
|
|
2832
|
+
token.decimals,
|
|
2833
|
+
transferFee,
|
|
2834
|
+
[],
|
|
2835
|
+
void 0,
|
|
2836
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2837
|
+
)
|
|
2838
|
+
);
|
|
2839
|
+
} else if (transferFeeConfig) {
|
|
2840
|
+
instructions.push(
|
|
2841
|
+
createTransferCheckedWithFeeInstruction(
|
|
2842
|
+
fromTokenAccount,
|
|
2843
|
+
mintPubkey,
|
|
2844
|
+
toTokenAccount,
|
|
2845
|
+
fromWallet,
|
|
2846
|
+
amount,
|
|
2847
|
+
token.decimals,
|
|
2848
|
+
transferFee,
|
|
2849
|
+
[],
|
|
2850
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2851
|
+
)
|
|
2852
|
+
);
|
|
2853
|
+
} else if (transferHook) {
|
|
2854
|
+
instructions.push(
|
|
2855
|
+
await createTransferCheckedWithTransferHookInstruction(
|
|
2856
|
+
connection,
|
|
2857
|
+
fromTokenAccount,
|
|
2858
|
+
mintPubkey,
|
|
2859
|
+
toTokenAccount,
|
|
2860
|
+
fromWallet,
|
|
2861
|
+
amount,
|
|
2862
|
+
token.decimals,
|
|
2863
|
+
[],
|
|
2864
|
+
void 0,
|
|
2865
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2866
|
+
)
|
|
2867
|
+
);
|
|
2868
|
+
} else {
|
|
2869
|
+
instructions.push(
|
|
2870
|
+
createTransferCheckedInstruction(
|
|
2871
|
+
fromTokenAccount,
|
|
2872
|
+
mintPubkey,
|
|
2873
|
+
toTokenAccount,
|
|
2874
|
+
fromWallet,
|
|
2875
|
+
amount,
|
|
2876
|
+
token.decimals,
|
|
2877
|
+
[],
|
|
2878
|
+
TOKEN_2022_PROGRAM_ID2
|
|
2879
|
+
)
|
|
2880
|
+
);
|
|
2881
|
+
}
|
|
2882
|
+
return instructions;
|
|
2883
|
+
};
|
|
2884
|
+
var tokenAccountExists2 = async (connection, address) => {
|
|
2885
|
+
try {
|
|
2886
|
+
await getAccount2(connection, address, void 0, TOKEN_2022_PROGRAM_ID2);
|
|
2887
|
+
return true;
|
|
2888
|
+
} catch {
|
|
2889
|
+
return false;
|
|
2890
|
+
}
|
|
2891
|
+
};
|
|
2892
|
+
var calculateToken2022TransferFee = (transferFeeConfig, epoch, amount) => {
|
|
2893
|
+
return calculateEpochFee(transferFeeConfig, epoch, amount);
|
|
2894
|
+
};
|
|
2895
|
+
var calculateCurrentEpochTransferFee = async (connection, transferFeeConfig, amount) => {
|
|
2896
|
+
const { epoch } = await connection.getEpochInfo();
|
|
2897
|
+
return calculateToken2022TransferFee(transferFeeConfig, BigInt(epoch), amount);
|
|
2898
|
+
};
|
|
2899
|
+
|
|
2900
|
+
// src/modules/sol-token2022/subscribeBalances.ts
|
|
2901
|
+
import { isEqual as isEqual7 } from "lodash-es";
|
|
2902
|
+
import { distinctUntilChanged as distinctUntilChanged7, Observable as Observable7, of as of7 } from "rxjs";
|
|
2903
|
+
var SUBSCRIPTION_INTERVAL6 = 6e3;
|
|
2904
|
+
var subscribeBalances6 = ({
|
|
2905
|
+
networkId,
|
|
2906
|
+
tokensWithAddresses,
|
|
2907
|
+
connector
|
|
2908
|
+
}) => {
|
|
2909
|
+
if (!tokensWithAddresses.length) return of7({ success: [], errors: [] });
|
|
2910
|
+
return new Observable7((subscriber) => {
|
|
2911
|
+
const abortController = new AbortController();
|
|
2912
|
+
const poll = async () => {
|
|
2913
|
+
try {
|
|
2914
|
+
if (abortController.signal.aborted) return;
|
|
2915
|
+
const balances = await fetchBalances6({
|
|
2916
|
+
networkId,
|
|
2917
|
+
tokensWithAddresses,
|
|
2918
|
+
connector
|
|
2919
|
+
});
|
|
2920
|
+
if (abortController.signal.aborted) return;
|
|
2921
|
+
subscriber.next(balances);
|
|
2922
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL6);
|
|
2923
|
+
} catch (error) {
|
|
2924
|
+
log_default.error("Error", {
|
|
2925
|
+
module: MODULE_TYPE6,
|
|
2926
|
+
networkId,
|
|
2927
|
+
addressesByToken: tokensWithAddresses,
|
|
2928
|
+
error
|
|
2929
|
+
});
|
|
2930
|
+
subscriber.error(error);
|
|
2931
|
+
}
|
|
2932
|
+
};
|
|
2933
|
+
poll();
|
|
2934
|
+
return () => {
|
|
2935
|
+
abortController.abort();
|
|
2936
|
+
};
|
|
2937
|
+
}).pipe(distinctUntilChanged7(isEqual7));
|
|
2938
|
+
};
|
|
2939
|
+
|
|
2940
|
+
// src/modules/sol-token2022/module.ts
|
|
2941
|
+
var SolToken2022BalanceModule = {
|
|
2942
|
+
type: MODULE_TYPE6,
|
|
2943
|
+
platform: PLATFORM6,
|
|
2944
|
+
getMiniMetadata: getMiniMetadata6,
|
|
2945
|
+
fetchTokens: fetchTokens6,
|
|
2946
|
+
fetchBalances: fetchBalances6,
|
|
2947
|
+
subscribeBalances: subscribeBalances6,
|
|
2948
|
+
getTransferCallData: getTransferCallData6
|
|
2949
|
+
};
|
|
2950
|
+
|
|
2951
|
+
// src/modules/sol-token2022/types.ts
|
|
2952
|
+
import { SolToken2022TokenSchema as SolToken2022TokenSchema5 } from "@talismn/chaindata-provider";
|
|
2953
|
+
import z10 from "zod/v4";
|
|
2954
|
+
var SolToken2022TokenConfigSchema = z10.strictObject({
|
|
2955
|
+
mintAddress: SolToken2022TokenSchema5.shape.mintAddress,
|
|
2956
|
+
...TokenConfigBaseSchema.shape
|
|
2957
|
+
});
|
|
2958
|
+
|
|
2959
|
+
// src/modules/substrate-assets/config.ts
|
|
2960
|
+
import { SubAssetsTokenSchema } from "@talismn/chaindata-provider";
|
|
2961
|
+
var MODULE_TYPE7 = SubAssetsTokenSchema.shape.type.value;
|
|
2962
|
+
var PLATFORM7 = SubAssetsTokenSchema.shape.platform.value;
|
|
2963
|
+
|
|
2964
|
+
// src/modules/substrate-assets/buildQueries.ts
|
|
2965
|
+
import { decodeScale } from "@talismn/scale";
|
|
2966
|
+
import { isNotNil as isNotNil4 } from "@talismn/util";
|
|
2967
|
+
var buildQueries = (networkId, balanceDefs, miniMetadata) => {
|
|
2968
|
+
const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
|
|
2969
|
+
storage: ["Assets", "Account"]
|
|
2970
|
+
});
|
|
2971
|
+
return balanceDefs.map(({ token, address }) => {
|
|
2972
|
+
const scaleCoder = networkStorageCoders?.storage;
|
|
2973
|
+
const stateKey = tryEncode(scaleCoder, Number(token.assetId), address) ?? // Asset Hub
|
|
2974
|
+
tryEncode(scaleCoder, BigInt(token.assetId), address);
|
|
2975
|
+
if (!stateKey) {
|
|
2976
|
+
log_default.warn(
|
|
2977
|
+
`Invalid assetId / address in ${networkId} storage query ${token.assetId} / ${address}`
|
|
2978
|
+
);
|
|
2979
|
+
return null;
|
|
2980
|
+
}
|
|
2981
|
+
const decodeResult = (changes) => {
|
|
2982
|
+
const decoded = decodeScale(
|
|
2983
|
+
scaleCoder,
|
|
2984
|
+
changes[0],
|
|
2985
|
+
`Failed to decode substrate-assets balance on chain ${networkId}`
|
|
2986
|
+
) ?? {
|
|
2987
|
+
balance: 0n,
|
|
2988
|
+
is_frozen: false,
|
|
2989
|
+
reason: { type: "Sufficient" },
|
|
2990
|
+
status: { type: "Liquid" },
|
|
2991
|
+
extra: void 0
|
|
2992
|
+
};
|
|
2993
|
+
const isFrozen = decoded?.status?.type === "Frozen";
|
|
2994
|
+
const amount = (decoded?.balance ?? 0n).toString();
|
|
2995
|
+
const free = amount;
|
|
2996
|
+
const frozen = token.isFrozen || isFrozen ? amount : "0";
|
|
2997
|
+
const balanceValues = [
|
|
2998
|
+
{ type: "free", label: "free", amount: free.toString() },
|
|
2999
|
+
{ type: "locked", label: "frozen", amount: frozen.toString() }
|
|
3000
|
+
];
|
|
3001
|
+
const balance = {
|
|
3002
|
+
source: "substrate-assets",
|
|
3003
|
+
status: "live",
|
|
3004
|
+
address,
|
|
3005
|
+
networkId,
|
|
3006
|
+
tokenId: token.id,
|
|
3007
|
+
values: balanceValues
|
|
3008
|
+
};
|
|
3009
|
+
return balance;
|
|
3010
|
+
};
|
|
3011
|
+
return {
|
|
3012
|
+
stateKeys: [stateKey],
|
|
3013
|
+
decodeResult
|
|
3014
|
+
};
|
|
3015
|
+
}).filter(isNotNil4);
|
|
3016
|
+
};
|
|
3017
|
+
var tryEncode = (scaleCoder, ...args) => {
|
|
3018
|
+
try {
|
|
3019
|
+
return scaleCoder?.keys?.enc?.(...args);
|
|
3020
|
+
} catch {
|
|
3021
|
+
return null;
|
|
3022
|
+
}
|
|
3023
|
+
};
|
|
3024
|
+
|
|
3025
|
+
// src/modules/substrate-assets/fetchBalances.ts
|
|
3026
|
+
var fetchBalances7 = async ({
|
|
3027
|
+
networkId,
|
|
3028
|
+
tokensWithAddresses,
|
|
3029
|
+
connector,
|
|
3030
|
+
miniMetadata
|
|
3031
|
+
}) => {
|
|
3032
|
+
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
3033
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
2542
3034
|
if (!miniMetadata?.data) {
|
|
2543
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
3035
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE7} balances on ${networkId}.`);
|
|
2544
3036
|
return {
|
|
2545
3037
|
success: [],
|
|
2546
3038
|
errors: balanceDefs.map((def) => ({
|
|
@@ -2550,20 +3042,20 @@ var fetchBalances6 = async ({
|
|
|
2550
3042
|
}))
|
|
2551
3043
|
};
|
|
2552
3044
|
}
|
|
2553
|
-
if (miniMetadata.source !==
|
|
2554
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
3045
|
+
if (miniMetadata.source !== MODULE_TYPE7) {
|
|
3046
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE7}.`);
|
|
2555
3047
|
return {
|
|
2556
3048
|
success: [],
|
|
2557
3049
|
errors: balanceDefs.map((def) => ({
|
|
2558
3050
|
tokenId: def.token.id,
|
|
2559
3051
|
address: def.address,
|
|
2560
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
3052
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE7}`)
|
|
2561
3053
|
}))
|
|
2562
3054
|
};
|
|
2563
3055
|
}
|
|
2564
3056
|
if (miniMetadata.chainId !== networkId) {
|
|
2565
3057
|
log_default.warn(
|
|
2566
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
3058
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE7}. Expected chainId is ${networkId}`
|
|
2567
3059
|
);
|
|
2568
3060
|
return {
|
|
2569
3061
|
success: [],
|
|
@@ -2587,7 +3079,7 @@ var fetchBalances6 = async ({
|
|
|
2587
3079
|
address: def.address,
|
|
2588
3080
|
networkId,
|
|
2589
3081
|
tokenId: def.token.id,
|
|
2590
|
-
source:
|
|
3082
|
+
source: MODULE_TYPE7,
|
|
2591
3083
|
status: "live",
|
|
2592
3084
|
values: [
|
|
2593
3085
|
{ type: "free", label: "free", amount: "0" },
|
|
@@ -2606,8 +3098,8 @@ import {
|
|
|
2606
3098
|
subAssetTokenId
|
|
2607
3099
|
} from "@talismn/chaindata-provider";
|
|
2608
3100
|
import { getStorageKeyPrefix, parseMetadataRpc as parseMetadataRpc3 } from "@talismn/scale";
|
|
2609
|
-
import { assign as
|
|
2610
|
-
var
|
|
3101
|
+
import { assign as assign7, keyBy as keyBy4, keys } from "lodash-es";
|
|
3102
|
+
var fetchTokens7 = async ({
|
|
2611
3103
|
networkId,
|
|
2612
3104
|
tokens,
|
|
2613
3105
|
connector,
|
|
@@ -2632,7 +3124,7 @@ var fetchTokens6 = async ({
|
|
|
2632
3124
|
]);
|
|
2633
3125
|
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
|
2634
3126
|
const metadataStorageEntries = metadataStorageResults.length ? metadataStorageResults[0].changes : [];
|
|
2635
|
-
const assetByAssetId =
|
|
3127
|
+
const assetByAssetId = keyBy4(
|
|
2636
3128
|
assetStorageEntries.map(([key, value]) => {
|
|
2637
3129
|
const [assetId] = assetCodec.keys.dec(key);
|
|
2638
3130
|
const asset = assetCodec.value.dec(value);
|
|
@@ -2640,7 +3132,7 @@ var fetchTokens6 = async ({
|
|
|
2640
3132
|
}),
|
|
2641
3133
|
(a) => a.assetId
|
|
2642
3134
|
);
|
|
2643
|
-
const metadataByAssetId =
|
|
3135
|
+
const metadataByAssetId = keyBy4(
|
|
2644
3136
|
metadataStorageEntries.map(([key, value]) => {
|
|
2645
3137
|
const [assetId] = metadataCodec.keys.dec(key);
|
|
2646
3138
|
const metadata = metadataCodec.value.dec(value);
|
|
@@ -2655,13 +3147,13 @@ var fetchTokens6 = async ({
|
|
|
2655
3147
|
(a) => a.assetId
|
|
2656
3148
|
);
|
|
2657
3149
|
const allTokens = keys(assetByAssetId).map(
|
|
2658
|
-
(assetId) =>
|
|
3150
|
+
(assetId) => assign7({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? void 0)
|
|
2659
3151
|
);
|
|
2660
|
-
const configTokenByAssetId =
|
|
3152
|
+
const configTokenByAssetId = keyBy4(tokens, (t) => t.assetId);
|
|
2661
3153
|
return allTokens.map(
|
|
2662
3154
|
(asset) => ({
|
|
2663
3155
|
id: subAssetTokenId(networkId, String(asset.assetId)),
|
|
2664
|
-
type:
|
|
3156
|
+
type: MODULE_TYPE7,
|
|
2665
3157
|
platform: "polkadot",
|
|
2666
3158
|
networkId,
|
|
2667
3159
|
assetId: String(asset.assetId),
|
|
@@ -2678,7 +3170,7 @@ var fetchTokens6 = async ({
|
|
|
2678
3170
|
return configToken || token.isSufficient;
|
|
2679
3171
|
}).map((token) => {
|
|
2680
3172
|
const configToken = configTokenByAssetId[token.assetId];
|
|
2681
|
-
return configToken ?
|
|
3173
|
+
return configToken ? assign7({}, token, configToken) : token;
|
|
2682
3174
|
}).filter((t) => {
|
|
2683
3175
|
const parsed = SubAssetsTokenSchema2.safeParse(t);
|
|
2684
3176
|
return parsed.success;
|
|
@@ -2687,7 +3179,7 @@ var fetchTokens6 = async ({
|
|
|
2687
3179
|
|
|
2688
3180
|
// src/modules/substrate-assets/getMiniMetadata.ts
|
|
2689
3181
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION3 } from "@talismn/chaindata-provider";
|
|
2690
|
-
import { compactMetadata as compactMetadata2, encodeMetadata as encodeMetadata2, parseMetadataRpc as
|
|
3182
|
+
import { compactMetadata as compactMetadata2, encodeMetadata as encodeMetadata2, parseMetadataRpc as parseMetadataRpc9 } from "@talismn/scale";
|
|
2691
3183
|
|
|
2692
3184
|
// src/types/balances.ts
|
|
2693
3185
|
import { evmErc20TokenId as evmErc20TokenId2 } from "@talismn/chaindata-provider";
|
|
@@ -2700,7 +3192,6 @@ import {
|
|
|
2700
3192
|
isBigInt,
|
|
2701
3193
|
planckToTokens
|
|
2702
3194
|
} from "@talismn/util";
|
|
2703
|
-
import BigNumber2 from "bignumber.js";
|
|
2704
3195
|
|
|
2705
3196
|
// src/modules/substrate-dtao/alphaPrice.ts
|
|
2706
3197
|
var TAO_DECIMALS = 9n;
|
|
@@ -2717,6 +3208,179 @@ var taoToAlpha = (tao, scaledAlphaPrice) => {
|
|
|
2717
3208
|
if (!tao || !scaledAlphaPrice) return 0n;
|
|
2718
3209
|
return tao * ALPHA_PRICE_SCALE / scaledAlphaPrice;
|
|
2719
3210
|
};
|
|
3211
|
+
var taoToAlphaCeil = (tao, scaledAlphaPrice) => {
|
|
3212
|
+
if (!tao || !scaledAlphaPrice) return 0n;
|
|
3213
|
+
return (tao * ALPHA_PRICE_SCALE + scaledAlphaPrice - 1n) / scaledAlphaPrice;
|
|
3214
|
+
};
|
|
3215
|
+
|
|
3216
|
+
// src/modules/substrate-dtao/convictionLocks.ts
|
|
3217
|
+
import {
|
|
3218
|
+
decodeScale as decodeScale2,
|
|
3219
|
+
parseMetadataRpc as parseMetadataRpc4
|
|
3220
|
+
} from "@talismn/scale";
|
|
3221
|
+
var convictionLockKey = (address, netuid) => `${address}:${netuid}`;
|
|
3222
|
+
var getConvictionLockLabel = (lockType) => lockType === "perpetual" ? "Perpetual Conviction Lock" : "Decaying Conviction Lock";
|
|
3223
|
+
var findDTaoConvictionLock = (locks) => {
|
|
3224
|
+
for (const lock of locks ?? []) {
|
|
3225
|
+
const meta = lock.meta;
|
|
3226
|
+
if (meta?.convictionLock?.type !== "conviction-lock") continue;
|
|
3227
|
+
const lockType = meta.convictionLock.lockType;
|
|
3228
|
+
return {
|
|
3229
|
+
amount: lock.amount.planck,
|
|
3230
|
+
hotkey: meta.convictionLock.hotkey,
|
|
3231
|
+
lockType,
|
|
3232
|
+
label: getConvictionLockLabel(lockType)
|
|
3233
|
+
};
|
|
3234
|
+
}
|
|
3235
|
+
return null;
|
|
3236
|
+
};
|
|
3237
|
+
var toBigIntValue = (value) => {
|
|
3238
|
+
if (typeof value === "bigint") return value;
|
|
3239
|
+
if (value && typeof value === "object" && "bits" in value) {
|
|
3240
|
+
const bits = value.bits;
|
|
3241
|
+
if (typeof bits === "bigint") return bits;
|
|
3242
|
+
}
|
|
3243
|
+
return 0n;
|
|
3244
|
+
};
|
|
3245
|
+
var fetchConvictionLocks = async (connector, networkId, metadataRpc, addresses) => {
|
|
3246
|
+
if (!addresses.length) return [];
|
|
3247
|
+
const { unifiedMetadata, builder } = parseMetadataRpc4(metadataRpc);
|
|
3248
|
+
if (!hasRuntimeApi(unifiedMetadata, "StakeInfoRuntimeApi", "get_coldkey_lock") || !hasStorageItems(unifiedMetadata, "SubtensorModule", ["Lock", "DecayingLock"])) {
|
|
3249
|
+
return [];
|
|
3250
|
+
}
|
|
3251
|
+
try {
|
|
3252
|
+
const lockStorageCoder = builder.buildStorage("SubtensorModule", "Lock");
|
|
3253
|
+
const decayingLockStorageCoder = builder.buildStorage("SubtensorModule", "DecayingLock");
|
|
3254
|
+
const lockStorageKeys = await fetchConvictionLockStorageKeys(
|
|
3255
|
+
connector,
|
|
3256
|
+
networkId,
|
|
3257
|
+
addresses,
|
|
3258
|
+
lockStorageCoder
|
|
3259
|
+
);
|
|
3260
|
+
if (!lockStorageKeys.length) return [];
|
|
3261
|
+
const hotkeyByPair = new Map(
|
|
3262
|
+
lockStorageKeys.map(({ address, netuid, hotkey }) => [
|
|
3263
|
+
convictionLockKey(address, netuid),
|
|
3264
|
+
hotkey
|
|
3265
|
+
])
|
|
3266
|
+
);
|
|
3267
|
+
const [lockModesByPair, lockStates] = await Promise.all([
|
|
3268
|
+
fetchConvictionLockModes(connector, networkId, lockStorageKeys, decayingLockStorageCoder),
|
|
3269
|
+
fetchColdkeyLockStates(connector, networkId, builder, lockStorageKeys)
|
|
3270
|
+
]);
|
|
3271
|
+
return lockStates.flatMap(({ address, netuid, lockState }) => {
|
|
3272
|
+
const amount = lockState?.locked_mass ?? 0n;
|
|
3273
|
+
const convictionRaw = toBigIntValue(lockState?.conviction);
|
|
3274
|
+
if (amount <= 0n && convictionRaw <= 0n) return [];
|
|
3275
|
+
const hotkey = hotkeyByPair.get(convictionLockKey(address, netuid));
|
|
3276
|
+
if (!hotkey) return [];
|
|
3277
|
+
return [
|
|
3278
|
+
{
|
|
3279
|
+
address,
|
|
3280
|
+
netuid,
|
|
3281
|
+
lock: {
|
|
3282
|
+
amount,
|
|
3283
|
+
hotkey,
|
|
3284
|
+
lockType: lockModesByPair.get(convictionLockKey(address, netuid)) ?? "decaying",
|
|
3285
|
+
convictionRaw: convictionRaw.toString()
|
|
3286
|
+
}
|
|
3287
|
+
}
|
|
3288
|
+
];
|
|
3289
|
+
});
|
|
3290
|
+
} catch (cause) {
|
|
3291
|
+
log_default.warn(`Failed to fetch Bittensor conviction locks on ${networkId}`, { cause });
|
|
3292
|
+
return [];
|
|
3293
|
+
}
|
|
3294
|
+
};
|
|
3295
|
+
var fetchConvictionLockStorageKeys = async (connector, networkId, addresses, storageCoder) => {
|
|
3296
|
+
const keysPerAddress = await Promise.all(
|
|
3297
|
+
addresses.map(async (address) => {
|
|
3298
|
+
let keyPrefix;
|
|
3299
|
+
try {
|
|
3300
|
+
keyPrefix = storageCoder.keys.enc(address);
|
|
3301
|
+
} catch (cause) {
|
|
3302
|
+
log_default.warn(
|
|
3303
|
+
`Failed to encode conviction Lock key prefix (address=${address}) on ${networkId}`,
|
|
3304
|
+
{ cause }
|
|
3305
|
+
);
|
|
3306
|
+
return [];
|
|
3307
|
+
}
|
|
3308
|
+
try {
|
|
3309
|
+
const stateKeys = await connector.send(networkId, "state_getKeys", [
|
|
3310
|
+
keyPrefix
|
|
3311
|
+
]);
|
|
3312
|
+
return stateKeys.flatMap((stateKey) => {
|
|
3313
|
+
try {
|
|
3314
|
+
const [, netuid, hotkey] = storageCoder.keys.dec(stateKey);
|
|
3315
|
+
return [{ address, netuid, hotkey }];
|
|
3316
|
+
} catch (cause) {
|
|
3317
|
+
log_default.warn(`Failed to decode conviction Lock key ${stateKey} on ${networkId}`, { cause });
|
|
3318
|
+
return [];
|
|
3319
|
+
}
|
|
3320
|
+
});
|
|
3321
|
+
} catch (cause) {
|
|
3322
|
+
log_default.warn(`Failed to fetch conviction Lock keys (address=${address}) on ${networkId}`, {
|
|
3323
|
+
cause
|
|
3324
|
+
});
|
|
3325
|
+
return [];
|
|
3326
|
+
}
|
|
3327
|
+
})
|
|
3328
|
+
);
|
|
3329
|
+
return keysPerAddress.flat();
|
|
3330
|
+
};
|
|
3331
|
+
var fetchConvictionLockModes = async (connector, networkId, pairs, storageCoder) => {
|
|
3332
|
+
const queries = pairs.map(
|
|
3333
|
+
({ address, netuid }) => {
|
|
3334
|
+
let stateKey = null;
|
|
3335
|
+
try {
|
|
3336
|
+
stateKey = storageCoder.keys.enc(address, netuid);
|
|
3337
|
+
} catch (cause) {
|
|
3338
|
+
log_default.warn(
|
|
3339
|
+
`Failed to encode conviction DecayingLock key (netuid=${netuid}, address=${address}) on ${networkId}`,
|
|
3340
|
+
{ cause }
|
|
3341
|
+
);
|
|
3342
|
+
}
|
|
3343
|
+
const key = convictionLockKey(address, netuid);
|
|
3344
|
+
return {
|
|
3345
|
+
stateKeys: [stateKey],
|
|
3346
|
+
decodeResult: (changes) => {
|
|
3347
|
+
const hexValue = changes[0];
|
|
3348
|
+
if (!hexValue) return [key, "decaying"];
|
|
3349
|
+
const decoded = decodeScale2(
|
|
3350
|
+
storageCoder,
|
|
3351
|
+
hexValue,
|
|
3352
|
+
`Failed to decode DecayingLock for (netuid=${netuid}, address=${address}) on ${networkId}`
|
|
3353
|
+
);
|
|
3354
|
+
return [key, decoded === false ? "perpetual" : "decaying"];
|
|
3355
|
+
}
|
|
3356
|
+
};
|
|
3357
|
+
}
|
|
3358
|
+
);
|
|
3359
|
+
return new Map(await fetchRpcQueryPack(connector, networkId, queries));
|
|
3360
|
+
};
|
|
3361
|
+
var fetchColdkeyLockStates = async (connector, networkId, builder, pairs) => {
|
|
3362
|
+
return Promise.all(
|
|
3363
|
+
pairs.map(async ({ address, netuid }) => {
|
|
3364
|
+
try {
|
|
3365
|
+
const lockState = await fetchRuntimeCallResult(
|
|
3366
|
+
connector,
|
|
3367
|
+
networkId,
|
|
3368
|
+
builder,
|
|
3369
|
+
"StakeInfoRuntimeApi",
|
|
3370
|
+
"get_coldkey_lock",
|
|
3371
|
+
[address, netuid]
|
|
3372
|
+
);
|
|
3373
|
+
return { address, netuid, lockState };
|
|
3374
|
+
} catch (cause) {
|
|
3375
|
+
log_default.warn(
|
|
3376
|
+
`Failed to fetch get_coldkey_lock for (netuid=${netuid}, address=${address}) on ${networkId}`,
|
|
3377
|
+
{ cause }
|
|
3378
|
+
);
|
|
3379
|
+
return { address, netuid, lockState: null };
|
|
3380
|
+
}
|
|
3381
|
+
})
|
|
3382
|
+
);
|
|
3383
|
+
};
|
|
2720
3384
|
|
|
2721
3385
|
// src/modules/substrate-dtao/getDtaoTokenRates.ts
|
|
2722
3386
|
import { subNativeTokenId } from "@talismn/chaindata-provider";
|
|
@@ -2724,7 +3388,14 @@ import {
|
|
|
2724
3388
|
newTokenRates
|
|
2725
3389
|
} from "@talismn/token-rates";
|
|
2726
3390
|
var ONE_ALPHA = 10n ** TAO_DECIMALS;
|
|
2727
|
-
var
|
|
3391
|
+
var getAlphaChange24h = (currency, taoChange24h, alphaPriceChange24h) => {
|
|
3392
|
+
if (typeof alphaPriceChange24h !== "number" || !Number.isFinite(alphaPriceChange24h))
|
|
3393
|
+
return void 0;
|
|
3394
|
+
if (currency === "tao") return alphaPriceChange24h;
|
|
3395
|
+
if (typeof taoChange24h !== "number" || !Number.isFinite(taoChange24h)) return void 0;
|
|
3396
|
+
return ((1 + alphaPriceChange24h / 100) * (1 + taoChange24h / 100) - 1) * 100;
|
|
3397
|
+
};
|
|
3398
|
+
var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice, alphaPriceChange24h) => {
|
|
2728
3399
|
try {
|
|
2729
3400
|
const taoTokenId = subNativeTokenId(token.networkId);
|
|
2730
3401
|
const taoTokenRates = tokenRates[taoTokenId];
|
|
@@ -2740,8 +3411,7 @@ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
|
|
|
2740
3411
|
alphaRates[currency] = {
|
|
2741
3412
|
price: taoRate.price * priceRatio,
|
|
2742
3413
|
marketCap: taoRate.marketCap ? taoRate.marketCap * priceRatio : void 0,
|
|
2743
|
-
change24h:
|
|
2744
|
-
// cannot be determined from TAO rates alone
|
|
3414
|
+
change24h: getAlphaChange24h(currency, taoRate.change24h, alphaPriceChange24h)
|
|
2745
3415
|
};
|
|
2746
3416
|
}
|
|
2747
3417
|
}
|
|
@@ -2754,8 +3424,8 @@ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
|
|
|
2754
3424
|
|
|
2755
3425
|
// src/modules/substrate-dtao/config.ts
|
|
2756
3426
|
import { SubDTaoTokenSchema } from "@talismn/chaindata-provider";
|
|
2757
|
-
var
|
|
2758
|
-
var
|
|
3427
|
+
var MODULE_TYPE8 = SubDTaoTokenSchema.shape.type.value;
|
|
3428
|
+
var PLATFORM8 = SubDTaoTokenSchema.shape.platform.value;
|
|
2759
3429
|
|
|
2760
3430
|
// src/modules/substrate-dtao/fetchBalances.ts
|
|
2761
3431
|
import {
|
|
@@ -2763,9 +3433,9 @@ import {
|
|
|
2763
3433
|
subDTaoTokenId as subDTaoTokenId2,
|
|
2764
3434
|
TokenSchema
|
|
2765
3435
|
} from "@talismn/chaindata-provider";
|
|
2766
|
-
import { decodeScale as
|
|
2767
|
-
import { isNotNil as
|
|
2768
|
-
import { keyBy as
|
|
3436
|
+
import { decodeScale as decodeScale3, parseMetadataRpc as parseMetadataRpc5 } from "@talismn/scale";
|
|
3437
|
+
import { isNotNil as isNotNil5 } from "@talismn/util";
|
|
3438
|
+
import { keyBy as keyBy5, uniq as uniq4 } from "lodash-es";
|
|
2769
3439
|
|
|
2770
3440
|
// src/modules/substrate-dtao/calculatePendingRootClaimable.ts
|
|
2771
3441
|
import { subDTaoTokenId } from "@talismn/chaindata-provider";
|
|
@@ -2804,7 +3474,7 @@ var calculatePendingRootClaimable = ({
|
|
|
2804
3474
|
|
|
2805
3475
|
// src/modules/substrate-dtao/fetchBalances.ts
|
|
2806
3476
|
var ROOT_NETUID = 0;
|
|
2807
|
-
var
|
|
3477
|
+
var fetchBalances8 = async ({
|
|
2808
3478
|
networkId,
|
|
2809
3479
|
tokensWithAddresses,
|
|
2810
3480
|
connector,
|
|
@@ -2813,7 +3483,7 @@ var fetchBalances7 = async ({
|
|
|
2813
3483
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
2814
3484
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
2815
3485
|
if (!miniMetadata?.data) {
|
|
2816
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
3486
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE8} balances on ${networkId}.`, {
|
|
2817
3487
|
tokensWithAddresses
|
|
2818
3488
|
});
|
|
2819
3489
|
return {
|
|
@@ -2825,20 +3495,20 @@ var fetchBalances7 = async ({
|
|
|
2825
3495
|
}))
|
|
2826
3496
|
};
|
|
2827
3497
|
}
|
|
2828
|
-
if (miniMetadata.source !==
|
|
2829
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
3498
|
+
if (miniMetadata.source !== MODULE_TYPE8) {
|
|
3499
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE8}.`);
|
|
2830
3500
|
return {
|
|
2831
3501
|
success: [],
|
|
2832
3502
|
errors: balanceDefs.map((def) => ({
|
|
2833
3503
|
tokenId: def.token.id,
|
|
2834
3504
|
address: def.address,
|
|
2835
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
3505
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE8}`)
|
|
2836
3506
|
}))
|
|
2837
3507
|
};
|
|
2838
3508
|
}
|
|
2839
3509
|
if (miniMetadata.chainId !== networkId) {
|
|
2840
3510
|
log_default.warn(
|
|
2841
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
3511
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE8}. Expected chainId is ${networkId}`
|
|
2842
3512
|
);
|
|
2843
3513
|
return {
|
|
2844
3514
|
success: [],
|
|
@@ -2849,7 +3519,7 @@ var fetchBalances7 = async ({
|
|
|
2849
3519
|
}))
|
|
2850
3520
|
};
|
|
2851
3521
|
}
|
|
2852
|
-
const addresses =
|
|
3522
|
+
const addresses = uniq4(balanceDefs.map((def) => def.address));
|
|
2853
3523
|
try {
|
|
2854
3524
|
const [stakeInfos, dynamicInfos] = await Promise.all([
|
|
2855
3525
|
fetchRuntimeCallResult(
|
|
@@ -2869,7 +3539,8 @@ var fetchBalances7 = async ({
|
|
|
2869
3539
|
[]
|
|
2870
3540
|
)
|
|
2871
3541
|
]);
|
|
2872
|
-
const
|
|
3542
|
+
const dynamicInfoByNetuid = keyBy5(dynamicInfos.filter(isNotNil5), (info) => info.netuid);
|
|
3543
|
+
const rootHotkeys = uniq4(
|
|
2873
3544
|
stakeInfos.flatMap(
|
|
2874
3545
|
([, stakes]) => stakes.filter((stake) => stake.netuid === ROOT_NETUID).map((stake) => stake.hotkey)
|
|
2875
3546
|
)
|
|
@@ -2888,13 +3559,10 @@ var fetchBalances7 = async ({
|
|
|
2888
3559
|
}
|
|
2889
3560
|
}
|
|
2890
3561
|
}
|
|
2891
|
-
const rootClaimedAmounts =
|
|
2892
|
-
connector,
|
|
2893
|
-
networkId,
|
|
2894
|
-
|
|
2895
|
-
addressHotkeyNetuidPairs
|
|
2896
|
-
) : /* @__PURE__ */ new Map();
|
|
2897
|
-
const dynamicInfoByNetuid = keyBy4(dynamicInfos.filter(isNotNil4), (info) => info.netuid);
|
|
3562
|
+
const [rootClaimedAmounts, convictionLocks] = await Promise.all([
|
|
3563
|
+
addressHotkeyNetuidPairs.length && miniMetadata.data ? fetchRootClaimedAmounts(connector, networkId, miniMetadata.data, addressHotkeyNetuidPairs) : Promise.resolve(/* @__PURE__ */ new Map()),
|
|
3564
|
+
miniMetadata.data ? fetchConvictionLocks(connector, networkId, miniMetadata.data, addresses) : Promise.resolve([])
|
|
3565
|
+
]);
|
|
2898
3566
|
const upsertBalance = (acc, address, tokenId, balance) => {
|
|
2899
3567
|
const key = `${address}:${tokenId}`;
|
|
2900
3568
|
const recordedBalance = acc[key];
|
|
@@ -2905,6 +3573,9 @@ var fetchBalances7 = async ({
|
|
|
2905
3573
|
// If the new balance has pendingRootClaim, use it (it's calculated from current state)
|
|
2906
3574
|
...balance.pendingRootClaim !== void 0 && {
|
|
2907
3575
|
pendingRootClaim: balance.pendingRootClaim
|
|
3576
|
+
},
|
|
3577
|
+
...balance.convictionLock !== void 0 && {
|
|
3578
|
+
convictionLock: balance.convictionLock
|
|
2908
3579
|
}
|
|
2909
3580
|
};
|
|
2910
3581
|
} else {
|
|
@@ -2947,13 +3618,29 @@ var fetchBalances7 = async ({
|
|
|
2947
3618
|
},
|
|
2948
3619
|
{}
|
|
2949
3620
|
);
|
|
3621
|
+
for (const { address, netuid, lock } of convictionLocks) {
|
|
3622
|
+
const dynamicInfo = dynamicInfoByNetuid[netuid];
|
|
3623
|
+
const scaledAlphaPrice = dynamicInfo ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in) : 0n;
|
|
3624
|
+
const balance = {
|
|
3625
|
+
address,
|
|
3626
|
+
tokenId: subDTaoTokenId2(networkId, netuid),
|
|
3627
|
+
baseTokenId: subDTaoTokenId2(networkId, netuid),
|
|
3628
|
+
stake: 0n,
|
|
3629
|
+
hotkey: lock.hotkey,
|
|
3630
|
+
netuid,
|
|
3631
|
+
scaledAlphaPrice,
|
|
3632
|
+
convictionLock: lock
|
|
3633
|
+
};
|
|
3634
|
+
upsertBalance(balancesRaw, address, balance.tokenId, balance);
|
|
3635
|
+
}
|
|
2950
3636
|
const balances = Object.values(balancesRaw);
|
|
2951
|
-
const tokensById =
|
|
3637
|
+
const tokensById = keyBy5(
|
|
2952
3638
|
tokensWithAddresses.map(([token]) => token),
|
|
2953
3639
|
(t) => t.id
|
|
2954
3640
|
);
|
|
2955
3641
|
const dynamicTokens = [];
|
|
2956
3642
|
for (const bal of balances) {
|
|
3643
|
+
if (bal.tokenId === bal.baseTokenId) continue;
|
|
2957
3644
|
if (!balanceDefs.some((def) => def.token.id === bal.tokenId)) {
|
|
2958
3645
|
const baseToken = tokensById[bal.baseTokenId];
|
|
2959
3646
|
if (baseToken) {
|
|
@@ -2974,6 +3661,8 @@ var fetchBalances7 = async ({
|
|
|
2974
3661
|
};
|
|
2975
3662
|
const stakeAmount = BigInt(stake?.stake?.toString() ?? "0");
|
|
2976
3663
|
const pendingRootClaimAmount = BigInt(stake?.pendingRootClaim?.toString() ?? "0");
|
|
3664
|
+
const convictionLockAmount = BigInt(stake?.convictionLock?.amount?.toString() ?? "0");
|
|
3665
|
+
const convictionLockConviction = BigInt(stake?.convictionLock?.convictionRaw ?? "0");
|
|
2977
3666
|
const hasZeroStake = stakeAmount === 0n;
|
|
2978
3667
|
const hasPendingRootClaim = pendingRootClaimAmount > 0n;
|
|
2979
3668
|
const balanceValue = {
|
|
@@ -2986,9 +3675,30 @@ var fetchBalances7 = async ({
|
|
|
2986
3675
|
type: "locked",
|
|
2987
3676
|
label: "Pending root claim",
|
|
2988
3677
|
amount: pendingRootClaimAmount.toString(),
|
|
3678
|
+
// The pending claim is not part of the stake (free amount): on-chain it only becomes
|
|
3679
|
+
// stake once claimed (root_claim_on_subnet). Since it was never included in `free`,
|
|
3680
|
+
// it must not be subtracted from it either: flag it so it does not reduce the staked
|
|
3681
|
+
// position's transferable amount.
|
|
3682
|
+
includeInTransferable: true,
|
|
2989
3683
|
meta
|
|
2990
3684
|
};
|
|
2991
3685
|
const values3 = [balanceValue, pendingRootClaimValue];
|
|
3686
|
+
if (stake?.convictionLock && (convictionLockAmount > 0n || convictionLockConviction > 0n)) {
|
|
3687
|
+
const convictionLockMeta = {
|
|
3688
|
+
...meta,
|
|
3689
|
+
convictionLock: {
|
|
3690
|
+
type: "conviction-lock",
|
|
3691
|
+
hotkey: stake.convictionLock.hotkey,
|
|
3692
|
+
lockType: stake.convictionLock.lockType
|
|
3693
|
+
}
|
|
3694
|
+
};
|
|
3695
|
+
values3.push({
|
|
3696
|
+
type: "locked",
|
|
3697
|
+
label: getConvictionLockLabel(stake.convictionLock.lockType),
|
|
3698
|
+
amount: convictionLockAmount.toString(),
|
|
3699
|
+
meta: convictionLockMeta
|
|
3700
|
+
});
|
|
3701
|
+
}
|
|
2992
3702
|
if (hasZeroStake && hasPendingRootClaim) {
|
|
2993
3703
|
values3.push({
|
|
2994
3704
|
type: "extra",
|
|
@@ -3002,7 +3712,7 @@ var fetchBalances7 = async ({
|
|
|
3002
3712
|
address: def.address,
|
|
3003
3713
|
networkId,
|
|
3004
3714
|
tokenId: def.token.id,
|
|
3005
|
-
source:
|
|
3715
|
+
source: MODULE_TYPE8,
|
|
3006
3716
|
status: "live",
|
|
3007
3717
|
values: values3
|
|
3008
3718
|
};
|
|
@@ -3026,7 +3736,7 @@ var fetchBalances7 = async ({
|
|
|
3026
3736
|
}
|
|
3027
3737
|
};
|
|
3028
3738
|
var buildStorageCoder = (metadataRpc, pallet, entry) => {
|
|
3029
|
-
const { builder } =
|
|
3739
|
+
const { builder } = parseMetadataRpc5(metadataRpc);
|
|
3030
3740
|
return builder.buildStorage(pallet, entry);
|
|
3031
3741
|
};
|
|
3032
3742
|
var buildRootClaimableStorageCoder = async (_connector, networkId, metadataRpc) => {
|
|
@@ -3070,7 +3780,7 @@ var buildRootClaimableQueries = (networkId, hotkeys, storageCoder) => {
|
|
|
3070
3780
|
if (!hexValue) {
|
|
3071
3781
|
return [hotkey, /* @__PURE__ */ new Map()];
|
|
3072
3782
|
}
|
|
3073
|
-
const decoded =
|
|
3783
|
+
const decoded = decodeScale3(
|
|
3074
3784
|
storageCoder,
|
|
3075
3785
|
hexValue,
|
|
3076
3786
|
`Failed to decode RootClaimable for hotkey ${hotkey} on ${networkId}`
|
|
@@ -3114,7 +3824,7 @@ var buildRootClaimedQueries = (networkId, addressHotkeyNetuidPairs, storageCoder
|
|
|
3114
3824
|
if (!hexValue) {
|
|
3115
3825
|
return [address, hotkey, netuid, 0n];
|
|
3116
3826
|
}
|
|
3117
|
-
const decoded =
|
|
3827
|
+
const decoded = decodeScale3(
|
|
3118
3828
|
storageCoder,
|
|
3119
3829
|
hexValue,
|
|
3120
3830
|
`Failed to decode RootClaimed for (netuid=${netuid}, hotkey=${hotkey}, address=${address}) on ${networkId}`
|
|
@@ -3173,14 +3883,14 @@ import {
|
|
|
3173
3883
|
SubDTaoTokenSchema as SubDTaoTokenSchema2,
|
|
3174
3884
|
subDTaoTokenId as subDTaoTokenId3
|
|
3175
3885
|
} from "@talismn/chaindata-provider";
|
|
3176
|
-
import { getStorageKeyPrefix as getStorageKeyPrefix2, parseMetadataRpc as
|
|
3177
|
-
import { isNotNil as
|
|
3886
|
+
import { getStorageKeyPrefix as getStorageKeyPrefix2, parseMetadataRpc as parseMetadataRpc6 } from "@talismn/scale";
|
|
3887
|
+
import { isNotNil as isNotNil6 } from "@talismn/util";
|
|
3178
3888
|
import { fromPairs } from "lodash-es";
|
|
3179
3889
|
var NATIVE_TOKEN_SYMBOLS = {
|
|
3180
3890
|
"bittensor": "TAO",
|
|
3181
3891
|
"bittensor-testnet": "testTAO"
|
|
3182
3892
|
};
|
|
3183
|
-
var
|
|
3893
|
+
var fetchTokens8 = async ({
|
|
3184
3894
|
networkId,
|
|
3185
3895
|
connector,
|
|
3186
3896
|
tokens,
|
|
@@ -3199,7 +3909,7 @@ var fetchTokens7 = async ({
|
|
|
3199
3909
|
[]
|
|
3200
3910
|
)
|
|
3201
3911
|
]);
|
|
3202
|
-
return dynamicInfos.filter(
|
|
3912
|
+
return dynamicInfos.filter(isNotNil6).map((info) => {
|
|
3203
3913
|
const config = tokens.find((t) => t.netuid === info.netuid);
|
|
3204
3914
|
let symbol = new TextDecoder().decode(Uint8Array.from(info.token_symbol));
|
|
3205
3915
|
const subnetName = info.subnet_identity?.subnet_name?.asText() ?? (info.netuid === 0 ? "Root" : `Subnet ${info.netuid}`);
|
|
@@ -3209,8 +3919,8 @@ var fetchTokens7 = async ({
|
|
|
3209
3919
|
const isTransferable = transferableTokensMap[info.netuid] ?? true;
|
|
3210
3920
|
const token = {
|
|
3211
3921
|
id: subDTaoTokenId3(networkId, info.netuid),
|
|
3212
|
-
type:
|
|
3213
|
-
platform:
|
|
3922
|
+
type: MODULE_TYPE8,
|
|
3923
|
+
platform: PLATFORM8,
|
|
3214
3924
|
networkId,
|
|
3215
3925
|
netuid: info.netuid,
|
|
3216
3926
|
isDefault: true,
|
|
@@ -3227,7 +3937,7 @@ var fetchTokens7 = async ({
|
|
|
3227
3937
|
});
|
|
3228
3938
|
};
|
|
3229
3939
|
var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
|
|
3230
|
-
const { builder } =
|
|
3940
|
+
const { builder } = parseMetadataRpc6(metadata);
|
|
3231
3941
|
const transferToggleCodec = builder.buildStorage("SubtensorModule", "TransferToggle");
|
|
3232
3942
|
const transferToggleKeys = await connector.send(networkId, "state_getKeys", [
|
|
3233
3943
|
getStorageKeyPrefix2("SubtensorModule", "TransferToggle")
|
|
@@ -3249,13 +3959,13 @@ var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
|
|
|
3249
3959
|
|
|
3250
3960
|
// src/modules/substrate-dtao/getMiniMetadata.ts
|
|
3251
3961
|
import { MINIMETADATA_VERSION } from "@talismn/chaindata-provider";
|
|
3252
|
-
import { compactMetadata, encodeMetadata, parseMetadataRpc as
|
|
3253
|
-
var
|
|
3962
|
+
import { compactMetadata, encodeMetadata, parseMetadataRpc as parseMetadataRpc7 } from "@talismn/scale";
|
|
3963
|
+
var getMiniMetadata7 = ({
|
|
3254
3964
|
networkId,
|
|
3255
3965
|
specVersion,
|
|
3256
3966
|
metadataRpc
|
|
3257
3967
|
}) => {
|
|
3258
|
-
const source =
|
|
3968
|
+
const source = MODULE_TYPE8;
|
|
3259
3969
|
const chainId = networkId;
|
|
3260
3970
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
3261
3971
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -3263,7 +3973,7 @@ var getMiniMetadata6 = ({
|
|
|
3263
3973
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
3264
3974
|
);
|
|
3265
3975
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
3266
|
-
const { unifiedMetadata } =
|
|
3976
|
+
const { unifiedMetadata } = parseMetadataRpc7(metadataRpc);
|
|
3267
3977
|
if (unifiedMetadata.version < 14)
|
|
3268
3978
|
throw new Error(
|
|
3269
3979
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -3279,16 +3989,21 @@ var getMiniMetadata6 = ({
|
|
|
3279
3989
|
};
|
|
3280
3990
|
};
|
|
3281
3991
|
var getData = (metadataRpc) => {
|
|
3282
|
-
const { metadata, unifiedMetadata } =
|
|
3992
|
+
const { metadata, unifiedMetadata } = parseMetadataRpc7(metadataRpc);
|
|
3283
3993
|
const isBittensor = unifiedMetadata.pallets.some(({ name }) => name === "SubtensorModule");
|
|
3284
3994
|
if (!isBittensor) return null;
|
|
3285
3995
|
compactMetadata(
|
|
3286
3996
|
metadata,
|
|
3287
|
-
[
|
|
3997
|
+
[
|
|
3998
|
+
{
|
|
3999
|
+
pallet: "SubtensorModule",
|
|
4000
|
+
items: ["TransferToggle", "RootClaimable", "RootClaimed", "Lock", "DecayingLock"]
|
|
4001
|
+
}
|
|
4002
|
+
],
|
|
3288
4003
|
[
|
|
3289
4004
|
{
|
|
3290
4005
|
runtimeApi: "StakeInfoRuntimeApi",
|
|
3291
|
-
methods: ["get_stake_info_for_coldkeys"]
|
|
4006
|
+
methods: ["get_stake_info_for_coldkeys", "get_coldkey_lock"]
|
|
3292
4007
|
},
|
|
3293
4008
|
{
|
|
3294
4009
|
runtimeApi: "SubnetInfoRuntimeApi",
|
|
@@ -3301,21 +4016,21 @@ var getData = (metadataRpc) => {
|
|
|
3301
4016
|
|
|
3302
4017
|
// src/modules/substrate-dtao/getTransferCallData.ts
|
|
3303
4018
|
import { mergeUint8 } from "@polkadot-api/utils";
|
|
3304
|
-
import { isTokenOfType as
|
|
3305
|
-
import { parseMetadataRpc as
|
|
4019
|
+
import { isTokenOfType as isTokenOfType7, parseSubDTaoTokenId } from "@talismn/chaindata-provider";
|
|
4020
|
+
import { parseMetadataRpc as parseMetadataRpc8 } from "@talismn/scale";
|
|
3306
4021
|
import { Binary } from "polkadot-api";
|
|
3307
|
-
var
|
|
4022
|
+
var getTransferCallData7 = ({
|
|
3308
4023
|
from: from2,
|
|
3309
4024
|
to,
|
|
3310
4025
|
value,
|
|
3311
4026
|
token,
|
|
3312
4027
|
metadataRpc
|
|
3313
4028
|
}) => {
|
|
3314
|
-
if (!
|
|
3315
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
4029
|
+
if (!isTokenOfType7(token, MODULE_TYPE8))
|
|
4030
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE8}.`);
|
|
3316
4031
|
const { netuid: subnetId, hotkey } = parseSubDTaoTokenId(token.id);
|
|
3317
4032
|
if (!hotkey) throw new Error(`Missing hotkey`);
|
|
3318
|
-
const { builder } =
|
|
4033
|
+
const { builder } = parseMetadataRpc8(metadataRpc);
|
|
3319
4034
|
const { codec, location } = builder.buildCall("SubtensorModule", "transfer_stake");
|
|
3320
4035
|
const args = codec.enc({
|
|
3321
4036
|
origin_netuid: subnetId,
|
|
@@ -3332,22 +4047,23 @@ var getTransferCallData6 = ({
|
|
|
3332
4047
|
};
|
|
3333
4048
|
|
|
3334
4049
|
// src/modules/substrate-dtao/subscribeBalances.ts
|
|
3335
|
-
import { isEqual as
|
|
3336
|
-
import { distinctUntilChanged as
|
|
3337
|
-
var
|
|
3338
|
-
var
|
|
4050
|
+
import { isEqual as isEqual8 } from "lodash-es";
|
|
4051
|
+
import { distinctUntilChanged as distinctUntilChanged8, Observable as Observable8, of as of8 } from "rxjs";
|
|
4052
|
+
var SUBSCRIPTION_INTERVAL7 = 6e3;
|
|
4053
|
+
var subscribeBalances7 = ({
|
|
3339
4054
|
networkId,
|
|
3340
4055
|
tokensWithAddresses,
|
|
3341
4056
|
connector,
|
|
3342
4057
|
miniMetadata
|
|
3343
4058
|
}) => {
|
|
3344
|
-
if (!tokensWithAddresses.length) return
|
|
3345
|
-
|
|
4059
|
+
if (!tokensWithAddresses.length) return of8({ success: [], errors: [] });
|
|
4060
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4061
|
+
return new Observable8((subscriber) => {
|
|
3346
4062
|
const abortController = new AbortController();
|
|
3347
4063
|
const poll = async () => {
|
|
3348
4064
|
try {
|
|
3349
4065
|
if (abortController.signal.aborted) return;
|
|
3350
|
-
const balances = await
|
|
4066
|
+
const balances = await fetchBalances8({
|
|
3351
4067
|
networkId,
|
|
3352
4068
|
tokensWithAddresses,
|
|
3353
4069
|
connector,
|
|
@@ -3355,40 +4071,49 @@ var subscribeBalances6 = ({
|
|
|
3355
4071
|
});
|
|
3356
4072
|
if (abortController.signal.aborted) return;
|
|
3357
4073
|
subscriber.next(balances);
|
|
3358
|
-
setTimeout(poll, SUBSCRIPTION_INTERVAL6);
|
|
3359
4074
|
} catch (error) {
|
|
4075
|
+
if (abortController.signal.aborted) return;
|
|
3360
4076
|
log_default.error("Error", {
|
|
3361
|
-
module:
|
|
4077
|
+
module: MODULE_TYPE8,
|
|
3362
4078
|
networkId,
|
|
3363
4079
|
miniMetadata,
|
|
3364
4080
|
addressesByToken: tokensWithAddresses,
|
|
3365
4081
|
error
|
|
3366
4082
|
});
|
|
3367
|
-
|
|
4083
|
+
const fetchError = error instanceof Error ? error : new Error(String(error));
|
|
4084
|
+
subscriber.next({
|
|
4085
|
+
success: [],
|
|
4086
|
+
errors: balanceDefs.map((def) => ({
|
|
4087
|
+
tokenId: def.token.id,
|
|
4088
|
+
address: def.address,
|
|
4089
|
+
error: fetchError
|
|
4090
|
+
}))
|
|
4091
|
+
});
|
|
3368
4092
|
}
|
|
4093
|
+
if (!abortController.signal.aborted) setTimeout(poll, SUBSCRIPTION_INTERVAL7);
|
|
3369
4094
|
};
|
|
3370
4095
|
poll();
|
|
3371
4096
|
return () => {
|
|
3372
4097
|
abortController.abort();
|
|
3373
4098
|
};
|
|
3374
|
-
}).pipe(
|
|
4099
|
+
}).pipe(distinctUntilChanged8(isEqual8));
|
|
3375
4100
|
};
|
|
3376
4101
|
|
|
3377
4102
|
// src/modules/substrate-dtao/module.ts
|
|
3378
4103
|
var SubDTaoBalanceModule = {
|
|
3379
|
-
type:
|
|
3380
|
-
platform:
|
|
3381
|
-
getMiniMetadata:
|
|
3382
|
-
fetchTokens:
|
|
3383
|
-
fetchBalances:
|
|
3384
|
-
subscribeBalances:
|
|
3385
|
-
getTransferCallData:
|
|
4104
|
+
type: MODULE_TYPE8,
|
|
4105
|
+
platform: PLATFORM8,
|
|
4106
|
+
getMiniMetadata: getMiniMetadata7,
|
|
4107
|
+
fetchTokens: fetchTokens8,
|
|
4108
|
+
fetchBalances: fetchBalances8,
|
|
4109
|
+
subscribeBalances: subscribeBalances7,
|
|
4110
|
+
getTransferCallData: getTransferCallData7
|
|
3386
4111
|
};
|
|
3387
4112
|
|
|
3388
4113
|
// src/modules/substrate-dtao/types.ts
|
|
3389
4114
|
import { SubDTaoTokenSchema as SubDTaoTokenSchema3 } from "@talismn/chaindata-provider";
|
|
3390
|
-
import
|
|
3391
|
-
var SubDTaoTokenConfigSchema =
|
|
4115
|
+
import z11 from "zod/v4";
|
|
4116
|
+
var SubDTaoTokenConfigSchema = z11.strictObject({
|
|
3392
4117
|
netuid: SubDTaoTokenSchema3.shape.netuid,
|
|
3393
4118
|
...TokenConfigBaseSchema.shape
|
|
3394
4119
|
});
|
|
@@ -3668,9 +4393,9 @@ var Balance = class {
|
|
|
3668
4393
|
const totalSupply = extras.find((extra2) => extra2.label === "totalSupply")?.amount ?? "0";
|
|
3669
4394
|
const reserve0 = extras.find((extra2) => extra2.label === "reserve0")?.amount ?? "0";
|
|
3670
4395
|
const reserve1 = extras.find((extra2) => extra2.label === "reserve1")?.amount ?? "0";
|
|
3671
|
-
const totalSupplyTokens =
|
|
3672
|
-
const reserve0Tokens =
|
|
3673
|
-
const reserve1Tokens =
|
|
4396
|
+
const totalSupplyTokens = configureBigNumber_default(totalSupply).times(10 ** (-1 * decimals));
|
|
4397
|
+
const reserve0Tokens = configureBigNumber_default(reserve0).times(10 ** (-1 * decimals0));
|
|
4398
|
+
const reserve1Tokens = configureBigNumber_default(reserve1).times(10 ** (-1 * decimals1));
|
|
3674
4399
|
const rates0Currencies = new Set(Object.keys(rates0));
|
|
3675
4400
|
const rates1Currencies = new Set(Object.keys(rates1));
|
|
3676
4401
|
const currencies = [...rates0Currencies].filter((c) => rates1Currencies.has(c));
|
|
@@ -3678,7 +4403,7 @@ var Balance = class {
|
|
|
3678
4403
|
(currency) => [
|
|
3679
4404
|
currency,
|
|
3680
4405
|
// tvl (in a given currency) == reserve0*currencyRate0 + reserve1*currencyRate1
|
|
3681
|
-
|
|
4406
|
+
configureBigNumber_default.sum(
|
|
3682
4407
|
reserve0Tokens.times(rates0[currency]?.price ?? 0),
|
|
3683
4408
|
reserve1Tokens.times(rates1[currency]?.price ?? 0)
|
|
3684
4409
|
)
|
|
@@ -4056,12 +4781,12 @@ var deriveMiniMetadataId = ({
|
|
|
4056
4781
|
).slice(-32);
|
|
4057
4782
|
|
|
4058
4783
|
// src/modules/substrate-assets/getMiniMetadata.ts
|
|
4059
|
-
var
|
|
4784
|
+
var getMiniMetadata8 = ({
|
|
4060
4785
|
networkId,
|
|
4061
4786
|
specVersion,
|
|
4062
4787
|
metadataRpc
|
|
4063
4788
|
}) => {
|
|
4064
|
-
const source =
|
|
4789
|
+
const source = MODULE_TYPE7;
|
|
4065
4790
|
const chainId = networkId;
|
|
4066
4791
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
4067
4792
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -4069,7 +4794,7 @@ var getMiniMetadata7 = ({
|
|
|
4069
4794
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
4070
4795
|
);
|
|
4071
4796
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
4072
|
-
const { unifiedMetadata } =
|
|
4797
|
+
const { unifiedMetadata } = parseMetadataRpc9(metadataRpc);
|
|
4073
4798
|
if (unifiedMetadata.version < 14)
|
|
4074
4799
|
throw new Error(
|
|
4075
4800
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -4085,7 +4810,7 @@ var getMiniMetadata7 = ({
|
|
|
4085
4810
|
};
|
|
4086
4811
|
};
|
|
4087
4812
|
var getData2 = (metadataRpc) => {
|
|
4088
|
-
const { metadata, unifiedMetadata } =
|
|
4813
|
+
const { metadata, unifiedMetadata } = parseMetadataRpc9(metadataRpc);
|
|
4089
4814
|
if (!hasStorageItems(unifiedMetadata, "Assets", ["Account", "Asset", "Metadata"])) return null;
|
|
4090
4815
|
compactMetadata2(metadata, [{ pallet: "Assets", items: ["Account", "Asset", "Metadata"] }]);
|
|
4091
4816
|
return encodeMetadata2(metadata);
|
|
@@ -4093,10 +4818,10 @@ var getData2 = (metadataRpc) => {
|
|
|
4093
4818
|
|
|
4094
4819
|
// src/modules/substrate-assets/getTransferCallData.ts
|
|
4095
4820
|
import { mergeUint8 as mergeUint82 } from "@polkadot-api/utils";
|
|
4096
|
-
import { isTokenOfType as
|
|
4097
|
-
import { parseMetadataRpc as
|
|
4821
|
+
import { isTokenOfType as isTokenOfType8 } from "@talismn/chaindata-provider";
|
|
4822
|
+
import { parseMetadataRpc as parseMetadataRpc10 } from "@talismn/scale";
|
|
4098
4823
|
import { Binary as Binary2, Enum } from "polkadot-api";
|
|
4099
|
-
var
|
|
4824
|
+
var getTransferCallData8 = ({
|
|
4100
4825
|
from: from2,
|
|
4101
4826
|
to,
|
|
4102
4827
|
value,
|
|
@@ -4104,9 +4829,9 @@ var getTransferCallData7 = ({
|
|
|
4104
4829
|
type,
|
|
4105
4830
|
metadataRpc
|
|
4106
4831
|
}) => {
|
|
4107
|
-
if (!
|
|
4108
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
4109
|
-
const { builder } =
|
|
4832
|
+
if (!isTokenOfType8(token, MODULE_TYPE7))
|
|
4833
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE7}.`);
|
|
4834
|
+
const { builder } = parseMetadataRpc10(metadataRpc);
|
|
4110
4835
|
const method = getTransferMethod(type);
|
|
4111
4836
|
const { codec, location } = builder.buildCall("Assets", method);
|
|
4112
4837
|
const args = getEncodedArgs(method, token.assetId, to, value, codec);
|
|
@@ -4194,14 +4919,14 @@ var getTransferAllEncodedArgs = (assetId, to, codec) => {
|
|
|
4194
4919
|
};
|
|
4195
4920
|
|
|
4196
4921
|
// src/modules/substrate-assets/subscribeBalances.ts
|
|
4197
|
-
import { map as map2, of as
|
|
4198
|
-
var
|
|
4922
|
+
import { map as map2, of as of9 } from "rxjs";
|
|
4923
|
+
var subscribeBalances8 = ({
|
|
4199
4924
|
networkId,
|
|
4200
4925
|
tokensWithAddresses,
|
|
4201
4926
|
connector,
|
|
4202
4927
|
miniMetadata
|
|
4203
4928
|
}) => {
|
|
4204
|
-
if (!tokensWithAddresses.length) return
|
|
4929
|
+
if (!tokensWithAddresses.length) return of9({ success: [], errors: [] });
|
|
4205
4930
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4206
4931
|
const queries = buildQueries(networkId, balanceDefs, miniMetadata);
|
|
4207
4932
|
return getRpcQueryPack$(connector, networkId, queries).pipe(
|
|
@@ -4214,31 +4939,31 @@ var subscribeBalances7 = ({
|
|
|
4214
4939
|
|
|
4215
4940
|
// src/modules/substrate-assets/module.ts
|
|
4216
4941
|
var SubAssetsBalanceModule = {
|
|
4217
|
-
type:
|
|
4218
|
-
platform:
|
|
4219
|
-
getMiniMetadata:
|
|
4220
|
-
fetchTokens:
|
|
4221
|
-
fetchBalances:
|
|
4222
|
-
subscribeBalances:
|
|
4223
|
-
getTransferCallData:
|
|
4942
|
+
type: MODULE_TYPE7,
|
|
4943
|
+
platform: PLATFORM7,
|
|
4944
|
+
getMiniMetadata: getMiniMetadata8,
|
|
4945
|
+
fetchTokens: fetchTokens7,
|
|
4946
|
+
fetchBalances: fetchBalances7,
|
|
4947
|
+
subscribeBalances: subscribeBalances8,
|
|
4948
|
+
getTransferCallData: getTransferCallData8
|
|
4224
4949
|
};
|
|
4225
4950
|
|
|
4226
4951
|
// src/modules/substrate-assets/types.ts
|
|
4227
4952
|
import { SubAssetsTokenSchema as SubAssetsTokenSchema3 } from "@talismn/chaindata-provider";
|
|
4228
|
-
import
|
|
4229
|
-
var SubAssetsTokenConfigSchema =
|
|
4953
|
+
import z12 from "zod/v4";
|
|
4954
|
+
var SubAssetsTokenConfigSchema = z12.strictObject({
|
|
4230
4955
|
assetId: SubAssetsTokenSchema3.shape.assetId,
|
|
4231
4956
|
...TokenConfigBaseSchema.shape
|
|
4232
4957
|
});
|
|
4233
4958
|
|
|
4234
4959
|
// src/modules/substrate-foreignassets/config.ts
|
|
4235
4960
|
import { SubForeignAssetsTokenSchema } from "@talismn/chaindata-provider";
|
|
4236
|
-
var
|
|
4237
|
-
var
|
|
4961
|
+
var MODULE_TYPE9 = SubForeignAssetsTokenSchema.shape.type.value;
|
|
4962
|
+
var PLATFORM9 = SubForeignAssetsTokenSchema.shape.platform.value;
|
|
4238
4963
|
|
|
4239
4964
|
// src/modules/substrate-foreignassets/buildQueries.ts
|
|
4240
|
-
import { decodeScale as
|
|
4241
|
-
import { isNotNil as
|
|
4965
|
+
import { decodeScale as decodeScale4, papiParse } from "@talismn/scale";
|
|
4966
|
+
import { isNotNil as isNotNil7 } from "@talismn/util";
|
|
4242
4967
|
var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
|
|
4243
4968
|
const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
|
|
4244
4969
|
storage: ["ForeignAssets", "Account"]
|
|
@@ -4260,7 +4985,7 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
4260
4985
|
return null;
|
|
4261
4986
|
}
|
|
4262
4987
|
const decodeResult = (changes) => {
|
|
4263
|
-
const decoded =
|
|
4988
|
+
const decoded = decodeScale4(
|
|
4264
4989
|
scaleCoder,
|
|
4265
4990
|
changes[0],
|
|
4266
4991
|
`Failed to decode substrate-assets balance on chain ${networkId}`
|
|
@@ -4293,11 +5018,11 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
4293
5018
|
stateKeys: [stateKey],
|
|
4294
5019
|
decodeResult
|
|
4295
5020
|
};
|
|
4296
|
-
}).filter(
|
|
5021
|
+
}).filter(isNotNil7);
|
|
4297
5022
|
};
|
|
4298
5023
|
|
|
4299
5024
|
// src/modules/substrate-foreignassets/fetchBalances.ts
|
|
4300
|
-
var
|
|
5025
|
+
var fetchBalances9 = async ({
|
|
4301
5026
|
networkId,
|
|
4302
5027
|
tokensWithAddresses,
|
|
4303
5028
|
connector,
|
|
@@ -4306,7 +5031,7 @@ var fetchBalances8 = async ({
|
|
|
4306
5031
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
4307
5032
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4308
5033
|
if (!miniMetadata?.data) {
|
|
4309
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
5034
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE9} balances on ${networkId}.`);
|
|
4310
5035
|
return {
|
|
4311
5036
|
success: [],
|
|
4312
5037
|
errors: balanceDefs.map((def) => ({
|
|
@@ -4316,20 +5041,20 @@ var fetchBalances8 = async ({
|
|
|
4316
5041
|
}))
|
|
4317
5042
|
};
|
|
4318
5043
|
}
|
|
4319
|
-
if (miniMetadata.source !==
|
|
4320
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
5044
|
+
if (miniMetadata.source !== MODULE_TYPE9) {
|
|
5045
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE9}.`);
|
|
4321
5046
|
return {
|
|
4322
5047
|
success: [],
|
|
4323
5048
|
errors: balanceDefs.map((def) => ({
|
|
4324
5049
|
tokenId: def.token.id,
|
|
4325
5050
|
address: def.address,
|
|
4326
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
5051
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE9}`)
|
|
4327
5052
|
}))
|
|
4328
5053
|
};
|
|
4329
5054
|
}
|
|
4330
5055
|
if (miniMetadata.chainId !== networkId) {
|
|
4331
5056
|
log_default.warn(
|
|
4332
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
5057
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE9}. Expected chainId is ${networkId}`
|
|
4333
5058
|
);
|
|
4334
5059
|
return {
|
|
4335
5060
|
success: [],
|
|
@@ -4353,7 +5078,7 @@ var fetchBalances8 = async ({
|
|
|
4353
5078
|
address: def.address,
|
|
4354
5079
|
networkId,
|
|
4355
5080
|
tokenId: def.token.id,
|
|
4356
|
-
source:
|
|
5081
|
+
source: MODULE_TYPE9,
|
|
4357
5082
|
status: "live",
|
|
4358
5083
|
values: [
|
|
4359
5084
|
{ type: "free", label: "free", amount: "0" },
|
|
@@ -4371,9 +5096,9 @@ import {
|
|
|
4371
5096
|
SubForeignAssetsTokenSchema as SubForeignAssetsTokenSchema2,
|
|
4372
5097
|
subForeignAssetTokenId
|
|
4373
5098
|
} from "@talismn/chaindata-provider";
|
|
4374
|
-
import { getStorageKeyPrefix as getStorageKeyPrefix3, papiStringify, parseMetadataRpc as
|
|
4375
|
-
import { assign as
|
|
4376
|
-
var
|
|
5099
|
+
import { getStorageKeyPrefix as getStorageKeyPrefix3, papiStringify, parseMetadataRpc as parseMetadataRpc11 } from "@talismn/scale";
|
|
5100
|
+
import { assign as assign8, keyBy as keyBy6, keys as keys2 } from "lodash-es";
|
|
5101
|
+
var fetchTokens9 = async ({
|
|
4377
5102
|
networkId,
|
|
4378
5103
|
tokens,
|
|
4379
5104
|
connector,
|
|
@@ -4381,7 +5106,7 @@ var fetchTokens8 = async ({
|
|
|
4381
5106
|
}) => {
|
|
4382
5107
|
const anyMiniMetadata = miniMetadata;
|
|
4383
5108
|
if (!anyMiniMetadata?.data) return [];
|
|
4384
|
-
const { builder } =
|
|
5109
|
+
const { builder } = parseMetadataRpc11(anyMiniMetadata.data);
|
|
4385
5110
|
const assetCodec = builder.buildStorage("ForeignAssets", "Asset");
|
|
4386
5111
|
const metadataCodec = builder.buildStorage("ForeignAssets", "Metadata");
|
|
4387
5112
|
const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([
|
|
@@ -4398,7 +5123,7 @@ var fetchTokens8 = async ({
|
|
|
4398
5123
|
]);
|
|
4399
5124
|
const assetStorageEntries = assetStorageResults[0]?.changes ?? [];
|
|
4400
5125
|
const metadataStorageEntries = metadataStorageResults[0]?.changes ?? [];
|
|
4401
|
-
const assetByOnChainId =
|
|
5126
|
+
const assetByOnChainId = keyBy6(
|
|
4402
5127
|
assetStorageEntries.map(([key, value]) => {
|
|
4403
5128
|
const [decodedKey] = assetCodec.keys.dec(key);
|
|
4404
5129
|
const onChainId = papiStringify(decodedKey);
|
|
@@ -4407,7 +5132,7 @@ var fetchTokens8 = async ({
|
|
|
4407
5132
|
}),
|
|
4408
5133
|
(a) => a.onChainId
|
|
4409
5134
|
);
|
|
4410
|
-
const metadataByOnChainId =
|
|
5135
|
+
const metadataByOnChainId = keyBy6(
|
|
4411
5136
|
metadataStorageEntries.map(([key, value]) => {
|
|
4412
5137
|
const [decodedKey] = metadataCodec.keys.dec(key);
|
|
4413
5138
|
const onChainId = papiStringify(decodedKey);
|
|
@@ -4423,13 +5148,13 @@ var fetchTokens8 = async ({
|
|
|
4423
5148
|
(a) => a.onChainId
|
|
4424
5149
|
);
|
|
4425
5150
|
const allTokens = keys2(assetByOnChainId).map(
|
|
4426
|
-
(onChainId) =>
|
|
5151
|
+
(onChainId) => assign8({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? void 0)
|
|
4427
5152
|
);
|
|
4428
|
-
const configTokenByOnChainId =
|
|
5153
|
+
const configTokenByOnChainId = keyBy6(tokens, (t) => t.onChainId);
|
|
4429
5154
|
return allTokens.map(
|
|
4430
5155
|
(asset) => ({
|
|
4431
5156
|
id: subForeignAssetTokenId(networkId, asset.onChainId),
|
|
4432
|
-
type:
|
|
5157
|
+
type: MODULE_TYPE9,
|
|
4433
5158
|
platform: "polkadot",
|
|
4434
5159
|
networkId,
|
|
4435
5160
|
onChainId: String(asset.onChainId),
|
|
@@ -4446,7 +5171,7 @@ var fetchTokens8 = async ({
|
|
|
4446
5171
|
return configToken || token.isSufficient;
|
|
4447
5172
|
}).map((token) => {
|
|
4448
5173
|
const configToken = configTokenByOnChainId[token.onChainId];
|
|
4449
|
-
return configToken ?
|
|
5174
|
+
return configToken ? assign8({}, token, configToken) : token;
|
|
4450
5175
|
}).filter((t) => {
|
|
4451
5176
|
const parsed = SubForeignAssetsTokenSchema2.safeParse(t);
|
|
4452
5177
|
return parsed.success;
|
|
@@ -4455,13 +5180,13 @@ var fetchTokens8 = async ({
|
|
|
4455
5180
|
|
|
4456
5181
|
// src/modules/substrate-foreignassets/getMiniMetadata.ts
|
|
4457
5182
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION4 } from "@talismn/chaindata-provider";
|
|
4458
|
-
import { compactMetadata as compactMetadata3, encodeMetadata as encodeMetadata3, parseMetadataRpc as
|
|
4459
|
-
var
|
|
5183
|
+
import { compactMetadata as compactMetadata3, encodeMetadata as encodeMetadata3, parseMetadataRpc as parseMetadataRpc12 } from "@talismn/scale";
|
|
5184
|
+
var getMiniMetadata9 = ({
|
|
4460
5185
|
networkId,
|
|
4461
5186
|
specVersion,
|
|
4462
5187
|
metadataRpc
|
|
4463
5188
|
}) => {
|
|
4464
|
-
const source =
|
|
5189
|
+
const source = MODULE_TYPE9;
|
|
4465
5190
|
const chainId = networkId;
|
|
4466
5191
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
4467
5192
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -4469,7 +5194,7 @@ var getMiniMetadata8 = ({
|
|
|
4469
5194
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
4470
5195
|
);
|
|
4471
5196
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
4472
|
-
const { unifiedMetadata } =
|
|
5197
|
+
const { unifiedMetadata } = parseMetadataRpc12(metadataRpc);
|
|
4473
5198
|
if (unifiedMetadata.version < 14)
|
|
4474
5199
|
throw new Error(
|
|
4475
5200
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -4485,7 +5210,7 @@ var getMiniMetadata8 = ({
|
|
|
4485
5210
|
};
|
|
4486
5211
|
};
|
|
4487
5212
|
var getData3 = (metadataRpc) => {
|
|
4488
|
-
const { metadata, unifiedMetadata } =
|
|
5213
|
+
const { metadata, unifiedMetadata } = parseMetadataRpc12(metadataRpc);
|
|
4489
5214
|
if (!hasStorageItems(unifiedMetadata, "ForeignAssets", ["Account", "Asset", "Metadata"]))
|
|
4490
5215
|
return null;
|
|
4491
5216
|
compactMetadata3(metadata, [{ pallet: "ForeignAssets", items: ["Account", "Asset", "Metadata"] }]);
|
|
@@ -4494,10 +5219,10 @@ var getData3 = (metadataRpc) => {
|
|
|
4494
5219
|
|
|
4495
5220
|
// src/modules/substrate-foreignassets/getTransferCallData.ts
|
|
4496
5221
|
import { mergeUint8 as mergeUint83 } from "@polkadot-api/utils";
|
|
4497
|
-
import { isTokenOfType as
|
|
4498
|
-
import { papiParse as papiParse2, parseMetadataRpc as
|
|
5222
|
+
import { isTokenOfType as isTokenOfType9 } from "@talismn/chaindata-provider";
|
|
5223
|
+
import { papiParse as papiParse2, parseMetadataRpc as parseMetadataRpc13 } from "@talismn/scale";
|
|
4499
5224
|
import { Binary as Binary3, Enum as Enum2 } from "polkadot-api";
|
|
4500
|
-
var
|
|
5225
|
+
var getTransferCallData9 = ({
|
|
4501
5226
|
from: from2,
|
|
4502
5227
|
to,
|
|
4503
5228
|
value,
|
|
@@ -4505,9 +5230,9 @@ var getTransferCallData8 = ({
|
|
|
4505
5230
|
type,
|
|
4506
5231
|
metadataRpc
|
|
4507
5232
|
}) => {
|
|
4508
|
-
if (!
|
|
4509
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
4510
|
-
const { builder } =
|
|
5233
|
+
if (!isTokenOfType9(token, MODULE_TYPE9))
|
|
5234
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE9}.`);
|
|
5235
|
+
const { builder } = parseMetadataRpc13(metadataRpc);
|
|
4511
5236
|
const method = getTransferMethod2(type);
|
|
4512
5237
|
const { codec, location } = builder.buildCall("ForeignAssets", method);
|
|
4513
5238
|
const args = getEncodedArgs2(method, token.onChainId, to, value, codec);
|
|
@@ -4585,14 +5310,14 @@ var getTransferAllEncodedArgs2 = (onChainId, to, codec) => {
|
|
|
4585
5310
|
};
|
|
4586
5311
|
|
|
4587
5312
|
// src/modules/substrate-foreignassets/subscribeBalances.ts
|
|
4588
|
-
import { map as map3, of as
|
|
4589
|
-
var
|
|
5313
|
+
import { map as map3, of as of10 } from "rxjs";
|
|
5314
|
+
var subscribeBalances9 = ({
|
|
4590
5315
|
networkId,
|
|
4591
5316
|
tokensWithAddresses,
|
|
4592
5317
|
connector,
|
|
4593
5318
|
miniMetadata
|
|
4594
5319
|
}) => {
|
|
4595
|
-
if (!tokensWithAddresses.length) return
|
|
5320
|
+
if (!tokensWithAddresses.length) return of10({ success: [], errors: [] });
|
|
4596
5321
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4597
5322
|
const queries = buildQueries2(networkId, balanceDefs, miniMetadata);
|
|
4598
5323
|
return getRpcQueryPack$(connector, networkId, queries).pipe(
|
|
@@ -4605,31 +5330,31 @@ var subscribeBalances8 = ({
|
|
|
4605
5330
|
|
|
4606
5331
|
// src/modules/substrate-foreignassets/module.ts
|
|
4607
5332
|
var SubForeignAssetsBalanceModule = {
|
|
4608
|
-
type:
|
|
4609
|
-
platform:
|
|
4610
|
-
getMiniMetadata:
|
|
4611
|
-
fetchTokens:
|
|
4612
|
-
fetchBalances:
|
|
4613
|
-
subscribeBalances:
|
|
4614
|
-
getTransferCallData:
|
|
5333
|
+
type: MODULE_TYPE9,
|
|
5334
|
+
platform: PLATFORM9,
|
|
5335
|
+
getMiniMetadata: getMiniMetadata9,
|
|
5336
|
+
fetchTokens: fetchTokens9,
|
|
5337
|
+
fetchBalances: fetchBalances9,
|
|
5338
|
+
subscribeBalances: subscribeBalances9,
|
|
5339
|
+
getTransferCallData: getTransferCallData9
|
|
4615
5340
|
};
|
|
4616
5341
|
|
|
4617
5342
|
// src/modules/substrate-foreignassets/types.ts
|
|
4618
5343
|
import { SubForeignAssetsTokenSchema as SubForeignAssetsTokenSchema3 } from "@talismn/chaindata-provider";
|
|
4619
|
-
import
|
|
4620
|
-
var SubForeignAssetsTokenConfigSchema =
|
|
5344
|
+
import z13 from "zod/v4";
|
|
5345
|
+
var SubForeignAssetsTokenConfigSchema = z13.strictObject({
|
|
4621
5346
|
onChainId: SubForeignAssetsTokenSchema3.shape.onChainId,
|
|
4622
5347
|
...TokenConfigBaseSchema.shape
|
|
4623
5348
|
});
|
|
4624
5349
|
|
|
4625
5350
|
// src/modules/substrate-hydration/config.ts
|
|
4626
5351
|
import { SubHydrationTokenSchema } from "@talismn/chaindata-provider";
|
|
4627
|
-
var
|
|
4628
|
-
var
|
|
5352
|
+
var MODULE_TYPE10 = SubHydrationTokenSchema.shape.type.value;
|
|
5353
|
+
var PLATFORM10 = SubHydrationTokenSchema.shape.platform.value;
|
|
4629
5354
|
|
|
4630
5355
|
// src/modules/substrate-hydration/fetchBalances.ts
|
|
4631
|
-
import { keyBy as
|
|
4632
|
-
var
|
|
5356
|
+
import { keyBy as keyBy7, uniq as uniq5 } from "lodash-es";
|
|
5357
|
+
var fetchBalances10 = async ({
|
|
4633
5358
|
networkId,
|
|
4634
5359
|
tokensWithAddresses,
|
|
4635
5360
|
connector,
|
|
@@ -4638,7 +5363,7 @@ var fetchBalances9 = async ({
|
|
|
4638
5363
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
4639
5364
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4640
5365
|
if (!miniMetadata?.data) {
|
|
4641
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
5366
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE10} balances on ${networkId}.`, {
|
|
4642
5367
|
tokensWithAddresses
|
|
4643
5368
|
});
|
|
4644
5369
|
return {
|
|
@@ -4650,20 +5375,20 @@ var fetchBalances9 = async ({
|
|
|
4650
5375
|
}))
|
|
4651
5376
|
};
|
|
4652
5377
|
}
|
|
4653
|
-
if (miniMetadata.source !==
|
|
4654
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
5378
|
+
if (miniMetadata.source !== MODULE_TYPE10) {
|
|
5379
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE10}.`);
|
|
4655
5380
|
return {
|
|
4656
5381
|
success: [],
|
|
4657
5382
|
errors: balanceDefs.map((def) => ({
|
|
4658
5383
|
tokenId: def.token.id,
|
|
4659
5384
|
address: def.address,
|
|
4660
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
5385
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE10}`)
|
|
4661
5386
|
}))
|
|
4662
5387
|
};
|
|
4663
5388
|
}
|
|
4664
5389
|
if (miniMetadata.chainId !== networkId) {
|
|
4665
5390
|
log_default.warn(
|
|
4666
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
5391
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE10}. Expected chainId is ${networkId}`
|
|
4667
5392
|
);
|
|
4668
5393
|
return {
|
|
4669
5394
|
success: [],
|
|
@@ -4674,7 +5399,7 @@ var fetchBalances9 = async ({
|
|
|
4674
5399
|
}))
|
|
4675
5400
|
};
|
|
4676
5401
|
}
|
|
4677
|
-
const addresses =
|
|
5402
|
+
const addresses = uniq5(balanceDefs.map((def) => def.address));
|
|
4678
5403
|
try {
|
|
4679
5404
|
const res = await Promise.all(
|
|
4680
5405
|
addresses.map(
|
|
@@ -4690,16 +5415,16 @@ var fetchBalances9 = async ({
|
|
|
4690
5415
|
frozen: balance.frozen.toString()
|
|
4691
5416
|
})).filter((b) => b.onChainId !== void 0);
|
|
4692
5417
|
});
|
|
4693
|
-
const balancesByKey =
|
|
5418
|
+
const balancesByKey = keyBy7(fetchedBalances, (b) => `${b.address}:${b.onChainId}`);
|
|
4694
5419
|
const success = tokensWithAddresses.reduce((acc, [token, addresses2]) => {
|
|
4695
|
-
if (token.type ===
|
|
5420
|
+
if (token.type === MODULE_TYPE10)
|
|
4696
5421
|
for (const address of addresses2) {
|
|
4697
5422
|
const rawBalance = balancesByKey[`${address}:${token.onChainId}`];
|
|
4698
5423
|
const balance = {
|
|
4699
5424
|
address,
|
|
4700
5425
|
networkId,
|
|
4701
5426
|
tokenId: token.id,
|
|
4702
|
-
source:
|
|
5427
|
+
source: MODULE_TYPE10,
|
|
4703
5428
|
status: "live",
|
|
4704
5429
|
values: [
|
|
4705
5430
|
{
|
|
@@ -4746,9 +5471,9 @@ import {
|
|
|
4746
5471
|
SubHydrationTokenSchema as SubHydrationTokenSchema2,
|
|
4747
5472
|
subHydrationTokenId
|
|
4748
5473
|
} from "@talismn/chaindata-provider";
|
|
4749
|
-
import { getStorageKeyPrefix as getStorageKeyPrefix4, parseMetadataRpc as
|
|
4750
|
-
import { assign as
|
|
4751
|
-
var
|
|
5474
|
+
import { getStorageKeyPrefix as getStorageKeyPrefix4, parseMetadataRpc as parseMetadataRpc14 } from "@talismn/scale";
|
|
5475
|
+
import { assign as assign9, keyBy as keyBy8 } from "lodash-es";
|
|
5476
|
+
var fetchTokens10 = async ({
|
|
4752
5477
|
networkId,
|
|
4753
5478
|
tokens,
|
|
4754
5479
|
connector,
|
|
@@ -4756,7 +5481,7 @@ var fetchTokens9 = async ({
|
|
|
4756
5481
|
}) => {
|
|
4757
5482
|
const anyMiniMetadata = miniMetadata;
|
|
4758
5483
|
if (!anyMiniMetadata?.data) return [];
|
|
4759
|
-
const { builder } =
|
|
5484
|
+
const { builder } = parseMetadataRpc14(anyMiniMetadata.data);
|
|
4760
5485
|
const assetsCodec = builder.buildStorage("AssetRegistry", "Assets");
|
|
4761
5486
|
const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [
|
|
4762
5487
|
getStorageKeyPrefix4("AssetRegistry", "Assets")
|
|
@@ -4767,7 +5492,7 @@ var fetchTokens9 = async ({
|
|
|
4767
5492
|
[allAssetStorageKeys]
|
|
4768
5493
|
);
|
|
4769
5494
|
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
|
4770
|
-
const configTokenByAssetId =
|
|
5495
|
+
const configTokenByAssetId = keyBy8(tokens, (t) => t.onChainId);
|
|
4771
5496
|
return assetStorageEntries.map(([key, value]) => {
|
|
4772
5497
|
const [onChainId] = assetsCodec.keys.dec(key);
|
|
4773
5498
|
const asset = assetsCodec.value.dec(value);
|
|
@@ -4783,7 +5508,7 @@ var fetchTokens9 = async ({
|
|
|
4783
5508
|
}).map(
|
|
4784
5509
|
(asset) => ({
|
|
4785
5510
|
id: subHydrationTokenId(networkId, asset.onChainId),
|
|
4786
|
-
type:
|
|
5511
|
+
type: MODULE_TYPE10,
|
|
4787
5512
|
platform: "polkadot",
|
|
4788
5513
|
networkId,
|
|
4789
5514
|
onChainId: asset.onChainId,
|
|
@@ -4801,7 +5526,7 @@ var fetchTokens9 = async ({
|
|
|
4801
5526
|
return configToken || token.isSufficient;
|
|
4802
5527
|
}).map((token) => {
|
|
4803
5528
|
const configToken = configTokenByAssetId[token.onChainId];
|
|
4804
|
-
return configToken ?
|
|
5529
|
+
return configToken ? assign9({}, token, configToken) : token;
|
|
4805
5530
|
}).filter((t) => {
|
|
4806
5531
|
const parsed = SubHydrationTokenSchema2.safeParse(t);
|
|
4807
5532
|
return parsed.success;
|
|
@@ -4810,13 +5535,13 @@ var fetchTokens9 = async ({
|
|
|
4810
5535
|
|
|
4811
5536
|
// src/modules/substrate-hydration/getMiniMetadata.ts
|
|
4812
5537
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION5 } from "@talismn/chaindata-provider";
|
|
4813
|
-
import { compactMetadata as compactMetadata4, encodeMetadata as encodeMetadata4, parseMetadataRpc as
|
|
4814
|
-
var
|
|
5538
|
+
import { compactMetadata as compactMetadata4, encodeMetadata as encodeMetadata4, parseMetadataRpc as parseMetadataRpc15 } from "@talismn/scale";
|
|
5539
|
+
var getMiniMetadata10 = ({
|
|
4815
5540
|
networkId,
|
|
4816
5541
|
specVersion,
|
|
4817
5542
|
metadataRpc
|
|
4818
5543
|
}) => {
|
|
4819
|
-
const source =
|
|
5544
|
+
const source = MODULE_TYPE10;
|
|
4820
5545
|
const chainId = networkId;
|
|
4821
5546
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
4822
5547
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -4824,7 +5549,7 @@ var getMiniMetadata9 = ({
|
|
|
4824
5549
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
4825
5550
|
);
|
|
4826
5551
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
4827
|
-
const { unifiedMetadata } =
|
|
5552
|
+
const { unifiedMetadata } = parseMetadataRpc15(metadataRpc);
|
|
4828
5553
|
if (unifiedMetadata.version < 14)
|
|
4829
5554
|
throw new Error(
|
|
4830
5555
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -4840,7 +5565,7 @@ var getMiniMetadata9 = ({
|
|
|
4840
5565
|
};
|
|
4841
5566
|
};
|
|
4842
5567
|
var getData4 = (metadataRpc) => {
|
|
4843
|
-
const { metadata, unifiedMetadata } =
|
|
5568
|
+
const { metadata, unifiedMetadata } = parseMetadataRpc15(metadataRpc);
|
|
4844
5569
|
if (!hasStorageItem(unifiedMetadata, "AssetRegistry", "Assets") || !hasStorageItem(unifiedMetadata, "Tokens", "Accounts") || !hasRuntimeApi(unifiedMetadata, "CurrenciesApi", "accounts"))
|
|
4845
5570
|
return null;
|
|
4846
5571
|
compactMetadata4(
|
|
@@ -4863,19 +5588,19 @@ var getData4 = (metadataRpc) => {
|
|
|
4863
5588
|
|
|
4864
5589
|
// src/modules/substrate-hydration/getTransferCallData.ts
|
|
4865
5590
|
import { mergeUint8 as mergeUint84 } from "@polkadot-api/utils";
|
|
4866
|
-
import { isTokenOfType as
|
|
4867
|
-
import { parseMetadataRpc as
|
|
5591
|
+
import { isTokenOfType as isTokenOfType10 } from "@talismn/chaindata-provider";
|
|
5592
|
+
import { parseMetadataRpc as parseMetadataRpc16 } from "@talismn/scale";
|
|
4868
5593
|
import { Binary as Binary4 } from "polkadot-api";
|
|
4869
|
-
var
|
|
5594
|
+
var getTransferCallData10 = ({
|
|
4870
5595
|
from: from2,
|
|
4871
5596
|
to,
|
|
4872
5597
|
value,
|
|
4873
5598
|
token,
|
|
4874
5599
|
metadataRpc
|
|
4875
5600
|
}) => {
|
|
4876
|
-
if (!
|
|
4877
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
4878
|
-
const { builder } =
|
|
5601
|
+
if (!isTokenOfType10(token, MODULE_TYPE10))
|
|
5602
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE10}.`);
|
|
5603
|
+
const { builder } = parseMetadataRpc16(metadataRpc);
|
|
4879
5604
|
const { codec, location } = builder.buildCall("Currencies", "transfer");
|
|
4880
5605
|
const args = {
|
|
4881
5606
|
dest: to,
|
|
@@ -4890,22 +5615,22 @@ var getTransferCallData9 = ({
|
|
|
4890
5615
|
};
|
|
4891
5616
|
|
|
4892
5617
|
// src/modules/substrate-hydration/subscribeBalances.ts
|
|
4893
|
-
import { isEqual as
|
|
4894
|
-
import { distinctUntilChanged as
|
|
4895
|
-
var
|
|
4896
|
-
var
|
|
5618
|
+
import { isEqual as isEqual9 } from "lodash-es";
|
|
5619
|
+
import { distinctUntilChanged as distinctUntilChanged9, Observable as Observable9, of as of11 } from "rxjs";
|
|
5620
|
+
var SUBSCRIPTION_INTERVAL8 = 6e3;
|
|
5621
|
+
var subscribeBalances10 = ({
|
|
4897
5622
|
networkId,
|
|
4898
5623
|
tokensWithAddresses,
|
|
4899
5624
|
connector,
|
|
4900
5625
|
miniMetadata
|
|
4901
5626
|
}) => {
|
|
4902
|
-
if (!tokensWithAddresses.length) return
|
|
4903
|
-
return new
|
|
5627
|
+
if (!tokensWithAddresses.length) return of11({ success: [], errors: [] });
|
|
5628
|
+
return new Observable9((subscriber) => {
|
|
4904
5629
|
const abortController = new AbortController();
|
|
4905
5630
|
const poll = async () => {
|
|
4906
5631
|
try {
|
|
4907
5632
|
if (abortController.signal.aborted) return;
|
|
4908
|
-
const balances = await
|
|
5633
|
+
const balances = await fetchBalances10({
|
|
4909
5634
|
networkId,
|
|
4910
5635
|
tokensWithAddresses,
|
|
4911
5636
|
connector,
|
|
@@ -4913,10 +5638,10 @@ var subscribeBalances9 = ({
|
|
|
4913
5638
|
});
|
|
4914
5639
|
if (abortController.signal.aborted) return;
|
|
4915
5640
|
subscriber.next(balances);
|
|
4916
|
-
setTimeout(poll,
|
|
5641
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL8);
|
|
4917
5642
|
} catch (error) {
|
|
4918
5643
|
log_default.error("Error", {
|
|
4919
|
-
module:
|
|
5644
|
+
module: MODULE_TYPE10,
|
|
4920
5645
|
networkId,
|
|
4921
5646
|
miniMetadata,
|
|
4922
5647
|
addressesByToken: tokensWithAddresses,
|
|
@@ -4929,36 +5654,36 @@ var subscribeBalances9 = ({
|
|
|
4929
5654
|
return () => {
|
|
4930
5655
|
abortController.abort();
|
|
4931
5656
|
};
|
|
4932
|
-
}).pipe(
|
|
5657
|
+
}).pipe(distinctUntilChanged9(isEqual9));
|
|
4933
5658
|
};
|
|
4934
5659
|
|
|
4935
5660
|
// src/modules/substrate-hydration/module.ts
|
|
4936
5661
|
var SubHydrationBalanceModule = {
|
|
4937
|
-
type:
|
|
4938
|
-
platform:
|
|
4939
|
-
getMiniMetadata:
|
|
4940
|
-
fetchTokens:
|
|
4941
|
-
fetchBalances:
|
|
4942
|
-
subscribeBalances:
|
|
4943
|
-
getTransferCallData:
|
|
5662
|
+
type: MODULE_TYPE10,
|
|
5663
|
+
platform: PLATFORM10,
|
|
5664
|
+
getMiniMetadata: getMiniMetadata10,
|
|
5665
|
+
fetchTokens: fetchTokens10,
|
|
5666
|
+
fetchBalances: fetchBalances10,
|
|
5667
|
+
subscribeBalances: subscribeBalances10,
|
|
5668
|
+
getTransferCallData: getTransferCallData10
|
|
4944
5669
|
};
|
|
4945
5670
|
|
|
4946
5671
|
// src/modules/substrate-hydration/types.ts
|
|
4947
5672
|
import { SubHydrationTokenSchema as SubHydrationTokenSchema3 } from "@talismn/chaindata-provider";
|
|
4948
|
-
import
|
|
4949
|
-
var SubHydrationTokenConfigSchema =
|
|
5673
|
+
import z14 from "zod/v4";
|
|
5674
|
+
var SubHydrationTokenConfigSchema = z14.strictObject({
|
|
4950
5675
|
onChainId: SubHydrationTokenSchema3.shape.onChainId,
|
|
4951
5676
|
...TokenConfigBaseSchema.shape
|
|
4952
5677
|
});
|
|
4953
5678
|
|
|
4954
5679
|
// src/modules/substrate-native/config.ts
|
|
4955
5680
|
import { SubNativeTokenSchema } from "@talismn/chaindata-provider";
|
|
4956
|
-
var
|
|
4957
|
-
var
|
|
5681
|
+
var MODULE_TYPE11 = SubNativeTokenSchema.shape.type.value;
|
|
5682
|
+
var PLATFORM11 = SubNativeTokenSchema.shape.platform.value;
|
|
4958
5683
|
|
|
4959
5684
|
// src/modules/substrate-native/queries/buildBaseQueries.ts
|
|
4960
|
-
import { decodeScale as
|
|
4961
|
-
import { isNotNil as
|
|
5685
|
+
import { decodeScale as decodeScale5 } from "@talismn/scale";
|
|
5686
|
+
import { isNotNil as isNotNil8 } from "@talismn/util";
|
|
4962
5687
|
|
|
4963
5688
|
// src/modules/substrate-native/util/lockTypes.ts
|
|
4964
5689
|
import upperFirst from "lodash-es/upperFirst";
|
|
@@ -5119,10 +5844,10 @@ var buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
|
|
|
5119
5844
|
return { balance, nomPoolMemberInfo };
|
|
5120
5845
|
}
|
|
5121
5846
|
};
|
|
5122
|
-
}).filter(
|
|
5847
|
+
}).filter(isNotNil8);
|
|
5123
5848
|
};
|
|
5124
5849
|
var decodeBaseResult = (coder, value, networkId) => {
|
|
5125
|
-
const decoded =
|
|
5850
|
+
const decoded = decodeScale5(
|
|
5126
5851
|
coder,
|
|
5127
5852
|
value,
|
|
5128
5853
|
`Failed to decode base native balance on chain ${networkId}`
|
|
@@ -5142,7 +5867,7 @@ var decodeBaseResult = (coder, value, networkId) => {
|
|
|
5142
5867
|
return newValues;
|
|
5143
5868
|
};
|
|
5144
5869
|
var decodeLocksResult = (coder, value, networkId) => {
|
|
5145
|
-
const decoded =
|
|
5870
|
+
const decoded = decodeScale5(
|
|
5146
5871
|
coder,
|
|
5147
5872
|
value,
|
|
5148
5873
|
`Failed to decode lock on chain ${networkId}`
|
|
@@ -5157,7 +5882,7 @@ var decodeLocksResult = (coder, value, networkId) => {
|
|
|
5157
5882
|
return locksQueryLocks;
|
|
5158
5883
|
};
|
|
5159
5884
|
var decodeFreezesResult = (coder, value, networkId) => {
|
|
5160
|
-
const decoded =
|
|
5885
|
+
const decoded = decodeScale5(
|
|
5161
5886
|
coder,
|
|
5162
5887
|
value,
|
|
5163
5888
|
`Failed to decode freeze on chain ${networkId}`
|
|
@@ -5171,7 +5896,7 @@ var decodeFreezesResult = (coder, value, networkId) => {
|
|
|
5171
5896
|
return freezesValues;
|
|
5172
5897
|
};
|
|
5173
5898
|
var decodeHoldsResult = (coder, value, networkId) => {
|
|
5174
|
-
const decoded =
|
|
5899
|
+
const decoded = decodeScale5(
|
|
5175
5900
|
coder,
|
|
5176
5901
|
value,
|
|
5177
5902
|
`Failed to decode holds on chain ${networkId}`
|
|
@@ -5187,7 +5912,7 @@ var decodeHoldsResult = (coder, value, networkId) => {
|
|
|
5187
5912
|
return holdsValues;
|
|
5188
5913
|
};
|
|
5189
5914
|
var decodeStakingLedgerResult = (coder, value, networkId) => {
|
|
5190
|
-
const decoded =
|
|
5915
|
+
const decoded = decodeScale5(
|
|
5191
5916
|
coder,
|
|
5192
5917
|
value,
|
|
5193
5918
|
`Failed to decode unbonding query on chain ${networkId}`
|
|
@@ -5204,7 +5929,7 @@ var decodeStakingLedgerResult = (coder, value, networkId) => {
|
|
|
5204
5929
|
return stakingLedgerResults;
|
|
5205
5930
|
};
|
|
5206
5931
|
var decodePoolMemberResult = (coder, value, networkId) => {
|
|
5207
|
-
const decoded =
|
|
5932
|
+
const decoded = decodeScale5(
|
|
5208
5933
|
coder,
|
|
5209
5934
|
value,
|
|
5210
5935
|
`Failed to decode poolMembers on chain ${networkId}`
|
|
@@ -5226,7 +5951,7 @@ var decodePoolMemberResult = (coder, value, networkId) => {
|
|
|
5226
5951
|
};
|
|
5227
5952
|
|
|
5228
5953
|
// src/modules/substrate-native/queries/buildNomPoolQueries.ts
|
|
5229
|
-
import { decodeScale as
|
|
5954
|
+
import { decodeScale as decodeScale6 } from "@talismn/scale";
|
|
5230
5955
|
|
|
5231
5956
|
// src/modules/substrate-native/util/nompoolAccountId.ts
|
|
5232
5957
|
import { mergeUint8 as mergeUint85 } from "@polkadot-api/utils";
|
|
@@ -5319,7 +6044,7 @@ var getNomPoolCoders = (networkId, miniMetadata) => {
|
|
|
5319
6044
|
});
|
|
5320
6045
|
};
|
|
5321
6046
|
var decodePoolPoints = (coder, value, networkId) => {
|
|
5322
|
-
const decoded =
|
|
6047
|
+
const decoded = decodeScale6(
|
|
5323
6048
|
coder,
|
|
5324
6049
|
value,
|
|
5325
6050
|
`Failed to decode bondedPools on chain ${networkId}`
|
|
@@ -5327,7 +6052,7 @@ var decodePoolPoints = (coder, value, networkId) => {
|
|
|
5327
6052
|
return { poolPoints: decoded?.points.toString() };
|
|
5328
6053
|
};
|
|
5329
6054
|
var decodePoolStake = (coder, value, networkId) => {
|
|
5330
|
-
const decoded =
|
|
6055
|
+
const decoded = decodeScale6(
|
|
5331
6056
|
coder,
|
|
5332
6057
|
value,
|
|
5333
6058
|
`Failed to decode ledger on chain ${networkId}`
|
|
@@ -5335,7 +6060,7 @@ var decodePoolStake = (coder, value, networkId) => {
|
|
|
5335
6060
|
return { poolTotalActiveStake: decoded?.active.toString() };
|
|
5336
6061
|
};
|
|
5337
6062
|
var decodePoolMeta = (coder, value, networkId) => {
|
|
5338
|
-
const decoded =
|
|
6063
|
+
const decoded = decodeScale6(
|
|
5339
6064
|
coder,
|
|
5340
6065
|
value,
|
|
5341
6066
|
`Failed to decode metadata on chain ${networkId}`
|
|
@@ -5359,11 +6084,11 @@ var getNomPoolStateKeys = (coders, nomPoolMemberInfo, extra) => {
|
|
|
5359
6084
|
};
|
|
5360
6085
|
|
|
5361
6086
|
// src/modules/substrate-native/fetchBalances.ts
|
|
5362
|
-
var
|
|
6087
|
+
var fetchBalances11 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
5363
6088
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
5364
6089
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
5365
6090
|
if (!miniMetadata?.data) {
|
|
5366
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
6091
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE11} balances on ${networkId}.`);
|
|
5367
6092
|
return {
|
|
5368
6093
|
success: [],
|
|
5369
6094
|
errors: balanceDefs.map((def) => ({
|
|
@@ -5373,20 +6098,20 @@ var fetchBalances10 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
5373
6098
|
}))
|
|
5374
6099
|
};
|
|
5375
6100
|
}
|
|
5376
|
-
if (miniMetadata.source !==
|
|
5377
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
6101
|
+
if (miniMetadata.source !== MODULE_TYPE11) {
|
|
6102
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE11}.`);
|
|
5378
6103
|
return {
|
|
5379
6104
|
success: [],
|
|
5380
6105
|
errors: balanceDefs.map((def) => ({
|
|
5381
6106
|
tokenId: def.token.id,
|
|
5382
6107
|
address: def.address,
|
|
5383
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
6108
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE11}`)
|
|
5384
6109
|
}))
|
|
5385
6110
|
};
|
|
5386
6111
|
}
|
|
5387
6112
|
if (miniMetadata.chainId !== networkId) {
|
|
5388
6113
|
log_default.warn(
|
|
5389
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
6114
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE11}. Expected chainId is ${networkId}`
|
|
5390
6115
|
);
|
|
5391
6116
|
return {
|
|
5392
6117
|
success: [],
|
|
@@ -5409,9 +6134,9 @@ import {
|
|
|
5409
6134
|
SubNativeTokenSchema as SubNativeTokenSchema2,
|
|
5410
6135
|
subNativeTokenId as subNativeTokenId2
|
|
5411
6136
|
} from "@talismn/chaindata-provider";
|
|
5412
|
-
import { assign as
|
|
5413
|
-
import
|
|
5414
|
-
var
|
|
6137
|
+
import { assign as assign10 } from "lodash-es";
|
|
6138
|
+
import z15 from "zod/v4";
|
|
6139
|
+
var fetchTokens11 = async ({ networkId, tokens, connector, miniMetadata }) => {
|
|
5415
6140
|
if (miniMetadata.extra.disable) return [];
|
|
5416
6141
|
const { tokenSymbol: symbol, tokenDecimals: decimals } = await getChainProperties(
|
|
5417
6142
|
connector,
|
|
@@ -5431,22 +6156,22 @@ var fetchTokens10 = async ({ networkId, tokens, connector, miniMetadata }) => {
|
|
|
5431
6156
|
decimals,
|
|
5432
6157
|
existentialDeposit: miniMetadata.extra.existentialDeposit ?? "0"
|
|
5433
6158
|
};
|
|
5434
|
-
const token =
|
|
6159
|
+
const token = assign10(nativeToken, tokenConfig);
|
|
5435
6160
|
const parsed = SubNativeTokenSchema2.safeParse(token);
|
|
5436
6161
|
if (!parsed.success) {
|
|
5437
6162
|
return [];
|
|
5438
6163
|
}
|
|
5439
6164
|
return [parsed.data];
|
|
5440
6165
|
};
|
|
5441
|
-
var DotNetworkPropertiesSimple =
|
|
5442
|
-
tokenDecimals:
|
|
5443
|
-
tokenSymbol:
|
|
6166
|
+
var DotNetworkPropertiesSimple = z15.object({
|
|
6167
|
+
tokenDecimals: z15.number().optional().default(0),
|
|
6168
|
+
tokenSymbol: z15.string().optional().default("Unit")
|
|
5444
6169
|
});
|
|
5445
|
-
var DotNetworkPropertiesArray =
|
|
5446
|
-
tokenDecimals:
|
|
5447
|
-
tokenSymbol:
|
|
6170
|
+
var DotNetworkPropertiesArray = z15.object({
|
|
6171
|
+
tokenDecimals: z15.array(z15.number()).nonempty(),
|
|
6172
|
+
tokenSymbol: z15.array(z15.string()).nonempty()
|
|
5448
6173
|
});
|
|
5449
|
-
var DotNetworkPropertiesSchema =
|
|
6174
|
+
var DotNetworkPropertiesSchema = z15.union([DotNetworkPropertiesSimple, DotNetworkPropertiesArray]).transform((val) => ({
|
|
5450
6175
|
tokenDecimals: Array.isArray(val.tokenDecimals) ? val.tokenDecimals[0] : val.tokenDecimals,
|
|
5451
6176
|
tokenSymbol: Array.isArray(val.tokenSymbol) ? val.tokenSymbol[0] : val.tokenSymbol
|
|
5452
6177
|
}));
|
|
@@ -5457,9 +6182,9 @@ var getChainProperties = async (connector, networkId) => {
|
|
|
5457
6182
|
|
|
5458
6183
|
// src/modules/substrate-native/getMiniMetadata.ts
|
|
5459
6184
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION6 } from "@talismn/chaindata-provider";
|
|
5460
|
-
import { compactMetadata as compactMetadata5, encodeMetadata as encodeMetadata5, parseMetadataRpc as
|
|
5461
|
-
var
|
|
5462
|
-
const source =
|
|
6185
|
+
import { compactMetadata as compactMetadata5, encodeMetadata as encodeMetadata5, parseMetadataRpc as parseMetadataRpc17 } from "@talismn/scale";
|
|
6186
|
+
var getMiniMetadata11 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
6187
|
+
const source = MODULE_TYPE11;
|
|
5463
6188
|
const chainId = networkId;
|
|
5464
6189
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
5465
6190
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -5467,7 +6192,7 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
5467
6192
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
5468
6193
|
);
|
|
5469
6194
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
5470
|
-
const { metadata, unifiedMetadata } =
|
|
6195
|
+
const { metadata, unifiedMetadata } = parseMetadataRpc17(metadataRpc);
|
|
5471
6196
|
if (unifiedMetadata.version < 14)
|
|
5472
6197
|
throw new Error(
|
|
5473
6198
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -5519,12 +6244,12 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
5519
6244
|
|
|
5520
6245
|
// src/modules/substrate-native/getTransferCallData.ts
|
|
5521
6246
|
import { mergeUint8 as mergeUint86 } from "@polkadot-api/utils";
|
|
5522
|
-
import { isTokenOfType as
|
|
6247
|
+
import { isTokenOfType as isTokenOfType11 } from "@talismn/chaindata-provider";
|
|
5523
6248
|
import {
|
|
5524
|
-
parseMetadataRpc as
|
|
6249
|
+
parseMetadataRpc as parseMetadataRpc18
|
|
5525
6250
|
} from "@talismn/scale";
|
|
5526
6251
|
import { Binary as Binary5, Enum as Enum3 } from "polkadot-api";
|
|
5527
|
-
var
|
|
6252
|
+
var getTransferCallData11 = ({
|
|
5528
6253
|
from: from2,
|
|
5529
6254
|
to,
|
|
5530
6255
|
value,
|
|
@@ -5532,9 +6257,9 @@ var getTransferCallData10 = ({
|
|
|
5532
6257
|
type,
|
|
5533
6258
|
metadataRpc
|
|
5534
6259
|
}) => {
|
|
5535
|
-
if (!
|
|
5536
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
5537
|
-
const { unifiedMetadata, lookupFn, builder } =
|
|
6260
|
+
if (!isTokenOfType11(token, MODULE_TYPE11))
|
|
6261
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE11}.`);
|
|
6262
|
+
const { unifiedMetadata, lookupFn, builder } = parseMetadataRpc18(metadataRpc);
|
|
5538
6263
|
const method = getTransferMethod3(type, unifiedMetadata, lookupFn);
|
|
5539
6264
|
const { codec, location } = builder.buildCall("Balances", method);
|
|
5540
6265
|
const args = getEncodedArgs3(method, to, value, codec);
|
|
@@ -5611,9 +6336,9 @@ var getTransferAllEncodedArgs3 = (to, codec) => {
|
|
|
5611
6336
|
};
|
|
5612
6337
|
|
|
5613
6338
|
// src/modules/substrate-native/subscribeBalances.ts
|
|
5614
|
-
import { map as map4, of as
|
|
5615
|
-
var
|
|
5616
|
-
if (!tokensWithAddresses.length) return
|
|
6339
|
+
import { map as map4, of as of12, switchMap } from "rxjs";
|
|
6340
|
+
var subscribeBalances11 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
6341
|
+
if (!tokensWithAddresses.length) return of12({ success: [], errors: [] });
|
|
5617
6342
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
5618
6343
|
const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata);
|
|
5619
6344
|
return getRpcQueryPack$(connector, networkId, baseQueries).pipe(
|
|
@@ -5630,34 +6355,34 @@ var subscribeBalances10 = ({ networkId, tokensWithAddresses, connector, miniMeta
|
|
|
5630
6355
|
|
|
5631
6356
|
// src/modules/substrate-native/module.ts
|
|
5632
6357
|
var SubNativeBalanceModule = {
|
|
5633
|
-
type:
|
|
5634
|
-
platform:
|
|
5635
|
-
getMiniMetadata:
|
|
5636
|
-
fetchTokens:
|
|
5637
|
-
fetchBalances:
|
|
5638
|
-
subscribeBalances:
|
|
5639
|
-
getTransferCallData:
|
|
6358
|
+
type: MODULE_TYPE11,
|
|
6359
|
+
platform: PLATFORM11,
|
|
6360
|
+
getMiniMetadata: getMiniMetadata11,
|
|
6361
|
+
fetchTokens: fetchTokens11,
|
|
6362
|
+
fetchBalances: fetchBalances11,
|
|
6363
|
+
subscribeBalances: subscribeBalances11,
|
|
6364
|
+
getTransferCallData: getTransferCallData11
|
|
5640
6365
|
};
|
|
5641
6366
|
|
|
5642
6367
|
// src/modules/substrate-native/types.ts
|
|
5643
|
-
import
|
|
5644
|
-
var SubNativeTokenConfigSchema =
|
|
6368
|
+
import z16 from "zod/v4";
|
|
6369
|
+
var SubNativeTokenConfigSchema = z16.strictObject({
|
|
5645
6370
|
...TokenConfigBaseSchema.shape
|
|
5646
6371
|
});
|
|
5647
|
-
var SubNativeModuleConfigSchema =
|
|
5648
|
-
disable:
|
|
6372
|
+
var SubNativeModuleConfigSchema = z16.strictObject({
|
|
6373
|
+
disable: z16.boolean().optional()
|
|
5649
6374
|
});
|
|
5650
|
-
var SubNativeMiniMetadataExtraSchema =
|
|
5651
|
-
disable:
|
|
5652
|
-
useLegacyTransferableCalculation:
|
|
5653
|
-
existentialDeposit:
|
|
5654
|
-
nominationPoolsPalletId:
|
|
6375
|
+
var SubNativeMiniMetadataExtraSchema = z16.strictObject({
|
|
6376
|
+
disable: z16.boolean().optional(),
|
|
6377
|
+
useLegacyTransferableCalculation: z16.boolean().optional(),
|
|
6378
|
+
existentialDeposit: z16.string().optional(),
|
|
6379
|
+
nominationPoolsPalletId: z16.string().optional()
|
|
5655
6380
|
});
|
|
5656
6381
|
|
|
5657
6382
|
// src/modules/substrate-psp22/config.ts
|
|
5658
6383
|
import { SubPsp22TokenSchema } from "@talismn/chaindata-provider";
|
|
5659
|
-
var
|
|
5660
|
-
var
|
|
6384
|
+
var MODULE_TYPE12 = SubPsp22TokenSchema.shape.type.value;
|
|
6385
|
+
var PLATFORM12 = SubPsp22TokenSchema.shape.platform.value;
|
|
5661
6386
|
|
|
5662
6387
|
// src/modules/substrate-psp22/fetchBalances.ts
|
|
5663
6388
|
import { Abi } from "@polkadot/api-contract";
|
|
@@ -6661,7 +7386,17 @@ var psp22_default = {
|
|
|
6661
7386
|
};
|
|
6662
7387
|
|
|
6663
7388
|
// src/modules/substrate-psp22/util.ts
|
|
6664
|
-
|
|
7389
|
+
var u8aToHex = (value) => `0x${Array.from(value, (b) => b.toString(16).padStart(2, "0")).join("")}`;
|
|
7390
|
+
var u8aConcatStrict = (arrays) => {
|
|
7391
|
+
const length = arrays.reduce((total, arr) => total + arr.length, 0);
|
|
7392
|
+
const result = new Uint8Array(length);
|
|
7393
|
+
let offset = 0;
|
|
7394
|
+
for (const arr of arrays) {
|
|
7395
|
+
result.set(arr, offset);
|
|
7396
|
+
offset += arr.length;
|
|
7397
|
+
}
|
|
7398
|
+
return result;
|
|
7399
|
+
};
|
|
6665
7400
|
var makeContractCaller = ({
|
|
6666
7401
|
chainConnector,
|
|
6667
7402
|
chainId,
|
|
@@ -6690,7 +7425,7 @@ var makeContractCaller = ({
|
|
|
6690
7425
|
);
|
|
6691
7426
|
|
|
6692
7427
|
// src/modules/substrate-psp22/fetchBalances.ts
|
|
6693
|
-
var
|
|
7428
|
+
var fetchBalances12 = async ({
|
|
6694
7429
|
networkId,
|
|
6695
7430
|
tokensWithAddresses,
|
|
6696
7431
|
connector
|
|
@@ -6745,13 +7480,14 @@ var fetchBalances11 = async ({
|
|
|
6745
7480
|
// src/modules/substrate-psp22/fetchTokens.ts
|
|
6746
7481
|
import { Abi as Abi2 } from "@polkadot/api-contract";
|
|
6747
7482
|
import { TypeRegistry as TypeRegistry2 } from "@polkadot/types";
|
|
6748
|
-
import { hexToNumber, u8aToString } from "@polkadot/util";
|
|
6749
7483
|
import {
|
|
6750
7484
|
SubPsp22TokenSchema as SubPsp22TokenSchema2,
|
|
6751
7485
|
subPsp22TokenId
|
|
6752
7486
|
} from "@talismn/chaindata-provider";
|
|
6753
7487
|
import { values } from "lodash-es";
|
|
6754
|
-
var
|
|
7488
|
+
var hexToNumber = (hex) => Number(hex);
|
|
7489
|
+
var u8aToString = (value) => new TextDecoder().decode(value);
|
|
7490
|
+
var fetchTokens12 = async ({
|
|
6755
7491
|
networkId,
|
|
6756
7492
|
tokens,
|
|
6757
7493
|
connector
|
|
@@ -6826,13 +7562,13 @@ var fetchTokens11 = async ({
|
|
|
6826
7562
|
|
|
6827
7563
|
// src/modules/substrate-psp22/getMiniMetadata.ts
|
|
6828
7564
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION7 } from "@talismn/chaindata-provider";
|
|
6829
|
-
import { parseMetadataRpc as
|
|
6830
|
-
var
|
|
7565
|
+
import { parseMetadataRpc as parseMetadataRpc19 } from "@talismn/scale";
|
|
7566
|
+
var getMiniMetadata12 = ({
|
|
6831
7567
|
networkId,
|
|
6832
7568
|
specVersion,
|
|
6833
7569
|
metadataRpc
|
|
6834
7570
|
}) => {
|
|
6835
|
-
const source =
|
|
7571
|
+
const source = MODULE_TYPE12;
|
|
6836
7572
|
const chainId = networkId;
|
|
6837
7573
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
6838
7574
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -6840,7 +7576,7 @@ var getMiniMetadata11 = ({
|
|
|
6840
7576
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
6841
7577
|
);
|
|
6842
7578
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
6843
|
-
const { unifiedMetadata } =
|
|
7579
|
+
const { unifiedMetadata } = parseMetadataRpc19(metadataRpc);
|
|
6844
7580
|
if (unifiedMetadata.version < 14)
|
|
6845
7581
|
throw new Error(
|
|
6846
7582
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -6860,14 +7596,14 @@ var getMiniMetadata11 = ({
|
|
|
6860
7596
|
import { Abi as Abi3 } from "@polkadot/api-contract";
|
|
6861
7597
|
import { TypeRegistry as TypeRegistry3 } from "@polkadot/types";
|
|
6862
7598
|
import { mergeUint8 as mergeUint87 } from "@polkadot-api/utils";
|
|
6863
|
-
import { isTokenOfType as
|
|
6864
|
-
import { parseMetadataRpc as
|
|
7599
|
+
import { isTokenOfType as isTokenOfType12, parseTokenId as parseTokenId5 } from "@talismn/chaindata-provider";
|
|
7600
|
+
import { parseMetadataRpc as parseMetadataRpc20 } from "@talismn/scale";
|
|
6865
7601
|
import { Binary as Binary6, Enum as Enum4 } from "polkadot-api";
|
|
6866
|
-
var
|
|
6867
|
-
if (!
|
|
6868
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
7602
|
+
var getTransferCallData12 = async ({ from: from2, to, value, token, metadataRpc, connector }) => {
|
|
7603
|
+
if (!isTokenOfType12(token, MODULE_TYPE12))
|
|
7604
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE12}.`);
|
|
6869
7605
|
const networkId = parseTokenId5(token.id).networkId;
|
|
6870
|
-
const { builder } =
|
|
7606
|
+
const { builder } = parseMetadataRpc20(metadataRpc);
|
|
6871
7607
|
const { codec, location } = builder.buildCall("Contracts", "call");
|
|
6872
7608
|
const Psp22Abi = new Abi3(psp22_default);
|
|
6873
7609
|
const registry = new TypeRegistry3();
|
|
@@ -6897,22 +7633,22 @@ var getTransferCallData11 = async ({ from: from2, to, value, token, metadataRpc,
|
|
|
6897
7633
|
};
|
|
6898
7634
|
|
|
6899
7635
|
// src/modules/substrate-psp22/subscribeBalances.ts
|
|
6900
|
-
import { isEqual as
|
|
6901
|
-
import { distinctUntilChanged as
|
|
6902
|
-
var
|
|
6903
|
-
var
|
|
7636
|
+
import { isEqual as isEqual10 } from "lodash-es";
|
|
7637
|
+
import { distinctUntilChanged as distinctUntilChanged10, Observable as Observable10, of as of13 } from "rxjs";
|
|
7638
|
+
var SUBSCRIPTION_INTERVAL9 = 6e3;
|
|
7639
|
+
var subscribeBalances12 = ({
|
|
6904
7640
|
networkId,
|
|
6905
7641
|
tokensWithAddresses,
|
|
6906
7642
|
connector,
|
|
6907
7643
|
miniMetadata
|
|
6908
7644
|
}) => {
|
|
6909
|
-
if (!tokensWithAddresses.length) return
|
|
6910
|
-
return new
|
|
7645
|
+
if (!tokensWithAddresses.length) return of13({ success: [], errors: [] });
|
|
7646
|
+
return new Observable10((subscriber) => {
|
|
6911
7647
|
const abortController = new AbortController();
|
|
6912
7648
|
const poll = async () => {
|
|
6913
7649
|
try {
|
|
6914
7650
|
if (abortController.signal.aborted) return;
|
|
6915
|
-
const balances = await
|
|
7651
|
+
const balances = await fetchBalances12({
|
|
6916
7652
|
networkId,
|
|
6917
7653
|
tokensWithAddresses,
|
|
6918
7654
|
connector,
|
|
@@ -6920,10 +7656,10 @@ var subscribeBalances11 = ({
|
|
|
6920
7656
|
});
|
|
6921
7657
|
if (abortController.signal.aborted) return;
|
|
6922
7658
|
subscriber.next(balances);
|
|
6923
|
-
setTimeout(poll,
|
|
7659
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL9);
|
|
6924
7660
|
} catch (error) {
|
|
6925
7661
|
log_default.error("Error", {
|
|
6926
|
-
module:
|
|
7662
|
+
module: MODULE_TYPE12,
|
|
6927
7663
|
networkId,
|
|
6928
7664
|
miniMetadata,
|
|
6929
7665
|
addressesByToken: tokensWithAddresses,
|
|
@@ -6936,36 +7672,36 @@ var subscribeBalances11 = ({
|
|
|
6936
7672
|
return () => {
|
|
6937
7673
|
abortController.abort();
|
|
6938
7674
|
};
|
|
6939
|
-
}).pipe(
|
|
7675
|
+
}).pipe(distinctUntilChanged10(isEqual10));
|
|
6940
7676
|
};
|
|
6941
7677
|
|
|
6942
7678
|
// src/modules/substrate-psp22/module.ts
|
|
6943
7679
|
var SubPsp22BalanceModule = {
|
|
6944
|
-
type:
|
|
6945
|
-
platform:
|
|
6946
|
-
getMiniMetadata:
|
|
6947
|
-
fetchTokens:
|
|
6948
|
-
fetchBalances:
|
|
6949
|
-
subscribeBalances:
|
|
6950
|
-
getTransferCallData:
|
|
7680
|
+
type: MODULE_TYPE12,
|
|
7681
|
+
platform: PLATFORM12,
|
|
7682
|
+
getMiniMetadata: getMiniMetadata12,
|
|
7683
|
+
fetchTokens: fetchTokens12,
|
|
7684
|
+
fetchBalances: fetchBalances12,
|
|
7685
|
+
subscribeBalances: subscribeBalances12,
|
|
7686
|
+
getTransferCallData: getTransferCallData12
|
|
6951
7687
|
};
|
|
6952
7688
|
|
|
6953
7689
|
// src/modules/substrate-psp22/types.ts
|
|
6954
7690
|
import { SubPsp22TokenSchema as SubPsp22TokenSchema3 } from "@talismn/chaindata-provider";
|
|
6955
|
-
import
|
|
6956
|
-
var SubPsp22TokenConfigSchema =
|
|
7691
|
+
import z17 from "zod/v4";
|
|
7692
|
+
var SubPsp22TokenConfigSchema = z17.strictObject({
|
|
6957
7693
|
contractAddress: SubPsp22TokenSchema3.shape.contractAddress,
|
|
6958
7694
|
...TokenConfigBaseSchema.shape
|
|
6959
7695
|
});
|
|
6960
7696
|
|
|
6961
7697
|
// src/modules/substrate-tokens/config.ts
|
|
6962
7698
|
import { SubTokensTokenSchema } from "@talismn/chaindata-provider";
|
|
6963
|
-
var
|
|
6964
|
-
var
|
|
7699
|
+
var MODULE_TYPE13 = SubTokensTokenSchema.shape.type.value;
|
|
7700
|
+
var PLATFORM13 = SubTokensTokenSchema.shape.platform.value;
|
|
6965
7701
|
|
|
6966
7702
|
// src/modules/substrate-tokens/buildQueries.ts
|
|
6967
|
-
import { decodeScale as
|
|
6968
|
-
import { isNotNil as
|
|
7703
|
+
import { decodeScale as decodeScale7, papiParse as papiParse3 } from "@talismn/scale";
|
|
7704
|
+
import { isNotNil as isNotNil9 } from "@talismn/util";
|
|
6969
7705
|
var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
|
|
6970
7706
|
const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
|
|
6971
7707
|
storage: [miniMetadata.extra.palletId, "Accounts"]
|
|
@@ -6987,7 +7723,7 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
6987
7723
|
return null;
|
|
6988
7724
|
}
|
|
6989
7725
|
const decodeResult = (changes) => {
|
|
6990
|
-
const decoded =
|
|
7726
|
+
const decoded = decodeScale7(
|
|
6991
7727
|
scaleCoder,
|
|
6992
7728
|
changes[0],
|
|
6993
7729
|
`Failed to decode substrate-tokens balance on chain ${networkId}`
|
|
@@ -7013,15 +7749,15 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
7013
7749
|
stateKeys: [stateKey],
|
|
7014
7750
|
decodeResult
|
|
7015
7751
|
};
|
|
7016
|
-
}).filter(
|
|
7752
|
+
}).filter(isNotNil9);
|
|
7017
7753
|
};
|
|
7018
7754
|
|
|
7019
7755
|
// src/modules/substrate-tokens/fetchBalances.ts
|
|
7020
|
-
var
|
|
7756
|
+
var fetchBalances13 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
7021
7757
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
7022
7758
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
7023
7759
|
if (!miniMetadata?.data) {
|
|
7024
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
7760
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE13} balances on ${networkId}.`);
|
|
7025
7761
|
return {
|
|
7026
7762
|
success: [],
|
|
7027
7763
|
errors: balanceDefs.map((def) => ({
|
|
@@ -7031,20 +7767,20 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
7031
7767
|
}))
|
|
7032
7768
|
};
|
|
7033
7769
|
}
|
|
7034
|
-
if (miniMetadata.source !==
|
|
7035
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
7770
|
+
if (miniMetadata.source !== MODULE_TYPE13) {
|
|
7771
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE13}.`);
|
|
7036
7772
|
return {
|
|
7037
7773
|
success: [],
|
|
7038
7774
|
errors: balanceDefs.map((def) => ({
|
|
7039
7775
|
tokenId: def.token.id,
|
|
7040
7776
|
address: def.address,
|
|
7041
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
7777
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE13}`)
|
|
7042
7778
|
}))
|
|
7043
7779
|
};
|
|
7044
7780
|
}
|
|
7045
7781
|
if (miniMetadata.chainId !== networkId) {
|
|
7046
7782
|
log_default.warn(
|
|
7047
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
7783
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE13}. Expected chainId is ${networkId}`
|
|
7048
7784
|
);
|
|
7049
7785
|
return {
|
|
7050
7786
|
success: [],
|
|
@@ -7068,7 +7804,7 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
7068
7804
|
address: def.address,
|
|
7069
7805
|
networkId,
|
|
7070
7806
|
tokenId: def.token.id,
|
|
7071
|
-
source:
|
|
7807
|
+
source: MODULE_TYPE13,
|
|
7072
7808
|
status: "live",
|
|
7073
7809
|
values: [
|
|
7074
7810
|
{ type: "free", label: "free", amount: "0" },
|
|
@@ -7083,19 +7819,19 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
7083
7819
|
|
|
7084
7820
|
// src/modules/substrate-tokens/fetchTokens.ts
|
|
7085
7821
|
import { subTokensTokenId } from "@talismn/chaindata-provider";
|
|
7086
|
-
import { assign as
|
|
7087
|
-
var
|
|
7822
|
+
import { assign as assign11 } from "lodash-es";
|
|
7823
|
+
var fetchTokens13 = async ({
|
|
7088
7824
|
networkId,
|
|
7089
7825
|
tokens,
|
|
7090
7826
|
miniMetadata
|
|
7091
7827
|
}) => {
|
|
7092
7828
|
if (!miniMetadata?.data) return [];
|
|
7093
7829
|
return tokens.map(
|
|
7094
|
-
(tokenConfig) =>
|
|
7830
|
+
(tokenConfig) => assign11(
|
|
7095
7831
|
{
|
|
7096
7832
|
id: subTokensTokenId(networkId, tokenConfig.onChainId),
|
|
7097
|
-
type:
|
|
7098
|
-
platform:
|
|
7833
|
+
type: MODULE_TYPE13,
|
|
7834
|
+
platform: PLATFORM13,
|
|
7099
7835
|
networkId,
|
|
7100
7836
|
onChainId: tokenConfig.onChainId,
|
|
7101
7837
|
symbol: tokenConfig.symbol ?? "Unit",
|
|
@@ -7111,9 +7847,9 @@ var fetchTokens12 = async ({
|
|
|
7111
7847
|
|
|
7112
7848
|
// src/modules/substrate-tokens/getMiniMetadata.ts
|
|
7113
7849
|
import { MINIMETADATA_VERSION as MINIMETADATA_VERSION8 } from "@talismn/chaindata-provider";
|
|
7114
|
-
import { compactMetadata as compactMetadata6, encodeMetadata as encodeMetadata6, parseMetadataRpc as
|
|
7115
|
-
var
|
|
7116
|
-
const source =
|
|
7850
|
+
import { compactMetadata as compactMetadata6, encodeMetadata as encodeMetadata6, parseMetadataRpc as parseMetadataRpc21 } from "@talismn/scale";
|
|
7851
|
+
var getMiniMetadata13 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
7852
|
+
const source = MODULE_TYPE13;
|
|
7117
7853
|
const chainId = networkId;
|
|
7118
7854
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
7119
7855
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -7121,7 +7857,7 @@ var getMiniMetadata12 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
7121
7857
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
7122
7858
|
);
|
|
7123
7859
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
7124
|
-
const { unifiedMetadata } =
|
|
7860
|
+
const { unifiedMetadata } = parseMetadataRpc21(metadataRpc);
|
|
7125
7861
|
if (unifiedMetadata.version < 14)
|
|
7126
7862
|
throw new Error(
|
|
7127
7863
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -7138,7 +7874,7 @@ var getMiniMetadata12 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
7138
7874
|
};
|
|
7139
7875
|
};
|
|
7140
7876
|
var getData5 = (metadataRpc, pallet) => {
|
|
7141
|
-
const { metadata, unifiedMetadata } =
|
|
7877
|
+
const { metadata, unifiedMetadata } = parseMetadataRpc21(metadataRpc);
|
|
7142
7878
|
if (!hasStorageItems(unifiedMetadata, pallet, ["Accounts"])) return null;
|
|
7143
7879
|
compactMetadata6(metadata, [{ pallet, items: ["Accounts"] }]);
|
|
7144
7880
|
return encodeMetadata6(metadata);
|
|
@@ -7146,13 +7882,13 @@ var getData5 = (metadataRpc, pallet) => {
|
|
|
7146
7882
|
|
|
7147
7883
|
// src/modules/substrate-tokens/getTransferCallData.ts
|
|
7148
7884
|
import { mergeUint8 as mergeUint88 } from "@polkadot-api/utils";
|
|
7149
|
-
import { isTokenOfType as
|
|
7150
|
-
import { papiParse as papiParse4, parseMetadataRpc as
|
|
7885
|
+
import { isTokenOfType as isTokenOfType13 } from "@talismn/chaindata-provider";
|
|
7886
|
+
import { papiParse as papiParse4, parseMetadataRpc as parseMetadataRpc22 } from "@talismn/scale";
|
|
7151
7887
|
import { Binary as Binary7, Enum as Enum5 } from "polkadot-api";
|
|
7152
|
-
var
|
|
7153
|
-
if (!
|
|
7154
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
7155
|
-
const { builder } =
|
|
7888
|
+
var getTransferCallData13 = ({ from: from2, to, value, token, type, metadataRpc, config }) => {
|
|
7889
|
+
if (!isTokenOfType13(token, MODULE_TYPE13))
|
|
7890
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE13}.`);
|
|
7891
|
+
const { builder } = parseMetadataRpc22(metadataRpc);
|
|
7156
7892
|
const options = getCallDataOptions(to, token, value, type, config);
|
|
7157
7893
|
const callData = getCallDataFromOptions(builder, options);
|
|
7158
7894
|
return {
|
|
@@ -7264,9 +8000,9 @@ var getCallDataOptions = (to, token, value, type, config) => {
|
|
|
7264
8000
|
};
|
|
7265
8001
|
|
|
7266
8002
|
// src/modules/substrate-tokens/subscribeBalances.ts
|
|
7267
|
-
import { map as map5, of as
|
|
7268
|
-
var
|
|
7269
|
-
if (!tokensWithAddresses.length) return
|
|
8003
|
+
import { map as map5, of as of14 } from "rxjs";
|
|
8004
|
+
var subscribeBalances13 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
8005
|
+
if (!tokensWithAddresses.length) return of14({ success: [], errors: [] });
|
|
7270
8006
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
7271
8007
|
const queries = buildQueries3(networkId, balanceDefs, miniMetadata);
|
|
7272
8008
|
return getRpcQueryPack$(connector, networkId, queries).pipe(
|
|
@@ -7279,31 +8015,31 @@ var subscribeBalances12 = ({ networkId, tokensWithAddresses, connector, miniMeta
|
|
|
7279
8015
|
|
|
7280
8016
|
// src/modules/substrate-tokens/module.ts
|
|
7281
8017
|
var SubTokensBalanceModule = {
|
|
7282
|
-
type:
|
|
7283
|
-
platform:
|
|
7284
|
-
getMiniMetadata:
|
|
7285
|
-
fetchTokens:
|
|
7286
|
-
fetchBalances:
|
|
7287
|
-
subscribeBalances:
|
|
7288
|
-
getTransferCallData:
|
|
8018
|
+
type: MODULE_TYPE13,
|
|
8019
|
+
platform: PLATFORM13,
|
|
8020
|
+
getMiniMetadata: getMiniMetadata13,
|
|
8021
|
+
fetchTokens: fetchTokens13,
|
|
8022
|
+
fetchBalances: fetchBalances13,
|
|
8023
|
+
subscribeBalances: subscribeBalances13,
|
|
8024
|
+
getTransferCallData: getTransferCallData13
|
|
7289
8025
|
};
|
|
7290
8026
|
|
|
7291
8027
|
// src/modules/substrate-tokens/types.ts
|
|
7292
8028
|
import { SubTokensTokenSchema as SubTokensTokenSchema2 } from "@talismn/chaindata-provider";
|
|
7293
|
-
import
|
|
7294
|
-
var SubTokensTokenConfigSchema =
|
|
8029
|
+
import z18 from "zod/v4";
|
|
8030
|
+
var SubTokensTokenConfigSchema = z18.strictObject({
|
|
7295
8031
|
onChainId: SubTokensTokenSchema2.shape.onChainId,
|
|
7296
8032
|
...TokenConfigBaseSchema.shape,
|
|
7297
8033
|
// force these 3 fields because in this module we wont pull anything from chain
|
|
7298
|
-
symbol:
|
|
7299
|
-
decimals:
|
|
7300
|
-
existentialDeposit:
|
|
8034
|
+
symbol: z18.string().nonempty(),
|
|
8035
|
+
decimals: z18.number(),
|
|
8036
|
+
existentialDeposit: z18.string().nonempty()
|
|
7301
8037
|
});
|
|
7302
|
-
var SubTokensModuleConfigSchema =
|
|
7303
|
-
palletId:
|
|
8038
|
+
var SubTokensModuleConfigSchema = z18.strictObject({
|
|
8039
|
+
palletId: z18.string().optional()
|
|
7304
8040
|
});
|
|
7305
|
-
var SubTokensMiniMetadataExtraSchema =
|
|
7306
|
-
palletId:
|
|
8041
|
+
var SubTokensMiniMetadataExtraSchema = z18.strictObject({
|
|
8042
|
+
palletId: z18.string()
|
|
7307
8043
|
});
|
|
7308
8044
|
|
|
7309
8045
|
// src/modules/index.ts
|
|
@@ -7319,7 +8055,8 @@ var BALANCE_MODULES = [
|
|
|
7319
8055
|
EvmUniswapV2BalanceModule,
|
|
7320
8056
|
EvmNativeBalanceModule,
|
|
7321
8057
|
SolNativeBalanceModule,
|
|
7322
|
-
SolSplBalanceModule
|
|
8058
|
+
SolSplBalanceModule,
|
|
8059
|
+
SolToken2022BalanceModule
|
|
7323
8060
|
];
|
|
7324
8061
|
|
|
7325
8062
|
// src/getMiniMetadatas/getMetadataRpc.ts
|
|
@@ -7427,16 +8164,16 @@ var BalancesProvider = class {
|
|
|
7427
8164
|
this.#chaindataProvider = chaindataProvider;
|
|
7428
8165
|
this.#chainConnectors = chainConnectors;
|
|
7429
8166
|
this.#storage = new BehaviorSubject2({
|
|
7430
|
-
balances:
|
|
7431
|
-
miniMetadatas:
|
|
8167
|
+
balances: keyBy9(storage.balances.filter(isNotNil10), (b) => getBalanceId(b)),
|
|
8168
|
+
miniMetadatas: keyBy9(storage.miniMetadatas.filter(isNotNil10), (m) => m.id)
|
|
7432
8169
|
});
|
|
7433
8170
|
}
|
|
7434
8171
|
get storage$() {
|
|
7435
8172
|
return this.#storage.pipe(
|
|
7436
8173
|
map6(
|
|
7437
8174
|
({ balances, miniMetadatas }) => ({
|
|
7438
|
-
balances: values2(balances).filter(
|
|
7439
|
-
miniMetadatas: values2(miniMetadatas).filter(
|
|
8175
|
+
balances: values2(balances).filter(isNotNil10).sort(sortByBalanceId),
|
|
8176
|
+
miniMetadatas: values2(miniMetadatas).filter(isNotNil10).sort(sortByMiniMetadataId)
|
|
7440
8177
|
}),
|
|
7441
8178
|
shareReplay(1)
|
|
7442
8179
|
)
|
|
@@ -7444,8 +8181,8 @@ var BalancesProvider = class {
|
|
|
7444
8181
|
}
|
|
7445
8182
|
get storedMiniMetadataMapById$() {
|
|
7446
8183
|
return this.#storage.pipe(
|
|
7447
|
-
map6((storage) =>
|
|
7448
|
-
|
|
8184
|
+
map6((storage) => keyBy9(storage.miniMetadatas, (m) => m.id)),
|
|
8185
|
+
distinctUntilChanged11(isEqual11),
|
|
7449
8186
|
shareReplay(1)
|
|
7450
8187
|
);
|
|
7451
8188
|
}
|
|
@@ -7465,7 +8202,7 @@ var BalancesProvider = class {
|
|
|
7465
8202
|
)
|
|
7466
8203
|
),
|
|
7467
8204
|
switchMap2((addressesByTokenIdByNetworkId) => {
|
|
7468
|
-
if (!keys3(addressesByTokenIdByNetworkId).length) return
|
|
8205
|
+
if (!keys3(addressesByTokenIdByNetworkId).length) return of15({ isStale: false, results: [] });
|
|
7469
8206
|
return combineLatest({
|
|
7470
8207
|
isStale: timer(3e4).pipe(
|
|
7471
8208
|
map6(() => true),
|
|
@@ -7490,7 +8227,7 @@ var BalancesProvider = class {
|
|
|
7490
8227
|
failedBalanceIds: results.flatMap((result) => result.failedBalanceIds)
|
|
7491
8228
|
})
|
|
7492
8229
|
),
|
|
7493
|
-
|
|
8230
|
+
distinctUntilChanged11(isEqual11)
|
|
7494
8231
|
);
|
|
7495
8232
|
}
|
|
7496
8233
|
fetchBalances(addressesByTokenId) {
|
|
@@ -7529,7 +8266,7 @@ var BalancesProvider = class {
|
|
|
7529
8266
|
}
|
|
7530
8267
|
default: {
|
|
7531
8268
|
log_default.warn("[balances] Unsupported network platform for module", { networkId, mod });
|
|
7532
|
-
return
|
|
8269
|
+
return of15({ status: "live", balances: [], failedBalanceIds: [] });
|
|
7533
8270
|
}
|
|
7534
8271
|
}
|
|
7535
8272
|
})
|
|
@@ -7537,14 +8274,14 @@ var BalancesProvider = class {
|
|
|
7537
8274
|
}),
|
|
7538
8275
|
map6((results) => {
|
|
7539
8276
|
const errorBalanceIds = results.flatMap((result) => result.failedBalanceIds);
|
|
7540
|
-
const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(
|
|
8277
|
+
const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(isNotNil10).map((b) => ({ ...b, status: "stale" }));
|
|
7541
8278
|
return {
|
|
7542
8279
|
status: results.some(({ status }) => status === "initialising") ? "initialising" : "live",
|
|
7543
8280
|
balances: results.flatMap((result) => result.balances).concat(staleBalances).sort(sortByBalanceId),
|
|
7544
8281
|
failedBalanceIds: []
|
|
7545
8282
|
};
|
|
7546
8283
|
}),
|
|
7547
|
-
|
|
8284
|
+
distinctUntilChanged11(isEqual11)
|
|
7548
8285
|
);
|
|
7549
8286
|
}
|
|
7550
8287
|
getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
|
|
@@ -7553,7 +8290,7 @@ var BalancesProvider = class {
|
|
|
7553
8290
|
{ networkId, mod, tokensWithAddresses },
|
|
7554
8291
|
() => {
|
|
7555
8292
|
if (!tokensWithAddresses.length)
|
|
7556
|
-
return
|
|
8293
|
+
return of15({ status: "live", balances: [], failedBalanceIds: [] });
|
|
7557
8294
|
const moduleAddressesByTokenId = fromPairs2(
|
|
7558
8295
|
tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
|
|
7559
8296
|
);
|
|
@@ -7563,7 +8300,7 @@ var BalancesProvider = class {
|
|
|
7563
8300
|
if (!this.#chainConnectors.substrate) {
|
|
7564
8301
|
log_default.warn("[balances] no substrate connector or miniMetadata for module", mod.type);
|
|
7565
8302
|
return defer(
|
|
7566
|
-
() =>
|
|
8303
|
+
() => of15({
|
|
7567
8304
|
status: "initialising",
|
|
7568
8305
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7569
8306
|
failedBalanceIds: []
|
|
@@ -7590,8 +8327,14 @@ var BalancesProvider = class {
|
|
|
7590
8327
|
map6(
|
|
7591
8328
|
(results) => ({
|
|
7592
8329
|
status: "live",
|
|
7593
|
-
// exclude zero balances
|
|
7594
|
-
|
|
8330
|
+
// exclude zero balances, but keep balances that only hold a lock
|
|
8331
|
+
// (eg dtao conviction locks, reported on the subnet's base token — including
|
|
8332
|
+
// zero-mass "ghost" locks with residual conviction, which still pin the hotkey
|
|
8333
|
+
// of future lock_stake calls)
|
|
8334
|
+
balances: results.success.filter((b) => {
|
|
8335
|
+
const balance = new Balance(b);
|
|
8336
|
+
return balance.total.planck > 0n || balance.locks.some((lock) => lock.amount.planck > 0n) || !!findDTaoConvictionLock(balance.locks);
|
|
8337
|
+
}),
|
|
7595
8338
|
failedBalanceIds: results.errors.map(
|
|
7596
8339
|
({ tokenId, address }) => getBalanceId({ tokenId, address })
|
|
7597
8340
|
)
|
|
@@ -7622,7 +8365,7 @@ var BalancesProvider = class {
|
|
|
7622
8365
|
{ networkId, mod, tokensWithAddresses },
|
|
7623
8366
|
() => {
|
|
7624
8367
|
if (!tokensWithAddresses.length)
|
|
7625
|
-
return
|
|
8368
|
+
return of15({ status: "live", balances: [], failedBalanceIds: [] });
|
|
7626
8369
|
const moduleAddressesByTokenId = fromPairs2(
|
|
7627
8370
|
tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
|
|
7628
8371
|
);
|
|
@@ -7632,7 +8375,7 @@ var BalancesProvider = class {
|
|
|
7632
8375
|
if (!this.#chainConnectors.evm) {
|
|
7633
8376
|
log_default.warn("[balances] no ethereum connector for module", mod.type);
|
|
7634
8377
|
return defer(
|
|
7635
|
-
() =>
|
|
8378
|
+
() => of15({
|
|
7636
8379
|
status: "initialising",
|
|
7637
8380
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7638
8381
|
failedBalanceIds: []
|
|
@@ -7681,7 +8424,7 @@ var BalancesProvider = class {
|
|
|
7681
8424
|
{ networkId, mod, tokensWithAddresses },
|
|
7682
8425
|
() => {
|
|
7683
8426
|
if (!tokensWithAddresses.length)
|
|
7684
|
-
return
|
|
8427
|
+
return of15({ status: "live", balances: [], failedBalanceIds: [] });
|
|
7685
8428
|
const moduleAddressesByTokenId = fromPairs2(
|
|
7686
8429
|
tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
|
|
7687
8430
|
);
|
|
@@ -7691,7 +8434,7 @@ var BalancesProvider = class {
|
|
|
7691
8434
|
if (!this.#chainConnectors.solana) {
|
|
7692
8435
|
log_default.warn("[balances] no solana connector for module", mod.type);
|
|
7693
8436
|
return defer(
|
|
7694
|
-
() =>
|
|
8437
|
+
() => of15({
|
|
7695
8438
|
status: "initialising",
|
|
7696
8439
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7697
8440
|
failedBalanceIds: []
|
|
@@ -7705,6 +8448,11 @@ var BalancesProvider = class {
|
|
|
7705
8448
|
}).pipe(
|
|
7706
8449
|
catchError(() => EMPTY),
|
|
7707
8450
|
// don't emit, let provider mark balances stale
|
|
8451
|
+
tap((results) => {
|
|
8452
|
+
if (results.dynamicTokens?.length) {
|
|
8453
|
+
this.#chaindataProvider.registerDynamicTokens(results.dynamicTokens);
|
|
8454
|
+
}
|
|
8455
|
+
}),
|
|
7708
8456
|
map6(
|
|
7709
8457
|
(results) => ({
|
|
7710
8458
|
status: "live",
|
|
@@ -7738,14 +8486,14 @@ var BalancesProvider = class {
|
|
|
7738
8486
|
if (balancesResult.status !== "live") return;
|
|
7739
8487
|
const storage = this.#storage.getValue();
|
|
7740
8488
|
const failedIds = new Set(balancesResult.failedBalanceIds);
|
|
7741
|
-
const balances =
|
|
8489
|
+
const balances = assign12(
|
|
7742
8490
|
{},
|
|
7743
8491
|
storage.balances,
|
|
7744
8492
|
// 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
8493
|
fromPairs2(
|
|
7746
8494
|
balanceIds.filter((bid) => !failedIds.has(bid)).map((balanceId) => [balanceId, void 0])
|
|
7747
8495
|
),
|
|
7748
|
-
|
|
8496
|
+
keyBy9(
|
|
7749
8497
|
// storage balances must have status "cache", because they are used as start value when initialising subsequent subscriptions
|
|
7750
8498
|
balancesResult.balances.map((b) => ({ ...b, status: "cache" })),
|
|
7751
8499
|
(b) => getBalanceId(b)
|
|
@@ -7755,7 +8503,7 @@ var BalancesProvider = class {
|
|
|
7755
8503
|
const balance = balances[errorBalanceId];
|
|
7756
8504
|
if (balance) balance.status = "stale";
|
|
7757
8505
|
}
|
|
7758
|
-
this.#storage.next(
|
|
8506
|
+
this.#storage.next(assign12({}, storage, { balances }));
|
|
7759
8507
|
}
|
|
7760
8508
|
getNetworkMiniMetadatas$(networkId) {
|
|
7761
8509
|
return getSharedObservable(`BalancesProvider.getNetworkMiniMetadatas$`, { networkId }, () => {
|
|
@@ -7763,11 +8511,11 @@ var BalancesProvider = class {
|
|
|
7763
8511
|
switchMap2(
|
|
7764
8512
|
(network) => isNetworkDot(network) ? this.getNetworkSpecVersion$(networkId).pipe(
|
|
7765
8513
|
switchMap2(
|
|
7766
|
-
(specVersion) => specVersion === null ?
|
|
8514
|
+
(specVersion) => specVersion === null ? of15([]) : this.getMiniMetadatas$(networkId, specVersion)
|
|
7767
8515
|
)
|
|
7768
|
-
) :
|
|
8516
|
+
) : of15([])
|
|
7769
8517
|
),
|
|
7770
|
-
|
|
8518
|
+
distinctUntilChanged11(isEqual11)
|
|
7771
8519
|
);
|
|
7772
8520
|
});
|
|
7773
8521
|
}
|
|
@@ -7783,7 +8531,7 @@ var BalancesProvider = class {
|
|
|
7783
8531
|
).pipe(
|
|
7784
8532
|
catchError(() => {
|
|
7785
8533
|
log_default.warn("Failed to fetch spec version for network", networkId);
|
|
7786
|
-
return
|
|
8534
|
+
return of15(null);
|
|
7787
8535
|
})
|
|
7788
8536
|
);
|
|
7789
8537
|
}
|
|
@@ -7800,9 +8548,9 @@ var BalancesProvider = class {
|
|
|
7800
8548
|
storedMiniMetadatas: this.getStoredMiniMetadatas$(miniMetadataIds)
|
|
7801
8549
|
}).pipe(
|
|
7802
8550
|
switchMap2(({ storedMiniMetadatas, defaultMiniMetadatas }) => {
|
|
7803
|
-
if (defaultMiniMetadatas) return
|
|
7804
|
-
if (storedMiniMetadatas) return
|
|
7805
|
-
if (!this.#chainConnectors.substrate) return
|
|
8551
|
+
if (defaultMiniMetadatas) return of15(defaultMiniMetadatas);
|
|
8552
|
+
if (storedMiniMetadatas) return of15(storedMiniMetadatas);
|
|
8553
|
+
if (!this.#chainConnectors.substrate) return of15([]);
|
|
7806
8554
|
return from(
|
|
7807
8555
|
withRetry(
|
|
7808
8556
|
() => (
|
|
@@ -7825,27 +8573,27 @@ var BalancesProvider = class {
|
|
|
7825
8573
|
).pipe(
|
|
7826
8574
|
catchError(() => {
|
|
7827
8575
|
log_default.warn("Failed to fetch metadata for network", networkId);
|
|
7828
|
-
return
|
|
8576
|
+
return of15([]);
|
|
7829
8577
|
}),
|
|
7830
8578
|
// and persist in storage for later reuse
|
|
7831
8579
|
tap((newMiniMetadatas) => {
|
|
7832
8580
|
if (!newMiniMetadatas.length) return;
|
|
7833
8581
|
const storage = this.#storage.getValue();
|
|
7834
|
-
const miniMetadatas =
|
|
8582
|
+
const miniMetadatas = assign12(
|
|
7835
8583
|
// keep minimetadatas of other networks
|
|
7836
|
-
|
|
8584
|
+
keyBy9(
|
|
7837
8585
|
values2(storage.miniMetadatas).filter((m) => m.chainId !== networkId),
|
|
7838
8586
|
(m) => m.id
|
|
7839
8587
|
),
|
|
7840
8588
|
// add the ones for our network
|
|
7841
|
-
|
|
8589
|
+
keyBy9(newMiniMetadatas, (m) => m.id)
|
|
7842
8590
|
);
|
|
7843
|
-
this.#storage.next(
|
|
8591
|
+
this.#storage.next(assign12({}, storage, { miniMetadatas }));
|
|
7844
8592
|
})
|
|
7845
8593
|
);
|
|
7846
8594
|
}),
|
|
7847
8595
|
// emit only when mini metadata changes, as a change here would restart all subscriptions for the network
|
|
7848
|
-
|
|
8596
|
+
distinctUntilChanged11(isEqual11)
|
|
7849
8597
|
);
|
|
7850
8598
|
}
|
|
7851
8599
|
getStoredMiniMetadatas$(miniMetadataIds) {
|
|
@@ -7855,7 +8603,7 @@ var BalancesProvider = class {
|
|
|
7855
8603
|
return miniMetadatas.length && miniMetadatas.every(isTruthy) ? miniMetadatas : null;
|
|
7856
8604
|
}),
|
|
7857
8605
|
// source changes very often
|
|
7858
|
-
|
|
8606
|
+
distinctUntilChanged11(isEqual11)
|
|
7859
8607
|
);
|
|
7860
8608
|
}
|
|
7861
8609
|
getDefaultMiniMetadatas$(miniMetadataIds) {
|
|
@@ -7870,7 +8618,7 @@ var BalancesProvider = class {
|
|
|
7870
8618
|
const balanceDefs = toPairs2(addressesByToken).flatMap(
|
|
7871
8619
|
([tokenId, addresses]) => addresses.map((address) => [tokenId, address])
|
|
7872
8620
|
);
|
|
7873
|
-
return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(
|
|
8621
|
+
return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(isNotNil10).sort(sortByBalanceId);
|
|
7874
8622
|
}
|
|
7875
8623
|
cleanupAddressesByTokenId$(addressesByTokenId) {
|
|
7876
8624
|
return this.#chaindataProvider.getNetworksMapById$().pipe(
|
|
@@ -7881,7 +8629,7 @@ var BalancesProvider = class {
|
|
|
7881
8629
|
const network = networksById[networkId];
|
|
7882
8630
|
return [
|
|
7883
8631
|
tokenId,
|
|
7884
|
-
|
|
8632
|
+
uniq6(addresses.map(normalizeAddress)).filter(
|
|
7885
8633
|
(address) => network && isAddressCompatibleWithNetwork(network, address)
|
|
7886
8634
|
)
|
|
7887
8635
|
];
|
|
@@ -7943,6 +8691,8 @@ export {
|
|
|
7943
8691
|
SolNativeTokenConfigSchema,
|
|
7944
8692
|
SolSplBalanceModule,
|
|
7945
8693
|
SolSplTokenConfigSchema,
|
|
8694
|
+
SolToken2022BalanceModule,
|
|
8695
|
+
SolToken2022TokenConfigSchema,
|
|
7946
8696
|
SubAssetsBalanceModule,
|
|
7947
8697
|
SubAssetsTokenConfigSchema,
|
|
7948
8698
|
SubDTaoBalanceModule,
|
|
@@ -7971,7 +8721,9 @@ export {
|
|
|
7971
8721
|
excludeFromTransferableAmount,
|
|
7972
8722
|
filterBaseLocks,
|
|
7973
8723
|
filterMirrorTokens,
|
|
8724
|
+
findDTaoConvictionLock,
|
|
7974
8725
|
getBalanceId,
|
|
8726
|
+
getConvictionLockLabel,
|
|
7975
8727
|
getDTaoTokenRates,
|
|
7976
8728
|
getLockTitle,
|
|
7977
8729
|
getLockedType,
|
|
@@ -7979,6 +8731,7 @@ export {
|
|
|
7979
8731
|
getValueId,
|
|
7980
8732
|
includeInTotalExtraAmount,
|
|
7981
8733
|
taoToAlpha,
|
|
8734
|
+
taoToAlphaCeil,
|
|
7982
8735
|
uniswapV2PairAbi
|
|
7983
8736
|
};
|
|
7984
8737
|
//# sourceMappingURL=index.mjs.map
|