@kamino-finance/klend-sdk 7.1.1 → 7.1.3
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/@codegen/unstaking_pool/accounts/PoolState.d.ts +53 -0
- package/dist/@codegen/unstaking_pool/accounts/PoolState.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/accounts/PoolState.js +167 -0
- package/dist/@codegen/unstaking_pool/accounts/PoolState.js.map +1 -0
- package/dist/@codegen/unstaking_pool/accounts/UnstakeTicket.d.ts +41 -0
- package/dist/@codegen/unstaking_pool/accounts/UnstakeTicket.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/accounts/UnstakeTicket.js +143 -0
- package/dist/@codegen/unstaking_pool/accounts/UnstakeTicket.js.map +1 -0
- package/dist/@codegen/unstaking_pool/accounts/index.d.ts +5 -0
- package/dist/@codegen/unstaking_pool/accounts/index.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/accounts/index.js +8 -0
- package/dist/@codegen/unstaking_pool/accounts/index.js.map +1 -0
- package/dist/@codegen/unstaking_pool/errors/anchor.d.ts +435 -0
- package/dist/@codegen/unstaking_pool/errors/anchor.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/errors/anchor.js +767 -0
- package/dist/@codegen/unstaking_pool/errors/anchor.js.map +1 -0
- package/dist/@codegen/unstaking_pool/errors/custom.d.ts +259 -0
- package/dist/@codegen/unstaking_pool/errors/custom.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/errors/custom.js +458 -0
- package/dist/@codegen/unstaking_pool/errors/custom.js.map +1 -0
- package/dist/@codegen/unstaking_pool/errors/index.d.ts +6 -0
- package/dist/@codegen/unstaking_pool/errors/index.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/errors/index.js +86 -0
- package/dist/@codegen/unstaking_pool/errors/index.js.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/burn.d.ts +21 -0
- package/dist/@codegen/unstaking_pool/instructions/burn.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/burn.js +67 -0
- package/dist/@codegen/unstaking_pool/instructions/burn.js.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/changeTicketAuthority.d.ts +8 -0
- package/dist/@codegen/unstaking_pool/instructions/changeTicketAuthority.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/changeTicketAuthority.js +16 -0
- package/dist/@codegen/unstaking_pool/instructions/changeTicketAuthority.js.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/collect.d.ts +16 -0
- package/dist/@codegen/unstaking_pool/instructions/collect.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/collect.js +24 -0
- package/dist/@codegen/unstaking_pool/instructions/collect.js.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/index.d.ts +17 -0
- package/dist/@codegen/unstaking_pool/instructions/index.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/index.js +20 -0
- package/dist/@codegen/unstaking_pool/instructions/index.js.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/initializePool.d.ts +14 -0
- package/dist/@codegen/unstaking_pool/instructions/initializePool.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/initializePool.js +22 -0
- package/dist/@codegen/unstaking_pool/instructions/initializePool.js.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/mint.d.ts +24 -0
- package/dist/@codegen/unstaking_pool/instructions/mint.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/mint.js +74 -0
- package/dist/@codegen/unstaking_pool/instructions/mint.js.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/splitTicket.d.ts +15 -0
- package/dist/@codegen/unstaking_pool/instructions/splitTicket.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/splitTicket.js +62 -0
- package/dist/@codegen/unstaking_pool/instructions/splitTicket.js.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/updateAdmin.d.ts +7 -0
- package/dist/@codegen/unstaking_pool/instructions/updateAdmin.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/updateAdmin.js +19 -0
- package/dist/@codegen/unstaking_pool/instructions/updateAdmin.js.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/updatePoolConfig.d.ts +13 -0
- package/dist/@codegen/unstaking_pool/instructions/updatePoolConfig.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/instructions/updatePoolConfig.js +60 -0
- package/dist/@codegen/unstaking_pool/instructions/updatePoolConfig.js.map +1 -0
- package/dist/@codegen/unstaking_pool/programId.d.ts +4 -0
- package/dist/@codegen/unstaking_pool/programId.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/programId.js +9 -0
- package/dist/@codegen/unstaking_pool/programId.js.map +1 -0
- package/dist/@codegen/unstaking_pool/types/PoolConfigField.d.ts +45 -0
- package/dist/@codegen/unstaking_pool/types/PoolConfigField.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/types/PoolConfigField.js +132 -0
- package/dist/@codegen/unstaking_pool/types/PoolConfigField.js.map +1 -0
- package/dist/@codegen/unstaking_pool/types/index.d.ts +5 -0
- package/dist/@codegen/unstaking_pool/types/index.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/types/index.js +39 -0
- package/dist/@codegen/unstaking_pool/types/index.js.map +1 -0
- package/dist/@codegen/unstaking_pool/utils/borshAddress.d.ts +4 -0
- package/dist/@codegen/unstaking_pool/utils/borshAddress.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/utils/borshAddress.js +30 -0
- package/dist/@codegen/unstaking_pool/utils/borshAddress.js.map +1 -0
- package/dist/@codegen/unstaking_pool/utils/index.d.ts +2 -0
- package/dist/@codegen/unstaking_pool/utils/index.d.ts.map +1 -0
- package/dist/@codegen/unstaking_pool/utils/index.js +18 -0
- package/dist/@codegen/unstaking_pool/utils/index.js.map +1 -0
- package/dist/classes/action.d.ts.map +1 -1
- package/dist/classes/action.js +5 -5
- package/dist/classes/action.js.map +1 -1
- package/dist/classes/index.d.ts +5 -0
- package/dist/classes/index.d.ts.map +1 -1
- package/dist/classes/index.js +5 -0
- package/dist/classes/index.js.map +1 -1
- package/dist/classes/manager.d.ts.map +1 -1
- package/dist/classes/manager.js +2 -3
- package/dist/classes/manager.js.map +1 -1
- package/dist/classes/stakePool.d.ts +8 -0
- package/dist/classes/stakePool.d.ts.map +1 -0
- package/dist/classes/stakePool.js +18 -0
- package/dist/classes/stakePool.js.map +1 -0
- package/dist/classes/standardStakePool.d.ts +76 -0
- package/dist/classes/standardStakePool.d.ts.map +1 -0
- package/dist/classes/standardStakePool.js +400 -0
- package/dist/classes/standardStakePool.js.map +1 -0
- package/dist/classes/unstakingPool.d.ts +115 -0
- package/dist/classes/unstakingPool.d.ts.map +1 -0
- package/dist/classes/unstakingPool.js +372 -0
- package/dist/classes/unstakingPool.js.map +1 -0
- package/dist/classes/unstakingPoolTypes.d.ts +10 -0
- package/dist/classes/unstakingPoolTypes.d.ts.map +1 -0
- package/dist/classes/unstakingPoolTypes.js +3 -0
- package/dist/classes/unstakingPoolTypes.js.map +1 -0
- package/dist/classes/vault.d.ts +0 -9
- package/dist/classes/vault.d.ts.map +1 -1
- package/dist/classes/vault.js +6 -41
- package/dist/classes/vault.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 +0 -2
- package/dist/lending_operations/repay_with_collateral_operations.js.map +1 -1
- package/dist/lending_operations/swap_collateral_operations.js +0 -1
- package/dist/lending_operations/swap_collateral_operations.js.map +1 -1
- package/dist/leverage/calcs.d.ts +2 -27
- package/dist/leverage/calcs.d.ts.map +1 -1
- package/dist/leverage/calcs.js +6 -136
- package/dist/leverage/calcs.js.map +1 -1
- package/dist/leverage/operations.d.ts +8 -9
- package/dist/leverage/operations.d.ts.map +1 -1
- package/dist/leverage/operations.js +72 -228
- package/dist/leverage/operations.js.map +1 -1
- package/dist/leverage/types.d.ts +0 -19
- package/dist/leverage/types.d.ts.map +1 -1
- package/dist/leverage/utils.d.ts +2 -19
- package/dist/leverage/utils.d.ts.map +1 -1
- package/dist/leverage/utils.js +0 -164
- package/dist/leverage/utils.js.map +1 -1
- package/dist/lib.d.ts +1 -0
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +3 -1
- package/dist/lib.js.map +1 -1
- package/dist/utils/lookupTable.d.ts +9 -0
- package/dist/utils/lookupTable.d.ts.map +1 -1
- package/dist/utils/lookupTable.js +37 -0
- package/dist/utils/lookupTable.js.map +1 -1
- package/package.json +4 -2
- package/src/@codegen/unstaking_pool/accounts/PoolState.ts +188 -0
- package/src/@codegen/unstaking_pool/accounts/UnstakeTicket.ts +156 -0
- package/src/@codegen/unstaking_pool/accounts/index.ts +4 -0
- package/src/@codegen/unstaking_pool/errors/anchor.ts +773 -0
- package/src/@codegen/unstaking_pool/errors/custom.ts +477 -0
- package/src/@codegen/unstaking_pool/errors/index.ts +68 -0
- package/src/@codegen/unstaking_pool/instructions/burn.ts +70 -0
- package/src/@codegen/unstaking_pool/instructions/changeTicketAuthority.ts +37 -0
- package/src/@codegen/unstaking_pool/instructions/collect.ts +53 -0
- package/src/@codegen/unstaking_pool/instructions/index.ts +19 -0
- package/src/@codegen/unstaking_pool/instructions/initializePool.ts +49 -0
- package/src/@codegen/unstaking_pool/instructions/mint.ts +80 -0
- package/src/@codegen/unstaking_pool/instructions/splitTicket.ts +59 -0
- package/src/@codegen/unstaking_pool/instructions/updateAdmin.ts +39 -0
- package/src/@codegen/unstaking_pool/instructions/updatePoolConfig.ts +58 -0
- package/src/@codegen/unstaking_pool/programId.ts +9 -0
- package/src/@codegen/unstaking_pool/types/PoolConfigField.ts +121 -0
- package/src/@codegen/unstaking_pool/types/index.ts +12 -0
- package/src/@codegen/unstaking_pool/utils/borshAddress.ts +43 -0
- package/src/@codegen/unstaking_pool/utils/index.ts +1 -0
- package/src/classes/action.ts +10 -5
- package/src/classes/index.ts +5 -0
- package/src/classes/manager.ts +3 -4
- package/src/classes/stakePool.ts +21 -0
- package/src/classes/standardStakePool.ts +487 -0
- package/src/classes/unstakingPool.ts +504 -0
- package/src/classes/unstakingPoolTypes.ts +12 -0
- package/src/classes/vault.ts +43 -56
- package/src/idl/unstaking_pool.json +662 -0
- package/src/lending_operations/repay_with_collateral_operations.ts +0 -2
- package/src/lending_operations/swap_collateral_operations.ts +0 -1
- package/src/leverage/calcs.ts +2 -201
- package/src/leverage/operations.ts +45 -377
- package/src/leverage/types.ts +0 -20
- package/src/leverage/utils.ts +3 -320
- package/src/lib.ts +1 -0
- package/src/utils/lookupTable.ts +48 -0
|
@@ -18,23 +18,27 @@ const instructions_1 = require("./instructions");
|
|
|
18
18
|
const classes_2 = require("../classes");
|
|
19
19
|
const utils_1 = require("../utils");
|
|
20
20
|
const calcs_1 = require("./calcs");
|
|
21
|
-
const utils_2 = require("./utils");
|
|
22
21
|
const CreationParameters_1 = require("@kamino-finance/kliquidity-sdk/dist/utils/CreationParameters");
|
|
23
22
|
const token_1 = require("@solana-program/token");
|
|
24
23
|
const token_2022_1 = require("@solana-program/token-2022");
|
|
25
24
|
const consts_1 = require("../utils/consts");
|
|
26
|
-
const address_lookup_table_1 = require("@solana-program/address-lookup-table");
|
|
27
25
|
exports.WITHDRAW_SLOT_OFFSET = 150; // Offset for the withdraw slot to underestimate the exchange rate
|
|
28
|
-
async function getDepositWithLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint, collTokenMint, depositAmount, priceDebtToColl, slippagePct, obligation, referrer, currentSlot, targetLeverage, selectedTokenMint,
|
|
26
|
+
async function getDepositWithLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint, collTokenMint, depositAmount, priceDebtToColl, slippagePct, obligation, referrer, currentSlot, targetLeverage, selectedTokenMint, obligationTypeTagOverride, scopeRefreshConfig, budgetAndPriorityFeeIxs, quoteBufferBps, quoter, useV2Ixs, elevationGroupOverride, }) {
|
|
29
27
|
const collReserve = kaminoMarket.getExistingReserveByMint(collTokenMint);
|
|
30
28
|
const debtReserve = kaminoMarket.getExistingReserveByMint(debtTokenMint);
|
|
31
29
|
const solTokenReserve = kaminoMarket.getReserveByMint(utils_1.WRAPPED_SOL_MINT);
|
|
32
30
|
const flashLoanFee = collReserve.getFlashLoanFee() || new decimal_js_1.default(0);
|
|
33
31
|
const selectedTokenIsCollToken = selectedTokenMint === collTokenMint;
|
|
34
32
|
const depositTokenIsSol = !solTokenReserve ? false : selectedTokenMint === solTokenReserve.getLiquidityMint();
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
const calcs = (0, calcs_1.depositLeverageCalcs)({
|
|
34
|
+
depositAmount: depositAmount,
|
|
35
|
+
depositTokenIsCollToken: selectedTokenIsCollToken,
|
|
36
|
+
depositTokenIsSol,
|
|
37
|
+
priceDebtToColl,
|
|
38
|
+
targetLeverage,
|
|
39
|
+
slippagePct,
|
|
40
|
+
flashLoanFee,
|
|
41
|
+
});
|
|
38
42
|
console.log('Ops Calcs', (0, classes_1.toJson)(calcs));
|
|
39
43
|
const obligationType = checkObligationType(obligationTypeTagOverride, collTokenMint, debtTokenMint, kaminoMarket);
|
|
40
44
|
// Build the repay & withdraw collateral tx to get the number of accounts
|
|
@@ -48,82 +52,43 @@ async function getDepositWithLeverageSwapInputs({ owner, kaminoMarket, debtToken
|
|
|
48
52
|
quoteResponse: undefined,
|
|
49
53
|
},
|
|
50
54
|
},
|
|
51
|
-
],
|
|
55
|
+
], useV2Ixs, elevationGroupOverride))[0];
|
|
52
56
|
const uniqueKlendAccounts = (0, utils_1.uniqueAccountsWithProgramIds)(klendIxs.instructions);
|
|
53
|
-
const swapInputAmount = (0, classes_2.numberToLamportsDecimal)(
|
|
57
|
+
const swapInputAmount = (0, classes_2.numberToLamportsDecimal)(calcs.swapDebtTokenIn, debtReserve.stats.decimals).ceil();
|
|
54
58
|
const swapInputsForQuote = {
|
|
55
59
|
inputAmountLamports: swapInputAmount.mul(new decimal_js_1.default(1).add(quoteBufferBps.div(CreationParameters_1.FullBPS))),
|
|
56
60
|
inputMint: debtTokenMint,
|
|
57
61
|
outputMint: collTokenMint,
|
|
58
|
-
amountDebtAtaBalance: new decimal_js_1.default(0), // Only needed for ktokens swaps
|
|
59
62
|
};
|
|
60
63
|
const swapQuote = await quoter(swapInputsForQuote, uniqueKlendAccounts);
|
|
61
|
-
const quotePriceCalcs =
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
64
|
+
const quotePriceCalcs = (0, calcs_1.depositLeverageCalcs)({
|
|
65
|
+
depositAmount: depositAmount,
|
|
66
|
+
depositTokenIsCollToken: selectedTokenIsCollToken,
|
|
67
|
+
depositTokenIsSol,
|
|
68
|
+
priceDebtToColl: swapQuote.priceAInB,
|
|
69
|
+
targetLeverage,
|
|
70
|
+
slippagePct,
|
|
71
|
+
flashLoanFee,
|
|
72
|
+
});
|
|
73
|
+
const swapInputAmountQuotePrice = (0, classes_2.numberToLamportsDecimal)(quotePriceCalcs.swapDebtTokenIn, debtReserve.stats.decimals).ceil();
|
|
72
74
|
return {
|
|
73
75
|
swapInputs: {
|
|
74
76
|
inputAmountLamports: swapInputAmountQuotePrice,
|
|
75
|
-
minOutAmountLamports: (0, classes_2.numberToLamportsDecimal)(
|
|
77
|
+
minOutAmountLamports: (0, classes_2.numberToLamportsDecimal)(quotePriceCalcs.flashBorrowInCollToken, collReserve.stats.decimals),
|
|
76
78
|
inputMint: debtTokenMint,
|
|
77
79
|
outputMint: collTokenMint,
|
|
78
|
-
amountDebtAtaBalance: expectedDebtTokenAtaBalance,
|
|
79
80
|
},
|
|
80
81
|
flashLoanInfo: klendIxs.flashLoanInfo,
|
|
81
82
|
initialInputs: {
|
|
82
83
|
calcs: quotePriceCalcs,
|
|
83
84
|
swapQuote,
|
|
84
85
|
currentSlot,
|
|
85
|
-
collIsKtoken,
|
|
86
|
-
strategy,
|
|
87
86
|
obligation: obligation ? obligation : obligationType,
|
|
88
87
|
klendAccounts: uniqueKlendAccounts,
|
|
89
88
|
},
|
|
90
89
|
};
|
|
91
90
|
}
|
|
92
|
-
async function
|
|
93
|
-
let calcs;
|
|
94
|
-
if (!collIsKtoken) {
|
|
95
|
-
calcs = (0, calcs_1.depositLeverageCalcs)({
|
|
96
|
-
depositAmount: depositAmount,
|
|
97
|
-
depositTokenIsCollToken: selectedTokenIsCollToken,
|
|
98
|
-
depositTokenIsSol,
|
|
99
|
-
priceDebtToColl,
|
|
100
|
-
targetLeverage,
|
|
101
|
-
slippagePct,
|
|
102
|
-
flashLoanFee,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
calcs = await (0, calcs_1.depositLeverageKtokenCalcs)({
|
|
107
|
-
kamino: kamino,
|
|
108
|
-
strategy: strategy,
|
|
109
|
-
debtTokenMint,
|
|
110
|
-
depositAmount: depositAmount,
|
|
111
|
-
depositTokenIsCollToken: selectedTokenIsCollToken,
|
|
112
|
-
depositTokenIsSol,
|
|
113
|
-
priceDebtToColl,
|
|
114
|
-
targetLeverage,
|
|
115
|
-
slippagePct,
|
|
116
|
-
flashLoanFee,
|
|
117
|
-
priceAinB,
|
|
118
|
-
});
|
|
119
|
-
// Rounding to exact number of decimals so this value is passed through in all calcs without rounding inconsistencies
|
|
120
|
-
calcs.flashBorrowInDebtTokenKtokenOnly = calcs.flashBorrowInDebtTokenKtokenOnly.toDecimalPlaces(debtReserve.state.liquidity.mintDecimals.toNumber(), decimal_js_1.default.ROUND_CEIL);
|
|
121
|
-
calcs.debtTokenToBorrow = calcs.debtTokenToBorrow.toDecimalPlaces(debtReserve.state.liquidity.mintDecimals.toNumber(), decimal_js_1.default.ROUND_CEIL);
|
|
122
|
-
calcs.singleSidedDepositKtokenOnly = calcs.singleSidedDepositKtokenOnly.toDecimalPlaces(debtReserve.state.liquidity.mintDecimals.toNumber(), decimal_js_1.default.ROUND_CEIL);
|
|
123
|
-
}
|
|
124
|
-
return calcs;
|
|
125
|
-
}
|
|
126
|
-
async function getDepositWithLeverageIxs({ owner, kaminoMarket, debtTokenMint, collTokenMint, depositAmount, priceDebtToColl, slippagePct, obligation, referrer, currentSlot, targetLeverage, selectedTokenMint, kamino, obligationTypeTagOverride, scopeRefreshConfig, budgetAndPriorityFeeIxs, quoteBufferBps, priceAinB, isKtoken, quoter, swapper, elevationGroupOverride, useV2Ixs, }) {
|
|
91
|
+
async function getDepositWithLeverageIxs({ owner, kaminoMarket, debtTokenMint, collTokenMint, depositAmount, priceDebtToColl, slippagePct, obligation, referrer, currentSlot, targetLeverage, selectedTokenMint, obligationTypeTagOverride, scopeRefreshConfig, budgetAndPriorityFeeIxs, quoteBufferBps, quoter, swapper, elevationGroupOverride, useV2Ixs, }) {
|
|
127
92
|
const { swapInputs, initialInputs } = await getDepositWithLeverageSwapInputs({
|
|
128
93
|
owner,
|
|
129
94
|
kaminoMarket,
|
|
@@ -137,38 +102,16 @@ async function getDepositWithLeverageIxs({ owner, kaminoMarket, debtTokenMint, c
|
|
|
137
102
|
currentSlot,
|
|
138
103
|
targetLeverage,
|
|
139
104
|
selectedTokenMint,
|
|
140
|
-
kamino,
|
|
141
105
|
obligationTypeTagOverride,
|
|
142
106
|
scopeRefreshConfig,
|
|
143
107
|
budgetAndPriorityFeeIxs,
|
|
144
108
|
quoteBufferBps,
|
|
145
|
-
priceAinB,
|
|
146
|
-
isKtoken,
|
|
147
109
|
quoter,
|
|
148
110
|
useV2Ixs,
|
|
149
111
|
});
|
|
150
|
-
|
|
151
|
-
if (!initialInputs.collIsKtoken) {
|
|
152
|
-
depositSwapper = swapper;
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
if (kamino === undefined) {
|
|
156
|
-
throw Error('Ktoken use as collateral for leverage without Kamino instance');
|
|
157
|
-
}
|
|
158
|
-
depositSwapper = await (0, utils_2.getTokenToKtokenSwapper)(kaminoMarket, kamino, owner, slippagePct, swapper, priceAinB, false);
|
|
159
|
-
}
|
|
112
|
+
const depositSwapper = swapper;
|
|
160
113
|
const swapsArray = await depositSwapper(swapInputs, initialInputs.klendAccounts, initialInputs.swapQuote);
|
|
161
|
-
|
|
162
|
-
if (initialInputs.strategy && initialInputs.strategy.strategy.strategyLookupTable !== utils_1.DEFAULT_PUBLIC_KEY) {
|
|
163
|
-
const strategyLut = await (0, address_lookup_table_1.fetchAddressLookupTable)(kaminoMarket.getRpc(), initialInputs.strategy.strategy.strategyLookupTable);
|
|
164
|
-
swapsArray.forEach((swap) => {
|
|
165
|
-
swap.lookupTables.push(strategyLut);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
console.log('Strategy lookup table not found');
|
|
170
|
-
}
|
|
171
|
-
}
|
|
114
|
+
// Strategy lookup table logic removed
|
|
172
115
|
const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
|
|
173
116
|
const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
|
|
174
117
|
const solTokenReserve = kaminoMarket.getReserveByMint(utils_1.WRAPPED_SOL_MINT);
|
|
@@ -180,7 +123,7 @@ async function getDepositWithLeverageIxs({ owner, kaminoMarket, debtTokenMint, c
|
|
|
180
123
|
lookupTables: swap.lookupTables,
|
|
181
124
|
quote: swap.quote,
|
|
182
125
|
};
|
|
183
|
-
}),
|
|
126
|
+
}), useV2Ixs, elevationGroupOverride);
|
|
184
127
|
return depositWithLeverageIxs.map((depositWithLeverageIxs, index) => {
|
|
185
128
|
return {
|
|
186
129
|
ixs: depositWithLeverageIxs.instructions,
|
|
@@ -192,23 +135,18 @@ async function getDepositWithLeverageIxs({ owner, kaminoMarket, debtTokenMint, c
|
|
|
192
135
|
};
|
|
193
136
|
});
|
|
194
137
|
}
|
|
195
|
-
async function buildDepositWithLeverageIxs(market, debtReserve, collReserve, owner, obligation, referrer, currentSlot, depositTokenIsSol, scopeRefreshConfig, calcs, budgetAndPriorityFeeIxs, swapQuoteIxsArray,
|
|
138
|
+
async function buildDepositWithLeverageIxs(market, debtReserve, collReserve, owner, obligation, referrer, currentSlot, depositTokenIsSol, scopeRefreshConfig, calcs, budgetAndPriorityFeeIxs, swapQuoteIxsArray, useV2Ixs, elevationGroupOverride) {
|
|
196
139
|
const collTokenMint = collReserve.getLiquidityMint();
|
|
197
140
|
const debtTokenMint = debtReserve.getLiquidityMint();
|
|
198
|
-
const [[collTokenAta]
|
|
141
|
+
const [[collTokenAta]] = await Promise.all([
|
|
199
142
|
(0, token_2022_1.findAssociatedTokenPda)({
|
|
200
143
|
owner: owner.address,
|
|
201
144
|
mint: collTokenMint,
|
|
202
145
|
tokenProgram: collReserve.getLiquidityTokenProgram(),
|
|
203
146
|
}),
|
|
204
|
-
(0, token_2022_1.findAssociatedTokenPda)({
|
|
205
|
-
owner: owner.address,
|
|
206
|
-
mint: debtTokenMint,
|
|
207
|
-
tokenProgram: debtReserve.getLiquidityTokenProgram(),
|
|
208
|
-
}),
|
|
209
147
|
]);
|
|
210
148
|
// 1. Create atas & budget ixs
|
|
211
|
-
const { budgetIxs, createAtasIxs, scopeRefreshIx } = await (0, exports.getSetupIxs)(owner, market, obligation, collTokenMint, collReserve,
|
|
149
|
+
const { budgetIxs, createAtasIxs, scopeRefreshIx } = await (0, exports.getSetupIxs)(owner, market, obligation, collTokenMint, collReserve, debtTokenMint, debtReserve, scopeRefreshConfig, budgetAndPriorityFeeIxs);
|
|
212
150
|
const fillWsolAtaIxs = [];
|
|
213
151
|
if (depositTokenIsSol) {
|
|
214
152
|
fillWsolAtaIxs.push(...(0, utils_1.getTransferWsolIxs)(owner, await (0, utils_1.getAssociatedTokenAddress)(utils_1.WRAPPED_SOL_MINT, owner.address), (0, kit_1.lamports)(BigInt((0, classes_2.numberToLamportsDecimal)(calcs.initDepositInSol, utils_1.SOL_DECIMALS).ceil().toString()))));
|
|
@@ -220,27 +158,23 @@ async function buildDepositWithLeverageIxs(market, debtReserve, collReserve, own
|
|
|
220
158
|
userTransferAuthority: owner,
|
|
221
159
|
lendingMarketAuthority: await market.getLendingMarketAuthority(),
|
|
222
160
|
lendingMarketAddress: market.getAddress(),
|
|
223
|
-
reserve:
|
|
224
|
-
amountLamports: (0, classes_2.numberToLamportsDecimal)(
|
|
225
|
-
destinationAta:
|
|
161
|
+
reserve: collReserve,
|
|
162
|
+
amountLamports: (0, classes_2.numberToLamportsDecimal)(calcs.flashBorrowInCollToken, collReserve.stats.decimals),
|
|
163
|
+
destinationAta: collTokenAta,
|
|
226
164
|
// TODO(referrals): once we support referrals, we will have to replace the placeholder args below:
|
|
227
165
|
referrerAccount: (0, kit_1.none)(),
|
|
228
166
|
referrerTokenState: (0, kit_1.none)(),
|
|
229
167
|
programId: market.programId,
|
|
230
168
|
});
|
|
231
169
|
// 3. Deposit initial tokens + borrowed tokens into reserve
|
|
232
|
-
const kaminoDepositAndBorrowAction = await classes_1.KaminoAction.buildDepositAndBorrowTxns(market, (0, classes_2.numberToLamportsDecimal)(
|
|
233
|
-
.floor()
|
|
234
|
-
.toString(), collTokenMint, (0, classes_2.numberToLamportsDecimal)(!collIsKtoken ? calcs.debtTokenToBorrow : calcs.debtTokenToBorrow, debtReserve.stats.decimals)
|
|
235
|
-
.ceil()
|
|
236
|
-
.toString(), debtTokenMint, owner, obligation, useV2Ixs, undefined, 0, false, elevationGroupOverride === 0 ? false : true, // emode
|
|
170
|
+
const kaminoDepositAndBorrowAction = await classes_1.KaminoAction.buildDepositAndBorrowTxns(market, (0, classes_2.numberToLamportsDecimal)(calcs.collTokenToDeposit, collReserve.stats.decimals).floor().toString(), collTokenMint, (0, classes_2.numberToLamportsDecimal)(calcs.debtTokenToBorrow, debtReserve.stats.decimals).ceil().toString(), debtTokenMint, owner, obligation, useV2Ixs, undefined, 0, false, elevationGroupOverride === 0 ? false : true, // emode
|
|
237
171
|
{ skipInitialization: true, skipLutCreation: true }, // to be checked and created in a setup tx in the UI
|
|
238
172
|
referrer, currentSlot);
|
|
239
173
|
return swapQuoteIxsArray.map((swapQuoteIxs) => {
|
|
240
174
|
// 4. Swap
|
|
241
175
|
const { swapIxs } = swapQuoteIxs;
|
|
242
176
|
const swapInstructions = (0, utils_1.removeBudgetIxs)(swapIxs);
|
|
243
|
-
const flashBorrowReserve =
|
|
177
|
+
const flashBorrowReserve = collReserve;
|
|
244
178
|
const flashLoanInfo = {
|
|
245
179
|
flashBorrowReserve: flashBorrowReserve.address,
|
|
246
180
|
flashLoanFee: flashBorrowReserve.getFlashLoanFee(),
|
|
@@ -253,21 +187,18 @@ async function buildDepositWithLeverageIxs(market, debtReserve, collReserve, own
|
|
|
253
187
|
...createAtasIxs,
|
|
254
188
|
...fillWsolAtaIxs,
|
|
255
189
|
...[flashBorrowIx],
|
|
256
|
-
...(collIsKtoken ? swapInstructions : []),
|
|
257
190
|
...classes_1.KaminoAction.actionToIxs(kaminoDepositAndBorrowAction),
|
|
258
|
-
...
|
|
191
|
+
...swapInstructions,
|
|
259
192
|
...[flashRepayIx],
|
|
260
193
|
],
|
|
261
194
|
};
|
|
262
195
|
});
|
|
263
196
|
}
|
|
264
|
-
async function getWithdrawWithLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint, collTokenMint, deposited, borrowed, obligation, referrer, currentSlot, withdrawAmount, priceCollToDebt, slippagePct, isClosingPosition, selectedTokenMint, budgetAndPriorityFeeIxs,
|
|
197
|
+
async function getWithdrawWithLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint, collTokenMint, deposited, borrowed, obligation, referrer, currentSlot, withdrawAmount, priceCollToDebt, slippagePct, isClosingPosition, selectedTokenMint, budgetAndPriorityFeeIxs, scopeRefreshConfig, quoteBufferBps, quoter, useV2Ixs, }) {
|
|
265
198
|
const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
|
|
266
199
|
const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
|
|
267
200
|
const flashLoanFee = debtReserve.getFlashLoanFee() || new decimal_js_1.default(0);
|
|
268
201
|
const selectedTokenIsCollToken = selectedTokenMint === collTokenMint;
|
|
269
|
-
const collIsKtoken = await isKtoken(collTokenMint);
|
|
270
|
-
const strategy = collIsKtoken ? (await kamino.getStrategyByKTokenMint(collTokenMint)) : undefined;
|
|
271
202
|
const inputTokenIsSol = selectedTokenMint === utils_1.WRAPPED_SOL_MINT;
|
|
272
203
|
const calcs = (0, calcs_1.withdrawLeverageCalcs)(kaminoMarket, collReserve, debtReserve, priceCollToDebt, withdrawAmount, deposited, borrowed, currentSlot, isClosingPosition, selectedTokenIsCollToken, selectedTokenMint, obligation, flashLoanFee, slippagePct);
|
|
273
204
|
const klendIxs = (await buildWithdrawWithLeverageIxs(kaminoMarket, debtReserve, collReserve, owner, obligation, referrer, currentSlot, isClosingPosition, inputTokenIsSol, scopeRefreshConfig, calcs, budgetAndPriorityFeeIxs, [
|
|
@@ -280,17 +211,16 @@ async function getWithdrawWithLeverageSwapInputs({ owner, kaminoMarket, debtToke
|
|
|
280
211
|
quoteResponse: undefined,
|
|
281
212
|
},
|
|
282
213
|
},
|
|
283
|
-
],
|
|
214
|
+
], useV2Ixs))[0];
|
|
284
215
|
const uniqueKlendAccounts = (0, utils_1.uniqueAccountsWithProgramIds)(klendIxs.instructions);
|
|
285
216
|
const swapInputAmount = (0, classes_2.numberToLamportsDecimal)(calcs.collTokenSwapIn, collReserve.getMintDecimals()).ceil();
|
|
286
217
|
const swapInputsForQuote = {
|
|
287
218
|
inputAmountLamports: swapInputAmount.mul(new decimal_js_1.default(1).add(quoteBufferBps.div(CreationParameters_1.FullBPS))),
|
|
288
219
|
inputMint: collTokenMint,
|
|
289
220
|
outputMint: debtTokenMint,
|
|
290
|
-
amountDebtAtaBalance: undefined, // Only needed for ktokens deposits
|
|
291
221
|
};
|
|
292
222
|
const swapQuote = await quoter(swapInputsForQuote, uniqueKlendAccounts);
|
|
293
|
-
const calcsQuotePrice = (0, calcs_1.withdrawLeverageCalcs)(kaminoMarket, collReserve, debtReserve,
|
|
223
|
+
const calcsQuotePrice = (0, calcs_1.withdrawLeverageCalcs)(kaminoMarket, collReserve, debtReserve, swapQuote.priceAInB, withdrawAmount, deposited, borrowed, currentSlot, isClosingPosition, selectedTokenIsCollToken, selectedTokenMint, obligation, flashLoanFee, slippagePct);
|
|
294
224
|
const swapInputAmountQuotePrice = (0, classes_2.numberToLamportsDecimal)(calcsQuotePrice.collTokenSwapIn, collReserve.getMintDecimals()).ceil();
|
|
295
225
|
return {
|
|
296
226
|
swapInputs: {
|
|
@@ -298,21 +228,18 @@ async function getWithdrawWithLeverageSwapInputs({ owner, kaminoMarket, debtToke
|
|
|
298
228
|
minOutAmountLamports: calcsQuotePrice.repayAmount,
|
|
299
229
|
inputMint: collTokenMint,
|
|
300
230
|
outputMint: debtTokenMint,
|
|
301
|
-
amountDebtAtaBalance: new decimal_js_1.default(0), // Only needed for ktokens deposits
|
|
302
231
|
},
|
|
303
232
|
flashLoanInfo: klendIxs.flashLoanInfo,
|
|
304
233
|
initialInputs: {
|
|
305
234
|
calcs: calcsQuotePrice,
|
|
306
235
|
swapQuote,
|
|
307
236
|
currentSlot,
|
|
308
|
-
collIsKtoken,
|
|
309
|
-
strategy,
|
|
310
237
|
obligation,
|
|
311
238
|
klendAccounts: uniqueKlendAccounts,
|
|
312
239
|
},
|
|
313
240
|
};
|
|
314
241
|
}
|
|
315
|
-
async function getWithdrawWithLeverageIxs({ owner, kaminoMarket, debtTokenMint, collTokenMint, obligation, deposited, borrowed, referrer, currentSlot, withdrawAmount, priceCollToDebt, slippagePct, isClosingPosition, selectedTokenMint, budgetAndPriorityFeeIxs,
|
|
242
|
+
async function getWithdrawWithLeverageIxs({ owner, kaminoMarket, debtTokenMint, collTokenMint, obligation, deposited, borrowed, referrer, currentSlot, withdrawAmount, priceCollToDebt, slippagePct, isClosingPosition, selectedTokenMint, budgetAndPriorityFeeIxs, scopeRefreshConfig, quoteBufferBps, quoter, swapper, useV2Ixs, }) {
|
|
316
243
|
const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
|
|
317
244
|
const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
|
|
318
245
|
const inputTokenIsSol = selectedTokenMint === utils_1.WRAPPED_SOL_MINT;
|
|
@@ -332,35 +259,14 @@ async function getWithdrawWithLeverageIxs({ owner, kaminoMarket, debtTokenMint,
|
|
|
332
259
|
isClosingPosition,
|
|
333
260
|
selectedTokenMint,
|
|
334
261
|
budgetAndPriorityFeeIxs,
|
|
335
|
-
kamino,
|
|
336
262
|
scopeRefreshConfig,
|
|
337
263
|
quoteBufferBps,
|
|
338
|
-
isKtoken,
|
|
339
264
|
quoter,
|
|
340
265
|
useV2Ixs,
|
|
341
266
|
});
|
|
342
|
-
|
|
343
|
-
if (initialInputs.collIsKtoken) {
|
|
344
|
-
if (kamino === undefined) {
|
|
345
|
-
throw Error('Ktoken use as collateral for leverage without Kamino instance');
|
|
346
|
-
}
|
|
347
|
-
withdrawSwapper = await (0, utils_2.getKtokenToTokenSwapper)(kaminoMarket, kamino, owner, swapper);
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
withdrawSwapper = swapper;
|
|
351
|
-
}
|
|
267
|
+
const withdrawSwapper = swapper;
|
|
352
268
|
const swapsArray = await withdrawSwapper(swapInputs, initialInputs.klendAccounts, initialInputs.swapQuote);
|
|
353
|
-
|
|
354
|
-
if (initialInputs.strategy?.strategy.strategyLookupTable) {
|
|
355
|
-
const strategyLut = await (0, address_lookup_table_1.fetchAddressLookupTable)(kaminoMarket.getRpc(), initialInputs.strategy.strategy.strategyLookupTable);
|
|
356
|
-
swapsArray.forEach((swap) => {
|
|
357
|
-
swap.lookupTables.push(strategyLut);
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
console.log('Strategy lookup table not found');
|
|
362
|
-
}
|
|
363
|
-
}
|
|
269
|
+
// Strategy lookup table logic removed
|
|
364
270
|
const withdrawWithLeverageIxs = await buildWithdrawWithLeverageIxs(kaminoMarket, debtReserve, collReserve, owner, obligation, referrer, currentSlot, isClosingPosition, inputTokenIsSol, scopeRefreshConfig, initialInputs.calcs, budgetAndPriorityFeeIxs, swapsArray.map((swap) => {
|
|
365
271
|
return {
|
|
366
272
|
preActionIxs: [],
|
|
@@ -368,7 +274,7 @@ async function getWithdrawWithLeverageIxs({ owner, kaminoMarket, debtTokenMint,
|
|
|
368
274
|
lookupTables: swap.lookupTables,
|
|
369
275
|
quote: swap.quote,
|
|
370
276
|
};
|
|
371
|
-
}),
|
|
277
|
+
}), useV2Ixs);
|
|
372
278
|
// Send ixs and lookup tables
|
|
373
279
|
return withdrawWithLeverageIxs.map((ixs, index) => {
|
|
374
280
|
return {
|
|
@@ -381,12 +287,12 @@ async function getWithdrawWithLeverageIxs({ owner, kaminoMarket, debtTokenMint,
|
|
|
381
287
|
};
|
|
382
288
|
});
|
|
383
289
|
}
|
|
384
|
-
async function buildWithdrawWithLeverageIxs(market, debtReserve, collReserve, owner, obligation, referrer, currentSlot, isClosingPosition, depositTokenIsSol, scopeRefreshConfig, calcs, budgetAndPriorityFeeIxs, swapQuoteIxsArray,
|
|
290
|
+
async function buildWithdrawWithLeverageIxs(market, debtReserve, collReserve, owner, obligation, referrer, currentSlot, isClosingPosition, depositTokenIsSol, scopeRefreshConfig, calcs, budgetAndPriorityFeeIxs, swapQuoteIxsArray, useV2Ixs) {
|
|
385
291
|
const collTokenMint = collReserve.getLiquidityMint();
|
|
386
292
|
const debtTokenMint = debtReserve.getLiquidityMint();
|
|
387
293
|
const debtTokenAta = await (0, utils_1.getAssociatedTokenAddress)(debtTokenMint, owner.address, debtReserve.getLiquidityTokenProgram());
|
|
388
294
|
// 1. Create atas & budget txns & user metadata
|
|
389
|
-
const { budgetIxs, createAtasIxs, scopeRefreshIx } = await (0, exports.getSetupIxs)(owner, market, obligation, collTokenMint, collReserve,
|
|
295
|
+
const { budgetIxs, createAtasIxs, scopeRefreshIx } = await (0, exports.getSetupIxs)(owner, market, obligation, collTokenMint, collReserve, debtTokenMint, debtReserve, scopeRefreshConfig, budgetAndPriorityFeeIxs);
|
|
390
296
|
const closeWsolAtaIxs = [];
|
|
391
297
|
if (depositTokenIsSol || debtTokenMint === utils_1.WRAPPED_SOL_MINT) {
|
|
392
298
|
const wsolAta = await (0, utils_1.getAssociatedTokenAddress)(utils_1.WRAPPED_SOL_MINT, owner.address);
|
|
@@ -446,13 +352,11 @@ async function buildWithdrawWithLeverageIxs(market, debtReserve, collReserve, ow
|
|
|
446
352
|
};
|
|
447
353
|
});
|
|
448
354
|
}
|
|
449
|
-
async function getAdjustLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint, collTokenMint, obligation, depositedLamports, borrowedLamports, referrer, currentSlot, targetLeverage, priceCollToDebt, priceDebtToColl, slippagePct, budgetAndPriorityFeeIxs,
|
|
355
|
+
async function getAdjustLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint, collTokenMint, obligation, depositedLamports, borrowedLamports, referrer, currentSlot, targetLeverage, priceCollToDebt, priceDebtToColl, slippagePct, budgetAndPriorityFeeIxs, scopeRefreshConfig, quoteBufferBps, quoter, useV2Ixs, withdrawSlotOffset, }) {
|
|
450
356
|
const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
|
|
451
357
|
const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
|
|
452
358
|
const deposited = (0, classes_1.lamportsToNumberDecimal)(depositedLamports, collReserve.stats.decimals);
|
|
453
359
|
const borrowed = (0, classes_1.lamportsToNumberDecimal)(borrowedLamports, debtReserve.stats.decimals);
|
|
454
|
-
const collIsKtoken = await isKtoken(collTokenMint);
|
|
455
|
-
const strategy = collIsKtoken ? (await kamino.getStrategyByKTokenMint(collTokenMint)) : undefined;
|
|
456
360
|
// Getting current flash loan fee
|
|
457
361
|
const currentLeverage = obligation.refreshedStats.leverage;
|
|
458
362
|
const isDepositViaLeverage = targetLeverage.gte(new decimal_js_1.default(currentLeverage));
|
|
@@ -475,9 +379,9 @@ async function getAdjustLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint,
|
|
|
475
379
|
throw new Error('Invalid target leverage');
|
|
476
380
|
}
|
|
477
381
|
if (isDeposit) {
|
|
478
|
-
const calcs = await (0, calcs_1.adjustDepositLeverageCalcs)(
|
|
382
|
+
const calcs = await (0, calcs_1.adjustDepositLeverageCalcs)(debtReserve, adjustDepositPosition, adjustBorrowPosition, priceDebtToColl, flashLoanFee, slippagePct);
|
|
479
383
|
// Build the repay & withdraw collateral tx to get the number of accounts
|
|
480
|
-
const klendIxs = (await buildIncreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, calcs,
|
|
384
|
+
const klendIxs = (await buildIncreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, calcs, scopeRefreshConfig, [
|
|
481
385
|
{
|
|
482
386
|
preActionIxs: [],
|
|
483
387
|
swapIxs: [],
|
|
@@ -489,12 +393,11 @@ async function getAdjustLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint,
|
|
|
489
393
|
},
|
|
490
394
|
], budgetAndPriorityFeeIxs, useV2Ixs))[0];
|
|
491
395
|
const uniqueKlendAccounts = (0, utils_1.uniqueAccountsWithProgramIds)(klendIxs.instructions);
|
|
492
|
-
const swapInputAmount = (0, classes_2.numberToLamportsDecimal)(
|
|
396
|
+
const swapInputAmount = (0, classes_2.numberToLamportsDecimal)(calcs.borrowAmount, debtReserve.stats.decimals).ceil();
|
|
493
397
|
const swapInputsForQuote = {
|
|
494
398
|
inputAmountLamports: swapInputAmount.mul(new decimal_js_1.default(1).add(quoteBufferBps.div(CreationParameters_1.FullBPS))),
|
|
495
399
|
inputMint: debtTokenMint,
|
|
496
400
|
outputMint: collTokenMint,
|
|
497
|
-
amountDebtAtaBalance: new decimal_js_1.default(0), // Only needed for ktokens swaps
|
|
498
401
|
};
|
|
499
402
|
const swapQuote = await quoter(swapInputsForQuote, uniqueKlendAccounts);
|
|
500
403
|
const { adjustDepositPosition: adjustDepositPositionQuotePrice, adjustBorrowPosition: adjustBorrowPositionQuotePrice, } = (0, calcs_1.calcAdjustAmounts)({
|
|
@@ -504,27 +407,20 @@ async function getAdjustLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint,
|
|
|
504
407
|
priceCollToDebt: new decimal_js_1.default(1).div(swapQuote.priceAInB),
|
|
505
408
|
flashLoanFee: new decimal_js_1.default(flashLoanFee),
|
|
506
409
|
});
|
|
507
|
-
const calcsQuotePrice = await (0, calcs_1.adjustDepositLeverageCalcs)(
|
|
508
|
-
const swapInputAmountQuotePrice = (0, classes_2.numberToLamportsDecimal)(
|
|
509
|
-
let expectedDebtTokenAtaBalance = new decimal_js_1.default(0);
|
|
510
|
-
if (collIsKtoken) {
|
|
511
|
-
expectedDebtTokenAtaBalance = await (0, utils_2.getExpectedTokenBalanceAfterBorrow)(kaminoMarket.getRpc(), debtTokenMint, owner.address, (0, classes_2.numberToLamportsDecimal)(!collIsKtoken ? calcsQuotePrice.borrowAmount : calcsQuotePrice.amountToFlashBorrowDebt, debtReserve.stats.decimals).floor(), debtReserve.getMintDecimals());
|
|
512
|
-
}
|
|
410
|
+
const calcsQuotePrice = await (0, calcs_1.adjustDepositLeverageCalcs)(debtReserve, adjustDepositPositionQuotePrice, adjustBorrowPositionQuotePrice, swapQuote.priceAInB, flashLoanFee, slippagePct);
|
|
411
|
+
const swapInputAmountQuotePrice = (0, classes_2.numberToLamportsDecimal)(calcsQuotePrice.borrowAmount, debtReserve.getMintDecimals()).ceil();
|
|
513
412
|
return {
|
|
514
413
|
swapInputs: {
|
|
515
414
|
inputAmountLamports: swapInputAmountQuotePrice,
|
|
516
|
-
minOutAmountLamports: (0, classes_2.numberToLamportsDecimal)(
|
|
415
|
+
minOutAmountLamports: (0, classes_2.numberToLamportsDecimal)(calcsQuotePrice.adjustDepositPosition, collReserve.stats.decimals),
|
|
517
416
|
inputMint: debtTokenMint,
|
|
518
417
|
outputMint: collTokenMint,
|
|
519
|
-
amountDebtAtaBalance: expectedDebtTokenAtaBalance,
|
|
520
418
|
},
|
|
521
419
|
flashLoanInfo: klendIxs.flashLoanInfo,
|
|
522
420
|
initialInputs: {
|
|
523
421
|
calcs: calcsQuotePrice,
|
|
524
422
|
swapQuote,
|
|
525
423
|
currentSlot,
|
|
526
|
-
collIsKtoken,
|
|
527
|
-
strategy,
|
|
528
424
|
obligation: obligation,
|
|
529
425
|
klendAccounts: uniqueKlendAccounts,
|
|
530
426
|
isDeposit: isDeposit,
|
|
@@ -533,7 +429,7 @@ async function getAdjustLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint,
|
|
|
533
429
|
}
|
|
534
430
|
else {
|
|
535
431
|
const calcs = (0, calcs_1.adjustWithdrawLeverageCalcs)(adjustDepositPosition, adjustBorrowPosition, flashLoanFee, slippagePct);
|
|
536
|
-
const klendIxs = (await buildDecreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, calcs,
|
|
432
|
+
const klendIxs = (await buildDecreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, calcs, scopeRefreshConfig, [
|
|
537
433
|
{
|
|
538
434
|
preActionIxs: [],
|
|
539
435
|
swapIxs: [],
|
|
@@ -550,7 +446,6 @@ async function getAdjustLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint,
|
|
|
550
446
|
inputAmountLamports: swapInputAmount.mul(new decimal_js_1.default(1).add(quoteBufferBps.div(CreationParameters_1.FullBPS))),
|
|
551
447
|
inputMint: collTokenMint,
|
|
552
448
|
outputMint: debtTokenMint,
|
|
553
|
-
amountDebtAtaBalance: undefined, // Only needed for ktokens deposits
|
|
554
449
|
};
|
|
555
450
|
const swapQuote = await quoter(swapInputsForQuote, uniqueKlendAccounts);
|
|
556
451
|
const { adjustDepositPosition: adjustDepositPositionQuotePrice, adjustBorrowPosition: adjustBorrowPositionQuotePrice, } = (0, calcs_1.calcAdjustAmounts)({
|
|
@@ -568,15 +463,12 @@ async function getAdjustLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint,
|
|
|
568
463
|
minOutAmountLamports: (0, classes_2.numberToLamportsDecimal)(calcsQuotePrice.adjustBorrowPosition.abs(), debtReserve.stats.decimals),
|
|
569
464
|
inputMint: collTokenMint,
|
|
570
465
|
outputMint: debtTokenMint,
|
|
571
|
-
amountDebtAtaBalance: undefined, // Only needed for ktokens deposits
|
|
572
466
|
},
|
|
573
467
|
flashLoanInfo: klendIxs.flashLoanInfo,
|
|
574
468
|
initialInputs: {
|
|
575
469
|
calcs: calcsQuotePrice,
|
|
576
470
|
swapQuote,
|
|
577
471
|
currentSlot,
|
|
578
|
-
collIsKtoken,
|
|
579
|
-
strategy,
|
|
580
472
|
obligation,
|
|
581
473
|
klendAccounts: uniqueKlendAccounts,
|
|
582
474
|
isDeposit,
|
|
@@ -584,7 +476,7 @@ async function getAdjustLeverageSwapInputs({ owner, kaminoMarket, debtTokenMint,
|
|
|
584
476
|
};
|
|
585
477
|
}
|
|
586
478
|
}
|
|
587
|
-
async function getAdjustLeverageIxs({ owner, kaminoMarket, debtTokenMint, collTokenMint, obligation, depositedLamports, borrowedLamports, referrer, currentSlot, targetLeverage, priceCollToDebt, priceDebtToColl, slippagePct, budgetAndPriorityFeeIxs,
|
|
479
|
+
async function getAdjustLeverageIxs({ owner, kaminoMarket, debtTokenMint, collTokenMint, obligation, depositedLamports, borrowedLamports, referrer, currentSlot, targetLeverage, priceCollToDebt, priceDebtToColl, slippagePct, budgetAndPriorityFeeIxs, scopeRefreshConfig, quoteBufferBps, quoter, swapper, useV2Ixs, withdrawSlotOffset, }) {
|
|
588
480
|
const { swapInputs, initialInputs } = await getAdjustLeverageSwapInputs({
|
|
589
481
|
owner,
|
|
590
482
|
kaminoMarket,
|
|
@@ -600,28 +492,16 @@ async function getAdjustLeverageIxs({ owner, kaminoMarket, debtTokenMint, collTo
|
|
|
600
492
|
priceDebtToColl,
|
|
601
493
|
slippagePct,
|
|
602
494
|
budgetAndPriorityFeeIxs,
|
|
603
|
-
kamino,
|
|
604
495
|
scopeRefreshConfig,
|
|
605
496
|
quoteBufferBps,
|
|
606
|
-
priceAinB,
|
|
607
|
-
isKtoken,
|
|
608
497
|
quoter,
|
|
609
498
|
useV2Ixs,
|
|
610
499
|
});
|
|
611
500
|
// leverage increased so we need to deposit and borrow more
|
|
612
501
|
if (initialInputs.isDeposit) {
|
|
613
|
-
|
|
614
|
-
if (initialInputs.collIsKtoken) {
|
|
615
|
-
if (kamino === undefined) {
|
|
616
|
-
throw Error('Ktoken use as collateral for leverage without Kamino instance');
|
|
617
|
-
}
|
|
618
|
-
depositSwapper = await (0, utils_2.getTokenToKtokenSwapper)(kaminoMarket, kamino, owner, slippagePct, swapper, priceAinB, false);
|
|
619
|
-
}
|
|
620
|
-
else {
|
|
621
|
-
depositSwapper = swapper;
|
|
622
|
-
}
|
|
502
|
+
const depositSwapper = swapper;
|
|
623
503
|
const swapsArray = await depositSwapper(swapInputs, initialInputs.klendAccounts, initialInputs.swapQuote);
|
|
624
|
-
const increaseLeverageIxs = await buildIncreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, initialInputs.calcs,
|
|
504
|
+
const increaseLeverageIxs = await buildIncreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, initialInputs.calcs, scopeRefreshConfig, swapsArray.map((swap) => {
|
|
625
505
|
return {
|
|
626
506
|
preActionIxs: [],
|
|
627
507
|
swapIxs: swap.swapIxs,
|
|
@@ -642,19 +522,10 @@ async function getAdjustLeverageIxs({ owner, kaminoMarket, debtTokenMint, collTo
|
|
|
642
522
|
}
|
|
643
523
|
else {
|
|
644
524
|
console.log('Decreasing leverage');
|
|
645
|
-
|
|
646
|
-
if (initialInputs.collIsKtoken) {
|
|
647
|
-
if (kamino === undefined) {
|
|
648
|
-
throw Error('Ktoken use as collateral for leverage without Kamino instance');
|
|
649
|
-
}
|
|
650
|
-
withdrawSwapper = await (0, utils_2.getKtokenToTokenSwapper)(kaminoMarket, kamino, owner, swapper);
|
|
651
|
-
}
|
|
652
|
-
else {
|
|
653
|
-
withdrawSwapper = swapper;
|
|
654
|
-
}
|
|
525
|
+
const withdrawSwapper = swapper;
|
|
655
526
|
// 5. Get swap ixs
|
|
656
527
|
const swapsArray = await withdrawSwapper(swapInputs, initialInputs.klendAccounts, initialInputs.swapQuote);
|
|
657
|
-
const decreaseLeverageIxs = await buildDecreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, initialInputs.calcs,
|
|
528
|
+
const decreaseLeverageIxs = await buildDecreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, initialInputs.calcs, scopeRefreshConfig, swapsArray.map((swap) => {
|
|
658
529
|
return {
|
|
659
530
|
preActionIxs: [],
|
|
660
531
|
swapIxs: swap.swapIxs,
|
|
@@ -677,24 +548,21 @@ async function getAdjustLeverageIxs({ owner, kaminoMarket, debtTokenMint, collTo
|
|
|
677
548
|
/**
|
|
678
549
|
* Deposit and borrow tokens if leverage increased
|
|
679
550
|
*/
|
|
680
|
-
async function buildIncreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, calcs,
|
|
551
|
+
async function buildIncreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, calcs, scopeRefreshConfig, swapQuoteIxsArray, budgetAndPriorityFeeIxs, useV2Ixs) {
|
|
681
552
|
const collReserve = kaminoMarket.getExistingReserveByMint(collTokenMint);
|
|
682
553
|
const debtReserve = kaminoMarket.getExistingReserveByMint(debtTokenMint);
|
|
683
|
-
const
|
|
684
|
-
(0, utils_1.getAssociatedTokenAddress)(debtTokenMint, owner.address, debtReserve.getLiquidityTokenProgram()),
|
|
685
|
-
(0, utils_1.getAssociatedTokenAddress)(collTokenMint, owner.address, collReserve.getLiquidityTokenProgram()),
|
|
686
|
-
]);
|
|
554
|
+
const collTokenAta = await (0, utils_1.getAssociatedTokenAddress)(collTokenMint, owner.address, collReserve.getLiquidityTokenProgram());
|
|
687
555
|
// 1. Create atas & budget txns
|
|
688
|
-
const { budgetIxs, createAtasIxs, scopeRefreshIx } = await (0, exports.getSetupIxs)(owner, kaminoMarket, obligation, collTokenMint, collReserve,
|
|
556
|
+
const { budgetIxs, createAtasIxs, scopeRefreshIx } = await (0, exports.getSetupIxs)(owner, kaminoMarket, obligation, collTokenMint, collReserve, debtTokenMint, debtReserve, scopeRefreshConfig, budgetAndPriorityFeeIxs);
|
|
689
557
|
// 2. Create borrow flash loan instruction
|
|
690
558
|
const { flashBorrowIx, flashRepayIx } = (0, instructions_1.getFlashLoanInstructions)({
|
|
691
559
|
borrowIxIndex: budgetIxs.length + createAtasIxs.length + (scopeRefreshIx.length > 0 ? 1 : 0), // TODO: how about user metadata ixs
|
|
692
560
|
userTransferAuthority: owner,
|
|
693
561
|
lendingMarketAuthority: await kaminoMarket.getLendingMarketAuthority(),
|
|
694
562
|
lendingMarketAddress: kaminoMarket.getAddress(),
|
|
695
|
-
reserve:
|
|
696
|
-
amountLamports: (0, classes_2.numberToLamportsDecimal)(
|
|
697
|
-
destinationAta:
|
|
563
|
+
reserve: collReserve,
|
|
564
|
+
amountLamports: (0, classes_2.numberToLamportsDecimal)(calcs.adjustDepositPosition, collReserve.stats.decimals),
|
|
565
|
+
destinationAta: collTokenAta,
|
|
698
566
|
// TODO(referrals): once we support referrals, we will have to replace the placeholder args below:
|
|
699
567
|
referrerAccount: (0, kit_1.none)(),
|
|
700
568
|
referrerTokenState: (0, kit_1.none)(),
|
|
@@ -711,13 +579,12 @@ async function buildIncreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debt
|
|
|
711
579
|
...budgetIxs,
|
|
712
580
|
...createAtasIxs,
|
|
713
581
|
...[flashBorrowIx],
|
|
714
|
-
...(collIsKtoken ? swapInstructions : []),
|
|
715
582
|
...classes_1.KaminoAction.actionToIxs(depositAction),
|
|
716
583
|
...classes_1.KaminoAction.actionToIxs(borrowAction),
|
|
717
|
-
...
|
|
584
|
+
...swapInstructions,
|
|
718
585
|
...[flashRepayIx],
|
|
719
586
|
];
|
|
720
|
-
const flashBorrowReserve =
|
|
587
|
+
const flashBorrowReserve = collReserve;
|
|
721
588
|
const res = {
|
|
722
589
|
flashLoanInfo: {
|
|
723
590
|
flashBorrowReserve: flashBorrowReserve.address,
|
|
@@ -731,7 +598,7 @@ async function buildIncreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debt
|
|
|
731
598
|
/**
|
|
732
599
|
* Withdraw and repay tokens if leverage decreased
|
|
733
600
|
*/
|
|
734
|
-
async function buildDecreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, calcs,
|
|
601
|
+
async function buildDecreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debtTokenMint, obligation, referrer, currentSlot, calcs, scopeRefreshConfig, swapQuoteIxsArray, budgetAndPriorityFeeIxs, useV2Ixs, withdrawSlotOffset = exports.WITHDRAW_SLOT_OFFSET) {
|
|
735
602
|
const collReserve = kaminoMarket.getExistingReserveByMint(collTokenMint);
|
|
736
603
|
const debtReserve = kaminoMarket.getExistingReserveByMint(debtTokenMint);
|
|
737
604
|
const [debtTokenAta] = await (0, token_2022_1.findAssociatedTokenPda)({
|
|
@@ -740,7 +607,7 @@ async function buildDecreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debt
|
|
|
740
607
|
tokenProgram: debtReserve.getLiquidityTokenProgram(),
|
|
741
608
|
});
|
|
742
609
|
// 1. Create atas & budget txns
|
|
743
|
-
const { budgetIxs, createAtasIxs, scopeRefreshIx } = await (0, exports.getSetupIxs)(owner, kaminoMarket, obligation, collTokenMint, collReserve,
|
|
610
|
+
const { budgetIxs, createAtasIxs, scopeRefreshIx } = await (0, exports.getSetupIxs)(owner, kaminoMarket, obligation, collTokenMint, collReserve, debtTokenMint, debtReserve, scopeRefreshConfig, budgetAndPriorityFeeIxs);
|
|
744
611
|
// TODO: Mihai/Marius check if we can improve this logic and not convert any SOL
|
|
745
612
|
// This is here so that we have enough wsol to repay in case the kAB swapped to sol after estimates is not enough
|
|
746
613
|
const closeWsolAtaIxs = [];
|
|
@@ -803,9 +670,9 @@ async function buildDecreaseLeverageIxs(owner, kaminoMarket, collTokenMint, debt
|
|
|
803
670
|
return res;
|
|
804
671
|
});
|
|
805
672
|
}
|
|
806
|
-
const getSetupIxs = async (owner, kaminoMarket, obligation, collTokenMint, collReserve,
|
|
673
|
+
const getSetupIxs = async (owner, kaminoMarket, obligation, collTokenMint, collReserve, debtTokenMint, debtReserve, scopeRefreshConfig, budgetAndPriorityFeeIxs) => {
|
|
807
674
|
const budgetIxs = budgetAndPriorityFeeIxs || (0, utils_1.getComputeBudgetAndPriorityFeeIxs)(3000000);
|
|
808
|
-
const mintsWithTokenPrograms = getTokenMintsWithTokenPrograms(collTokenMint, collReserve, debtTokenMint, debtReserve
|
|
675
|
+
const mintsWithTokenPrograms = getTokenMintsWithTokenPrograms(collTokenMint, collReserve, debtTokenMint, debtReserve);
|
|
809
676
|
const createAtasIxs = (await (0, utils_1.createAtasIdempotent)(owner, mintsWithTokenPrograms)).map((x) => x.createAtaIx);
|
|
810
677
|
const scopeRefreshIx = await (0, exports.getScopeRefreshIx)(kaminoMarket, collReserve, debtReserve, obligation, scopeRefreshConfig);
|
|
811
678
|
return {
|
|
@@ -857,8 +724,8 @@ const checkObligationType = (obligationTypeTag, collTokenMint, debtTokenMint, ka
|
|
|
857
724
|
}
|
|
858
725
|
return obligationType;
|
|
859
726
|
};
|
|
860
|
-
const getTokenMintsWithTokenPrograms = (collTokenMint, collReserve, debtTokenMint, debtReserve
|
|
861
|
-
|
|
727
|
+
const getTokenMintsWithTokenPrograms = (collTokenMint, collReserve, debtTokenMint, debtReserve) => {
|
|
728
|
+
return [
|
|
862
729
|
{
|
|
863
730
|
mint: collTokenMint,
|
|
864
731
|
tokenProgram: collReserve.getLiquidityTokenProgram(),
|
|
@@ -872,28 +739,5 @@ const getTokenMintsWithTokenPrograms = (collTokenMint, collReserve, debtTokenMin
|
|
|
872
739
|
tokenProgram: token_1.TOKEN_PROGRAM_ADDRESS,
|
|
873
740
|
},
|
|
874
741
|
];
|
|
875
|
-
if (collIsKtoken) {
|
|
876
|
-
let kTokenAta;
|
|
877
|
-
let kTokenTokenProgram;
|
|
878
|
-
if (strategy.strategy.tokenAMint === debtTokenMint) {
|
|
879
|
-
kTokenAta = strategy.strategy.tokenBMint;
|
|
880
|
-
kTokenTokenProgram =
|
|
881
|
-
strategy.strategy.tokenBTokenProgram === utils_1.DEFAULT_PUBLIC_KEY
|
|
882
|
-
? token_1.TOKEN_PROGRAM_ADDRESS
|
|
883
|
-
: strategy.strategy.tokenBTokenProgram;
|
|
884
|
-
}
|
|
885
|
-
else {
|
|
886
|
-
kTokenAta = strategy.strategy.tokenAMint;
|
|
887
|
-
kTokenTokenProgram =
|
|
888
|
-
strategy.strategy.tokenATokenProgram === utils_1.DEFAULT_PUBLIC_KEY
|
|
889
|
-
? token_1.TOKEN_PROGRAM_ADDRESS
|
|
890
|
-
: strategy.strategy.tokenATokenProgram;
|
|
891
|
-
}
|
|
892
|
-
mintsWithTokenPrograms.push({
|
|
893
|
-
mint: kTokenAta,
|
|
894
|
-
tokenProgram: kTokenTokenProgram,
|
|
895
|
-
});
|
|
896
|
-
}
|
|
897
|
-
return mintsWithTokenPrograms;
|
|
898
742
|
};
|
|
899
743
|
//# sourceMappingURL=operations.js.map
|