@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.js
CHANGED
|
@@ -45,12 +45,14 @@ __export(index_exports, {
|
|
|
45
45
|
EvmUniswapV2BalanceModule: () => EvmUniswapV2BalanceModule,
|
|
46
46
|
EvmUniswapV2TokenConfigSchema: () => EvmUniswapV2TokenConfigSchema,
|
|
47
47
|
FiatSumBalancesFormatter: () => FiatSumBalancesFormatter,
|
|
48
|
-
MINIMETADATA_VERSION: () =>
|
|
48
|
+
MINIMETADATA_VERSION: () => import_chaindata_provider72.MINIMETADATA_VERSION,
|
|
49
49
|
PlanckSumBalancesFormatter: () => PlanckSumBalancesFormatter,
|
|
50
50
|
SolNativeBalanceModule: () => SolNativeBalanceModule,
|
|
51
51
|
SolNativeTokenConfigSchema: () => SolNativeTokenConfigSchema,
|
|
52
52
|
SolSplBalanceModule: () => SolSplBalanceModule,
|
|
53
53
|
SolSplTokenConfigSchema: () => SolSplTokenConfigSchema,
|
|
54
|
+
SolToken2022BalanceModule: () => SolToken2022BalanceModule,
|
|
55
|
+
SolToken2022TokenConfigSchema: () => SolToken2022TokenConfigSchema,
|
|
54
56
|
SubAssetsBalanceModule: () => SubAssetsBalanceModule,
|
|
55
57
|
SubAssetsTokenConfigSchema: () => SubAssetsTokenConfigSchema,
|
|
56
58
|
SubDTaoBalanceModule: () => SubDTaoBalanceModule,
|
|
@@ -79,7 +81,9 @@ __export(index_exports, {
|
|
|
79
81
|
excludeFromTransferableAmount: () => excludeFromTransferableAmount,
|
|
80
82
|
filterBaseLocks: () => filterBaseLocks,
|
|
81
83
|
filterMirrorTokens: () => filterMirrorTokens,
|
|
84
|
+
findDTaoConvictionLock: () => findDTaoConvictionLock,
|
|
82
85
|
getBalanceId: () => getBalanceId,
|
|
86
|
+
getConvictionLockLabel: () => getConvictionLockLabel,
|
|
83
87
|
getDTaoTokenRates: () => getDTaoTokenRates,
|
|
84
88
|
getLockTitle: () => getLockTitle,
|
|
85
89
|
getLockedType: () => getLockedType,
|
|
@@ -87,16 +91,22 @@ __export(index_exports, {
|
|
|
87
91
|
getValueId: () => getValueId,
|
|
88
92
|
includeInTotalExtraAmount: () => includeInTotalExtraAmount,
|
|
89
93
|
taoToAlpha: () => taoToAlpha,
|
|
94
|
+
taoToAlphaCeil: () => taoToAlphaCeil,
|
|
90
95
|
uniswapV2PairAbi: () => uniswapV2PairAbi
|
|
91
96
|
});
|
|
92
97
|
module.exports = __toCommonJS(index_exports);
|
|
93
98
|
|
|
99
|
+
// src/configureBigNumber.ts
|
|
100
|
+
var import_bignumber = __toESM(require("bignumber.js"));
|
|
101
|
+
import_bignumber.default.set({ STRICT: false });
|
|
102
|
+
var configureBigNumber_default = import_bignumber.default;
|
|
103
|
+
|
|
94
104
|
// src/BalancesProvider.ts
|
|
95
|
-
var
|
|
105
|
+
var import_chaindata_provider71 = require("@talismn/chaindata-provider");
|
|
96
106
|
var import_crypto8 = require("@talismn/crypto");
|
|
97
|
-
var
|
|
98
|
-
var
|
|
99
|
-
var
|
|
107
|
+
var import_util17 = require("@talismn/util");
|
|
108
|
+
var import_lodash_es30 = require("lodash-es");
|
|
109
|
+
var import_rxjs16 = require("rxjs");
|
|
100
110
|
var import_viem9 = require("viem");
|
|
101
111
|
|
|
102
112
|
// src/getMiniMetadatas/index.ts
|
|
@@ -108,7 +118,7 @@ var import_anylogger = __toESM(require("anylogger"));
|
|
|
108
118
|
// package.json
|
|
109
119
|
var package_default = {
|
|
110
120
|
name: "@talismn/balances",
|
|
111
|
-
version: "1.
|
|
121
|
+
version: "1.5.0",
|
|
112
122
|
author: "Talisman",
|
|
113
123
|
homepage: "https://talisman.xyz",
|
|
114
124
|
license: "GPL-3.0-or-later",
|
|
@@ -136,9 +146,9 @@ var package_default = {
|
|
|
136
146
|
},
|
|
137
147
|
dependencies: {
|
|
138
148
|
"@metaplex-foundation/mpl-token-metadata": "^3.4.0",
|
|
139
|
-
"@metaplex-foundation/umi": "^1.
|
|
149
|
+
"@metaplex-foundation/umi": "^1.5.1",
|
|
140
150
|
"@polkadot-api/utils": "0.2.0",
|
|
141
|
-
"@solana/spl-token": "^0.4.
|
|
151
|
+
"@solana/spl-token": "^0.4.14",
|
|
142
152
|
"@solana/web3.js": "^1.98.2",
|
|
143
153
|
"@talismn/chain-connectors": "workspace:*",
|
|
144
154
|
"@talismn/chaindata-provider": "workspace:*",
|
|
@@ -148,28 +158,26 @@ var package_default = {
|
|
|
148
158
|
"@talismn/token-rates": "workspace:*",
|
|
149
159
|
"@talismn/util": "workspace:*",
|
|
150
160
|
anylogger: "^1.0.11",
|
|
151
|
-
"bignumber.js": "^
|
|
152
|
-
"lodash-es": "4.
|
|
161
|
+
"bignumber.js": "^11.1.3",
|
|
162
|
+
"lodash-es": "4.18.1",
|
|
153
163
|
"p-queue": "8.1.0",
|
|
154
164
|
"polkadot-api": "1.23.3",
|
|
155
|
-
rxjs: "^7.8.
|
|
165
|
+
rxjs: "^7.8.2",
|
|
156
166
|
"scale-ts": "^1.6.1",
|
|
157
|
-
viem: "
|
|
158
|
-
zod: "^
|
|
167
|
+
viem: "2.52.2",
|
|
168
|
+
zod: "^4.4.3"
|
|
159
169
|
},
|
|
160
170
|
devDependencies: {
|
|
161
171
|
"@polkadot/api-contract": "16.1.2",
|
|
162
172
|
"@polkadot/types": "16.1.2",
|
|
163
|
-
"@polkadot/util": "13.5.3",
|
|
164
173
|
"@talismn/tsconfig": "workspace:*",
|
|
165
174
|
"@types/lodash-es": "4.17.12",
|
|
166
|
-
|
|
175
|
+
"@types/node": "^24.5.1",
|
|
176
|
+
typescript: "^6.0.3"
|
|
167
177
|
},
|
|
168
178
|
peerDependencies: {
|
|
169
179
|
"@polkadot/api-contract": "*",
|
|
170
180
|
"@polkadot/types": "*",
|
|
171
|
-
"@polkadot/util": "*",
|
|
172
|
-
"@polkadot/util-crypto": "*",
|
|
173
181
|
"@substrate/txwrapper-core": "*"
|
|
174
182
|
},
|
|
175
183
|
types: "./dist/index.d.ts",
|
|
@@ -1089,6 +1097,7 @@ var import_lodash_es = require("lodash-es");
|
|
|
1089
1097
|
var import_v4 = __toESM(require("zod/v4"));
|
|
1090
1098
|
|
|
1091
1099
|
// src/modules/evm-erc20/utils.ts
|
|
1100
|
+
var import_util = require("@talismn/util");
|
|
1092
1101
|
var import_viem4 = require("viem");
|
|
1093
1102
|
var getErc20ContractData = async (client, contractAddress) => {
|
|
1094
1103
|
try {
|
|
@@ -1099,7 +1108,7 @@ var getErc20ContractData = async (client, contractAddress) => {
|
|
|
1099
1108
|
contract.read.name()
|
|
1100
1109
|
]);
|
|
1101
1110
|
} catch (e) {
|
|
1102
|
-
if (e
|
|
1111
|
+
if ((0, import_util.isErrorOfName)(e, "ContractFunctionExecutionError")) {
|
|
1103
1112
|
const contract = getTypedContract(client, import_viem4.erc20Abi_bytes32, contractAddress);
|
|
1104
1113
|
var [bytesSymbol, decimals, nameSymbol] = await Promise.all([
|
|
1105
1114
|
contract.read.symbol(),
|
|
@@ -1316,21 +1325,30 @@ var fetchBalances2 = async ({
|
|
|
1316
1325
|
}
|
|
1317
1326
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
1318
1327
|
if (client.chain?.contracts?.multicall3 && balanceDefs.length > 1) {
|
|
1319
|
-
|
|
1320
|
-
|
|
1328
|
+
try {
|
|
1329
|
+
return await fetchWithMulticall(
|
|
1330
|
+
client,
|
|
1331
|
+
balanceDefs,
|
|
1332
|
+
client.chain.contracts.multicall3.address
|
|
1333
|
+
);
|
|
1334
|
+
} catch {
|
|
1335
|
+
}
|
|
1321
1336
|
}
|
|
1322
|
-
return
|
|
1337
|
+
return fetchWithGetBalance(client, balanceDefs);
|
|
1323
1338
|
};
|
|
1324
|
-
var
|
|
1339
|
+
var fetchWithGetBalance = async (client, balanceDefs) => {
|
|
1325
1340
|
if (balanceDefs.length === 0) return { success: [], errors: [] };
|
|
1326
1341
|
const results = await Promise.allSettled(
|
|
1327
1342
|
balanceDefs.map(async ({ token, address }) => {
|
|
1328
1343
|
try {
|
|
1329
|
-
const result = await client.
|
|
1344
|
+
const result = await client.request({
|
|
1345
|
+
method: "eth_getBalance",
|
|
1346
|
+
params: [address, "latest"]
|
|
1347
|
+
});
|
|
1330
1348
|
const balance = {
|
|
1331
1349
|
address,
|
|
1332
1350
|
tokenId: token.id,
|
|
1333
|
-
value: result.toString(),
|
|
1351
|
+
value: BigInt(result).toString(),
|
|
1334
1352
|
source: MODULE_TYPE2,
|
|
1335
1353
|
networkId: (0, import_chaindata_provider8.parseTokenId)(token.id).networkId,
|
|
1336
1354
|
status: "live"
|
|
@@ -1364,55 +1382,28 @@ var fetchWithoutMulticall = async (client, balanceDefs) => {
|
|
|
1364
1382
|
};
|
|
1365
1383
|
var fetchWithMulticall = async (client, balanceDefs, multicall3Address) => {
|
|
1366
1384
|
if (balanceDefs.length === 0) return { success: [], errors: [] };
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
acc.errors.push({
|
|
1390
|
-
tokenId: balanceDefs[index].token.id,
|
|
1391
|
-
address: balanceDefs[index].address,
|
|
1392
|
-
error: new BalanceFetchError(
|
|
1393
|
-
`Failed to get balance for token ${balanceDefs[index].token.id} and address ${balanceDefs[index].address} on chain ${client.chain?.id}`,
|
|
1394
|
-
balanceDefs[index].token.id,
|
|
1395
|
-
balanceDefs[index].address,
|
|
1396
|
-
result.error
|
|
1397
|
-
)
|
|
1398
|
-
});
|
|
1399
|
-
}
|
|
1400
|
-
return acc;
|
|
1401
|
-
},
|
|
1402
|
-
{ success: [], errors: [] }
|
|
1403
|
-
);
|
|
1404
|
-
} catch (err) {
|
|
1405
|
-
const errors = balanceDefs.map((balanceDef) => ({
|
|
1406
|
-
tokenId: balanceDef.token.id,
|
|
1407
|
-
address: balanceDef.address,
|
|
1408
|
-
error: new BalanceFetchNetworkError(
|
|
1409
|
-
`Failed to get balances for evm-erc20 tokens on chain ${client.chain?.id}`,
|
|
1410
|
-
String(client.chain?.id),
|
|
1411
|
-
err
|
|
1412
|
-
)
|
|
1413
|
-
}));
|
|
1414
|
-
return { success: [], errors };
|
|
1415
|
-
}
|
|
1385
|
+
const results = await client.multicall({
|
|
1386
|
+
allowFailure: false,
|
|
1387
|
+
contracts: balanceDefs.map(({ address }) => ({
|
|
1388
|
+
address: multicall3Address,
|
|
1389
|
+
abi: abiMulticall,
|
|
1390
|
+
functionName: "getEthBalance",
|
|
1391
|
+
args: [address]
|
|
1392
|
+
}))
|
|
1393
|
+
});
|
|
1394
|
+
return {
|
|
1395
|
+
success: results.map(
|
|
1396
|
+
(value, index) => ({
|
|
1397
|
+
address: balanceDefs[index].address,
|
|
1398
|
+
tokenId: balanceDefs[index].token.id,
|
|
1399
|
+
value: String(value),
|
|
1400
|
+
source: MODULE_TYPE2,
|
|
1401
|
+
networkId: (0, import_chaindata_provider8.parseTokenId)(balanceDefs[index].token.id).networkId,
|
|
1402
|
+
status: "live"
|
|
1403
|
+
})
|
|
1404
|
+
),
|
|
1405
|
+
errors: []
|
|
1406
|
+
};
|
|
1416
1407
|
};
|
|
1417
1408
|
|
|
1418
1409
|
// src/modules/evm-native/fetchTokens.ts
|
|
@@ -1530,7 +1521,6 @@ var PLATFORM3 = import_chaindata_provider11.EvmUniswapV2TokenSchema.shape.platfo
|
|
|
1530
1521
|
// src/modules/evm-uniswapv2/fetchBalances.ts
|
|
1531
1522
|
var import_chaindata_provider12 = require("@talismn/chaindata-provider");
|
|
1532
1523
|
var import_crypto5 = require("@talismn/crypto");
|
|
1533
|
-
var import_bignumber = __toESM(require("bignumber.js"));
|
|
1534
1524
|
var import_lodash_es5 = require("lodash-es");
|
|
1535
1525
|
var import_viem6 = require("viem");
|
|
1536
1526
|
var fetchBalances3 = async ({
|
|
@@ -1622,7 +1612,7 @@ var fetchPoolBalances = async (client, balanceDefs) => {
|
|
|
1622
1612
|
label,
|
|
1623
1613
|
amount
|
|
1624
1614
|
});
|
|
1625
|
-
const ratio = (
|
|
1615
|
+
const ratio = configureBigNumber_default(String(balance)).div(totalSupply === 0n ? "1" : String(totalSupply));
|
|
1626
1616
|
acc.success.push({
|
|
1627
1617
|
address,
|
|
1628
1618
|
tokenId: token.id,
|
|
@@ -1651,6 +1641,7 @@ var import_lodash_es6 = require("lodash-es");
|
|
|
1651
1641
|
var import_v44 = __toESM(require("zod/v4"));
|
|
1652
1642
|
|
|
1653
1643
|
// src/modules/evm-uniswapv2/utils.ts
|
|
1644
|
+
var import_util2 = require("@talismn/util");
|
|
1654
1645
|
var import_viem7 = require("viem");
|
|
1655
1646
|
var getErc20ContractData2 = async (client, contractAddress) => {
|
|
1656
1647
|
try {
|
|
@@ -1661,7 +1652,7 @@ var getErc20ContractData2 = async (client, contractAddress) => {
|
|
|
1661
1652
|
contract.read.name()
|
|
1662
1653
|
]);
|
|
1663
1654
|
} catch (e) {
|
|
1664
|
-
if (e
|
|
1655
|
+
if ((0, import_util2.isErrorOfName)(e, "ContractFunctionExecutionError")) {
|
|
1665
1656
|
const contract = getTypedContract2(client, import_viem7.erc20Abi_bytes32, contractAddress);
|
|
1666
1657
|
var [bytesSymbol, decimals, nameSymbol] = await Promise.all([
|
|
1667
1658
|
contract.read.symbol(),
|
|
@@ -1901,8 +1892,8 @@ var fetchBalances4 = async ({
|
|
|
1901
1892
|
const results = await Promise.allSettled(
|
|
1902
1893
|
balanceDefs.map(async ({ token, address }) => {
|
|
1903
1894
|
try {
|
|
1904
|
-
const
|
|
1905
|
-
const lamports = await connection.getBalance(
|
|
1895
|
+
const publicKey3 = new import_web3.PublicKey(address);
|
|
1896
|
+
const lamports = await connection.getBalance(publicKey3);
|
|
1906
1897
|
return {
|
|
1907
1898
|
address,
|
|
1908
1899
|
tokenId: token.id,
|
|
@@ -2055,9 +2046,9 @@ var MODULE_TYPE5 = import_chaindata_provider19.SolSplTokenSchema.shape.type.valu
|
|
|
2055
2046
|
var PLATFORM5 = import_chaindata_provider19.SolSplTokenSchema.shape.platform.value;
|
|
2056
2047
|
|
|
2057
2048
|
// src/modules/sol-spl/fetchBalances.ts
|
|
2058
|
-
var
|
|
2059
|
-
var
|
|
2060
|
-
var
|
|
2049
|
+
var import_web34 = require("@solana/web3.js");
|
|
2050
|
+
var import_chaindata_provider22 = require("@talismn/chaindata-provider");
|
|
2051
|
+
var import_util4 = require("@talismn/util");
|
|
2061
2052
|
var import_lodash_es12 = require("lodash-es");
|
|
2062
2053
|
|
|
2063
2054
|
// src/modules/shared/buildNetworkStorageCoders.ts
|
|
@@ -2095,9 +2086,9 @@ var buildNetworkStorageCoders = (chainId, miniMetadata, coders) => {
|
|
|
2095
2086
|
|
|
2096
2087
|
// src/modules/shared/fetchRuntimeCallResult.ts
|
|
2097
2088
|
var import_scale2 = require("@talismn/scale");
|
|
2098
|
-
var fetchRuntimeCallResult = async (connector, networkId,
|
|
2089
|
+
var fetchRuntimeCallResult = async (connector, networkId, metadataRpcOrBuilder, apiName, method, args) => {
|
|
2099
2090
|
try {
|
|
2100
|
-
const
|
|
2091
|
+
const builder = typeof metadataRpcOrBuilder === "string" ? (0, import_scale2.parseMetadataRpc)(metadataRpcOrBuilder).builder : metadataRpcOrBuilder;
|
|
2101
2092
|
const call = builder.buildRuntimeCall(apiName, method);
|
|
2102
2093
|
const hex = await connector.send(networkId, "state_call", [
|
|
2103
2094
|
`${apiName}_${method}`,
|
|
@@ -2112,11 +2103,11 @@ var fetchRuntimeCallResult = async (connector, networkId, metadataRpc, apiName,
|
|
|
2112
2103
|
};
|
|
2113
2104
|
|
|
2114
2105
|
// src/modules/shared/rpcQueryPack.ts
|
|
2115
|
-
var
|
|
2106
|
+
var import_util3 = require("@talismn/util");
|
|
2116
2107
|
var import_lodash_es10 = require("lodash-es");
|
|
2117
2108
|
var import_rxjs5 = require("rxjs");
|
|
2118
2109
|
var fetchRpcQueryPack = async (connector, networkId, queries) => {
|
|
2119
|
-
const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(
|
|
2110
|
+
const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(import_util3.isNotNil);
|
|
2120
2111
|
if (!allStateKeys.length)
|
|
2121
2112
|
return queries.map(({ stateKeys, decodeResult }) => decodeResult(stateKeys.map(() => null)));
|
|
2122
2113
|
const [result] = await connector.send(networkId, "state_queryStorageAt", [
|
|
@@ -2125,7 +2116,7 @@ var fetchRpcQueryPack = async (connector, networkId, queries) => {
|
|
|
2125
2116
|
return decodeRpcQueryPack(queries, result);
|
|
2126
2117
|
};
|
|
2127
2118
|
var getRpcQueryPack$ = (connector, networkId, queries, timeout = false) => {
|
|
2128
|
-
const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(
|
|
2119
|
+
const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(import_util3.isNotNil);
|
|
2129
2120
|
if (!allStateKeys.length)
|
|
2130
2121
|
return (0, import_rxjs5.of)(queries.map(({ stateKeys, decodeResult }) => decodeResult(stateKeys.map(() => null))));
|
|
2131
2122
|
return new import_rxjs5.Observable((subscriber) => {
|
|
@@ -2168,17 +2159,17 @@ var decodeRpcQueryPack = (queries, result) => {
|
|
|
2168
2159
|
var import_scale3 = require("@talismn/scale");
|
|
2169
2160
|
var hasStorageItem = (metadata, palletName, itemName) => {
|
|
2170
2161
|
const pallet = metadata.pallets.find((p) => p.name === palletName);
|
|
2171
|
-
if (!pallet
|
|
2162
|
+
if (!pallet?.storage) return false;
|
|
2172
2163
|
return pallet.storage.items.some((item) => item.name === itemName);
|
|
2173
2164
|
};
|
|
2174
2165
|
var hasStorageItems = (metadata, palletName, itemNames) => {
|
|
2175
2166
|
const pallet = metadata.pallets.find((p) => p.name === palletName);
|
|
2176
|
-
if (!pallet
|
|
2167
|
+
if (!pallet?.storage) return false;
|
|
2177
2168
|
return itemNames.every((itemName) => pallet.storage?.items.some((item) => item.name === itemName));
|
|
2178
2169
|
};
|
|
2179
2170
|
var hasRuntimeApi = (metadata, apiName, method) => {
|
|
2180
2171
|
const api = metadata.apis.find((api2) => api2.name === apiName);
|
|
2181
|
-
if (!api
|
|
2172
|
+
if (!api?.methods) return false;
|
|
2182
2173
|
return api.methods.some((m) => m.name === method);
|
|
2183
2174
|
};
|
|
2184
2175
|
var getConstantValue = (metadataRpc, pallet, constant) => {
|
|
@@ -2213,8 +2204,77 @@ var getDetectedTokensIds$ = (address) => tokenIdsByAddress.pipe(
|
|
|
2213
2204
|
(0, import_rxjs6.distinctUntilChanged)(import_lodash_es11.isEqual)
|
|
2214
2205
|
);
|
|
2215
2206
|
|
|
2207
|
+
// src/modules/sol-spl/onChainTokenMetadata.ts
|
|
2208
|
+
var import_mpl_token_metadata = require("@metaplex-foundation/mpl-token-metadata");
|
|
2209
|
+
var import_umi = require("@metaplex-foundation/umi");
|
|
2210
|
+
var import_spl_token = require("@solana/spl-token");
|
|
2211
|
+
var import_web33 = require("@solana/web3.js");
|
|
2212
|
+
var import_chaindata_provider21 = require("@talismn/chaindata-provider");
|
|
2213
|
+
var import_v47 = __toESM(require("zod/v4"));
|
|
2214
|
+
var TokenCacheSchema3 = import_v47.default.discriminatedUnion("isValid", [
|
|
2215
|
+
import_v47.default.strictObject({
|
|
2216
|
+
id: import_chaindata_provider21.SolSplTokenSchema.shape.id,
|
|
2217
|
+
isValid: import_v47.default.literal(true),
|
|
2218
|
+
...import_chaindata_provider21.SolSplTokenSchema.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
|
|
2219
|
+
}),
|
|
2220
|
+
import_v47.default.strictObject({
|
|
2221
|
+
id: import_chaindata_provider21.SolSplTokenSchema.shape.id,
|
|
2222
|
+
isValid: import_v47.default.literal(false)
|
|
2223
|
+
})
|
|
2224
|
+
]);
|
|
2225
|
+
var METAPLEX_PROGRAM_ID = new import_web33.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
|
|
2226
|
+
var ERROR_NO_MINT = "No mint info available";
|
|
2227
|
+
var ERROR_NO_METADATA = "No metadata account found";
|
|
2228
|
+
var ERROR_INVALID_DATA = "Invalid on-chain data";
|
|
2229
|
+
var fetchOnChainTokenData = async (connector, tokenId) => {
|
|
2230
|
+
try {
|
|
2231
|
+
const { networkId, mintAddress } = (0, import_chaindata_provider21.parseSolSplTokenId)(tokenId);
|
|
2232
|
+
const connection = await connector.getConnection(networkId);
|
|
2233
|
+
if (!connection) {
|
|
2234
|
+
log_default.warn(`No connection found for network ${networkId}`);
|
|
2235
|
+
return null;
|
|
2236
|
+
}
|
|
2237
|
+
const mintPubKey = new import_web33.PublicKey(mintAddress);
|
|
2238
|
+
const mintInfo = await connection.getAccountInfo(mintPubKey);
|
|
2239
|
+
if (!mintInfo?.data) throw new Error(ERROR_NO_MINT);
|
|
2240
|
+
const mint = import_spl_token.MintLayout.decode(mintInfo.data);
|
|
2241
|
+
const [metadataPDA] = import_web33.PublicKey.findProgramAddressSync(
|
|
2242
|
+
[Buffer.from("metadata"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],
|
|
2243
|
+
METAPLEX_PROGRAM_ID
|
|
2244
|
+
);
|
|
2245
|
+
const metadataAccount = await connection.getAccountInfo(new import_web33.PublicKey(metadataPDA));
|
|
2246
|
+
if (!metadataAccount) throw new Error(ERROR_NO_METADATA);
|
|
2247
|
+
const metadata = (0, import_mpl_token_metadata.deserializeMetadata)({
|
|
2248
|
+
publicKey: (0, import_umi.publicKey)(metadataPDA),
|
|
2249
|
+
executable: metadataAccount.executable,
|
|
2250
|
+
owner: (0, import_umi.publicKey)(metadataAccount.owner),
|
|
2251
|
+
lamports: (0, import_umi.sol)(metadataAccount.lamports),
|
|
2252
|
+
data: metadataAccount.data
|
|
2253
|
+
});
|
|
2254
|
+
const parsed = TokenCacheSchema3.safeParse({
|
|
2255
|
+
id: tokenId,
|
|
2256
|
+
symbol: metadata.symbol.trim(),
|
|
2257
|
+
name: metadata.name.trim(),
|
|
2258
|
+
decimals: mint.decimals,
|
|
2259
|
+
isValid: true
|
|
2260
|
+
});
|
|
2261
|
+
if (!parsed.success) throw new Error(ERROR_INVALID_DATA);
|
|
2262
|
+
return parsed.data;
|
|
2263
|
+
} catch (err) {
|
|
2264
|
+
const msg = err.message;
|
|
2265
|
+
if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))
|
|
2266
|
+
return TokenCacheSchema3.parse({
|
|
2267
|
+
id: tokenId,
|
|
2268
|
+
isValid: false
|
|
2269
|
+
});
|
|
2270
|
+
log_default.warn("Failed to fetch sol-spl token data for %s", tokenId, { err });
|
|
2271
|
+
}
|
|
2272
|
+
return null;
|
|
2273
|
+
};
|
|
2274
|
+
|
|
2216
2275
|
// src/modules/sol-spl/fetchBalances.ts
|
|
2217
2276
|
var SPL_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
|
|
2277
|
+
var dynamicTokenMetadataCache = /* @__PURE__ */ new Map();
|
|
2218
2278
|
var fetchBalances5 = async ({
|
|
2219
2279
|
networkId,
|
|
2220
2280
|
tokensWithAddresses,
|
|
@@ -2224,18 +2284,22 @@ var fetchBalances5 = async ({
|
|
|
2224
2284
|
const connection = await connector.getConnection(networkId);
|
|
2225
2285
|
if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
|
|
2226
2286
|
const accountAddresses = (0, import_lodash_es12.uniq)(tokensWithAddresses.flatMap(([, addresses]) => addresses));
|
|
2287
|
+
const knownTokenIds = new Set(tokensWithAddresses.map(([token]) => token.id));
|
|
2288
|
+
const unknownMints = /* @__PURE__ */ new Set();
|
|
2227
2289
|
const balancesPerAddress = await Promise.all(
|
|
2228
2290
|
accountAddresses.map(async (address) => {
|
|
2229
|
-
const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new
|
|
2230
|
-
programId: new
|
|
2291
|
+
const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new import_web34.PublicKey(address), {
|
|
2292
|
+
programId: new import_web34.PublicKey(SPL_PROGRAM_ID)
|
|
2231
2293
|
// SPL Token Program ID
|
|
2232
2294
|
});
|
|
2233
2295
|
const balances = tokenAccounts.value.map((d) => {
|
|
2234
2296
|
try {
|
|
2235
2297
|
const mintAddress = d.account.data.parsed.info.mint;
|
|
2236
2298
|
const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
|
|
2299
|
+
const tokenId = (0, import_chaindata_provider22.solSplTokenId)(networkId, mintAddress);
|
|
2300
|
+
if (!knownTokenIds.has(tokenId) && value !== "0") unknownMints.add(mintAddress);
|
|
2237
2301
|
return {
|
|
2238
|
-
tokenId
|
|
2302
|
+
tokenId,
|
|
2239
2303
|
networkId,
|
|
2240
2304
|
address,
|
|
2241
2305
|
source: MODULE_TYPE5,
|
|
@@ -2249,7 +2313,7 @@ var fetchBalances5 = async ({
|
|
|
2249
2313
|
});
|
|
2250
2314
|
return null;
|
|
2251
2315
|
}
|
|
2252
|
-
}).filter(
|
|
2316
|
+
}).filter(import_util4.isNotNil);
|
|
2253
2317
|
setDetectedTokenIds(
|
|
2254
2318
|
address,
|
|
2255
2319
|
MODULE_TYPE5,
|
|
@@ -2258,6 +2322,42 @@ var fetchBalances5 = async ({
|
|
|
2258
2322
|
return [address, balances];
|
|
2259
2323
|
})
|
|
2260
2324
|
);
|
|
2325
|
+
const dynamicTokens = [];
|
|
2326
|
+
if (unknownMints.size) {
|
|
2327
|
+
await Promise.all(
|
|
2328
|
+
Array.from(unknownMints).map(async (mintAddress) => {
|
|
2329
|
+
const tokenId = (0, import_chaindata_provider22.solSplTokenId)(networkId, mintAddress);
|
|
2330
|
+
let cached = dynamicTokenMetadataCache.get(tokenId);
|
|
2331
|
+
if (!cached) {
|
|
2332
|
+
const fetched = await fetchOnChainTokenData(connector, tokenId);
|
|
2333
|
+
if (fetched) {
|
|
2334
|
+
dynamicTokenMetadataCache.set(tokenId, fetched);
|
|
2335
|
+
cached = fetched;
|
|
2336
|
+
}
|
|
2337
|
+
}
|
|
2338
|
+
if (!cached?.isValid) return;
|
|
2339
|
+
const token = {
|
|
2340
|
+
id: tokenId,
|
|
2341
|
+
type: MODULE_TYPE5,
|
|
2342
|
+
platform: PLATFORM5,
|
|
2343
|
+
networkId,
|
|
2344
|
+
mintAddress,
|
|
2345
|
+
isDefault: true,
|
|
2346
|
+
symbol: cached.symbol,
|
|
2347
|
+
decimals: cached.decimals,
|
|
2348
|
+
...cached.name !== void 0 ? { name: cached.name } : {},
|
|
2349
|
+
...cached.logo !== void 0 ? { logo: cached.logo } : {}
|
|
2350
|
+
};
|
|
2351
|
+
const parsed = import_chaindata_provider22.SolSplTokenSchema.safeParse(token);
|
|
2352
|
+
if (!parsed.success) {
|
|
2353
|
+
log_default.warn("Ignoring dynamic sol-spl token with invalid schema", { token });
|
|
2354
|
+
return;
|
|
2355
|
+
}
|
|
2356
|
+
dynamicTokens.push(parsed.data);
|
|
2357
|
+
})
|
|
2358
|
+
);
|
|
2359
|
+
}
|
|
2360
|
+
const registeredDynamicIds = new Set(dynamicTokens.map((t) => t.id));
|
|
2261
2361
|
const allBalancesByKey = (0, import_lodash_es12.keyBy)(
|
|
2262
2362
|
balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),
|
|
2263
2363
|
(b) => getBalanceKey(b.tokenId, b.address)
|
|
@@ -2274,30 +2374,16 @@ var fetchBalances5 = async ({
|
|
|
2274
2374
|
value: "0"
|
|
2275
2375
|
};
|
|
2276
2376
|
});
|
|
2277
|
-
|
|
2377
|
+
for (const balance of balancesPerAddress.flatMap(([, addressBalances]) => addressBalances)) {
|
|
2378
|
+
if (registeredDynamicIds.has(balance.tokenId)) success.push(balance);
|
|
2379
|
+
}
|
|
2380
|
+
return { success, errors: [], dynamicTokens };
|
|
2278
2381
|
};
|
|
2279
2382
|
var getBalanceKey = (tokenId, address) => `${tokenId}:${address}`;
|
|
2280
2383
|
|
|
2281
2384
|
// src/modules/sol-spl/fetchTokens.ts
|
|
2282
|
-
var
|
|
2283
|
-
var import_umi = require("@metaplex-foundation/umi");
|
|
2284
|
-
var import_spl_token = require("@solana/spl-token");
|
|
2285
|
-
var import_web34 = require("@solana/web3.js");
|
|
2286
|
-
var import_chaindata_provider22 = require("@talismn/chaindata-provider");
|
|
2385
|
+
var import_chaindata_provider23 = require("@talismn/chaindata-provider");
|
|
2287
2386
|
var import_lodash_es13 = require("lodash-es");
|
|
2288
|
-
var import_v47 = __toESM(require("zod/v4"));
|
|
2289
|
-
var TokenCacheSchema3 = import_v47.default.discriminatedUnion("isValid", [
|
|
2290
|
-
import_v47.default.strictObject({
|
|
2291
|
-
id: import_chaindata_provider22.SolSplTokenSchema.shape.id,
|
|
2292
|
-
isValid: import_v47.default.literal(true),
|
|
2293
|
-
...import_chaindata_provider22.SolSplTokenSchema.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
|
|
2294
|
-
}),
|
|
2295
|
-
import_v47.default.strictObject({
|
|
2296
|
-
id: import_chaindata_provider22.SolSplTokenSchema.shape.id,
|
|
2297
|
-
isValid: import_v47.default.literal(false)
|
|
2298
|
-
})
|
|
2299
|
-
]);
|
|
2300
|
-
var METAPLEX_PROGRAM_ID = new import_web34.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
|
|
2301
2387
|
var fetchTokens5 = async ({
|
|
2302
2388
|
networkId,
|
|
2303
2389
|
tokens,
|
|
@@ -2306,7 +2392,7 @@ var fetchTokens5 = async ({
|
|
|
2306
2392
|
}) => {
|
|
2307
2393
|
const result = [];
|
|
2308
2394
|
for (const tokenConfig of tokens) {
|
|
2309
|
-
const tokenId = (0,
|
|
2395
|
+
const tokenId = (0, import_chaindata_provider23.solSplTokenId)(networkId, tokenConfig.mintAddress);
|
|
2310
2396
|
let cached = cache[tokenId] && TokenCacheSchema3.safeParse(cache[tokenId]).data;
|
|
2311
2397
|
if (!cached) {
|
|
2312
2398
|
const tokenInfo = await fetchOnChainTokenData(connector, tokenId);
|
|
@@ -2325,7 +2411,7 @@ var fetchTokens5 = async ({
|
|
|
2325
2411
|
cached?.isValid ? (0, import_lodash_es13.omit)(cached, ["isValid"]) : {},
|
|
2326
2412
|
tokenConfig
|
|
2327
2413
|
);
|
|
2328
|
-
const parsed =
|
|
2414
|
+
const parsed = import_chaindata_provider23.SolSplTokenSchema.safeParse(token);
|
|
2329
2415
|
if (!parsed.success) {
|
|
2330
2416
|
log_default.warn("Ignoring token with invalid SolSplTokenSchema", {
|
|
2331
2417
|
token
|
|
@@ -2336,54 +2422,6 @@ var fetchTokens5 = async ({
|
|
|
2336
2422
|
}
|
|
2337
2423
|
return result;
|
|
2338
2424
|
};
|
|
2339
|
-
var ERROR_NO_MINT = "No mint info available";
|
|
2340
|
-
var ERROR_NO_METADATA = "No metadata account found";
|
|
2341
|
-
var ERROR_INVALID_DATA = "Invalid on-chain data";
|
|
2342
|
-
var fetchOnChainTokenData = async (connector, tokenId) => {
|
|
2343
|
-
try {
|
|
2344
|
-
const { networkId, mintAddress } = (0, import_chaindata_provider22.parseSolSplTokenId)(tokenId);
|
|
2345
|
-
const connection = await connector.getConnection(networkId);
|
|
2346
|
-
if (!connection) {
|
|
2347
|
-
log_default.warn(`No connection found for network ${networkId}`);
|
|
2348
|
-
return null;
|
|
2349
|
-
}
|
|
2350
|
-
const mintPubKey = new import_web34.PublicKey(mintAddress);
|
|
2351
|
-
const mintInfo = await connection.getAccountInfo(mintPubKey);
|
|
2352
|
-
if (!mintInfo?.data) throw new Error(ERROR_NO_MINT);
|
|
2353
|
-
const mint = import_spl_token.MintLayout.decode(mintInfo.data);
|
|
2354
|
-
const [metadataPDA] = import_web34.PublicKey.findProgramAddressSync(
|
|
2355
|
-
[Buffer.from("metadata"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],
|
|
2356
|
-
METAPLEX_PROGRAM_ID
|
|
2357
|
-
);
|
|
2358
|
-
const metadataAccount = await connection.getAccountInfo(new import_web34.PublicKey(metadataPDA));
|
|
2359
|
-
if (!metadataAccount) throw new Error(ERROR_NO_METADATA);
|
|
2360
|
-
const metadata = (0, import_mpl_token_metadata.deserializeMetadata)({
|
|
2361
|
-
publicKey: (0, import_umi.publicKey)(metadataPDA),
|
|
2362
|
-
executable: metadataAccount.executable,
|
|
2363
|
-
owner: (0, import_umi.publicKey)(metadataAccount.owner),
|
|
2364
|
-
lamports: (0, import_umi.sol)(metadataAccount.lamports),
|
|
2365
|
-
data: metadataAccount.data
|
|
2366
|
-
});
|
|
2367
|
-
const parsed = TokenCacheSchema3.safeParse({
|
|
2368
|
-
id: tokenId,
|
|
2369
|
-
symbol: metadata.symbol.trim(),
|
|
2370
|
-
name: metadata.name.trim(),
|
|
2371
|
-
decimals: mint.decimals,
|
|
2372
|
-
isValid: true
|
|
2373
|
-
});
|
|
2374
|
-
if (!parsed.success) throw new Error(ERROR_INVALID_DATA);
|
|
2375
|
-
return parsed.data;
|
|
2376
|
-
} catch (err) {
|
|
2377
|
-
const msg = err.message;
|
|
2378
|
-
if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))
|
|
2379
|
-
return TokenCacheSchema3.parse({
|
|
2380
|
-
id: tokenId,
|
|
2381
|
-
isValid: false
|
|
2382
|
-
});
|
|
2383
|
-
log_default.warn("Failed to fetch sol-spl token data for %s", tokenId, { err });
|
|
2384
|
-
}
|
|
2385
|
-
return null;
|
|
2386
|
-
};
|
|
2387
2425
|
|
|
2388
2426
|
// src/modules/sol-spl/getMiniMetadata.ts
|
|
2389
2427
|
var getMiniMetadata5 = () => {
|
|
@@ -2393,9 +2431,9 @@ var getMiniMetadata5 = () => {
|
|
|
2393
2431
|
// src/modules/sol-spl/getTransferCallData.ts
|
|
2394
2432
|
var import_spl_token2 = require("@solana/spl-token");
|
|
2395
2433
|
var import_web35 = require("@solana/web3.js");
|
|
2396
|
-
var
|
|
2434
|
+
var import_chaindata_provider24 = require("@talismn/chaindata-provider");
|
|
2397
2435
|
var getTransferCallData5 = async ({ from: from2, to, value, token, connector }) => {
|
|
2398
|
-
if (!(0,
|
|
2436
|
+
if (!(0, import_chaindata_provider24.isTokenOfType)(token, MODULE_TYPE5))
|
|
2399
2437
|
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE5}.`);
|
|
2400
2438
|
const connection = await connector.getConnection(token.networkId);
|
|
2401
2439
|
const instructions = [];
|
|
@@ -2488,81 +2526,536 @@ var SolSplBalanceModule = {
|
|
|
2488
2526
|
};
|
|
2489
2527
|
|
|
2490
2528
|
// src/modules/sol-spl/types.ts
|
|
2491
|
-
var
|
|
2529
|
+
var import_chaindata_provider25 = require("@talismn/chaindata-provider");
|
|
2492
2530
|
var import_v48 = __toESM(require("zod/v4"));
|
|
2493
2531
|
var SolSplTokenConfigSchema = import_v48.default.strictObject({
|
|
2494
|
-
mintAddress:
|
|
2532
|
+
mintAddress: import_chaindata_provider25.SolSplTokenSchema.shape.mintAddress,
|
|
2495
2533
|
...TokenConfigBaseSchema.shape
|
|
2496
2534
|
});
|
|
2497
2535
|
|
|
2498
|
-
// src/modules/
|
|
2499
|
-
var
|
|
2500
|
-
var MODULE_TYPE6 =
|
|
2501
|
-
var PLATFORM6 =
|
|
2536
|
+
// src/modules/sol-token2022/config.ts
|
|
2537
|
+
var import_chaindata_provider26 = require("@talismn/chaindata-provider");
|
|
2538
|
+
var MODULE_TYPE6 = import_chaindata_provider26.SolToken2022TokenSchema.shape.type.value;
|
|
2539
|
+
var PLATFORM6 = import_chaindata_provider26.SolToken2022TokenSchema.shape.platform.value;
|
|
2502
2540
|
|
|
2503
|
-
// src/modules/
|
|
2504
|
-
var
|
|
2505
|
-
var
|
|
2506
|
-
var
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2541
|
+
// src/modules/sol-token2022/fetchBalances.ts
|
|
2542
|
+
var import_web37 = require("@solana/web3.js");
|
|
2543
|
+
var import_chaindata_provider28 = require("@talismn/chaindata-provider");
|
|
2544
|
+
var import_util5 = require("@talismn/util");
|
|
2545
|
+
var import_lodash_es15 = require("lodash-es");
|
|
2546
|
+
|
|
2547
|
+
// src/modules/sol-token2022/onChainTokenMetadata.ts
|
|
2548
|
+
var import_mpl_token_metadata2 = require("@metaplex-foundation/mpl-token-metadata");
|
|
2549
|
+
var import_umi2 = require("@metaplex-foundation/umi");
|
|
2550
|
+
var import_spl_token3 = require("@solana/spl-token");
|
|
2551
|
+
var import_web36 = require("@solana/web3.js");
|
|
2552
|
+
var import_chaindata_provider27 = require("@talismn/chaindata-provider");
|
|
2553
|
+
var import_v49 = __toESM(require("zod/v4"));
|
|
2554
|
+
var TokenCacheSchema4 = import_v49.default.discriminatedUnion("isValid", [
|
|
2555
|
+
import_v49.default.strictObject({
|
|
2556
|
+
id: import_chaindata_provider27.SolToken2022TokenSchema.shape.id,
|
|
2557
|
+
isValid: import_v49.default.literal(true),
|
|
2558
|
+
...import_chaindata_provider27.SolToken2022TokenSchema.pick({ symbol: true, decimals: true, name: true, logo: true }).shape
|
|
2559
|
+
}),
|
|
2560
|
+
import_v49.default.strictObject({
|
|
2561
|
+
id: import_chaindata_provider27.SolToken2022TokenSchema.shape.id,
|
|
2562
|
+
isValid: import_v49.default.literal(false)
|
|
2563
|
+
})
|
|
2564
|
+
]);
|
|
2565
|
+
var METAPLEX_PROGRAM_ID2 = new import_web36.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
|
|
2566
|
+
var ERROR_NO_MINT2 = "No mint info available";
|
|
2567
|
+
var ERROR_NO_METADATA2 = "No metadata account found";
|
|
2568
|
+
var ERROR_INVALID_DATA2 = "Invalid on-chain data";
|
|
2569
|
+
var fetchOnChainTokenData2 = async (connector, tokenId) => {
|
|
2570
|
+
try {
|
|
2571
|
+
const { networkId, mintAddress } = (0, import_chaindata_provider27.parseSolToken2022TokenId)(tokenId);
|
|
2572
|
+
const connection = await connector.getConnection(networkId);
|
|
2573
|
+
if (!connection) {
|
|
2574
|
+
log_default.warn(`No connection found for network ${networkId}`);
|
|
2518
2575
|
return null;
|
|
2519
2576
|
}
|
|
2520
|
-
const
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2577
|
+
const mintPubKey = new import_web36.PublicKey(mintAddress);
|
|
2578
|
+
const mintInfo = await connection.getAccountInfo(mintPubKey);
|
|
2579
|
+
if (!mintInfo?.data) throw new Error(ERROR_NO_MINT2);
|
|
2580
|
+
const mint = import_spl_token3.MintLayout.decode(mintInfo.data);
|
|
2581
|
+
const token2022Metadata = tryParseToken2022Metadata(mintInfo.data);
|
|
2582
|
+
if (token2022Metadata) {
|
|
2583
|
+
const parsed2 = TokenCacheSchema4.safeParse({
|
|
2584
|
+
id: tokenId,
|
|
2585
|
+
symbol: token2022Metadata.symbol.trim(),
|
|
2586
|
+
name: token2022Metadata.name.trim(),
|
|
2587
|
+
decimals: mint.decimals,
|
|
2588
|
+
isValid: true
|
|
2589
|
+
});
|
|
2590
|
+
if (parsed2.success) return parsed2.data;
|
|
2591
|
+
}
|
|
2592
|
+
const [metadataPDA] = import_web36.PublicKey.findProgramAddressSync(
|
|
2593
|
+
[Buffer.from("metadata"), METAPLEX_PROGRAM_ID2.toBuffer(), mintPubKey.toBuffer()],
|
|
2594
|
+
METAPLEX_PROGRAM_ID2
|
|
2595
|
+
);
|
|
2596
|
+
const metadataAccount = await connection.getAccountInfo(new import_web36.PublicKey(metadataPDA));
|
|
2597
|
+
if (!metadataAccount) throw new Error(ERROR_NO_METADATA2);
|
|
2598
|
+
const metadata = (0, import_mpl_token_metadata2.deserializeMetadata)({
|
|
2599
|
+
publicKey: (0, import_umi2.publicKey)(metadataPDA),
|
|
2600
|
+
executable: metadataAccount.executable,
|
|
2601
|
+
owner: (0, import_umi2.publicKey)(metadataAccount.owner),
|
|
2602
|
+
lamports: (0, import_umi2.sol)(metadataAccount.lamports),
|
|
2603
|
+
data: metadataAccount.data
|
|
2604
|
+
});
|
|
2605
|
+
const parsed = TokenCacheSchema4.safeParse({
|
|
2606
|
+
id: tokenId,
|
|
2607
|
+
symbol: metadata.symbol.trim(),
|
|
2608
|
+
name: metadata.name.trim(),
|
|
2609
|
+
decimals: mint.decimals,
|
|
2610
|
+
isValid: true
|
|
2611
|
+
});
|
|
2612
|
+
if (!parsed.success) throw new Error(ERROR_INVALID_DATA2);
|
|
2613
|
+
return parsed.data;
|
|
2614
|
+
} catch (err) {
|
|
2615
|
+
const msg = err.message;
|
|
2616
|
+
if ([ERROR_NO_MINT2, ERROR_NO_METADATA2, ERROR_INVALID_DATA2].includes(msg))
|
|
2617
|
+
return TokenCacheSchema4.parse({
|
|
2618
|
+
id: tokenId,
|
|
2619
|
+
isValid: false
|
|
2620
|
+
});
|
|
2621
|
+
log_default.warn("Failed to fetch sol-token2022 token data for %s", tokenId, { err });
|
|
2622
|
+
}
|
|
2623
|
+
return null;
|
|
2624
|
+
};
|
|
2625
|
+
var tryParseToken2022Metadata = (data) => {
|
|
2626
|
+
try {
|
|
2627
|
+
const TLV_START = 166;
|
|
2628
|
+
if (data.length <= TLV_START) return null;
|
|
2629
|
+
let offset = TLV_START;
|
|
2630
|
+
while (offset + 4 <= data.length) {
|
|
2631
|
+
const extType = data.readUInt16LE(offset);
|
|
2632
|
+
const extLen = data.readUInt16LE(offset + 2);
|
|
2633
|
+
const extDataStart = offset + 4;
|
|
2634
|
+
if (extType === 19 && extDataStart + extLen <= data.length) {
|
|
2635
|
+
let pos = extDataStart;
|
|
2636
|
+
pos += 64;
|
|
2637
|
+
const readLenPrefixed = () => {
|
|
2638
|
+
if (pos + 4 > data.length) throw new Error("out of bounds");
|
|
2639
|
+
const len = data.readUInt32LE(pos);
|
|
2640
|
+
pos += 4;
|
|
2641
|
+
if (pos + len > data.length) throw new Error("out of bounds");
|
|
2642
|
+
const str = data.subarray(pos, pos + len).toString("utf8");
|
|
2643
|
+
pos += len;
|
|
2644
|
+
return str;
|
|
2645
|
+
};
|
|
2646
|
+
const name = readLenPrefixed();
|
|
2647
|
+
const symbol = readLenPrefixed();
|
|
2648
|
+
const uri = readLenPrefixed();
|
|
2649
|
+
if (name && symbol) return { name, symbol, uri };
|
|
2650
|
+
}
|
|
2651
|
+
offset = extDataStart + extLen;
|
|
2652
|
+
}
|
|
2653
|
+
} catch {
|
|
2654
|
+
}
|
|
2655
|
+
return null;
|
|
2656
|
+
};
|
|
2657
|
+
|
|
2658
|
+
// src/modules/sol-token2022/fetchBalances.ts
|
|
2659
|
+
var TOKEN_2022_PROGRAM_ID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
|
|
2660
|
+
var dynamicTokenMetadataCache2 = /* @__PURE__ */ new Map();
|
|
2661
|
+
var fetchBalances6 = async ({
|
|
2662
|
+
networkId,
|
|
2663
|
+
tokensWithAddresses,
|
|
2664
|
+
connector
|
|
2665
|
+
}) => {
|
|
2666
|
+
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
2667
|
+
const connection = await connector.getConnection(networkId);
|
|
2668
|
+
if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
|
|
2669
|
+
const accountAddresses = (0, import_lodash_es15.uniq)(tokensWithAddresses.flatMap(([, addresses]) => addresses));
|
|
2670
|
+
const knownTokenIds = new Set(tokensWithAddresses.map(([token]) => token.id));
|
|
2671
|
+
const unknownMints = /* @__PURE__ */ new Set();
|
|
2672
|
+
const balancesPerAddress = await Promise.all(
|
|
2673
|
+
accountAddresses.map(async (address) => {
|
|
2674
|
+
const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new import_web37.PublicKey(address), {
|
|
2675
|
+
programId: new import_web37.PublicKey(TOKEN_2022_PROGRAM_ID)
|
|
2676
|
+
});
|
|
2677
|
+
const balances = tokenAccounts.value.map((d) => {
|
|
2678
|
+
try {
|
|
2679
|
+
const mintAddress = d.account.data.parsed.info.mint;
|
|
2680
|
+
const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
|
|
2681
|
+
const tokenId = (0, import_chaindata_provider28.solToken2022TokenId)(networkId, mintAddress);
|
|
2682
|
+
if (!knownTokenIds.has(tokenId) && value !== "0") unknownMints.add(mintAddress);
|
|
2683
|
+
return {
|
|
2684
|
+
tokenId,
|
|
2685
|
+
networkId,
|
|
2686
|
+
address,
|
|
2687
|
+
source: MODULE_TYPE6,
|
|
2688
|
+
status: "live",
|
|
2689
|
+
value
|
|
2690
|
+
};
|
|
2691
|
+
} catch {
|
|
2692
|
+
log_default.warn("Failed to parse token amount", {
|
|
2693
|
+
address,
|
|
2694
|
+
d
|
|
2695
|
+
});
|
|
2696
|
+
return null;
|
|
2697
|
+
}
|
|
2698
|
+
}).filter(import_util5.isNotNil);
|
|
2699
|
+
setDetectedTokenIds(
|
|
2700
|
+
address,
|
|
2701
|
+
MODULE_TYPE6,
|
|
2702
|
+
balances.map((b) => b.tokenId)
|
|
2703
|
+
);
|
|
2704
|
+
return [address, balances];
|
|
2705
|
+
})
|
|
2706
|
+
);
|
|
2707
|
+
const dynamicTokens = [];
|
|
2708
|
+
if (unknownMints.size) {
|
|
2709
|
+
await Promise.all(
|
|
2710
|
+
Array.from(unknownMints).map(async (mintAddress) => {
|
|
2711
|
+
const tokenId = (0, import_chaindata_provider28.solToken2022TokenId)(networkId, mintAddress);
|
|
2712
|
+
let cached = dynamicTokenMetadataCache2.get(tokenId);
|
|
2713
|
+
if (!cached) {
|
|
2714
|
+
const fetched = await fetchOnChainTokenData2(connector, tokenId);
|
|
2715
|
+
if (fetched) {
|
|
2716
|
+
dynamicTokenMetadataCache2.set(tokenId, fetched);
|
|
2717
|
+
cached = fetched;
|
|
2718
|
+
}
|
|
2719
|
+
}
|
|
2720
|
+
if (!cached?.isValid) return;
|
|
2721
|
+
const token = {
|
|
2722
|
+
id: tokenId,
|
|
2723
|
+
type: MODULE_TYPE6,
|
|
2724
|
+
platform: PLATFORM6,
|
|
2725
|
+
networkId,
|
|
2726
|
+
mintAddress,
|
|
2727
|
+
isDefault: true,
|
|
2728
|
+
symbol: cached.symbol,
|
|
2729
|
+
decimals: cached.decimals,
|
|
2730
|
+
...cached.name !== void 0 ? { name: cached.name } : {},
|
|
2731
|
+
...cached.logo !== void 0 ? { logo: cached.logo } : {}
|
|
2732
|
+
};
|
|
2733
|
+
const parsed = import_chaindata_provider28.SolToken2022TokenSchema.safeParse(token);
|
|
2734
|
+
if (!parsed.success) {
|
|
2735
|
+
log_default.warn("Ignoring dynamic sol-token2022 token with invalid schema", { token });
|
|
2736
|
+
return;
|
|
2737
|
+
}
|
|
2738
|
+
dynamicTokens.push(parsed.data);
|
|
2739
|
+
})
|
|
2740
|
+
);
|
|
2741
|
+
}
|
|
2742
|
+
const registeredDynamicIds = new Set(dynamicTokens.map((t) => t.id));
|
|
2743
|
+
const allBalancesByKey = (0, import_lodash_es15.keyBy)(
|
|
2744
|
+
balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),
|
|
2745
|
+
(b) => getBalanceKey2(b.tokenId, b.address)
|
|
2746
|
+
);
|
|
2747
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
2748
|
+
const success = balanceDefs.map((bd) => {
|
|
2749
|
+
const found = allBalancesByKey[getBalanceKey2(bd.token.id, bd.address)];
|
|
2750
|
+
return found ?? {
|
|
2751
|
+
tokenId: bd.token.id,
|
|
2752
|
+
networkId: bd.token.networkId,
|
|
2753
|
+
address: bd.address,
|
|
2754
|
+
source: MODULE_TYPE6,
|
|
2755
|
+
status: "live",
|
|
2756
|
+
value: "0"
|
|
2757
|
+
};
|
|
2758
|
+
});
|
|
2759
|
+
for (const balance of balancesPerAddress.flatMap(([, addressBalances]) => addressBalances)) {
|
|
2760
|
+
if (registeredDynamicIds.has(balance.tokenId)) success.push(balance);
|
|
2761
|
+
}
|
|
2762
|
+
return { success, errors: [], dynamicTokens };
|
|
2763
|
+
};
|
|
2764
|
+
var getBalanceKey2 = (tokenId, address) => `${tokenId}:${address}`;
|
|
2765
|
+
|
|
2766
|
+
// src/modules/sol-token2022/fetchTokens.ts
|
|
2767
|
+
var import_chaindata_provider29 = require("@talismn/chaindata-provider");
|
|
2768
|
+
var import_lodash_es16 = require("lodash-es");
|
|
2769
|
+
var fetchTokens6 = async ({
|
|
2770
|
+
networkId,
|
|
2771
|
+
tokens,
|
|
2772
|
+
connector,
|
|
2773
|
+
cache
|
|
2774
|
+
}) => {
|
|
2775
|
+
const result = [];
|
|
2776
|
+
for (const tokenConfig of tokens) {
|
|
2777
|
+
const tokenId = (0, import_chaindata_provider29.solToken2022TokenId)(networkId, tokenConfig.mintAddress);
|
|
2778
|
+
let cached = cache[tokenId] && TokenCacheSchema4.safeParse(cache[tokenId]).data;
|
|
2779
|
+
if (!cached) {
|
|
2780
|
+
const tokenInfo = await fetchOnChainTokenData2(connector, tokenId);
|
|
2781
|
+
if (tokenInfo) cache[tokenId] = tokenInfo;
|
|
2782
|
+
}
|
|
2783
|
+
cached = cache[tokenId] && TokenCacheSchema4.safeParse(cache[tokenId]).data;
|
|
2784
|
+
if (cached?.isValid === false) continue;
|
|
2785
|
+
const base = {
|
|
2786
|
+
id: tokenId,
|
|
2787
|
+
type: MODULE_TYPE6,
|
|
2788
|
+
platform: PLATFORM6,
|
|
2789
|
+
networkId
|
|
2790
|
+
};
|
|
2791
|
+
const token = (0, import_lodash_es16.assign)(
|
|
2792
|
+
base,
|
|
2793
|
+
cached?.isValid ? (0, import_lodash_es16.omit)(cached, ["isValid"]) : {},
|
|
2794
|
+
tokenConfig
|
|
2795
|
+
);
|
|
2796
|
+
const parsed = import_chaindata_provider29.SolToken2022TokenSchema.safeParse(token);
|
|
2797
|
+
if (!parsed.success) {
|
|
2798
|
+
log_default.warn("Ignoring token with invalid SolToken2022TokenSchema", {
|
|
2799
|
+
token
|
|
2800
|
+
});
|
|
2801
|
+
continue;
|
|
2802
|
+
}
|
|
2803
|
+
result.push(parsed.data);
|
|
2804
|
+
}
|
|
2805
|
+
return result;
|
|
2806
|
+
};
|
|
2807
|
+
|
|
2808
|
+
// src/modules/sol-token2022/getMiniMetadata.ts
|
|
2809
|
+
var getMiniMetadata6 = () => {
|
|
2810
|
+
throw new Error("MiniMetadata is not supported for solana tokens");
|
|
2811
|
+
};
|
|
2812
|
+
|
|
2813
|
+
// src/modules/sol-token2022/getTransferCallData.ts
|
|
2814
|
+
var import_spl_token4 = require("@solana/spl-token");
|
|
2815
|
+
var import_web38 = require("@solana/web3.js");
|
|
2816
|
+
var import_chaindata_provider30 = require("@talismn/chaindata-provider");
|
|
2817
|
+
var getTransferCallData6 = async ({ from: from2, to, value, token, connector }) => {
|
|
2818
|
+
if (!(0, import_chaindata_provider30.isTokenOfType)(token, MODULE_TYPE6))
|
|
2819
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE6}.`);
|
|
2820
|
+
const connection = await connector.getConnection(token.networkId);
|
|
2821
|
+
const mintPubkey = new import_web38.PublicKey(token.mintAddress);
|
|
2822
|
+
const fromWallet = new import_web38.PublicKey(from2);
|
|
2823
|
+
const toWallet = new import_web38.PublicKey(to);
|
|
2824
|
+
const mintAccount = await (0, import_spl_token4.getMint)(connection, mintPubkey, void 0, import_spl_token4.TOKEN_2022_PROGRAM_ID);
|
|
2825
|
+
const nonTransferable = (0, import_spl_token4.getNonTransferable)(mintAccount);
|
|
2826
|
+
if (nonTransferable) throw new Error("This token is non-transferable.");
|
|
2827
|
+
const transferFeeConfig = (0, import_spl_token4.getTransferFeeConfig)(mintAccount);
|
|
2828
|
+
const transferHook = (0, import_spl_token4.getTransferHook)(mintAccount);
|
|
2829
|
+
const instructions = [];
|
|
2830
|
+
const fromTokenAccount = await (0, import_spl_token4.getAssociatedTokenAddress)(
|
|
2831
|
+
mintPubkey,
|
|
2832
|
+
fromWallet,
|
|
2833
|
+
false,
|
|
2834
|
+
import_spl_token4.TOKEN_2022_PROGRAM_ID
|
|
2835
|
+
);
|
|
2836
|
+
const toTokenAccount = await (0, import_spl_token4.getAssociatedTokenAddress)(
|
|
2837
|
+
mintPubkey,
|
|
2838
|
+
toWallet,
|
|
2839
|
+
false,
|
|
2840
|
+
import_spl_token4.TOKEN_2022_PROGRAM_ID
|
|
2841
|
+
);
|
|
2842
|
+
if (!await tokenAccountExists2(connection, toTokenAccount)) {
|
|
2843
|
+
instructions.push(
|
|
2844
|
+
(0, import_spl_token4.createAssociatedTokenAccountInstruction)(
|
|
2845
|
+
fromWallet,
|
|
2846
|
+
toTokenAccount,
|
|
2847
|
+
toWallet,
|
|
2848
|
+
mintPubkey,
|
|
2849
|
+
import_spl_token4.TOKEN_2022_PROGRAM_ID
|
|
2850
|
+
)
|
|
2851
|
+
);
|
|
2852
|
+
}
|
|
2853
|
+
const amount = BigInt(value);
|
|
2854
|
+
const transferFee = transferFeeConfig ? await calculateCurrentEpochTransferFee(connection, transferFeeConfig, amount) : 0n;
|
|
2855
|
+
if (transferFeeConfig && transferHook) {
|
|
2856
|
+
instructions.push(
|
|
2857
|
+
await (0, import_spl_token4.createTransferCheckedWithFeeAndTransferHookInstruction)(
|
|
2858
|
+
connection,
|
|
2859
|
+
fromTokenAccount,
|
|
2860
|
+
mintPubkey,
|
|
2861
|
+
toTokenAccount,
|
|
2862
|
+
fromWallet,
|
|
2863
|
+
amount,
|
|
2864
|
+
token.decimals,
|
|
2865
|
+
transferFee,
|
|
2866
|
+
[],
|
|
2867
|
+
void 0,
|
|
2868
|
+
import_spl_token4.TOKEN_2022_PROGRAM_ID
|
|
2869
|
+
)
|
|
2870
|
+
);
|
|
2871
|
+
} else if (transferFeeConfig) {
|
|
2872
|
+
instructions.push(
|
|
2873
|
+
(0, import_spl_token4.createTransferCheckedWithFeeInstruction)(
|
|
2874
|
+
fromTokenAccount,
|
|
2875
|
+
mintPubkey,
|
|
2876
|
+
toTokenAccount,
|
|
2877
|
+
fromWallet,
|
|
2878
|
+
amount,
|
|
2879
|
+
token.decimals,
|
|
2880
|
+
transferFee,
|
|
2881
|
+
[],
|
|
2882
|
+
import_spl_token4.TOKEN_2022_PROGRAM_ID
|
|
2883
|
+
)
|
|
2884
|
+
);
|
|
2885
|
+
} else if (transferHook) {
|
|
2886
|
+
instructions.push(
|
|
2887
|
+
await (0, import_spl_token4.createTransferCheckedWithTransferHookInstruction)(
|
|
2888
|
+
connection,
|
|
2889
|
+
fromTokenAccount,
|
|
2890
|
+
mintPubkey,
|
|
2891
|
+
toTokenAccount,
|
|
2892
|
+
fromWallet,
|
|
2893
|
+
amount,
|
|
2894
|
+
token.decimals,
|
|
2895
|
+
[],
|
|
2896
|
+
void 0,
|
|
2897
|
+
import_spl_token4.TOKEN_2022_PROGRAM_ID
|
|
2898
|
+
)
|
|
2899
|
+
);
|
|
2900
|
+
} else {
|
|
2901
|
+
instructions.push(
|
|
2902
|
+
(0, import_spl_token4.createTransferCheckedInstruction)(
|
|
2903
|
+
fromTokenAccount,
|
|
2904
|
+
mintPubkey,
|
|
2905
|
+
toTokenAccount,
|
|
2906
|
+
fromWallet,
|
|
2907
|
+
amount,
|
|
2908
|
+
token.decimals,
|
|
2909
|
+
[],
|
|
2910
|
+
import_spl_token4.TOKEN_2022_PROGRAM_ID
|
|
2911
|
+
)
|
|
2912
|
+
);
|
|
2913
|
+
}
|
|
2914
|
+
return instructions;
|
|
2915
|
+
};
|
|
2916
|
+
var tokenAccountExists2 = async (connection, address) => {
|
|
2917
|
+
try {
|
|
2918
|
+
await (0, import_spl_token4.getAccount)(connection, address, void 0, import_spl_token4.TOKEN_2022_PROGRAM_ID);
|
|
2919
|
+
return true;
|
|
2920
|
+
} catch {
|
|
2921
|
+
return false;
|
|
2922
|
+
}
|
|
2923
|
+
};
|
|
2924
|
+
var calculateToken2022TransferFee = (transferFeeConfig, epoch, amount) => {
|
|
2925
|
+
return (0, import_spl_token4.calculateEpochFee)(transferFeeConfig, epoch, amount);
|
|
2926
|
+
};
|
|
2927
|
+
var calculateCurrentEpochTransferFee = async (connection, transferFeeConfig, amount) => {
|
|
2928
|
+
const { epoch } = await connection.getEpochInfo();
|
|
2929
|
+
return calculateToken2022TransferFee(transferFeeConfig, BigInt(epoch), amount);
|
|
2930
|
+
};
|
|
2931
|
+
|
|
2932
|
+
// src/modules/sol-token2022/subscribeBalances.ts
|
|
2933
|
+
var import_lodash_es17 = require("lodash-es");
|
|
2934
|
+
var import_rxjs8 = require("rxjs");
|
|
2935
|
+
var SUBSCRIPTION_INTERVAL6 = 6e3;
|
|
2936
|
+
var subscribeBalances6 = ({
|
|
2937
|
+
networkId,
|
|
2938
|
+
tokensWithAddresses,
|
|
2939
|
+
connector
|
|
2940
|
+
}) => {
|
|
2941
|
+
if (!tokensWithAddresses.length) return (0, import_rxjs8.of)({ success: [], errors: [] });
|
|
2942
|
+
return new import_rxjs8.Observable((subscriber) => {
|
|
2943
|
+
const abortController = new AbortController();
|
|
2944
|
+
const poll = async () => {
|
|
2945
|
+
try {
|
|
2946
|
+
if (abortController.signal.aborted) return;
|
|
2947
|
+
const balances = await fetchBalances6({
|
|
2948
|
+
networkId,
|
|
2949
|
+
tokensWithAddresses,
|
|
2950
|
+
connector
|
|
2951
|
+
});
|
|
2952
|
+
if (abortController.signal.aborted) return;
|
|
2953
|
+
subscriber.next(balances);
|
|
2954
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL6);
|
|
2955
|
+
} catch (error) {
|
|
2956
|
+
log_default.error("Error", {
|
|
2957
|
+
module: MODULE_TYPE6,
|
|
2958
|
+
networkId,
|
|
2959
|
+
addressesByToken: tokensWithAddresses,
|
|
2960
|
+
error
|
|
2961
|
+
});
|
|
2962
|
+
subscriber.error(error);
|
|
2963
|
+
}
|
|
2964
|
+
};
|
|
2965
|
+
poll();
|
|
2966
|
+
return () => {
|
|
2967
|
+
abortController.abort();
|
|
2968
|
+
};
|
|
2969
|
+
}).pipe((0, import_rxjs8.distinctUntilChanged)(import_lodash_es17.isEqual));
|
|
2970
|
+
};
|
|
2971
|
+
|
|
2972
|
+
// src/modules/sol-token2022/module.ts
|
|
2973
|
+
var SolToken2022BalanceModule = {
|
|
2974
|
+
type: MODULE_TYPE6,
|
|
2975
|
+
platform: PLATFORM6,
|
|
2976
|
+
getMiniMetadata: getMiniMetadata6,
|
|
2977
|
+
fetchTokens: fetchTokens6,
|
|
2978
|
+
fetchBalances: fetchBalances6,
|
|
2979
|
+
subscribeBalances: subscribeBalances6,
|
|
2980
|
+
getTransferCallData: getTransferCallData6
|
|
2981
|
+
};
|
|
2982
|
+
|
|
2983
|
+
// src/modules/sol-token2022/types.ts
|
|
2984
|
+
var import_chaindata_provider31 = require("@talismn/chaindata-provider");
|
|
2985
|
+
var import_v410 = __toESM(require("zod/v4"));
|
|
2986
|
+
var SolToken2022TokenConfigSchema = import_v410.default.strictObject({
|
|
2987
|
+
mintAddress: import_chaindata_provider31.SolToken2022TokenSchema.shape.mintAddress,
|
|
2988
|
+
...TokenConfigBaseSchema.shape
|
|
2989
|
+
});
|
|
2990
|
+
|
|
2991
|
+
// src/modules/substrate-assets/config.ts
|
|
2992
|
+
var import_chaindata_provider32 = require("@talismn/chaindata-provider");
|
|
2993
|
+
var MODULE_TYPE7 = import_chaindata_provider32.SubAssetsTokenSchema.shape.type.value;
|
|
2994
|
+
var PLATFORM7 = import_chaindata_provider32.SubAssetsTokenSchema.shape.platform.value;
|
|
2995
|
+
|
|
2996
|
+
// src/modules/substrate-assets/buildQueries.ts
|
|
2997
|
+
var import_scale4 = require("@talismn/scale");
|
|
2998
|
+
var import_util6 = require("@talismn/util");
|
|
2999
|
+
var buildQueries = (networkId, balanceDefs, miniMetadata) => {
|
|
3000
|
+
const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
|
|
3001
|
+
storage: ["Assets", "Account"]
|
|
3002
|
+
});
|
|
3003
|
+
return balanceDefs.map(({ token, address }) => {
|
|
3004
|
+
const scaleCoder = networkStorageCoders?.storage;
|
|
3005
|
+
const stateKey = tryEncode(scaleCoder, Number(token.assetId), address) ?? // Asset Hub
|
|
3006
|
+
tryEncode(scaleCoder, BigInt(token.assetId), address);
|
|
3007
|
+
if (!stateKey) {
|
|
3008
|
+
log_default.warn(
|
|
3009
|
+
`Invalid assetId / address in ${networkId} storage query ${token.assetId} / ${address}`
|
|
3010
|
+
);
|
|
3011
|
+
return null;
|
|
3012
|
+
}
|
|
3013
|
+
const decodeResult = (changes) => {
|
|
3014
|
+
const decoded = (0, import_scale4.decodeScale)(
|
|
3015
|
+
scaleCoder,
|
|
3016
|
+
changes[0],
|
|
3017
|
+
`Failed to decode substrate-assets balance on chain ${networkId}`
|
|
3018
|
+
) ?? {
|
|
3019
|
+
balance: 0n,
|
|
3020
|
+
is_frozen: false,
|
|
3021
|
+
reason: { type: "Sufficient" },
|
|
3022
|
+
status: { type: "Liquid" },
|
|
3023
|
+
extra: void 0
|
|
3024
|
+
};
|
|
3025
|
+
const isFrozen = decoded?.status?.type === "Frozen";
|
|
3026
|
+
const amount = (decoded?.balance ?? 0n).toString();
|
|
3027
|
+
const free = amount;
|
|
3028
|
+
const frozen = token.isFrozen || isFrozen ? amount : "0";
|
|
3029
|
+
const balanceValues = [
|
|
3030
|
+
{ type: "free", label: "free", amount: free.toString() },
|
|
3031
|
+
{ type: "locked", label: "frozen", amount: frozen.toString() }
|
|
3032
|
+
];
|
|
3033
|
+
const balance = {
|
|
3034
|
+
source: "substrate-assets",
|
|
3035
|
+
status: "live",
|
|
3036
|
+
address,
|
|
3037
|
+
networkId,
|
|
3038
|
+
tokenId: token.id,
|
|
3039
|
+
values: balanceValues
|
|
3040
|
+
};
|
|
3041
|
+
return balance;
|
|
3042
|
+
};
|
|
3043
|
+
return {
|
|
3044
|
+
stateKeys: [stateKey],
|
|
3045
|
+
decodeResult
|
|
3046
|
+
};
|
|
3047
|
+
}).filter(import_util6.isNotNil);
|
|
3048
|
+
};
|
|
3049
|
+
var tryEncode = (scaleCoder, ...args) => {
|
|
3050
|
+
try {
|
|
3051
|
+
return scaleCoder?.keys?.enc?.(...args);
|
|
3052
|
+
} catch {
|
|
3053
|
+
return null;
|
|
2561
3054
|
}
|
|
2562
3055
|
};
|
|
2563
3056
|
|
|
2564
3057
|
// src/modules/substrate-assets/fetchBalances.ts
|
|
2565
|
-
var
|
|
3058
|
+
var fetchBalances7 = async ({
|
|
2566
3059
|
networkId,
|
|
2567
3060
|
tokensWithAddresses,
|
|
2568
3061
|
connector,
|
|
@@ -2571,7 +3064,7 @@ var fetchBalances6 = async ({
|
|
|
2571
3064
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
2572
3065
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
2573
3066
|
if (!miniMetadata?.data) {
|
|
2574
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
3067
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE7} balances on ${networkId}.`);
|
|
2575
3068
|
return {
|
|
2576
3069
|
success: [],
|
|
2577
3070
|
errors: balanceDefs.map((def) => ({
|
|
@@ -2581,20 +3074,20 @@ var fetchBalances6 = async ({
|
|
|
2581
3074
|
}))
|
|
2582
3075
|
};
|
|
2583
3076
|
}
|
|
2584
|
-
if (miniMetadata.source !==
|
|
2585
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
3077
|
+
if (miniMetadata.source !== MODULE_TYPE7) {
|
|
3078
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE7}.`);
|
|
2586
3079
|
return {
|
|
2587
3080
|
success: [],
|
|
2588
3081
|
errors: balanceDefs.map((def) => ({
|
|
2589
3082
|
tokenId: def.token.id,
|
|
2590
3083
|
address: def.address,
|
|
2591
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
3084
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE7}`)
|
|
2592
3085
|
}))
|
|
2593
3086
|
};
|
|
2594
3087
|
}
|
|
2595
3088
|
if (miniMetadata.chainId !== networkId) {
|
|
2596
3089
|
log_default.warn(
|
|
2597
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
3090
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE7}. Expected chainId is ${networkId}`
|
|
2598
3091
|
);
|
|
2599
3092
|
return {
|
|
2600
3093
|
success: [],
|
|
@@ -2618,7 +3111,7 @@ var fetchBalances6 = async ({
|
|
|
2618
3111
|
address: def.address,
|
|
2619
3112
|
networkId,
|
|
2620
3113
|
tokenId: def.token.id,
|
|
2621
|
-
source:
|
|
3114
|
+
source: MODULE_TYPE7,
|
|
2622
3115
|
status: "live",
|
|
2623
3116
|
values: [
|
|
2624
3117
|
{ type: "free", label: "free", amount: "0" },
|
|
@@ -2632,10 +3125,10 @@ var fetchBalances6 = async ({
|
|
|
2632
3125
|
};
|
|
2633
3126
|
|
|
2634
3127
|
// src/modules/substrate-assets/fetchTokens.ts
|
|
2635
|
-
var
|
|
3128
|
+
var import_chaindata_provider33 = require("@talismn/chaindata-provider");
|
|
2636
3129
|
var import_scale5 = require("@talismn/scale");
|
|
2637
|
-
var
|
|
2638
|
-
var
|
|
3130
|
+
var import_lodash_es18 = require("lodash-es");
|
|
3131
|
+
var fetchTokens7 = async ({
|
|
2639
3132
|
networkId,
|
|
2640
3133
|
tokens,
|
|
2641
3134
|
connector,
|
|
@@ -2660,7 +3153,7 @@ var fetchTokens6 = async ({
|
|
|
2660
3153
|
]);
|
|
2661
3154
|
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
|
2662
3155
|
const metadataStorageEntries = metadataStorageResults.length ? metadataStorageResults[0].changes : [];
|
|
2663
|
-
const assetByAssetId = (0,
|
|
3156
|
+
const assetByAssetId = (0, import_lodash_es18.keyBy)(
|
|
2664
3157
|
assetStorageEntries.map(([key, value]) => {
|
|
2665
3158
|
const [assetId] = assetCodec.keys.dec(key);
|
|
2666
3159
|
const asset = assetCodec.value.dec(value);
|
|
@@ -2668,7 +3161,7 @@ var fetchTokens6 = async ({
|
|
|
2668
3161
|
}),
|
|
2669
3162
|
(a) => a.assetId
|
|
2670
3163
|
);
|
|
2671
|
-
const metadataByAssetId = (0,
|
|
3164
|
+
const metadataByAssetId = (0, import_lodash_es18.keyBy)(
|
|
2672
3165
|
metadataStorageEntries.map(([key, value]) => {
|
|
2673
3166
|
const [assetId] = metadataCodec.keys.dec(key);
|
|
2674
3167
|
const metadata = metadataCodec.value.dec(value);
|
|
@@ -2682,14 +3175,14 @@ var fetchTokens6 = async ({
|
|
|
2682
3175
|
}),
|
|
2683
3176
|
(a) => a.assetId
|
|
2684
3177
|
);
|
|
2685
|
-
const allTokens = (0,
|
|
2686
|
-
(assetId) => (0,
|
|
3178
|
+
const allTokens = (0, import_lodash_es18.keys)(assetByAssetId).map(
|
|
3179
|
+
(assetId) => (0, import_lodash_es18.assign)({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? void 0)
|
|
2687
3180
|
);
|
|
2688
|
-
const configTokenByAssetId = (0,
|
|
3181
|
+
const configTokenByAssetId = (0, import_lodash_es18.keyBy)(tokens, (t) => t.assetId);
|
|
2689
3182
|
return allTokens.map(
|
|
2690
3183
|
(asset) => ({
|
|
2691
|
-
id: (0,
|
|
2692
|
-
type:
|
|
3184
|
+
id: (0, import_chaindata_provider33.subAssetTokenId)(networkId, String(asset.assetId)),
|
|
3185
|
+
type: MODULE_TYPE7,
|
|
2693
3186
|
platform: "polkadot",
|
|
2694
3187
|
networkId,
|
|
2695
3188
|
assetId: String(asset.assetId),
|
|
@@ -2706,22 +3199,21 @@ var fetchTokens6 = async ({
|
|
|
2706
3199
|
return configToken || token.isSufficient;
|
|
2707
3200
|
}).map((token) => {
|
|
2708
3201
|
const configToken = configTokenByAssetId[token.assetId];
|
|
2709
|
-
return configToken ? (0,
|
|
3202
|
+
return configToken ? (0, import_lodash_es18.assign)({}, token, configToken) : token;
|
|
2710
3203
|
}).filter((t) => {
|
|
2711
|
-
const parsed =
|
|
3204
|
+
const parsed = import_chaindata_provider33.SubAssetsTokenSchema.safeParse(t);
|
|
2712
3205
|
return parsed.success;
|
|
2713
3206
|
});
|
|
2714
3207
|
};
|
|
2715
3208
|
|
|
2716
3209
|
// src/modules/substrate-assets/getMiniMetadata.ts
|
|
2717
|
-
var
|
|
2718
|
-
var
|
|
3210
|
+
var import_chaindata_provider44 = require("@talismn/chaindata-provider");
|
|
3211
|
+
var import_scale12 = require("@talismn/scale");
|
|
2719
3212
|
|
|
2720
3213
|
// src/types/balances.ts
|
|
2721
|
-
var
|
|
3214
|
+
var import_chaindata_provider42 = require("@talismn/chaindata-provider");
|
|
2722
3215
|
var import_token_rates2 = require("@talismn/token-rates");
|
|
2723
|
-
var
|
|
2724
|
-
var import_bignumber2 = __toESM(require("bignumber.js"));
|
|
3216
|
+
var import_util9 = require("@talismn/util");
|
|
2725
3217
|
|
|
2726
3218
|
// src/modules/substrate-dtao/alphaPrice.ts
|
|
2727
3219
|
var TAO_DECIMALS = 9n;
|
|
@@ -2738,14 +3230,191 @@ var taoToAlpha = (tao, scaledAlphaPrice) => {
|
|
|
2738
3230
|
if (!tao || !scaledAlphaPrice) return 0n;
|
|
2739
3231
|
return tao * ALPHA_PRICE_SCALE / scaledAlphaPrice;
|
|
2740
3232
|
};
|
|
3233
|
+
var taoToAlphaCeil = (tao, scaledAlphaPrice) => {
|
|
3234
|
+
if (!tao || !scaledAlphaPrice) return 0n;
|
|
3235
|
+
return (tao * ALPHA_PRICE_SCALE + scaledAlphaPrice - 1n) / scaledAlphaPrice;
|
|
3236
|
+
};
|
|
3237
|
+
|
|
3238
|
+
// src/modules/substrate-dtao/convictionLocks.ts
|
|
3239
|
+
var import_scale6 = require("@talismn/scale");
|
|
3240
|
+
var convictionLockKey = (address, netuid) => `${address}:${netuid}`;
|
|
3241
|
+
var getConvictionLockLabel = (lockType) => lockType === "perpetual" ? "Perpetual Conviction Lock" : "Decaying Conviction Lock";
|
|
3242
|
+
var findDTaoConvictionLock = (locks) => {
|
|
3243
|
+
for (const lock of locks ?? []) {
|
|
3244
|
+
const meta = lock.meta;
|
|
3245
|
+
if (meta?.convictionLock?.type !== "conviction-lock") continue;
|
|
3246
|
+
const lockType = meta.convictionLock.lockType;
|
|
3247
|
+
return {
|
|
3248
|
+
amount: lock.amount.planck,
|
|
3249
|
+
hotkey: meta.convictionLock.hotkey,
|
|
3250
|
+
lockType,
|
|
3251
|
+
label: getConvictionLockLabel(lockType)
|
|
3252
|
+
};
|
|
3253
|
+
}
|
|
3254
|
+
return null;
|
|
3255
|
+
};
|
|
3256
|
+
var toBigIntValue = (value) => {
|
|
3257
|
+
if (typeof value === "bigint") return value;
|
|
3258
|
+
if (value && typeof value === "object" && "bits" in value) {
|
|
3259
|
+
const bits = value.bits;
|
|
3260
|
+
if (typeof bits === "bigint") return bits;
|
|
3261
|
+
}
|
|
3262
|
+
return 0n;
|
|
3263
|
+
};
|
|
3264
|
+
var fetchConvictionLocks = async (connector, networkId, metadataRpc, addresses) => {
|
|
3265
|
+
if (!addresses.length) return [];
|
|
3266
|
+
const { unifiedMetadata, builder } = (0, import_scale6.parseMetadataRpc)(metadataRpc);
|
|
3267
|
+
if (!hasRuntimeApi(unifiedMetadata, "StakeInfoRuntimeApi", "get_coldkey_lock") || !hasStorageItems(unifiedMetadata, "SubtensorModule", ["Lock", "DecayingLock"])) {
|
|
3268
|
+
return [];
|
|
3269
|
+
}
|
|
3270
|
+
try {
|
|
3271
|
+
const lockStorageCoder = builder.buildStorage("SubtensorModule", "Lock");
|
|
3272
|
+
const decayingLockStorageCoder = builder.buildStorage("SubtensorModule", "DecayingLock");
|
|
3273
|
+
const lockStorageKeys = await fetchConvictionLockStorageKeys(
|
|
3274
|
+
connector,
|
|
3275
|
+
networkId,
|
|
3276
|
+
addresses,
|
|
3277
|
+
lockStorageCoder
|
|
3278
|
+
);
|
|
3279
|
+
if (!lockStorageKeys.length) return [];
|
|
3280
|
+
const hotkeyByPair = new Map(
|
|
3281
|
+
lockStorageKeys.map(({ address, netuid, hotkey }) => [
|
|
3282
|
+
convictionLockKey(address, netuid),
|
|
3283
|
+
hotkey
|
|
3284
|
+
])
|
|
3285
|
+
);
|
|
3286
|
+
const [lockModesByPair, lockStates] = await Promise.all([
|
|
3287
|
+
fetchConvictionLockModes(connector, networkId, lockStorageKeys, decayingLockStorageCoder),
|
|
3288
|
+
fetchColdkeyLockStates(connector, networkId, builder, lockStorageKeys)
|
|
3289
|
+
]);
|
|
3290
|
+
return lockStates.flatMap(({ address, netuid, lockState }) => {
|
|
3291
|
+
const amount = lockState?.locked_mass ?? 0n;
|
|
3292
|
+
const convictionRaw = toBigIntValue(lockState?.conviction);
|
|
3293
|
+
if (amount <= 0n && convictionRaw <= 0n) return [];
|
|
3294
|
+
const hotkey = hotkeyByPair.get(convictionLockKey(address, netuid));
|
|
3295
|
+
if (!hotkey) return [];
|
|
3296
|
+
return [
|
|
3297
|
+
{
|
|
3298
|
+
address,
|
|
3299
|
+
netuid,
|
|
3300
|
+
lock: {
|
|
3301
|
+
amount,
|
|
3302
|
+
hotkey,
|
|
3303
|
+
lockType: lockModesByPair.get(convictionLockKey(address, netuid)) ?? "decaying",
|
|
3304
|
+
convictionRaw: convictionRaw.toString()
|
|
3305
|
+
}
|
|
3306
|
+
}
|
|
3307
|
+
];
|
|
3308
|
+
});
|
|
3309
|
+
} catch (cause) {
|
|
3310
|
+
log_default.warn(`Failed to fetch Bittensor conviction locks on ${networkId}`, { cause });
|
|
3311
|
+
return [];
|
|
3312
|
+
}
|
|
3313
|
+
};
|
|
3314
|
+
var fetchConvictionLockStorageKeys = async (connector, networkId, addresses, storageCoder) => {
|
|
3315
|
+
const keysPerAddress = await Promise.all(
|
|
3316
|
+
addresses.map(async (address) => {
|
|
3317
|
+
let keyPrefix;
|
|
3318
|
+
try {
|
|
3319
|
+
keyPrefix = storageCoder.keys.enc(address);
|
|
3320
|
+
} catch (cause) {
|
|
3321
|
+
log_default.warn(
|
|
3322
|
+
`Failed to encode conviction Lock key prefix (address=${address}) on ${networkId}`,
|
|
3323
|
+
{ cause }
|
|
3324
|
+
);
|
|
3325
|
+
return [];
|
|
3326
|
+
}
|
|
3327
|
+
try {
|
|
3328
|
+
const stateKeys = await connector.send(networkId, "state_getKeys", [
|
|
3329
|
+
keyPrefix
|
|
3330
|
+
]);
|
|
3331
|
+
return stateKeys.flatMap((stateKey) => {
|
|
3332
|
+
try {
|
|
3333
|
+
const [, netuid, hotkey] = storageCoder.keys.dec(stateKey);
|
|
3334
|
+
return [{ address, netuid, hotkey }];
|
|
3335
|
+
} catch (cause) {
|
|
3336
|
+
log_default.warn(`Failed to decode conviction Lock key ${stateKey} on ${networkId}`, { cause });
|
|
3337
|
+
return [];
|
|
3338
|
+
}
|
|
3339
|
+
});
|
|
3340
|
+
} catch (cause) {
|
|
3341
|
+
log_default.warn(`Failed to fetch conviction Lock keys (address=${address}) on ${networkId}`, {
|
|
3342
|
+
cause
|
|
3343
|
+
});
|
|
3344
|
+
return [];
|
|
3345
|
+
}
|
|
3346
|
+
})
|
|
3347
|
+
);
|
|
3348
|
+
return keysPerAddress.flat();
|
|
3349
|
+
};
|
|
3350
|
+
var fetchConvictionLockModes = async (connector, networkId, pairs, storageCoder) => {
|
|
3351
|
+
const queries = pairs.map(
|
|
3352
|
+
({ address, netuid }) => {
|
|
3353
|
+
let stateKey = null;
|
|
3354
|
+
try {
|
|
3355
|
+
stateKey = storageCoder.keys.enc(address, netuid);
|
|
3356
|
+
} catch (cause) {
|
|
3357
|
+
log_default.warn(
|
|
3358
|
+
`Failed to encode conviction DecayingLock key (netuid=${netuid}, address=${address}) on ${networkId}`,
|
|
3359
|
+
{ cause }
|
|
3360
|
+
);
|
|
3361
|
+
}
|
|
3362
|
+
const key = convictionLockKey(address, netuid);
|
|
3363
|
+
return {
|
|
3364
|
+
stateKeys: [stateKey],
|
|
3365
|
+
decodeResult: (changes) => {
|
|
3366
|
+
const hexValue = changes[0];
|
|
3367
|
+
if (!hexValue) return [key, "decaying"];
|
|
3368
|
+
const decoded = (0, import_scale6.decodeScale)(
|
|
3369
|
+
storageCoder,
|
|
3370
|
+
hexValue,
|
|
3371
|
+
`Failed to decode DecayingLock for (netuid=${netuid}, address=${address}) on ${networkId}`
|
|
3372
|
+
);
|
|
3373
|
+
return [key, decoded === false ? "perpetual" : "decaying"];
|
|
3374
|
+
}
|
|
3375
|
+
};
|
|
3376
|
+
}
|
|
3377
|
+
);
|
|
3378
|
+
return new Map(await fetchRpcQueryPack(connector, networkId, queries));
|
|
3379
|
+
};
|
|
3380
|
+
var fetchColdkeyLockStates = async (connector, networkId, builder, pairs) => {
|
|
3381
|
+
return Promise.all(
|
|
3382
|
+
pairs.map(async ({ address, netuid }) => {
|
|
3383
|
+
try {
|
|
3384
|
+
const lockState = await fetchRuntimeCallResult(
|
|
3385
|
+
connector,
|
|
3386
|
+
networkId,
|
|
3387
|
+
builder,
|
|
3388
|
+
"StakeInfoRuntimeApi",
|
|
3389
|
+
"get_coldkey_lock",
|
|
3390
|
+
[address, netuid]
|
|
3391
|
+
);
|
|
3392
|
+
return { address, netuid, lockState };
|
|
3393
|
+
} catch (cause) {
|
|
3394
|
+
log_default.warn(
|
|
3395
|
+
`Failed to fetch get_coldkey_lock for (netuid=${netuid}, address=${address}) on ${networkId}`,
|
|
3396
|
+
{ cause }
|
|
3397
|
+
);
|
|
3398
|
+
return { address, netuid, lockState: null };
|
|
3399
|
+
}
|
|
3400
|
+
})
|
|
3401
|
+
);
|
|
3402
|
+
};
|
|
2741
3403
|
|
|
2742
3404
|
// src/modules/substrate-dtao/getDtaoTokenRates.ts
|
|
2743
|
-
var
|
|
3405
|
+
var import_chaindata_provider34 = require("@talismn/chaindata-provider");
|
|
2744
3406
|
var import_token_rates = require("@talismn/token-rates");
|
|
2745
3407
|
var ONE_ALPHA = 10n ** TAO_DECIMALS;
|
|
2746
|
-
var
|
|
3408
|
+
var getAlphaChange24h = (currency, taoChange24h, alphaPriceChange24h) => {
|
|
3409
|
+
if (typeof alphaPriceChange24h !== "number" || !Number.isFinite(alphaPriceChange24h))
|
|
3410
|
+
return void 0;
|
|
3411
|
+
if (currency === "tao") return alphaPriceChange24h;
|
|
3412
|
+
if (typeof taoChange24h !== "number" || !Number.isFinite(taoChange24h)) return void 0;
|
|
3413
|
+
return ((1 + alphaPriceChange24h / 100) * (1 + taoChange24h / 100) - 1) * 100;
|
|
3414
|
+
};
|
|
3415
|
+
var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice, alphaPriceChange24h) => {
|
|
2747
3416
|
try {
|
|
2748
|
-
const taoTokenId = (0,
|
|
3417
|
+
const taoTokenId = (0, import_chaindata_provider34.subNativeTokenId)(token.networkId);
|
|
2749
3418
|
const taoTokenRates = tokenRates[taoTokenId];
|
|
2750
3419
|
if (!taoTokenRates) return null;
|
|
2751
3420
|
if (token.netuid === 0) return structuredClone(taoTokenRates);
|
|
@@ -2759,8 +3428,7 @@ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
|
|
|
2759
3428
|
alphaRates[currency] = {
|
|
2760
3429
|
price: taoRate.price * priceRatio,
|
|
2761
3430
|
marketCap: taoRate.marketCap ? taoRate.marketCap * priceRatio : void 0,
|
|
2762
|
-
change24h:
|
|
2763
|
-
// cannot be determined from TAO rates alone
|
|
3431
|
+
change24h: getAlphaChange24h(currency, taoRate.change24h, alphaPriceChange24h)
|
|
2764
3432
|
};
|
|
2765
3433
|
}
|
|
2766
3434
|
}
|
|
@@ -2772,18 +3440,18 @@ var getDTaoTokenRates = (token, tokenRates, scaledAlphaPrice) => {
|
|
|
2772
3440
|
};
|
|
2773
3441
|
|
|
2774
3442
|
// src/modules/substrate-dtao/config.ts
|
|
2775
|
-
var
|
|
2776
|
-
var
|
|
2777
|
-
var
|
|
3443
|
+
var import_chaindata_provider35 = require("@talismn/chaindata-provider");
|
|
3444
|
+
var MODULE_TYPE8 = import_chaindata_provider35.SubDTaoTokenSchema.shape.type.value;
|
|
3445
|
+
var PLATFORM8 = import_chaindata_provider35.SubDTaoTokenSchema.shape.platform.value;
|
|
2778
3446
|
|
|
2779
3447
|
// src/modules/substrate-dtao/fetchBalances.ts
|
|
2780
|
-
var
|
|
2781
|
-
var
|
|
2782
|
-
var
|
|
2783
|
-
var
|
|
3448
|
+
var import_chaindata_provider37 = require("@talismn/chaindata-provider");
|
|
3449
|
+
var import_scale7 = require("@talismn/scale");
|
|
3450
|
+
var import_util7 = require("@talismn/util");
|
|
3451
|
+
var import_lodash_es19 = require("lodash-es");
|
|
2784
3452
|
|
|
2785
3453
|
// src/modules/substrate-dtao/calculatePendingRootClaimable.ts
|
|
2786
|
-
var
|
|
3454
|
+
var import_chaindata_provider36 = require("@talismn/chaindata-provider");
|
|
2787
3455
|
var calculatePendingRootClaimable = ({
|
|
2788
3456
|
stake,
|
|
2789
3457
|
hotkey,
|
|
@@ -2805,8 +3473,8 @@ var calculatePendingRootClaimable = ({
|
|
|
2805
3473
|
const pendingRootClaim = totalClaimable > alreadyClaimed ? totalClaimable - alreadyClaimed : 0n;
|
|
2806
3474
|
pendingRootClaimBalances.push({
|
|
2807
3475
|
address,
|
|
2808
|
-
tokenId: (0,
|
|
2809
|
-
baseTokenId: (0,
|
|
3476
|
+
tokenId: (0, import_chaindata_provider36.subDTaoTokenId)(networkId, netuid, hotkey),
|
|
3477
|
+
baseTokenId: (0, import_chaindata_provider36.subDTaoTokenId)(networkId, netuid),
|
|
2810
3478
|
hotkey,
|
|
2811
3479
|
netuid,
|
|
2812
3480
|
scaledAlphaPrice,
|
|
@@ -2819,7 +3487,7 @@ var calculatePendingRootClaimable = ({
|
|
|
2819
3487
|
|
|
2820
3488
|
// src/modules/substrate-dtao/fetchBalances.ts
|
|
2821
3489
|
var ROOT_NETUID = 0;
|
|
2822
|
-
var
|
|
3490
|
+
var fetchBalances8 = async ({
|
|
2823
3491
|
networkId,
|
|
2824
3492
|
tokensWithAddresses,
|
|
2825
3493
|
connector,
|
|
@@ -2828,7 +3496,7 @@ var fetchBalances7 = async ({
|
|
|
2828
3496
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
2829
3497
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
2830
3498
|
if (!miniMetadata?.data) {
|
|
2831
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
3499
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE8} balances on ${networkId}.`, {
|
|
2832
3500
|
tokensWithAddresses
|
|
2833
3501
|
});
|
|
2834
3502
|
return {
|
|
@@ -2840,20 +3508,20 @@ var fetchBalances7 = async ({
|
|
|
2840
3508
|
}))
|
|
2841
3509
|
};
|
|
2842
3510
|
}
|
|
2843
|
-
if (miniMetadata.source !==
|
|
2844
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
3511
|
+
if (miniMetadata.source !== MODULE_TYPE8) {
|
|
3512
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE8}.`);
|
|
2845
3513
|
return {
|
|
2846
3514
|
success: [],
|
|
2847
3515
|
errors: balanceDefs.map((def) => ({
|
|
2848
3516
|
tokenId: def.token.id,
|
|
2849
3517
|
address: def.address,
|
|
2850
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
3518
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE8}`)
|
|
2851
3519
|
}))
|
|
2852
3520
|
};
|
|
2853
3521
|
}
|
|
2854
3522
|
if (miniMetadata.chainId !== networkId) {
|
|
2855
3523
|
log_default.warn(
|
|
2856
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
3524
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE8}. Expected chainId is ${networkId}`
|
|
2857
3525
|
);
|
|
2858
3526
|
return {
|
|
2859
3527
|
success: [],
|
|
@@ -2864,7 +3532,7 @@ var fetchBalances7 = async ({
|
|
|
2864
3532
|
}))
|
|
2865
3533
|
};
|
|
2866
3534
|
}
|
|
2867
|
-
const addresses = (0,
|
|
3535
|
+
const addresses = (0, import_lodash_es19.uniq)(balanceDefs.map((def) => def.address));
|
|
2868
3536
|
try {
|
|
2869
3537
|
const [stakeInfos, dynamicInfos] = await Promise.all([
|
|
2870
3538
|
fetchRuntimeCallResult(
|
|
@@ -2884,7 +3552,8 @@ var fetchBalances7 = async ({
|
|
|
2884
3552
|
[]
|
|
2885
3553
|
)
|
|
2886
3554
|
]);
|
|
2887
|
-
const
|
|
3555
|
+
const dynamicInfoByNetuid = (0, import_lodash_es19.keyBy)(dynamicInfos.filter(import_util7.isNotNil), (info) => info.netuid);
|
|
3556
|
+
const rootHotkeys = (0, import_lodash_es19.uniq)(
|
|
2888
3557
|
stakeInfos.flatMap(
|
|
2889
3558
|
([, stakes]) => stakes.filter((stake) => stake.netuid === ROOT_NETUID).map((stake) => stake.hotkey)
|
|
2890
3559
|
)
|
|
@@ -2903,13 +3572,10 @@ var fetchBalances7 = async ({
|
|
|
2903
3572
|
}
|
|
2904
3573
|
}
|
|
2905
3574
|
}
|
|
2906
|
-
const rootClaimedAmounts =
|
|
2907
|
-
connector,
|
|
2908
|
-
networkId,
|
|
2909
|
-
|
|
2910
|
-
addressHotkeyNetuidPairs
|
|
2911
|
-
) : /* @__PURE__ */ new Map();
|
|
2912
|
-
const dynamicInfoByNetuid = (0, import_lodash_es16.keyBy)(dynamicInfos.filter(import_util4.isNotNil), (info) => info.netuid);
|
|
3575
|
+
const [rootClaimedAmounts, convictionLocks] = await Promise.all([
|
|
3576
|
+
addressHotkeyNetuidPairs.length && miniMetadata.data ? fetchRootClaimedAmounts(connector, networkId, miniMetadata.data, addressHotkeyNetuidPairs) : Promise.resolve(/* @__PURE__ */ new Map()),
|
|
3577
|
+
miniMetadata.data ? fetchConvictionLocks(connector, networkId, miniMetadata.data, addresses) : Promise.resolve([])
|
|
3578
|
+
]);
|
|
2913
3579
|
const upsertBalance = (acc, address, tokenId, balance) => {
|
|
2914
3580
|
const key = `${address}:${tokenId}`;
|
|
2915
3581
|
const recordedBalance = acc[key];
|
|
@@ -2920,6 +3586,9 @@ var fetchBalances7 = async ({
|
|
|
2920
3586
|
// If the new balance has pendingRootClaim, use it (it's calculated from current state)
|
|
2921
3587
|
...balance.pendingRootClaim !== void 0 && {
|
|
2922
3588
|
pendingRootClaim: balance.pendingRootClaim
|
|
3589
|
+
},
|
|
3590
|
+
...balance.convictionLock !== void 0 && {
|
|
3591
|
+
convictionLock: balance.convictionLock
|
|
2923
3592
|
}
|
|
2924
3593
|
};
|
|
2925
3594
|
} else {
|
|
@@ -2933,8 +3602,8 @@ var fetchBalances7 = async ({
|
|
|
2933
3602
|
const scaledAlphaPrice = dynamicInfo ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in) : 0n;
|
|
2934
3603
|
const balance = {
|
|
2935
3604
|
address,
|
|
2936
|
-
tokenId: (0,
|
|
2937
|
-
baseTokenId: (0,
|
|
3605
|
+
tokenId: (0, import_chaindata_provider37.subDTaoTokenId)(networkId, stake.netuid, stake.hotkey),
|
|
3606
|
+
baseTokenId: (0, import_chaindata_provider37.subDTaoTokenId)(networkId, stake.netuid),
|
|
2938
3607
|
stake: stake.stake,
|
|
2939
3608
|
hotkey: stake.hotkey,
|
|
2940
3609
|
netuid: stake.netuid,
|
|
@@ -2962,18 +3631,34 @@ var fetchBalances7 = async ({
|
|
|
2962
3631
|
},
|
|
2963
3632
|
{}
|
|
2964
3633
|
);
|
|
3634
|
+
for (const { address, netuid, lock } of convictionLocks) {
|
|
3635
|
+
const dynamicInfo = dynamicInfoByNetuid[netuid];
|
|
3636
|
+
const scaledAlphaPrice = dynamicInfo ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in) : 0n;
|
|
3637
|
+
const balance = {
|
|
3638
|
+
address,
|
|
3639
|
+
tokenId: (0, import_chaindata_provider37.subDTaoTokenId)(networkId, netuid),
|
|
3640
|
+
baseTokenId: (0, import_chaindata_provider37.subDTaoTokenId)(networkId, netuid),
|
|
3641
|
+
stake: 0n,
|
|
3642
|
+
hotkey: lock.hotkey,
|
|
3643
|
+
netuid,
|
|
3644
|
+
scaledAlphaPrice,
|
|
3645
|
+
convictionLock: lock
|
|
3646
|
+
};
|
|
3647
|
+
upsertBalance(balancesRaw, address, balance.tokenId, balance);
|
|
3648
|
+
}
|
|
2965
3649
|
const balances = Object.values(balancesRaw);
|
|
2966
|
-
const tokensById = (0,
|
|
3650
|
+
const tokensById = (0, import_lodash_es19.keyBy)(
|
|
2967
3651
|
tokensWithAddresses.map(([token]) => token),
|
|
2968
3652
|
(t) => t.id
|
|
2969
3653
|
);
|
|
2970
3654
|
const dynamicTokens = [];
|
|
2971
3655
|
for (const bal of balances) {
|
|
3656
|
+
if (bal.tokenId === bal.baseTokenId) continue;
|
|
2972
3657
|
if (!balanceDefs.some((def) => def.token.id === bal.tokenId)) {
|
|
2973
3658
|
const baseToken = tokensById[bal.baseTokenId];
|
|
2974
3659
|
if (baseToken) {
|
|
2975
|
-
const cleanToken = (0,
|
|
2976
|
-
const newToken =
|
|
3660
|
+
const cleanToken = (0, import_chaindata_provider37.getCleanToken)(baseToken);
|
|
3661
|
+
const newToken = import_chaindata_provider37.TokenSchema.parse({
|
|
2977
3662
|
...cleanToken,
|
|
2978
3663
|
id: bal.tokenId,
|
|
2979
3664
|
hotkey: bal.hotkey
|
|
@@ -2989,6 +3674,8 @@ var fetchBalances7 = async ({
|
|
|
2989
3674
|
};
|
|
2990
3675
|
const stakeAmount = BigInt(stake?.stake?.toString() ?? "0");
|
|
2991
3676
|
const pendingRootClaimAmount = BigInt(stake?.pendingRootClaim?.toString() ?? "0");
|
|
3677
|
+
const convictionLockAmount = BigInt(stake?.convictionLock?.amount?.toString() ?? "0");
|
|
3678
|
+
const convictionLockConviction = BigInt(stake?.convictionLock?.convictionRaw ?? "0");
|
|
2992
3679
|
const hasZeroStake = stakeAmount === 0n;
|
|
2993
3680
|
const hasPendingRootClaim = pendingRootClaimAmount > 0n;
|
|
2994
3681
|
const balanceValue = {
|
|
@@ -3001,9 +3688,30 @@ var fetchBalances7 = async ({
|
|
|
3001
3688
|
type: "locked",
|
|
3002
3689
|
label: "Pending root claim",
|
|
3003
3690
|
amount: pendingRootClaimAmount.toString(),
|
|
3691
|
+
// The pending claim is not part of the stake (free amount): on-chain it only becomes
|
|
3692
|
+
// stake once claimed (root_claim_on_subnet). Since it was never included in `free`,
|
|
3693
|
+
// it must not be subtracted from it either: flag it so it does not reduce the staked
|
|
3694
|
+
// position's transferable amount.
|
|
3695
|
+
includeInTransferable: true,
|
|
3004
3696
|
meta
|
|
3005
3697
|
};
|
|
3006
3698
|
const values3 = [balanceValue, pendingRootClaimValue];
|
|
3699
|
+
if (stake?.convictionLock && (convictionLockAmount > 0n || convictionLockConviction > 0n)) {
|
|
3700
|
+
const convictionLockMeta = {
|
|
3701
|
+
...meta,
|
|
3702
|
+
convictionLock: {
|
|
3703
|
+
type: "conviction-lock",
|
|
3704
|
+
hotkey: stake.convictionLock.hotkey,
|
|
3705
|
+
lockType: stake.convictionLock.lockType
|
|
3706
|
+
}
|
|
3707
|
+
};
|
|
3708
|
+
values3.push({
|
|
3709
|
+
type: "locked",
|
|
3710
|
+
label: getConvictionLockLabel(stake.convictionLock.lockType),
|
|
3711
|
+
amount: convictionLockAmount.toString(),
|
|
3712
|
+
meta: convictionLockMeta
|
|
3713
|
+
});
|
|
3714
|
+
}
|
|
3007
3715
|
if (hasZeroStake && hasPendingRootClaim) {
|
|
3008
3716
|
values3.push({
|
|
3009
3717
|
type: "extra",
|
|
@@ -3017,7 +3725,7 @@ var fetchBalances7 = async ({
|
|
|
3017
3725
|
address: def.address,
|
|
3018
3726
|
networkId,
|
|
3019
3727
|
tokenId: def.token.id,
|
|
3020
|
-
source:
|
|
3728
|
+
source: MODULE_TYPE8,
|
|
3021
3729
|
status: "live",
|
|
3022
3730
|
values: values3
|
|
3023
3731
|
};
|
|
@@ -3041,7 +3749,7 @@ var fetchBalances7 = async ({
|
|
|
3041
3749
|
}
|
|
3042
3750
|
};
|
|
3043
3751
|
var buildStorageCoder = (metadataRpc, pallet, entry) => {
|
|
3044
|
-
const { builder } = (0,
|
|
3752
|
+
const { builder } = (0, import_scale7.parseMetadataRpc)(metadataRpc);
|
|
3045
3753
|
return builder.buildStorage(pallet, entry);
|
|
3046
3754
|
};
|
|
3047
3755
|
var buildRootClaimableStorageCoder = async (_connector, networkId, metadataRpc) => {
|
|
@@ -3085,7 +3793,7 @@ var buildRootClaimableQueries = (networkId, hotkeys, storageCoder) => {
|
|
|
3085
3793
|
if (!hexValue) {
|
|
3086
3794
|
return [hotkey, /* @__PURE__ */ new Map()];
|
|
3087
3795
|
}
|
|
3088
|
-
const decoded = (0,
|
|
3796
|
+
const decoded = (0, import_scale7.decodeScale)(
|
|
3089
3797
|
storageCoder,
|
|
3090
3798
|
hexValue,
|
|
3091
3799
|
`Failed to decode RootClaimable for hotkey ${hotkey} on ${networkId}`
|
|
@@ -3129,7 +3837,7 @@ var buildRootClaimedQueries = (networkId, addressHotkeyNetuidPairs, storageCoder
|
|
|
3129
3837
|
if (!hexValue) {
|
|
3130
3838
|
return [address, hotkey, netuid, 0n];
|
|
3131
3839
|
}
|
|
3132
|
-
const decoded = (0,
|
|
3840
|
+
const decoded = (0, import_scale7.decodeScale)(
|
|
3133
3841
|
storageCoder,
|
|
3134
3842
|
hexValue,
|
|
3135
3843
|
`Failed to decode RootClaimed for (netuid=${netuid}, hotkey=${hotkey}, address=${address}) on ${networkId}`
|
|
@@ -3184,15 +3892,15 @@ var fetchRootClaimedAmounts = async (connector, networkId, metadataRpc, addressH
|
|
|
3184
3892
|
};
|
|
3185
3893
|
|
|
3186
3894
|
// src/modules/substrate-dtao/fetchTokens.ts
|
|
3187
|
-
var
|
|
3188
|
-
var
|
|
3189
|
-
var
|
|
3190
|
-
var
|
|
3895
|
+
var import_chaindata_provider38 = require("@talismn/chaindata-provider");
|
|
3896
|
+
var import_scale8 = require("@talismn/scale");
|
|
3897
|
+
var import_util8 = require("@talismn/util");
|
|
3898
|
+
var import_lodash_es20 = require("lodash-es");
|
|
3191
3899
|
var NATIVE_TOKEN_SYMBOLS = {
|
|
3192
3900
|
"bittensor": "TAO",
|
|
3193
3901
|
"bittensor-testnet": "testTAO"
|
|
3194
3902
|
};
|
|
3195
|
-
var
|
|
3903
|
+
var fetchTokens8 = async ({
|
|
3196
3904
|
networkId,
|
|
3197
3905
|
connector,
|
|
3198
3906
|
tokens,
|
|
@@ -3211,7 +3919,7 @@ var fetchTokens7 = async ({
|
|
|
3211
3919
|
[]
|
|
3212
3920
|
)
|
|
3213
3921
|
]);
|
|
3214
|
-
return dynamicInfos.filter(
|
|
3922
|
+
return dynamicInfos.filter(import_util8.isNotNil).map((info) => {
|
|
3215
3923
|
const config = tokens.find((t) => t.netuid === info.netuid);
|
|
3216
3924
|
let symbol = new TextDecoder().decode(Uint8Array.from(info.token_symbol));
|
|
3217
3925
|
const subnetName = info.subnet_identity?.subnet_name?.asText() ?? (info.netuid === 0 ? "Root" : `Subnet ${info.netuid}`);
|
|
@@ -3220,9 +3928,9 @@ var fetchTokens7 = async ({
|
|
|
3220
3928
|
symbol = NATIVE_TOKEN_SYMBOLS[networkId];
|
|
3221
3929
|
const isTransferable = transferableTokensMap[info.netuid] ?? true;
|
|
3222
3930
|
const token = {
|
|
3223
|
-
id: (0,
|
|
3224
|
-
type:
|
|
3225
|
-
platform:
|
|
3931
|
+
id: (0, import_chaindata_provider38.subDTaoTokenId)(networkId, info.netuid),
|
|
3932
|
+
type: MODULE_TYPE8,
|
|
3933
|
+
platform: PLATFORM8,
|
|
3226
3934
|
networkId,
|
|
3227
3935
|
netuid: info.netuid,
|
|
3228
3936
|
isDefault: true,
|
|
@@ -3234,15 +3942,15 @@ var fetchTokens7 = async ({
|
|
|
3234
3942
|
};
|
|
3235
3943
|
return Object.assign({}, token, config);
|
|
3236
3944
|
}).filter((t) => {
|
|
3237
|
-
const parsed =
|
|
3945
|
+
const parsed = import_chaindata_provider38.SubDTaoTokenSchema.safeParse(t);
|
|
3238
3946
|
return parsed.success;
|
|
3239
3947
|
});
|
|
3240
3948
|
};
|
|
3241
3949
|
var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
|
|
3242
|
-
const { builder } = (0,
|
|
3950
|
+
const { builder } = (0, import_scale8.parseMetadataRpc)(metadata);
|
|
3243
3951
|
const transferToggleCodec = builder.buildStorage("SubtensorModule", "TransferToggle");
|
|
3244
3952
|
const transferToggleKeys = await connector.send(networkId, "state_getKeys", [
|
|
3245
|
-
(0,
|
|
3953
|
+
(0, import_scale8.getStorageKeyPrefix)("SubtensorModule", "TransferToggle")
|
|
3246
3954
|
]);
|
|
3247
3955
|
const transferToggleResults = await connector.send(
|
|
3248
3956
|
networkId,
|
|
@@ -3250,7 +3958,7 @@ var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
|
|
|
3250
3958
|
[transferToggleKeys]
|
|
3251
3959
|
);
|
|
3252
3960
|
const transferToggleEntries = transferToggleResults.length ? transferToggleResults[0].changes : [];
|
|
3253
|
-
return (0,
|
|
3961
|
+
return (0, import_lodash_es20.fromPairs)(
|
|
3254
3962
|
transferToggleEntries.map(([key, value]) => {
|
|
3255
3963
|
const [netuid] = transferToggleCodec.keys.dec(key);
|
|
3256
3964
|
const isTransferable = transferToggleCodec.value.dec(value);
|
|
@@ -3260,14 +3968,14 @@ var fetchTransferableTokensMap = async (connector, metadata, networkId) => {
|
|
|
3260
3968
|
};
|
|
3261
3969
|
|
|
3262
3970
|
// src/modules/substrate-dtao/getMiniMetadata.ts
|
|
3263
|
-
var
|
|
3264
|
-
var
|
|
3265
|
-
var
|
|
3971
|
+
var import_chaindata_provider39 = require("@talismn/chaindata-provider");
|
|
3972
|
+
var import_scale9 = require("@talismn/scale");
|
|
3973
|
+
var getMiniMetadata7 = ({
|
|
3266
3974
|
networkId,
|
|
3267
3975
|
specVersion,
|
|
3268
3976
|
metadataRpc
|
|
3269
3977
|
}) => {
|
|
3270
|
-
const source =
|
|
3978
|
+
const source = MODULE_TYPE8;
|
|
3271
3979
|
const chainId = networkId;
|
|
3272
3980
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
3273
3981
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -3275,7 +3983,7 @@ var getMiniMetadata6 = ({
|
|
|
3275
3983
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
3276
3984
|
);
|
|
3277
3985
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
3278
|
-
const { unifiedMetadata } = (0,
|
|
3986
|
+
const { unifiedMetadata } = (0, import_scale9.parseMetadataRpc)(metadataRpc);
|
|
3279
3987
|
if (unifiedMetadata.version < 14)
|
|
3280
3988
|
throw new Error(
|
|
3281
3989
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -3285,22 +3993,27 @@ var getMiniMetadata6 = ({
|
|
|
3285
3993
|
source,
|
|
3286
3994
|
chainId,
|
|
3287
3995
|
specVersion,
|
|
3288
|
-
version:
|
|
3996
|
+
version: import_chaindata_provider39.MINIMETADATA_VERSION,
|
|
3289
3997
|
data: getData(metadataRpc),
|
|
3290
3998
|
extra: null
|
|
3291
3999
|
};
|
|
3292
4000
|
};
|
|
3293
4001
|
var getData = (metadataRpc) => {
|
|
3294
|
-
const { metadata, unifiedMetadata } = (0,
|
|
4002
|
+
const { metadata, unifiedMetadata } = (0, import_scale9.parseMetadataRpc)(metadataRpc);
|
|
3295
4003
|
const isBittensor = unifiedMetadata.pallets.some(({ name }) => name === "SubtensorModule");
|
|
3296
4004
|
if (!isBittensor) return null;
|
|
3297
|
-
(0,
|
|
4005
|
+
(0, import_scale9.compactMetadata)(
|
|
3298
4006
|
metadata,
|
|
3299
|
-
[
|
|
4007
|
+
[
|
|
4008
|
+
{
|
|
4009
|
+
pallet: "SubtensorModule",
|
|
4010
|
+
items: ["TransferToggle", "RootClaimable", "RootClaimed", "Lock", "DecayingLock"]
|
|
4011
|
+
}
|
|
4012
|
+
],
|
|
3300
4013
|
[
|
|
3301
4014
|
{
|
|
3302
4015
|
runtimeApi: "StakeInfoRuntimeApi",
|
|
3303
|
-
methods: ["get_stake_info_for_coldkeys"]
|
|
4016
|
+
methods: ["get_stake_info_for_coldkeys", "get_coldkey_lock"]
|
|
3304
4017
|
},
|
|
3305
4018
|
{
|
|
3306
4019
|
runtimeApi: "SubnetInfoRuntimeApi",
|
|
@@ -3308,26 +4021,26 @@ var getData = (metadataRpc) => {
|
|
|
3308
4021
|
}
|
|
3309
4022
|
]
|
|
3310
4023
|
);
|
|
3311
|
-
return (0,
|
|
4024
|
+
return (0, import_scale9.encodeMetadata)(metadata);
|
|
3312
4025
|
};
|
|
3313
4026
|
|
|
3314
4027
|
// src/modules/substrate-dtao/getTransferCallData.ts
|
|
3315
4028
|
var import_utils3 = require("@polkadot-api/utils");
|
|
3316
|
-
var
|
|
3317
|
-
var
|
|
4029
|
+
var import_chaindata_provider40 = require("@talismn/chaindata-provider");
|
|
4030
|
+
var import_scale10 = require("@talismn/scale");
|
|
3318
4031
|
var import_polkadot_api = require("polkadot-api");
|
|
3319
|
-
var
|
|
4032
|
+
var getTransferCallData7 = ({
|
|
3320
4033
|
from: from2,
|
|
3321
4034
|
to,
|
|
3322
4035
|
value,
|
|
3323
4036
|
token,
|
|
3324
4037
|
metadataRpc
|
|
3325
4038
|
}) => {
|
|
3326
|
-
if (!(0,
|
|
3327
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
3328
|
-
const { netuid: subnetId, hotkey } = (0,
|
|
4039
|
+
if (!(0, import_chaindata_provider40.isTokenOfType)(token, MODULE_TYPE8))
|
|
4040
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE8}.`);
|
|
4041
|
+
const { netuid: subnetId, hotkey } = (0, import_chaindata_provider40.parseSubDTaoTokenId)(token.id);
|
|
3329
4042
|
if (!hotkey) throw new Error(`Missing hotkey`);
|
|
3330
|
-
const { builder } = (0,
|
|
4043
|
+
const { builder } = (0, import_scale10.parseMetadataRpc)(metadataRpc);
|
|
3331
4044
|
const { codec, location } = builder.buildCall("SubtensorModule", "transfer_stake");
|
|
3332
4045
|
const args = codec.enc({
|
|
3333
4046
|
origin_netuid: subnetId,
|
|
@@ -3344,22 +4057,23 @@ var getTransferCallData6 = ({
|
|
|
3344
4057
|
};
|
|
3345
4058
|
|
|
3346
4059
|
// src/modules/substrate-dtao/subscribeBalances.ts
|
|
3347
|
-
var
|
|
3348
|
-
var
|
|
3349
|
-
var
|
|
3350
|
-
var
|
|
4060
|
+
var import_lodash_es21 = require("lodash-es");
|
|
4061
|
+
var import_rxjs9 = require("rxjs");
|
|
4062
|
+
var SUBSCRIPTION_INTERVAL7 = 6e3;
|
|
4063
|
+
var subscribeBalances7 = ({
|
|
3351
4064
|
networkId,
|
|
3352
4065
|
tokensWithAddresses,
|
|
3353
4066
|
connector,
|
|
3354
4067
|
miniMetadata
|
|
3355
4068
|
}) => {
|
|
3356
|
-
if (!tokensWithAddresses.length) return (0,
|
|
3357
|
-
|
|
4069
|
+
if (!tokensWithAddresses.length) return (0, import_rxjs9.of)({ success: [], errors: [] });
|
|
4070
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4071
|
+
return new import_rxjs9.Observable((subscriber) => {
|
|
3358
4072
|
const abortController = new AbortController();
|
|
3359
4073
|
const poll = async () => {
|
|
3360
4074
|
try {
|
|
3361
4075
|
if (abortController.signal.aborted) return;
|
|
3362
|
-
const balances = await
|
|
4076
|
+
const balances = await fetchBalances8({
|
|
3363
4077
|
networkId,
|
|
3364
4078
|
tokensWithAddresses,
|
|
3365
4079
|
connector,
|
|
@@ -3367,41 +4081,50 @@ var subscribeBalances6 = ({
|
|
|
3367
4081
|
});
|
|
3368
4082
|
if (abortController.signal.aborted) return;
|
|
3369
4083
|
subscriber.next(balances);
|
|
3370
|
-
setTimeout(poll, SUBSCRIPTION_INTERVAL6);
|
|
3371
4084
|
} catch (error) {
|
|
4085
|
+
if (abortController.signal.aborted) return;
|
|
3372
4086
|
log_default.error("Error", {
|
|
3373
|
-
module:
|
|
4087
|
+
module: MODULE_TYPE8,
|
|
3374
4088
|
networkId,
|
|
3375
4089
|
miniMetadata,
|
|
3376
4090
|
addressesByToken: tokensWithAddresses,
|
|
3377
4091
|
error
|
|
3378
4092
|
});
|
|
3379
|
-
|
|
4093
|
+
const fetchError = error instanceof Error ? error : new Error(String(error));
|
|
4094
|
+
subscriber.next({
|
|
4095
|
+
success: [],
|
|
4096
|
+
errors: balanceDefs.map((def) => ({
|
|
4097
|
+
tokenId: def.token.id,
|
|
4098
|
+
address: def.address,
|
|
4099
|
+
error: fetchError
|
|
4100
|
+
}))
|
|
4101
|
+
});
|
|
3380
4102
|
}
|
|
4103
|
+
if (!abortController.signal.aborted) setTimeout(poll, SUBSCRIPTION_INTERVAL7);
|
|
3381
4104
|
};
|
|
3382
4105
|
poll();
|
|
3383
4106
|
return () => {
|
|
3384
4107
|
abortController.abort();
|
|
3385
4108
|
};
|
|
3386
|
-
}).pipe((0,
|
|
4109
|
+
}).pipe((0, import_rxjs9.distinctUntilChanged)(import_lodash_es21.isEqual));
|
|
3387
4110
|
};
|
|
3388
4111
|
|
|
3389
4112
|
// src/modules/substrate-dtao/module.ts
|
|
3390
4113
|
var SubDTaoBalanceModule = {
|
|
3391
|
-
type:
|
|
3392
|
-
platform:
|
|
3393
|
-
getMiniMetadata:
|
|
3394
|
-
fetchTokens:
|
|
3395
|
-
fetchBalances:
|
|
3396
|
-
subscribeBalances:
|
|
3397
|
-
getTransferCallData:
|
|
4114
|
+
type: MODULE_TYPE8,
|
|
4115
|
+
platform: PLATFORM8,
|
|
4116
|
+
getMiniMetadata: getMiniMetadata7,
|
|
4117
|
+
fetchTokens: fetchTokens8,
|
|
4118
|
+
fetchBalances: fetchBalances8,
|
|
4119
|
+
subscribeBalances: subscribeBalances7,
|
|
4120
|
+
getTransferCallData: getTransferCallData7
|
|
3398
4121
|
};
|
|
3399
4122
|
|
|
3400
4123
|
// src/modules/substrate-dtao/types.ts
|
|
3401
|
-
var
|
|
3402
|
-
var
|
|
3403
|
-
var SubDTaoTokenConfigSchema =
|
|
3404
|
-
netuid:
|
|
4124
|
+
var import_chaindata_provider41 = require("@talismn/chaindata-provider");
|
|
4125
|
+
var import_v411 = __toESM(require("zod/v4"));
|
|
4126
|
+
var SubDTaoTokenConfigSchema = import_v411.default.strictObject({
|
|
4127
|
+
netuid: import_chaindata_provider41.SubDTaoTokenSchema.shape.netuid,
|
|
3405
4128
|
...TokenConfigBaseSchema.shape
|
|
3406
4129
|
});
|
|
3407
4130
|
|
|
@@ -3409,7 +4132,7 @@ var SubDTaoTokenConfigSchema = import_v49.default.strictObject({
|
|
|
3409
4132
|
function excludeFromTransferableAmount(locks) {
|
|
3410
4133
|
if (typeof locks === "string") return BigInt(locks);
|
|
3411
4134
|
if (!Array.isArray(locks)) locks = [locks];
|
|
3412
|
-
return locks.filter((lock) => lock.includeInTransferable !== true).map((lock) => lock.amount.planck).reduce((max, lock) =>
|
|
4135
|
+
return locks.filter((lock) => lock.includeInTransferable !== true).map((lock) => lock.amount.planck).reduce((max, lock) => import_util9.BigMath.max(max, lock), 0n);
|
|
3413
4136
|
}
|
|
3414
4137
|
function excludeFromFeePayableLocks(locks) {
|
|
3415
4138
|
if (typeof locks === "string") return [];
|
|
@@ -3437,7 +4160,7 @@ var Balances = class _Balances {
|
|
|
3437
4160
|
if (balances instanceof Balance) return new _Balances([balances], hydrate);
|
|
3438
4161
|
if (!Array.isArray(balances)) return new _Balances(Object.values(balances), hydrate);
|
|
3439
4162
|
if (balances.length === 0) return this;
|
|
3440
|
-
if (!(0,
|
|
4163
|
+
if (!(0, import_util9.isArrayOf)(balances, Balance))
|
|
3441
4164
|
return new _Balances(
|
|
3442
4165
|
balances.map((storage) => new Balance(storage)),
|
|
3443
4166
|
hydrate
|
|
@@ -3631,7 +4354,7 @@ var Balance = class {
|
|
|
3631
4354
|
if (hydrate !== void 0) this.#db = hydrate;
|
|
3632
4355
|
};
|
|
3633
4356
|
#format = (balance) => new BalanceFormatter(
|
|
3634
|
-
(0,
|
|
4357
|
+
(0, import_util9.isBigInt)(balance) ? balance.toString() : balance,
|
|
3635
4358
|
this.decimals || void 0,
|
|
3636
4359
|
this.rates
|
|
3637
4360
|
);
|
|
@@ -3667,8 +4390,8 @@ var Balance = class {
|
|
|
3667
4390
|
}
|
|
3668
4391
|
get rates() {
|
|
3669
4392
|
if (this.isSource("evm-uniswapv2") && this.token?.type === "evm-uniswapv2") {
|
|
3670
|
-
const tokenId0 = (0,
|
|
3671
|
-
const tokenId1 = (0,
|
|
4393
|
+
const tokenId0 = (0, import_chaindata_provider42.evmErc20TokenId)(this.networkId, this.token.tokenAddress0);
|
|
4394
|
+
const tokenId1 = (0, import_chaindata_provider42.evmErc20TokenId)(this.networkId, this.token.tokenAddress1);
|
|
3672
4395
|
const decimals = this.token.decimals;
|
|
3673
4396
|
const decimals0 = this.token.decimals0;
|
|
3674
4397
|
const decimals1 = this.token.decimals1;
|
|
@@ -3680,9 +4403,9 @@ var Balance = class {
|
|
|
3680
4403
|
const totalSupply = extras.find((extra2) => extra2.label === "totalSupply")?.amount ?? "0";
|
|
3681
4404
|
const reserve0 = extras.find((extra2) => extra2.label === "reserve0")?.amount ?? "0";
|
|
3682
4405
|
const reserve1 = extras.find((extra2) => extra2.label === "reserve1")?.amount ?? "0";
|
|
3683
|
-
const totalSupplyTokens = (
|
|
3684
|
-
const reserve0Tokens = (
|
|
3685
|
-
const reserve1Tokens = (
|
|
4406
|
+
const totalSupplyTokens = configureBigNumber_default(totalSupply).times(10 ** (-1 * decimals));
|
|
4407
|
+
const reserve0Tokens = configureBigNumber_default(reserve0).times(10 ** (-1 * decimals0));
|
|
4408
|
+
const reserve1Tokens = configureBigNumber_default(reserve1).times(10 ** (-1 * decimals1));
|
|
3686
4409
|
const rates0Currencies = new Set(Object.keys(rates0));
|
|
3687
4410
|
const rates1Currencies = new Set(Object.keys(rates1));
|
|
3688
4411
|
const currencies = [...rates0Currencies].filter((c) => rates1Currencies.has(c));
|
|
@@ -3690,7 +4413,7 @@ var Balance = class {
|
|
|
3690
4413
|
(currency) => [
|
|
3691
4414
|
currency,
|
|
3692
4415
|
// tvl (in a given currency) == reserve0*currencyRate0 + reserve1*currencyRate1
|
|
3693
|
-
|
|
4416
|
+
configureBigNumber_default.sum(
|
|
3694
4417
|
reserve0Tokens.times(rates0[currency]?.price ?? 0),
|
|
3695
4418
|
reserve1Tokens.times(rates1[currency]?.price ?? 0)
|
|
3696
4419
|
)
|
|
@@ -3776,7 +4499,7 @@ var Balance = class {
|
|
|
3776
4499
|
/** The frozen balance of this token. Is included in the free amount. */
|
|
3777
4500
|
get locked() {
|
|
3778
4501
|
return this.#format(
|
|
3779
|
-
this.locks.map(({ amount }) => amount.planck).reduce((a, b) =>
|
|
4502
|
+
this.locks.map(({ amount }) => amount.planck).reduce((a, b) => import_util9.BigMath.max(a, b), 0n)
|
|
3780
4503
|
);
|
|
3781
4504
|
}
|
|
3782
4505
|
get locks() {
|
|
@@ -3800,15 +4523,15 @@ var Balance = class {
|
|
|
3800
4523
|
const oldTransferableCalculation = () => {
|
|
3801
4524
|
if (this.locks.length === 0) return this.free;
|
|
3802
4525
|
const excludeAmount = excludeFromTransferableAmount(this.locks);
|
|
3803
|
-
return this.#format(
|
|
4526
|
+
return this.#format(import_util9.BigMath.max(this.free.planck - excludeAmount, 0n));
|
|
3804
4527
|
};
|
|
3805
4528
|
const newTransferableCalculation = () => {
|
|
3806
4529
|
if (this.locks.length === 0) return this.free;
|
|
3807
|
-
const untouchableAmount =
|
|
4530
|
+
const untouchableAmount = import_util9.BigMath.max(
|
|
3808
4531
|
excludeFromTransferableAmount(this.locks) - this.reserved.planck,
|
|
3809
4532
|
0n
|
|
3810
4533
|
);
|
|
3811
|
-
return this.#format(
|
|
4534
|
+
return this.#format(import_util9.BigMath.max(this.free.planck - untouchableAmount, 0n));
|
|
3812
4535
|
};
|
|
3813
4536
|
if (this.#storage.useLegacyTransferableCalculation) return oldTransferableCalculation();
|
|
3814
4537
|
return newTransferableCalculation();
|
|
@@ -3820,7 +4543,7 @@ var Balance = class {
|
|
|
3820
4543
|
*/
|
|
3821
4544
|
get unavailable() {
|
|
3822
4545
|
const oldCalculation = () => this.locked.planck + this.reserved.planck;
|
|
3823
|
-
const newCalculation = () =>
|
|
4546
|
+
const newCalculation = () => import_util9.BigMath.max(this.locked.planck, this.reserved.planck);
|
|
3824
4547
|
const baseUnavailable = this.#storage.useLegacyTransferableCalculation ? oldCalculation() : newCalculation();
|
|
3825
4548
|
const nomPoolStakedPlancks = this.locks.some(
|
|
3826
4549
|
(lock) => lock.source === "substrate-native-holds" && lock.label === "DelegatedStaking"
|
|
@@ -3830,8 +4553,8 @@ var Balance = class {
|
|
|
3830
4553
|
/** The feePayable balance of this token. Is generally the free amount - the feeFrozen amount. */
|
|
3831
4554
|
get feePayable() {
|
|
3832
4555
|
if (this.locks.length === 0) return this.free;
|
|
3833
|
-
const excludeAmount = excludeFromFeePayableLocks(this.locked.planck.toString()).map((lock) => BigInt(lock.amount)).reduce((max, lock) =>
|
|
3834
|
-
return this.#format(
|
|
4556
|
+
const excludeAmount = excludeFromFeePayableLocks(this.locked.planck.toString()).map((lock) => BigInt(lock.amount)).reduce((max, lock) => import_util9.BigMath.max(max, lock), 0n);
|
|
4557
|
+
return this.#format(import_util9.BigMath.max(this.free.planck - excludeAmount, 0n));
|
|
3835
4558
|
}
|
|
3836
4559
|
};
|
|
3837
4560
|
var BalanceValueGetter = class {
|
|
@@ -3854,7 +4577,7 @@ var BalanceFormatter = class {
|
|
|
3854
4577
|
#decimals;
|
|
3855
4578
|
#tokenRates;
|
|
3856
4579
|
constructor(planck, decimals, fiatRatios) {
|
|
3857
|
-
this.#planck = (0,
|
|
4580
|
+
this.#planck = (0, import_util9.isBigInt)(planck) ? planck.toString() : planck ?? "0";
|
|
3858
4581
|
this.#decimals = decimals || 0;
|
|
3859
4582
|
this.#tokenRates = fiatRatios || null;
|
|
3860
4583
|
}
|
|
@@ -3863,7 +4586,7 @@ var BalanceFormatter = class {
|
|
|
3863
4586
|
return BigInt(this.#planck);
|
|
3864
4587
|
}
|
|
3865
4588
|
get tokens() {
|
|
3866
|
-
return (0,
|
|
4589
|
+
return (0, import_util9.planckToTokens)(this.#planck, this.#decimals);
|
|
3867
4590
|
}
|
|
3868
4591
|
fiat(currency) {
|
|
3869
4592
|
if (!this.#tokenRates) return null;
|
|
@@ -4057,23 +4780,23 @@ var getValueId = (amount) => {
|
|
|
4057
4780
|
};
|
|
4058
4781
|
|
|
4059
4782
|
// src/types/minimetadatas.ts
|
|
4060
|
-
var
|
|
4061
|
-
var
|
|
4783
|
+
var import_chaindata_provider43 = require("@talismn/chaindata-provider");
|
|
4784
|
+
var import_scale11 = require("@talismn/scale");
|
|
4062
4785
|
var deriveMiniMetadataId = ({
|
|
4063
4786
|
source,
|
|
4064
4787
|
chainId,
|
|
4065
4788
|
specVersion
|
|
4066
|
-
}) => (0,
|
|
4067
|
-
(0,
|
|
4789
|
+
}) => (0, import_scale11.toHex)(
|
|
4790
|
+
(0, import_scale11.Twox128)(new TextEncoder().encode(`${source}${chainId}${specVersion}${import_chaindata_provider43.MINIMETADATA_VERSION}`))
|
|
4068
4791
|
).slice(-32);
|
|
4069
4792
|
|
|
4070
4793
|
// src/modules/substrate-assets/getMiniMetadata.ts
|
|
4071
|
-
var
|
|
4794
|
+
var getMiniMetadata8 = ({
|
|
4072
4795
|
networkId,
|
|
4073
4796
|
specVersion,
|
|
4074
4797
|
metadataRpc
|
|
4075
4798
|
}) => {
|
|
4076
|
-
const source =
|
|
4799
|
+
const source = MODULE_TYPE7;
|
|
4077
4800
|
const chainId = networkId;
|
|
4078
4801
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
4079
4802
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -4081,7 +4804,7 @@ var getMiniMetadata7 = ({
|
|
|
4081
4804
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
4082
4805
|
);
|
|
4083
4806
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
4084
|
-
const { unifiedMetadata } = (0,
|
|
4807
|
+
const { unifiedMetadata } = (0, import_scale12.parseMetadataRpc)(metadataRpc);
|
|
4085
4808
|
if (unifiedMetadata.version < 14)
|
|
4086
4809
|
throw new Error(
|
|
4087
4810
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -4091,24 +4814,24 @@ var getMiniMetadata7 = ({
|
|
|
4091
4814
|
source,
|
|
4092
4815
|
chainId,
|
|
4093
4816
|
specVersion,
|
|
4094
|
-
version:
|
|
4817
|
+
version: import_chaindata_provider44.MINIMETADATA_VERSION,
|
|
4095
4818
|
data: getData2(metadataRpc),
|
|
4096
4819
|
extra: null
|
|
4097
4820
|
};
|
|
4098
4821
|
};
|
|
4099
4822
|
var getData2 = (metadataRpc) => {
|
|
4100
|
-
const { metadata, unifiedMetadata } = (0,
|
|
4823
|
+
const { metadata, unifiedMetadata } = (0, import_scale12.parseMetadataRpc)(metadataRpc);
|
|
4101
4824
|
if (!hasStorageItems(unifiedMetadata, "Assets", ["Account", "Asset", "Metadata"])) return null;
|
|
4102
|
-
(0,
|
|
4103
|
-
return (0,
|
|
4825
|
+
(0, import_scale12.compactMetadata)(metadata, [{ pallet: "Assets", items: ["Account", "Asset", "Metadata"] }]);
|
|
4826
|
+
return (0, import_scale12.encodeMetadata)(metadata);
|
|
4104
4827
|
};
|
|
4105
4828
|
|
|
4106
4829
|
// src/modules/substrate-assets/getTransferCallData.ts
|
|
4107
4830
|
var import_utils4 = require("@polkadot-api/utils");
|
|
4108
|
-
var
|
|
4109
|
-
var
|
|
4831
|
+
var import_chaindata_provider45 = require("@talismn/chaindata-provider");
|
|
4832
|
+
var import_scale13 = require("@talismn/scale");
|
|
4110
4833
|
var import_polkadot_api2 = require("polkadot-api");
|
|
4111
|
-
var
|
|
4834
|
+
var getTransferCallData8 = ({
|
|
4112
4835
|
from: from2,
|
|
4113
4836
|
to,
|
|
4114
4837
|
value,
|
|
@@ -4116,9 +4839,9 @@ var getTransferCallData7 = ({
|
|
|
4116
4839
|
type,
|
|
4117
4840
|
metadataRpc
|
|
4118
4841
|
}) => {
|
|
4119
|
-
if (!(0,
|
|
4120
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
4121
|
-
const { builder } = (0,
|
|
4842
|
+
if (!(0, import_chaindata_provider45.isTokenOfType)(token, MODULE_TYPE7))
|
|
4843
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE7}.`);
|
|
4844
|
+
const { builder } = (0, import_scale13.parseMetadataRpc)(metadataRpc);
|
|
4122
4845
|
const method = getTransferMethod(type);
|
|
4123
4846
|
const { codec, location } = builder.buildCall("Assets", method);
|
|
4124
4847
|
const args = getEncodedArgs(method, token.assetId, to, value, codec);
|
|
@@ -4206,18 +4929,18 @@ var getTransferAllEncodedArgs = (assetId, to, codec) => {
|
|
|
4206
4929
|
};
|
|
4207
4930
|
|
|
4208
4931
|
// src/modules/substrate-assets/subscribeBalances.ts
|
|
4209
|
-
var
|
|
4210
|
-
var
|
|
4932
|
+
var import_rxjs10 = require("rxjs");
|
|
4933
|
+
var subscribeBalances8 = ({
|
|
4211
4934
|
networkId,
|
|
4212
4935
|
tokensWithAddresses,
|
|
4213
4936
|
connector,
|
|
4214
4937
|
miniMetadata
|
|
4215
4938
|
}) => {
|
|
4216
|
-
if (!tokensWithAddresses.length) return (0,
|
|
4939
|
+
if (!tokensWithAddresses.length) return (0, import_rxjs10.of)({ success: [], errors: [] });
|
|
4217
4940
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4218
4941
|
const queries = buildQueries(networkId, balanceDefs, miniMetadata);
|
|
4219
4942
|
return getRpcQueryPack$(connector, networkId, queries).pipe(
|
|
4220
|
-
(0,
|
|
4943
|
+
(0, import_rxjs10.map)((balances) => ({
|
|
4221
4944
|
success: balances,
|
|
4222
4945
|
errors: []
|
|
4223
4946
|
}))
|
|
@@ -4226,31 +4949,31 @@ var subscribeBalances7 = ({
|
|
|
4226
4949
|
|
|
4227
4950
|
// src/modules/substrate-assets/module.ts
|
|
4228
4951
|
var SubAssetsBalanceModule = {
|
|
4229
|
-
type:
|
|
4230
|
-
platform:
|
|
4231
|
-
getMiniMetadata:
|
|
4232
|
-
fetchTokens:
|
|
4233
|
-
fetchBalances:
|
|
4234
|
-
subscribeBalances:
|
|
4235
|
-
getTransferCallData:
|
|
4952
|
+
type: MODULE_TYPE7,
|
|
4953
|
+
platform: PLATFORM7,
|
|
4954
|
+
getMiniMetadata: getMiniMetadata8,
|
|
4955
|
+
fetchTokens: fetchTokens7,
|
|
4956
|
+
fetchBalances: fetchBalances7,
|
|
4957
|
+
subscribeBalances: subscribeBalances8,
|
|
4958
|
+
getTransferCallData: getTransferCallData8
|
|
4236
4959
|
};
|
|
4237
4960
|
|
|
4238
4961
|
// src/modules/substrate-assets/types.ts
|
|
4239
|
-
var
|
|
4240
|
-
var
|
|
4241
|
-
var SubAssetsTokenConfigSchema =
|
|
4242
|
-
assetId:
|
|
4962
|
+
var import_chaindata_provider46 = require("@talismn/chaindata-provider");
|
|
4963
|
+
var import_v412 = __toESM(require("zod/v4"));
|
|
4964
|
+
var SubAssetsTokenConfigSchema = import_v412.default.strictObject({
|
|
4965
|
+
assetId: import_chaindata_provider46.SubAssetsTokenSchema.shape.assetId,
|
|
4243
4966
|
...TokenConfigBaseSchema.shape
|
|
4244
4967
|
});
|
|
4245
4968
|
|
|
4246
4969
|
// src/modules/substrate-foreignassets/config.ts
|
|
4247
|
-
var
|
|
4248
|
-
var
|
|
4249
|
-
var
|
|
4970
|
+
var import_chaindata_provider47 = require("@talismn/chaindata-provider");
|
|
4971
|
+
var MODULE_TYPE9 = import_chaindata_provider47.SubForeignAssetsTokenSchema.shape.type.value;
|
|
4972
|
+
var PLATFORM9 = import_chaindata_provider47.SubForeignAssetsTokenSchema.shape.platform.value;
|
|
4250
4973
|
|
|
4251
4974
|
// src/modules/substrate-foreignassets/buildQueries.ts
|
|
4252
|
-
var
|
|
4253
|
-
var
|
|
4975
|
+
var import_scale14 = require("@talismn/scale");
|
|
4976
|
+
var import_util10 = require("@talismn/util");
|
|
4254
4977
|
var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
|
|
4255
4978
|
const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
|
|
4256
4979
|
storage: ["ForeignAssets", "Account"]
|
|
@@ -4259,7 +4982,7 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
4259
4982
|
const scaleCoder = networkStorageCoders?.storage;
|
|
4260
4983
|
const getStateKey = (onChainId) => {
|
|
4261
4984
|
try {
|
|
4262
|
-
return scaleCoder?.keys?.enc?.((0,
|
|
4985
|
+
return scaleCoder?.keys?.enc?.((0, import_scale14.papiParse)(onChainId), address);
|
|
4263
4986
|
} catch {
|
|
4264
4987
|
return null;
|
|
4265
4988
|
}
|
|
@@ -4272,7 +4995,7 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
4272
4995
|
return null;
|
|
4273
4996
|
}
|
|
4274
4997
|
const decodeResult = (changes) => {
|
|
4275
|
-
const decoded = (0,
|
|
4998
|
+
const decoded = (0, import_scale14.decodeScale)(
|
|
4276
4999
|
scaleCoder,
|
|
4277
5000
|
changes[0],
|
|
4278
5001
|
`Failed to decode substrate-assets balance on chain ${networkId}`
|
|
@@ -4305,11 +5028,11 @@ var buildQueries2 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
4305
5028
|
stateKeys: [stateKey],
|
|
4306
5029
|
decodeResult
|
|
4307
5030
|
};
|
|
4308
|
-
}).filter(
|
|
5031
|
+
}).filter(import_util10.isNotNil);
|
|
4309
5032
|
};
|
|
4310
5033
|
|
|
4311
5034
|
// src/modules/substrate-foreignassets/fetchBalances.ts
|
|
4312
|
-
var
|
|
5035
|
+
var fetchBalances9 = async ({
|
|
4313
5036
|
networkId,
|
|
4314
5037
|
tokensWithAddresses,
|
|
4315
5038
|
connector,
|
|
@@ -4318,7 +5041,7 @@ var fetchBalances8 = async ({
|
|
|
4318
5041
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
4319
5042
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4320
5043
|
if (!miniMetadata?.data) {
|
|
4321
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
5044
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE9} balances on ${networkId}.`);
|
|
4322
5045
|
return {
|
|
4323
5046
|
success: [],
|
|
4324
5047
|
errors: balanceDefs.map((def) => ({
|
|
@@ -4328,20 +5051,20 @@ var fetchBalances8 = async ({
|
|
|
4328
5051
|
}))
|
|
4329
5052
|
};
|
|
4330
5053
|
}
|
|
4331
|
-
if (miniMetadata.source !==
|
|
4332
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
5054
|
+
if (miniMetadata.source !== MODULE_TYPE9) {
|
|
5055
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE9}.`);
|
|
4333
5056
|
return {
|
|
4334
5057
|
success: [],
|
|
4335
5058
|
errors: balanceDefs.map((def) => ({
|
|
4336
5059
|
tokenId: def.token.id,
|
|
4337
5060
|
address: def.address,
|
|
4338
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
5061
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE9}`)
|
|
4339
5062
|
}))
|
|
4340
5063
|
};
|
|
4341
5064
|
}
|
|
4342
5065
|
if (miniMetadata.chainId !== networkId) {
|
|
4343
5066
|
log_default.warn(
|
|
4344
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
5067
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE9}. Expected chainId is ${networkId}`
|
|
4345
5068
|
);
|
|
4346
5069
|
return {
|
|
4347
5070
|
success: [],
|
|
@@ -4365,7 +5088,7 @@ var fetchBalances8 = async ({
|
|
|
4365
5088
|
address: def.address,
|
|
4366
5089
|
networkId,
|
|
4367
5090
|
tokenId: def.token.id,
|
|
4368
|
-
source:
|
|
5091
|
+
source: MODULE_TYPE9,
|
|
4369
5092
|
status: "live",
|
|
4370
5093
|
values: [
|
|
4371
5094
|
{ type: "free", label: "free", amount: "0" },
|
|
@@ -4379,10 +5102,10 @@ var fetchBalances8 = async ({
|
|
|
4379
5102
|
};
|
|
4380
5103
|
|
|
4381
5104
|
// src/modules/substrate-foreignassets/fetchTokens.ts
|
|
4382
|
-
var
|
|
4383
|
-
var
|
|
4384
|
-
var
|
|
4385
|
-
var
|
|
5105
|
+
var import_chaindata_provider48 = require("@talismn/chaindata-provider");
|
|
5106
|
+
var import_scale15 = require("@talismn/scale");
|
|
5107
|
+
var import_lodash_es22 = require("lodash-es");
|
|
5108
|
+
var fetchTokens9 = async ({
|
|
4386
5109
|
networkId,
|
|
4387
5110
|
tokens,
|
|
4388
5111
|
connector,
|
|
@@ -4390,15 +5113,15 @@ var fetchTokens8 = async ({
|
|
|
4390
5113
|
}) => {
|
|
4391
5114
|
const anyMiniMetadata = miniMetadata;
|
|
4392
5115
|
if (!anyMiniMetadata?.data) return [];
|
|
4393
|
-
const { builder } = (0,
|
|
5116
|
+
const { builder } = (0, import_scale15.parseMetadataRpc)(anyMiniMetadata.data);
|
|
4394
5117
|
const assetCodec = builder.buildStorage("ForeignAssets", "Asset");
|
|
4395
5118
|
const metadataCodec = builder.buildStorage("ForeignAssets", "Metadata");
|
|
4396
5119
|
const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([
|
|
4397
5120
|
connector.send(networkId, "state_getKeys", [
|
|
4398
|
-
(0,
|
|
5121
|
+
(0, import_scale15.getStorageKeyPrefix)("ForeignAssets", "Asset")
|
|
4399
5122
|
]),
|
|
4400
5123
|
connector.send(networkId, "state_getKeys", [
|
|
4401
|
-
(0,
|
|
5124
|
+
(0, import_scale15.getStorageKeyPrefix)("ForeignAssets", "Metadata")
|
|
4402
5125
|
])
|
|
4403
5126
|
]);
|
|
4404
5127
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([
|
|
@@ -4407,19 +5130,19 @@ var fetchTokens8 = async ({
|
|
|
4407
5130
|
]);
|
|
4408
5131
|
const assetStorageEntries = assetStorageResults[0]?.changes ?? [];
|
|
4409
5132
|
const metadataStorageEntries = metadataStorageResults[0]?.changes ?? [];
|
|
4410
|
-
const assetByOnChainId = (0,
|
|
5133
|
+
const assetByOnChainId = (0, import_lodash_es22.keyBy)(
|
|
4411
5134
|
assetStorageEntries.map(([key, value]) => {
|
|
4412
5135
|
const [decodedKey] = assetCodec.keys.dec(key);
|
|
4413
|
-
const onChainId = (0,
|
|
5136
|
+
const onChainId = (0, import_scale15.papiStringify)(decodedKey);
|
|
4414
5137
|
const asset = assetCodec.value.dec(value);
|
|
4415
5138
|
return { onChainId, existentialDeposit: asset.min_balance, isSufficient: asset.is_sufficient };
|
|
4416
5139
|
}),
|
|
4417
5140
|
(a) => a.onChainId
|
|
4418
5141
|
);
|
|
4419
|
-
const metadataByOnChainId = (0,
|
|
5142
|
+
const metadataByOnChainId = (0, import_lodash_es22.keyBy)(
|
|
4420
5143
|
metadataStorageEntries.map(([key, value]) => {
|
|
4421
5144
|
const [decodedKey] = metadataCodec.keys.dec(key);
|
|
4422
|
-
const onChainId = (0,
|
|
5145
|
+
const onChainId = (0, import_scale15.papiStringify)(decodedKey);
|
|
4423
5146
|
const metadata = metadataCodec.value.dec(value);
|
|
4424
5147
|
return {
|
|
4425
5148
|
onChainId,
|
|
@@ -4431,14 +5154,14 @@ var fetchTokens8 = async ({
|
|
|
4431
5154
|
}),
|
|
4432
5155
|
(a) => a.onChainId
|
|
4433
5156
|
);
|
|
4434
|
-
const allTokens = (0,
|
|
4435
|
-
(onChainId) => (0,
|
|
5157
|
+
const allTokens = (0, import_lodash_es22.keys)(assetByOnChainId).map(
|
|
5158
|
+
(onChainId) => (0, import_lodash_es22.assign)({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? void 0)
|
|
4436
5159
|
);
|
|
4437
|
-
const configTokenByOnChainId = (0,
|
|
5160
|
+
const configTokenByOnChainId = (0, import_lodash_es22.keyBy)(tokens, (t) => t.onChainId);
|
|
4438
5161
|
return allTokens.map(
|
|
4439
5162
|
(asset) => ({
|
|
4440
|
-
id: (0,
|
|
4441
|
-
type:
|
|
5163
|
+
id: (0, import_chaindata_provider48.subForeignAssetTokenId)(networkId, asset.onChainId),
|
|
5164
|
+
type: MODULE_TYPE9,
|
|
4442
5165
|
platform: "polkadot",
|
|
4443
5166
|
networkId,
|
|
4444
5167
|
onChainId: String(asset.onChainId),
|
|
@@ -4455,22 +5178,22 @@ var fetchTokens8 = async ({
|
|
|
4455
5178
|
return configToken || token.isSufficient;
|
|
4456
5179
|
}).map((token) => {
|
|
4457
5180
|
const configToken = configTokenByOnChainId[token.onChainId];
|
|
4458
|
-
return configToken ? (0,
|
|
5181
|
+
return configToken ? (0, import_lodash_es22.assign)({}, token, configToken) : token;
|
|
4459
5182
|
}).filter((t) => {
|
|
4460
|
-
const parsed =
|
|
5183
|
+
const parsed = import_chaindata_provider48.SubForeignAssetsTokenSchema.safeParse(t);
|
|
4461
5184
|
return parsed.success;
|
|
4462
5185
|
});
|
|
4463
5186
|
};
|
|
4464
5187
|
|
|
4465
5188
|
// src/modules/substrate-foreignassets/getMiniMetadata.ts
|
|
4466
|
-
var
|
|
4467
|
-
var
|
|
4468
|
-
var
|
|
5189
|
+
var import_chaindata_provider49 = require("@talismn/chaindata-provider");
|
|
5190
|
+
var import_scale16 = require("@talismn/scale");
|
|
5191
|
+
var getMiniMetadata9 = ({
|
|
4469
5192
|
networkId,
|
|
4470
5193
|
specVersion,
|
|
4471
5194
|
metadataRpc
|
|
4472
5195
|
}) => {
|
|
4473
|
-
const source =
|
|
5196
|
+
const source = MODULE_TYPE9;
|
|
4474
5197
|
const chainId = networkId;
|
|
4475
5198
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
4476
5199
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -4478,7 +5201,7 @@ var getMiniMetadata8 = ({
|
|
|
4478
5201
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
4479
5202
|
);
|
|
4480
5203
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
4481
|
-
const { unifiedMetadata } = (0,
|
|
5204
|
+
const { unifiedMetadata } = (0, import_scale16.parseMetadataRpc)(metadataRpc);
|
|
4482
5205
|
if (unifiedMetadata.version < 14)
|
|
4483
5206
|
throw new Error(
|
|
4484
5207
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -4488,25 +5211,25 @@ var getMiniMetadata8 = ({
|
|
|
4488
5211
|
source,
|
|
4489
5212
|
chainId,
|
|
4490
5213
|
specVersion,
|
|
4491
|
-
version:
|
|
5214
|
+
version: import_chaindata_provider49.MINIMETADATA_VERSION,
|
|
4492
5215
|
data: getData3(metadataRpc),
|
|
4493
5216
|
extra: null
|
|
4494
5217
|
};
|
|
4495
5218
|
};
|
|
4496
5219
|
var getData3 = (metadataRpc) => {
|
|
4497
|
-
const { metadata, unifiedMetadata } = (0,
|
|
5220
|
+
const { metadata, unifiedMetadata } = (0, import_scale16.parseMetadataRpc)(metadataRpc);
|
|
4498
5221
|
if (!hasStorageItems(unifiedMetadata, "ForeignAssets", ["Account", "Asset", "Metadata"]))
|
|
4499
5222
|
return null;
|
|
4500
|
-
(0,
|
|
4501
|
-
return (0,
|
|
5223
|
+
(0, import_scale16.compactMetadata)(metadata, [{ pallet: "ForeignAssets", items: ["Account", "Asset", "Metadata"] }]);
|
|
5224
|
+
return (0, import_scale16.encodeMetadata)(metadata);
|
|
4502
5225
|
};
|
|
4503
5226
|
|
|
4504
5227
|
// src/modules/substrate-foreignassets/getTransferCallData.ts
|
|
4505
5228
|
var import_utils5 = require("@polkadot-api/utils");
|
|
4506
|
-
var
|
|
4507
|
-
var
|
|
5229
|
+
var import_chaindata_provider50 = require("@talismn/chaindata-provider");
|
|
5230
|
+
var import_scale17 = require("@talismn/scale");
|
|
4508
5231
|
var import_polkadot_api3 = require("polkadot-api");
|
|
4509
|
-
var
|
|
5232
|
+
var getTransferCallData9 = ({
|
|
4510
5233
|
from: from2,
|
|
4511
5234
|
to,
|
|
4512
5235
|
value,
|
|
@@ -4514,9 +5237,9 @@ var getTransferCallData8 = ({
|
|
|
4514
5237
|
type,
|
|
4515
5238
|
metadataRpc
|
|
4516
5239
|
}) => {
|
|
4517
|
-
if (!(0,
|
|
4518
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
4519
|
-
const { builder } = (0,
|
|
5240
|
+
if (!(0, import_chaindata_provider50.isTokenOfType)(token, MODULE_TYPE9))
|
|
5241
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE9}.`);
|
|
5242
|
+
const { builder } = (0, import_scale17.parseMetadataRpc)(metadataRpc);
|
|
4520
5243
|
const method = getTransferMethod2(type);
|
|
4521
5244
|
const { codec, location } = builder.buildCall("ForeignAssets", method);
|
|
4522
5245
|
const args = getEncodedArgs2(method, token.onChainId, to, value, codec);
|
|
@@ -4563,13 +5286,13 @@ var getEncodedValue2 = (codec, possibleValue) => {
|
|
|
4563
5286
|
var getTransferEncodedArgs2 = (onChainId, to, value, codec) => {
|
|
4564
5287
|
return getEncodedValue2(codec, [
|
|
4565
5288
|
() => ({
|
|
4566
|
-
id: (0,
|
|
5289
|
+
id: (0, import_scale17.papiParse)(onChainId),
|
|
4567
5290
|
// for most networks
|
|
4568
5291
|
target: (0, import_polkadot_api3.Enum)("Id", to),
|
|
4569
5292
|
amount: BigInt(value)
|
|
4570
5293
|
}),
|
|
4571
5294
|
() => ({
|
|
4572
|
-
id: (0,
|
|
5295
|
+
id: (0, import_scale17.papiParse)(onChainId),
|
|
4573
5296
|
// for Neuroweb
|
|
4574
5297
|
target: to,
|
|
4575
5298
|
amount: BigInt(value)
|
|
@@ -4579,13 +5302,13 @@ var getTransferEncodedArgs2 = (onChainId, to, value, codec) => {
|
|
|
4579
5302
|
var getTransferAllEncodedArgs2 = (onChainId, to, codec) => {
|
|
4580
5303
|
return getEncodedValue2(codec, [
|
|
4581
5304
|
() => ({
|
|
4582
|
-
id: (0,
|
|
5305
|
+
id: (0, import_scale17.papiParse)(onChainId),
|
|
4583
5306
|
// for most networks
|
|
4584
5307
|
dest: (0, import_polkadot_api3.Enum)("Id", to),
|
|
4585
5308
|
keep_alive: false
|
|
4586
5309
|
}),
|
|
4587
5310
|
() => ({
|
|
4588
|
-
id: (0,
|
|
5311
|
+
id: (0, import_scale17.papiParse)(onChainId),
|
|
4589
5312
|
// for Neuroweb
|
|
4590
5313
|
dest: to,
|
|
4591
5314
|
keep_alive: false
|
|
@@ -4594,18 +5317,18 @@ var getTransferAllEncodedArgs2 = (onChainId, to, codec) => {
|
|
|
4594
5317
|
};
|
|
4595
5318
|
|
|
4596
5319
|
// src/modules/substrate-foreignassets/subscribeBalances.ts
|
|
4597
|
-
var
|
|
4598
|
-
var
|
|
5320
|
+
var import_rxjs11 = require("rxjs");
|
|
5321
|
+
var subscribeBalances9 = ({
|
|
4599
5322
|
networkId,
|
|
4600
5323
|
tokensWithAddresses,
|
|
4601
5324
|
connector,
|
|
4602
5325
|
miniMetadata
|
|
4603
5326
|
}) => {
|
|
4604
|
-
if (!tokensWithAddresses.length) return (0,
|
|
5327
|
+
if (!tokensWithAddresses.length) return (0, import_rxjs11.of)({ success: [], errors: [] });
|
|
4605
5328
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4606
5329
|
const queries = buildQueries2(networkId, balanceDefs, miniMetadata);
|
|
4607
5330
|
return getRpcQueryPack$(connector, networkId, queries).pipe(
|
|
4608
|
-
(0,
|
|
5331
|
+
(0, import_rxjs11.map)((balances) => ({
|
|
4609
5332
|
success: balances,
|
|
4610
5333
|
errors: []
|
|
4611
5334
|
}))
|
|
@@ -4614,31 +5337,31 @@ var subscribeBalances8 = ({
|
|
|
4614
5337
|
|
|
4615
5338
|
// src/modules/substrate-foreignassets/module.ts
|
|
4616
5339
|
var SubForeignAssetsBalanceModule = {
|
|
4617
|
-
type:
|
|
4618
|
-
platform:
|
|
4619
|
-
getMiniMetadata:
|
|
4620
|
-
fetchTokens:
|
|
4621
|
-
fetchBalances:
|
|
4622
|
-
subscribeBalances:
|
|
4623
|
-
getTransferCallData:
|
|
5340
|
+
type: MODULE_TYPE9,
|
|
5341
|
+
platform: PLATFORM9,
|
|
5342
|
+
getMiniMetadata: getMiniMetadata9,
|
|
5343
|
+
fetchTokens: fetchTokens9,
|
|
5344
|
+
fetchBalances: fetchBalances9,
|
|
5345
|
+
subscribeBalances: subscribeBalances9,
|
|
5346
|
+
getTransferCallData: getTransferCallData9
|
|
4624
5347
|
};
|
|
4625
5348
|
|
|
4626
5349
|
// src/modules/substrate-foreignassets/types.ts
|
|
4627
|
-
var
|
|
4628
|
-
var
|
|
4629
|
-
var SubForeignAssetsTokenConfigSchema =
|
|
4630
|
-
onChainId:
|
|
5350
|
+
var import_chaindata_provider51 = require("@talismn/chaindata-provider");
|
|
5351
|
+
var import_v413 = __toESM(require("zod/v4"));
|
|
5352
|
+
var SubForeignAssetsTokenConfigSchema = import_v413.default.strictObject({
|
|
5353
|
+
onChainId: import_chaindata_provider51.SubForeignAssetsTokenSchema.shape.onChainId,
|
|
4631
5354
|
...TokenConfigBaseSchema.shape
|
|
4632
5355
|
});
|
|
4633
5356
|
|
|
4634
5357
|
// src/modules/substrate-hydration/config.ts
|
|
4635
|
-
var
|
|
4636
|
-
var
|
|
4637
|
-
var
|
|
5358
|
+
var import_chaindata_provider52 = require("@talismn/chaindata-provider");
|
|
5359
|
+
var MODULE_TYPE10 = import_chaindata_provider52.SubHydrationTokenSchema.shape.type.value;
|
|
5360
|
+
var PLATFORM10 = import_chaindata_provider52.SubHydrationTokenSchema.shape.platform.value;
|
|
4638
5361
|
|
|
4639
5362
|
// src/modules/substrate-hydration/fetchBalances.ts
|
|
4640
|
-
var
|
|
4641
|
-
var
|
|
5363
|
+
var import_lodash_es23 = require("lodash-es");
|
|
5364
|
+
var fetchBalances10 = async ({
|
|
4642
5365
|
networkId,
|
|
4643
5366
|
tokensWithAddresses,
|
|
4644
5367
|
connector,
|
|
@@ -4647,7 +5370,7 @@ var fetchBalances9 = async ({
|
|
|
4647
5370
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
4648
5371
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
4649
5372
|
if (!miniMetadata?.data) {
|
|
4650
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
5373
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE10} balances on ${networkId}.`, {
|
|
4651
5374
|
tokensWithAddresses
|
|
4652
5375
|
});
|
|
4653
5376
|
return {
|
|
@@ -4659,20 +5382,20 @@ var fetchBalances9 = async ({
|
|
|
4659
5382
|
}))
|
|
4660
5383
|
};
|
|
4661
5384
|
}
|
|
4662
|
-
if (miniMetadata.source !==
|
|
4663
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
5385
|
+
if (miniMetadata.source !== MODULE_TYPE10) {
|
|
5386
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE10}.`);
|
|
4664
5387
|
return {
|
|
4665
5388
|
success: [],
|
|
4666
5389
|
errors: balanceDefs.map((def) => ({
|
|
4667
5390
|
tokenId: def.token.id,
|
|
4668
5391
|
address: def.address,
|
|
4669
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
5392
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE10}`)
|
|
4670
5393
|
}))
|
|
4671
5394
|
};
|
|
4672
5395
|
}
|
|
4673
5396
|
if (miniMetadata.chainId !== networkId) {
|
|
4674
5397
|
log_default.warn(
|
|
4675
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
5398
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE10}. Expected chainId is ${networkId}`
|
|
4676
5399
|
);
|
|
4677
5400
|
return {
|
|
4678
5401
|
success: [],
|
|
@@ -4683,7 +5406,7 @@ var fetchBalances9 = async ({
|
|
|
4683
5406
|
}))
|
|
4684
5407
|
};
|
|
4685
5408
|
}
|
|
4686
|
-
const addresses = (0,
|
|
5409
|
+
const addresses = (0, import_lodash_es23.uniq)(balanceDefs.map((def) => def.address));
|
|
4687
5410
|
try {
|
|
4688
5411
|
const res = await Promise.all(
|
|
4689
5412
|
addresses.map(
|
|
@@ -4699,16 +5422,16 @@ var fetchBalances9 = async ({
|
|
|
4699
5422
|
frozen: balance.frozen.toString()
|
|
4700
5423
|
})).filter((b) => b.onChainId !== void 0);
|
|
4701
5424
|
});
|
|
4702
|
-
const balancesByKey = (0,
|
|
5425
|
+
const balancesByKey = (0, import_lodash_es23.keyBy)(fetchedBalances, (b) => `${b.address}:${b.onChainId}`);
|
|
4703
5426
|
const success = tokensWithAddresses.reduce((acc, [token, addresses2]) => {
|
|
4704
|
-
if (token.type ===
|
|
5427
|
+
if (token.type === MODULE_TYPE10)
|
|
4705
5428
|
for (const address of addresses2) {
|
|
4706
5429
|
const rawBalance = balancesByKey[`${address}:${token.onChainId}`];
|
|
4707
5430
|
const balance = {
|
|
4708
5431
|
address,
|
|
4709
5432
|
networkId,
|
|
4710
5433
|
tokenId: token.id,
|
|
4711
|
-
source:
|
|
5434
|
+
source: MODULE_TYPE10,
|
|
4712
5435
|
status: "live",
|
|
4713
5436
|
values: [
|
|
4714
5437
|
{
|
|
@@ -4751,10 +5474,10 @@ var fetchBalances9 = async ({
|
|
|
4751
5474
|
};
|
|
4752
5475
|
|
|
4753
5476
|
// src/modules/substrate-hydration/fetchTokens.ts
|
|
4754
|
-
var
|
|
4755
|
-
var
|
|
4756
|
-
var
|
|
4757
|
-
var
|
|
5477
|
+
var import_chaindata_provider53 = require("@talismn/chaindata-provider");
|
|
5478
|
+
var import_scale18 = require("@talismn/scale");
|
|
5479
|
+
var import_lodash_es24 = require("lodash-es");
|
|
5480
|
+
var fetchTokens10 = async ({
|
|
4758
5481
|
networkId,
|
|
4759
5482
|
tokens,
|
|
4760
5483
|
connector,
|
|
@@ -4762,10 +5485,10 @@ var fetchTokens9 = async ({
|
|
|
4762
5485
|
}) => {
|
|
4763
5486
|
const anyMiniMetadata = miniMetadata;
|
|
4764
5487
|
if (!anyMiniMetadata?.data) return [];
|
|
4765
|
-
const { builder } = (0,
|
|
5488
|
+
const { builder } = (0, import_scale18.parseMetadataRpc)(anyMiniMetadata.data);
|
|
4766
5489
|
const assetsCodec = builder.buildStorage("AssetRegistry", "Assets");
|
|
4767
5490
|
const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [
|
|
4768
|
-
(0,
|
|
5491
|
+
(0, import_scale18.getStorageKeyPrefix)("AssetRegistry", "Assets")
|
|
4769
5492
|
]);
|
|
4770
5493
|
const assetStorageResults = await connector.send(
|
|
4771
5494
|
networkId,
|
|
@@ -4773,7 +5496,7 @@ var fetchTokens9 = async ({
|
|
|
4773
5496
|
[allAssetStorageKeys]
|
|
4774
5497
|
);
|
|
4775
5498
|
const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : [];
|
|
4776
|
-
const configTokenByAssetId = (0,
|
|
5499
|
+
const configTokenByAssetId = (0, import_lodash_es24.keyBy)(tokens, (t) => t.onChainId);
|
|
4777
5500
|
return assetStorageEntries.map(([key, value]) => {
|
|
4778
5501
|
const [onChainId] = assetsCodec.keys.dec(key);
|
|
4779
5502
|
const asset = assetsCodec.value.dec(value);
|
|
@@ -4788,8 +5511,8 @@ var fetchTokens9 = async ({
|
|
|
4788
5511
|
};
|
|
4789
5512
|
}).map(
|
|
4790
5513
|
(asset) => ({
|
|
4791
|
-
id: (0,
|
|
4792
|
-
type:
|
|
5514
|
+
id: (0, import_chaindata_provider53.subHydrationTokenId)(networkId, asset.onChainId),
|
|
5515
|
+
type: MODULE_TYPE10,
|
|
4793
5516
|
platform: "polkadot",
|
|
4794
5517
|
networkId,
|
|
4795
5518
|
onChainId: asset.onChainId,
|
|
@@ -4807,22 +5530,22 @@ var fetchTokens9 = async ({
|
|
|
4807
5530
|
return configToken || token.isSufficient;
|
|
4808
5531
|
}).map((token) => {
|
|
4809
5532
|
const configToken = configTokenByAssetId[token.onChainId];
|
|
4810
|
-
return configToken ? (0,
|
|
5533
|
+
return configToken ? (0, import_lodash_es24.assign)({}, token, configToken) : token;
|
|
4811
5534
|
}).filter((t) => {
|
|
4812
|
-
const parsed =
|
|
5535
|
+
const parsed = import_chaindata_provider53.SubHydrationTokenSchema.safeParse(t);
|
|
4813
5536
|
return parsed.success;
|
|
4814
5537
|
});
|
|
4815
5538
|
};
|
|
4816
5539
|
|
|
4817
5540
|
// src/modules/substrate-hydration/getMiniMetadata.ts
|
|
4818
|
-
var
|
|
4819
|
-
var
|
|
4820
|
-
var
|
|
5541
|
+
var import_chaindata_provider54 = require("@talismn/chaindata-provider");
|
|
5542
|
+
var import_scale19 = require("@talismn/scale");
|
|
5543
|
+
var getMiniMetadata10 = ({
|
|
4821
5544
|
networkId,
|
|
4822
5545
|
specVersion,
|
|
4823
5546
|
metadataRpc
|
|
4824
5547
|
}) => {
|
|
4825
|
-
const source =
|
|
5548
|
+
const source = MODULE_TYPE10;
|
|
4826
5549
|
const chainId = networkId;
|
|
4827
5550
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
4828
5551
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -4830,7 +5553,7 @@ var getMiniMetadata9 = ({
|
|
|
4830
5553
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
4831
5554
|
);
|
|
4832
5555
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
4833
|
-
const { unifiedMetadata } = (0,
|
|
5556
|
+
const { unifiedMetadata } = (0, import_scale19.parseMetadataRpc)(metadataRpc);
|
|
4834
5557
|
if (unifiedMetadata.version < 14)
|
|
4835
5558
|
throw new Error(
|
|
4836
5559
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -4840,16 +5563,16 @@ var getMiniMetadata9 = ({
|
|
|
4840
5563
|
source,
|
|
4841
5564
|
chainId,
|
|
4842
5565
|
specVersion,
|
|
4843
|
-
version:
|
|
5566
|
+
version: import_chaindata_provider54.MINIMETADATA_VERSION,
|
|
4844
5567
|
data: getData4(metadataRpc),
|
|
4845
5568
|
extra: null
|
|
4846
5569
|
};
|
|
4847
5570
|
};
|
|
4848
5571
|
var getData4 = (metadataRpc) => {
|
|
4849
|
-
const { metadata, unifiedMetadata } = (0,
|
|
5572
|
+
const { metadata, unifiedMetadata } = (0, import_scale19.parseMetadataRpc)(metadataRpc);
|
|
4850
5573
|
if (!hasStorageItem(unifiedMetadata, "AssetRegistry", "Assets") || !hasStorageItem(unifiedMetadata, "Tokens", "Accounts") || !hasRuntimeApi(unifiedMetadata, "CurrenciesApi", "accounts"))
|
|
4851
5574
|
return null;
|
|
4852
|
-
(0,
|
|
5575
|
+
(0, import_scale19.compactMetadata)(
|
|
4853
5576
|
metadata,
|
|
4854
5577
|
[
|
|
4855
5578
|
{ pallet: "AssetRegistry", items: ["Assets"] },
|
|
@@ -4864,24 +5587,24 @@ var getData4 = (metadataRpc) => {
|
|
|
4864
5587
|
}
|
|
4865
5588
|
]
|
|
4866
5589
|
);
|
|
4867
|
-
return (0,
|
|
5590
|
+
return (0, import_scale19.encodeMetadata)(metadata);
|
|
4868
5591
|
};
|
|
4869
5592
|
|
|
4870
5593
|
// src/modules/substrate-hydration/getTransferCallData.ts
|
|
4871
5594
|
var import_utils6 = require("@polkadot-api/utils");
|
|
4872
|
-
var
|
|
4873
|
-
var
|
|
5595
|
+
var import_chaindata_provider55 = require("@talismn/chaindata-provider");
|
|
5596
|
+
var import_scale20 = require("@talismn/scale");
|
|
4874
5597
|
var import_polkadot_api4 = require("polkadot-api");
|
|
4875
|
-
var
|
|
5598
|
+
var getTransferCallData10 = ({
|
|
4876
5599
|
from: from2,
|
|
4877
5600
|
to,
|
|
4878
5601
|
value,
|
|
4879
5602
|
token,
|
|
4880
5603
|
metadataRpc
|
|
4881
5604
|
}) => {
|
|
4882
|
-
if (!(0,
|
|
4883
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
4884
|
-
const { builder } = (0,
|
|
5605
|
+
if (!(0, import_chaindata_provider55.isTokenOfType)(token, MODULE_TYPE10))
|
|
5606
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE10}.`);
|
|
5607
|
+
const { builder } = (0, import_scale20.parseMetadataRpc)(metadataRpc);
|
|
4885
5608
|
const { codec, location } = builder.buildCall("Currencies", "transfer");
|
|
4886
5609
|
const args = {
|
|
4887
5610
|
dest: to,
|
|
@@ -4896,22 +5619,22 @@ var getTransferCallData9 = ({
|
|
|
4896
5619
|
};
|
|
4897
5620
|
|
|
4898
5621
|
// src/modules/substrate-hydration/subscribeBalances.ts
|
|
4899
|
-
var
|
|
4900
|
-
var
|
|
4901
|
-
var
|
|
4902
|
-
var
|
|
5622
|
+
var import_lodash_es25 = require("lodash-es");
|
|
5623
|
+
var import_rxjs12 = require("rxjs");
|
|
5624
|
+
var SUBSCRIPTION_INTERVAL8 = 6e3;
|
|
5625
|
+
var subscribeBalances10 = ({
|
|
4903
5626
|
networkId,
|
|
4904
5627
|
tokensWithAddresses,
|
|
4905
5628
|
connector,
|
|
4906
5629
|
miniMetadata
|
|
4907
5630
|
}) => {
|
|
4908
|
-
if (!tokensWithAddresses.length) return (0,
|
|
4909
|
-
return new
|
|
5631
|
+
if (!tokensWithAddresses.length) return (0, import_rxjs12.of)({ success: [], errors: [] });
|
|
5632
|
+
return new import_rxjs12.Observable((subscriber) => {
|
|
4910
5633
|
const abortController = new AbortController();
|
|
4911
5634
|
const poll = async () => {
|
|
4912
5635
|
try {
|
|
4913
5636
|
if (abortController.signal.aborted) return;
|
|
4914
|
-
const balances = await
|
|
5637
|
+
const balances = await fetchBalances10({
|
|
4915
5638
|
networkId,
|
|
4916
5639
|
tokensWithAddresses,
|
|
4917
5640
|
connector,
|
|
@@ -4919,10 +5642,10 @@ var subscribeBalances9 = ({
|
|
|
4919
5642
|
});
|
|
4920
5643
|
if (abortController.signal.aborted) return;
|
|
4921
5644
|
subscriber.next(balances);
|
|
4922
|
-
setTimeout(poll,
|
|
5645
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL8);
|
|
4923
5646
|
} catch (error) {
|
|
4924
5647
|
log_default.error("Error", {
|
|
4925
|
-
module:
|
|
5648
|
+
module: MODULE_TYPE10,
|
|
4926
5649
|
networkId,
|
|
4927
5650
|
miniMetadata,
|
|
4928
5651
|
addressesByToken: tokensWithAddresses,
|
|
@@ -4935,36 +5658,36 @@ var subscribeBalances9 = ({
|
|
|
4935
5658
|
return () => {
|
|
4936
5659
|
abortController.abort();
|
|
4937
5660
|
};
|
|
4938
|
-
}).pipe((0,
|
|
5661
|
+
}).pipe((0, import_rxjs12.distinctUntilChanged)(import_lodash_es25.isEqual));
|
|
4939
5662
|
};
|
|
4940
5663
|
|
|
4941
5664
|
// src/modules/substrate-hydration/module.ts
|
|
4942
5665
|
var SubHydrationBalanceModule = {
|
|
4943
|
-
type:
|
|
4944
|
-
platform:
|
|
4945
|
-
getMiniMetadata:
|
|
4946
|
-
fetchTokens:
|
|
4947
|
-
fetchBalances:
|
|
4948
|
-
subscribeBalances:
|
|
4949
|
-
getTransferCallData:
|
|
5666
|
+
type: MODULE_TYPE10,
|
|
5667
|
+
platform: PLATFORM10,
|
|
5668
|
+
getMiniMetadata: getMiniMetadata10,
|
|
5669
|
+
fetchTokens: fetchTokens10,
|
|
5670
|
+
fetchBalances: fetchBalances10,
|
|
5671
|
+
subscribeBalances: subscribeBalances10,
|
|
5672
|
+
getTransferCallData: getTransferCallData10
|
|
4950
5673
|
};
|
|
4951
5674
|
|
|
4952
5675
|
// src/modules/substrate-hydration/types.ts
|
|
4953
|
-
var
|
|
4954
|
-
var
|
|
4955
|
-
var SubHydrationTokenConfigSchema =
|
|
4956
|
-
onChainId:
|
|
5676
|
+
var import_chaindata_provider56 = require("@talismn/chaindata-provider");
|
|
5677
|
+
var import_v414 = __toESM(require("zod/v4"));
|
|
5678
|
+
var SubHydrationTokenConfigSchema = import_v414.default.strictObject({
|
|
5679
|
+
onChainId: import_chaindata_provider56.SubHydrationTokenSchema.shape.onChainId,
|
|
4957
5680
|
...TokenConfigBaseSchema.shape
|
|
4958
5681
|
});
|
|
4959
5682
|
|
|
4960
5683
|
// src/modules/substrate-native/config.ts
|
|
4961
|
-
var
|
|
4962
|
-
var
|
|
4963
|
-
var
|
|
5684
|
+
var import_chaindata_provider57 = require("@talismn/chaindata-provider");
|
|
5685
|
+
var MODULE_TYPE11 = import_chaindata_provider57.SubNativeTokenSchema.shape.type.value;
|
|
5686
|
+
var PLATFORM11 = import_chaindata_provider57.SubNativeTokenSchema.shape.platform.value;
|
|
4964
5687
|
|
|
4965
5688
|
// src/modules/substrate-native/queries/buildBaseQueries.ts
|
|
4966
|
-
var
|
|
4967
|
-
var
|
|
5689
|
+
var import_scale21 = require("@talismn/scale");
|
|
5690
|
+
var import_util11 = require("@talismn/util");
|
|
4968
5691
|
|
|
4969
5692
|
// src/modules/substrate-native/util/lockTypes.ts
|
|
4970
5693
|
var import_upperFirst = __toESM(require("lodash-es/upperFirst"));
|
|
@@ -5125,10 +5848,10 @@ var buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
|
|
|
5125
5848
|
return { balance, nomPoolMemberInfo };
|
|
5126
5849
|
}
|
|
5127
5850
|
};
|
|
5128
|
-
}).filter(
|
|
5851
|
+
}).filter(import_util11.isNotNil);
|
|
5129
5852
|
};
|
|
5130
5853
|
var decodeBaseResult = (coder, value, networkId) => {
|
|
5131
|
-
const decoded = (0,
|
|
5854
|
+
const decoded = (0, import_scale21.decodeScale)(
|
|
5132
5855
|
coder,
|
|
5133
5856
|
value,
|
|
5134
5857
|
`Failed to decode base native balance on chain ${networkId}`
|
|
@@ -5148,7 +5871,7 @@ var decodeBaseResult = (coder, value, networkId) => {
|
|
|
5148
5871
|
return newValues;
|
|
5149
5872
|
};
|
|
5150
5873
|
var decodeLocksResult = (coder, value, networkId) => {
|
|
5151
|
-
const decoded = (0,
|
|
5874
|
+
const decoded = (0, import_scale21.decodeScale)(
|
|
5152
5875
|
coder,
|
|
5153
5876
|
value,
|
|
5154
5877
|
`Failed to decode lock on chain ${networkId}`
|
|
@@ -5163,7 +5886,7 @@ var decodeLocksResult = (coder, value, networkId) => {
|
|
|
5163
5886
|
return locksQueryLocks;
|
|
5164
5887
|
};
|
|
5165
5888
|
var decodeFreezesResult = (coder, value, networkId) => {
|
|
5166
|
-
const decoded = (0,
|
|
5889
|
+
const decoded = (0, import_scale21.decodeScale)(
|
|
5167
5890
|
coder,
|
|
5168
5891
|
value,
|
|
5169
5892
|
`Failed to decode freeze on chain ${networkId}`
|
|
@@ -5177,7 +5900,7 @@ var decodeFreezesResult = (coder, value, networkId) => {
|
|
|
5177
5900
|
return freezesValues;
|
|
5178
5901
|
};
|
|
5179
5902
|
var decodeHoldsResult = (coder, value, networkId) => {
|
|
5180
|
-
const decoded = (0,
|
|
5903
|
+
const decoded = (0, import_scale21.decodeScale)(
|
|
5181
5904
|
coder,
|
|
5182
5905
|
value,
|
|
5183
5906
|
`Failed to decode holds on chain ${networkId}`
|
|
@@ -5193,7 +5916,7 @@ var decodeHoldsResult = (coder, value, networkId) => {
|
|
|
5193
5916
|
return holdsValues;
|
|
5194
5917
|
};
|
|
5195
5918
|
var decodeStakingLedgerResult = (coder, value, networkId) => {
|
|
5196
|
-
const decoded = (0,
|
|
5919
|
+
const decoded = (0, import_scale21.decodeScale)(
|
|
5197
5920
|
coder,
|
|
5198
5921
|
value,
|
|
5199
5922
|
`Failed to decode unbonding query on chain ${networkId}`
|
|
@@ -5210,7 +5933,7 @@ var decodeStakingLedgerResult = (coder, value, networkId) => {
|
|
|
5210
5933
|
return stakingLedgerResults;
|
|
5211
5934
|
};
|
|
5212
5935
|
var decodePoolMemberResult = (coder, value, networkId) => {
|
|
5213
|
-
const decoded = (0,
|
|
5936
|
+
const decoded = (0, import_scale21.decodeScale)(
|
|
5214
5937
|
coder,
|
|
5215
5938
|
value,
|
|
5216
5939
|
`Failed to decode poolMembers on chain ${networkId}`
|
|
@@ -5232,7 +5955,7 @@ var decodePoolMemberResult = (coder, value, networkId) => {
|
|
|
5232
5955
|
};
|
|
5233
5956
|
|
|
5234
5957
|
// src/modules/substrate-native/queries/buildNomPoolQueries.ts
|
|
5235
|
-
var
|
|
5958
|
+
var import_scale22 = require("@talismn/scale");
|
|
5236
5959
|
|
|
5237
5960
|
// src/modules/substrate-native/util/nompoolAccountId.ts
|
|
5238
5961
|
var import_utils7 = require("@polkadot-api/utils");
|
|
@@ -5325,7 +6048,7 @@ var getNomPoolCoders = (networkId, miniMetadata) => {
|
|
|
5325
6048
|
});
|
|
5326
6049
|
};
|
|
5327
6050
|
var decodePoolPoints = (coder, value, networkId) => {
|
|
5328
|
-
const decoded = (0,
|
|
6051
|
+
const decoded = (0, import_scale22.decodeScale)(
|
|
5329
6052
|
coder,
|
|
5330
6053
|
value,
|
|
5331
6054
|
`Failed to decode bondedPools on chain ${networkId}`
|
|
@@ -5333,7 +6056,7 @@ var decodePoolPoints = (coder, value, networkId) => {
|
|
|
5333
6056
|
return { poolPoints: decoded?.points.toString() };
|
|
5334
6057
|
};
|
|
5335
6058
|
var decodePoolStake = (coder, value, networkId) => {
|
|
5336
|
-
const decoded = (0,
|
|
6059
|
+
const decoded = (0, import_scale22.decodeScale)(
|
|
5337
6060
|
coder,
|
|
5338
6061
|
value,
|
|
5339
6062
|
`Failed to decode ledger on chain ${networkId}`
|
|
@@ -5341,7 +6064,7 @@ var decodePoolStake = (coder, value, networkId) => {
|
|
|
5341
6064
|
return { poolTotalActiveStake: decoded?.active.toString() };
|
|
5342
6065
|
};
|
|
5343
6066
|
var decodePoolMeta = (coder, value, networkId) => {
|
|
5344
|
-
const decoded = (0,
|
|
6067
|
+
const decoded = (0, import_scale22.decodeScale)(
|
|
5345
6068
|
coder,
|
|
5346
6069
|
value,
|
|
5347
6070
|
`Failed to decode metadata on chain ${networkId}`
|
|
@@ -5365,11 +6088,11 @@ var getNomPoolStateKeys = (coders, nomPoolMemberInfo, extra) => {
|
|
|
5365
6088
|
};
|
|
5366
6089
|
|
|
5367
6090
|
// src/modules/substrate-native/fetchBalances.ts
|
|
5368
|
-
var
|
|
6091
|
+
var fetchBalances11 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
5369
6092
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
5370
6093
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
5371
6094
|
if (!miniMetadata?.data) {
|
|
5372
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
6095
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE11} balances on ${networkId}.`);
|
|
5373
6096
|
return {
|
|
5374
6097
|
success: [],
|
|
5375
6098
|
errors: balanceDefs.map((def) => ({
|
|
@@ -5379,20 +6102,20 @@ var fetchBalances10 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
5379
6102
|
}))
|
|
5380
6103
|
};
|
|
5381
6104
|
}
|
|
5382
|
-
if (miniMetadata.source !==
|
|
5383
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
6105
|
+
if (miniMetadata.source !== MODULE_TYPE11) {
|
|
6106
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE11}.`);
|
|
5384
6107
|
return {
|
|
5385
6108
|
success: [],
|
|
5386
6109
|
errors: balanceDefs.map((def) => ({
|
|
5387
6110
|
tokenId: def.token.id,
|
|
5388
6111
|
address: def.address,
|
|
5389
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
6112
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE11}`)
|
|
5390
6113
|
}))
|
|
5391
6114
|
};
|
|
5392
6115
|
}
|
|
5393
6116
|
if (miniMetadata.chainId !== networkId) {
|
|
5394
6117
|
log_default.warn(
|
|
5395
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
6118
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE11}. Expected chainId is ${networkId}`
|
|
5396
6119
|
);
|
|
5397
6120
|
return {
|
|
5398
6121
|
success: [],
|
|
@@ -5411,10 +6134,10 @@ var fetchBalances10 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
5411
6134
|
};
|
|
5412
6135
|
|
|
5413
6136
|
// src/modules/substrate-native/fetchTokens.ts
|
|
5414
|
-
var
|
|
5415
|
-
var
|
|
5416
|
-
var
|
|
5417
|
-
var
|
|
6137
|
+
var import_chaindata_provider58 = require("@talismn/chaindata-provider");
|
|
6138
|
+
var import_lodash_es26 = require("lodash-es");
|
|
6139
|
+
var import_v415 = __toESM(require("zod/v4"));
|
|
6140
|
+
var fetchTokens11 = async ({ networkId, tokens, connector, miniMetadata }) => {
|
|
5418
6141
|
if (miniMetadata.extra.disable) return [];
|
|
5419
6142
|
const { tokenSymbol: symbol, tokenDecimals: decimals } = await getChainProperties(
|
|
5420
6143
|
connector,
|
|
@@ -5424,7 +6147,7 @@ var fetchTokens10 = async ({ networkId, tokens, connector, miniMetadata }) => {
|
|
|
5424
6147
|
log_default.warn(`Substrate native module: existentialDeposit is undefined for ${networkId}, using 0`);
|
|
5425
6148
|
const tokenConfig = tokens[0];
|
|
5426
6149
|
const nativeToken = {
|
|
5427
|
-
id: (0,
|
|
6150
|
+
id: (0, import_chaindata_provider58.subNativeTokenId)(networkId),
|
|
5428
6151
|
type: "substrate-native",
|
|
5429
6152
|
platform: "polkadot",
|
|
5430
6153
|
networkId,
|
|
@@ -5434,22 +6157,22 @@ var fetchTokens10 = async ({ networkId, tokens, connector, miniMetadata }) => {
|
|
|
5434
6157
|
decimals,
|
|
5435
6158
|
existentialDeposit: miniMetadata.extra.existentialDeposit ?? "0"
|
|
5436
6159
|
};
|
|
5437
|
-
const token = (0,
|
|
5438
|
-
const parsed =
|
|
6160
|
+
const token = (0, import_lodash_es26.assign)(nativeToken, tokenConfig);
|
|
6161
|
+
const parsed = import_chaindata_provider58.SubNativeTokenSchema.safeParse(token);
|
|
5439
6162
|
if (!parsed.success) {
|
|
5440
6163
|
return [];
|
|
5441
6164
|
}
|
|
5442
6165
|
return [parsed.data];
|
|
5443
6166
|
};
|
|
5444
|
-
var DotNetworkPropertiesSimple =
|
|
5445
|
-
tokenDecimals:
|
|
5446
|
-
tokenSymbol:
|
|
6167
|
+
var DotNetworkPropertiesSimple = import_v415.default.object({
|
|
6168
|
+
tokenDecimals: import_v415.default.number().optional().default(0),
|
|
6169
|
+
tokenSymbol: import_v415.default.string().optional().default("Unit")
|
|
5447
6170
|
});
|
|
5448
|
-
var DotNetworkPropertiesArray =
|
|
5449
|
-
tokenDecimals:
|
|
5450
|
-
tokenSymbol:
|
|
6171
|
+
var DotNetworkPropertiesArray = import_v415.default.object({
|
|
6172
|
+
tokenDecimals: import_v415.default.array(import_v415.default.number()).nonempty(),
|
|
6173
|
+
tokenSymbol: import_v415.default.array(import_v415.default.string()).nonempty()
|
|
5451
6174
|
});
|
|
5452
|
-
var DotNetworkPropertiesSchema =
|
|
6175
|
+
var DotNetworkPropertiesSchema = import_v415.default.union([DotNetworkPropertiesSimple, DotNetworkPropertiesArray]).transform((val) => ({
|
|
5453
6176
|
tokenDecimals: Array.isArray(val.tokenDecimals) ? val.tokenDecimals[0] : val.tokenDecimals,
|
|
5454
6177
|
tokenSymbol: Array.isArray(val.tokenSymbol) ? val.tokenSymbol[0] : val.tokenSymbol
|
|
5455
6178
|
}));
|
|
@@ -5459,10 +6182,10 @@ var getChainProperties = async (connector, networkId) => {
|
|
|
5459
6182
|
};
|
|
5460
6183
|
|
|
5461
6184
|
// src/modules/substrate-native/getMiniMetadata.ts
|
|
5462
|
-
var
|
|
5463
|
-
var
|
|
5464
|
-
var
|
|
5465
|
-
const source =
|
|
6185
|
+
var import_chaindata_provider59 = require("@talismn/chaindata-provider");
|
|
6186
|
+
var import_scale23 = require("@talismn/scale");
|
|
6187
|
+
var getMiniMetadata11 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
6188
|
+
const source = MODULE_TYPE11;
|
|
5466
6189
|
const chainId = networkId;
|
|
5467
6190
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
5468
6191
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -5470,7 +6193,7 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
5470
6193
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
5471
6194
|
);
|
|
5472
6195
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
5473
|
-
const { metadata, unifiedMetadata } = (0,
|
|
6196
|
+
const { metadata, unifiedMetadata } = (0, import_scale23.parseMetadataRpc)(metadataRpc);
|
|
5474
6197
|
if (unifiedMetadata.version < 14)
|
|
5475
6198
|
throw new Error(
|
|
5476
6199
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -5481,7 +6204,7 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
5481
6204
|
source,
|
|
5482
6205
|
chainId,
|
|
5483
6206
|
specVersion,
|
|
5484
|
-
version:
|
|
6207
|
+
version: import_chaindata_provider59.MINIMETADATA_VERSION,
|
|
5485
6208
|
data: null,
|
|
5486
6209
|
extra: { disable: true }
|
|
5487
6210
|
};
|
|
@@ -5499,7 +6222,7 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
5499
6222
|
unifiedMetadata.pallets.find(({ name }) => name === "Balances")?.storage?.items.find(({ name }) => name === "Freezes")
|
|
5500
6223
|
);
|
|
5501
6224
|
const useLegacyTransferableCalculation = !hasFreezesItem;
|
|
5502
|
-
(0,
|
|
6225
|
+
(0, import_scale23.compactMetadata)(metadata, [
|
|
5503
6226
|
{ pallet: "System", constants: ["Version", "SS58Prefix"], items: ["Account"] },
|
|
5504
6227
|
{ pallet: "Balances", items: ["Reserves", "Holds", "Locks", "Freezes"] },
|
|
5505
6228
|
{ pallet: "NominationPools", items: ["PoolMembers", "BondedPools", "Metadata"] },
|
|
@@ -5510,8 +6233,8 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
5510
6233
|
source,
|
|
5511
6234
|
chainId,
|
|
5512
6235
|
specVersion,
|
|
5513
|
-
version:
|
|
5514
|
-
data: (0,
|
|
6236
|
+
version: import_chaindata_provider59.MINIMETADATA_VERSION,
|
|
6237
|
+
data: (0, import_scale23.encodeMetadata)(metadata),
|
|
5515
6238
|
extra: {
|
|
5516
6239
|
useLegacyTransferableCalculation,
|
|
5517
6240
|
existentialDeposit,
|
|
@@ -5522,10 +6245,10 @@ var getMiniMetadata10 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
5522
6245
|
|
|
5523
6246
|
// src/modules/substrate-native/getTransferCallData.ts
|
|
5524
6247
|
var import_utils8 = require("@polkadot-api/utils");
|
|
5525
|
-
var
|
|
5526
|
-
var
|
|
6248
|
+
var import_chaindata_provider60 = require("@talismn/chaindata-provider");
|
|
6249
|
+
var import_scale24 = require("@talismn/scale");
|
|
5527
6250
|
var import_polkadot_api6 = require("polkadot-api");
|
|
5528
|
-
var
|
|
6251
|
+
var getTransferCallData11 = ({
|
|
5529
6252
|
from: from2,
|
|
5530
6253
|
to,
|
|
5531
6254
|
value,
|
|
@@ -5533,9 +6256,9 @@ var getTransferCallData10 = ({
|
|
|
5533
6256
|
type,
|
|
5534
6257
|
metadataRpc
|
|
5535
6258
|
}) => {
|
|
5536
|
-
if (!(0,
|
|
5537
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
5538
|
-
const { unifiedMetadata, lookupFn, builder } = (0,
|
|
6259
|
+
if (!(0, import_chaindata_provider60.isTokenOfType)(token, MODULE_TYPE11))
|
|
6260
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE11}.`);
|
|
6261
|
+
const { unifiedMetadata, lookupFn, builder } = (0, import_scale24.parseMetadataRpc)(metadataRpc);
|
|
5539
6262
|
const method = getTransferMethod3(type, unifiedMetadata, lookupFn);
|
|
5540
6263
|
const { codec, location } = builder.buildCall("Balances", method);
|
|
5541
6264
|
const args = getEncodedArgs3(method, to, value, codec);
|
|
@@ -5612,17 +6335,17 @@ var getTransferAllEncodedArgs3 = (to, codec) => {
|
|
|
5612
6335
|
};
|
|
5613
6336
|
|
|
5614
6337
|
// src/modules/substrate-native/subscribeBalances.ts
|
|
5615
|
-
var
|
|
5616
|
-
var
|
|
5617
|
-
if (!tokensWithAddresses.length) return (0,
|
|
6338
|
+
var import_rxjs13 = require("rxjs");
|
|
6339
|
+
var subscribeBalances11 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
6340
|
+
if (!tokensWithAddresses.length) return (0, import_rxjs13.of)({ success: [], errors: [] });
|
|
5618
6341
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
5619
6342
|
const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata);
|
|
5620
6343
|
return getRpcQueryPack$(connector, networkId, baseQueries).pipe(
|
|
5621
|
-
(0,
|
|
6344
|
+
(0, import_rxjs13.switchMap)((partialBalances) => {
|
|
5622
6345
|
const nomPoolQueries = buildNomPoolQueries(networkId, partialBalances, miniMetadata);
|
|
5623
6346
|
return getRpcQueryPack$(connector, networkId, nomPoolQueries);
|
|
5624
6347
|
}),
|
|
5625
|
-
(0,
|
|
6348
|
+
(0, import_rxjs13.map)((balances) => ({
|
|
5626
6349
|
success: balances,
|
|
5627
6350
|
errors: []
|
|
5628
6351
|
}))
|
|
@@ -5631,34 +6354,34 @@ var subscribeBalances10 = ({ networkId, tokensWithAddresses, connector, miniMeta
|
|
|
5631
6354
|
|
|
5632
6355
|
// src/modules/substrate-native/module.ts
|
|
5633
6356
|
var SubNativeBalanceModule = {
|
|
5634
|
-
type:
|
|
5635
|
-
platform:
|
|
5636
|
-
getMiniMetadata:
|
|
5637
|
-
fetchTokens:
|
|
5638
|
-
fetchBalances:
|
|
5639
|
-
subscribeBalances:
|
|
5640
|
-
getTransferCallData:
|
|
6357
|
+
type: MODULE_TYPE11,
|
|
6358
|
+
platform: PLATFORM11,
|
|
6359
|
+
getMiniMetadata: getMiniMetadata11,
|
|
6360
|
+
fetchTokens: fetchTokens11,
|
|
6361
|
+
fetchBalances: fetchBalances11,
|
|
6362
|
+
subscribeBalances: subscribeBalances11,
|
|
6363
|
+
getTransferCallData: getTransferCallData11
|
|
5641
6364
|
};
|
|
5642
6365
|
|
|
5643
6366
|
// src/modules/substrate-native/types.ts
|
|
5644
|
-
var
|
|
5645
|
-
var SubNativeTokenConfigSchema =
|
|
6367
|
+
var import_v416 = __toESM(require("zod/v4"));
|
|
6368
|
+
var SubNativeTokenConfigSchema = import_v416.default.strictObject({
|
|
5646
6369
|
...TokenConfigBaseSchema.shape
|
|
5647
6370
|
});
|
|
5648
|
-
var SubNativeModuleConfigSchema =
|
|
5649
|
-
disable:
|
|
6371
|
+
var SubNativeModuleConfigSchema = import_v416.default.strictObject({
|
|
6372
|
+
disable: import_v416.default.boolean().optional()
|
|
5650
6373
|
});
|
|
5651
|
-
var SubNativeMiniMetadataExtraSchema =
|
|
5652
|
-
disable:
|
|
5653
|
-
useLegacyTransferableCalculation:
|
|
5654
|
-
existentialDeposit:
|
|
5655
|
-
nominationPoolsPalletId:
|
|
6374
|
+
var SubNativeMiniMetadataExtraSchema = import_v416.default.strictObject({
|
|
6375
|
+
disable: import_v416.default.boolean().optional(),
|
|
6376
|
+
useLegacyTransferableCalculation: import_v416.default.boolean().optional(),
|
|
6377
|
+
existentialDeposit: import_v416.default.string().optional(),
|
|
6378
|
+
nominationPoolsPalletId: import_v416.default.string().optional()
|
|
5656
6379
|
});
|
|
5657
6380
|
|
|
5658
6381
|
// src/modules/substrate-psp22/config.ts
|
|
5659
|
-
var
|
|
5660
|
-
var
|
|
5661
|
-
var
|
|
6382
|
+
var import_chaindata_provider61 = require("@talismn/chaindata-provider");
|
|
6383
|
+
var MODULE_TYPE12 = import_chaindata_provider61.SubPsp22TokenSchema.shape.type.value;
|
|
6384
|
+
var PLATFORM12 = import_chaindata_provider61.SubPsp22TokenSchema.shape.platform.value;
|
|
5662
6385
|
|
|
5663
6386
|
// src/modules/substrate-psp22/fetchBalances.ts
|
|
5664
6387
|
var import_api_contract = require("@polkadot/api-contract");
|
|
@@ -6662,7 +7385,17 @@ var psp22_default = {
|
|
|
6662
7385
|
};
|
|
6663
7386
|
|
|
6664
7387
|
// src/modules/substrate-psp22/util.ts
|
|
6665
|
-
var
|
|
7388
|
+
var u8aToHex = (value) => `0x${Array.from(value, (b) => b.toString(16).padStart(2, "0")).join("")}`;
|
|
7389
|
+
var u8aConcatStrict = (arrays) => {
|
|
7390
|
+
const length = arrays.reduce((total, arr) => total + arr.length, 0);
|
|
7391
|
+
const result = new Uint8Array(length);
|
|
7392
|
+
let offset = 0;
|
|
7393
|
+
for (const arr of arrays) {
|
|
7394
|
+
result.set(arr, offset);
|
|
7395
|
+
offset += arr.length;
|
|
7396
|
+
}
|
|
7397
|
+
return result;
|
|
7398
|
+
};
|
|
6666
7399
|
var makeContractCaller = ({
|
|
6667
7400
|
chainConnector,
|
|
6668
7401
|
chainId,
|
|
@@ -6671,8 +7404,8 @@ var makeContractCaller = ({
|
|
|
6671
7404
|
"ContractExecResult",
|
|
6672
7405
|
await chainConnector.send(chainId, "state_call", [
|
|
6673
7406
|
"ContractsApi_call",
|
|
6674
|
-
|
|
6675
|
-
|
|
7407
|
+
u8aToHex(
|
|
7408
|
+
u8aConcatStrict([
|
|
6676
7409
|
// origin
|
|
6677
7410
|
registry.createType("AccountId", callFrom).toU8a(),
|
|
6678
7411
|
// dest
|
|
@@ -6691,7 +7424,7 @@ var makeContractCaller = ({
|
|
|
6691
7424
|
);
|
|
6692
7425
|
|
|
6693
7426
|
// src/modules/substrate-psp22/fetchBalances.ts
|
|
6694
|
-
var
|
|
7427
|
+
var fetchBalances12 = async ({
|
|
6695
7428
|
networkId,
|
|
6696
7429
|
tokensWithAddresses,
|
|
6697
7430
|
connector
|
|
@@ -6746,10 +7479,11 @@ var fetchBalances11 = async ({
|
|
|
6746
7479
|
// src/modules/substrate-psp22/fetchTokens.ts
|
|
6747
7480
|
var import_api_contract2 = require("@polkadot/api-contract");
|
|
6748
7481
|
var import_types17 = require("@polkadot/types");
|
|
6749
|
-
var
|
|
6750
|
-
var
|
|
6751
|
-
var
|
|
6752
|
-
var
|
|
7482
|
+
var import_chaindata_provider62 = require("@talismn/chaindata-provider");
|
|
7483
|
+
var import_lodash_es27 = require("lodash-es");
|
|
7484
|
+
var hexToNumber = (hex) => Number(hex);
|
|
7485
|
+
var u8aToString = (value) => new TextDecoder().decode(value);
|
|
7486
|
+
var fetchTokens12 = async ({
|
|
6753
7487
|
networkId,
|
|
6754
7488
|
tokens,
|
|
6755
7489
|
connector
|
|
@@ -6783,7 +7517,7 @@ var fetchTokens11 = async ({
|
|
|
6783
7517
|
)
|
|
6784
7518
|
]);
|
|
6785
7519
|
const symbolData = symbolResult.toJSON()?.result?.ok?.data;
|
|
6786
|
-
symbol = typeof symbolData === "string" && symbolData.startsWith("0x") ?
|
|
7520
|
+
symbol = typeof symbolData === "string" && symbolData.startsWith("0x") ? u8aToString(
|
|
6787
7521
|
registry.createType(
|
|
6788
7522
|
"Option<Vec<u8>>",
|
|
6789
7523
|
// biome-ignore lint/suspicious/noExplicitAny: legacy
|
|
@@ -6791,9 +7525,9 @@ var fetchTokens11 = async ({
|
|
|
6791
7525
|
)?.value
|
|
6792
7526
|
)?.replace(/\p{C}/gu, "") : symbol;
|
|
6793
7527
|
const decimalsData = decimalsResult.toJSON()?.result?.ok?.data;
|
|
6794
|
-
decimals = typeof decimalsData === "string" && decimalsData.startsWith("0x") ?
|
|
7528
|
+
decimals = typeof decimalsData === "string" && decimalsData.startsWith("0x") ? hexToNumber(decimalsData) : decimals;
|
|
6795
7529
|
})();
|
|
6796
|
-
const id = (0,
|
|
7530
|
+
const id = (0, import_chaindata_provider62.subPsp22TokenId)(networkId, contractAddress);
|
|
6797
7531
|
const token = {
|
|
6798
7532
|
id,
|
|
6799
7533
|
type: "substrate-psp22",
|
|
@@ -6816,21 +7550,21 @@ var fetchTokens11 = async ({
|
|
|
6816
7550
|
);
|
|
6817
7551
|
}
|
|
6818
7552
|
}
|
|
6819
|
-
return (0,
|
|
6820
|
-
const parsed =
|
|
7553
|
+
return (0, import_lodash_es27.values)(tokenList).filter((t) => {
|
|
7554
|
+
const parsed = import_chaindata_provider62.SubPsp22TokenSchema.safeParse(t);
|
|
6821
7555
|
return parsed.success;
|
|
6822
7556
|
});
|
|
6823
7557
|
};
|
|
6824
7558
|
|
|
6825
7559
|
// src/modules/substrate-psp22/getMiniMetadata.ts
|
|
6826
|
-
var
|
|
6827
|
-
var
|
|
6828
|
-
var
|
|
7560
|
+
var import_chaindata_provider63 = require("@talismn/chaindata-provider");
|
|
7561
|
+
var import_scale25 = require("@talismn/scale");
|
|
7562
|
+
var getMiniMetadata12 = ({
|
|
6829
7563
|
networkId,
|
|
6830
7564
|
specVersion,
|
|
6831
7565
|
metadataRpc
|
|
6832
7566
|
}) => {
|
|
6833
|
-
const source =
|
|
7567
|
+
const source = MODULE_TYPE12;
|
|
6834
7568
|
const chainId = networkId;
|
|
6835
7569
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
6836
7570
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -6838,7 +7572,7 @@ var getMiniMetadata11 = ({
|
|
|
6838
7572
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
6839
7573
|
);
|
|
6840
7574
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
6841
|
-
const { unifiedMetadata } = (0,
|
|
7575
|
+
const { unifiedMetadata } = (0, import_scale25.parseMetadataRpc)(metadataRpc);
|
|
6842
7576
|
if (unifiedMetadata.version < 14)
|
|
6843
7577
|
throw new Error(
|
|
6844
7578
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -6848,7 +7582,7 @@ var getMiniMetadata11 = ({
|
|
|
6848
7582
|
source,
|
|
6849
7583
|
chainId,
|
|
6850
7584
|
specVersion,
|
|
6851
|
-
version:
|
|
7585
|
+
version: import_chaindata_provider63.MINIMETADATA_VERSION,
|
|
6852
7586
|
data: null,
|
|
6853
7587
|
extra: null
|
|
6854
7588
|
};
|
|
@@ -6858,14 +7592,14 @@ var getMiniMetadata11 = ({
|
|
|
6858
7592
|
var import_api_contract3 = require("@polkadot/api-contract");
|
|
6859
7593
|
var import_types19 = require("@polkadot/types");
|
|
6860
7594
|
var import_utils9 = require("@polkadot-api/utils");
|
|
6861
|
-
var
|
|
6862
|
-
var
|
|
7595
|
+
var import_chaindata_provider64 = require("@talismn/chaindata-provider");
|
|
7596
|
+
var import_scale26 = require("@talismn/scale");
|
|
6863
7597
|
var import_polkadot_api7 = require("polkadot-api");
|
|
6864
|
-
var
|
|
6865
|
-
if (!(0,
|
|
6866
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
6867
|
-
const networkId = (0,
|
|
6868
|
-
const { builder } = (0,
|
|
7598
|
+
var getTransferCallData12 = async ({ from: from2, to, value, token, metadataRpc, connector }) => {
|
|
7599
|
+
if (!(0, import_chaindata_provider64.isTokenOfType)(token, MODULE_TYPE12))
|
|
7600
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE12}.`);
|
|
7601
|
+
const networkId = (0, import_chaindata_provider64.parseTokenId)(token.id).networkId;
|
|
7602
|
+
const { builder } = (0, import_scale26.parseMetadataRpc)(metadataRpc);
|
|
6869
7603
|
const { codec, location } = builder.buildCall("Contracts", "call");
|
|
6870
7604
|
const Psp22Abi = new import_api_contract3.Abi(psp22_default);
|
|
6871
7605
|
const registry = new import_types19.TypeRegistry();
|
|
@@ -6895,22 +7629,22 @@ var getTransferCallData11 = async ({ from: from2, to, value, token, metadataRpc,
|
|
|
6895
7629
|
};
|
|
6896
7630
|
|
|
6897
7631
|
// src/modules/substrate-psp22/subscribeBalances.ts
|
|
6898
|
-
var
|
|
6899
|
-
var
|
|
6900
|
-
var
|
|
6901
|
-
var
|
|
7632
|
+
var import_lodash_es28 = require("lodash-es");
|
|
7633
|
+
var import_rxjs14 = require("rxjs");
|
|
7634
|
+
var SUBSCRIPTION_INTERVAL9 = 6e3;
|
|
7635
|
+
var subscribeBalances12 = ({
|
|
6902
7636
|
networkId,
|
|
6903
7637
|
tokensWithAddresses,
|
|
6904
7638
|
connector,
|
|
6905
7639
|
miniMetadata
|
|
6906
7640
|
}) => {
|
|
6907
|
-
if (!tokensWithAddresses.length) return (0,
|
|
6908
|
-
return new
|
|
7641
|
+
if (!tokensWithAddresses.length) return (0, import_rxjs14.of)({ success: [], errors: [] });
|
|
7642
|
+
return new import_rxjs14.Observable((subscriber) => {
|
|
6909
7643
|
const abortController = new AbortController();
|
|
6910
7644
|
const poll = async () => {
|
|
6911
7645
|
try {
|
|
6912
7646
|
if (abortController.signal.aborted) return;
|
|
6913
|
-
const balances = await
|
|
7647
|
+
const balances = await fetchBalances12({
|
|
6914
7648
|
networkId,
|
|
6915
7649
|
tokensWithAddresses,
|
|
6916
7650
|
connector,
|
|
@@ -6918,10 +7652,10 @@ var subscribeBalances11 = ({
|
|
|
6918
7652
|
});
|
|
6919
7653
|
if (abortController.signal.aborted) return;
|
|
6920
7654
|
subscriber.next(balances);
|
|
6921
|
-
setTimeout(poll,
|
|
7655
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL9);
|
|
6922
7656
|
} catch (error) {
|
|
6923
7657
|
log_default.error("Error", {
|
|
6924
|
-
module:
|
|
7658
|
+
module: MODULE_TYPE12,
|
|
6925
7659
|
networkId,
|
|
6926
7660
|
miniMetadata,
|
|
6927
7661
|
addressesByToken: tokensWithAddresses,
|
|
@@ -6934,36 +7668,36 @@ var subscribeBalances11 = ({
|
|
|
6934
7668
|
return () => {
|
|
6935
7669
|
abortController.abort();
|
|
6936
7670
|
};
|
|
6937
|
-
}).pipe((0,
|
|
7671
|
+
}).pipe((0, import_rxjs14.distinctUntilChanged)(import_lodash_es28.isEqual));
|
|
6938
7672
|
};
|
|
6939
7673
|
|
|
6940
7674
|
// src/modules/substrate-psp22/module.ts
|
|
6941
7675
|
var SubPsp22BalanceModule = {
|
|
6942
|
-
type:
|
|
6943
|
-
platform:
|
|
6944
|
-
getMiniMetadata:
|
|
6945
|
-
fetchTokens:
|
|
6946
|
-
fetchBalances:
|
|
6947
|
-
subscribeBalances:
|
|
6948
|
-
getTransferCallData:
|
|
7676
|
+
type: MODULE_TYPE12,
|
|
7677
|
+
platform: PLATFORM12,
|
|
7678
|
+
getMiniMetadata: getMiniMetadata12,
|
|
7679
|
+
fetchTokens: fetchTokens12,
|
|
7680
|
+
fetchBalances: fetchBalances12,
|
|
7681
|
+
subscribeBalances: subscribeBalances12,
|
|
7682
|
+
getTransferCallData: getTransferCallData12
|
|
6949
7683
|
};
|
|
6950
7684
|
|
|
6951
7685
|
// src/modules/substrate-psp22/types.ts
|
|
6952
|
-
var
|
|
6953
|
-
var
|
|
6954
|
-
var SubPsp22TokenConfigSchema =
|
|
6955
|
-
contractAddress:
|
|
7686
|
+
var import_chaindata_provider65 = require("@talismn/chaindata-provider");
|
|
7687
|
+
var import_v417 = __toESM(require("zod/v4"));
|
|
7688
|
+
var SubPsp22TokenConfigSchema = import_v417.default.strictObject({
|
|
7689
|
+
contractAddress: import_chaindata_provider65.SubPsp22TokenSchema.shape.contractAddress,
|
|
6956
7690
|
...TokenConfigBaseSchema.shape
|
|
6957
7691
|
});
|
|
6958
7692
|
|
|
6959
7693
|
// src/modules/substrate-tokens/config.ts
|
|
6960
|
-
var
|
|
6961
|
-
var
|
|
6962
|
-
var
|
|
7694
|
+
var import_chaindata_provider66 = require("@talismn/chaindata-provider");
|
|
7695
|
+
var MODULE_TYPE13 = import_chaindata_provider66.SubTokensTokenSchema.shape.type.value;
|
|
7696
|
+
var PLATFORM13 = import_chaindata_provider66.SubTokensTokenSchema.shape.platform.value;
|
|
6963
7697
|
|
|
6964
7698
|
// src/modules/substrate-tokens/buildQueries.ts
|
|
6965
|
-
var
|
|
6966
|
-
var
|
|
7699
|
+
var import_scale27 = require("@talismn/scale");
|
|
7700
|
+
var import_util15 = require("@talismn/util");
|
|
6967
7701
|
var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
|
|
6968
7702
|
const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
|
|
6969
7703
|
storage: [miniMetadata.extra.palletId, "Accounts"]
|
|
@@ -6972,7 +7706,7 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
6972
7706
|
const scaleCoder = networkStorageCoders?.storage;
|
|
6973
7707
|
const getStateKey = (onChainId) => {
|
|
6974
7708
|
try {
|
|
6975
|
-
return scaleCoder.keys.enc(address, (0,
|
|
7709
|
+
return scaleCoder.keys.enc(address, (0, import_scale27.papiParse)(onChainId));
|
|
6976
7710
|
} catch {
|
|
6977
7711
|
return null;
|
|
6978
7712
|
}
|
|
@@ -6985,7 +7719,7 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
6985
7719
|
return null;
|
|
6986
7720
|
}
|
|
6987
7721
|
const decodeResult = (changes) => {
|
|
6988
|
-
const decoded = (0,
|
|
7722
|
+
const decoded = (0, import_scale27.decodeScale)(
|
|
6989
7723
|
scaleCoder,
|
|
6990
7724
|
changes[0],
|
|
6991
7725
|
`Failed to decode substrate-tokens balance on chain ${networkId}`
|
|
@@ -7011,15 +7745,15 @@ var buildQueries3 = (networkId, balanceDefs, miniMetadata) => {
|
|
|
7011
7745
|
stateKeys: [stateKey],
|
|
7012
7746
|
decodeResult
|
|
7013
7747
|
};
|
|
7014
|
-
}).filter(
|
|
7748
|
+
}).filter(import_util15.isNotNil);
|
|
7015
7749
|
};
|
|
7016
7750
|
|
|
7017
7751
|
// src/modules/substrate-tokens/fetchBalances.ts
|
|
7018
|
-
var
|
|
7752
|
+
var fetchBalances13 = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
7019
7753
|
if (!tokensWithAddresses.length) return { success: [], errors: [] };
|
|
7020
7754
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
7021
7755
|
if (!miniMetadata?.data) {
|
|
7022
|
-
log_default.warn(`MiniMetadata is required for fetching ${
|
|
7756
|
+
log_default.warn(`MiniMetadata is required for fetching ${MODULE_TYPE13} balances on ${networkId}.`);
|
|
7023
7757
|
return {
|
|
7024
7758
|
success: [],
|
|
7025
7759
|
errors: balanceDefs.map((def) => ({
|
|
@@ -7029,20 +7763,20 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
7029
7763
|
}))
|
|
7030
7764
|
};
|
|
7031
7765
|
}
|
|
7032
|
-
if (miniMetadata.source !==
|
|
7033
|
-
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${
|
|
7766
|
+
if (miniMetadata.source !== MODULE_TYPE13) {
|
|
7767
|
+
log_default.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE13}.`);
|
|
7034
7768
|
return {
|
|
7035
7769
|
success: [],
|
|
7036
7770
|
errors: balanceDefs.map((def) => ({
|
|
7037
7771
|
tokenId: def.token.id,
|
|
7038
7772
|
address: def.address,
|
|
7039
|
-
error: new Error(`Invalid request: miniMetadata source is not ${
|
|
7773
|
+
error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE13}`)
|
|
7040
7774
|
}))
|
|
7041
7775
|
};
|
|
7042
7776
|
}
|
|
7043
7777
|
if (miniMetadata.chainId !== networkId) {
|
|
7044
7778
|
log_default.warn(
|
|
7045
|
-
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${
|
|
7779
|
+
`Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE13}. Expected chainId is ${networkId}`
|
|
7046
7780
|
);
|
|
7047
7781
|
return {
|
|
7048
7782
|
success: [],
|
|
@@ -7066,7 +7800,7 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
7066
7800
|
address: def.address,
|
|
7067
7801
|
networkId,
|
|
7068
7802
|
tokenId: def.token.id,
|
|
7069
|
-
source:
|
|
7803
|
+
source: MODULE_TYPE13,
|
|
7070
7804
|
status: "live",
|
|
7071
7805
|
values: [
|
|
7072
7806
|
{ type: "free", label: "free", amount: "0" },
|
|
@@ -7080,20 +7814,20 @@ var fetchBalances12 = async ({ networkId, tokensWithAddresses, connector, miniMe
|
|
|
7080
7814
|
};
|
|
7081
7815
|
|
|
7082
7816
|
// src/modules/substrate-tokens/fetchTokens.ts
|
|
7083
|
-
var
|
|
7084
|
-
var
|
|
7085
|
-
var
|
|
7817
|
+
var import_chaindata_provider67 = require("@talismn/chaindata-provider");
|
|
7818
|
+
var import_lodash_es29 = require("lodash-es");
|
|
7819
|
+
var fetchTokens13 = async ({
|
|
7086
7820
|
networkId,
|
|
7087
7821
|
tokens,
|
|
7088
7822
|
miniMetadata
|
|
7089
7823
|
}) => {
|
|
7090
7824
|
if (!miniMetadata?.data) return [];
|
|
7091
7825
|
return tokens.map(
|
|
7092
|
-
(tokenConfig) => (0,
|
|
7826
|
+
(tokenConfig) => (0, import_lodash_es29.assign)(
|
|
7093
7827
|
{
|
|
7094
|
-
id: (0,
|
|
7095
|
-
type:
|
|
7096
|
-
platform:
|
|
7828
|
+
id: (0, import_chaindata_provider67.subTokensTokenId)(networkId, tokenConfig.onChainId),
|
|
7829
|
+
type: MODULE_TYPE13,
|
|
7830
|
+
platform: PLATFORM13,
|
|
7097
7831
|
networkId,
|
|
7098
7832
|
onChainId: tokenConfig.onChainId,
|
|
7099
7833
|
symbol: tokenConfig.symbol ?? "Unit",
|
|
@@ -7108,10 +7842,10 @@ var fetchTokens12 = async ({
|
|
|
7108
7842
|
};
|
|
7109
7843
|
|
|
7110
7844
|
// src/modules/substrate-tokens/getMiniMetadata.ts
|
|
7111
|
-
var
|
|
7112
|
-
var
|
|
7113
|
-
var
|
|
7114
|
-
const source =
|
|
7845
|
+
var import_chaindata_provider68 = require("@talismn/chaindata-provider");
|
|
7846
|
+
var import_scale28 = require("@talismn/scale");
|
|
7847
|
+
var getMiniMetadata13 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
7848
|
+
const source = MODULE_TYPE13;
|
|
7115
7849
|
const chainId = networkId;
|
|
7116
7850
|
const systemVersion = getConstantValue(metadataRpc, "System", "Version");
|
|
7117
7851
|
if (specVersion !== systemVersion.spec_version)
|
|
@@ -7119,7 +7853,7 @@ var getMiniMetadata12 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
7119
7853
|
`specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`
|
|
7120
7854
|
);
|
|
7121
7855
|
const id = deriveMiniMetadataId({ source, chainId, specVersion });
|
|
7122
|
-
const { unifiedMetadata } = (0,
|
|
7856
|
+
const { unifiedMetadata } = (0, import_scale28.parseMetadataRpc)(metadataRpc);
|
|
7123
7857
|
if (unifiedMetadata.version < 14)
|
|
7124
7858
|
throw new Error(
|
|
7125
7859
|
`Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`
|
|
@@ -7130,27 +7864,27 @@ var getMiniMetadata12 = ({ networkId, specVersion, metadataRpc, config }) => {
|
|
|
7130
7864
|
source,
|
|
7131
7865
|
chainId,
|
|
7132
7866
|
specVersion,
|
|
7133
|
-
version:
|
|
7867
|
+
version: import_chaindata_provider68.MINIMETADATA_VERSION,
|
|
7134
7868
|
data: getData5(metadataRpc, extra.palletId),
|
|
7135
7869
|
extra
|
|
7136
7870
|
};
|
|
7137
7871
|
};
|
|
7138
7872
|
var getData5 = (metadataRpc, pallet) => {
|
|
7139
|
-
const { metadata, unifiedMetadata } = (0,
|
|
7873
|
+
const { metadata, unifiedMetadata } = (0, import_scale28.parseMetadataRpc)(metadataRpc);
|
|
7140
7874
|
if (!hasStorageItems(unifiedMetadata, pallet, ["Accounts"])) return null;
|
|
7141
|
-
(0,
|
|
7142
|
-
return (0,
|
|
7875
|
+
(0, import_scale28.compactMetadata)(metadata, [{ pallet, items: ["Accounts"] }]);
|
|
7876
|
+
return (0, import_scale28.encodeMetadata)(metadata);
|
|
7143
7877
|
};
|
|
7144
7878
|
|
|
7145
7879
|
// src/modules/substrate-tokens/getTransferCallData.ts
|
|
7146
7880
|
var import_utils10 = require("@polkadot-api/utils");
|
|
7147
|
-
var
|
|
7148
|
-
var
|
|
7881
|
+
var import_chaindata_provider69 = require("@talismn/chaindata-provider");
|
|
7882
|
+
var import_scale29 = require("@talismn/scale");
|
|
7149
7883
|
var import_polkadot_api8 = require("polkadot-api");
|
|
7150
|
-
var
|
|
7151
|
-
if (!(0,
|
|
7152
|
-
throw new Error(`Token type ${token.type} is not ${
|
|
7153
|
-
const { builder } = (0,
|
|
7884
|
+
var getTransferCallData13 = ({ from: from2, to, value, token, type, metadataRpc, config }) => {
|
|
7885
|
+
if (!(0, import_chaindata_provider69.isTokenOfType)(token, MODULE_TYPE13))
|
|
7886
|
+
throw new Error(`Token type ${token.type} is not ${MODULE_TYPE13}.`);
|
|
7887
|
+
const { builder } = (0, import_scale29.parseMetadataRpc)(metadataRpc);
|
|
7154
7888
|
const options = getCallDataOptions(to, token, value, type, config);
|
|
7155
7889
|
const callData = getCallDataFromOptions(builder, options);
|
|
7156
7890
|
return {
|
|
@@ -7182,7 +7916,7 @@ var buildCallData = (builder, pallet, method, args) => {
|
|
|
7182
7916
|
return import_polkadot_api8.Binary.fromBytes((0, import_utils10.mergeUint8)([new Uint8Array(location), codec.enc(args)]));
|
|
7183
7917
|
};
|
|
7184
7918
|
var getCallDataOptions = (to, token, value, type, config) => {
|
|
7185
|
-
const onChainId = (0,
|
|
7919
|
+
const onChainId = (0, import_scale29.papiParse)(token.onChainId);
|
|
7186
7920
|
const method = getTransferMethod4(type);
|
|
7187
7921
|
return [
|
|
7188
7922
|
{
|
|
@@ -7262,13 +7996,13 @@ var getCallDataOptions = (to, token, value, type, config) => {
|
|
|
7262
7996
|
};
|
|
7263
7997
|
|
|
7264
7998
|
// src/modules/substrate-tokens/subscribeBalances.ts
|
|
7265
|
-
var
|
|
7266
|
-
var
|
|
7267
|
-
if (!tokensWithAddresses.length) return (0,
|
|
7999
|
+
var import_rxjs15 = require("rxjs");
|
|
8000
|
+
var subscribeBalances13 = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {
|
|
8001
|
+
if (!tokensWithAddresses.length) return (0, import_rxjs15.of)({ success: [], errors: [] });
|
|
7268
8002
|
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
|
7269
8003
|
const queries = buildQueries3(networkId, balanceDefs, miniMetadata);
|
|
7270
8004
|
return getRpcQueryPack$(connector, networkId, queries).pipe(
|
|
7271
|
-
(0,
|
|
8005
|
+
(0, import_rxjs15.map)((balances) => ({
|
|
7272
8006
|
success: balances,
|
|
7273
8007
|
errors: []
|
|
7274
8008
|
}))
|
|
@@ -7277,31 +8011,31 @@ var subscribeBalances12 = ({ networkId, tokensWithAddresses, connector, miniMeta
|
|
|
7277
8011
|
|
|
7278
8012
|
// src/modules/substrate-tokens/module.ts
|
|
7279
8013
|
var SubTokensBalanceModule = {
|
|
7280
|
-
type:
|
|
7281
|
-
platform:
|
|
7282
|
-
getMiniMetadata:
|
|
7283
|
-
fetchTokens:
|
|
7284
|
-
fetchBalances:
|
|
7285
|
-
subscribeBalances:
|
|
7286
|
-
getTransferCallData:
|
|
8014
|
+
type: MODULE_TYPE13,
|
|
8015
|
+
platform: PLATFORM13,
|
|
8016
|
+
getMiniMetadata: getMiniMetadata13,
|
|
8017
|
+
fetchTokens: fetchTokens13,
|
|
8018
|
+
fetchBalances: fetchBalances13,
|
|
8019
|
+
subscribeBalances: subscribeBalances13,
|
|
8020
|
+
getTransferCallData: getTransferCallData13
|
|
7287
8021
|
};
|
|
7288
8022
|
|
|
7289
8023
|
// src/modules/substrate-tokens/types.ts
|
|
7290
|
-
var
|
|
7291
|
-
var
|
|
7292
|
-
var SubTokensTokenConfigSchema =
|
|
7293
|
-
onChainId:
|
|
8024
|
+
var import_chaindata_provider70 = require("@talismn/chaindata-provider");
|
|
8025
|
+
var import_v418 = __toESM(require("zod/v4"));
|
|
8026
|
+
var SubTokensTokenConfigSchema = import_v418.default.strictObject({
|
|
8027
|
+
onChainId: import_chaindata_provider70.SubTokensTokenSchema.shape.onChainId,
|
|
7294
8028
|
...TokenConfigBaseSchema.shape,
|
|
7295
8029
|
// force these 3 fields because in this module we wont pull anything from chain
|
|
7296
|
-
symbol:
|
|
7297
|
-
decimals:
|
|
7298
|
-
existentialDeposit:
|
|
8030
|
+
symbol: import_v418.default.string().nonempty(),
|
|
8031
|
+
decimals: import_v418.default.number(),
|
|
8032
|
+
existentialDeposit: import_v418.default.string().nonempty()
|
|
7299
8033
|
});
|
|
7300
|
-
var SubTokensModuleConfigSchema =
|
|
7301
|
-
palletId:
|
|
8034
|
+
var SubTokensModuleConfigSchema = import_v418.default.strictObject({
|
|
8035
|
+
palletId: import_v418.default.string().optional()
|
|
7302
8036
|
});
|
|
7303
|
-
var SubTokensMiniMetadataExtraSchema =
|
|
7304
|
-
palletId:
|
|
8037
|
+
var SubTokensMiniMetadataExtraSchema = import_v418.default.strictObject({
|
|
8038
|
+
palletId: import_v418.default.string()
|
|
7305
8039
|
});
|
|
7306
8040
|
|
|
7307
8041
|
// src/modules/index.ts
|
|
@@ -7317,12 +8051,13 @@ var BALANCE_MODULES = [
|
|
|
7317
8051
|
EvmUniswapV2BalanceModule,
|
|
7318
8052
|
EvmNativeBalanceModule,
|
|
7319
8053
|
SolNativeBalanceModule,
|
|
7320
|
-
SolSplBalanceModule
|
|
8054
|
+
SolSplBalanceModule,
|
|
8055
|
+
SolToken2022BalanceModule
|
|
7321
8056
|
];
|
|
7322
8057
|
|
|
7323
8058
|
// src/getMiniMetadatas/getMetadataRpc.ts
|
|
7324
8059
|
var import_sapi = require("@talismn/sapi");
|
|
7325
|
-
var
|
|
8060
|
+
var import_util16 = require("@talismn/util");
|
|
7326
8061
|
var CACHE = /* @__PURE__ */ new Map();
|
|
7327
8062
|
var getMetadataRpc = async (chainConnector, networkId) => {
|
|
7328
8063
|
if (CACHE.has(networkId)) return CACHE.get(networkId);
|
|
@@ -7336,7 +8071,7 @@ var getMetadataRpc = async (chainConnector, networkId) => {
|
|
|
7336
8071
|
try {
|
|
7337
8072
|
return await pResult;
|
|
7338
8073
|
} catch (cause) {
|
|
7339
|
-
if ((0,
|
|
8074
|
+
if ((0, import_util16.isAbortError)(cause)) throw cause;
|
|
7340
8075
|
throw new Error(`Failed to fetch metadataRpc for network ${networkId}`, { cause });
|
|
7341
8076
|
} finally {
|
|
7342
8077
|
CACHE.delete(networkId);
|
|
@@ -7424,37 +8159,37 @@ var BalancesProvider = class {
|
|
|
7424
8159
|
constructor(chaindataProvider, chainConnectors, storage = DEFAULT_STORAGE) {
|
|
7425
8160
|
this.#chaindataProvider = chaindataProvider;
|
|
7426
8161
|
this.#chainConnectors = chainConnectors;
|
|
7427
|
-
this.#storage = new
|
|
7428
|
-
balances: (0,
|
|
7429
|
-
miniMetadatas: (0,
|
|
8162
|
+
this.#storage = new import_rxjs16.BehaviorSubject({
|
|
8163
|
+
balances: (0, import_lodash_es30.keyBy)(storage.balances.filter(import_util17.isNotNil), (b) => getBalanceId(b)),
|
|
8164
|
+
miniMetadatas: (0, import_lodash_es30.keyBy)(storage.miniMetadatas.filter(import_util17.isNotNil), (m) => m.id)
|
|
7430
8165
|
});
|
|
7431
8166
|
}
|
|
7432
8167
|
get storage$() {
|
|
7433
8168
|
return this.#storage.pipe(
|
|
7434
|
-
(0,
|
|
8169
|
+
(0, import_rxjs16.map)(
|
|
7435
8170
|
({ balances, miniMetadatas }) => ({
|
|
7436
|
-
balances: (0,
|
|
7437
|
-
miniMetadatas: (0,
|
|
8171
|
+
balances: (0, import_lodash_es30.values)(balances).filter(import_util17.isNotNil).sort(sortByBalanceId),
|
|
8172
|
+
miniMetadatas: (0, import_lodash_es30.values)(miniMetadatas).filter(import_util17.isNotNil).sort(sortByMiniMetadataId)
|
|
7438
8173
|
}),
|
|
7439
|
-
(0,
|
|
8174
|
+
(0, import_rxjs16.shareReplay)(1)
|
|
7440
8175
|
)
|
|
7441
8176
|
);
|
|
7442
8177
|
}
|
|
7443
8178
|
get storedMiniMetadataMapById$() {
|
|
7444
8179
|
return this.#storage.pipe(
|
|
7445
|
-
(0,
|
|
7446
|
-
(0,
|
|
7447
|
-
(0,
|
|
8180
|
+
(0, import_rxjs16.map)((storage) => (0, import_lodash_es30.keyBy)(storage.miniMetadatas, (m) => m.id)),
|
|
8181
|
+
(0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual),
|
|
8182
|
+
(0, import_rxjs16.shareReplay)(1)
|
|
7448
8183
|
);
|
|
7449
8184
|
}
|
|
7450
8185
|
// this is the only public method
|
|
7451
8186
|
getBalances$(addressesByTokenId) {
|
|
7452
8187
|
return this.cleanupAddressesByTokenId$(addressesByTokenId).pipe(
|
|
7453
|
-
(0,
|
|
8188
|
+
(0, import_rxjs16.map)(
|
|
7454
8189
|
// split by network
|
|
7455
|
-
(addressesByTokenId2) => (0,
|
|
8190
|
+
(addressesByTokenId2) => (0, import_lodash_es30.toPairs)(addressesByTokenId2).reduce(
|
|
7456
8191
|
(acc, [tokenId, addresses]) => {
|
|
7457
|
-
const networkId = (0,
|
|
8192
|
+
const networkId = (0, import_chaindata_provider71.parseTokenId)(tokenId).networkId;
|
|
7458
8193
|
if (!acc[networkId]) acc[networkId] = {};
|
|
7459
8194
|
acc[networkId][tokenId] = addresses;
|
|
7460
8195
|
return acc;
|
|
@@ -7462,21 +8197,21 @@ var BalancesProvider = class {
|
|
|
7462
8197
|
{}
|
|
7463
8198
|
)
|
|
7464
8199
|
),
|
|
7465
|
-
(0,
|
|
7466
|
-
if (!(0,
|
|
7467
|
-
return (0,
|
|
7468
|
-
isStale: (0,
|
|
7469
|
-
(0,
|
|
7470
|
-
(0,
|
|
8200
|
+
(0, import_rxjs16.switchMap)((addressesByTokenIdByNetworkId) => {
|
|
8201
|
+
if (!(0, import_lodash_es30.keys)(addressesByTokenIdByNetworkId).length) return (0, import_rxjs16.of)({ isStale: false, results: [] });
|
|
8202
|
+
return (0, import_rxjs16.combineLatest)({
|
|
8203
|
+
isStale: (0, import_rxjs16.timer)(3e4).pipe(
|
|
8204
|
+
(0, import_rxjs16.map)(() => true),
|
|
8205
|
+
(0, import_rxjs16.startWith)(false)
|
|
7471
8206
|
),
|
|
7472
|
-
results: (0,
|
|
7473
|
-
(0,
|
|
8207
|
+
results: (0, import_rxjs16.combineLatest)(
|
|
8208
|
+
(0, import_lodash_es30.toPairs)(addressesByTokenIdByNetworkId).map(
|
|
7474
8209
|
([networkId]) => this.getNetworkBalances$(networkId, addressesByTokenIdByNetworkId[networkId])
|
|
7475
8210
|
)
|
|
7476
8211
|
)
|
|
7477
8212
|
});
|
|
7478
8213
|
}),
|
|
7479
|
-
(0,
|
|
8214
|
+
(0, import_rxjs16.map)(
|
|
7480
8215
|
// combine
|
|
7481
8216
|
({ isStale, results }) => ({
|
|
7482
8217
|
status: !isStale && results.some(({ status }) => status === "initialising") ? "initialising" : "live",
|
|
@@ -7488,14 +8223,14 @@ var BalancesProvider = class {
|
|
|
7488
8223
|
failedBalanceIds: results.flatMap((result) => result.failedBalanceIds)
|
|
7489
8224
|
})
|
|
7490
8225
|
),
|
|
7491
|
-
(0,
|
|
8226
|
+
(0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
|
|
7492
8227
|
);
|
|
7493
8228
|
}
|
|
7494
8229
|
fetchBalances(addressesByTokenId) {
|
|
7495
|
-
return (0,
|
|
8230
|
+
return (0, import_rxjs16.firstValueFrom)(
|
|
7496
8231
|
this.getBalances$(addressesByTokenId).pipe(
|
|
7497
|
-
(0,
|
|
7498
|
-
(0,
|
|
8232
|
+
(0, import_rxjs16.filter)(({ status }) => status === "live"),
|
|
8233
|
+
(0, import_rxjs16.map)(({ balances }) => balances)
|
|
7499
8234
|
)
|
|
7500
8235
|
);
|
|
7501
8236
|
}
|
|
@@ -7505,12 +8240,12 @@ var BalancesProvider = class {
|
|
|
7505
8240
|
getNetworkBalances$(networkId, addressesByTokenId) {
|
|
7506
8241
|
const network$ = this.#chaindataProvider.getNetworkById$(networkId);
|
|
7507
8242
|
const tokensMapById$ = this.#chaindataProvider.getTokensMapById$();
|
|
7508
|
-
return (0,
|
|
7509
|
-
(0,
|
|
7510
|
-
const tokensAndAddresses = (0,
|
|
8243
|
+
return (0, import_rxjs16.combineLatest)([network$, tokensMapById$]).pipe(
|
|
8244
|
+
(0, import_rxjs16.switchMap)(([network, tokensMapById]) => {
|
|
8245
|
+
const tokensAndAddresses = (0, import_lodash_es30.toPairs)(addressesByTokenId).map(
|
|
7511
8246
|
([tokenId, addresses]) => [tokensMapById[tokenId], addresses]
|
|
7512
8247
|
);
|
|
7513
|
-
return (0,
|
|
8248
|
+
return (0, import_rxjs16.combineLatest)(
|
|
7514
8249
|
BALANCE_MODULES.filter((mod) => mod.platform === network?.platform).map((mod) => {
|
|
7515
8250
|
const tokensWithAddresses = tokensAndAddresses.filter(
|
|
7516
8251
|
([token]) => token.type === mod.type
|
|
@@ -7527,41 +8262,41 @@ var BalancesProvider = class {
|
|
|
7527
8262
|
}
|
|
7528
8263
|
default: {
|
|
7529
8264
|
log_default.warn("[balances] Unsupported network platform for module", { networkId, mod });
|
|
7530
|
-
return (0,
|
|
8265
|
+
return (0, import_rxjs16.of)({ status: "live", balances: [], failedBalanceIds: [] });
|
|
7531
8266
|
}
|
|
7532
8267
|
}
|
|
7533
8268
|
})
|
|
7534
8269
|
);
|
|
7535
8270
|
}),
|
|
7536
|
-
(0,
|
|
8271
|
+
(0, import_rxjs16.map)((results) => {
|
|
7537
8272
|
const errorBalanceIds = results.flatMap((result) => result.failedBalanceIds);
|
|
7538
|
-
const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(
|
|
8273
|
+
const staleBalances = errorBalanceIds.map((balanceId) => this.#storage.value.balances[balanceId]).filter(import_util17.isNotNil).map((b) => ({ ...b, status: "stale" }));
|
|
7539
8274
|
return {
|
|
7540
8275
|
status: results.some(({ status }) => status === "initialising") ? "initialising" : "live",
|
|
7541
8276
|
balances: results.flatMap((result) => result.balances).concat(staleBalances).sort(sortByBalanceId),
|
|
7542
8277
|
failedBalanceIds: []
|
|
7543
8278
|
};
|
|
7544
8279
|
}),
|
|
7545
|
-
(0,
|
|
8280
|
+
(0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
|
|
7546
8281
|
);
|
|
7547
8282
|
}
|
|
7548
8283
|
getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
|
|
7549
|
-
return (0,
|
|
8284
|
+
return (0, import_util17.getSharedObservable)(
|
|
7550
8285
|
`BalancesProvider.getPolkadotNetworkModuleBalances$`,
|
|
7551
8286
|
{ networkId, mod, tokensWithAddresses },
|
|
7552
8287
|
() => {
|
|
7553
8288
|
if (!tokensWithAddresses.length)
|
|
7554
|
-
return (0,
|
|
7555
|
-
const moduleAddressesByTokenId = (0,
|
|
8289
|
+
return (0, import_rxjs16.of)({ status: "live", balances: [], failedBalanceIds: [] });
|
|
8290
|
+
const moduleAddressesByTokenId = (0, import_lodash_es30.fromPairs)(
|
|
7556
8291
|
tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
|
|
7557
8292
|
);
|
|
7558
|
-
const balanceIds = (0,
|
|
8293
|
+
const balanceIds = (0, import_lodash_es30.toPairs)(moduleAddressesByTokenId).flatMap(
|
|
7559
8294
|
([tokenId, addresses]) => addresses.map((address) => getBalanceId({ tokenId, address }))
|
|
7560
8295
|
);
|
|
7561
8296
|
if (!this.#chainConnectors.substrate) {
|
|
7562
8297
|
log_default.warn("[balances] no substrate connector or miniMetadata for module", mod.type);
|
|
7563
|
-
return (0,
|
|
7564
|
-
() => (0,
|
|
8298
|
+
return (0, import_rxjs16.defer)(
|
|
8299
|
+
() => (0, import_rxjs16.of)({
|
|
7565
8300
|
status: "initialising",
|
|
7566
8301
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7567
8302
|
failedBalanceIds: []
|
|
@@ -7569,8 +8304,8 @@ var BalancesProvider = class {
|
|
|
7569
8304
|
);
|
|
7570
8305
|
}
|
|
7571
8306
|
const moduleBalances$ = this.getNetworkMiniMetadatas$(networkId).pipe(
|
|
7572
|
-
(0,
|
|
7573
|
-
(0,
|
|
8307
|
+
(0, import_rxjs16.map)((miniMetadatas) => miniMetadatas.find((m) => m.source === mod.type)),
|
|
8308
|
+
(0, import_rxjs16.switchMap)(
|
|
7574
8309
|
(miniMetadata) => mod.subscribeBalances({
|
|
7575
8310
|
networkId,
|
|
7576
8311
|
tokensWithAddresses,
|
|
@@ -7578,33 +8313,39 @@ var BalancesProvider = class {
|
|
|
7578
8313
|
miniMetadata
|
|
7579
8314
|
})
|
|
7580
8315
|
),
|
|
7581
|
-
(0,
|
|
8316
|
+
(0, import_rxjs16.catchError)(() => import_rxjs16.EMPTY),
|
|
7582
8317
|
// don't emit, let provider mark balances stale
|
|
7583
|
-
(0,
|
|
8318
|
+
(0, import_rxjs16.tap)((results) => {
|
|
7584
8319
|
if (results.dynamicTokens?.length) {
|
|
7585
8320
|
this.#chaindataProvider.registerDynamicTokens(results.dynamicTokens);
|
|
7586
8321
|
}
|
|
7587
8322
|
}),
|
|
7588
|
-
(0,
|
|
8323
|
+
(0, import_rxjs16.map)(
|
|
7589
8324
|
(results) => ({
|
|
7590
8325
|
status: "live",
|
|
7591
|
-
// exclude zero balances
|
|
7592
|
-
|
|
8326
|
+
// exclude zero balances, but keep balances that only hold a lock
|
|
8327
|
+
// (eg dtao conviction locks, reported on the subnet's base token — including
|
|
8328
|
+
// zero-mass "ghost" locks with residual conviction, which still pin the hotkey
|
|
8329
|
+
// of future lock_stake calls)
|
|
8330
|
+
balances: results.success.filter((b) => {
|
|
8331
|
+
const balance = new Balance(b);
|
|
8332
|
+
return balance.total.planck > 0n || balance.locks.some((lock) => lock.amount.planck > 0n) || !!findDTaoConvictionLock(balance.locks);
|
|
8333
|
+
}),
|
|
7593
8334
|
failedBalanceIds: results.errors.map(
|
|
7594
8335
|
({ tokenId, address }) => getBalanceId({ tokenId, address })
|
|
7595
8336
|
)
|
|
7596
8337
|
})
|
|
7597
8338
|
),
|
|
7598
|
-
(0,
|
|
8339
|
+
(0, import_rxjs16.tap)((results) => {
|
|
7599
8340
|
this.updateStorage$(balanceIds, results);
|
|
7600
8341
|
}),
|
|
7601
8342
|
// shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change
|
|
7602
|
-
(0,
|
|
7603
|
-
(0,
|
|
8343
|
+
(0, import_rxjs16.shareReplay)({ refCount: true, bufferSize: 1 }),
|
|
8344
|
+
(0, import_util17.keepAlive)(0)
|
|
7604
8345
|
);
|
|
7605
|
-
return (0,
|
|
8346
|
+
return (0, import_rxjs16.defer)(
|
|
7606
8347
|
() => moduleBalances$.pipe(
|
|
7607
|
-
(0,
|
|
8348
|
+
(0, import_rxjs16.startWith)({
|
|
7608
8349
|
status: "initialising",
|
|
7609
8350
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7610
8351
|
failedBalanceIds: []
|
|
@@ -7615,22 +8356,22 @@ var BalancesProvider = class {
|
|
|
7615
8356
|
);
|
|
7616
8357
|
}
|
|
7617
8358
|
getEthereumNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
|
|
7618
|
-
return (0,
|
|
8359
|
+
return (0, import_util17.getSharedObservable)(
|
|
7619
8360
|
`BalancesProvider.getEthereumNetworkModuleBalances$`,
|
|
7620
8361
|
{ networkId, mod, tokensWithAddresses },
|
|
7621
8362
|
() => {
|
|
7622
8363
|
if (!tokensWithAddresses.length)
|
|
7623
|
-
return (0,
|
|
7624
|
-
const moduleAddressesByTokenId = (0,
|
|
8364
|
+
return (0, import_rxjs16.of)({ status: "live", balances: [], failedBalanceIds: [] });
|
|
8365
|
+
const moduleAddressesByTokenId = (0, import_lodash_es30.fromPairs)(
|
|
7625
8366
|
tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
|
|
7626
8367
|
);
|
|
7627
|
-
const balanceIds = (0,
|
|
8368
|
+
const balanceIds = (0, import_lodash_es30.toPairs)(moduleAddressesByTokenId).flatMap(
|
|
7628
8369
|
([tokenId, addresses]) => addresses.map((address) => getBalanceId({ tokenId, address }))
|
|
7629
8370
|
);
|
|
7630
8371
|
if (!this.#chainConnectors.evm) {
|
|
7631
8372
|
log_default.warn("[balances] no ethereum connector for module", mod.type);
|
|
7632
|
-
return (0,
|
|
7633
|
-
() => (0,
|
|
8373
|
+
return (0, import_rxjs16.defer)(
|
|
8374
|
+
() => (0, import_rxjs16.of)({
|
|
7634
8375
|
status: "initialising",
|
|
7635
8376
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7636
8377
|
failedBalanceIds: []
|
|
@@ -7642,9 +8383,9 @@ var BalancesProvider = class {
|
|
|
7642
8383
|
tokensWithAddresses,
|
|
7643
8384
|
connector: this.#chainConnectors.evm
|
|
7644
8385
|
}).pipe(
|
|
7645
|
-
(0,
|
|
8386
|
+
(0, import_rxjs16.catchError)(() => import_rxjs16.EMPTY),
|
|
7646
8387
|
// don't emit, let provider mark balances stale
|
|
7647
|
-
(0,
|
|
8388
|
+
(0, import_rxjs16.map)(
|
|
7648
8389
|
(results) => ({
|
|
7649
8390
|
status: "live",
|
|
7650
8391
|
// exclude zero balances
|
|
@@ -7654,16 +8395,16 @@ var BalancesProvider = class {
|
|
|
7654
8395
|
)
|
|
7655
8396
|
})
|
|
7656
8397
|
),
|
|
7657
|
-
(0,
|
|
8398
|
+
(0, import_rxjs16.tap)((results) => {
|
|
7658
8399
|
this.updateStorage$(balanceIds, results);
|
|
7659
8400
|
}),
|
|
7660
8401
|
// shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change
|
|
7661
|
-
(0,
|
|
7662
|
-
(0,
|
|
8402
|
+
(0, import_rxjs16.shareReplay)({ refCount: true, bufferSize: 1 }),
|
|
8403
|
+
(0, import_util17.keepAlive)(0)
|
|
7663
8404
|
);
|
|
7664
|
-
return (0,
|
|
8405
|
+
return (0, import_rxjs16.defer)(
|
|
7665
8406
|
() => moduleBalances$.pipe(
|
|
7666
|
-
(0,
|
|
8407
|
+
(0, import_rxjs16.startWith)({
|
|
7667
8408
|
status: "initialising",
|
|
7668
8409
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7669
8410
|
failedBalanceIds: []
|
|
@@ -7674,22 +8415,22 @@ var BalancesProvider = class {
|
|
|
7674
8415
|
);
|
|
7675
8416
|
}
|
|
7676
8417
|
getSolanaNetworkModuleBalances$(networkId, tokensWithAddresses, mod) {
|
|
7677
|
-
return (0,
|
|
8418
|
+
return (0, import_util17.getSharedObservable)(
|
|
7678
8419
|
`BalancesProvider.getSolanaNetworkModuleBalances$`,
|
|
7679
8420
|
{ networkId, mod, tokensWithAddresses },
|
|
7680
8421
|
() => {
|
|
7681
8422
|
if (!tokensWithAddresses.length)
|
|
7682
|
-
return (0,
|
|
7683
|
-
const moduleAddressesByTokenId = (0,
|
|
8423
|
+
return (0, import_rxjs16.of)({ status: "live", balances: [], failedBalanceIds: [] });
|
|
8424
|
+
const moduleAddressesByTokenId = (0, import_lodash_es30.fromPairs)(
|
|
7684
8425
|
tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])
|
|
7685
8426
|
);
|
|
7686
|
-
const balanceIds = (0,
|
|
8427
|
+
const balanceIds = (0, import_lodash_es30.toPairs)(moduleAddressesByTokenId).flatMap(
|
|
7687
8428
|
([tokenId, addresses]) => addresses.map((address) => getBalanceId({ tokenId, address }))
|
|
7688
8429
|
);
|
|
7689
8430
|
if (!this.#chainConnectors.solana) {
|
|
7690
8431
|
log_default.warn("[balances] no solana connector for module", mod.type);
|
|
7691
|
-
return (0,
|
|
7692
|
-
() => (0,
|
|
8432
|
+
return (0, import_rxjs16.defer)(
|
|
8433
|
+
() => (0, import_rxjs16.of)({
|
|
7693
8434
|
status: "initialising",
|
|
7694
8435
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7695
8436
|
failedBalanceIds: []
|
|
@@ -7701,9 +8442,14 @@ var BalancesProvider = class {
|
|
|
7701
8442
|
tokensWithAddresses,
|
|
7702
8443
|
connector: this.#chainConnectors.solana
|
|
7703
8444
|
}).pipe(
|
|
7704
|
-
(0,
|
|
8445
|
+
(0, import_rxjs16.catchError)(() => import_rxjs16.EMPTY),
|
|
7705
8446
|
// don't emit, let provider mark balances stale
|
|
7706
|
-
(0,
|
|
8447
|
+
(0, import_rxjs16.tap)((results) => {
|
|
8448
|
+
if (results.dynamicTokens?.length) {
|
|
8449
|
+
this.#chaindataProvider.registerDynamicTokens(results.dynamicTokens);
|
|
8450
|
+
}
|
|
8451
|
+
}),
|
|
8452
|
+
(0, import_rxjs16.map)(
|
|
7707
8453
|
(results) => ({
|
|
7708
8454
|
status: "live",
|
|
7709
8455
|
// exclude zero balances
|
|
@@ -7713,16 +8459,16 @@ var BalancesProvider = class {
|
|
|
7713
8459
|
)
|
|
7714
8460
|
})
|
|
7715
8461
|
),
|
|
7716
|
-
(0,
|
|
8462
|
+
(0, import_rxjs16.tap)((results) => {
|
|
7717
8463
|
this.updateStorage$(balanceIds, results);
|
|
7718
8464
|
}),
|
|
7719
8465
|
// shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change
|
|
7720
|
-
(0,
|
|
7721
|
-
(0,
|
|
8466
|
+
(0, import_rxjs16.shareReplay)({ refCount: true, bufferSize: 1 }),
|
|
8467
|
+
(0, import_util17.keepAlive)(0)
|
|
7722
8468
|
);
|
|
7723
|
-
return (0,
|
|
8469
|
+
return (0, import_rxjs16.defer)(
|
|
7724
8470
|
() => moduleBalances$.pipe(
|
|
7725
|
-
(0,
|
|
8471
|
+
(0, import_rxjs16.startWith)({
|
|
7726
8472
|
status: "initialising",
|
|
7727
8473
|
balances: this.getStoredBalances(moduleAddressesByTokenId),
|
|
7728
8474
|
failedBalanceIds: []
|
|
@@ -7736,14 +8482,14 @@ var BalancesProvider = class {
|
|
|
7736
8482
|
if (balancesResult.status !== "live") return;
|
|
7737
8483
|
const storage = this.#storage.getValue();
|
|
7738
8484
|
const failedIds = new Set(balancesResult.failedBalanceIds);
|
|
7739
|
-
const balances = (0,
|
|
8485
|
+
const balances = (0, import_lodash_es30.assign)(
|
|
7740
8486
|
{},
|
|
7741
8487
|
storage.balances,
|
|
7742
8488
|
// delete all balances expected in the result set (except the ones that failed). because if they are not present it means they are empty.
|
|
7743
|
-
(0,
|
|
8489
|
+
(0, import_lodash_es30.fromPairs)(
|
|
7744
8490
|
balanceIds.filter((bid) => !failedIds.has(bid)).map((balanceId) => [balanceId, void 0])
|
|
7745
8491
|
),
|
|
7746
|
-
(0,
|
|
8492
|
+
(0, import_lodash_es30.keyBy)(
|
|
7747
8493
|
// storage balances must have status "cache", because they are used as start value when initialising subsequent subscriptions
|
|
7748
8494
|
balancesResult.balances.map((b) => ({ ...b, status: "cache" })),
|
|
7749
8495
|
(b) => getBalanceId(b)
|
|
@@ -7753,24 +8499,24 @@ var BalancesProvider = class {
|
|
|
7753
8499
|
const balance = balances[errorBalanceId];
|
|
7754
8500
|
if (balance) balance.status = "stale";
|
|
7755
8501
|
}
|
|
7756
|
-
this.#storage.next((0,
|
|
8502
|
+
this.#storage.next((0, import_lodash_es30.assign)({}, storage, { balances }));
|
|
7757
8503
|
}
|
|
7758
8504
|
getNetworkMiniMetadatas$(networkId) {
|
|
7759
|
-
return (0,
|
|
8505
|
+
return (0, import_util17.getSharedObservable)(`BalancesProvider.getNetworkMiniMetadatas$`, { networkId }, () => {
|
|
7760
8506
|
return this.#chaindataProvider.getNetworkById$(networkId).pipe(
|
|
7761
|
-
(0,
|
|
7762
|
-
(network) => (0,
|
|
7763
|
-
(0,
|
|
7764
|
-
(specVersion) => specVersion === null ? (0,
|
|
8507
|
+
(0, import_rxjs16.switchMap)(
|
|
8508
|
+
(network) => (0, import_chaindata_provider71.isNetworkDot)(network) ? this.getNetworkSpecVersion$(networkId).pipe(
|
|
8509
|
+
(0, import_rxjs16.switchMap)(
|
|
8510
|
+
(specVersion) => specVersion === null ? (0, import_rxjs16.of)([]) : this.getMiniMetadatas$(networkId, specVersion)
|
|
7765
8511
|
)
|
|
7766
|
-
) : (0,
|
|
8512
|
+
) : (0, import_rxjs16.of)([])
|
|
7767
8513
|
),
|
|
7768
|
-
(0,
|
|
8514
|
+
(0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
|
|
7769
8515
|
);
|
|
7770
8516
|
});
|
|
7771
8517
|
}
|
|
7772
8518
|
getNetworkSpecVersion$(networkId) {
|
|
7773
|
-
return (0,
|
|
8519
|
+
return (0, import_rxjs16.from)(
|
|
7774
8520
|
(0, import_viem9.withRetry)(() => getSpecVersion(this.#chainConnectors.substrate, networkId), {
|
|
7775
8521
|
delay: 2e3,
|
|
7776
8522
|
shouldRetry: (err) => {
|
|
@@ -7779,9 +8525,9 @@ var BalancesProvider = class {
|
|
|
7779
8525
|
}
|
|
7780
8526
|
})
|
|
7781
8527
|
).pipe(
|
|
7782
|
-
(0,
|
|
8528
|
+
(0, import_rxjs16.catchError)(() => {
|
|
7783
8529
|
log_default.warn("Failed to fetch spec version for network", networkId);
|
|
7784
|
-
return (0,
|
|
8530
|
+
return (0, import_rxjs16.of)(null);
|
|
7785
8531
|
})
|
|
7786
8532
|
);
|
|
7787
8533
|
}
|
|
@@ -7793,15 +8539,15 @@ var BalancesProvider = class {
|
|
|
7793
8539
|
source: mod.type
|
|
7794
8540
|
})
|
|
7795
8541
|
);
|
|
7796
|
-
return (0,
|
|
8542
|
+
return (0, import_rxjs16.combineLatest)({
|
|
7797
8543
|
defaultMiniMetadatas: this.getDefaultMiniMetadatas$(miniMetadataIds),
|
|
7798
8544
|
storedMiniMetadatas: this.getStoredMiniMetadatas$(miniMetadataIds)
|
|
7799
8545
|
}).pipe(
|
|
7800
|
-
(0,
|
|
7801
|
-
if (defaultMiniMetadatas) return (0,
|
|
7802
|
-
if (storedMiniMetadatas) return (0,
|
|
7803
|
-
if (!this.#chainConnectors.substrate) return (0,
|
|
7804
|
-
return (0,
|
|
8546
|
+
(0, import_rxjs16.switchMap)(({ storedMiniMetadatas, defaultMiniMetadatas }) => {
|
|
8547
|
+
if (defaultMiniMetadatas) return (0, import_rxjs16.of)(defaultMiniMetadatas);
|
|
8548
|
+
if (storedMiniMetadatas) return (0, import_rxjs16.of)(storedMiniMetadatas);
|
|
8549
|
+
if (!this.#chainConnectors.substrate) return (0, import_rxjs16.of)([]);
|
|
8550
|
+
return (0, import_rxjs16.from)(
|
|
7805
8551
|
(0, import_viem9.withRetry)(
|
|
7806
8552
|
() => (
|
|
7807
8553
|
// can fail if metadata cant be fetched
|
|
@@ -7821,65 +8567,65 @@ var BalancesProvider = class {
|
|
|
7821
8567
|
}
|
|
7822
8568
|
)
|
|
7823
8569
|
).pipe(
|
|
7824
|
-
(0,
|
|
8570
|
+
(0, import_rxjs16.catchError)(() => {
|
|
7825
8571
|
log_default.warn("Failed to fetch metadata for network", networkId);
|
|
7826
|
-
return (0,
|
|
8572
|
+
return (0, import_rxjs16.of)([]);
|
|
7827
8573
|
}),
|
|
7828
8574
|
// and persist in storage for later reuse
|
|
7829
|
-
(0,
|
|
8575
|
+
(0, import_rxjs16.tap)((newMiniMetadatas) => {
|
|
7830
8576
|
if (!newMiniMetadatas.length) return;
|
|
7831
8577
|
const storage = this.#storage.getValue();
|
|
7832
|
-
const miniMetadatas = (0,
|
|
8578
|
+
const miniMetadatas = (0, import_lodash_es30.assign)(
|
|
7833
8579
|
// keep minimetadatas of other networks
|
|
7834
|
-
(0,
|
|
7835
|
-
(0,
|
|
8580
|
+
(0, import_lodash_es30.keyBy)(
|
|
8581
|
+
(0, import_lodash_es30.values)(storage.miniMetadatas).filter((m) => m.chainId !== networkId),
|
|
7836
8582
|
(m) => m.id
|
|
7837
8583
|
),
|
|
7838
8584
|
// add the ones for our network
|
|
7839
|
-
(0,
|
|
8585
|
+
(0, import_lodash_es30.keyBy)(newMiniMetadatas, (m) => m.id)
|
|
7840
8586
|
);
|
|
7841
|
-
this.#storage.next((0,
|
|
8587
|
+
this.#storage.next((0, import_lodash_es30.assign)({}, storage, { miniMetadatas }));
|
|
7842
8588
|
})
|
|
7843
8589
|
);
|
|
7844
8590
|
}),
|
|
7845
8591
|
// emit only when mini metadata changes, as a change here would restart all subscriptions for the network
|
|
7846
|
-
(0,
|
|
8592
|
+
(0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
|
|
7847
8593
|
);
|
|
7848
8594
|
}
|
|
7849
8595
|
getStoredMiniMetadatas$(miniMetadataIds) {
|
|
7850
8596
|
return this.storedMiniMetadataMapById$.pipe(
|
|
7851
|
-
(0,
|
|
8597
|
+
(0, import_rxjs16.map)((mapById) => {
|
|
7852
8598
|
const miniMetadatas = miniMetadataIds.map((id) => mapById[id]);
|
|
7853
|
-
return miniMetadatas.length && miniMetadatas.every(
|
|
8599
|
+
return miniMetadatas.length && miniMetadatas.every(import_util17.isTruthy) ? miniMetadatas : null;
|
|
7854
8600
|
}),
|
|
7855
8601
|
// source changes very often
|
|
7856
|
-
(0,
|
|
8602
|
+
(0, import_rxjs16.distinctUntilChanged)(import_lodash_es30.isEqual)
|
|
7857
8603
|
);
|
|
7858
8604
|
}
|
|
7859
8605
|
getDefaultMiniMetadatas$(miniMetadataIds) {
|
|
7860
8606
|
return this.#chaindataProvider.miniMetadatasMapById$.pipe(
|
|
7861
|
-
(0,
|
|
8607
|
+
(0, import_rxjs16.map)((mapById) => {
|
|
7862
8608
|
const miniMetadatas = miniMetadataIds.map((id) => mapById[id]);
|
|
7863
|
-
return miniMetadatas.length && miniMetadatas.every(
|
|
8609
|
+
return miniMetadatas.length && miniMetadatas.every(import_util17.isTruthy) ? miniMetadatas : null;
|
|
7864
8610
|
})
|
|
7865
8611
|
);
|
|
7866
8612
|
}
|
|
7867
8613
|
getStoredBalances(addressesByToken) {
|
|
7868
|
-
const balanceDefs = (0,
|
|
8614
|
+
const balanceDefs = (0, import_lodash_es30.toPairs)(addressesByToken).flatMap(
|
|
7869
8615
|
([tokenId, addresses]) => addresses.map((address) => [tokenId, address])
|
|
7870
8616
|
);
|
|
7871
|
-
return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(
|
|
8617
|
+
return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })]).filter(import_util17.isNotNil).sort(sortByBalanceId);
|
|
7872
8618
|
}
|
|
7873
8619
|
cleanupAddressesByTokenId$(addressesByTokenId) {
|
|
7874
8620
|
return this.#chaindataProvider.getNetworksMapById$().pipe(
|
|
7875
|
-
(0,
|
|
7876
|
-
return (0,
|
|
7877
|
-
(0,
|
|
7878
|
-
const networkId = (0,
|
|
8621
|
+
(0, import_rxjs16.map)((networksById) => {
|
|
8622
|
+
return (0, import_lodash_es30.fromPairs)(
|
|
8623
|
+
(0, import_lodash_es30.toPairs)(addressesByTokenId).map(([tokenId, addresses]) => {
|
|
8624
|
+
const networkId = (0, import_chaindata_provider71.parseTokenId)(tokenId).networkId;
|
|
7879
8625
|
const network = networksById[networkId];
|
|
7880
8626
|
return [
|
|
7881
8627
|
tokenId,
|
|
7882
|
-
(0,
|
|
8628
|
+
(0, import_lodash_es30.uniq)(addresses.map(import_crypto8.normalizeAddress)).filter(
|
|
7883
8629
|
(address) => network && isAddressCompatibleWithNetwork(network, address)
|
|
7884
8630
|
)
|
|
7885
8631
|
];
|
|
@@ -7918,7 +8664,7 @@ var sortByBalanceId = (a, b) => getBalanceId(a).localeCompare(getBalanceId(b));
|
|
|
7918
8664
|
var sortByMiniMetadataId = (a, b) => a.id.localeCompare(b.id);
|
|
7919
8665
|
|
|
7920
8666
|
// src/version.ts
|
|
7921
|
-
var
|
|
8667
|
+
var import_chaindata_provider72 = require("@talismn/chaindata-provider");
|
|
7922
8668
|
// Annotate the CommonJS export names for ESM import in node:
|
|
7923
8669
|
0 && (module.exports = {
|
|
7924
8670
|
ALPHA_PRICE_SCALE,
|
|
@@ -7942,6 +8688,8 @@ var import_chaindata_provider65 = require("@talismn/chaindata-provider");
|
|
|
7942
8688
|
SolNativeTokenConfigSchema,
|
|
7943
8689
|
SolSplBalanceModule,
|
|
7944
8690
|
SolSplTokenConfigSchema,
|
|
8691
|
+
SolToken2022BalanceModule,
|
|
8692
|
+
SolToken2022TokenConfigSchema,
|
|
7945
8693
|
SubAssetsBalanceModule,
|
|
7946
8694
|
SubAssetsTokenConfigSchema,
|
|
7947
8695
|
SubDTaoBalanceModule,
|
|
@@ -7970,7 +8718,9 @@ var import_chaindata_provider65 = require("@talismn/chaindata-provider");
|
|
|
7970
8718
|
excludeFromTransferableAmount,
|
|
7971
8719
|
filterBaseLocks,
|
|
7972
8720
|
filterMirrorTokens,
|
|
8721
|
+
findDTaoConvictionLock,
|
|
7973
8722
|
getBalanceId,
|
|
8723
|
+
getConvictionLockLabel,
|
|
7974
8724
|
getDTaoTokenRates,
|
|
7975
8725
|
getLockTitle,
|
|
7976
8726
|
getLockedType,
|
|
@@ -7978,6 +8728,7 @@ var import_chaindata_provider65 = require("@talismn/chaindata-provider");
|
|
|
7978
8728
|
getValueId,
|
|
7979
8729
|
includeInTotalExtraAmount,
|
|
7980
8730
|
taoToAlpha,
|
|
8731
|
+
taoToAlphaCeil,
|
|
7981
8732
|
uniswapV2PairAbi
|
|
7982
8733
|
});
|
|
7983
8734
|
//# sourceMappingURL=index.js.map
|