torchsdk 1.0.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/tokens.js ADDED
@@ -0,0 +1,537 @@
1
+ "use strict";
2
+ /**
3
+ * Token data fetching
4
+ *
5
+ * Read-only functions for querying token state from Solana.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.fetchTokenRaw = exports.getLoanPosition = exports.getLendingInfo = exports.getMessages = exports.getHolders = exports.getToken = exports.getTokens = void 0;
45
+ const web3_js_1 = require("@solana/web3.js");
46
+ const anchor_1 = require("@coral-xyz/anchor");
47
+ const spl_token_1 = require("@solana/spl-token");
48
+ const program_1 = require("./program");
49
+ const constants_1 = require("./constants");
50
+ const gateway_1 = require("./gateway");
51
+ const torch_market_json_1 = __importDefault(require("./torch_market.json"));
52
+ const getTokenStatus = (bc) => {
53
+ if (bc.migrated)
54
+ return 'migrated';
55
+ if (bc.bonding_complete)
56
+ return 'complete';
57
+ return 'bonding';
58
+ };
59
+ const fetchAllRawTokens = async (connection) => {
60
+ const coder = new anchor_1.BorshCoder(torch_market_json_1.default);
61
+ const accounts = await connection.getProgramAccounts(constants_1.PROGRAM_ID, {
62
+ filters: [{ memcmp: { offset: 0, bytes: '4y6pru6YvC7' } }],
63
+ });
64
+ const tokens = [];
65
+ for (const acc of accounts) {
66
+ try {
67
+ const decoded = coder.accounts.decode('BondingCurve', acc.account.data);
68
+ const mintStr = decoded.mint.toString();
69
+ if (constants_1.BLACKLISTED_MINTS.includes(mintStr))
70
+ continue;
71
+ if (decoded.reclaimed)
72
+ continue;
73
+ tokens.push({
74
+ mint: mintStr,
75
+ bondingCurve: decoded,
76
+ });
77
+ }
78
+ catch {
79
+ // Not a bonding curve account
80
+ }
81
+ }
82
+ return tokens;
83
+ };
84
+ const toTokenSummary = (raw) => {
85
+ const bc = raw.bondingCurve;
86
+ const virtualSol = BigInt(bc.virtual_sol_reserves.toString());
87
+ const virtualTokens = BigInt(bc.virtual_token_reserves.toString());
88
+ const realSol = BigInt(bc.real_sol_reserves.toString());
89
+ const realTokens = BigInt(bc.real_token_reserves.toString());
90
+ const voteVault = BigInt(bc.vote_vault_balance.toString());
91
+ const price = (0, program_1.calculatePrice)(virtualSol, virtualTokens);
92
+ const priceInSol = (price * constants_1.TOKEN_MULTIPLIER) / constants_1.LAMPORTS_PER_SOL;
93
+ const circulating = constants_1.TOTAL_SUPPLY - realTokens - voteVault;
94
+ const marketCapSol = (priceInSol * Number(circulating)) / constants_1.TOKEN_MULTIPLIER;
95
+ return {
96
+ mint: raw.mint,
97
+ name: (0, program_1.decodeString)(bc.name),
98
+ symbol: (0, program_1.decodeString)(bc.symbol),
99
+ status: getTokenStatus(bc),
100
+ price_sol: priceInSol,
101
+ market_cap_sol: marketCapSol,
102
+ progress_percent: (0, program_1.calculateBondingProgress)(realSol),
103
+ holders: 0,
104
+ created_at: 0,
105
+ };
106
+ };
107
+ const filterAndSort = (tokens, params) => {
108
+ let filtered = [...tokens];
109
+ if (params.status && params.status !== 'all') {
110
+ filtered = filtered.filter((t) => getTokenStatus(t.bondingCurve) === params.status);
111
+ }
112
+ switch (params.sort) {
113
+ case 'marketcap':
114
+ case 'volume':
115
+ filtered.sort((a, b) => {
116
+ const aR = BigInt(a.bondingCurve.real_sol_reserves.toString());
117
+ const bR = BigInt(b.bondingCurve.real_sol_reserves.toString());
118
+ return bR > aR ? 1 : bR < aR ? -1 : 0;
119
+ });
120
+ break;
121
+ case 'newest':
122
+ default:
123
+ filtered.sort((a, b) => {
124
+ const aA = BigInt(a.bondingCurve.last_activity_slot.toString());
125
+ const bA = BigInt(b.bondingCurve.last_activity_slot.toString());
126
+ return bA > aA ? 1 : bA < aA ? -1 : 0;
127
+ });
128
+ break;
129
+ }
130
+ const offset = params.offset || 0;
131
+ const limit = Math.min(params.limit || 50, 100);
132
+ return filtered.slice(offset, offset + limit);
133
+ };
134
+ const buildTokenDetail = (mint, bc, treasury, metadata, holdersCount, solPriceUsd, saidVerification) => {
135
+ const virtualSol = BigInt(bc.virtual_sol_reserves.toString());
136
+ const virtualTokens = BigInt(bc.virtual_token_reserves.toString());
137
+ const realSol = BigInt(bc.real_sol_reserves.toString());
138
+ const realTokens = BigInt(bc.real_token_reserves.toString());
139
+ const voteVault = BigInt(bc.vote_vault_balance.toString());
140
+ const burned = BigInt(bc.permanently_burned_tokens?.toString() || '0');
141
+ const price = (0, program_1.calculatePrice)(virtualSol, virtualTokens);
142
+ const priceInSol = (price * constants_1.TOKEN_MULTIPLIER) / constants_1.LAMPORTS_PER_SOL;
143
+ const circulating = constants_1.TOTAL_SUPPLY - realTokens - voteVault;
144
+ const marketCapSol = (priceInSol * Number(circulating)) / constants_1.TOKEN_MULTIPLIER;
145
+ const treasurySol = treasury ? Number(treasury.sol_balance.toString()) / constants_1.LAMPORTS_PER_SOL : 0;
146
+ const treasuryTokens = treasury ? Number(treasury.tokens_held.toString()) / constants_1.TOKEN_MULTIPLIER : 0;
147
+ const boughtBack = treasury ? Number(treasury.total_bought_back.toString()) / constants_1.TOKEN_MULTIPLIER : 0;
148
+ const buybackCount = treasury ? Number(treasury.buyback_count.toString()) : 0;
149
+ const stars = treasury ? Number(treasury.total_stars.toString()) : 0;
150
+ return {
151
+ mint,
152
+ name: (0, program_1.decodeString)(bc.name),
153
+ symbol: (0, program_1.decodeString)(bc.symbol),
154
+ description: metadata?.description,
155
+ image: metadata?.image,
156
+ status: getTokenStatus(bc),
157
+ price_sol: priceInSol,
158
+ price_usd: solPriceUsd ? priceInSol * solPriceUsd : undefined,
159
+ market_cap_sol: marketCapSol,
160
+ market_cap_usd: solPriceUsd ? marketCapSol * solPriceUsd : undefined,
161
+ progress_percent: (0, program_1.calculateBondingProgress)(realSol),
162
+ sol_raised: Number(realSol) / constants_1.LAMPORTS_PER_SOL,
163
+ sol_target: 200,
164
+ total_supply: Number(constants_1.TOTAL_SUPPLY) / constants_1.TOKEN_MULTIPLIER,
165
+ circulating_supply: Number(circulating) / constants_1.TOKEN_MULTIPLIER,
166
+ tokens_in_curve: Number(realTokens) / constants_1.TOKEN_MULTIPLIER,
167
+ tokens_in_vote_vault: Number(voteVault) / constants_1.TOKEN_MULTIPLIER,
168
+ tokens_burned: Number(burned) / constants_1.TOKEN_MULTIPLIER,
169
+ treasury_sol_balance: treasurySol,
170
+ treasury_token_balance: treasuryTokens,
171
+ total_bought_back: boughtBack,
172
+ buyback_count: buybackCount,
173
+ votes_return: Number(bc.votes_return.toString()),
174
+ votes_burn: Number(bc.votes_burn.toString()),
175
+ creator: bc.creator.toString(),
176
+ holders: holdersCount || 0,
177
+ stars,
178
+ created_at: 0,
179
+ last_activity_at: Number(bc.last_activity_slot.toString()),
180
+ twitter: metadata?.twitter,
181
+ telegram: metadata?.telegram,
182
+ website: metadata?.website,
183
+ creator_verified: saidVerification?.verified,
184
+ creator_trust_tier: saidVerification?.trustTier,
185
+ creator_said_name: saidVerification?.name,
186
+ creator_badge_url: saidVerification?.verified
187
+ ? `https://api.saidprotocol.com/api/badge/${bc.creator.toString()}.svg`
188
+ : undefined,
189
+ };
190
+ };
191
+ // Internal: fetch single token on-chain data
192
+ const fetchTokenRaw = async (connection, mint) => {
193
+ const coder = new anchor_1.BorshCoder(torch_market_json_1.default);
194
+ const [bondingCurvePda] = (0, program_1.getBondingCurvePda)(mint);
195
+ const [treasuryPda] = (0, program_1.getTokenTreasuryPda)(mint);
196
+ const [bcAccount, treasuryAccount] = await Promise.all([
197
+ connection.getAccountInfo(bondingCurvePda),
198
+ connection.getAccountInfo(treasuryPda),
199
+ ]);
200
+ if (!bcAccount)
201
+ return null;
202
+ const bondingCurve = coder.accounts.decode('BondingCurve', bcAccount.data);
203
+ let treasury = null;
204
+ if (treasuryAccount) {
205
+ treasury = coder.accounts.decode('Treasury', treasuryAccount.data);
206
+ }
207
+ return { bondingCurve, treasury };
208
+ };
209
+ exports.fetchTokenRaw = fetchTokenRaw;
210
+ // ============================================================================
211
+ // Public API
212
+ // ============================================================================
213
+ /**
214
+ * List tokens with optional filtering and sorting.
215
+ */
216
+ const getTokens = async (connection, params = {}) => {
217
+ const allTokens = await fetchAllRawTokens(connection);
218
+ const filtered = filterAndSort(allTokens, params);
219
+ const summaries = filtered.map(toTokenSummary);
220
+ return {
221
+ tokens: summaries,
222
+ total: allTokens.length,
223
+ limit: params.limit || 50,
224
+ offset: params.offset || 0,
225
+ };
226
+ };
227
+ exports.getTokens = getTokens;
228
+ /**
229
+ * Get detailed info for a single token.
230
+ */
231
+ const getToken = async (connection, mintStr) => {
232
+ const mint = new web3_js_1.PublicKey(mintStr);
233
+ const tokenData = await fetchTokenRaw(connection, mint);
234
+ if (!tokenData) {
235
+ throw new Error(`Token not found: ${mintStr}`);
236
+ }
237
+ const { bondingCurve, treasury } = tokenData;
238
+ // Fetch metadata from URI
239
+ let metadata;
240
+ const uri = (0, program_1.decodeString)(bondingCurve.uri);
241
+ if (uri) {
242
+ try {
243
+ const res = await (0, gateway_1.fetchWithFallback)(uri);
244
+ const data = (await res.json());
245
+ metadata = {
246
+ description: data.description,
247
+ image: data.image && (0, gateway_1.isIrysUrl)(data.image) ? (0, gateway_1.irysToUploader)(data.image) : data.image,
248
+ twitter: data.twitter,
249
+ telegram: data.telegram,
250
+ website: data.website,
251
+ };
252
+ }
253
+ catch {
254
+ // Metadata fetch failed
255
+ }
256
+ }
257
+ // Fetch holders count
258
+ let holdersCount = 0;
259
+ try {
260
+ const holders = await connection.getTokenLargestAccounts(mint, 'confirmed');
261
+ holdersCount = holders.value.filter((a) => a.uiAmount && a.uiAmount > 0).length;
262
+ }
263
+ catch {
264
+ // Holders fetch failed
265
+ }
266
+ // Fetch SOL price
267
+ let solPriceUsd;
268
+ try {
269
+ const res = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=solana&vs_currencies=usd');
270
+ const data = (await res.json());
271
+ solPriceUsd = data?.solana?.usd;
272
+ }
273
+ catch {
274
+ // Price fetch failed
275
+ }
276
+ return buildTokenDetail(mintStr, bondingCurve, treasury, metadata, holdersCount, solPriceUsd);
277
+ };
278
+ exports.getToken = getToken;
279
+ /**
280
+ * Get top holders for a token.
281
+ */
282
+ const getHolders = async (connection, mintStr, limit = 20) => {
283
+ const mint = new web3_js_1.PublicKey(mintStr);
284
+ const safeLimit = Math.min(limit, 100);
285
+ // Build excluded addresses (pools/vaults)
286
+ const excluded = new Set();
287
+ const [bondingCurvePda] = (0, program_1.getBondingCurvePda)(mint);
288
+ const bondingCurveVault = (0, spl_token_1.getAssociatedTokenAddressSync)(mint, bondingCurvePda, true, constants_1.TOKEN_2022_PROGRAM_ID);
289
+ excluded.add(bondingCurveVault.toString());
290
+ const [treasuryPda] = (0, program_1.getTokenTreasuryPda)(mint);
291
+ const treasuryVault = (0, spl_token_1.getAssociatedTokenAddressSync)(mint, treasuryPda, true, constants_1.TOKEN_2022_PROGRAM_ID);
292
+ excluded.add(treasuryVault.toString());
293
+ try {
294
+ const raydiumAccounts = (0, program_1.getRaydiumMigrationAccounts)(mint);
295
+ excluded.add(raydiumAccounts.token0Vault.toString());
296
+ excluded.add(raydiumAccounts.token1Vault.toString());
297
+ }
298
+ catch {
299
+ // Ignore
300
+ }
301
+ const response = await connection.getTokenLargestAccounts(mint, 'confirmed');
302
+ const totalSupply = BigInt(1000000000) * BigInt(10 ** constants_1.TOKEN_DECIMALS);
303
+ const filteredAccounts = response.value
304
+ .filter((account) => account.uiAmount && account.uiAmount > 0)
305
+ .filter((account) => !excluded.has(account.address.toString()))
306
+ .slice(0, safeLimit);
307
+ const accountInfos = await connection.getMultipleParsedAccounts(filteredAccounts.map((a) => a.address));
308
+ const holders = filteredAccounts.map((account, i) => {
309
+ const parsed = accountInfos.value[i]?.data;
310
+ const owner = parsed && 'parsed' in parsed ? parsed.parsed?.info?.owner : null;
311
+ return {
312
+ address: owner || account.address.toString(),
313
+ balance: Number(account.amount) / 10 ** constants_1.TOKEN_DECIMALS,
314
+ percentage: (Number(account.amount) / Number(totalSupply)) * 100,
315
+ };
316
+ });
317
+ return {
318
+ holders,
319
+ total_holders: response.value.filter((a) => a.uiAmount && a.uiAmount > 0 && !excluded.has(a.address.toString())).length,
320
+ };
321
+ };
322
+ exports.getHolders = getHolders;
323
+ /**
324
+ * Get messages (memos) for a token.
325
+ */
326
+ const getMessages = async (connection, mintStr, limit = 50) => {
327
+ const mint = new web3_js_1.PublicKey(mintStr);
328
+ const safeLimit = Math.min(limit, 100);
329
+ const [bondingCurvePda] = (0, program_1.getBondingCurvePda)(mint);
330
+ const signatures = await connection.getSignaturesForAddress(bondingCurvePda, { limit: 500 }, 'confirmed');
331
+ const messages = [];
332
+ for (const sig of signatures) {
333
+ if (messages.length >= safeLimit)
334
+ break;
335
+ try {
336
+ const tx = await connection.getParsedTransaction(sig.signature, {
337
+ maxSupportedTransactionVersion: 0,
338
+ });
339
+ if (!tx?.meta || tx.meta.err)
340
+ continue;
341
+ for (const ix of tx.transaction.message.instructions) {
342
+ const programId = 'programId' in ix ? ix.programId.toString() : '';
343
+ const programName = 'program' in ix ? ix.program : '';
344
+ const isMemo = programId === constants_1.MEMO_PROGRAM_ID.toString() ||
345
+ programId === 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr' ||
346
+ programName === 'spl-memo';
347
+ if (isMemo) {
348
+ let memoText = '';
349
+ if ('parsed' in ix) {
350
+ memoText = typeof ix.parsed === 'string' ? ix.parsed : JSON.stringify(ix.parsed);
351
+ }
352
+ else if ('data' in ix && typeof ix.data === 'string') {
353
+ try {
354
+ const bs58 = await Promise.resolve().then(() => __importStar(require('bs58')));
355
+ const decoded = bs58.default.decode(ix.data);
356
+ memoText = new TextDecoder().decode(decoded);
357
+ }
358
+ catch {
359
+ memoText = ix.data;
360
+ }
361
+ }
362
+ if (memoText && memoText.trim()) {
363
+ const sender = tx.transaction.message.accountKeys[0]?.pubkey?.toString() || 'Unknown';
364
+ messages.push({
365
+ signature: sig.signature,
366
+ memo: memoText.trim(),
367
+ sender,
368
+ timestamp: sig.blockTime || 0,
369
+ });
370
+ break;
371
+ }
372
+ }
373
+ }
374
+ }
375
+ catch {
376
+ // Skip failed parsing
377
+ }
378
+ }
379
+ return { messages, total: messages.length };
380
+ };
381
+ exports.getMessages = getMessages;
382
+ // ============================================================================
383
+ // Lending (V2.4)
384
+ // ============================================================================
385
+ // Lending constants (matching the Rust program)
386
+ const INTEREST_RATE_BPS = 200; // 2% per epoch
387
+ const MAX_LTV_BPS = 5000; // 50%
388
+ const LIQUIDATION_THRESHOLD_BPS = 6500; // 65%
389
+ const LIQUIDATION_BONUS_BPS = 1000; // 10%
390
+ /**
391
+ * Get lending info for a migrated token.
392
+ *
393
+ * Returns interest rates, LTV limits, and active loan statistics.
394
+ * Lending is available on all migrated tokens with treasury SOL.
395
+ */
396
+ const getLendingInfo = async (connection, mintStr) => {
397
+ const mint = new web3_js_1.PublicKey(mintStr);
398
+ const coder = new anchor_1.BorshCoder(torch_market_json_1.default);
399
+ const tokenData = await fetchTokenRaw(connection, mint);
400
+ if (!tokenData)
401
+ throw new Error(`Token not found: ${mintStr}`);
402
+ const { bondingCurve, treasury } = tokenData;
403
+ if (!bondingCurve.migrated)
404
+ throw new Error('Token not yet migrated, lending not available');
405
+ const treasurySol = treasury ? Number(treasury.sol_balance.toString()) : 0;
406
+ // Scan for active loan positions via collateral vault balance
407
+ const [collateralVaultPda] = (0, program_1.getCollateralVaultPda)(mint);
408
+ const vaultInfo = await connection.getAccountInfo(collateralVaultPda);
409
+ // Count active loans by scanning LoanPosition accounts
410
+ let activeLoans = 0;
411
+ let totalSolLent = 0;
412
+ try {
413
+ const loanDiscriminator = Buffer.from([45, 172, 28, 194, 82, 206, 243, 190]);
414
+ const accounts = await connection.getProgramAccounts(constants_1.PROGRAM_ID, {
415
+ filters: [
416
+ { memcmp: { offset: 0, bytes: loanDiscriminator.toString('base64') } },
417
+ { memcmp: { offset: 8 + 32, bytes: mint.toBase58() } }, // mint at offset 40
418
+ ],
419
+ dataSlice: { offset: 8 + 32 + 32, length: 16 }, // collateral_amount + borrowed_amount
420
+ });
421
+ for (const acc of accounts) {
422
+ try {
423
+ // Read borrowed_amount (u64 at offset 8 within the slice)
424
+ const borrowed = acc.account.data.readBigUInt64LE(8);
425
+ if (borrowed > BigInt(0)) {
426
+ activeLoans++;
427
+ totalSolLent += Number(borrowed);
428
+ }
429
+ }
430
+ catch {
431
+ // Skip malformed accounts
432
+ }
433
+ }
434
+ }
435
+ catch {
436
+ // Fallback: can't enumerate loans
437
+ }
438
+ return {
439
+ interest_rate_bps: INTEREST_RATE_BPS,
440
+ max_ltv_bps: MAX_LTV_BPS,
441
+ liquidation_threshold_bps: LIQUIDATION_THRESHOLD_BPS,
442
+ liquidation_bonus_bps: LIQUIDATION_BONUS_BPS,
443
+ total_sol_lent: totalSolLent,
444
+ active_loans: activeLoans,
445
+ treasury_sol_available: treasurySol,
446
+ };
447
+ };
448
+ exports.getLendingInfo = getLendingInfo;
449
+ /**
450
+ * Get loan position for a wallet on a specific token.
451
+ *
452
+ * Returns collateral locked, SOL owed, health status, etc.
453
+ * Returns health="none" if no active loan exists.
454
+ */
455
+ const getLoanPosition = async (connection, mintStr, walletStr) => {
456
+ const mint = new web3_js_1.PublicKey(mintStr);
457
+ const wallet = new web3_js_1.PublicKey(walletStr);
458
+ const coder = new anchor_1.BorshCoder(torch_market_json_1.default);
459
+ const [loanPositionPda] = (0, program_1.getLoanPositionPda)(mint, wallet);
460
+ const accountInfo = await connection.getAccountInfo(loanPositionPda);
461
+ if (!accountInfo) {
462
+ return {
463
+ collateral_amount: 0,
464
+ borrowed_amount: 0,
465
+ accrued_interest: 0,
466
+ total_owed: 0,
467
+ collateral_value_sol: 0,
468
+ current_ltv_bps: 0,
469
+ health: 'none',
470
+ };
471
+ }
472
+ const loan = coder.accounts.decode('LoanPosition', accountInfo.data);
473
+ const collateral = Number(loan.collateral_amount.toString());
474
+ const borrowed = Number(loan.borrowed_amount.toString());
475
+ const interest = Number(loan.accrued_interest.toString());
476
+ const totalOwed = borrowed + interest;
477
+ // Get collateral value from Raydium pool price
478
+ let collateralValueSol = 0;
479
+ try {
480
+ const raydium = (0, program_1.getRaydiumMigrationAccounts)(mint);
481
+ const [vault0Info, vault1Info] = await Promise.all([
482
+ connection.getTokenAccountBalance(raydium.token0Vault),
483
+ connection.getTokenAccountBalance(raydium.token1Vault),
484
+ ]);
485
+ const vault0Amount = Number(vault0Info.value.amount);
486
+ const vault1Amount = Number(vault1Info.value.amount);
487
+ // Determine which vault is SOL and which is token
488
+ if (raydium.isWsolToken0) {
489
+ // token0 = WSOL, token1 = token
490
+ const solReserves = vault0Amount;
491
+ const tokenReserves = vault1Amount;
492
+ if (tokenReserves > 0) {
493
+ collateralValueSol = (collateral * solReserves) / tokenReserves;
494
+ }
495
+ }
496
+ else {
497
+ // token0 = token, token1 = WSOL
498
+ const solReserves = vault1Amount;
499
+ const tokenReserves = vault0Amount;
500
+ if (tokenReserves > 0) {
501
+ collateralValueSol = (collateral * solReserves) / tokenReserves;
502
+ }
503
+ }
504
+ }
505
+ catch {
506
+ // Can't determine price
507
+ }
508
+ const currentLtvBps = collateralValueSol > 0
509
+ ? Math.floor((totalOwed / collateralValueSol) * 10000)
510
+ : totalOwed > 0
511
+ ? 10000
512
+ : 0;
513
+ let health;
514
+ if (borrowed === 0 && interest === 0) {
515
+ health = 'none';
516
+ }
517
+ else if (currentLtvBps >= LIQUIDATION_THRESHOLD_BPS) {
518
+ health = 'liquidatable';
519
+ }
520
+ else if (currentLtvBps >= MAX_LTV_BPS) {
521
+ health = 'at_risk';
522
+ }
523
+ else {
524
+ health = 'healthy';
525
+ }
526
+ return {
527
+ collateral_amount: collateral,
528
+ borrowed_amount: borrowed,
529
+ accrued_interest: interest,
530
+ total_owed: totalOwed,
531
+ collateral_value_sol: collateralValueSol,
532
+ current_ltv_bps: currentLtvBps,
533
+ health,
534
+ };
535
+ };
536
+ exports.getLoanPosition = getLoanPosition;
537
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,6CAAuD;AACvD,8CAAmD;AACnD,iDAAiE;AACjE,uCAYkB;AAClB,2CASoB;AACpB,uCAAwE;AACxE,4EAAqC;AAyBrC,MAAM,cAAc,GAAG,CAAC,EAAgB,EAAe,EAAE;IACvD,IAAI,EAAE,CAAC,QAAQ;QAAE,OAAO,UAAU,CAAA;IAClC,IAAI,EAAE,CAAC,gBAAgB;QAAE,OAAO,UAAU,CAAA;IAC1C,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,KAAK,EAAE,UAAsB,EAAuB,EAAE;IAC9E,MAAM,KAAK,GAAG,IAAI,mBAAU,CAAC,2BAAqB,CAAC,CAAA;IAEnD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,sBAAU,EAAE;QAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC;KAC3D,CAAC,CAAA;IAEF,MAAM,MAAM,GAAe,EAAE,CAAA;IAE7B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACvE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;YAEvC,IAAI,6BAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAQ;YACjD,IAAI,OAAO,CAAC,SAAS;gBAAE,SAAQ;YAE/B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,YAAY,EAAE,OAAkC;aACjD,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,GAAa,EAAgB,EAAE;IACrD,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAA;IAE3B,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7D,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,CAAA;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAA;IAE1D,MAAM,KAAK,GAAG,IAAA,wBAAc,EAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,CAAC,KAAK,GAAG,4BAAgB,CAAC,GAAG,4BAAgB,CAAA;IAEhE,MAAM,WAAW,GAAG,wBAAY,GAAG,UAAU,GAAG,SAAS,CAAA;IACzD,MAAM,YAAY,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,4BAAgB,CAAA;IAE1E,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,IAAA,sBAAY,EAAC,EAAE,CAAC,IAAI,CAAC;QAC3B,MAAM,EAAE,IAAA,sBAAY,EAAC,EAAE,CAAC,MAAM,CAAC;QAC/B,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,UAAU;QACrB,cAAc,EAAE,YAAY;QAC5B,gBAAgB,EAAE,IAAA,kCAAwB,EAAC,OAAO,CAAC;QACnD,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;KACd,CAAA;AACH,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,MAAkB,EAAE,MAAuB,EAAc,EAAE;IAChF,IAAI,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IAE1B,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAA;IACrF,CAAC;IAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,WAAW,CAAC;QACjB,KAAK,QAAQ;YACX,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACrB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC9D,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC9D,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC,CAAC,CAAA;YACF,MAAK;QACP,KAAK,QAAQ,CAAC;QACd;YACE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACrB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC/D,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC,CAAC,CAAA;YACF,MAAK;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAA;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;IAC/C,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,CACvB,IAAY,EACZ,EAAgB,EAChB,QAAyB,EACzB,QAMC,EACD,YAAqB,EACrB,WAAoB,EACpB,gBAA0C,EAC7B,EAAE;IACf,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7D,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,CAAA;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAA;IAEtE,MAAM,KAAK,GAAG,IAAA,wBAAc,EAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,CAAC,KAAK,GAAG,4BAAgB,CAAC,GAAG,4BAAgB,CAAA;IAChE,MAAM,WAAW,GAAG,wBAAY,GAAG,UAAU,GAAG,SAAS,CAAA;IACzD,MAAM,YAAY,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,4BAAgB,CAAA;IAE1E,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,GAAG,4BAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7F,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,GAAG,4BAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;IAChG,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,GAAG,4BAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;IAClG,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7E,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpE,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,IAAA,sBAAY,EAAC,EAAE,CAAC,IAAI,CAAC;QAC3B,MAAM,EAAE,IAAA,sBAAY,EAAC,EAAE,CAAC,MAAM,CAAC;QAC/B,WAAW,EAAE,QAAQ,EAAE,WAAW;QAClC,KAAK,EAAE,QAAQ,EAAE,KAAK;QACtB,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS;QAC7D,cAAc,EAAE,YAAY;QAC5B,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS;QACpE,gBAAgB,EAAE,IAAA,kCAAwB,EAAC,OAAO,CAAC;QACnD,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,4BAAgB;QAC9C,UAAU,EAAE,GAAG;QACf,YAAY,EAAE,MAAM,CAAC,wBAAY,CAAC,GAAG,4BAAgB;QACrD,kBAAkB,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,4BAAgB;QAC1D,eAAe,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,4BAAgB;QACtD,oBAAoB,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,4BAAgB;QAC1D,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,4BAAgB;QAChD,oBAAoB,EAAE,WAAW;QACjC,sBAAsB,EAAE,cAAc;QACtC,iBAAiB,EAAE,UAAU;QAC7B,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAChD,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC5C,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE;QAC9B,OAAO,EAAE,YAAY,IAAI,CAAC;QAC1B,KAAK;QACL,UAAU,EAAE,CAAC;QACb,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC;QAC1D,OAAO,EAAE,QAAQ,EAAE,OAAO;QAC1B,QAAQ,EAAE,QAAQ,EAAE,QAAQ;QAC5B,OAAO,EAAE,QAAQ,EAAE,OAAO;QAC1B,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ;QAC5C,kBAAkB,EAAE,gBAAgB,EAAE,SAAS;QAC/C,iBAAiB,EAAE,gBAAgB,EAAE,IAAI;QACzC,iBAAiB,EAAE,gBAAgB,EAAE,QAAQ;YAC3C,CAAC,CAAC,0CAA0C,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM;YACvE,CAAC,CAAC,SAAS;KACd,CAAA;AACH,CAAC,CAAA;AAED,6CAA6C;AAC7C,MAAM,aAAa,GAAG,KAAK,EACzB,UAAsB,EACtB,IAAe,EAC4D,EAAE;IAC7E,MAAM,KAAK,GAAG,IAAI,mBAAU,CAAC,2BAAqB,CAAC,CAAA;IAEnD,MAAM,CAAC,eAAe,CAAC,GAAG,IAAA,4BAAkB,EAAC,IAAI,CAAC,CAAA;IAClD,MAAM,CAAC,WAAW,CAAC,GAAG,IAAA,6BAAmB,EAAC,IAAI,CAAC,CAAA;IAE/C,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrD,UAAU,CAAC,cAAc,CAAC,eAAe,CAAC;QAC1C,UAAU,CAAC,cAAc,CAAC,WAAW,CAAC;KACvC,CAAC,CAAA;IAEF,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAE3B,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CACxC,cAAc,EACd,SAAS,CAAC,IAAI,CACY,CAAA;IAE5B,IAAI,QAAQ,GAAoB,IAAI,CAAA;IACpC,IAAI,eAAe,EAAE,CAAC;QACpB,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,IAAI,CAAwB,CAAA;IAC3F,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAA;AACnC,CAAC,CAAA;AAyZQ,sCAAa;AAvZtB,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;GAEG;AACI,MAAM,SAAS,GAAG,KAAK,EAC5B,UAAsB,EACtB,SAA0B,EAAE,EACF,EAAE;IAC5B,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACrD,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAE9C,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,SAAS,CAAC,MAAM;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;KAC3B,CAAA;AACH,CAAC,CAAA;AAdY,QAAA,SAAS,aAcrB;AAED;;GAEG;AACI,MAAM,QAAQ,GAAG,KAAK,EAAE,UAAsB,EAAE,OAAe,EAAwB,EAAE;IAC9F,MAAM,IAAI,GAAG,IAAI,mBAAS,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAEvD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAA;IAE5C,0BAA0B;IAC1B,IAAI,QAQS,CAAA;IACb,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,YAAY,CAAC,GAAG,CAAC,CAAA;IAC1C,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAA,2BAAiB,EAAC,GAAG,CAAC,CAAA;YACxC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAA;YACtD,QAAQ,GAAG;gBACT,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAA,mBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;gBACpF,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAA;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,uBAAuB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAC3E,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,CAAA;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IAED,kBAAkB;IAClB,IAAI,WAA+B,CAAA;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,4EAA4E,CAC7E,CAAA;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAkC,CAAA;QAChE,WAAW,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,OAAO,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAA;AAC/F,CAAC,CAAA;AA3DY,QAAA,QAAQ,YA2DpB;AAED;;GAEG;AACI,MAAM,UAAU,GAAG,KAAK,EAC7B,UAAsB,EACtB,OAAe,EACf,QAAgB,EAAE,EACM,EAAE;IAC1B,MAAM,IAAI,GAAG,IAAI,mBAAS,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAEtC,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAElC,MAAM,CAAC,eAAe,CAAC,GAAG,IAAA,4BAAkB,EAAC,IAAI,CAAC,CAAA;IAClD,MAAM,iBAAiB,GAAG,IAAA,yCAA6B,EACrD,IAAI,EACJ,eAAe,EACf,IAAI,EACJ,iCAAqB,CACtB,CAAA;IACD,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAA;IAE1C,MAAM,CAAC,WAAW,CAAC,GAAG,IAAA,6BAAmB,EAAC,IAAI,CAAC,CAAA;IAC/C,MAAM,aAAa,GAAG,IAAA,yCAA6B,EACjD,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,iCAAqB,CACtB,CAAA;IACD,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEtC,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,IAAA,qCAA2B,EAAC,IAAI,CAAC,CAAA;QACzD,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpD,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,uBAAuB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,UAAa,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI,0BAAc,CAAC,CAAA;IAExE,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK;SACpC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;SAC7D,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC9D,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IAEtB,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,yBAAyB,CAC7D,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CACvC,CAAA;IAED,MAAM,OAAO,GAAa,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAA;QAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAE,MAAc,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QACvF,OAAO;YACL,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;YAC5C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,0BAAc;YACtD,UAAU,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,GAAG;SACjE,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,OAAO;QACP,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC3E,CAAC,MAAM;KACT,CAAA;AACH,CAAC,CAAA;AAjEY,QAAA,UAAU,cAiEtB;AAED;;GAEG;AACI,MAAM,WAAW,GAAG,KAAK,EAC9B,UAAsB,EACtB,OAAe,EACf,QAAgB,EAAE,EACO,EAAE;IAC3B,MAAM,IAAI,GAAG,IAAI,mBAAS,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAEtC,MAAM,CAAC,eAAe,CAAC,GAAG,IAAA,4BAAkB,EAAC,IAAI,CAAC,CAAA;IAElD,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,uBAAuB,CACzD,eAAe,EACf,EAAE,KAAK,EAAE,GAAG,EAAE,EACd,WAAW,CACZ,CAAA;IAED,MAAM,QAAQ,GAAmB,EAAE,CAAA;IAEnC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,QAAQ,CAAC,MAAM,IAAI,SAAS;YAAE,MAAK;QAEvC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE;gBAC9D,8BAA8B,EAAE,CAAC;aAClC,CAAC,CAAA;YAEF,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG;gBAAE,SAAQ;YAEtC,KAAK,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;gBACrD,MAAM,SAAS,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;gBAClE,MAAM,WAAW,GAAG,SAAS,IAAI,EAAE,CAAC,CAAC,CAAE,EAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;gBAE9E,MAAM,MAAM,GACV,SAAS,KAAK,2BAAe,CAAC,QAAQ,EAAE;oBACxC,SAAS,KAAK,6CAA6C;oBAC3D,WAAW,KAAK,UAAU,CAAA;gBAE5B,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,QAAQ,GAAG,EAAE,CAAA;oBAEjB,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;wBACnB,QAAQ,GAAG,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;oBAClF,CAAC;yBAAM,IAAI,MAAM,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACvD,IAAI,CAAC;4BACH,MAAM,IAAI,GAAG,wDAAa,MAAM,GAAC,CAAA;4BACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;4BAC5C,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;wBAC9C,CAAC;wBAAC,MAAM,CAAC;4BACP,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAA;wBACpB,CAAC;oBACH,CAAC;oBAED,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;wBAChC,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,SAAS,CAAA;wBACrF,QAAQ,CAAC,IAAI,CAAC;4BACZ,SAAS,EAAE,GAAG,CAAC,SAAS;4BACxB,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;4BACrB,MAAM;4BACN,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;yBAC9B,CAAC,CAAA;wBACF,MAAK;oBACP,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAA;AAC7C,CAAC,CAAA;AAtEY,QAAA,WAAW,eAsEvB;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,gDAAgD;AAChD,MAAM,iBAAiB,GAAG,GAAG,CAAA,CAAC,eAAe;AAC7C,MAAM,WAAW,GAAG,IAAI,CAAA,CAAC,MAAM;AAC/B,MAAM,yBAAyB,GAAG,IAAI,CAAA,CAAC,MAAM;AAC7C,MAAM,qBAAqB,GAAG,IAAI,CAAA,CAAC,MAAM;AAEzC;;;;;GAKG;AACI,MAAM,cAAc,GAAG,KAAK,EACjC,UAAsB,EACtB,OAAe,EACO,EAAE;IACxB,MAAM,IAAI,GAAG,IAAI,mBAAS,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,KAAK,GAAG,IAAI,mBAAU,CAAC,2BAAqB,CAAC,CAAA;IAEnD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAA;IAE9D,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAA;IAC5C,IAAI,CAAC,YAAY,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAE5F,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAE1E,8DAA8D;IAC9D,MAAM,CAAC,kBAAkB,CAAC,GAAG,IAAA,+BAAqB,EAAC,IAAI,CAAC,CAAA;IACxD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAA;IAErE,uDAAuD;IACvD,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,IAAI,YAAY,GAAG,CAAC,CAAA;IAEpB,IAAI,CAAC;QACH,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QAC5E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,sBAAU,EAAE;YAC/D,OAAO,EAAE;gBACP,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE;gBACtE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,oBAAoB;aAC7E;YACD,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,sCAAsC;SACvF,CAAC,CAAA;QAEF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,0DAA0D;gBAC1D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;gBACpD,IAAI,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,WAAW,EAAE,CAAA;oBACb,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,OAAO;QACL,iBAAiB,EAAE,iBAAiB;QACpC,WAAW,EAAE,WAAW;QACxB,yBAAyB,EAAE,yBAAyB;QACpD,qBAAqB,EAAE,qBAAqB;QAC5C,cAAc,EAAE,YAAY;QAC5B,YAAY,EAAE,WAAW;QACzB,sBAAsB,EAAE,WAAW;KACpC,CAAA;AACH,CAAC,CAAA;AA1DY,QAAA,cAAc,kBA0D1B;AAED;;;;;GAKG;AACI,MAAM,eAAe,GAAG,KAAK,EAClC,UAAsB,EACtB,OAAe,EACf,SAAiB,EACU,EAAE;IAC7B,MAAM,IAAI,GAAG,IAAI,mBAAS,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,IAAI,mBAAS,CAAC,SAAS,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,IAAI,mBAAU,CAAC,2BAAqB,CAAC,CAAA;IAEnD,MAAM,CAAC,eAAe,CAAC,GAAG,IAAA,4BAAkB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC1D,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;IAEpE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;YACL,iBAAiB,EAAE,CAAC;YACpB,eAAe,EAAE,CAAC;YAClB,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,CAAC;YACb,oBAAoB,EAAE,CAAC;YACvB,eAAe,EAAE,CAAC;YAClB,MAAM,EAAE,MAAM;SACf,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,CAA4B,CAAA;IAE/F,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAA;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAA;IACzD,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAErC,+CAA+C;IAC/C,IAAI,kBAAkB,GAAG,CAAC,CAAA;IAC1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,qCAA2B,EAAC,IAAI,CAAC,CAAA;QACjD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACjD,UAAU,CAAC,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC;YACtD,UAAU,CAAC,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC;SACvD,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACpD,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAEpD,kDAAkD;QAClD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,gCAAgC;YAChC,MAAM,WAAW,GAAG,YAAY,CAAA;YAChC,MAAM,aAAa,GAAG,YAAY,CAAA;YAClC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,kBAAkB,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,aAAa,CAAA;YACjE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,gCAAgC;YAChC,MAAM,WAAW,GAAG,YAAY,CAAA;YAChC,MAAM,aAAa,GAAG,YAAY,CAAA;YAClC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,kBAAkB,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,aAAa,CAAA;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;IAED,MAAM,aAAa,GACjB,kBAAkB,GAAG,CAAC;QACpB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,kBAAkB,CAAC,GAAG,KAAK,CAAC;QACtD,CAAC,CAAC,SAAS,GAAG,CAAC;YACb,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,CAAC,CAAA;IAET,IAAI,MAAkC,CAAA;IACtC,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,MAAM,CAAA;IACjB,CAAC;SAAM,IAAI,aAAa,IAAI,yBAAyB,EAAE,CAAC;QACtD,MAAM,GAAG,cAAc,CAAA;IACzB,CAAC;SAAM,IAAI,aAAa,IAAI,WAAW,EAAE,CAAC;QACxC,MAAM,GAAG,SAAS,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,SAAS,CAAA;IACpB,CAAC;IAED,OAAO;QACL,iBAAiB,EAAE,UAAU;QAC7B,eAAe,EAAE,QAAQ;QACzB,gBAAgB,EAAE,QAAQ;QAC1B,UAAU,EAAE,SAAS;QACrB,oBAAoB,EAAE,kBAAkB;QACxC,eAAe,EAAE,aAAa;QAC9B,MAAM;KACP,CAAA;AACH,CAAC,CAAA;AA1FY,QAAA,eAAe,mBA0F3B"}