@kamino-finance/klend-sdk 5.2.10 → 5.2.12
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/classes/manager.d.ts +2 -2
- package/dist/classes/manager.js +3 -3
- package/dist/classes/manager.js.map +1 -1
- package/dist/classes/utils.js +2 -2
- package/dist/classes/utils.js.map +1 -1
- package/dist/classes/vault.d.ts +3 -3
- package/dist/classes/vault.d.ts.map +1 -1
- package/dist/classes/vault.js +34 -32
- package/dist/classes/vault.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/accounts/Reserve.js +1 -1
- package/dist/idl_codegen_kamino_vault/accounts/VaultState.d.ts +18 -9
- package/dist/idl_codegen_kamino_vault/accounts/VaultState.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/accounts/VaultState.js +62 -42
- package/dist/idl_codegen_kamino_vault/accounts/VaultState.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/errors/custom.d.ts +112 -80
- package/dist/idl_codegen_kamino_vault/errors/custom.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/errors/custom.js +214 -158
- package/dist/idl_codegen_kamino_vault/errors/custom.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/deposit.d.ts +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/deposit.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/deposit.js +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/deposit.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/index.d.ts +6 -0
- package/dist/idl_codegen_kamino_vault/instructions/index.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/index.js +7 -1
- package/dist/idl_codegen_kamino_vault/instructions/index.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/initVault.d.ts +2 -2
- package/dist/idl_codegen_kamino_vault/instructions/initVault.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/initVault.js +2 -2
- package/dist/idl_codegen_kamino_vault/instructions/initVault.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/initializeSharesMetadata.d.ts +19 -0
- package/dist/idl_codegen_kamino_vault/instructions/initializeSharesMetadata.d.ts.map +1 -0
- package/dist/idl_codegen_kamino_vault/instructions/initializeSharesMetadata.js +58 -0
- package/dist/idl_codegen_kamino_vault/instructions/initializeSharesMetadata.js.map +1 -0
- package/dist/idl_codegen_kamino_vault/instructions/invest.d.ts +3 -4
- package/dist/idl_codegen_kamino_vault/instructions/invest.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/invest.js +2 -3
- package/dist/idl_codegen_kamino_vault/instructions/invest.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/updateSharesMetadata.d.ts +16 -0
- package/dist/idl_codegen_kamino_vault/instructions/updateSharesMetadata.d.ts.map +1 -0
- package/dist/idl_codegen_kamino_vault/instructions/updateSharesMetadata.js +55 -0
- package/dist/idl_codegen_kamino_vault/instructions/updateSharesMetadata.js.map +1 -0
- package/dist/idl_codegen_kamino_vault/instructions/updateVaultConfig.js +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/updateVaultConfig.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/withdraw.d.ts +24 -20
- package/dist/idl_codegen_kamino_vault/instructions/withdraw.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/withdraw.js +81 -20
- package/dist/idl_codegen_kamino_vault/instructions/withdraw.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/withdrawFromAvailable.d.ts +21 -0
- package/dist/idl_codegen_kamino_vault/instructions/withdrawFromAvailable.d.ts.map +1 -0
- package/dist/idl_codegen_kamino_vault/instructions/withdrawFromAvailable.js +55 -0
- package/dist/idl_codegen_kamino_vault/instructions/withdrawFromAvailable.js.map +1 -0
- package/dist/idl_codegen_kamino_vault/instructions/withdrawPendingFees.d.ts +2 -3
- package/dist/idl_codegen_kamino_vault/instructions/withdrawPendingFees.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/instructions/withdrawPendingFees.js +3 -4
- package/dist/idl_codegen_kamino_vault/instructions/withdrawPendingFees.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/types/ReserveConfig.d.ts +78 -20
- package/dist/idl_codegen_kamino_vault/types/ReserveConfig.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/types/ReserveConfig.js +45 -14
- package/dist/idl_codegen_kamino_vault/types/ReserveConfig.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.d.ts +16 -16
- package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.js +16 -16
- package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/types/VaultAllocation.d.ts +5 -5
- package/dist/idl_codegen_kamino_vault/types/VaultAllocation.js +7 -7
- package/dist/idl_codegen_kamino_vault/types/VaultConfigField.d.ts +46 -7
- package/dist/idl_codegen_kamino_vault/types/VaultConfigField.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/types/VaultConfigField.js +84 -12
- package/dist/idl_codegen_kamino_vault/types/VaultConfigField.js.map +1 -1
- package/dist/idl_codegen_kamino_vault/types/index.d.ts +2 -2
- package/dist/idl_codegen_kamino_vault/types/index.d.ts.map +1 -1
- package/dist/idl_codegen_kamino_vault/types/index.js.map +1 -1
- package/dist/lending_operations/repay_with_collateral_calcs.d.ts.map +1 -1
- package/dist/lending_operations/repay_with_collateral_calcs.js +10 -1
- package/dist/lending_operations/repay_with_collateral_calcs.js.map +1 -1
- package/dist/lending_operations/repay_with_collateral_operations.d.ts.map +1 -1
- package/dist/lending_operations/repay_with_collateral_operations.js +7 -6
- package/dist/lending_operations/repay_with_collateral_operations.js.map +1 -1
- package/dist/leverage/operations.d.ts.map +1 -1
- package/dist/leverage/operations.js +12 -8
- package/dist/leverage/operations.js.map +1 -1
- package/dist/leverage/types.d.ts +1 -0
- package/dist/leverage/types.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
- package/src/classes/manager.ts +3 -3
- package/src/classes/utils.ts +2 -2
- package/src/classes/vault.ts +34 -32
- package/src/idl_codegen_kamino_vault/accounts/Reserve.ts +1 -1
- package/src/idl_codegen_kamino_vault/accounts/VaultState.ts +215 -178
- package/src/idl_codegen_kamino_vault/errors/custom.ts +213 -157
- package/src/idl_codegen_kamino_vault/instructions/deposit.ts +2 -2
- package/src/idl_codegen_kamino_vault/instructions/index.ts +15 -0
- package/src/idl_codegen_kamino_vault/instructions/initVault.ts +4 -4
- package/src/idl_codegen_kamino_vault/instructions/initializeSharesMetadata.ts +58 -0
- package/src/idl_codegen_kamino_vault/instructions/invest.ts +5 -7
- package/src/idl_codegen_kamino_vault/instructions/updateSharesMetadata.ts +52 -0
- package/src/idl_codegen_kamino_vault/instructions/updateVaultConfig.ts +1 -1
- package/src/idl_codegen_kamino_vault/instructions/withdraw.ts +106 -40
- package/src/idl_codegen_kamino_vault/instructions/withdrawFromAvailable.ts +56 -0
- package/src/idl_codegen_kamino_vault/instructions/withdrawPendingFees.ts +5 -7
- package/src/idl_codegen_kamino_vault/types/ReserveConfig.ts +100 -28
- package/src/idl_codegen_kamino_vault/types/ReserveLiquidity.ts +25 -24
- package/src/idl_codegen_kamino_vault/types/VaultAllocation.ts +9 -9
- package/src/idl_codegen_kamino_vault/types/VaultConfigField.ts +103 -13
- package/src/idl_codegen_kamino_vault/types/index.ts +8 -2
- package/src/lending_operations/repay_with_collateral_calcs.ts +18 -1
- package/src/lending_operations/repay_with_collateral_operations.ts +9 -7
- package/src/leverage/operations.ts +69 -29
- package/src/leverage/types.ts +1 -0
- package/src/utils/index.ts +1 -0
|
@@ -95,25 +95,25 @@ export class MinWithdrawAmount {
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
export interface
|
|
99
|
-
kind: "
|
|
98
|
+
export interface MinInvestAmountJSON {
|
|
99
|
+
kind: "MinInvestAmount"
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
export class
|
|
102
|
+
export class MinInvestAmount {
|
|
103
103
|
static readonly discriminator = 4
|
|
104
|
-
static readonly kind = "
|
|
104
|
+
static readonly kind = "MinInvestAmount"
|
|
105
105
|
readonly discriminator = 4
|
|
106
|
-
readonly kind = "
|
|
106
|
+
readonly kind = "MinInvestAmount"
|
|
107
107
|
|
|
108
|
-
toJSON():
|
|
108
|
+
toJSON(): MinInvestAmountJSON {
|
|
109
109
|
return {
|
|
110
|
-
kind: "
|
|
110
|
+
kind: "MinInvestAmount",
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
toEncodable() {
|
|
115
115
|
return {
|
|
116
|
-
|
|
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 ("
|
|
209
|
-
return new
|
|
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 "
|
|
241
|
-
return new
|
|
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([], "
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
205
|
-
debtReserve
|
|
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(
|
|
414
|
-
|
|
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(
|
|
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
|
|
963
|
-
const borrowed = fromLamports(borrowedLamports, debtReserve
|
|
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
|
|
992
|
+
flashLoanFee = collReserve.getFlashLoanFee() || new Decimal(0);
|
|
973
993
|
} else {
|
|
974
|
-
flashLoanFee = debtReserve
|
|
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
|
|
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
|
|
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
|
|
1096
|
+
debtReserve.stats.decimals
|
|
1077
1097
|
).floor(),
|
|
1078
|
-
debtReserve
|
|
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
|
|
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
|
|
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(
|
|
1353
|
-
|
|
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(
|
|
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);
|
package/src/leverage/types.ts
CHANGED
|
@@ -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;
|
package/src/utils/index.ts
CHANGED