@kamino-finance/klend-sdk 7.1.2 → 7.1.4-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/@codegen/klend/accounts/LendingMarket.d.ts +144 -3
- package/dist/@codegen/klend/accounts/LendingMarket.d.ts.map +1 -1
- package/dist/@codegen/klend/accounts/LendingMarket.js +105 -3
- package/dist/@codegen/klend/accounts/LendingMarket.js.map +1 -1
- package/dist/@codegen/klend/accounts/Obligation.d.ts +30 -15
- package/dist/@codegen/klend/accounts/Obligation.d.ts.map +1 -1
- package/dist/@codegen/klend/accounts/Obligation.js +31 -21
- package/dist/@codegen/klend/accounts/Obligation.js.map +1 -1
- package/dist/@codegen/klend/accounts/PoolState.d.ts +53 -0
- package/dist/@codegen/klend/accounts/PoolState.d.ts.map +1 -0
- package/dist/@codegen/klend/accounts/PoolState.js +167 -0
- package/dist/@codegen/klend/accounts/PoolState.js.map +1 -0
- package/dist/@codegen/klend/accounts/Reserve.d.ts +6 -0
- package/dist/@codegen/klend/accounts/Reserve.d.ts.map +1 -1
- package/dist/@codegen/klend/accounts/Reserve.js +9 -2
- package/dist/@codegen/klend/accounts/Reserve.js.map +1 -1
- package/dist/@codegen/klend/accounts/UnstakeTicket.d.ts +41 -0
- package/dist/@codegen/klend/accounts/UnstakeTicket.d.ts.map +1 -0
- package/dist/@codegen/klend/accounts/UnstakeTicket.js +143 -0
- package/dist/@codegen/klend/accounts/UnstakeTicket.js.map +1 -0
- package/dist/@codegen/klend/accounts/UserState.d.ts +0 -75
- package/dist/@codegen/klend/accounts/UserState.d.ts.map +1 -1
- package/dist/@codegen/klend/accounts/UserState.js +0 -25
- package/dist/@codegen/klend/accounts/UserState.js.map +1 -1
- package/dist/@codegen/klend/accounts/WithdrawTicket.d.ts +132 -0
- package/dist/@codegen/klend/accounts/WithdrawTicket.d.ts.map +1 -0
- package/dist/@codegen/klend/accounts/WithdrawTicket.js +191 -0
- package/dist/@codegen/klend/accounts/WithdrawTicket.js.map +1 -0
- package/dist/@codegen/klend/accounts/index.d.ts +6 -0
- package/dist/@codegen/klend/accounts/index.d.ts.map +1 -1
- package/dist/@codegen/klend/accounts/index.js +7 -1
- package/dist/@codegen/klend/accounts/index.js.map +1 -1
- package/dist/@codegen/klend/errors/custom.d.ts +226 -2
- package/dist/@codegen/klend/errors/custom.d.ts.map +1 -1
- package/dist/@codegen/klend/errors/custom.js +396 -3
- package/dist/@codegen/klend/errors/custom.js.map +1 -1
- package/dist/@codegen/klend/instructions/enqueueToWithdraw.d.ts +39 -0
- package/dist/@codegen/klend/instructions/enqueueToWithdraw.d.ts.map +1 -0
- package/dist/@codegen/klend/instructions/enqueueToWithdraw.js +67 -0
- package/dist/@codegen/klend/instructions/enqueueToWithdraw.js.map +1 -0
- package/dist/@codegen/klend/instructions/fillBorrowOrder.d.ts +36 -0
- package/dist/@codegen/klend/instructions/fillBorrowOrder.d.ts.map +1 -0
- package/dist/@codegen/klend/instructions/fillBorrowOrder.js +49 -0
- package/dist/@codegen/klend/instructions/fillBorrowOrder.js.map +1 -0
- package/dist/@codegen/klend/instructions/idlMissingTypes.d.ts +1 -2
- package/dist/@codegen/klend/instructions/idlMissingTypes.d.ts.map +1 -1
- package/dist/@codegen/klend/instructions/idlMissingTypes.js +6 -2
- package/dist/@codegen/klend/instructions/idlMissingTypes.js.map +1 -1
- package/dist/@codegen/klend/instructions/index.d.ts +16 -0
- package/dist/@codegen/klend/instructions/index.d.ts.map +1 -1
- package/dist/@codegen/klend/instructions/index.js +18 -1
- package/dist/@codegen/klend/instructions/index.js.map +1 -1
- package/dist/@codegen/klend/instructions/initReserve.d.ts +1 -1
- package/dist/@codegen/klend/instructions/initReserve.d.ts.map +1 -1
- package/dist/@codegen/klend/instructions/initReserve.js +1 -5
- package/dist/@codegen/klend/instructions/initReserve.js.map +1 -1
- package/dist/@codegen/klend/instructions/liquidateObligationAndRedeemReserveCollateral.js +1 -1
- package/dist/@codegen/klend/instructions/recoverInvalidTicketCollateral.d.ts +47 -0
- package/dist/@codegen/klend/instructions/recoverInvalidTicketCollateral.d.ts.map +1 -0
- package/dist/@codegen/klend/instructions/recoverInvalidTicketCollateral.js +66 -0
- package/dist/@codegen/klend/instructions/recoverInvalidTicketCollateral.js.map +1 -0
- package/dist/@codegen/klend/instructions/setBorrowOrder.d.ts +31 -0
- package/dist/@codegen/klend/instructions/setBorrowOrder.d.ts.map +1 -0
- package/dist/@codegen/klend/instructions/setBorrowOrder.js +64 -0
- package/dist/@codegen/klend/instructions/setBorrowOrder.js.map +1 -0
- package/dist/@codegen/klend/instructions/unstakeLstCollateralEnd.d.ts +53 -0
- package/dist/@codegen/klend/instructions/unstakeLstCollateralEnd.d.ts.map +1 -0
- package/dist/@codegen/klend/instructions/unstakeLstCollateralEnd.js +190 -0
- package/dist/@codegen/klend/instructions/unstakeLstCollateralEnd.js.map +1 -0
- package/dist/@codegen/klend/instructions/unstakeLstCollateralStart.d.ts +70 -0
- package/dist/@codegen/klend/instructions/unstakeLstCollateralStart.d.ts.map +1 -0
- package/dist/@codegen/klend/instructions/unstakeLstCollateralStart.js +261 -0
- package/dist/@codegen/klend/instructions/unstakeLstCollateralStart.js.map +1 -0
- package/dist/@codegen/klend/instructions/updateGlobalConfig.d.ts +1 -1
- package/dist/@codegen/klend/instructions/updateGlobalConfig.d.ts.map +1 -1
- package/dist/@codegen/klend/instructions/updateGlobalConfig.js +1 -0
- package/dist/@codegen/klend/instructions/updateGlobalConfig.js.map +1 -1
- package/dist/@codegen/klend/instructions/updateReserveConfig.d.ts +1 -1
- package/dist/@codegen/klend/instructions/updateReserveConfig.d.ts.map +1 -1
- package/dist/@codegen/klend/instructions/updateReserveConfig.js +1 -0
- package/dist/@codegen/klend/instructions/updateReserveConfig.js.map +1 -1
- package/dist/@codegen/klend/instructions/withdrawObligationCollateral.js +1 -1
- package/dist/@codegen/klend/instructions/withdrawObligationCollateralV2.js +1 -1
- package/dist/@codegen/klend/instructions/withdrawObligationUsol.d.ts +41 -0
- package/dist/@codegen/klend/instructions/withdrawObligationUsol.d.ts.map +1 -0
- package/dist/@codegen/klend/instructions/withdrawObligationUsol.js +135 -0
- package/dist/@codegen/klend/instructions/withdrawObligationUsol.js.map +1 -0
- package/dist/@codegen/klend/instructions/withdrawQueuedLiquidity.d.ts +51 -0
- package/dist/@codegen/klend/instructions/withdrawQueuedLiquidity.d.ts.map +1 -0
- package/dist/@codegen/klend/instructions/withdrawQueuedLiquidity.js +28 -0
- package/dist/@codegen/klend/instructions/withdrawQueuedLiquidity.js.map +1 -0
- package/dist/@codegen/klend/types/BorrowOrder.d.ts +192 -0
- package/dist/@codegen/klend/types/BorrowOrder.d.ts.map +1 -0
- package/dist/@codegen/klend/types/BorrowOrder.js +194 -0
- package/dist/@codegen/klend/types/BorrowOrder.js.map +1 -0
- package/dist/@codegen/klend/types/BorrowOrderConfigArgs.d.ts +39 -0
- package/dist/@codegen/klend/types/BorrowOrderConfigArgs.d.ts.map +1 -0
- package/dist/@codegen/klend/types/BorrowOrderConfigArgs.js +100 -0
- package/dist/@codegen/klend/types/BorrowOrderConfigArgs.js.map +1 -0
- package/dist/@codegen/klend/types/ObligationLiquidity.d.ts +35 -5
- package/dist/@codegen/klend/types/ObligationLiquidity.d.ts.map +1 -1
- package/dist/@codegen/klend/types/ObligationLiquidity.js +17 -7
- package/dist/@codegen/klend/types/ObligationLiquidity.js.map +1 -1
- package/dist/@codegen/klend/types/ObligationOrder.d.ts +4 -4
- package/dist/@codegen/klend/types/ObligationOrder.js +2 -2
- package/dist/@codegen/klend/types/ReserveConfig.d.ts +141 -29
- package/dist/@codegen/klend/types/ReserveConfig.d.ts.map +1 -1
- package/dist/@codegen/klend/types/ReserveConfig.js +89 -25
- package/dist/@codegen/klend/types/ReserveConfig.js.map +1 -1
- package/dist/@codegen/klend/types/ReserveFees.d.ts +8 -8
- package/dist/@codegen/klend/types/ReserveFees.d.ts.map +1 -1
- package/dist/@codegen/klend/types/ReserveFees.js +8 -8
- package/dist/@codegen/klend/types/ReserveFees.js.map +1 -1
- package/dist/@codegen/klend/types/ReserveLiquidity.d.ts +26 -8
- package/dist/@codegen/klend/types/ReserveLiquidity.d.ts.map +1 -1
- package/dist/@codegen/klend/types/ReserveLiquidity.js +14 -8
- package/dist/@codegen/klend/types/ReserveLiquidity.js.map +1 -1
- package/dist/@codegen/klend/types/UpdateConfigMode.d.ts +92 -14
- package/dist/@codegen/klend/types/UpdateConfigMode.d.ts.map +1 -1
- package/dist/@codegen/klend/types/UpdateConfigMode.js +168 -23
- package/dist/@codegen/klend/types/UpdateConfigMode.js.map +1 -1
- package/dist/@codegen/klend/types/UpdateLendingMarketMode.d.ts +130 -0
- package/dist/@codegen/klend/types/UpdateLendingMarketMode.d.ts.map +1 -1
- package/dist/@codegen/klend/types/UpdateLendingMarketMode.js +241 -1
- package/dist/@codegen/klend/types/UpdateLendingMarketMode.js.map +1 -1
- package/dist/@codegen/klend/types/WithdrawQueue.d.ts +64 -0
- package/dist/@codegen/klend/types/WithdrawQueue.d.ts.map +1 -0
- package/dist/@codegen/klend/types/WithdrawQueue.js +104 -0
- package/dist/@codegen/klend/types/WithdrawQueue.js.map +1 -0
- package/dist/@codegen/klend/types/index.d.ts +10 -8
- package/dist/@codegen/klend/types/index.d.ts.map +1 -1
- package/dist/@codegen/klend/types/index.js +7 -3
- package/dist/@codegen/klend/types/index.js.map +1 -1
- package/dist/@codegen/klend/zero_padding/ObligationZP.d.ts +9 -4
- package/dist/@codegen/klend/zero_padding/ObligationZP.d.ts.map +1 -1
- package/dist/@codegen/klend/zero_padding/ObligationZP.js +22 -13
- package/dist/@codegen/klend/zero_padding/ObligationZP.js.map +1 -1
- package/dist/classes/action.d.ts +30 -3
- package/dist/classes/action.d.ts.map +1 -1
- package/dist/classes/action.js +364 -10
- package/dist/classes/action.js.map +1 -1
- package/dist/classes/manager.d.ts.map +1 -1
- package/dist/classes/manager.js +10 -0
- package/dist/classes/manager.js.map +1 -1
- package/dist/classes/market.d.ts +6 -2
- package/dist/classes/market.d.ts.map +1 -1
- package/dist/classes/market.js +26 -6
- package/dist/classes/market.js.map +1 -1
- package/dist/classes/obligation.js +1 -1
- package/dist/classes/obligation.js.map +1 -1
- package/dist/classes/reserve.d.ts.map +1 -1
- package/dist/classes/reserve.js +13 -7
- package/dist/classes/reserve.js.map +1 -1
- package/dist/classes/unstakingPool.d.ts +20 -3
- package/dist/classes/unstakingPool.d.ts.map +1 -1
- package/dist/classes/unstakingPool.js +62 -8
- package/dist/classes/unstakingPool.js.map +1 -1
- package/dist/idl/klend.json +2125 -232
- package/dist/lending_operations/index.d.ts +1 -0
- package/dist/lending_operations/index.d.ts.map +1 -1
- package/dist/lending_operations/index.js +1 -0
- package/dist/lending_operations/index.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/lending_operations/unstake_lst_collateral.d.ts +12 -0
- package/dist/lending_operations/unstake_lst_collateral.d.ts.map +1 -0
- package/dist/lending_operations/unstake_lst_collateral.js +104 -0
- package/dist/lending_operations/unstake_lst_collateral.js.map +1 -0
- 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/manager/client_kamino_manager.js +11 -8
- package/dist/manager/client_kamino_manager.js.map +1 -1
- package/dist/utils/managerTypes.d.ts.map +1 -1
- package/dist/utils/managerTypes.js +9 -4
- package/dist/utils/managerTypes.js.map +1 -1
- package/dist/utils/seeds.d.ts +10 -14
- package/dist/utils/seeds.d.ts.map +1 -1
- package/dist/utils/seeds.js +25 -22
- package/dist/utils/seeds.js.map +1 -1
- package/package.json +2 -2
- package/src/@codegen/klend/accounts/LendingMarket.ts +210 -5
- package/src/@codegen/klend/accounts/Obligation.ts +53 -31
- package/src/@codegen/klend/accounts/PoolState.ts +192 -0
- package/src/@codegen/klend/accounts/Reserve.ts +13 -2
- package/src/@codegen/klend/accounts/UnstakeTicket.ts +160 -0
- package/src/@codegen/klend/accounts/UserState.ts +0 -75
- package/src/@codegen/klend/accounts/WithdrawTicket.ts +256 -0
- package/src/@codegen/klend/accounts/index.ts +6 -0
- package/src/@codegen/klend/errors/custom.ts +427 -2
- package/src/@codegen/klend/instructions/enqueueToWithdraw.ts +89 -0
- package/src/@codegen/klend/instructions/fillBorrowOrder.ts +96 -0
- package/src/@codegen/klend/instructions/idlMissingTypes.ts +7 -4
- package/src/@codegen/klend/instructions/index.ts +34 -0
- package/src/@codegen/klend/instructions/initReserve.ts +2 -6
- package/src/@codegen/klend/instructions/liquidateObligationAndRedeemReserveCollateral.ts +1 -1
- package/src/@codegen/klend/instructions/recoverInvalidTicketCollateral.ts +96 -0
- package/src/@codegen/klend/instructions/setBorrowOrder.ts +77 -0
- package/src/@codegen/klend/instructions/unstakeLstCollateralEnd.ts +251 -0
- package/src/@codegen/klend/instructions/unstakeLstCollateralStart.ts +353 -0
- package/src/@codegen/klend/instructions/updateGlobalConfig.ts +2 -1
- package/src/@codegen/klend/instructions/updateReserveConfig.ts +2 -1
- package/src/@codegen/klend/instructions/withdrawObligationCollateral.ts +1 -1
- package/src/@codegen/klend/instructions/withdrawObligationCollateralV2.ts +1 -1
- package/src/@codegen/klend/instructions/withdrawObligationUsol.ts +168 -0
- package/src/@codegen/klend/instructions/withdrawQueuedLiquidity.ts +92 -0
- package/src/@codegen/klend/types/BorrowOrder.ts +267 -0
- package/src/@codegen/klend/types/BorrowOrderConfigArgs.ts +87 -0
- package/src/@codegen/klend/types/ObligationLiquidity.ts +39 -9
- package/src/@codegen/klend/types/ObligationOrder.ts +4 -4
- package/src/@codegen/klend/types/ReserveConfig.ts +171 -39
- package/src/@codegen/klend/types/ReserveFees.ts +12 -12
- package/src/@codegen/klend/types/ReserveLiquidity.ts +30 -12
- package/src/@codegen/klend/types/UpdateConfigMode.ts +206 -26
- package/src/@codegen/klend/types/UpdateLendingMarketMode.ts +300 -0
- package/src/@codegen/klend/types/WithdrawQueue.ts +117 -0
- package/src/@codegen/klend/types/index.ts +45 -16
- package/src/@codegen/klend/zero_padding/ObligationZP.ts +22 -13
- package/src/classes/action.ts +577 -8
- package/src/classes/manager.ts +11 -0
- package/src/classes/market.ts +36 -5
- package/src/classes/obligation.ts +1 -1
- package/src/classes/reserve.ts +13 -8
- package/src/classes/unstakingPool.ts +83 -6
- package/src/idl/klend.json +2126 -233
- package/src/lending_operations/index.ts +1 -0
- package/src/lending_operations/repay_with_collateral_operations.ts +0 -2
- package/src/lending_operations/swap_collateral_operations.ts +0 -1
- package/src/lending_operations/unstake_lst_collateral.ts +174 -0
- 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/manager/client_kamino_manager.ts +11 -8
- package/src/utils/managerTypes.ts +9 -4
- package/src/utils/seeds.ts +28 -26
- package/dist/@codegen/klend/types/AssetTier.d.ts +0 -45
- package/dist/@codegen/klend/types/AssetTier.d.ts.map +0 -1
- package/dist/@codegen/klend/types/AssetTier.js +0 -132
- package/dist/@codegen/klend/types/AssetTier.js.map +0 -1
- package/src/@codegen/klend/types/AssetTier.ts +0 -119
package/src/classes/action.ts
CHANGED
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
AccountRole,
|
|
3
3
|
Address,
|
|
4
4
|
fetchEncodedAccount,
|
|
5
|
+
generateKeyPairSigner,
|
|
5
6
|
AccountMeta,
|
|
6
7
|
Instruction,
|
|
7
8
|
isNone,
|
|
@@ -44,8 +45,10 @@ import {
|
|
|
44
45
|
RequestElevationGroupAccounts,
|
|
45
46
|
RequestElevationGroupArgs,
|
|
46
47
|
setObligationOrder,
|
|
48
|
+
unstakeLstCollateralStart,
|
|
47
49
|
withdrawObligationCollateralAndRedeemReserveCollateral,
|
|
48
50
|
withdrawObligationCollateralAndRedeemReserveCollateralV2,
|
|
51
|
+
withdrawObligationUsol,
|
|
49
52
|
withdrawReferrerFees,
|
|
50
53
|
} from '../@codegen/klend/instructions';
|
|
51
54
|
import {
|
|
@@ -62,6 +65,7 @@ import {
|
|
|
62
65
|
ScopePriceRefreshConfig,
|
|
63
66
|
SOL_PADDING_FOR_INTEREST,
|
|
64
67
|
U64_MAX,
|
|
68
|
+
unstakingPoolMarketAuthorityPda,
|
|
65
69
|
userMetadataPda,
|
|
66
70
|
WRAPPED_SOL_MINT,
|
|
67
71
|
} from '../utils';
|
|
@@ -77,8 +81,14 @@ import { ObligationOrderAtIndex } from './obligationOrder';
|
|
|
77
81
|
import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TOKEN_PROGRAM_ADDRESS } from '@solana-program/token';
|
|
78
82
|
import { SYSVAR_INSTRUCTIONS_ADDRESS, SYSVAR_RENT_ADDRESS } from '@solana/sysvars';
|
|
79
83
|
import { getCloseAccountInstruction, getSyncNativeInstruction } from '@solana-program/token-2022';
|
|
80
|
-
import { getTransferSolInstruction, SYSTEM_PROGRAM_ADDRESS } from '@solana-program/system';
|
|
84
|
+
import { getCreateAccountInstruction, getTransferSolInstruction, SYSTEM_PROGRAM_ADDRESS } from '@solana-program/system';
|
|
81
85
|
import { noopSigner } from '../utils/signer';
|
|
86
|
+
import { PROGRAM_ID as UNSTAKING_POOL_ID } from '../@codegen/unstaking_pool/programId';
|
|
87
|
+
import { UNSTAKING_POOL_STAGING_ID, UnstakingPool, unstakingPoolBaseAuthorityPda } from './unstakingPool';
|
|
88
|
+
import { PROGRAM_ID } from '../@codegen/klend/programId';
|
|
89
|
+
import { UnstakeTicket } from '../@codegen/unstaking_pool/accounts/UnstakeTicket';
|
|
90
|
+
import { burn } from '../@codegen/unstaking_pool/instructions';
|
|
91
|
+
import { unstakeLstCollateralEnd } from '../@codegen/klend/instructions/unstakeLstCollateralEnd';
|
|
82
92
|
|
|
83
93
|
export type ActionType =
|
|
84
94
|
| 'deposit'
|
|
@@ -95,12 +105,14 @@ export type ActionType =
|
|
|
95
105
|
| 'requestElevationGroup'
|
|
96
106
|
| 'withdrawReferrerFees'
|
|
97
107
|
| 'repayAndWithdrawV2'
|
|
98
|
-
| 'depositAndWithdraw'
|
|
108
|
+
| 'depositAndWithdraw'
|
|
109
|
+
| 'unstakeLstCollateralStart';
|
|
99
110
|
|
|
100
111
|
export type AuxiliaryIx = 'setup' | 'inBetween' | 'cleanup';
|
|
101
112
|
|
|
102
113
|
export class KaminoAction {
|
|
103
114
|
kaminoMarket: KaminoMarket;
|
|
115
|
+
unstakingPool: UnstakingPool | undefined;
|
|
104
116
|
|
|
105
117
|
reserve: KaminoReserve;
|
|
106
118
|
|
|
@@ -163,6 +175,7 @@ export class KaminoAction {
|
|
|
163
175
|
borrowReserves: Array<Address>,
|
|
164
176
|
reserveState: KaminoReserve,
|
|
165
177
|
currentSlot: Slot,
|
|
178
|
+
unstakingPool?: UnstakingPool,
|
|
166
179
|
secondaryMint?: Address,
|
|
167
180
|
outflowReserveState?: KaminoReserve,
|
|
168
181
|
outflowAmount?: string | BN,
|
|
@@ -197,6 +210,7 @@ export class KaminoAction {
|
|
|
197
210
|
this.preLoadedDepositReservesSameTx = [];
|
|
198
211
|
this.referrer = referrer;
|
|
199
212
|
this.currentSlot = currentSlot;
|
|
213
|
+
this.unstakingPool = unstakingPool;
|
|
200
214
|
}
|
|
201
215
|
|
|
202
216
|
static async initialize(
|
|
@@ -208,7 +222,8 @@ export class KaminoAction {
|
|
|
208
222
|
obligation: KaminoObligation | ObligationType,
|
|
209
223
|
referrer: Option<Address> = none(),
|
|
210
224
|
currentSlot: Slot = 0n,
|
|
211
|
-
payer: TransactionSigner = owner
|
|
225
|
+
payer: TransactionSigner = owner,
|
|
226
|
+
needsUnstakingPool: boolean = false
|
|
212
227
|
) {
|
|
213
228
|
const reserve = kaminoMarket.getReserveByMint(mint);
|
|
214
229
|
if (reserve === undefined) {
|
|
@@ -220,6 +235,15 @@ export class KaminoAction {
|
|
|
220
235
|
|
|
221
236
|
const referrerKey = await this.getReferrerKey(kaminoMarket, owner.address, kaminoObligation, referrer);
|
|
222
237
|
|
|
238
|
+
let unstakingPool = undefined;
|
|
239
|
+
if (needsUnstakingPool) {
|
|
240
|
+
const unstakingPoolPk = kaminoMarket.state.unstakingPoolState;
|
|
241
|
+
const unstakingPoolProgramId =
|
|
242
|
+
kaminoMarket.programId == PROGRAM_ID ? UNSTAKING_POOL_ID : UNSTAKING_POOL_STAGING_ID;
|
|
243
|
+
unstakingPool = new UnstakingPool(unstakingPoolPk, undefined, unstakingPoolProgramId);
|
|
244
|
+
await unstakingPool.reloadState(kaminoMarket.getRpc());
|
|
245
|
+
}
|
|
246
|
+
|
|
223
247
|
return new KaminoAction(
|
|
224
248
|
kaminoMarket,
|
|
225
249
|
owner,
|
|
@@ -231,6 +255,7 @@ export class KaminoAction {
|
|
|
231
255
|
borrowReserves,
|
|
232
256
|
reserve,
|
|
233
257
|
currentSlot,
|
|
258
|
+
unstakingPool,
|
|
234
259
|
undefined,
|
|
235
260
|
undefined,
|
|
236
261
|
undefined,
|
|
@@ -938,6 +963,61 @@ export class KaminoAction {
|
|
|
938
963
|
return axn;
|
|
939
964
|
}
|
|
940
965
|
|
|
966
|
+
static async buildUnstakeLstCollateralStartTxns(
|
|
967
|
+
kaminoMarket: KaminoMarket,
|
|
968
|
+
lstToConvert: string | BN,
|
|
969
|
+
usolMint: Address,
|
|
970
|
+
lstMint: Address,
|
|
971
|
+
payer: TransactionSigner,
|
|
972
|
+
currentSlot: Slot,
|
|
973
|
+
obligation: KaminoObligation | ObligationType,
|
|
974
|
+
depositStakedSolRemainingAccounts: AccountMeta[],
|
|
975
|
+
scopeRefreshConfig: ScopePriceRefreshConfig | undefined,
|
|
976
|
+
extraComputeBudget: number = 1_000_000, // if > 0 then adds the ix
|
|
977
|
+
includeAtaIxs: boolean = true, // if true it includes create and close wsol and token atas,
|
|
978
|
+
initUserMetadata: { skipInitialization: boolean; skipLutCreation: boolean } = {
|
|
979
|
+
skipInitialization: false,
|
|
980
|
+
skipLutCreation: false,
|
|
981
|
+
},
|
|
982
|
+
referrer: Option<Address> = none()
|
|
983
|
+
) {
|
|
984
|
+
const axn = await KaminoAction.initializeMultiTokenAction(
|
|
985
|
+
kaminoMarket,
|
|
986
|
+
'unstakeLstCollateralStart',
|
|
987
|
+
lstToConvert,
|
|
988
|
+
usolMint,
|
|
989
|
+
lstMint,
|
|
990
|
+
payer,
|
|
991
|
+
payer.address,
|
|
992
|
+
obligation,
|
|
993
|
+
undefined,
|
|
994
|
+
referrer,
|
|
995
|
+
currentSlot,
|
|
996
|
+
true
|
|
997
|
+
);
|
|
998
|
+
const addInitObligationForFarm = true;
|
|
999
|
+
const twoTokenAction = true;
|
|
1000
|
+
const requestElevationGroup = false;
|
|
1001
|
+
const useV2Ixs = true;
|
|
1002
|
+
if (extraComputeBudget > 0) {
|
|
1003
|
+
axn.addComputeBudgetIx(extraComputeBudget);
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
await axn.addSupportIxs(
|
|
1007
|
+
'unstakeLstCollateralStart',
|
|
1008
|
+
includeAtaIxs,
|
|
1009
|
+
requestElevationGroup,
|
|
1010
|
+
addInitObligationForFarm,
|
|
1011
|
+
useV2Ixs,
|
|
1012
|
+
scopeRefreshConfig,
|
|
1013
|
+
initUserMetadata,
|
|
1014
|
+
twoTokenAction
|
|
1015
|
+
);
|
|
1016
|
+
await axn.addUnstakeLstCollateralStartIxs(depositStakedSolRemainingAccounts);
|
|
1017
|
+
|
|
1018
|
+
return axn;
|
|
1019
|
+
}
|
|
1020
|
+
|
|
941
1021
|
static async buildWithdrawTxns(
|
|
942
1022
|
kaminoMarket: KaminoMarket,
|
|
943
1023
|
amount: string | BN,
|
|
@@ -1004,6 +1084,85 @@ export class KaminoAction {
|
|
|
1004
1084
|
return axn;
|
|
1005
1085
|
}
|
|
1006
1086
|
|
|
1087
|
+
static async buildWithdrawUsolTxns(
|
|
1088
|
+
kaminoMarket: KaminoMarket,
|
|
1089
|
+
amount: string | BN,
|
|
1090
|
+
mint: Address,
|
|
1091
|
+
owner: TransactionSigner,
|
|
1092
|
+
obligation: KaminoObligation | ObligationType,
|
|
1093
|
+
scopeRefreshConfig: ScopePriceRefreshConfig | undefined,
|
|
1094
|
+
extraComputeBudget: number = 1_000_000, // if > 0 then adds the ix
|
|
1095
|
+
includeAtaIxs: boolean = true, // if true it includes create and close wsol and token atas,
|
|
1096
|
+
requestElevationGroup: boolean = false, // to be requested *after* the withdraw
|
|
1097
|
+
initUserMetadata: { skipInitialization: boolean; skipLutCreation: boolean } = {
|
|
1098
|
+
skipInitialization: false,
|
|
1099
|
+
skipLutCreation: false,
|
|
1100
|
+
},
|
|
1101
|
+
referrer: Option<Address> = none(),
|
|
1102
|
+
currentSlot: Slot = 0n,
|
|
1103
|
+
overrideElevationGroupRequest?: number,
|
|
1104
|
+
// Optional customizations which may be needed if the obligation was mutated by some previous ix.
|
|
1105
|
+
obligationCustomizations?: {
|
|
1106
|
+
// Any newly-added deposit reserves.
|
|
1107
|
+
addedDepositReserves?: Address[];
|
|
1108
|
+
},
|
|
1109
|
+
burnUsol: boolean = false
|
|
1110
|
+
) {
|
|
1111
|
+
const axn = await KaminoAction.initialize(
|
|
1112
|
+
'withdraw',
|
|
1113
|
+
amount,
|
|
1114
|
+
mint,
|
|
1115
|
+
owner,
|
|
1116
|
+
kaminoMarket,
|
|
1117
|
+
obligation,
|
|
1118
|
+
referrer,
|
|
1119
|
+
currentSlot,
|
|
1120
|
+
undefined,
|
|
1121
|
+
true
|
|
1122
|
+
);
|
|
1123
|
+
|
|
1124
|
+
if (extraComputeBudget > 0) {
|
|
1125
|
+
axn.addComputeBudgetIx(extraComputeBudget);
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
axn.depositReserves.push(...(obligationCustomizations?.addedDepositReserves || []));
|
|
1129
|
+
const addInitObligationForFarm = true;
|
|
1130
|
+
const useV2Ixs = true;
|
|
1131
|
+
await axn.addSupportIxs(
|
|
1132
|
+
'withdraw',
|
|
1133
|
+
includeAtaIxs,
|
|
1134
|
+
requestElevationGroup,
|
|
1135
|
+
addInitObligationForFarm,
|
|
1136
|
+
useV2Ixs,
|
|
1137
|
+
scopeRefreshConfig,
|
|
1138
|
+
initUserMetadata,
|
|
1139
|
+
false,
|
|
1140
|
+
overrideElevationGroupRequest
|
|
1141
|
+
);
|
|
1142
|
+
// We need user SOL ata to be initialized so they can receive the SOL
|
|
1143
|
+
// No need for other support ix (such as refresh reserve) as this burnUsolIx is called from unstaking pool
|
|
1144
|
+
if (burnUsol) {
|
|
1145
|
+
const [userAta, createUserTokenAccountIx] = await createAssociatedTokenAccountIdempotentInstruction(
|
|
1146
|
+
axn.owner,
|
|
1147
|
+
WRAPPED_SOL_MINT,
|
|
1148
|
+
axn.owner.address
|
|
1149
|
+
);
|
|
1150
|
+
|
|
1151
|
+
axn.setupIxs.unshift(createUserTokenAccountIx);
|
|
1152
|
+
axn.setupIxsLabels.unshift(`CreateLiquidityUserAta[${userAta}]`);
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
const collateralAmount = axn.getWithdrawCollateralAmount(axn.reserve, axn.amount);
|
|
1156
|
+
const unstakeTicket = await axn.addWithdrawUsolIx(collateralAmount);
|
|
1157
|
+
if (burnUsol) {
|
|
1158
|
+
await axn.addBurnAllUsolIx(unstakeTicket);
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();
|
|
1162
|
+
|
|
1163
|
+
return axn;
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1007
1166
|
/**
|
|
1008
1167
|
*
|
|
1009
1168
|
* @param kaminoMarket
|
|
@@ -1136,6 +1295,67 @@ export class KaminoAction {
|
|
|
1136
1295
|
return axn;
|
|
1137
1296
|
}
|
|
1138
1297
|
|
|
1298
|
+
static async buildUnstakeLstCollateralEndTxns(
|
|
1299
|
+
kaminoMarket: KaminoMarket,
|
|
1300
|
+
amount: string | BN,
|
|
1301
|
+
minCollateralReceiveAmount: string | BN,
|
|
1302
|
+
repayTokenMint: Address,
|
|
1303
|
+
withdrawTokenMint: Address,
|
|
1304
|
+
liquidator: TransactionSigner,
|
|
1305
|
+
obligationOwner: Address,
|
|
1306
|
+
obligation: KaminoObligation | ObligationType,
|
|
1307
|
+
scopeRefreshConfig: ScopePriceRefreshConfig | undefined = undefined,
|
|
1308
|
+
extraComputeBudget: number = 1_000_000, // if > 0 then adds the ix
|
|
1309
|
+
includeAtaIxs: boolean = true, // if true it includes create and close wsol and token atas, and creates all other token atas if they don't exist
|
|
1310
|
+
requestElevationGroup: boolean = false,
|
|
1311
|
+
initUserMetadata: { skipInitialization: boolean; skipLutCreation: boolean } = {
|
|
1312
|
+
skipInitialization: false,
|
|
1313
|
+
skipLutCreation: false,
|
|
1314
|
+
},
|
|
1315
|
+
referrer: Option<Address> = none(),
|
|
1316
|
+
maxAllowedLtvOverridePercent: number = 0,
|
|
1317
|
+
currentSlot: Slot = 0n,
|
|
1318
|
+
burnUsol: boolean = false
|
|
1319
|
+
): Promise<KaminoAction> {
|
|
1320
|
+
const axn = await KaminoAction.initializeMultiTokenAction(
|
|
1321
|
+
kaminoMarket,
|
|
1322
|
+
'liquidate',
|
|
1323
|
+
amount,
|
|
1324
|
+
repayTokenMint,
|
|
1325
|
+
withdrawTokenMint,
|
|
1326
|
+
liquidator,
|
|
1327
|
+
obligationOwner,
|
|
1328
|
+
obligation,
|
|
1329
|
+
minCollateralReceiveAmount,
|
|
1330
|
+
referrer,
|
|
1331
|
+
currentSlot,
|
|
1332
|
+
true
|
|
1333
|
+
);
|
|
1334
|
+
const addInitObligationForFarm = true;
|
|
1335
|
+
const useV2Ixs = true;
|
|
1336
|
+
|
|
1337
|
+
if (extraComputeBudget > 0) {
|
|
1338
|
+
axn.addComputeBudgetIx(extraComputeBudget);
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
await axn.addSupportIxs(
|
|
1342
|
+
'liquidate',
|
|
1343
|
+
includeAtaIxs,
|
|
1344
|
+
requestElevationGroup,
|
|
1345
|
+
addInitObligationForFarm,
|
|
1346
|
+
useV2Ixs,
|
|
1347
|
+
scopeRefreshConfig,
|
|
1348
|
+
initUserMetadata
|
|
1349
|
+
);
|
|
1350
|
+
const unstakeTicket = await axn.addUnstakeLstCollateralEndIx(maxAllowedLtvOverridePercent);
|
|
1351
|
+
if (burnUsol) {
|
|
1352
|
+
await axn.addBurnAllUsolIx(unstakeTicket);
|
|
1353
|
+
}
|
|
1354
|
+
axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();
|
|
1355
|
+
|
|
1356
|
+
return axn;
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1139
1359
|
static async buildWithdrawReferrerFeeTxns(
|
|
1140
1360
|
owner: TransactionSigner,
|
|
1141
1361
|
tokenMint: Address,
|
|
@@ -1317,6 +1537,128 @@ export class KaminoAction {
|
|
|
1317
1537
|
);
|
|
1318
1538
|
}
|
|
1319
1539
|
|
|
1540
|
+
async addUnstakeLstCollateralStartIxs(depositStakedSolRemainingAccounts: AccountMeta[]) {
|
|
1541
|
+
// Deposit USOL - our custom token issued by unstaking pool program
|
|
1542
|
+
// and withdraw some kind of staked sol
|
|
1543
|
+
this.lendingIxsLabels.push(
|
|
1544
|
+
`unstakeLstCollateral(depositReserve=${this.reserve!.address})(withdrawReserve=${
|
|
1545
|
+
this.outflowReserve!.address
|
|
1546
|
+
})(obligation=${this.getObligationPda()})`
|
|
1547
|
+
);
|
|
1548
|
+
|
|
1549
|
+
const depositReservesList = this.getAdditionalDepositReservesList();
|
|
1550
|
+
|
|
1551
|
+
const depositReserveAccountMetas: AccountMeta[] = depositReservesList.map((reserve) => {
|
|
1552
|
+
return { address: reserve, role: AccountRole.WRITABLE };
|
|
1553
|
+
});
|
|
1554
|
+
const borrowReserveAccountMetas: AccountMeta[] = this.borrowReserves.map((reserve) => {
|
|
1555
|
+
return { address: reserve, role: AccountRole.WRITABLE };
|
|
1556
|
+
});
|
|
1557
|
+
|
|
1558
|
+
if (!this.outflowReserve) {
|
|
1559
|
+
throw new Error(`outflowReserve not set`);
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
if (!this.unstakingPool || !this.unstakingPool.state) {
|
|
1563
|
+
throw new Error(`unstaking pool not set`);
|
|
1564
|
+
}
|
|
1565
|
+
|
|
1566
|
+
const basePoolAuthority = (
|
|
1567
|
+
await unstakingPoolBaseAuthorityPda(this.unstakingPool.address, this.unstakingPool.programId)
|
|
1568
|
+
)[0];
|
|
1569
|
+
const ownerUsolToken = await this.getUserTokenAccountAddress(this.reserve);
|
|
1570
|
+
const ownerLstToken = await this.getUserTokenAccountAddress(this.outflowReserve);
|
|
1571
|
+
const unstakingPoolAuthority = (
|
|
1572
|
+
await unstakingPoolMarketAuthorityPda(this.kaminoMarket.address, this.kaminoMarket.programId)
|
|
1573
|
+
)[0];
|
|
1574
|
+
|
|
1575
|
+
const obligationPda = await this.getObligationPda();
|
|
1576
|
+
const { collateralFarmAccounts: depositFarmsAccounts } = await KaminoAction.getFarmAccountsForReserve(
|
|
1577
|
+
obligationPda,
|
|
1578
|
+
this.reserve
|
|
1579
|
+
);
|
|
1580
|
+
const { collateralFarmAccounts: withdrawFarmsAccounts } = await KaminoAction.getFarmAccountsForReserve(
|
|
1581
|
+
obligationPda,
|
|
1582
|
+
this.outflowReserve
|
|
1583
|
+
);
|
|
1584
|
+
|
|
1585
|
+
// Create unstake ticket
|
|
1586
|
+
const unstakeTicket = await generateKeyPairSigner();
|
|
1587
|
+
const unstakeTicketSize = UnstakeTicket.layout.span + 8;
|
|
1588
|
+
const createUnstakeTicketIx = getCreateAccountInstruction({
|
|
1589
|
+
payer: this.owner,
|
|
1590
|
+
newAccount: unstakeTicket,
|
|
1591
|
+
lamports: await this.kaminoMarket.getRpc().getMinimumBalanceForRentExemption(BigInt(unstakeTicketSize)).send(),
|
|
1592
|
+
space: unstakeTicketSize,
|
|
1593
|
+
programAddress: this.unstakingPool.programId,
|
|
1594
|
+
});
|
|
1595
|
+
this.lendingIxs.push(createUnstakeTicketIx);
|
|
1596
|
+
|
|
1597
|
+
const unstakeLstCollateralStartIx = unstakeLstCollateralStart(
|
|
1598
|
+
{
|
|
1599
|
+
lstToConvert: this.amount,
|
|
1600
|
+
},
|
|
1601
|
+
{
|
|
1602
|
+
depositAndWithdrawAccounts: {
|
|
1603
|
+
depositAccounts: {
|
|
1604
|
+
owner: this.owner,
|
|
1605
|
+
obligation: obligationPda,
|
|
1606
|
+
lendingMarket: this.kaminoMarket.getAddress(),
|
|
1607
|
+
lendingMarketAuthority: await this.kaminoMarket.getLendingMarketAuthority(),
|
|
1608
|
+
reserve: this.reserve.address,
|
|
1609
|
+
reserveLiquidityMint: this.reserve.getLiquidityMint(),
|
|
1610
|
+
reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,
|
|
1611
|
+
reserveCollateralMint: this.reserve.getCTokenMint(),
|
|
1612
|
+
reserveDestinationDepositCollateral: this.reserve.state.collateral.supplyVault, // destinationCollateral
|
|
1613
|
+
userSourceLiquidity: ownerUsolToken,
|
|
1614
|
+
placeholderUserDestinationCollateral: none(),
|
|
1615
|
+
collateralTokenProgram: TOKEN_PROGRAM_ADDRESS,
|
|
1616
|
+
liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),
|
|
1617
|
+
instructionSysvarAccount: SYSVAR_INSTRUCTIONS_ADDRESS,
|
|
1618
|
+
},
|
|
1619
|
+
withdrawAccounts: {
|
|
1620
|
+
owner: this.owner,
|
|
1621
|
+
obligation: obligationPda,
|
|
1622
|
+
lendingMarket: this.kaminoMarket.getAddress(),
|
|
1623
|
+
lendingMarketAuthority: await this.kaminoMarket.getLendingMarketAuthority(),
|
|
1624
|
+
withdrawReserve: this.outflowReserve.address,
|
|
1625
|
+
reserveLiquidityMint: this.outflowReserve.getLiquidityMint(),
|
|
1626
|
+
reserveCollateralMint: this.outflowReserve.getCTokenMint(),
|
|
1627
|
+
reserveLiquiditySupply: this.outflowReserve.state.liquidity.supplyVault,
|
|
1628
|
+
reserveSourceCollateral: this.outflowReserve.state.collateral.supplyVault,
|
|
1629
|
+
userDestinationLiquidity: ownerLstToken,
|
|
1630
|
+
placeholderUserDestinationCollateral: none(),
|
|
1631
|
+
collateralTokenProgram: TOKEN_PROGRAM_ADDRESS,
|
|
1632
|
+
liquidityTokenProgram: this.outflowReserve.getLiquidityTokenProgram(),
|
|
1633
|
+
instructionSysvarAccount: SYSVAR_INSTRUCTIONS_ADDRESS,
|
|
1634
|
+
},
|
|
1635
|
+
depositFarmsAccounts,
|
|
1636
|
+
withdrawFarmsAccounts,
|
|
1637
|
+
farmsProgram: FARMS_PROGRAM_ID,
|
|
1638
|
+
},
|
|
1639
|
+
depositStakedSolAccounts: {
|
|
1640
|
+
owner: this.owner,
|
|
1641
|
+
unstakingPoolAuthority,
|
|
1642
|
+
ownerStakedSolToken: ownerLstToken,
|
|
1643
|
+
ownerUnstakingSolToken: ownerUsolToken,
|
|
1644
|
+
stakedSolMint: this.outflowReserve.getLiquidityMint(),
|
|
1645
|
+
poolState: this.unstakingPool.address,
|
|
1646
|
+
unstakingSolMint: this.reserve.getLiquidityMint(),
|
|
1647
|
+
basePoolAuthority,
|
|
1648
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
1649
|
+
unstakingSolTokenProgram: TOKEN_PROGRAM_ADDRESS,
|
|
1650
|
+
stakedSolTokenProgram: this.outflowReserve.getLiquidityTokenProgram(),
|
|
1651
|
+
unstakeTicket: unstakeTicket.address,
|
|
1652
|
+
unstakingTicketBurnAuthority: unstakingPoolAuthority,
|
|
1653
|
+
},
|
|
1654
|
+
unstakingPoolProgram: this.unstakingPool.programId,
|
|
1655
|
+
},
|
|
1656
|
+
[...depositStakedSolRemainingAccounts, ...depositReserveAccountMetas, ...borrowReserveAccountMetas],
|
|
1657
|
+
this.kaminoMarket.programId
|
|
1658
|
+
);
|
|
1659
|
+
this.lendingIxs.push(unstakeLstCollateralStartIx);
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1320
1662
|
/// @deprecated -- use addDepositObligationCollateralIxV2 instead
|
|
1321
1663
|
async addDepositObligationCollateralIx() {
|
|
1322
1664
|
this.lendingIxsLabels.push(`depositObligationCollateral`);
|
|
@@ -1536,6 +1878,76 @@ export class KaminoAction {
|
|
|
1536
1878
|
);
|
|
1537
1879
|
}
|
|
1538
1880
|
|
|
1881
|
+
async addWithdrawUsolIx(collateralAmount: BN): Promise<Address> {
|
|
1882
|
+
if (!isKaminoObligation(this.obligation)) {
|
|
1883
|
+
throw new Error(`obligation is not a KaminoObligation`);
|
|
1884
|
+
}
|
|
1885
|
+
if (!this.unstakingPool || !this.unstakingPool.state) {
|
|
1886
|
+
throw new Error(`unstaking pool not set`);
|
|
1887
|
+
}
|
|
1888
|
+
|
|
1889
|
+
const obligationAddress = await this.getObligationPda();
|
|
1890
|
+
const { collateralFarmAccounts: farmsAccounts } = await KaminoAction.getFarmAccountsForReserve(
|
|
1891
|
+
obligationAddress,
|
|
1892
|
+
this.reserve
|
|
1893
|
+
);
|
|
1894
|
+
this.lendingIxsLabels.push(`withdrawUsol`);
|
|
1895
|
+
|
|
1896
|
+
const newUnstakeTicket = await generateKeyPairSigner();
|
|
1897
|
+
const unstakeTicketSize = UnstakeTicket.layout.span + 8;
|
|
1898
|
+
const createUnstakeTicketIx = getCreateAccountInstruction({
|
|
1899
|
+
payer: this.owner,
|
|
1900
|
+
newAccount: newUnstakeTicket,
|
|
1901
|
+
lamports: await this.kaminoMarket.getRpc().getMinimumBalanceForRentExemption(BigInt(unstakeTicketSize)).send(),
|
|
1902
|
+
space: unstakeTicketSize,
|
|
1903
|
+
programAddress: this.unstakingPool.programId,
|
|
1904
|
+
});
|
|
1905
|
+
this.lendingIxs.push(createUnstakeTicketIx);
|
|
1906
|
+
|
|
1907
|
+
const unstakingPoolAuthority = (
|
|
1908
|
+
await unstakingPoolMarketAuthorityPda(this.kaminoMarket.address, this.kaminoMarket.programId)
|
|
1909
|
+
)[0];
|
|
1910
|
+
this.lendingIxs.push(
|
|
1911
|
+
withdrawObligationUsol(
|
|
1912
|
+
{
|
|
1913
|
+
collateralAmount,
|
|
1914
|
+
},
|
|
1915
|
+
{
|
|
1916
|
+
withdrawAccounts: {
|
|
1917
|
+
withdrawAccounts: {
|
|
1918
|
+
owner: this.owner,
|
|
1919
|
+
obligation: obligationAddress,
|
|
1920
|
+
lendingMarket: this.kaminoMarket.getAddress(),
|
|
1921
|
+
lendingMarketAuthority: await this.kaminoMarket.getLendingMarketAuthority(),
|
|
1922
|
+
withdrawReserve: this.reserve.address,
|
|
1923
|
+
reserveLiquidityMint: this.reserve.getLiquidityMint(),
|
|
1924
|
+
reserveCollateralMint: this.reserve.getCTokenMint(),
|
|
1925
|
+
reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,
|
|
1926
|
+
reserveSourceCollateral: this.reserve.state.collateral.supplyVault,
|
|
1927
|
+
userDestinationLiquidity: await this.getUserTokenAccountAddress(this.reserve),
|
|
1928
|
+
placeholderUserDestinationCollateral: none(),
|
|
1929
|
+
collateralTokenProgram: TOKEN_PROGRAM_ADDRESS,
|
|
1930
|
+
liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),
|
|
1931
|
+
instructionSysvarAccount: SYSVAR_INSTRUCTIONS_ADDRESS,
|
|
1932
|
+
},
|
|
1933
|
+
farmsAccounts: farmsAccounts,
|
|
1934
|
+
farmsProgram: FARMS_PROGRAM_ID,
|
|
1935
|
+
},
|
|
1936
|
+
extraAccounts: {
|
|
1937
|
+
unstakeTicket: this.obligation.state.unstakeTicket,
|
|
1938
|
+
emptyUnstakeTicket: newUnstakeTicket.address,
|
|
1939
|
+
unstakingPoolAuthority: unstakingPoolAuthority,
|
|
1940
|
+
unstakingPoolProgram: this.unstakingPool.programId,
|
|
1941
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
1942
|
+
},
|
|
1943
|
+
},
|
|
1944
|
+
[],
|
|
1945
|
+
this.kaminoMarket.programId
|
|
1946
|
+
)
|
|
1947
|
+
);
|
|
1948
|
+
return newUnstakeTicket.address;
|
|
1949
|
+
}
|
|
1950
|
+
|
|
1539
1951
|
/// @deprecated -- use addRepayIxV2 instead
|
|
1540
1952
|
async addRepayIx() {
|
|
1541
1953
|
const obligationAddress = await this.getObligationPda();
|
|
@@ -2141,6 +2553,39 @@ export class KaminoAction {
|
|
|
2141
2553
|
);
|
|
2142
2554
|
}
|
|
2143
2555
|
|
|
2556
|
+
async addBurnAllUsolIx(unstakeTicket: Address): Promise<void> {
|
|
2557
|
+
this.lendingIxsLabels.push(`burnUsolIx`);
|
|
2558
|
+
if (!this.unstakingPool || !this.unstakingPool.state) {
|
|
2559
|
+
throw new Error(`unstaking pool not set`);
|
|
2560
|
+
}
|
|
2561
|
+
|
|
2562
|
+
this.lendingIxs.push(
|
|
2563
|
+
burn(
|
|
2564
|
+
{
|
|
2565
|
+
sharesToBurn: new BN(U64_MAX),
|
|
2566
|
+
minWsolToReceive: new BN(0), // TODO: find a way to compute a reasonable slippage
|
|
2567
|
+
},
|
|
2568
|
+
{
|
|
2569
|
+
user: this.owner,
|
|
2570
|
+
userUnstakingSolToken: await getAssociatedTokenAddress(
|
|
2571
|
+
this.unstakingPool.state.unstakingSolMint,
|
|
2572
|
+
this.owner.address,
|
|
2573
|
+
TOKEN_PROGRAM_ADDRESS
|
|
2574
|
+
),
|
|
2575
|
+
userWsolToken: await getAssociatedTokenAddress(WRAPPED_SOL_MINT, this.owner.address, TOKEN_PROGRAM_ADDRESS),
|
|
2576
|
+
wsolVault: this.unstakingPool.state.wsolVault,
|
|
2577
|
+
wsolMint: WRAPPED_SOL_MINT,
|
|
2578
|
+
poolState: this.unstakingPool.address,
|
|
2579
|
+
unstakeTicket,
|
|
2580
|
+
unstakingSolMint: this.unstakingPool.state.unstakingSolMint,
|
|
2581
|
+
basePoolAuthority: this.unstakingPool.state.basePoolAuthority,
|
|
2582
|
+
tokenProgram: TOKEN_PROGRAM_ADDRESS,
|
|
2583
|
+
},
|
|
2584
|
+
this.unstakingPool.programId
|
|
2585
|
+
)
|
|
2586
|
+
);
|
|
2587
|
+
}
|
|
2588
|
+
|
|
2144
2589
|
async addLiquidateIx(maxAllowedLtvOverridePercent: number = 0): Promise<void> {
|
|
2145
2590
|
this.lendingIxsLabels.push(`liquidateObligationAndRedeemReserveCollateral`);
|
|
2146
2591
|
if (!this.outflowReserve) {
|
|
@@ -2270,6 +2715,100 @@ export class KaminoAction {
|
|
|
2270
2715
|
this.lendingIxs.push(liquidateIx);
|
|
2271
2716
|
}
|
|
2272
2717
|
|
|
2718
|
+
async addUnstakeLstCollateralEndIx(maxAllowedLtvOverridePercent: number = 0): Promise<Address> {
|
|
2719
|
+
this.lendingIxsLabels.push(`unstakeLstCollateralEnd`);
|
|
2720
|
+
if (!this.outflowReserve) {
|
|
2721
|
+
throw Error(`Withdraw reserve during liquidation is not defined`);
|
|
2722
|
+
}
|
|
2723
|
+
|
|
2724
|
+
if (!isKaminoObligation(this.obligation)) {
|
|
2725
|
+
throw new Error(`obligation is not a KaminoObligation`);
|
|
2726
|
+
}
|
|
2727
|
+
|
|
2728
|
+
if (!this.unstakingPool || !this.unstakingPool.state) {
|
|
2729
|
+
throw new Error(`unstaking pool not set`);
|
|
2730
|
+
}
|
|
2731
|
+
|
|
2732
|
+
const depositReservesList = this.getAdditionalDepositReservesList();
|
|
2733
|
+
const depositReserveAccountMetas: AccountMeta[] = depositReservesList.map((reserve) => {
|
|
2734
|
+
return { address: reserve, role: AccountRole.WRITABLE };
|
|
2735
|
+
});
|
|
2736
|
+
|
|
2737
|
+
const obligationAddress = await this.getObligationPda();
|
|
2738
|
+
const { collateralFarmAccounts: collateralFarmsAccounts } = await KaminoAction.getFarmAccountsForReserve(
|
|
2739
|
+
obligationAddress,
|
|
2740
|
+
this.outflowReserve
|
|
2741
|
+
);
|
|
2742
|
+
const { debtFarmAccounts: debtFarmsAccounts } = await KaminoAction.getFarmAccountsForReserve(
|
|
2743
|
+
await this.getObligationPda(),
|
|
2744
|
+
this.reserve
|
|
2745
|
+
);
|
|
2746
|
+
|
|
2747
|
+
const newUnstakeTicket = await generateKeyPairSigner();
|
|
2748
|
+
const unstakeTicketSize = UnstakeTicket.layout.span + 8;
|
|
2749
|
+
const createUnstakeTicketIx = getCreateAccountInstruction({
|
|
2750
|
+
payer: this.owner,
|
|
2751
|
+
newAccount: newUnstakeTicket,
|
|
2752
|
+
lamports: await this.kaminoMarket.getRpc().getMinimumBalanceForRentExemption(BigInt(unstakeTicketSize)).send(),
|
|
2753
|
+
space: unstakeTicketSize,
|
|
2754
|
+
programAddress: this.unstakingPool.programId,
|
|
2755
|
+
});
|
|
2756
|
+
this.lendingIxs.push(createUnstakeTicketIx);
|
|
2757
|
+
|
|
2758
|
+
const unstakingPoolAuthority = (
|
|
2759
|
+
await unstakingPoolMarketAuthorityPda(this.kaminoMarket.address, this.kaminoMarket.programId)
|
|
2760
|
+
)[0];
|
|
2761
|
+
const extraAccounts = this.obligation!.state.elevationGroup > 0 ? depositReserveAccountMetas : [];
|
|
2762
|
+
const liquidateIx = unstakeLstCollateralEnd(
|
|
2763
|
+
{
|
|
2764
|
+
liquidityAmount: this.amount,
|
|
2765
|
+
// TODO: Configure this when updating liquidator with new interface
|
|
2766
|
+
minAcceptableReceivedLiquidityAmount: this.outflowAmount || new BN(0),
|
|
2767
|
+
maxAllowedLtvOverridePercent: new BN(maxAllowedLtvOverridePercent),
|
|
2768
|
+
},
|
|
2769
|
+
{
|
|
2770
|
+
liquidationAccounts: {
|
|
2771
|
+
liquidationAccounts: {
|
|
2772
|
+
liquidator: this.owner,
|
|
2773
|
+
obligation: obligationAddress,
|
|
2774
|
+
lendingMarket: this.kaminoMarket.getAddress(),
|
|
2775
|
+
lendingMarketAuthority: await this.kaminoMarket.getLendingMarketAuthority(),
|
|
2776
|
+
repayReserve: this.reserve.address,
|
|
2777
|
+
repayReserveLiquidityMint: this.reserve.getLiquidityMint(),
|
|
2778
|
+
repayReserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,
|
|
2779
|
+
withdrawReserve: this.outflowReserve.address,
|
|
2780
|
+
withdrawReserveLiquidityMint: this.outflowReserve.getLiquidityMint(),
|
|
2781
|
+
withdrawReserveCollateralMint: this.outflowReserve.getCTokenMint(),
|
|
2782
|
+
withdrawReserveCollateralSupply: this.outflowReserve.state.collateral.supplyVault,
|
|
2783
|
+
withdrawReserveLiquiditySupply: this.outflowReserve.state.liquidity.supplyVault,
|
|
2784
|
+
userSourceLiquidity: await this.getUserTokenAccountAddress(this.reserve),
|
|
2785
|
+
userDestinationCollateral: await this.getUserCollateralAccountAddress(this.outflowReserve),
|
|
2786
|
+
userDestinationLiquidity: await this.getUserTokenAccountAddress(this.outflowReserve),
|
|
2787
|
+
withdrawReserveLiquidityFeeReceiver: this.outflowReserve.state.liquidity.feeVault,
|
|
2788
|
+
collateralTokenProgram: TOKEN_PROGRAM_ADDRESS,
|
|
2789
|
+
repayLiquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),
|
|
2790
|
+
withdrawLiquidityTokenProgram: this.outflowReserve.getLiquidityTokenProgram(),
|
|
2791
|
+
instructionSysvarAccount: SYSVAR_INSTRUCTIONS_ADDRESS,
|
|
2792
|
+
},
|
|
2793
|
+
debtFarmsAccounts,
|
|
2794
|
+
collateralFarmsAccounts,
|
|
2795
|
+
farmsProgram: FARMS_PROGRAM_ID,
|
|
2796
|
+
},
|
|
2797
|
+
extraAccounts: {
|
|
2798
|
+
unstakeTicket: this.obligation.state.unstakeTicket,
|
|
2799
|
+
emptyUnstakeTicket: newUnstakeTicket.address,
|
|
2800
|
+
unstakingPoolAuthority: unstakingPoolAuthority,
|
|
2801
|
+
unstakingPoolProgram: this.unstakingPool.programId,
|
|
2802
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
2803
|
+
},
|
|
2804
|
+
},
|
|
2805
|
+
extraAccounts,
|
|
2806
|
+
this.kaminoMarket.programId
|
|
2807
|
+
);
|
|
2808
|
+
this.lendingIxs.push(liquidateIx);
|
|
2809
|
+
return newUnstakeTicket.address;
|
|
2810
|
+
}
|
|
2811
|
+
|
|
2273
2812
|
async addInBetweenIxs(
|
|
2274
2813
|
action: ActionType,
|
|
2275
2814
|
includeAtaIxs: boolean,
|
|
@@ -2338,6 +2877,7 @@ export class KaminoAction {
|
|
|
2338
2877
|
'repayAndWithdrawV2',
|
|
2339
2878
|
'refreshObligation',
|
|
2340
2879
|
'depositAndWithdraw',
|
|
2880
|
+
'unstakeLstCollateralStart',
|
|
2341
2881
|
].includes(action)
|
|
2342
2882
|
) {
|
|
2343
2883
|
// The support ixs in order are:
|
|
@@ -2359,15 +2899,21 @@ export class KaminoAction {
|
|
|
2359
2899
|
action === 'liquidate' ||
|
|
2360
2900
|
action === 'depositAndBorrow' ||
|
|
2361
2901
|
action === 'repayAndWithdraw' ||
|
|
2362
|
-
action === 'repayAndWithdrawV2'
|
|
2902
|
+
action === 'repayAndWithdrawV2' ||
|
|
2903
|
+
action === 'unstakeLstCollateralStart'
|
|
2363
2904
|
) {
|
|
2364
2905
|
if (!this.outflowReserve) {
|
|
2365
2906
|
throw new Error('outflowReserve is undefined');
|
|
2366
2907
|
}
|
|
2367
2908
|
|
|
2368
|
-
if (
|
|
2909
|
+
if (
|
|
2910
|
+
action === 'depositAndBorrow' ||
|
|
2911
|
+
action === 'repayAndWithdraw' ||
|
|
2912
|
+
action === 'repayAndWithdrawV2' ||
|
|
2913
|
+
action === 'unstakeLstCollateralStart'
|
|
2914
|
+
) {
|
|
2369
2915
|
currentReserves = [this.reserve, this.outflowReserve];
|
|
2370
|
-
if (action === 'depositAndBorrow') {
|
|
2916
|
+
if (action === 'depositAndBorrow' || action === 'unstakeLstCollateralStart') {
|
|
2371
2917
|
if (isKaminoObligation(this.obligation)) {
|
|
2372
2918
|
const deposit = this.obligation.getDepositByReserve(this.reserve.address);
|
|
2373
2919
|
if (!deposit) {
|
|
@@ -2422,6 +2968,11 @@ export class KaminoAction {
|
|
|
2422
2968
|
if (this.outflowReserve) {
|
|
2423
2969
|
await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Collateral, addAsSupportIx);
|
|
2424
2970
|
}
|
|
2971
|
+
} else if (action === 'unstakeLstCollateralStart') {
|
|
2972
|
+
await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Collateral, addAsSupportIx);
|
|
2973
|
+
if (this.outflowReserve) {
|
|
2974
|
+
await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Collateral, addAsSupportIx);
|
|
2975
|
+
}
|
|
2425
2976
|
} else {
|
|
2426
2977
|
await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Collateral, addAsSupportIx);
|
|
2427
2978
|
await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addAsSupportIx);
|
|
@@ -2445,6 +2996,12 @@ export class KaminoAction {
|
|
|
2445
2996
|
? [repayObligationLiquidity.reserveAddress]
|
|
2446
2997
|
: [];
|
|
2447
2998
|
await this.addRefreshObligationIx(addAsSupportIx, repaidBorrowReservesToSkip);
|
|
2999
|
+
} else if (action == 'unstakeLstCollateralStart') {
|
|
3000
|
+
if (!isKaminoObligation(this.obligation)) {
|
|
3001
|
+
throw new Error(`obligation is not a KaminoObligation`);
|
|
3002
|
+
}
|
|
3003
|
+
// Usol reserve doesn't exist yet
|
|
3004
|
+
await this.addRefreshObligationIx(addAsSupportIx, [this.reserve.address]);
|
|
2448
3005
|
} else {
|
|
2449
3006
|
await this.addRefreshObligationIx(addAsSupportIx);
|
|
2450
3007
|
}
|
|
@@ -3353,7 +3910,8 @@ export class KaminoAction {
|
|
|
3353
3910
|
obligation: KaminoObligation | ObligationType,
|
|
3354
3911
|
outflowAmount?: string | BN,
|
|
3355
3912
|
referrer: Option<Address> = none(),
|
|
3356
|
-
currentSlot: Slot = 0n
|
|
3913
|
+
currentSlot: Slot = 0n,
|
|
3914
|
+
needsUnstakingPool: boolean = false
|
|
3357
3915
|
) {
|
|
3358
3916
|
const inflowReserve = kaminoMarket.getExistingReserveByMint(inflowTokenMint);
|
|
3359
3917
|
const outflowReserve = kaminoMarket.getExistingReserveByMint(outflowTokenMint);
|
|
@@ -3371,15 +3929,24 @@ export class KaminoAction {
|
|
|
3371
3929
|
|
|
3372
3930
|
let secondaryMint: Address;
|
|
3373
3931
|
let primaryMint: Address;
|
|
3932
|
+
let unstakingPool: UnstakingPool | undefined = undefined;
|
|
3374
3933
|
|
|
3375
3934
|
if (
|
|
3376
3935
|
action === 'liquidate' ||
|
|
3377
3936
|
action === 'depositAndBorrow' ||
|
|
3378
3937
|
action === 'repayAndWithdraw' ||
|
|
3379
|
-
action === 'repayAndWithdrawV2'
|
|
3938
|
+
action === 'repayAndWithdrawV2' ||
|
|
3939
|
+
action === 'unstakeLstCollateralStart'
|
|
3380
3940
|
) {
|
|
3381
3941
|
primaryMint = inflowTokenMint;
|
|
3382
3942
|
secondaryMint = outflowTokenMint;
|
|
3943
|
+
if (needsUnstakingPool) {
|
|
3944
|
+
const unstakingPoolPk = kaminoMarket.state.unstakingPoolState;
|
|
3945
|
+
const unstakingPoolProgramId =
|
|
3946
|
+
kaminoMarket.programId == PROGRAM_ID ? UNSTAKING_POOL_ID : UNSTAKING_POOL_STAGING_ID;
|
|
3947
|
+
unstakingPool = new UnstakingPool(unstakingPoolPk, undefined, unstakingPoolProgramId);
|
|
3948
|
+
await unstakingPool.reloadState(kaminoMarket.getRpc());
|
|
3949
|
+
}
|
|
3383
3950
|
} else {
|
|
3384
3951
|
throw new Error('Invalid action');
|
|
3385
3952
|
}
|
|
@@ -3395,6 +3962,7 @@ export class KaminoAction {
|
|
|
3395
3962
|
borrowReserves,
|
|
3396
3963
|
inflowReserve,
|
|
3397
3964
|
currentSlot,
|
|
3965
|
+
unstakingPool,
|
|
3398
3966
|
secondaryMint,
|
|
3399
3967
|
outflowReserve,
|
|
3400
3968
|
outflowAmount,
|
|
@@ -3436,6 +4004,7 @@ export class KaminoAction {
|
|
|
3436
4004
|
undefined,
|
|
3437
4005
|
undefined,
|
|
3438
4006
|
undefined,
|
|
4007
|
+
undefined,
|
|
3439
4008
|
undefined
|
|
3440
4009
|
),
|
|
3441
4010
|
createAtaIxs: [createAtaIx],
|