@kamino-finance/klend-sdk 7.1.3 → 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.
Files changed (230) hide show
  1. package/dist/@codegen/klend/accounts/LendingMarket.d.ts +144 -3
  2. package/dist/@codegen/klend/accounts/LendingMarket.d.ts.map +1 -1
  3. package/dist/@codegen/klend/accounts/LendingMarket.js +105 -3
  4. package/dist/@codegen/klend/accounts/LendingMarket.js.map +1 -1
  5. package/dist/@codegen/klend/accounts/Obligation.d.ts +30 -15
  6. package/dist/@codegen/klend/accounts/Obligation.d.ts.map +1 -1
  7. package/dist/@codegen/klend/accounts/Obligation.js +31 -21
  8. package/dist/@codegen/klend/accounts/Obligation.js.map +1 -1
  9. package/dist/@codegen/klend/accounts/PoolState.d.ts +53 -0
  10. package/dist/@codegen/klend/accounts/PoolState.d.ts.map +1 -0
  11. package/dist/@codegen/klend/accounts/PoolState.js +167 -0
  12. package/dist/@codegen/klend/accounts/PoolState.js.map +1 -0
  13. package/dist/@codegen/klend/accounts/Reserve.d.ts +6 -0
  14. package/dist/@codegen/klend/accounts/Reserve.d.ts.map +1 -1
  15. package/dist/@codegen/klend/accounts/Reserve.js +9 -2
  16. package/dist/@codegen/klend/accounts/Reserve.js.map +1 -1
  17. package/dist/@codegen/klend/accounts/UnstakeTicket.d.ts +41 -0
  18. package/dist/@codegen/klend/accounts/UnstakeTicket.d.ts.map +1 -0
  19. package/dist/@codegen/klend/accounts/UnstakeTicket.js +143 -0
  20. package/dist/@codegen/klend/accounts/UnstakeTicket.js.map +1 -0
  21. package/dist/@codegen/klend/accounts/UserState.d.ts +0 -75
  22. package/dist/@codegen/klend/accounts/UserState.d.ts.map +1 -1
  23. package/dist/@codegen/klend/accounts/UserState.js +0 -25
  24. package/dist/@codegen/klend/accounts/UserState.js.map +1 -1
  25. package/dist/@codegen/klend/accounts/WithdrawTicket.d.ts +132 -0
  26. package/dist/@codegen/klend/accounts/WithdrawTicket.d.ts.map +1 -0
  27. package/dist/@codegen/klend/accounts/WithdrawTicket.js +191 -0
  28. package/dist/@codegen/klend/accounts/WithdrawTicket.js.map +1 -0
  29. package/dist/@codegen/klend/accounts/index.d.ts +6 -0
  30. package/dist/@codegen/klend/accounts/index.d.ts.map +1 -1
  31. package/dist/@codegen/klend/accounts/index.js +7 -1
  32. package/dist/@codegen/klend/accounts/index.js.map +1 -1
  33. package/dist/@codegen/klend/errors/custom.d.ts +226 -2
  34. package/dist/@codegen/klend/errors/custom.d.ts.map +1 -1
  35. package/dist/@codegen/klend/errors/custom.js +396 -3
  36. package/dist/@codegen/klend/errors/custom.js.map +1 -1
  37. package/dist/@codegen/klend/instructions/enqueueToWithdraw.d.ts +39 -0
  38. package/dist/@codegen/klend/instructions/enqueueToWithdraw.d.ts.map +1 -0
  39. package/dist/@codegen/klend/instructions/enqueueToWithdraw.js +67 -0
  40. package/dist/@codegen/klend/instructions/enqueueToWithdraw.js.map +1 -0
  41. package/dist/@codegen/klend/instructions/fillBorrowOrder.d.ts +36 -0
  42. package/dist/@codegen/klend/instructions/fillBorrowOrder.d.ts.map +1 -0
  43. package/dist/@codegen/klend/instructions/fillBorrowOrder.js +49 -0
  44. package/dist/@codegen/klend/instructions/fillBorrowOrder.js.map +1 -0
  45. package/dist/@codegen/klend/instructions/idlMissingTypes.d.ts +1 -2
  46. package/dist/@codegen/klend/instructions/idlMissingTypes.d.ts.map +1 -1
  47. package/dist/@codegen/klend/instructions/idlMissingTypes.js +6 -2
  48. package/dist/@codegen/klend/instructions/idlMissingTypes.js.map +1 -1
  49. package/dist/@codegen/klend/instructions/index.d.ts +16 -0
  50. package/dist/@codegen/klend/instructions/index.d.ts.map +1 -1
  51. package/dist/@codegen/klend/instructions/index.js +18 -1
  52. package/dist/@codegen/klend/instructions/index.js.map +1 -1
  53. package/dist/@codegen/klend/instructions/initReserve.d.ts +1 -1
  54. package/dist/@codegen/klend/instructions/initReserve.d.ts.map +1 -1
  55. package/dist/@codegen/klend/instructions/initReserve.js +1 -5
  56. package/dist/@codegen/klend/instructions/initReserve.js.map +1 -1
  57. package/dist/@codegen/klend/instructions/liquidateObligationAndRedeemReserveCollateral.js +1 -1
  58. package/dist/@codegen/klend/instructions/recoverInvalidTicketCollateral.d.ts +47 -0
  59. package/dist/@codegen/klend/instructions/recoverInvalidTicketCollateral.d.ts.map +1 -0
  60. package/dist/@codegen/klend/instructions/recoverInvalidTicketCollateral.js +66 -0
  61. package/dist/@codegen/klend/instructions/recoverInvalidTicketCollateral.js.map +1 -0
  62. package/dist/@codegen/klend/instructions/setBorrowOrder.d.ts +31 -0
  63. package/dist/@codegen/klend/instructions/setBorrowOrder.d.ts.map +1 -0
  64. package/dist/@codegen/klend/instructions/setBorrowOrder.js +64 -0
  65. package/dist/@codegen/klend/instructions/setBorrowOrder.js.map +1 -0
  66. package/dist/@codegen/klend/instructions/unstakeLstCollateralEnd.d.ts +53 -0
  67. package/dist/@codegen/klend/instructions/unstakeLstCollateralEnd.d.ts.map +1 -0
  68. package/dist/@codegen/klend/instructions/unstakeLstCollateralEnd.js +190 -0
  69. package/dist/@codegen/klend/instructions/unstakeLstCollateralEnd.js.map +1 -0
  70. package/dist/@codegen/klend/instructions/unstakeLstCollateralStart.d.ts +70 -0
  71. package/dist/@codegen/klend/instructions/unstakeLstCollateralStart.d.ts.map +1 -0
  72. package/dist/@codegen/klend/instructions/unstakeLstCollateralStart.js +261 -0
  73. package/dist/@codegen/klend/instructions/unstakeLstCollateralStart.js.map +1 -0
  74. package/dist/@codegen/klend/instructions/updateGlobalConfig.d.ts +1 -1
  75. package/dist/@codegen/klend/instructions/updateGlobalConfig.d.ts.map +1 -1
  76. package/dist/@codegen/klend/instructions/updateGlobalConfig.js +1 -0
  77. package/dist/@codegen/klend/instructions/updateGlobalConfig.js.map +1 -1
  78. package/dist/@codegen/klend/instructions/updateReserveConfig.d.ts +1 -1
  79. package/dist/@codegen/klend/instructions/updateReserveConfig.d.ts.map +1 -1
  80. package/dist/@codegen/klend/instructions/updateReserveConfig.js +1 -0
  81. package/dist/@codegen/klend/instructions/updateReserveConfig.js.map +1 -1
  82. package/dist/@codegen/klend/instructions/withdrawObligationCollateral.js +1 -1
  83. package/dist/@codegen/klend/instructions/withdrawObligationCollateralV2.js +1 -1
  84. package/dist/@codegen/klend/instructions/withdrawObligationUsol.d.ts +41 -0
  85. package/dist/@codegen/klend/instructions/withdrawObligationUsol.d.ts.map +1 -0
  86. package/dist/@codegen/klend/instructions/withdrawObligationUsol.js +135 -0
  87. package/dist/@codegen/klend/instructions/withdrawObligationUsol.js.map +1 -0
  88. package/dist/@codegen/klend/instructions/withdrawQueuedLiquidity.d.ts +51 -0
  89. package/dist/@codegen/klend/instructions/withdrawQueuedLiquidity.d.ts.map +1 -0
  90. package/dist/@codegen/klend/instructions/withdrawQueuedLiquidity.js +28 -0
  91. package/dist/@codegen/klend/instructions/withdrawQueuedLiquidity.js.map +1 -0
  92. package/dist/@codegen/klend/types/BorrowOrder.d.ts +192 -0
  93. package/dist/@codegen/klend/types/BorrowOrder.d.ts.map +1 -0
  94. package/dist/@codegen/klend/types/BorrowOrder.js +194 -0
  95. package/dist/@codegen/klend/types/BorrowOrder.js.map +1 -0
  96. package/dist/@codegen/klend/types/BorrowOrderConfigArgs.d.ts +39 -0
  97. package/dist/@codegen/klend/types/BorrowOrderConfigArgs.d.ts.map +1 -0
  98. package/dist/@codegen/klend/types/BorrowOrderConfigArgs.js +100 -0
  99. package/dist/@codegen/klend/types/BorrowOrderConfigArgs.js.map +1 -0
  100. package/dist/@codegen/klend/types/ObligationLiquidity.d.ts +35 -5
  101. package/dist/@codegen/klend/types/ObligationLiquidity.d.ts.map +1 -1
  102. package/dist/@codegen/klend/types/ObligationLiquidity.js +17 -7
  103. package/dist/@codegen/klend/types/ObligationLiquidity.js.map +1 -1
  104. package/dist/@codegen/klend/types/ObligationOrder.d.ts +4 -4
  105. package/dist/@codegen/klend/types/ObligationOrder.js +2 -2
  106. package/dist/@codegen/klend/types/ReserveConfig.d.ts +141 -29
  107. package/dist/@codegen/klend/types/ReserveConfig.d.ts.map +1 -1
  108. package/dist/@codegen/klend/types/ReserveConfig.js +89 -25
  109. package/dist/@codegen/klend/types/ReserveConfig.js.map +1 -1
  110. package/dist/@codegen/klend/types/ReserveFees.d.ts +8 -8
  111. package/dist/@codegen/klend/types/ReserveFees.d.ts.map +1 -1
  112. package/dist/@codegen/klend/types/ReserveFees.js +8 -8
  113. package/dist/@codegen/klend/types/ReserveFees.js.map +1 -1
  114. package/dist/@codegen/klend/types/ReserveLiquidity.d.ts +26 -8
  115. package/dist/@codegen/klend/types/ReserveLiquidity.d.ts.map +1 -1
  116. package/dist/@codegen/klend/types/ReserveLiquidity.js +14 -8
  117. package/dist/@codegen/klend/types/ReserveLiquidity.js.map +1 -1
  118. package/dist/@codegen/klend/types/UpdateConfigMode.d.ts +92 -14
  119. package/dist/@codegen/klend/types/UpdateConfigMode.d.ts.map +1 -1
  120. package/dist/@codegen/klend/types/UpdateConfigMode.js +168 -23
  121. package/dist/@codegen/klend/types/UpdateConfigMode.js.map +1 -1
  122. package/dist/@codegen/klend/types/UpdateLendingMarketMode.d.ts +130 -0
  123. package/dist/@codegen/klend/types/UpdateLendingMarketMode.d.ts.map +1 -1
  124. package/dist/@codegen/klend/types/UpdateLendingMarketMode.js +241 -1
  125. package/dist/@codegen/klend/types/UpdateLendingMarketMode.js.map +1 -1
  126. package/dist/@codegen/klend/types/WithdrawQueue.d.ts +64 -0
  127. package/dist/@codegen/klend/types/WithdrawQueue.d.ts.map +1 -0
  128. package/dist/@codegen/klend/types/WithdrawQueue.js +104 -0
  129. package/dist/@codegen/klend/types/WithdrawQueue.js.map +1 -0
  130. package/dist/@codegen/klend/types/index.d.ts +10 -8
  131. package/dist/@codegen/klend/types/index.d.ts.map +1 -1
  132. package/dist/@codegen/klend/types/index.js +7 -3
  133. package/dist/@codegen/klend/types/index.js.map +1 -1
  134. package/dist/@codegen/klend/zero_padding/ObligationZP.d.ts +9 -4
  135. package/dist/@codegen/klend/zero_padding/ObligationZP.d.ts.map +1 -1
  136. package/dist/@codegen/klend/zero_padding/ObligationZP.js +22 -13
  137. package/dist/@codegen/klend/zero_padding/ObligationZP.js.map +1 -1
  138. package/dist/classes/action.d.ts +30 -3
  139. package/dist/classes/action.d.ts.map +1 -1
  140. package/dist/classes/action.js +364 -10
  141. package/dist/classes/action.js.map +1 -1
  142. package/dist/classes/manager.d.ts.map +1 -1
  143. package/dist/classes/manager.js +10 -0
  144. package/dist/classes/manager.js.map +1 -1
  145. package/dist/classes/market.d.ts +6 -2
  146. package/dist/classes/market.d.ts.map +1 -1
  147. package/dist/classes/market.js +26 -6
  148. package/dist/classes/market.js.map +1 -1
  149. package/dist/classes/obligation.js +1 -1
  150. package/dist/classes/obligation.js.map +1 -1
  151. package/dist/classes/reserve.d.ts.map +1 -1
  152. package/dist/classes/reserve.js +13 -7
  153. package/dist/classes/reserve.js.map +1 -1
  154. package/dist/classes/unstakingPool.d.ts +20 -3
  155. package/dist/classes/unstakingPool.d.ts.map +1 -1
  156. package/dist/classes/unstakingPool.js +62 -8
  157. package/dist/classes/unstakingPool.js.map +1 -1
  158. package/dist/idl/klend.json +2125 -232
  159. package/dist/lending_operations/index.d.ts +1 -0
  160. package/dist/lending_operations/index.d.ts.map +1 -1
  161. package/dist/lending_operations/index.js +1 -0
  162. package/dist/lending_operations/index.js.map +1 -1
  163. package/dist/lending_operations/unstake_lst_collateral.d.ts +12 -0
  164. package/dist/lending_operations/unstake_lst_collateral.d.ts.map +1 -0
  165. package/dist/lending_operations/unstake_lst_collateral.js +104 -0
  166. package/dist/lending_operations/unstake_lst_collateral.js.map +1 -0
  167. package/dist/manager/client_kamino_manager.js +11 -8
  168. package/dist/manager/client_kamino_manager.js.map +1 -1
  169. package/dist/utils/managerTypes.d.ts.map +1 -1
  170. package/dist/utils/managerTypes.js +9 -4
  171. package/dist/utils/managerTypes.js.map +1 -1
  172. package/dist/utils/seeds.d.ts +10 -14
  173. package/dist/utils/seeds.d.ts.map +1 -1
  174. package/dist/utils/seeds.js +25 -22
  175. package/dist/utils/seeds.js.map +1 -1
  176. package/package.json +1 -1
  177. package/src/@codegen/klend/accounts/LendingMarket.ts +210 -5
  178. package/src/@codegen/klend/accounts/Obligation.ts +53 -31
  179. package/src/@codegen/klend/accounts/PoolState.ts +192 -0
  180. package/src/@codegen/klend/accounts/Reserve.ts +13 -2
  181. package/src/@codegen/klend/accounts/UnstakeTicket.ts +160 -0
  182. package/src/@codegen/klend/accounts/UserState.ts +0 -75
  183. package/src/@codegen/klend/accounts/WithdrawTicket.ts +256 -0
  184. package/src/@codegen/klend/accounts/index.ts +6 -0
  185. package/src/@codegen/klend/errors/custom.ts +427 -2
  186. package/src/@codegen/klend/instructions/enqueueToWithdraw.ts +89 -0
  187. package/src/@codegen/klend/instructions/fillBorrowOrder.ts +96 -0
  188. package/src/@codegen/klend/instructions/idlMissingTypes.ts +7 -4
  189. package/src/@codegen/klend/instructions/index.ts +34 -0
  190. package/src/@codegen/klend/instructions/initReserve.ts +2 -6
  191. package/src/@codegen/klend/instructions/liquidateObligationAndRedeemReserveCollateral.ts +1 -1
  192. package/src/@codegen/klend/instructions/recoverInvalidTicketCollateral.ts +96 -0
  193. package/src/@codegen/klend/instructions/setBorrowOrder.ts +77 -0
  194. package/src/@codegen/klend/instructions/unstakeLstCollateralEnd.ts +251 -0
  195. package/src/@codegen/klend/instructions/unstakeLstCollateralStart.ts +353 -0
  196. package/src/@codegen/klend/instructions/updateGlobalConfig.ts +2 -1
  197. package/src/@codegen/klend/instructions/updateReserveConfig.ts +2 -1
  198. package/src/@codegen/klend/instructions/withdrawObligationCollateral.ts +1 -1
  199. package/src/@codegen/klend/instructions/withdrawObligationCollateralV2.ts +1 -1
  200. package/src/@codegen/klend/instructions/withdrawObligationUsol.ts +168 -0
  201. package/src/@codegen/klend/instructions/withdrawQueuedLiquidity.ts +92 -0
  202. package/src/@codegen/klend/types/BorrowOrder.ts +267 -0
  203. package/src/@codegen/klend/types/BorrowOrderConfigArgs.ts +87 -0
  204. package/src/@codegen/klend/types/ObligationLiquidity.ts +39 -9
  205. package/src/@codegen/klend/types/ObligationOrder.ts +4 -4
  206. package/src/@codegen/klend/types/ReserveConfig.ts +171 -39
  207. package/src/@codegen/klend/types/ReserveFees.ts +12 -12
  208. package/src/@codegen/klend/types/ReserveLiquidity.ts +30 -12
  209. package/src/@codegen/klend/types/UpdateConfigMode.ts +206 -26
  210. package/src/@codegen/klend/types/UpdateLendingMarketMode.ts +300 -0
  211. package/src/@codegen/klend/types/WithdrawQueue.ts +117 -0
  212. package/src/@codegen/klend/types/index.ts +45 -16
  213. package/src/@codegen/klend/zero_padding/ObligationZP.ts +22 -13
  214. package/src/classes/action.ts +577 -8
  215. package/src/classes/manager.ts +11 -0
  216. package/src/classes/market.ts +36 -5
  217. package/src/classes/obligation.ts +1 -1
  218. package/src/classes/reserve.ts +13 -8
  219. package/src/classes/unstakingPool.ts +83 -6
  220. package/src/idl/klend.json +2126 -233
  221. package/src/lending_operations/index.ts +1 -0
  222. package/src/lending_operations/unstake_lst_collateral.ts +174 -0
  223. package/src/manager/client_kamino_manager.ts +11 -8
  224. package/src/utils/managerTypes.ts +9 -4
  225. package/src/utils/seeds.ts +28 -26
  226. package/dist/@codegen/klend/types/AssetTier.d.ts +0 -45
  227. package/dist/@codegen/klend/types/AssetTier.d.ts.map +0 -1
  228. package/dist/@codegen/klend/types/AssetTier.js +0 -132
  229. package/dist/@codegen/klend/types/AssetTier.js.map +0 -1
  230. package/src/@codegen/klend/types/AssetTier.ts +0 -119
@@ -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 (action === 'depositAndBorrow' || action === 'repayAndWithdraw' || action === 'repayAndWithdrawV2') {
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],