@hobba-io/core 0.1.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.
Files changed (190) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +87 -0
  3. package/dist/amountUtils.d.ts +15 -0
  4. package/dist/amountUtils.d.ts.map +1 -0
  5. package/dist/amountUtils.js +59 -0
  6. package/dist/amountUtils.js.map +1 -0
  7. package/dist/constants.d.ts +148 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +231 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/errors.d.ts +7 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +29 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/executeAction.d.ts +36 -0
  16. package/dist/executeAction.d.ts.map +1 -0
  17. package/dist/executeAction.js +606 -0
  18. package/dist/executeAction.js.map +1 -0
  19. package/dist/executeDepositBorrow.d.ts +49 -0
  20. package/dist/executeDepositBorrow.d.ts.map +1 -0
  21. package/dist/executeDepositBorrow.js +444 -0
  22. package/dist/executeDepositBorrow.js.map +1 -0
  23. package/dist/idl/hobba.json +5072 -0
  24. package/dist/idl.d.ts +783 -0
  25. package/dist/idl.d.ts.map +1 -0
  26. package/dist/idl.js +7 -0
  27. package/dist/idl.js.map +1 -0
  28. package/dist/index.d.ts +17 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +22 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/juplend/accountResolvers.d.ts +106 -0
  33. package/dist/juplend/accountResolvers.d.ts.map +1 -0
  34. package/dist/juplend/accountResolvers.js +148 -0
  35. package/dist/juplend/accountResolvers.js.map +1 -0
  36. package/dist/juplend/operateRemaining.d.ts +11 -0
  37. package/dist/juplend/operateRemaining.d.ts.map +1 -0
  38. package/dist/juplend/operateRemaining.js +46 -0
  39. package/dist/juplend/operateRemaining.js.map +1 -0
  40. package/dist/juplend/positionInit.d.ts +34 -0
  41. package/dist/juplend/positionInit.d.ts.map +1 -0
  42. package/dist/juplend/positionInit.js +56 -0
  43. package/dist/juplend/positionInit.js.map +1 -0
  44. package/dist/juplend/positionParser.d.ts +8 -0
  45. package/dist/juplend/positionParser.d.ts.map +1 -0
  46. package/dist/juplend/positionParser.js +30 -0
  47. package/dist/juplend/positionParser.js.map +1 -0
  48. package/dist/juplend/sdkApi.d.ts +39 -0
  49. package/dist/juplend/sdkApi.d.ts.map +1 -0
  50. package/dist/juplend/sdkApi.js +68 -0
  51. package/dist/juplend/sdkApi.js.map +1 -0
  52. package/dist/juplend/tickMath.d.ts +19 -0
  53. package/dist/juplend/tickMath.d.ts.map +1 -0
  54. package/dist/juplend/tickMath.js +91 -0
  55. package/dist/juplend/tickMath.js.map +1 -0
  56. package/dist/juplend/tickUtils.d.ts +20 -0
  57. package/dist/juplend/tickUtils.d.ts.map +1 -0
  58. package/dist/juplend/tickUtils.js +115 -0
  59. package/dist/juplend/tickUtils.js.map +1 -0
  60. package/dist/juplend/vaultConfigParser.d.ts +25 -0
  61. package/dist/juplend/vaultConfigParser.d.ts.map +1 -0
  62. package/dist/juplend/vaultConfigParser.js +38 -0
  63. package/dist/juplend/vaultConfigParser.js.map +1 -0
  64. package/dist/kamino/accountResolvers.d.ts +110 -0
  65. package/dist/kamino/accountResolvers.d.ts.map +1 -0
  66. package/dist/kamino/accountResolvers.js +220 -0
  67. package/dist/kamino/accountResolvers.js.map +1 -0
  68. package/dist/kamino/obligationParser.d.ts +13 -0
  69. package/dist/kamino/obligationParser.d.ts.map +1 -0
  70. package/dist/kamino/obligationParser.js +92 -0
  71. package/dist/kamino/obligationParser.js.map +1 -0
  72. package/dist/kamino/refreshInstructions.d.ts +4 -0
  73. package/dist/kamino/refreshInstructions.d.ts.map +1 -0
  74. package/dist/kamino/refreshInstructions.js +32 -0
  75. package/dist/kamino/refreshInstructions.js.map +1 -0
  76. package/dist/limits.d.ts +87 -0
  77. package/dist/limits.d.ts.map +1 -0
  78. package/dist/limits.js +174 -0
  79. package/dist/limits.js.map +1 -0
  80. package/dist/marketConfig.d.ts +35 -0
  81. package/dist/marketConfig.d.ts.map +1 -0
  82. package/dist/marketConfig.js +85 -0
  83. package/dist/marketConfig.js.map +1 -0
  84. package/dist/oracle/scopePrice.d.ts +7 -0
  85. package/dist/oracle/scopePrice.d.ts.map +1 -0
  86. package/dist/oracle/scopePrice.js +31 -0
  87. package/dist/oracle/scopePrice.js.map +1 -0
  88. package/dist/pdas.d.ts +33 -0
  89. package/dist/pdas.d.ts.map +1 -0
  90. package/dist/pdas.js +116 -0
  91. package/dist/pdas.js.map +1 -0
  92. package/dist/position.d.ts +45 -0
  93. package/dist/position.d.ts.map +1 -0
  94. package/dist/position.js +68 -0
  95. package/dist/position.js.map +1 -0
  96. package/dist/positionMetrics.d.ts +108 -0
  97. package/dist/positionMetrics.d.ts.map +1 -0
  98. package/dist/positionMetrics.js +238 -0
  99. package/dist/positionMetrics.js.map +1 -0
  100. package/dist/program.d.ts +12 -0
  101. package/dist/program.d.ts.map +1 -0
  102. package/dist/program.js +24 -0
  103. package/dist/program.js.map +1 -0
  104. package/dist/quote.d.ts +90 -0
  105. package/dist/quote.d.ts.map +1 -0
  106. package/dist/quote.js +198 -0
  107. package/dist/quote.js.map +1 -0
  108. package/dist/rates/borrowRates.d.ts +44 -0
  109. package/dist/rates/borrowRates.d.ts.map +1 -0
  110. package/dist/rates/borrowRates.js +229 -0
  111. package/dist/rates/borrowRates.js.map +1 -0
  112. package/dist/rates/collateralInfo.d.ts +21 -0
  113. package/dist/rates/collateralInfo.d.ts.map +1 -0
  114. package/dist/rates/collateralInfo.js +104 -0
  115. package/dist/rates/collateralInfo.js.map +1 -0
  116. package/dist/rates/constants.d.ts +22 -0
  117. package/dist/rates/constants.d.ts.map +1 -0
  118. package/dist/rates/constants.js +70 -0
  119. package/dist/rates/constants.js.map +1 -0
  120. package/dist/rates/index.d.ts +11 -0
  121. package/dist/rates/index.d.ts.map +1 -0
  122. package/dist/rates/index.js +11 -0
  123. package/dist/rates/index.js.map +1 -0
  124. package/dist/rates/kaminoApi.d.ts +24 -0
  125. package/dist/rates/kaminoApi.d.ts.map +1 -0
  126. package/dist/rates/kaminoApi.js +98 -0
  127. package/dist/rates/kaminoApi.js.map +1 -0
  128. package/dist/rates/supplyRates.d.ts +23 -0
  129. package/dist/rates/supplyRates.d.ts.map +1 -0
  130. package/dist/rates/supplyRates.js +67 -0
  131. package/dist/rates/supplyRates.js.map +1 -0
  132. package/dist/transactionBuilder.d.ts +5 -0
  133. package/dist/transactionBuilder.d.ts.map +1 -0
  134. package/dist/transactionBuilder.js +287 -0
  135. package/dist/transactionBuilder.js.map +1 -0
  136. package/dist/txHelpers.d.ts +16 -0
  137. package/dist/txHelpers.d.ts.map +1 -0
  138. package/dist/txHelpers.js +82 -0
  139. package/dist/txHelpers.js.map +1 -0
  140. package/dist/userState.d.ts +21 -0
  141. package/dist/userState.d.ts.map +1 -0
  142. package/dist/userState.js +60 -0
  143. package/dist/userState.js.map +1 -0
  144. package/dist/vault/vaultAccounts.d.ts +82 -0
  145. package/dist/vault/vaultAccounts.d.ts.map +1 -0
  146. package/dist/vault/vaultAccounts.js +275 -0
  147. package/dist/vault/vaultAccounts.js.map +1 -0
  148. package/dist/wallet.d.ts +12 -0
  149. package/dist/wallet.d.ts.map +1 -0
  150. package/dist/wallet.js +2 -0
  151. package/dist/wallet.js.map +1 -0
  152. package/package.json +63 -0
  153. package/src/amountUtils.ts +69 -0
  154. package/src/constants.ts +263 -0
  155. package/src/errors.ts +33 -0
  156. package/src/executeAction.ts +884 -0
  157. package/src/executeDepositBorrow.ts +677 -0
  158. package/src/idl/hobba.json +5072 -0
  159. package/src/idl.ts +7 -0
  160. package/src/index.ts +21 -0
  161. package/src/juplend/accountResolvers.ts +207 -0
  162. package/src/juplend/operateRemaining.ts +81 -0
  163. package/src/juplend/positionInit.ts +86 -0
  164. package/src/juplend/positionParser.ts +41 -0
  165. package/src/juplend/sdkApi.ts +112 -0
  166. package/src/juplend/tickMath.ts +82 -0
  167. package/src/juplend/tickUtils.ts +163 -0
  168. package/src/juplend/vaultConfigParser.ts +45 -0
  169. package/src/kamino/accountResolvers.ts +299 -0
  170. package/src/kamino/obligationParser.ts +123 -0
  171. package/src/kamino/refreshInstructions.ts +45 -0
  172. package/src/limits.ts +222 -0
  173. package/src/marketConfig.ts +139 -0
  174. package/src/oracle/scopePrice.ts +31 -0
  175. package/src/pdas.ts +226 -0
  176. package/src/position.ts +131 -0
  177. package/src/positionMetrics.ts +387 -0
  178. package/src/program.ts +30 -0
  179. package/src/quote.ts +310 -0
  180. package/src/rates/borrowRates.ts +270 -0
  181. package/src/rates/collateralInfo.ts +136 -0
  182. package/src/rates/constants.ts +87 -0
  183. package/src/rates/index.ts +38 -0
  184. package/src/rates/kaminoApi.ts +134 -0
  185. package/src/rates/supplyRates.ts +102 -0
  186. package/src/transactionBuilder.ts +324 -0
  187. package/src/txHelpers.ts +107 -0
  188. package/src/userState.ts +91 -0
  189. package/src/vault/vaultAccounts.ts +365 -0
  190. package/src/wallet.ts +12 -0
