@kamino-finance/klend-sdk 5.2.11 → 5.2.13

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 (120) hide show
  1. package/dist/classes/manager.d.ts +38 -9
  2. package/dist/classes/manager.d.ts.map +1 -1
  3. package/dist/classes/manager.js +44 -10
  4. package/dist/classes/manager.js.map +1 -1
  5. package/dist/classes/types.d.ts +23 -0
  6. package/dist/classes/types.d.ts.map +1 -0
  7. package/dist/classes/types.js +3 -0
  8. package/dist/classes/types.js.map +1 -0
  9. package/dist/classes/utils.js +2 -2
  10. package/dist/classes/utils.js.map +1 -1
  11. package/dist/classes/vault.d.ts +47 -11
  12. package/dist/classes/vault.d.ts.map +1 -1
  13. package/dist/classes/vault.js +367 -49
  14. package/dist/classes/vault.js.map +1 -1
  15. package/dist/client_kamino_manager.d.ts.map +1 -1
  16. package/dist/client_kamino_manager.js +62 -12
  17. package/dist/client_kamino_manager.js.map +1 -1
  18. package/dist/idl_codegen_kamino_vault/accounts/Reserve.js +1 -1
  19. package/dist/idl_codegen_kamino_vault/accounts/VaultState.d.ts +18 -9
  20. package/dist/idl_codegen_kamino_vault/accounts/VaultState.d.ts.map +1 -1
  21. package/dist/idl_codegen_kamino_vault/accounts/VaultState.js +62 -42
  22. package/dist/idl_codegen_kamino_vault/accounts/VaultState.js.map +1 -1
  23. package/dist/idl_codegen_kamino_vault/errors/custom.d.ts +112 -80
  24. package/dist/idl_codegen_kamino_vault/errors/custom.d.ts.map +1 -1
  25. package/dist/idl_codegen_kamino_vault/errors/custom.js +214 -158
  26. package/dist/idl_codegen_kamino_vault/errors/custom.js.map +1 -1
  27. package/dist/idl_codegen_kamino_vault/instructions/deposit.d.ts +1 -1
  28. package/dist/idl_codegen_kamino_vault/instructions/deposit.d.ts.map +1 -1
  29. package/dist/idl_codegen_kamino_vault/instructions/deposit.js +1 -1
  30. package/dist/idl_codegen_kamino_vault/instructions/deposit.js.map +1 -1
  31. package/dist/idl_codegen_kamino_vault/instructions/index.d.ts +6 -0
  32. package/dist/idl_codegen_kamino_vault/instructions/index.d.ts.map +1 -1
  33. package/dist/idl_codegen_kamino_vault/instructions/index.js +7 -1
  34. package/dist/idl_codegen_kamino_vault/instructions/index.js.map +1 -1
  35. package/dist/idl_codegen_kamino_vault/instructions/initVault.d.ts +2 -2
  36. package/dist/idl_codegen_kamino_vault/instructions/initVault.d.ts.map +1 -1
  37. package/dist/idl_codegen_kamino_vault/instructions/initVault.js +2 -2
  38. package/dist/idl_codegen_kamino_vault/instructions/initVault.js.map +1 -1
  39. package/dist/idl_codegen_kamino_vault/instructions/initializeSharesMetadata.d.ts +19 -0
  40. package/dist/idl_codegen_kamino_vault/instructions/initializeSharesMetadata.d.ts.map +1 -0
  41. package/dist/idl_codegen_kamino_vault/instructions/initializeSharesMetadata.js +58 -0
  42. package/dist/idl_codegen_kamino_vault/instructions/initializeSharesMetadata.js.map +1 -0
  43. package/dist/idl_codegen_kamino_vault/instructions/invest.d.ts +3 -4
  44. package/dist/idl_codegen_kamino_vault/instructions/invest.d.ts.map +1 -1
  45. package/dist/idl_codegen_kamino_vault/instructions/invest.js +2 -3
  46. package/dist/idl_codegen_kamino_vault/instructions/invest.js.map +1 -1
  47. package/dist/idl_codegen_kamino_vault/instructions/updateSharesMetadata.d.ts +16 -0
  48. package/dist/idl_codegen_kamino_vault/instructions/updateSharesMetadata.d.ts.map +1 -0
  49. package/dist/idl_codegen_kamino_vault/instructions/updateSharesMetadata.js +55 -0
  50. package/dist/idl_codegen_kamino_vault/instructions/updateSharesMetadata.js.map +1 -0
  51. package/dist/idl_codegen_kamino_vault/instructions/updateVaultConfig.js +1 -1
  52. package/dist/idl_codegen_kamino_vault/instructions/updateVaultConfig.js.map +1 -1
  53. package/dist/idl_codegen_kamino_vault/instructions/withdraw.d.ts +24 -20
  54. package/dist/idl_codegen_kamino_vault/instructions/withdraw.d.ts.map +1 -1
  55. package/dist/idl_codegen_kamino_vault/instructions/withdraw.js +81 -20
  56. package/dist/idl_codegen_kamino_vault/instructions/withdraw.js.map +1 -1
  57. package/dist/idl_codegen_kamino_vault/instructions/withdrawFromAvailable.d.ts +21 -0
  58. package/dist/idl_codegen_kamino_vault/instructions/withdrawFromAvailable.d.ts.map +1 -0
  59. package/dist/idl_codegen_kamino_vault/instructions/withdrawFromAvailable.js +55 -0
  60. package/dist/idl_codegen_kamino_vault/instructions/withdrawFromAvailable.js.map +1 -0
  61. package/dist/idl_codegen_kamino_vault/instructions/withdrawPendingFees.d.ts +2 -3
  62. package/dist/idl_codegen_kamino_vault/instructions/withdrawPendingFees.d.ts.map +1 -1
  63. package/dist/idl_codegen_kamino_vault/instructions/withdrawPendingFees.js +3 -4
  64. package/dist/idl_codegen_kamino_vault/instructions/withdrawPendingFees.js.map +1 -1
  65. package/dist/idl_codegen_kamino_vault/types/ReserveConfig.d.ts +78 -20
  66. package/dist/idl_codegen_kamino_vault/types/ReserveConfig.d.ts.map +1 -1
  67. package/dist/idl_codegen_kamino_vault/types/ReserveConfig.js +45 -14
  68. package/dist/idl_codegen_kamino_vault/types/ReserveConfig.js.map +1 -1
  69. package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.d.ts +16 -16
  70. package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.d.ts.map +1 -1
  71. package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.js +16 -16
  72. package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.js.map +1 -1
  73. package/dist/idl_codegen_kamino_vault/types/VaultAllocation.d.ts +5 -5
  74. package/dist/idl_codegen_kamino_vault/types/VaultAllocation.js +7 -7
  75. package/dist/idl_codegen_kamino_vault/types/VaultConfigField.d.ts +46 -7
  76. package/dist/idl_codegen_kamino_vault/types/VaultConfigField.d.ts.map +1 -1
  77. package/dist/idl_codegen_kamino_vault/types/VaultConfigField.js +84 -12
  78. package/dist/idl_codegen_kamino_vault/types/VaultConfigField.js.map +1 -1
  79. package/dist/idl_codegen_kamino_vault/types/index.d.ts +2 -2
  80. package/dist/idl_codegen_kamino_vault/types/index.d.ts.map +1 -1
  81. package/dist/idl_codegen_kamino_vault/types/index.js.map +1 -1
  82. package/dist/lending_operations/repay_with_collateral_calcs.d.ts.map +1 -1
  83. package/dist/lending_operations/repay_with_collateral_calcs.js +10 -1
  84. package/dist/lending_operations/repay_with_collateral_calcs.js.map +1 -1
  85. package/dist/lending_operations/repay_with_collateral_operations.d.ts.map +1 -1
  86. package/dist/lending_operations/repay_with_collateral_operations.js +7 -6
  87. package/dist/lending_operations/repay_with_collateral_operations.js.map +1 -1
  88. package/dist/leverage/operations.d.ts.map +1 -1
  89. package/dist/leverage/operations.js +12 -8
  90. package/dist/leverage/operations.js.map +1 -1
  91. package/dist/leverage/types.d.ts +1 -0
  92. package/dist/leverage/types.d.ts.map +1 -1
  93. package/package.json +1 -1
  94. package/src/classes/manager.ts +60 -13
  95. package/src/classes/types.ts +28 -0
  96. package/src/classes/utils.ts +2 -2
  97. package/src/classes/vault.ts +527 -54
  98. package/src/client_kamino_manager.ts +119 -15
  99. package/src/idl_codegen_kamino_vault/accounts/Reserve.ts +1 -1
  100. package/src/idl_codegen_kamino_vault/accounts/VaultState.ts +215 -178
  101. package/src/idl_codegen_kamino_vault/errors/custom.ts +213 -157
  102. package/src/idl_codegen_kamino_vault/instructions/deposit.ts +2 -2
  103. package/src/idl_codegen_kamino_vault/instructions/index.ts +15 -0
  104. package/src/idl_codegen_kamino_vault/instructions/initVault.ts +4 -4
  105. package/src/idl_codegen_kamino_vault/instructions/initializeSharesMetadata.ts +58 -0
  106. package/src/idl_codegen_kamino_vault/instructions/invest.ts +5 -7
  107. package/src/idl_codegen_kamino_vault/instructions/updateSharesMetadata.ts +52 -0
  108. package/src/idl_codegen_kamino_vault/instructions/updateVaultConfig.ts +1 -1
  109. package/src/idl_codegen_kamino_vault/instructions/withdraw.ts +106 -40
  110. package/src/idl_codegen_kamino_vault/instructions/withdrawFromAvailable.ts +56 -0
  111. package/src/idl_codegen_kamino_vault/instructions/withdrawPendingFees.ts +5 -7
  112. package/src/idl_codegen_kamino_vault/types/ReserveConfig.ts +100 -28
  113. package/src/idl_codegen_kamino_vault/types/ReserveLiquidity.ts +25 -24
  114. package/src/idl_codegen_kamino_vault/types/VaultAllocation.ts +9 -9
  115. package/src/idl_codegen_kamino_vault/types/VaultConfigField.ts +103 -13
  116. package/src/idl_codegen_kamino_vault/types/index.ts +8 -2
  117. package/src/lending_operations/repay_with_collateral_calcs.ts +18 -1
  118. package/src/lending_operations/repay_with_collateral_operations.ts +9 -7
  119. package/src/leverage/operations.ts +69 -29
  120. package/src/leverage/types.ts +1 -0
@@ -95,25 +95,25 @@ export class MinWithdrawAmount {
95
95
  }
96
96
  }
97
97
 
98
- export interface MintInvestAmountJSON {
99
- kind: "MintInvestAmount"
98
+ export interface MinInvestAmountJSON {
99
+ kind: "MinInvestAmount"
100
100
  }
101
101
 
102
- export class MintInvestAmount {
102
+ export class MinInvestAmount {
103
103
  static readonly discriminator = 4
104
- static readonly kind = "MintInvestAmount"
104
+ static readonly kind = "MinInvestAmount"
105
105
  readonly discriminator = 4
106
- readonly kind = "MintInvestAmount"
106
+ readonly kind = "MinInvestAmount"
107
107
 
108
- toJSON(): MintInvestAmountJSON {
108
+ toJSON(): MinInvestAmountJSON {
109
109
  return {
110
- kind: "MintInvestAmount",
110
+ kind: "MinInvestAmount",
111
111
  }
112
112
  }
113
113
 
114
114
  toEncodable() {
115
115
  return {
116
- MintInvestAmount: {},
116
+ MinInvestAmount: {},
117
117
  }
118
118
  }
119
119
  }
@@ -187,6 +187,75 @@ export class PendingVaultAdmin {
187
187
  }
188
188
  }
189
189
 
190
+ export interface NameJSON {
191
+ kind: "Name"
192
+ }
193
+
194
+ export class Name {
195
+ static readonly discriminator = 8
196
+ static readonly kind = "Name"
197
+ readonly discriminator = 8
198
+ readonly kind = "Name"
199
+
200
+ toJSON(): NameJSON {
201
+ return {
202
+ kind: "Name",
203
+ }
204
+ }
205
+
206
+ toEncodable() {
207
+ return {
208
+ Name: {},
209
+ }
210
+ }
211
+ }
212
+
213
+ export interface LookupTableJSON {
214
+ kind: "LookupTable"
215
+ }
216
+
217
+ export class LookupTable {
218
+ static readonly discriminator = 9
219
+ static readonly kind = "LookupTable"
220
+ readonly discriminator = 9
221
+ readonly kind = "LookupTable"
222
+
223
+ toJSON(): LookupTableJSON {
224
+ return {
225
+ kind: "LookupTable",
226
+ }
227
+ }
228
+
229
+ toEncodable() {
230
+ return {
231
+ LookupTable: {},
232
+ }
233
+ }
234
+ }
235
+
236
+ export interface FarmJSON {
237
+ kind: "Farm"
238
+ }
239
+
240
+ export class Farm {
241
+ static readonly discriminator = 10
242
+ static readonly kind = "Farm"
243
+ readonly discriminator = 10
244
+ readonly kind = "Farm"
245
+
246
+ toJSON(): FarmJSON {
247
+ return {
248
+ kind: "Farm",
249
+ }
250
+ }
251
+
252
+ toEncodable() {
253
+ return {
254
+ Farm: {},
255
+ }
256
+ }
257
+ }
258
+
190
259
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
191
260
  export function fromDecoded(obj: any): types.VaultConfigFieldKind {
192
261
  if (typeof obj !== "object") {
@@ -205,8 +274,8 @@ export function fromDecoded(obj: any): types.VaultConfigFieldKind {
205
274
  if ("MinWithdrawAmount" in obj) {
206
275
  return new MinWithdrawAmount()
207
276
  }
208
- if ("MintInvestAmount" in obj) {
209
- return new MintInvestAmount()
277
+ if ("MinInvestAmount" in obj) {
278
+ return new MinInvestAmount()
210
279
  }
211
280
  if ("MinInvestDelaySlots" in obj) {
212
281
  return new MinInvestDelaySlots()
@@ -217,6 +286,15 @@ export function fromDecoded(obj: any): types.VaultConfigFieldKind {
217
286
  if ("PendingVaultAdmin" in obj) {
218
287
  return new PendingVaultAdmin()
219
288
  }
289
+ if ("Name" in obj) {
290
+ return new Name()
291
+ }
292
+ if ("LookupTable" in obj) {
293
+ return new LookupTable()
294
+ }
295
+ if ("Farm" in obj) {
296
+ return new Farm()
297
+ }
220
298
 
221
299
  throw new Error("Invalid enum object")
222
300
  }
@@ -237,8 +315,8 @@ export function fromJSON(
237
315
  case "MinWithdrawAmount": {
238
316
  return new MinWithdrawAmount()
239
317
  }
240
- case "MintInvestAmount": {
241
- return new MintInvestAmount()
318
+ case "MinInvestAmount": {
319
+ return new MinInvestAmount()
242
320
  }
243
321
  case "MinInvestDelaySlots": {
244
322
  return new MinInvestDelaySlots()
@@ -249,6 +327,15 @@ export function fromJSON(
249
327
  case "PendingVaultAdmin": {
250
328
  return new PendingVaultAdmin()
251
329
  }
330
+ case "Name": {
331
+ return new Name()
332
+ }
333
+ case "LookupTable": {
334
+ return new LookupTable()
335
+ }
336
+ case "Farm": {
337
+ return new Farm()
338
+ }
252
339
  }
253
340
  }
254
341
 
@@ -258,10 +345,13 @@ export function layout(property?: string) {
258
345
  borsh.struct([], "ManagementFeeBps"),
259
346
  borsh.struct([], "MinDepositAmount"),
260
347
  borsh.struct([], "MinWithdrawAmount"),
261
- borsh.struct([], "MintInvestAmount"),
348
+ borsh.struct([], "MinInvestAmount"),
262
349
  borsh.struct([], "MinInvestDelaySlots"),
263
350
  borsh.struct([], "CrankFundFeePerReserve"),
264
351
  borsh.struct([], "PendingVaultAdmin"),
352
+ borsh.struct([], "Name"),
353
+ borsh.struct([], "LookupTable"),
354
+ borsh.struct([], "Farm"),
265
355
  ])
266
356
  if (property !== undefined) {
267
357
  return ret.replicate(property)
@@ -56,19 +56,25 @@ export type VaultConfigFieldKind =
56
56
  | VaultConfigField.ManagementFeeBps
57
57
  | VaultConfigField.MinDepositAmount
58
58
  | VaultConfigField.MinWithdrawAmount
59
- | VaultConfigField.MintInvestAmount
59
+ | VaultConfigField.MinInvestAmount
60
60
  | VaultConfigField.MinInvestDelaySlots
61
61
  | VaultConfigField.CrankFundFeePerReserve
62
62
  | VaultConfigField.PendingVaultAdmin
63
+ | VaultConfigField.Name
64
+ | VaultConfigField.LookupTable
65
+ | VaultConfigField.Farm
63
66
  export type VaultConfigFieldJSON =
64
67
  | VaultConfigField.PerformanceFeeBpsJSON
65
68
  | VaultConfigField.ManagementFeeBpsJSON
66
69
  | VaultConfigField.MinDepositAmountJSON
67
70
  | VaultConfigField.MinWithdrawAmountJSON
68
- | VaultConfigField.MintInvestAmountJSON
71
+ | VaultConfigField.MinInvestAmountJSON
69
72
  | VaultConfigField.MinInvestDelaySlotsJSON
70
73
  | VaultConfigField.CrankFundFeePerReserveJSON
71
74
  | VaultConfigField.PendingVaultAdminJSON
75
+ | VaultConfigField.NameJSON
76
+ | VaultConfigField.LookupTableJSON
77
+ | VaultConfigField.FarmJSON
72
78
 
73
79
  export { VaultAllocation } from "./VaultAllocation"
74
80
  export type {
@@ -1,6 +1,7 @@
1
1
  import Decimal from 'decimal.js';
2
2
  import { KaminoMarket, KaminoObligation, KaminoReserve, numberToLamportsDecimal } from '../classes';
3
3
  import { PublicKey } from '@solana/web3.js';
4
+ import { lamportsToDecimal } from '../classes/utils';
4
5
 
5
6
  export function calcRepayAmountWithSlippage(
6
7
  kaminoMarket: KaminoMarket,
@@ -23,9 +24,25 @@ export function calcRepayAmountWithSlippage(
23
24
  )
24
25
  .toDecimalPlaces(debtReserve.state.liquidity.mintDecimals.toNumber(), Decimal.ROUND_CEIL);
25
26
  // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not reapying enough
26
- const repayAmount = amount
27
+ const repayAmountIrAdjusted = amount
27
28
  .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))
28
29
  .toDecimalPlaces(debtReserve.state.liquidity.mintDecimals.toNumber(), Decimal.ROUND_CEIL);
30
+
31
+ let repayAmount: Decimal;
32
+ // Ensure when repaying close to the full amount, we repay the full amount as otherwise we might end up having a small amount left
33
+ if (
34
+ repayAmountIrAdjusted.greaterThanOrEqualTo(
35
+ lamportsToDecimal(
36
+ obligation.borrows.get(debtReserve.address)?.amount || new Decimal(0),
37
+ debtReserve.stats.decimals
38
+ )
39
+ )
40
+ ) {
41
+ repayAmount = repayAmountIrAdjusted;
42
+ } else {
43
+ repayAmount = amount;
44
+ }
45
+
29
46
  const repayAmountLamports = numberToLamportsDecimal(repayAmount, debtReserve.stats.decimals);
30
47
 
31
48
  const { flashRepayAmountLamports } = calcFlashRepayAmount({
@@ -108,13 +108,6 @@ export async function getRepayWithCollSwapInputs<QuoteResponse>({
108
108
  .ceil();
109
109
  const inputAmountLamports = Decimal.min(withdrawableCollLamports, maxCollNeededFromOracle);
110
110
 
111
- const swapQuoteInputs: SwapInputs = {
112
- inputAmountLamports,
113
- inputMint: collTokenMint,
114
- outputMint: debtTokenMint,
115
- amountDebtAtaBalance: new Decimal(0), // only used for kTokens
116
- };
117
-
118
111
  // Build the repay & withdraw collateral tx to get the number of accounts
119
112
  const klendIxs = await buildRepayWithCollateralIxs(
120
113
  kaminoMarket,
@@ -135,6 +128,14 @@ export async function getRepayWithCollSwapInputs<QuoteResponse>({
135
128
  inputAmountLamports
136
129
  );
137
130
  const uniqueKlendAccounts = uniqueAccounts(klendIxs);
131
+
132
+ const swapQuoteInputs: SwapInputs = {
133
+ inputAmountLamports,
134
+ inputMint: collTokenMint,
135
+ outputMint: debtTokenMint,
136
+ amountDebtAtaBalance: new Decimal(0), // only used for kTokens
137
+ };
138
+
138
139
  const swapQuote = await quoter(swapQuoteInputs, uniqueKlendAccounts);
139
140
 
140
141
  const swapQuotePxDebtToColl = swapQuote.priceAInB;
@@ -147,6 +148,7 @@ export async function getRepayWithCollSwapInputs<QuoteResponse>({
147
148
  return {
148
149
  swapInputs: {
149
150
  inputAmountLamports: collSwapInLamports,
151
+ minOutAmountLamports: flashRepayAmountLamports,
150
152
  inputMint: collTokenMint,
151
153
  outputMint: debtTokenMint,
152
154
  amountDebtAtaBalance: new Decimal(0), // only used for kTokens
@@ -86,10 +86,10 @@ export async function getDepositWithLeverageSwapInputs<QuoteResponse>({
86
86
  swapInputs: SwapInputs;
87
87
  initialInputs: DepositLeverageInitialInputs<QuoteResponse>;
88
88
  }> {
89
- const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
90
- const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
89
+ const collReserve = kaminoMarket.getReserveByMint(collTokenMint)!;
90
+ const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint)!;
91
91
  const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);
92
- const flashLoanFee = collReserve!.getFlashLoanFee() || new Decimal(0);
92
+ const flashLoanFee = collReserve.getFlashLoanFee() || new Decimal(0);
93
93
 
94
94
  const selectedTokenIsCollToken = selectedTokenMint.equals(collTokenMint);
95
95
  const depositTokenIsSol = !solTokenReserve ? false : selectedTokenMint.equals(solTokenReserve!.getLiquidityMint());
@@ -129,8 +129,8 @@ export async function getDepositWithLeverageSwapInputs<QuoteResponse>({
129
129
  // Build the repay & withdraw collateral tx to get the number of accounts
130
130
  const klendIxs = await buildDepositWithLeverageIxns(
131
131
  kaminoMarket,
132
- debtReserve!,
133
- collReserve!,
132
+ debtReserve,
133
+ collReserve,
134
134
  owner,
135
135
  obligation ? obligation : obligationType,
136
136
  referrer,
@@ -152,7 +152,7 @@ export async function getDepositWithLeverageSwapInputs<QuoteResponse>({
152
152
 
153
153
  const swapInputAmount = toLamports(
154
154
  !collIsKtoken ? calcs.swapDebtTokenIn : calcs.singleSidedDepositKtokenOnly,
155
- debtReserve!.stats.decimals
155
+ debtReserve.stats.decimals
156
156
  ).ceil();
157
157
 
158
158
  const swapInputsForQuote: SwapInputs = {
@@ -182,7 +182,7 @@ export async function getDepositWithLeverageSwapInputs<QuoteResponse>({
182
182
 
183
183
  const swapInputAmountQuotePrice = toLamports(
184
184
  !collIsKtoken ? quotePriceCalcs.swapDebtTokenIn : quotePriceCalcs.singleSidedDepositKtokenOnly,
185
- debtReserve!.stats.decimals
185
+ debtReserve.stats.decimals
186
186
  ).ceil();
187
187
 
188
188
  let expectedDebtTokenAtaBalance = new Decimal(0);
@@ -201,14 +201,18 @@ export async function getDepositWithLeverageSwapInputs<QuoteResponse>({
201
201
  kaminoMarket.getConnection(),
202
202
  debtTokenMint,
203
203
  owner,
204
- toLamports(futureBalanceInAta.toDecimalPlaces(debtReserve!.stats.decimals), debtReserve!.stats.decimals),
205
- debtReserve!.state.liquidity.mintDecimals.toNumber()
204
+ toLamports(futureBalanceInAta.toDecimalPlaces(debtReserve.stats.decimals), debtReserve.stats.decimals),
205
+ debtReserve.state.liquidity.mintDecimals.toNumber()
206
206
  );
207
207
  }
208
208
 
209
209
  return {
210
210
  swapInputs: {
211
211
  inputAmountLamports: swapInputAmountQuotePrice,
212
+ minOutAmountLamports: toLamports(
213
+ !collIsKtoken ? quotePriceCalcs.flashBorrowInCollToken : quotePriceCalcs.flashBorrowInDebtTokenKtokenOnly,
214
+ !collIsKtoken ? collReserve.stats.decimals : debtReserve.stats.decimals
215
+ ),
212
216
  inputMint: debtTokenMint,
213
217
  outputMint: collTokenMint,
214
218
  amountDebtAtaBalance: expectedDebtTokenAtaBalance,
@@ -410,8 +414,18 @@ async function buildDepositWithLeverageIxns(
410
414
  const budgetIxns = budgetAndPriorityFeeIxs || getComputeBudgetAndPriorityFeeIxns(3000000);
411
415
  const collTokenMint = collReserve.getLiquidityMint();
412
416
  const debtTokenMint = debtReserve.getLiquidityMint();
413
- const collTokenAta = getAssociatedTokenAddressSync(collTokenMint, owner);
414
- const debtTokenAta = getAssociatedTokenAddressSync(debtTokenMint, owner);
417
+ const collTokenAta = getAssociatedTokenAddressSync(
418
+ collTokenMint,
419
+ owner,
420
+ false,
421
+ collReserve.getLiquidityTokenProgram()
422
+ );
423
+ const debtTokenAta = getAssociatedTokenAddressSync(
424
+ debtTokenMint,
425
+ owner,
426
+ false,
427
+ debtReserve.getLiquidityTokenProgram()
428
+ );
415
429
 
416
430
  // 1. Create atas & budget txns
417
431
  let mintsToCreateAtas: Array<{ mint: PublicKey; tokenProgram: PublicKey }>;
@@ -640,7 +654,7 @@ export async function getWithdrawWithLeverageSwapInputs<QuoteResponse>({
640
654
  kaminoMarket,
641
655
  collReserve!,
642
656
  debtReserve!,
643
- collIsKtoken ? swapQuote.priceAInB : priceCollToDebt,
657
+ !collIsKtoken ? swapQuote.priceAInB : priceCollToDebt,
644
658
  withdrawAmount,
645
659
  deposited,
646
660
  borrowed,
@@ -661,6 +675,7 @@ export async function getWithdrawWithLeverageSwapInputs<QuoteResponse>({
661
675
  return {
662
676
  swapInputs: {
663
677
  inputAmountLamports: swapInputAmountQuotePrice,
678
+ minOutAmountLamports: calcsQuotePrice.repayAmount,
664
679
  inputMint: collTokenMint,
665
680
  outputMint: debtTokenMint,
666
681
  amountDebtAtaBalance: new Decimal(0), // Only needed for ktokens deposits
@@ -807,7 +822,12 @@ export async function buildWithdrawWithLeverageIxns(
807
822
  ): Promise<TransactionInstruction[]> {
808
823
  const collTokenMint = collReserve.getLiquidityMint();
809
824
  const debtTokenMint = debtReserve.getLiquidityMint();
810
- const debtTokenAta = getAssociatedTokenAddressSync(debtTokenMint, owner);
825
+ const debtTokenAta = getAssociatedTokenAddressSync(
826
+ debtTokenMint,
827
+ owner,
828
+ false,
829
+ debtReserve.getLiquidityTokenProgram()
830
+ );
811
831
  // 1. Create atas & budget txns & user metadata
812
832
  let mintsToCreateAtas: Array<{ mint: PublicKey; tokenProgram: PublicKey }>;
813
833
  if (collIsKtoken) {
@@ -957,10 +977,10 @@ export async function getAdjustLeverageSwapInputs<QuoteResponse>({
957
977
  swapInputs: SwapInputs;
958
978
  initialInputs: AdjustLeverageInitialInputs<QuoteResponse>;
959
979
  }> {
960
- const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
961
- const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
962
- const deposited = fromLamports(depositedLamports, collReserve!.stats.decimals);
963
- const borrowed = fromLamports(borrowedLamports, debtReserve!.stats.decimals);
980
+ const collReserve = kaminoMarket.getReserveByMint(collTokenMint)!;
981
+ const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint)!;
982
+ const deposited = fromLamports(depositedLamports, collReserve.stats.decimals);
983
+ const borrowed = fromLamports(borrowedLamports, debtReserve.stats.decimals);
964
984
  const collIsKtoken = await isKtoken(collTokenMint);
965
985
  const strategy = collIsKtoken ? (await kamino!.getStrategyByKTokenMint(collTokenMint))! : undefined;
966
986
 
@@ -969,9 +989,9 @@ export async function getAdjustLeverageSwapInputs<QuoteResponse>({
969
989
  const isDepositViaLeverage = targetLeverage.gte(new Decimal(currentLeverage));
970
990
  let flashLoanFee;
971
991
  if (isDepositViaLeverage) {
972
- flashLoanFee = collReserve!.getFlashLoanFee() || new Decimal(0);
992
+ flashLoanFee = collReserve.getFlashLoanFee() || new Decimal(0);
973
993
  } else {
974
- flashLoanFee = debtReserve!.getFlashLoanFee() || new Decimal(0);
994
+ flashLoanFee = debtReserve.getFlashLoanFee() || new Decimal(0);
975
995
  }
976
996
 
977
997
  const { adjustDepositPosition, adjustBorrowPosition } = calcAdjustAmounts({
@@ -1025,7 +1045,7 @@ export async function getAdjustLeverageSwapInputs<QuoteResponse>({
1025
1045
 
1026
1046
  const swapInputAmount = toLamports(
1027
1047
  !collIsKtoken ? calcs.borrowAmount : calcs.amountToFlashBorrowDebt,
1028
- debtReserve!.state.liquidity.mintDecimals.toNumber()
1048
+ debtReserve.stats.decimals,
1029
1049
  ).ceil();
1030
1050
 
1031
1051
  const swapInputsForQuote: SwapInputs = {
@@ -1051,7 +1071,7 @@ export async function getAdjustLeverageSwapInputs<QuoteResponse>({
1051
1071
  const calcsQuotePrice = await adjustDepositLeverageCalcs(
1052
1072
  kaminoMarket,
1053
1073
  owner,
1054
- debtReserve!,
1074
+ debtReserve,
1055
1075
  adjustDepositPositionQuotePrice,
1056
1076
  adjustBorrowPositionQuotePrice,
1057
1077
  swapQuote.priceAInB,
@@ -1062,7 +1082,7 @@ export async function getAdjustLeverageSwapInputs<QuoteResponse>({
1062
1082
 
1063
1083
  const swapInputAmountQuotePrice = toLamports(
1064
1084
  !collIsKtoken ? calcsQuotePrice.borrowAmount : calcsQuotePrice.amountToFlashBorrowDebt,
1065
- debtReserve!.state.liquidity.mintDecimals.toNumber()
1085
+ debtReserve.state.liquidity.mintDecimals.toNumber()
1066
1086
  ).ceil();
1067
1087
 
1068
1088
  let expectedDebtTokenAtaBalance = new Decimal(0);
@@ -1073,15 +1093,19 @@ export async function getAdjustLeverageSwapInputs<QuoteResponse>({
1073
1093
  owner,
1074
1094
  toLamports(
1075
1095
  !collIsKtoken ? calcsQuotePrice.borrowAmount : calcsQuotePrice.amountToFlashBorrowDebt,
1076
- debtReserve!.stats.decimals
1096
+ debtReserve.stats.decimals
1077
1097
  ).floor(),
1078
- debtReserve!.state.liquidity.mintDecimals.toNumber()
1098
+ debtReserve.state.liquidity.mintDecimals.toNumber()
1079
1099
  );
1080
1100
  }
1081
1101
 
1082
1102
  return {
1083
1103
  swapInputs: {
1084
1104
  inputAmountLamports: swapInputAmountQuotePrice,
1105
+ minOutAmountLamports: toLamports(
1106
+ !collIsKtoken ? calcsQuotePrice.adjustDepositPosition : calcsQuotePrice.amountToFlashBorrowDebt,
1107
+ !collIsKtoken ? collReserve.stats.decimals : debtReserve!.stats.decimals
1108
+ ),
1085
1109
  inputMint: debtTokenMint,
1086
1110
  outputMint: collTokenMint,
1087
1111
  amountDebtAtaBalance: expectedDebtTokenAtaBalance,
@@ -1124,7 +1148,7 @@ export async function getAdjustLeverageSwapInputs<QuoteResponse>({
1124
1148
 
1125
1149
  const swapInputAmount = toLamports(
1126
1150
  calcs.withdrawAmountWithSlippageAndFlashLoanFee,
1127
- collReserve!.state.liquidity.mintDecimals.toNumber()
1151
+ collReserve.state.liquidity.mintDecimals.toNumber()
1128
1152
  ).ceil();
1129
1153
 
1130
1154
  const swapInputsForQuote: SwapInputs = {
@@ -1156,12 +1180,13 @@ export async function getAdjustLeverageSwapInputs<QuoteResponse>({
1156
1180
 
1157
1181
  const swapInputAmountQuotePrice = toLamports(
1158
1182
  calcsQuotePrice.withdrawAmountWithSlippageAndFlashLoanFee,
1159
- collReserve!.state.liquidity.mintDecimals.toNumber()
1183
+ collReserve.state.liquidity.mintDecimals.toNumber()
1160
1184
  ).ceil();
1161
1185
 
1162
1186
  return {
1163
1187
  swapInputs: {
1164
1188
  inputAmountLamports: swapInputAmountQuotePrice,
1189
+ minOutAmountLamports: toLamports(calcsQuotePrice.adjustBorrowPosition.abs(), debtReserve.stats.decimals),
1165
1190
  inputMint: collTokenMint,
1166
1191
  outputMint: debtTokenMint,
1167
1192
  amountDebtAtaBalance: new Decimal(0), // Only needed for ktokens deposits
@@ -1349,8 +1374,18 @@ async function buildIncreaseLeverageIxns(
1349
1374
  ): Promise<TransactionInstruction[]> {
1350
1375
  const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
1351
1376
  const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
1352
- const debtTokenAta = getAssociatedTokenAddressSync(debtTokenMint, owner);
1353
- const collTokenAta = getAssociatedTokenAddressSync(collTokenMint, owner);
1377
+ const debtTokenAta = getAssociatedTokenAddressSync(
1378
+ debtTokenMint,
1379
+ owner,
1380
+ false,
1381
+ debtReserve!.getLiquidityTokenProgram()
1382
+ );
1383
+ const collTokenAta = getAssociatedTokenAddressSync(
1384
+ collTokenMint,
1385
+ owner,
1386
+ false,
1387
+ collReserve!.getLiquidityTokenProgram()
1388
+ );
1354
1389
 
1355
1390
  // 1. Create atas & budget txns
1356
1391
  const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);
@@ -1504,7 +1539,12 @@ async function buildDecreaseLeverageIxns(
1504
1539
  ): Promise<TransactionInstruction[]> {
1505
1540
  const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
1506
1541
  const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
1507
- const debtTokenAta = getAssociatedTokenAddressSync(debtTokenMint, owner);
1542
+ const debtTokenAta = getAssociatedTokenAddressSync(
1543
+ debtTokenMint,
1544
+ owner,
1545
+ false,
1546
+ debtReserve!.getLiquidityTokenProgram()
1547
+ );
1508
1548
 
1509
1549
  // 1. Create atas & budget txns
1510
1550
  const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);
@@ -32,6 +32,7 @@ export type IsKtokenProvider = (token: PublicKey | string) => Promise<boolean>;
32
32
 
33
33
  export type SwapInputs = {
34
34
  inputAmountLamports: Decimal;
35
+ minOutAmountLamports?: Decimal;
35
36
  inputMint: PublicKey;
36
37
  outputMint: PublicKey;
37
38
  amountDebtAtaBalance: Decimal | undefined;