@@ -0,0 +1,68 @@
1
+ import { PublicKey, TransactionInstruction, SystemProgram } from "@solana/web3.js";
2
+ import { ATA_PROGRAM_ID } from "../constants";
3
+ export async function fetchOperateContext(params, apiBaseUrl = "") {
4
+ const base = apiBaseUrl.replace(/\/+$/, "");
5
+ const resp = await fetch(`${base}/api/juplend-operate`, {
6
+ method: "POST",
7
+ headers: { "Content-Type": "application/json" },
8
+ body: JSON.stringify(params),
9
+ });
10
+ if (!resp.ok) {
11
+ const errData = await resp.json().catch(() => ({ error: "SDK API failed" }));
12
+ throw new Error(errData.error || `SDK API returned ${resp.status}`);
13
+ }
14
+ return resp.json();
15
+ }
16
+ // Deserialize SDK remaining accounts into AccountMeta[]
17
+ // The API returns 27 fixed entries; caller adds ATA_PROGRAM + SystemProgram, then variable remaining
18
+ export function deserializeRemaining(sdkResp) {
19
+ const fixed = sdkResp.remaining.map((a) => ({
20
+ pubkey: new PublicKey(a.pubkey),
21
+ isSigner: false,
22
+ isWritable: a.writable,
23
+ }));
24
+ fixed.push({ pubkey: ATA_PROGRAM_ID, isSigner: false, isWritable: false });
25
+ fixed.push({ pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
26
+ const variable = sdkResp.variableRemaining.map((a) => ({
27
+ pubkey: new PublicKey(a.pubkey),
28
+ isSigner: false,
29
+ isWritable: a.writable,
30
+ }));
31
+ return [...fixed, ...variable];
32
+ }
33
+ // Known JupLend instruction discriminators that the deployed program supports
34
+ const KNOWN_JUPLEND_DISCS = new Set([
35
+ "160d3e8d4959b21d", // InitTick
36
+ "386e79a998f156b7", // InitTickIdLiquidation
37
+ ]);
38
+ const JUPLEND_PROGRAM_STR = "jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi";
39
+ // Deserialize otherIxs (initTick, initBranch, etc.) and replace signerPda with actual payer.
40
+ // Filters out unrecognized JupLend instructions that cause InstructionFallbackNotFound.
41
+ export function deserializeOtherIxs(sdkResp, signerPda, actualPayer) {
42
+ const signerStr = signerPda.toBase58();
43
+ return sdkResp.otherIxs
44
+ .filter((ix) => {
45
+ // Keep non-JupLend instructions as-is
46
+ if (ix.programId !== JUPLEND_PROGRAM_STR)
47
+ return true;
48
+ // Log ALL JupLend instruction discriminators for debugging
49
+ const disc = Buffer.from(ix.data, "base64").subarray(0, 8).toString("hex");
50
+ console.log("[otherIxs] JupLend instruction disc:", disc, KNOWN_JUPLEND_DISCS.has(disc) ? "(known)" : "(UNKNOWN — filtering out)");
51
+ if (!KNOWN_JUPLEND_DISCS.has(disc))
52
+ return false;
53
+ return true;
54
+ })
55
+ .map((ix) => new TransactionInstruction({
56
+ programId: new PublicKey(ix.programId),
57
+ keys: ix.keys.map((k) => {
58
+ const isSigner = k.pubkey === signerStr;
59
+ return {
60
+ pubkey: isSigner ? actualPayer : new PublicKey(k.pubkey),
61
+ isSigner: isSigner ? true : k.isSigner,
62
+ isWritable: k.isWritable,
63
+ };
64
+ }),
65
+ data: Buffer.from(ix.data, "base64"),
66
+ }));
67
+ }
68
+ //# sourceMappingURL=sdkApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkApi.js","sourceRoot":"","sources":["../../src/juplend/sdkApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * JupLend tick ↔ debt fixed-point math (ported from the JupLend SDK).
3
+ * Pure BN math, browser-safe; shared by /api/juplend-position and any
4
+ * script that needs debt-from-tick without an RPC tick fetch.
5
+ */
6
+ import BN from "bn.js";
7
+ export declare const JUPLEND_MIN_TICK = -16383;
8
+ export declare const JUPLEND_MAX_TICK_VALUE = 16383;
9
+ /**
10
+ * Tick ratio as an X48 fixed-point BN (scaled by 2^48).
11
+ * debtRaw = ratioX48 * (colRaw + 1) >> 48 + 1
12
+ */
13
+ export declare function getRatioAtTick(tick: number): BN;
14
+ /**
15
+ * Debt (in borrow shares) implied by a position's tick and collateral shares.
16
+ * Returns 0 at/below MIN_TICK (no debt).
17
+ */
18
+ export declare function debtFromTick(colRaw: BN, tick: number): BN;
19
+ //# sourceMappingURL=tickMath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickMath.d.ts","sourceRoot":"","sources":["../../src/juplend/tickMath.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvB,eAAO,MAAM,gBAAgB,SAAS,CAAC;AACvC,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,EAAE,CAyD/C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,EAAE,CAIzD"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * JupLend tick ↔ debt fixed-point math (ported from the JupLend SDK).
3
+ * Pure BN math, browser-safe; shared by /api/juplend-position and any
4
+ * script that needs debt-from-tick without an RPC tick fetch.
5
+ */
6
+ import BN from "bn.js";
7
+ export const JUPLEND_MIN_TICK = -16383;
8
+ export const JUPLEND_MAX_TICK_VALUE = 16383;
9
+ /**
10
+ * Tick ratio as an X48 fixed-point BN (scaled by 2^48).
11
+ * debtRaw = ratioX48 * (colRaw + 1) >> 48 + 1
12
+ */
13
+ export function getRatioAtTick(tick) {
14
+ if (tick < JUPLEND_MIN_TICK || tick > JUPLEND_MAX_TICK_VALUE) {
15
+ throw new Error(`Tick ${tick} out of range [${JUPLEND_MIN_TICK}, ${JUPLEND_MAX_TICK_VALUE}]`);
16
+ }
17
+ const FACTORS = [
18
+ new BN("18446744073709551616"), // FACTOR00 = 2^64
19
+ new BN("18419115400608638658"),
20
+ new BN("18391528108445969703"),
21
+ new BN("18336477419114433396"),
22
+ new BN("18226869890870665593"),
23
+ new BN("18009616477100071088"),
24
+ new BN("17582847377087825313"),
25
+ new BN("16759408633341240198"),
26
+ new BN("15226414841393184936"),
27
+ new BN("12568272644527235157"),
28
+ new BN("8563108841104354677"),
29
+ new BN("3975055583337633975"),
30
+ new BN("856577552520149366"),
31
+ new BN("39775317560084773"),
32
+ new BN("85764505686420"),
33
+ new BN("398745188"),
34
+ ];
35
+ function mulShift64(n0, n1) {
36
+ const product = n0.mul(n1);
37
+ return product.shrn(64);
38
+ }
39
+ const absTick = Math.abs(tick);
40
+ let factor = FACTORS[0];
41
+ if (absTick & 1)
42
+ factor = FACTORS[1];
43
+ if (absTick & 2)
44
+ factor = mulShift64(factor, FACTORS[2]);
45
+ if (absTick & 4)
46
+ factor = mulShift64(factor, FACTORS[3]);
47
+ if (absTick & 8)
48
+ factor = mulShift64(factor, FACTORS[4]);
49
+ if (absTick & 16)
50
+ factor = mulShift64(factor, FACTORS[5]);
51
+ if (absTick & 32)
52
+ factor = mulShift64(factor, FACTORS[6]);
53
+ if (absTick & 64)
54
+ factor = mulShift64(factor, FACTORS[7]);
55
+ if (absTick & 128)
56
+ factor = mulShift64(factor, FACTORS[8]);
57
+ if (absTick & 256)
58
+ factor = mulShift64(factor, FACTORS[9]);
59
+ if (absTick & 512)
60
+ factor = mulShift64(factor, FACTORS[10]);
61
+ if (absTick & 1024)
62
+ factor = mulShift64(factor, FACTORS[11]);
63
+ if (absTick & 2048)
64
+ factor = mulShift64(factor, FACTORS[12]);
65
+ if (absTick & 4096)
66
+ factor = mulShift64(factor, FACTORS[13]);
67
+ if (absTick & 8192)
68
+ factor = mulShift64(factor, FACTORS[14]);
69
+ if (absTick & 16384)
70
+ factor = mulShift64(factor, FACTORS[15]);
71
+ let precision = new BN(0);
72
+ if (tick > 0) {
73
+ const maxU128 = new BN(2).pow(new BN(128)).subn(1);
74
+ factor = maxU128.div(factor);
75
+ if (!factor.mod(new BN(65536)).isZero()) {
76
+ precision = new BN(1);
77
+ }
78
+ }
79
+ return factor.shrn(16).add(precision);
80
+ }
81
+ /**
82
+ * Debt (in borrow shares) implied by a position's tick and collateral shares.
83
+ * Returns 0 at/below MIN_TICK (no debt).
84
+ */
85
+ export function debtFromTick(colRaw, tick) {
86
+ if (tick <= JUPLEND_MIN_TICK)
87
+ return new BN(0);
88
+ const ratio = getRatioAtTick(tick);
89
+ return ratio.mul(colRaw.addn(1)).shrn(48).addn(1);
90
+ }
91
+ //# sourceMappingURL=tickMath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickMath.js","sourceRoot":"","sources":["../../src/juplend/tickMath.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Connection, PublicKey, TransactionInstruction } from "@solana/web3.js";
2
+ export declare function buildInitTickIx(vaultId: number, tick: number, payer: PublicKey): TransactionInstruction;
3
+ export declare function buildInitTickIdLiquidationIx(vaultId: number, tick: number, totalIds: number, payer: PublicKey): TransactionInstruction;
4
+ /**
5
+ * Reverse-derive a tick value from its PDA. Searches outward from `startTick`
6
+ * (usually the position's current tick, < 50 iterations) before falling back
7
+ * to the full ±16383 range.
8
+ */
9
+ export declare function tickValueFromPda(pda: PublicKey, vaultId: number, startTick?: number, maxTick?: number): number | null;
10
+ export interface TickAccounts {
11
+ currentTickPda: PublicKey;
12
+ finalTickPda: PublicKey;
13
+ currentTickIdPda: PublicKey;
14
+ finalTickIdPda: PublicKey;
15
+ initIxs: TransactionInstruction[];
16
+ }
17
+ export declare function resolveTickAccounts(connection: Connection, payer: PublicKey, currentTick: number, finalTick: number, vaultId?: number): Promise<TickAccounts>;
18
+ export declare function parseTickMismatch(errorMsg: string): number | null;
19
+ export declare function isTickError(errorMsg: string): boolean;
20
+ //# sourceMappingURL=tickUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickUtils.d.ts","sourceRoot":"","sources":["../../src/juplend/tickUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EAET,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAgBzB,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,GACf,sBAAsB,CAiBxB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,GACf,sBAAsB,CAqBxB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAU,EACrB,OAAO,GAAE,MAAc,GACtB,MAAM,GAAG,IAAI,CAYf;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,SAAS,CAAC;IAC1B,YAAY,EAAE,SAAS,CAAC;IACxB,gBAAgB,EAAE,SAAS,CAAC;IAC5B,cAAc,EAAE,SAAS,CAAC;IAC1B,OAAO,EAAE,sBAAsB,EAAE,CAAC;CACnC;AAGD,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAAyB,GACjC,OAAO,CAAC,YAAY,CAAC,CA+BvB;AAGD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGjE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAYrD"}
@@ -0,0 +1,115 @@
1
+ import { SystemProgram, TransactionInstruction, } from "@solana/web3.js";
2
+ import { JUPLEND_PROGRAM, JUPLEND_VAULT_ID, deriveJuplendVaultConfigPda, } from "../constants";
3
+ import { deriveJuplendTickPda, deriveJuplendTickIdLiquidationPda, } from "../pdas";
4
+ // InitTick discriminator: [22, 13, 62, 141, 73, 89, 178, 29]
5
+ const INIT_TICK_DISC = Buffer.from([22, 13, 62, 141, 73, 89, 178, 29]);
6
+ // InitTickIdLiquidation discriminator: [221, 173, 234, 108, 69, 217, 237, 101]
7
+ const INIT_TICK_ID_LIQ_DISC = Buffer.from([221, 173, 234, 108, 69, 217, 237, 101]);
8
+ export function buildInitTickIx(vaultId, tick, payer) {
9
+ const tickPda = deriveJuplendTickPda(vaultId, tick);
10
+ const vaultConfig = deriveJuplendVaultConfigPda(vaultId);
11
+ const data = Buffer.alloc(14);
12
+ data.set(INIT_TICK_DISC, 0);
13
+ data.writeUInt16LE(vaultId, 8);
14
+ data.writeInt32LE(tick, 10);
15
+ return new TransactionInstruction({
16
+ programId: JUPLEND_PROGRAM,
17
+ keys: [
18
+ { pubkey: payer, isSigner: true, isWritable: true },
19
+ { pubkey: vaultConfig, isSigner: false, isWritable: false },
20
+ { pubkey: tickPda, isSigner: false, isWritable: true },
21
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
22
+ ],
23
+ data,
24
+ });
25
+ }
26
+ export function buildInitTickIdLiquidationIx(vaultId, tick, totalIds, payer) {
27
+ const tickPda = deriveJuplendTickPda(vaultId, tick);
28
+ const tickIdPda = deriveJuplendTickIdLiquidationPda(vaultId, tick, totalIds);
29
+ const data = Buffer.alloc(18);
30
+ data.set(INIT_TICK_ID_LIQ_DISC, 0);
31
+ data.writeUInt16LE(vaultId, 8);
32
+ data.writeInt32LE(tick, 10);
33
+ data.writeUInt32LE(totalIds, 14);
34
+ // initTickIdLiquidation: [signer, tickData (existing), tickIdLiquidation (new), systemProgram]
35
+ // Slot 1 is tickData (NOT vaultConfig — initTick is the sibling that uses
36
+ // vaultConfig). Matches the production /api/juplend-operate builder.
37
+ return new TransactionInstruction({
38
+ programId: JUPLEND_PROGRAM,
39
+ keys: [
40
+ { pubkey: payer, isSigner: true, isWritable: true },
41
+ { pubkey: tickPda, isSigner: false, isWritable: false },
42
+ { pubkey: tickIdPda, isSigner: false, isWritable: true },
43
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
44
+ ],
45
+ data,
46
+ });
47
+ }
48
+ /**
49
+ * Reverse-derive a tick value from its PDA. Searches outward from `startTick`
50
+ * (usually the position's current tick, < 50 iterations) before falling back
51
+ * to the full ±16383 range.
52
+ */
53
+ export function tickValueFromPda(pda, vaultId, startTick = 0, maxTick = 16383) {
54
+ for (let delta = 0; delta <= 1000; delta++) {
55
+ for (const tick of delta === 0 ? [startTick] : [startTick + delta, startTick - delta]) {
56
+ if (tick < -maxTick || tick > maxTick)
57
+ continue;
58
+ if (deriveJuplendTickPda(vaultId, tick).equals(pda))
59
+ return tick;
60
+ }
61
+ }
62
+ // Fallback: full range (should rarely hit this)
63
+ for (let tick = -maxTick; tick <= maxTick; tick++) {
64
+ if (deriveJuplendTickPda(vaultId, tick).equals(pda))
65
+ return tick;
66
+ }
67
+ return null;
68
+ }
69
+ // Derive tick + tickId PDAs for current and final ticks, check existence, return init instructions
70
+ export async function resolveTickAccounts(connection, payer, currentTick, finalTick, vaultId = JUPLEND_VAULT_ID) {
71
+ const currentTickPda = deriveJuplendTickPda(vaultId, currentTick);
72
+ const currentTickIdPda = deriveJuplendTickIdLiquidationPda(vaultId, currentTick);
73
+ const finalTickPda = deriveJuplendTickPda(vaultId, finalTick);
74
+ const finalTickIdPda = deriveJuplendTickIdLiquidationPda(vaultId, finalTick);
75
+ const initIxs = [];
76
+ const checked = new Set();
77
+ for (const { tickPda, tickIdPda, tick } of [
78
+ { tickPda: currentTickPda, tickIdPda: currentTickIdPda, tick: currentTick },
79
+ { tickPda: finalTickPda, tickIdPda: finalTickIdPda, tick: finalTick },
80
+ ]) {
81
+ const key = tickPda.toBase58();
82
+ if (checked.has(key))
83
+ continue;
84
+ checked.add(key);
85
+ const [tickInfo, tickIdInfo] = await Promise.all([
86
+ connection.getAccountInfo(tickPda).catch(() => null),
87
+ connection.getAccountInfo(tickIdPda).catch(() => null),
88
+ ]);
89
+ if (!tickInfo) {
90
+ initIxs.push(buildInitTickIx(vaultId, tick, payer));
91
+ }
92
+ if (!tickIdInfo) {
93
+ initIxs.push(buildInitTickIdLiquidationIx(vaultId, tick, 0, payer));
94
+ }
95
+ }
96
+ return { currentTickPda, finalTickPda, currentTickIdPda, finalTickIdPda, initIxs };
97
+ }
98
+ // Parse expected tick from VaultTickMismatch error
99
+ export function parseTickMismatch(errorMsg) {
100
+ const match = errorMsg.match(/Tick mismatch: expected (-?\d+) but got (-?\d+)/);
101
+ return match ? parseInt(match[1]) : null;
102
+ }
103
+ export function isTickError(errorMsg) {
104
+ return (errorMsg.includes("VaultTickMismatch") ||
105
+ errorMsg.includes("Tick mismatch") ||
106
+ errorMsg.includes("VaultInvalidTick") ||
107
+ errorMsg.includes("VAULT_INVALID_TICK") ||
108
+ errorMsg.includes("VaultTickHasDebtNotFound") ||
109
+ errorMsg.includes("VAULT_TICK_HAS_DEBT_NOT_FOUND") ||
110
+ errorMsg.includes("0x1792") || // VaultTickMismatch
111
+ errorMsg.includes("0x179a") || // VaultInvalidTick
112
+ errorMsg.includes("0x1791") // VaultTickHasDebtNotFound
113
+ );
114
+ }
115
+ //# sourceMappingURL=tickUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickUtils.js","sourceRoot":"","sources":["../../src/juplend/tickUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * JupLend VaultConfig byte-layout knowledge, centralized. Browser-safe.
3
+ * (The LTV/liquidation-threshold fields at the head of the same struct are
4
+ * decoded by rates/borrowRates.getJuplendCollateralLtvInfo.)
5
+ */
6
+ import { PublicKey } from "@solana/web3.js";
7
+ import BN from "bn.js";
8
+ /**
9
+ * VaultConfig is bytemuck-packed; `oracle` lives 26 bytes after the 8-byte
10
+ * Anchor discriminator (sum of the preceding 9× u16 / i16 fields).
11
+ */
12
+ export declare const JUPLEND_VAULT_CONFIG_ORACLE_OFFSET: number;
13
+ /** Oracle pubkey configured on a JupLend vault_config account. */
14
+ export declare function parseVaultConfigOracle(vaultConfigData: Buffer): PublicKey;
15
+ /** Supply token decimals per vault (determines exchange rate divisor). */
16
+ export declare const SUPPLY_DECIMALS_BY_VAULT: Record<number, number>;
17
+ /**
18
+ * Convert JupLend shares to native token base units. Exchange prices are
19
+ * scaled by 10^12; the divisor folds in the token-decimal difference vs SOL:
20
+ * SOL (9 decimals): 10^(12 + 0) = 10^12
21
+ * cbBTC (8 decimals): 10^(12 + 1) = 10^13
22
+ * USDC (6 decimals): 10^(12 + 3) = 10^15
23
+ */
24
+ export declare function sharesToBaseUnits(shares: BN, exchangePrice: BN, tokenDecimals: number): BN;
25
+ //# sourceMappingURL=vaultConfigParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vaultConfigParser.d.ts","sourceRoot":"","sources":["../../src/juplend/vaultConfigParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvB;;;GAGG;AACH,eAAO,MAAM,kCAAkC,QAAY,CAAC;AAE5D,kEAAkE;AAClE,wBAAgB,sBAAsB,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAUzE;AAED,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG3D,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,EAAE,CAI1F"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * JupLend VaultConfig byte-layout knowledge, centralized. Browser-safe.
3
+ * (The LTV/liquidation-threshold fields at the head of the same struct are
4
+ * decoded by rates/borrowRates.getJuplendCollateralLtvInfo.)
5
+ */
6
+ import { PublicKey } from "@solana/web3.js";
7
+ import BN from "bn.js";
8
+ /**
9
+ * VaultConfig is bytemuck-packed; `oracle` lives 26 bytes after the 8-byte
10
+ * Anchor discriminator (sum of the preceding 9× u16 / i16 fields).
11
+ */
12
+ export const JUPLEND_VAULT_CONFIG_ORACLE_OFFSET = 8 + 2 * 9;
13
+ /** Oracle pubkey configured on a JupLend vault_config account. */
14
+ export function parseVaultConfigOracle(vaultConfigData) {
15
+ if (vaultConfigData.length < JUPLEND_VAULT_CONFIG_ORACLE_OFFSET + 32) {
16
+ throw new Error("vault_config account too short");
17
+ }
18
+ return new PublicKey(vaultConfigData.subarray(JUPLEND_VAULT_CONFIG_ORACLE_OFFSET, JUPLEND_VAULT_CONFIG_ORACLE_OFFSET + 32));
19
+ }
20
+ /** Supply token decimals per vault (determines exchange rate divisor). */
21
+ export const SUPPLY_DECIMALS_BY_VAULT = {
22
+ 1: 9, // SOL (wSOL) — 9 decimals
23
+ 11: 8, // cbBTC — 8 decimals
24
+ };
25
+ /**
26
+ * Convert JupLend shares to native token base units. Exchange prices are
27
+ * scaled by 10^12; the divisor folds in the token-decimal difference vs SOL:
28
+ * SOL (9 decimals): 10^(12 + 0) = 10^12
29
+ * cbBTC (8 decimals): 10^(12 + 1) = 10^13
30
+ * USDC (6 decimals): 10^(12 + 3) = 10^15
31
+ */
32
+ export function sharesToBaseUnits(shares, exchangePrice, tokenDecimals) {
33
+ if (!exchangePrice.gt(new BN(0)))
34
+ return new BN(0);
35
+ const divisor = new BN(10).pow(new BN(12 + (9 - tokenDecimals)));
36
+ return shares.mul(exchangePrice).div(divisor);
37
+ }
38
+ //# sourceMappingURL=vaultConfigParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vaultConfigParser.js","sourceRoot":"","sources":["../../src/juplend/vaultConfigParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvB;;;GAGG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE5D,kEAAkE;AAClE,MAAM,UAAU,sBAAsB,CAAC,eAAuB;IAC5D,IAAI,eAAe,CAAC,MAAM,GAAG,kCAAkC,GAAG,EAAE,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,SAAS,CAClB,eAAe,CAAC,QAAQ,CACtB,kCAAkC,EAClC,kCAAkC,GAAG,EAAE,CACxC,CACF,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,MAAM,wBAAwB,GAA2B;IAC9D,CAAC,EAAE,CAAC,EAAG,0BAA0B;IACjC,EAAE,EAAE,CAAC,EAAE,qBAAqB;CAC7B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAU,EAAE,aAAiB,EAAE,aAAqB;IACpF,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { PublicKey, AccountMeta } from "@solana/web3.js";
2
+ import { KaminoMarketConfig } from "../marketConfig";
3
+ interface UserPdas {
4
+ userStatePda: PublicKey;
5
+ allowlistEntryPda: PublicKey;
6
+ obligationPda: PublicKey;
7
+ userMetadataPda: PublicKey;
8
+ obligationFarmUserStatePda: PublicKey;
9
+ obligationFarmDebtUserStatePda: PublicKey;
10
+ userCollateralAta: PublicKey;
11
+ userUsdcAta: PublicKey;
12
+ pdaCollateralAta: PublicKey;
13
+ pdaUsdcAta: PublicKey;
14
+ pdaSharesAta: PublicKey;
15
+ }
16
+ export declare function getInitializeUserAccounts(owner: PublicKey, pdas: UserPdas, mc: KaminoMarketConfig, origin?: number): {
17
+ owner: PublicKey;
18
+ userState: PublicKey;
19
+ collateralMint: PublicKey;
20
+ systemProgram: PublicKey;
21
+ programConfig: PublicKey;
22
+ allowlistEntry: PublicKey;
23
+ depositConfig: PublicKey;
24
+ userOrigin: PublicKey;
25
+ originConfig: PublicKey;
26
+ };
27
+ export declare function getKaminoInitializeUserLenderAccounts(pdas: UserPdas, mc: KaminoMarketConfig): AccountMeta[];
28
+ export declare function getDepositAccounts(owner: PublicKey, pdas: UserPdas, mc: KaminoMarketConfig): {
29
+ owner: PublicKey;
30
+ userState: PublicKey;
31
+ userSourceLiquidity: PublicKey;
32
+ pdaSourceLiquidity: PublicKey;
33
+ supplyTokenMint: PublicKey;
34
+ tokenProgram: PublicKey;
35
+ associatedTokenProgram: PublicKey;
36
+ systemProgram: PublicKey;
37
+ programConfig: PublicKey;
38
+ allowlistEntry: PublicKey;
39
+ collateralMint: PublicKey;
40
+ };
41
+ export declare function getKaminoDepositLenderAccounts(pdas: UserPdas, mc: KaminoMarketConfig): AccountMeta[];
42
+ export declare function getBorrowAccounts(owner: PublicKey, pdas: UserPdas, mc: KaminoMarketConfig, hasVaultShares: boolean, vaultAccounts?: {
43
+ vault: PublicKey;
44
+ sharesMint: PublicKey;
45
+ sharesAta: PublicKey;
46
+ }): {
47
+ owner: PublicKey;
48
+ userState: PublicKey;
49
+ collateralMint: PublicKey;
50
+ pdaUsdcAta: PublicKey;
51
+ userUsdcAta: PublicKey;
52
+ tokenProgram: PublicKey;
53
+ systemProgram: PublicKey;
54
+ vault: PublicKey;
55
+ sharesMint: PublicKey;
56
+ pdaSharesAta: PublicKey;
57
+ sharesTokenProgram: PublicKey;
58
+ usdcMint: PublicKey;
59
+ programConfig: PublicKey;
60
+ allowlistEntry: PublicKey;
61
+ };
62
+ export declare function getKaminoBorrowLenderAccounts(pdas: UserPdas, mc: KaminoMarketConfig, hasVaultShares: boolean): AccountMeta[];
63
+ export declare function getRepayAccounts(owner: PublicKey, pdas: UserPdas, mc: KaminoMarketConfig): {
64
+ owner: PublicKey;
65
+ userState: PublicKey;
66
+ userUsdcAta: PublicKey;
67
+ pdaUsdcAta: PublicKey;
68
+ tokenProgram: PublicKey;
69
+ programConfig: PublicKey;
70
+ allowlistEntry: PublicKey;
71
+ collateralMint: PublicKey;
72
+ };
73
+ export declare function getKaminoRepayLenderAccounts(pdas: UserPdas, mc: KaminoMarketConfig): AccountMeta[];
74
+ export declare function getWithdrawAccounts(owner: PublicKey, pdas: UserPdas, mc: KaminoMarketConfig): {
75
+ owner: PublicKey;
76
+ userState: PublicKey;
77
+ pdaDestinationAta: PublicKey;
78
+ userDestinationAta: PublicKey;
79
+ tokenProgram: PublicKey;
80
+ programConfig: PublicKey;
81
+ allowlistEntry: PublicKey;
82
+ collateralMint: PublicKey;
83
+ };
84
+ export declare function getKaminoWithdrawLenderAccounts(pdas: UserPdas, mc: KaminoMarketConfig): AccountMeta[];
85
+ export declare function getPrepareWithdrawAccounts(owner: PublicKey, pdas: UserPdas, mc: KaminoMarketConfig, vaultAccounts: {
86
+ vault: PublicKey;
87
+ sharesMint: PublicKey;
88
+ sharesAta: PublicKey;
89
+ }): {
90
+ owner: PublicKey;
91
+ userState: PublicKey;
92
+ collateralMint: PublicKey;
93
+ programConfig: PublicKey;
94
+ allowlistEntry: PublicKey;
95
+ pdaUsdcAta: PublicKey;
96
+ vault: PublicKey;
97
+ sharesMint: PublicKey;
98
+ pdaSharesAta: PublicKey;
99
+ sharesTokenProgram: PublicKey;
100
+ usdcMint: PublicKey;
101
+ tokenProgram: PublicKey;
102
+ };
103
+ export declare function getKaminoPrepareWithdrawLenderAccounts(pdas: UserPdas, mc: KaminoMarketConfig): AccountMeta[];
104
+ export declare function fixFarmWritable(ixKeys: {
105
+ pubkey: PublicKey;
106
+ isSigner: boolean;
107
+ isWritable: boolean;
108
+ }[], farmUserState: PublicKey, farmState: PublicKey | null): void;
109
+ export {};
110
+ //# sourceMappingURL=accountResolvers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountResolvers.d.ts","sourceRoot":"","sources":["../../src/kamino/accountResolvers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAUxH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,UAAU,QAAQ;IAChB,YAAY,EAAE,SAAS,CAAC;IACxB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,aAAa,EAAE,SAAS,CAAC;IACzB,eAAe,EAAE,SAAS,CAAC;IAC3B,0BAA0B,EAAE,SAAS,CAAC;IACtC,8BAA8B,EAAE,SAAS,CAAC;IAC1C,iBAAiB,EAAE,SAAS,CAAC;IAC7B,WAAW,EAAE,SAAS,CAAC;IACvB,gBAAgB,EAAE,SAAS,CAAC;IAC5B,UAAU,EAAE,SAAS,CAAC;IACtB,YAAY,EAAE,SAAS,CAAC;CACzB;AAID,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,kBAAkB,EAAE,MAAM,GAAE,MAAU;;;;;;;;;;EAgBrH;AAGD,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,kBAAkB,GACrB,WAAW,EAAE,CAUf;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,kBAAkB;;;;;;;;;;;;EAc1F;AAGD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,kBAAkB,GACrB,WAAW,EAAE,CAmBf;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,kBAAkB,EACtB,cAAc,EAAE,OAAO,EACvB,aAAa,CAAC,EAAE;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;CACtB;;;;;;;;;;;;;;;EAsBF;AAGD,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,kBAAkB,EACtB,cAAc,EAAE,OAAO,GACtB,WAAW,EAAE,CAmBf;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,kBAAkB;;;;;;;;;EAWxF;AAGD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,kBAAkB,GACrB,WAAW,EAAE,CAef;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,kBAAkB;;;;;;;;;EAW3F;AAGD,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,kBAAkB,GACrB,WAAW,EAAE,CAmBf;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,kBAAkB,EACtB,aAAa,EAAE;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;CACtB;;;;;;;;;;;;;EAiBF;AAGD,wBAAgB,sCAAsC,CACpD,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,kBAAkB,GACrB,WAAW,EAAE,CAgBf;AAGD,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,EAAE,EACvE,aAAa,EAAE,SAAS,EACxB,SAAS,EAAE,SAAS,GAAG,IAAI,QAU5B"}