@kamino-finance/klend-sdk 2.12.0 → 2.12.1

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.
@@ -508,6 +508,7 @@ class KaminoAction {
508
508
  }, this.kaminoMarket.programId));
509
509
  }
510
510
  addBorrowIx() {
511
+ var _a;
511
512
  this.lendingIxsLabels.push(`borrowObligationLiquidity`);
512
513
  const depositReservesList = this.getAdditionalDepositReservesList();
513
514
  const depositReserveAccountMetas = depositReservesList.map((reserve) => {
@@ -529,7 +530,9 @@ class KaminoAction {
529
530
  tokenProgram: this.reserve.getLiquidityTokenProgram(),
530
531
  instructionSysvarAccount: web3_js_1.SYSVAR_INSTRUCTIONS_PUBKEY,
531
532
  }, this.kaminoMarket.programId);
532
- borrowIx.keys = borrowIx.keys.concat([...depositReserveAccountMetas]);
533
+ borrowIx.keys = ((_a = this.obligation) === null || _a === void 0 ? void 0 : _a.state.elevationGroup)
534
+ ? borrowIx.keys.concat([...depositReserveAccountMetas])
535
+ : borrowIx.keys;
533
536
  this.lendingIxs.push(borrowIx);
534
537
  }
535
538
  addDepositAndBorrowIx() {
@@ -594,7 +597,11 @@ class KaminoAction {
594
597
  return __awaiter(this, void 0, void 0, function* () {
595
598
  this.lendingIxsLabels.push(`repayObligationLiquidity(reserve=${this.reserve.address})(obligation=${this.getObligationPda()})`);
596
599
  this.lendingIxsLabels.push(`withdrawObligationCollateralAndRedeemReserveCollateral`);
597
- this.lendingIxs.push((0, instructions_1.repayObligationLiquidity)({
600
+ const depositReservesList = this.getAdditionalDepositReservesList();
601
+ const depositReserveAccountMetas = depositReservesList.map((reserve) => {
602
+ return { pubkey: reserve, isSigner: false, isWritable: true };
603
+ });
604
+ const repayIx = (0, instructions_1.repayObligationLiquidity)({
598
605
  liquidityAmount: this.amount,
599
606
  }, {
600
607
  owner: this.owner,
@@ -606,7 +613,9 @@ class KaminoAction {
606
613
  reserveDestinationLiquidity: this.reserve.state.liquidity.supplyVault,
607
614
  tokenProgram: this.reserve.getLiquidityTokenProgram(),
608
615
  instructionSysvarAccount: web3_js_1.SYSVAR_INSTRUCTIONS_PUBKEY,
609
- }, this.kaminoMarket.programId));
616
+ }, this.kaminoMarket.programId);
617
+ repayIx.keys = repayIx.keys.concat([...depositReserveAccountMetas]);
618
+ this.lendingIxs.push(repayIx);
610
619
  if (!this.outflowReserve) {
611
620
  throw new Error(`outflowReserve not set`);
612
621
  }
@@ -667,6 +676,7 @@ class KaminoAction {
667
676
  });
668
677
  }
669
678
  addRepayIx() {
679
+ var _a;
670
680
  return __awaiter(this, void 0, void 0, function* () {
671
681
  this.lendingIxsLabels.push(`repayObligationLiquidity(reserve=${this.reserve.address})(obligation=${this.getObligationPda()})`);
672
682
  const depositReservesList = this.getAdditionalDepositReservesList();
@@ -686,11 +696,13 @@ class KaminoAction {
686
696
  tokenProgram: this.reserve.getLiquidityTokenProgram(),
687
697
  instructionSysvarAccount: web3_js_1.SYSVAR_INSTRUCTIONS_PUBKEY,
688
698
  }, this.kaminoMarket.programId);
689
- repayIx.keys = repayIx.keys.concat([...depositReserveAccountMetas]);
699
+ repayIx.keys =
700
+ ((_a = this.obligation) === null || _a === void 0 ? void 0 : _a.state.elevationGroup) !== 0 ? repayIx.keys.concat([...depositReserveAccountMetas]) : repayIx.keys;
690
701
  this.lendingIxs.push(repayIx);
691
702
  });
692
703
  }
693
704
  addLiquidateIx(maxAllowedLtvOverridePercent = 0) {
705
+ var _a;
694
706
  return __awaiter(this, void 0, void 0, function* () {
695
707
  this.lendingIxsLabels.push(`liquidateObligationAndRedeemReserveCollateral`);
696
708
  if (!this.outflowReserve) {
@@ -730,7 +742,10 @@ class KaminoAction {
730
742
  withdrawLiquidityTokenProgram: this.outflowReserve.getLiquidityTokenProgram(),
731
743
  instructionSysvarAccount: web3_js_1.SYSVAR_INSTRUCTIONS_PUBKEY,
732
744
  }, this.kaminoMarket.programId);
733
- liquidateIx.keys = liquidateIx.keys.concat([...depositReserveAccountMetas]);
745
+ liquidateIx.keys =
746
+ ((_a = this.obligation) === null || _a === void 0 ? void 0 : _a.state.elevationGroup) !== 0
747
+ ? liquidateIx.keys.concat([...depositReserveAccountMetas])
748
+ : liquidateIx.keys;
734
749
  this.lendingIxs.push(liquidateIx);
735
750
  });
736
751
  }
@@ -908,18 +923,18 @@ class KaminoAction {
908
923
  const groupsColl = this.reserve.state.config.elevationGroups;
909
924
  const groupsDebt = this.outflowReserve.state.config.elevationGroups;
910
925
  const groups = this.kaminoMarket.state.elevationGroups;
911
- const commonElevationGroups = [...groupsColl].filter((item) => groupsDebt.includes(item) && item !== 0);
926
+ const commonElevationGroups = [...groupsColl].filter((item) => groupsDebt.includes(item) && item !== 0 && groups[item - 1].debtReserve.equals(this.outflowReserve.address));
912
927
  console.log('Groups of coll reserve', groupsColl, 'Groups of debt reserve', groupsDebt, 'Common groups', commonElevationGroups);
913
928
  if (commonElevationGroups.length === 0) {
914
929
  console.log('No common elevation groups found, staying with default');
915
930
  }
916
931
  else {
917
- const eModeGroupWithMaxLtv = commonElevationGroups.reduce((prev, curr) => {
932
+ const eModeGroupWithMaxLtvAndDebtReserve = commonElevationGroups.reduce((prev, curr) => {
918
933
  const prevGroup = groups.find((group) => group.id === prev);
919
934
  const currGroup = groups.find((group) => group.id === curr);
920
935
  return prevGroup.ltvPct > currGroup.ltvPct ? prev : curr;
921
936
  });
922
- const eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtv).id;
937
+ const eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtvAndDebtReserve).id;
923
938
  console.log('Setting eModeGroup to', eModeGroup);
924
939
  if (eModeGroup !== 0 && eModeGroup !== ((_a = this.obligation) === null || _a === void 0 ? void 0 : _a.state.elevationGroup)) {
925
940
  this.addRequestElevationIx(eModeGroup, false);
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/classes/action.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Connection,\n PublicKey,\n RpcResponseAndContext,\n SimulatedTransactionResponse,\n SystemProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n Transaction,\n TransactionInstruction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, NATIVE_MINT, TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport BN from 'bn.js';\nimport Decimal from 'decimal.js';\nimport {\n borrowObligationLiquidity,\n depositObligationCollateral,\n depositReserveLiquidity,\n depositReserveLiquidityAndObligationCollateral,\n initObligation,\n initObligationFarmsForReserve,\n InitObligationFarmsForReserveAccounts,\n InitObligationFarmsForReserveArgs,\n initReferrerTokenState,\n initUserMetadata,\n liquidateObligationAndRedeemReserveCollateral,\n redeemReserveCollateral,\n refreshObligation,\n refreshObligationFarmsForReserve,\n RefreshObligationFarmsForReserveAccounts,\n RefreshObligationFarmsForReserveArgs,\n refreshReserve,\n repayObligationLiquidity,\n requestElevationGroup,\n RequestElevationGroupAccounts,\n RequestElevationGroupArgs,\n withdrawObligationCollateralAndRedeemReserveCollateral,\n withdrawReferrerFees,\n} from '../idl_codegen/instructions';\nimport {\n buildComputeBudgetIx,\n createAssociatedTokenAccountIdempotentInstruction,\n ObligationType,\n syncNative,\n U64_MAX,\n referrerTokenStatePda,\n userMetadataPda,\n getAtasWithCreateIxnsIfMissing,\n checkIfAccountExists,\n createLookupTableIx,\n isNotNullPubkey,\n PublicKeySet,\n WRAPPED_SOL_MINT,\n getAssociatedTokenAddress,\n} from '../utils';\nimport { KaminoMarket } from './market';\nimport { KaminoObligation } from './obligation';\nimport { KaminoReserve } from './reserve';\nimport { ReserveFarmKind } from '../idl_codegen/types';\nimport { farmsId } from '@hubbleprotocol/farms-sdk';\nimport { Reserve } from '../idl_codegen/accounts';\nimport { VanillaObligation } from '../utils/ObligationType';\nimport { PROGRAM_ID } from '../lib';\nimport { createCloseAccountInstruction } from '../utils/token';\n\nexport const POSITION_LIMIT = 10;\nexport const BORROWS_LIMIT = 5;\nexport const DEPOSITS_LIMIT = 8;\n\nconst SOL_PADDING_FOR_INTEREST = new BN('1000000');\n\nexport type ActionType =\n | 'deposit'\n | 'borrow'\n | 'withdraw'\n | 'repay'\n | 'mint'\n | 'redeem'\n | 'depositCollateral'\n | 'liquidate'\n | 'depositAndBorrow'\n | 'repayAndWithdraw'\n | 'refreshObligation'\n | 'requestElevationGroup'\n | 'withdrawReferrerFees';\n\nexport class KaminoAction {\n kaminoMarket: KaminoMarket;\n\n reserve: KaminoReserve;\n\n outflowReserve: KaminoReserve | undefined;\n\n owner: PublicKey;\n payer: PublicKey;\n\n obligation: KaminoObligation | null = null;\n\n referrer: PublicKey;\n\n userTokenAccountAddress: PublicKey;\n\n userCollateralAccountAddress: PublicKey;\n\n additionalTokenAccountAddress?: PublicKey;\n\n /**\n * Null unless the obligation is not passed\n */\n obligationType: ObligationType | null = null;\n\n mint: PublicKey;\n\n secondaryMint?: PublicKey;\n\n positions?: number;\n\n amount: BN;\n outflowAmount?: BN;\n\n hostAta?: PublicKey;\n\n setupIxs: Array<TransactionInstruction>;\n setupIxsLabels: Array<string>;\n\n inBetweenIxs: Array<TransactionInstruction>;\n inBetweenIxsLabels: Array<string>;\n\n lendingIxs: Array<TransactionInstruction>;\n lendingIxsLabels: Array<string>;\n\n cleanupIxs: Array<TransactionInstruction>;\n cleanupIxsLabels: Array<string>;\n\n preTxnIxs: Array<TransactionInstruction>;\n preTxnIxsLabels: Array<string>;\n\n postTxnIxs: Array<TransactionInstruction>;\n postTxnIxsLabels: Array<string>;\n\n refreshFarmsCleanupTxnIxs: Array<TransactionInstruction>;\n refreshFarmsCleanupTxnIxsLabels: Array<string>;\n\n depositReserves: Array<PublicKey>;\n borrowReserves: Array<PublicKey>;\n\n preLoadedDepositReservesSameTx: Array<PublicKey>;\n preLoadedBorrowReservesSameTx: Array<PublicKey>;\n\n currentSlot: number;\n\n private constructor(\n kaminoMarket: KaminoMarket,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType | null,\n userTokenAccountAddress: PublicKey,\n userCollateralAccountAddress: PublicKey,\n mint: PublicKey,\n positions: number,\n amount: string | BN,\n depositReserves: Array<PublicKey>,\n borrowReserves: Array<PublicKey>,\n reserveState: KaminoReserve,\n currentSlot: number,\n hostAta?: PublicKey,\n secondaryMint?: PublicKey,\n additionalTokenAccountAddress?: PublicKey,\n outflowReserveState?: KaminoReserve,\n outflowAmount?: string | BN,\n referrer?: PublicKey,\n payer?: PublicKey\n ) {\n if (obligation instanceof KaminoObligation) {\n this.obligation = obligation;\n } else if (obligation !== null) {\n this.obligationType = obligation;\n }\n\n this.kaminoMarket = kaminoMarket;\n this.owner = owner;\n this.payer = payer ?? owner;\n this.amount = new BN(amount);\n this.mint = mint;\n this.positions = positions;\n this.hostAta = hostAta;\n this.userTokenAccountAddress = userTokenAccountAddress;\n this.userCollateralAccountAddress = userCollateralAccountAddress;\n this.setupIxs = [];\n this.setupIxsLabels = [];\n this.inBetweenIxs = [];\n this.inBetweenIxsLabels = [];\n this.lendingIxs = [];\n this.lendingIxsLabels = [];\n this.cleanupIxs = [];\n this.cleanupIxsLabels = [];\n this.preTxnIxs = [];\n this.preTxnIxsLabels = [];\n this.postTxnIxs = [];\n this.postTxnIxsLabels = [];\n this.refreshFarmsCleanupTxnIxs = [];\n this.refreshFarmsCleanupTxnIxsLabels = [];\n this.depositReserves = depositReserves;\n this.borrowReserves = borrowReserves;\n this.additionalTokenAccountAddress = additionalTokenAccountAddress;\n this.secondaryMint = secondaryMint;\n this.reserve = reserveState;\n this.outflowReserve = outflowReserveState;\n this.outflowAmount = outflowAmount ? new BN(outflowAmount) : undefined;\n this.preLoadedDepositReservesSameTx = [];\n this.preLoadedBorrowReservesSameTx = [];\n this.referrer = referrer ? referrer : PublicKey.default;\n this.currentSlot = currentSlot;\n }\n\n static async initialize(\n action: ActionType,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n kaminoMarket: KaminoMarket,\n obligation: KaminoObligation | ObligationType,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n hostAta?: PublicKey,\n payer?: PublicKey\n ) {\n const reserve = kaminoMarket.getReserveByMint(mint);\n if (reserve === undefined) {\n throw new Error(`Reserve ${mint} not found in market ${kaminoMarket.getAddress().toBase58()}`);\n }\n\n const { userTokenAccountAddress, userCollateralAccountAddress } = KaminoAction.getUserAccountAddresses(\n payer ?? owner,\n reserve.state\n );\n\n const { kaminoObligation, depositReserves, borrowReserves, distinctReserveCount } =\n await KaminoAction.loadObligation(action, kaminoMarket, owner, reserve.address, obligation);\n\n const [_, userMetadata] = await kaminoMarket.getUserMetadata(owner);\n if (userMetadata) {\n referrer = userMetadata.referrer;\n }\n\n const referrerKey = kaminoObligation ? kaminoObligation.state.referrer : referrer;\n\n return new KaminoAction(\n kaminoMarket,\n owner,\n kaminoObligation || obligation,\n userTokenAccountAddress,\n userCollateralAccountAddress,\n mint,\n distinctReserveCount,\n amount,\n depositReserves,\n borrowReserves,\n reserve,\n currentSlot,\n hostAta,\n undefined,\n undefined,\n undefined,\n undefined,\n referrerKey,\n payer\n );\n }\n\n private static getUserAccountAddresses(owner: PublicKey, reserve: Reserve) {\n const userTokenAccountAddress = getAssociatedTokenAddress(\n reserve.liquidity.mintPubkey,\n owner,\n true,\n reserve.liquidity.tokenProgram,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n const userCollateralAccountAddress = getAssociatedTokenAddress(\n reserve.collateral.mintPubkey,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n return { userTokenAccountAddress, userCollateralAccountAddress };\n }\n\n private static async loadObligation(\n action: ActionType,\n kaminoMarket: KaminoMarket,\n owner: PublicKey,\n reserve: PublicKey,\n obligation: KaminoObligation | ObligationType,\n outflowReserve?: PublicKey\n ) {\n let kaminoObligation: KaminoObligation | null;\n const depositReserves: Array<PublicKey> = [];\n const borrowReserves: Array<PublicKey> = [];\n if (obligation instanceof KaminoObligation) {\n kaminoObligation = obligation;\n } else {\n const obligationAddress = obligation.toPda(kaminoMarket.getAddress(), owner);\n kaminoObligation = await KaminoObligation.load(kaminoMarket, obligationAddress);\n }\n if (kaminoObligation !== null) {\n depositReserves.push(...[...kaminoObligation.deposits.keys()]);\n borrowReserves.push(...[...kaminoObligation.borrows.keys()]);\n }\n\n if (!outflowReserve && action === 'depositAndBorrow') {\n throw new Error(`Outflow reserve has not been set for depositAndBorrow`);\n }\n\n // Union of addresses\n const distinctReserveCount =\n [\n ...new Set([\n ...borrowReserves.map((e) => e.toBase58()),\n ...(action === 'borrow' ? [reserve.toBase58()] : []),\n ...(action === 'depositAndBorrow' ? [reserve.toBase58()] : []),\n ]),\n ].length +\n [\n ...new Set([\n ...depositReserves.map((e) => e.toBase58()),\n ...(action === 'deposit' ? [reserve.toBase58()] : []),\n ...(action === 'depositAndBorrow' ? [outflowReserve!.toBase58()] : []),\n ]),\n ].length;\n\n if (distinctReserveCount > POSITION_LIMIT) {\n throw Error(`Obligation already has max number of positions: ${POSITION_LIMIT}`);\n }\n\n return {\n kaminoObligation,\n depositReserves,\n borrowReserves,\n distinctReserveCount,\n };\n }\n\n static async buildRefreshObligationTxns(\n kaminoMarket: KaminoMarket,\n payer: PublicKey,\n obligation: KaminoObligation,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n currentSlot: number = 0\n ) {\n // placeholder for action initialization\n const firstReserve = obligation.state.deposits[0].depositReserve;\n const firstKaminoReserve = kaminoMarket.getReserveByAddress(firstReserve);\n if (!firstKaminoReserve) {\n throw new Error(`Reserve ${firstReserve.toBase58()} not found`);\n }\n const axn = await KaminoAction.initialize(\n 'refreshObligation',\n '0',\n firstKaminoReserve?.getLiquidityMint(),\n obligation.state.owner,\n kaminoMarket,\n obligation,\n kaminoMarket.programId,\n currentSlot\n );\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n axn.addRefreshObligation(payer);\n\n return axn;\n }\n\n static async buildRequestElevationGroupTxns(\n kaminoMarket: KaminoMarket,\n payer: PublicKey,\n obligation: KaminoObligation,\n elevationGroup: number,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n currentSlot: number = 0\n ) {\n const firstReserve = obligation.state.deposits[0].depositReserve;\n const firstKaminoReserve = kaminoMarket.getReserveByAddress(firstReserve);\n if (!firstKaminoReserve) {\n throw new Error(`Reserve ${firstReserve.toBase58()} not found`);\n }\n const axn = await KaminoAction.initialize(\n 'requestElevationGroup',\n '0',\n firstKaminoReserve?.getLiquidityMint(),\n obligation.state.owner,\n kaminoMarket,\n obligation,\n kaminoMarket.programId,\n currentSlot\n );\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n axn.addRefreshObligation(payer);\n axn.addRequestElevationIx(elevationGroup, true);\n\n return axn;\n }\n\n static async buildDepositTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initialize(\n 'deposit',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'deposit',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addDepositIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildBorrowTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n hostAta?: PublicKey\n ) {\n const axn = await KaminoAction.initialize(\n 'borrow',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot,\n hostAta\n );\n const addInitObligationForFarm = true;\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'borrow',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addBorrowIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildDepositReserveLiquidityTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initialize(\n 'mint',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'mint',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addDepositReserveLiquidityIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildRedeemReserveCollateralTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initialize(\n 'redeem',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'redeem',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addRedeemReserveCollateralIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildDepositObligationCollateralTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initialize(\n 'depositCollateral',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'depositCollateral',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addDepositObligationCollateralIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildDepositAndBorrowTxns(\n kaminoMarket: KaminoMarket,\n depositAmount: string | BN,\n depositMint: PublicKey,\n borrowAmount: string | BN,\n borrowMint: PublicKey,\n payer: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'depositAndBorrow',\n depositAmount,\n depositMint,\n borrowMint,\n payer,\n payer,\n obligation,\n borrowAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarmForDeposit = true;\n const addInitObligationForFarmForBorrow = false;\n const twoTokenAction = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n await axn.addSupportIxs(\n 'deposit',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarmForDeposit,\n twoTokenAction\n );\n await axn.addDepositAndBorrowIx();\n await axn.addInBetweenIxs(\n 'depositAndBorrow',\n includeAtaIxns,\n requestElevationGroup,\n addInitObligationForFarmForBorrow\n );\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildRepayAndWithdrawTxns(\n kaminoMarket: KaminoMarket,\n repayAmount: string | BN,\n repayMint: PublicKey,\n withdrawAmount: string | BN,\n withdrawMint: PublicKey,\n payer: PublicKey,\n currentSlot: number,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n isClosingPosition: boolean = false,\n referrer: PublicKey = PublicKey.default\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'repayAndWithdraw',\n repayAmount,\n repayMint,\n withdrawMint,\n payer,\n payer,\n obligation,\n withdrawAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarmForRepay = true;\n const addInitObligationForFarmForWithdraw = false;\n const twoTokenAction = true;\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'repay',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarmForRepay,\n twoTokenAction\n );\n await axn.addRepayAndWithdrawIxs();\n await axn.addInBetweenIxs(\n 'repayAndWithdraw',\n includeAtaIxns,\n requestElevationGroup,\n addInitObligationForFarmForWithdraw,\n isClosingPosition\n );\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildWithdrawTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initialize(\n 'withdraw',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'withdraw',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addWithdrawIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n /**\n *\n * @param kaminoMarket\n * @param amount\n * @param mint\n * @param owner\n * @param obligation - obligation to repay or the PDA seeds\n * @param currentSlot\n * @param payer - if not set then owner is used\n * @param extraComputeBudget - if > 0 then adds the ixn\n * @param includeAtaIxns - if true it includes create and close wsol and token atas\n * @param requestElevationGroup\n * @param includeUserMetadata - if true it includes user metadata\n * @param referrer\n */\n static async buildRepayTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n currentSlot: number,\n payer: PublicKey | undefined = undefined,\n extraComputeBudget: number = 1_000_000,\n includeAtaIxns: boolean = true,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true,\n referrer: PublicKey = PublicKey.default\n ) {\n const axn = await KaminoAction.initialize(\n 'repay',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot,\n undefined,\n payer\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'repay',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addRepayIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildLiquidateTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n minCollateralReceiveAmount: string | BN,\n repayTokenMint: PublicKey,\n withdrawTokenMint: PublicKey,\n liquidator: PublicKey,\n obligationOwner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas, and creates all other token atas if they don't exist\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n maxAllowedLtvOverridePercent: number = 0,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'liquidate',\n amount,\n repayTokenMint,\n withdrawTokenMint,\n liquidator,\n obligationOwner,\n obligation,\n minCollateralReceiveAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'liquidate',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addLiquidateIx(maxAllowedLtvOverridePercent);\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildWithdrawReferrerFeeTxns(\n owner: PublicKey,\n tokenMint: PublicKey,\n kaminoMarket: KaminoMarket,\n currentSlot: number = 0\n ) {\n const { axn, createAtasIxns } = await KaminoAction.initializeWithdrawReferrerFees(\n tokenMint,\n owner,\n kaminoMarket,\n currentSlot\n );\n\n axn.preTxnIxs.push(...createAtasIxns);\n axn.preTxnIxsLabels.push(`createAtasIxs[${axn.userTokenAccountAddress.toString()}]`);\n\n axn.addRefreshReserveIxs([axn.reserve.address]);\n axn.addWithdrawReferrerFeesIxs();\n\n return axn;\n }\n\n async getTransactions() {\n const txns: {\n preLendingTxn: Transaction | null;\n lendingTxn: Transaction | null;\n postLendingTxn: Transaction | null;\n } = {\n preLendingTxn: null,\n lendingTxn: null,\n postLendingTxn: null,\n };\n\n if (this.preTxnIxs.length) {\n txns.preLendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.preTxnIxs);\n }\n\n if (this.lendingIxs.length === 2) {\n txns.lendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(\n ...this.setupIxs,\n ...[this.lendingIxs[0]],\n ...this.inBetweenIxs,\n ...[this.lendingIxs[1]],\n ...this.cleanupIxs\n );\n } else {\n txns.lendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.setupIxs, ...this.lendingIxs, ...this.cleanupIxs);\n }\n\n if (this.postTxnIxs.length) {\n txns.postLendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.postTxnIxs);\n }\n\n return txns;\n }\n\n async sendTransactions(sendTransaction: (txn: Transaction, connection: Connection) => Promise<TransactionSignature>) {\n const txns = await this.getTransactions();\n\n await this.sendSingleTransaction(txns.preLendingTxn, sendTransaction);\n\n const signature = await this.sendSingleTransaction(txns.lendingTxn, sendTransaction);\n\n await this.sendSingleTransaction(txns.postLendingTxn, sendTransaction);\n\n return signature;\n }\n\n private async sendSingleTransaction(\n txn: Transaction | null,\n sendTransaction: (txn: Transaction, connection: Connection) => Promise<TransactionSignature>\n ) {\n if (!txn) return '';\n\n const signature = await sendTransaction(txn, this.kaminoMarket.getConnection());\n await this.kaminoMarket.getConnection().confirmTransaction(signature);\n\n return signature;\n }\n\n async simulateTransactions(\n sendTransaction: (\n txn: Transaction,\n connection: Connection\n ) => Promise<RpcResponseAndContext<SimulatedTransactionResponse>>\n ) {\n const txns = await this.getTransactions();\n\n await this.simulateSingleTransaction(txns.preLendingTxn, sendTransaction);\n\n const signature = await this.simulateSingleTransaction(txns.lendingTxn, sendTransaction);\n\n await this.simulateSingleTransaction(txns.postLendingTxn, sendTransaction);\n\n return signature;\n }\n\n private async simulateSingleTransaction(\n txn: Transaction | null,\n sendTransaction: (\n txn: Transaction,\n connection: Connection\n ) => Promise<RpcResponseAndContext<SimulatedTransactionResponse>>\n ) {\n if (!txn) return '';\n return await sendTransaction(txn, this.kaminoMarket.getConnection());\n }\n\n addDepositIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidityAndObligationCollateral`);\n this.lendingIxs.push(\n depositReserveLiquidityAndObligationCollateral(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveDestinationDepositCollateral: this.reserve.state.collateral.supplyVault, // destinationCollateral\n userSourceLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addDepositReserveLiquidityIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidity`);\n this.lendingIxs.push(\n depositReserveLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n userDestinationCollateral: this.userCollateralAccountAddress,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addRedeemReserveCollateralIx() {\n this.lendingIxsLabels.push(`redeemReserveCollateral`);\n this.lendingIxs.push(\n redeemReserveCollateral(\n {\n collateralAmount: this.amount,\n },\n {\n owner: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n userSourceCollateral: this.userCollateralAccountAddress,\n userDestinationLiquidity: this.userTokenAccountAddress,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addDepositObligationCollateralIx() {\n this.lendingIxsLabels.push(`depositObligationCollateral`);\n this.lendingIxs.push(\n depositObligationCollateral(\n {\n collateralAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n depositReserve: this.reserve.address,\n reserveDestinationCollateral: this.reserve.state.collateral.supplyVault,\n userSourceCollateral: this.userCollateralAccountAddress,\n tokenProgram: TOKEN_PROGRAM_ID,\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addBorrowIx() {\n this.lendingIxsLabels.push(`borrowObligationLiquidity`);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowIx = borrowObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n borrowReserve: this.reserve.address,\n borrowReserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveSourceLiquidity: this.reserve.state.liquidity.supplyVault,\n userDestinationLiquidity: this.userTokenAccountAddress,\n borrowReserveLiquidityFeeReceiver: this.reserve.state.liquidity.feeVault,\n referrerTokenState: referrerTokenStatePda(this.referrer, this.reserve.address, this.kaminoMarket.programId)[0],\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n borrowIx.keys = borrowIx.keys.concat([...depositReserveAccountMetas]);\n this.lendingIxs.push(borrowIx);\n }\n\n async addDepositAndBorrowIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidityAndObligationCollateral`);\n this.lendingIxsLabels.push(`borrowObligationLiquidity`);\n this.lendingIxs.push(\n depositReserveLiquidityAndObligationCollateral(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveDestinationDepositCollateral: this.reserve.state.collateral.supplyVault, // destinationCollateral\n userSourceLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n\n if (!this.outflowReserve) {\n throw new Error(`outflowReserve not set`);\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`additionalTokenAccountAddress not set`);\n }\n\n if (!this.outflowAmount) {\n throw new Error(`outflowAmount not set`);\n }\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n if (depositReservesList.length === 0) {\n depositReservesList.push(this.reserve.address);\n }\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowIx = borrowObligationLiquidity(\n {\n liquidityAmount: this.outflowAmount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n borrowReserve: this.outflowReserve.address,\n borrowReserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n reserveSourceLiquidity: this.outflowReserve.state.liquidity.supplyVault,\n userDestinationLiquidity: this.additionalTokenAccountAddress,\n borrowReserveLiquidityFeeReceiver: this.outflowReserve.state.liquidity.feeVault,\n referrerTokenState: referrerTokenStatePda(\n this.referrer,\n this.outflowReserve.address,\n this.kaminoMarket.programId\n )[0],\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n\n borrowIx.keys = borrowIx.keys.concat([...depositReserveAccountMetas]);\n\n this.lendingIxs.push(borrowIx);\n }\n\n async addRepayAndWithdrawIxs() {\n this.lendingIxsLabels.push(\n `repayObligationLiquidity(reserve=${this.reserve!.address})(obligation=${this.getObligationPda()})`\n );\n this.lendingIxsLabels.push(`withdrawObligationCollateralAndRedeemReserveCollateral`);\n this.lendingIxs.push(\n repayObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n repayReserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n reserveDestinationLiquidity: this.reserve.state.liquidity.supplyVault,\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n\n if (!this.outflowReserve) {\n throw new Error(`outflowReserve not set`);\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`additionalTokenAccountAddress not set`);\n }\n\n if (!this.outflowAmount) {\n throw new Error(`outflowAmount not set`);\n }\n\n const collateralExchangeRate = this.outflowReserve.getEstimatedCollateralExchangeRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n\n this.lendingIxs.push(\n withdrawObligationCollateralAndRedeemReserveCollateral(\n {\n collateralAmount: this.outflowAmount.eq(new BN(U64_MAX))\n ? this.outflowAmount\n : new BN(new Decimal(this.outflowAmount.toString()).mul(collateralExchangeRate).ceil().toString()),\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n withdrawReserve: this.outflowReserve.address,\n reserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n reserveCollateralMint: this.outflowReserve.getCTokenMint(),\n reserveLiquiditySupply: this.outflowReserve.state.liquidity.supplyVault,\n reserveSourceCollateral: this.outflowReserve.state.collateral.supplyVault,\n userDestinationLiquidity: this.additionalTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n async addWithdrawIx() {\n const collateralExchangeRate = this.reserve.getEstimatedCollateralExchangeRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n\n const collateralAmount = this.amount.eq(new BN(U64_MAX))\n ? this.amount\n : new BN(new Decimal(this.amount.toString()).mul(collateralExchangeRate).ceil().toString());\n\n this.lendingIxsLabels.push(`withdrawObligationCollateralAndRedeemReserveCollateral`);\n this.lendingIxs.push(\n withdrawObligationCollateralAndRedeemReserveCollateral(\n {\n collateralAmount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n withdrawReserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveSourceCollateral: this.reserve.state.collateral.supplyVault,\n userDestinationLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n async addRepayIx() {\n this.lendingIxsLabels.push(\n `repayObligationLiquidity(reserve=${this.reserve.address})(obligation=${this.getObligationPda()})`\n );\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const repayIx = repayObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.payer,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n repayReserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n reserveDestinationLiquidity: this.reserve.state.liquidity.supplyVault,\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n repayIx.keys = repayIx.keys.concat([...depositReserveAccountMetas]);\n\n this.lendingIxs.push(repayIx);\n }\n\n async addLiquidateIx(maxAllowedLtvOverridePercent: number = 0) {\n this.lendingIxsLabels.push(`liquidateObligationAndRedeemReserveCollateral`);\n if (!this.outflowReserve) {\n throw Error(`Withdraw reserve during liquidation is not defined`);\n }\n if (!this.additionalTokenAccountAddress) {\n throw Error(`Liquidating token account address is not defined`);\n }\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const liquidateIx = liquidateObligationAndRedeemReserveCollateral(\n {\n liquidityAmount: this.amount,\n // TODO: Configure this when updating liquidator with new interface\n minAcceptableReceivedLiquidityAmount: this.outflowAmount || new BN(0),\n maxAllowedLtvOverridePercent: new BN(maxAllowedLtvOverridePercent),\n },\n {\n liquidator: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n repayReserve: this.reserve.address,\n repayReserveLiquidityMint: this.reserve.getLiquidityMint(),\n repayReserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n withdrawReserve: this.outflowReserve.address,\n withdrawReserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n withdrawReserveCollateralMint: this.outflowReserve.getCTokenMint(),\n withdrawReserveCollateralSupply: this.outflowReserve.state.collateral.supplyVault,\n withdrawReserveLiquiditySupply: this.outflowReserve.state.liquidity.supplyVault,\n userSourceLiquidity: this.additionalTokenAccountAddress,\n userDestinationCollateral: this.userCollateralAccountAddress,\n userDestinationLiquidity: this.userTokenAccountAddress,\n withdrawReserveLiquidityFeeReceiver: this.outflowReserve.state.liquidity.feeVault,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n repayLiquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n withdrawLiquidityTokenProgram: this.outflowReserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n liquidateIx.keys = liquidateIx.keys.concat([...depositReserveAccountMetas]);\n this.lendingIxs.push(liquidateIx);\n }\n\n async addInBetweenIxs(\n action: ActionType,\n includeAtaIxns: boolean,\n requestElevationGroup: boolean,\n addInitObligationForFarm: boolean,\n isClosingPosition: boolean = false\n ) {\n await this.addSupportIxsWithoutInitObligation(\n action,\n includeAtaIxns,\n false,\n requestElevationGroup,\n addInitObligationForFarm,\n isClosingPosition\n );\n }\n\n addRefreshObligation(crank: PublicKey) {\n const uniqueReserveAddresses = new PublicKeySet(this.depositReserves.concat(this.borrowReserves)).toArray();\n\n const addAllToSetupIxns = true;\n // Union of addresses\n const allReservesExcludingCurrent = [...uniqueReserveAddresses];\n\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addAllToSetupIxns);\n this.addRefreshFarmsForReserve(\n this.depositReserves.map((r) => this.kaminoMarket.getReserveByAddress(r)!),\n addAllToSetupIxns,\n ReserveFarmKind.Collateral,\n crank\n );\n this.addRefreshFarmsForReserve(\n this.borrowReserves.map((r) => this.kaminoMarket.getReserveByAddress(r)!),\n addAllToSetupIxns,\n ReserveFarmKind.Debt,\n crank\n );\n this.addRefreshObligationIx(addAllToSetupIxns, false);\n }\n\n async addSupportIxsWithoutInitObligation(\n action: ActionType,\n includeAtaIxns: boolean,\n addToSetupIxs: boolean = true,\n requestElevationGroup: boolean = false,\n addInitObligationForFarm: boolean = false,\n isClosingPosition: boolean = false,\n twoTokenAction: boolean = false\n ) {\n // TODO: why are we not doing this first?\n if (includeAtaIxns) {\n await this.addAtaIxs(action);\n }\n\n if (\n [\n 'depositCollateral',\n 'deposit',\n 'withdraw',\n 'borrow',\n 'liquidate',\n 'repay',\n 'depositAndBorrow',\n 'repayAndWithdraw',\n 'refreshObligation',\n ].includes(action)\n ) {\n // The support ixns in order are:\n // 0. Init obligation ixn\n // 0. Token Ata ixns\n // 0. Init obligation for farm\n // 1. Ixns to refresh the reserves of the obligation not related to the current action\n // 2. Ixn to refresh the reserve of the current action\n // 3. Ixn to refresh the obligation\n // 4. Ixn to refresh the `debt` farm of the obligation\n // 5. Ixn to refresh the `collateral` farm of the obligation\n // 6. The instruction itself\n // 7. Ixn to refresh the `debt` farm of the obligation\n // 8. Ixn to refresh the `collateral` farm of the obligation\n\n let currentReserves: KaminoReserve[] = [];\n\n if (action === 'liquidate' || action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n if (!this.outflowReserve) {\n throw new Error('outflowReserve is undefined');\n }\n\n if (action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n currentReserves = [this.reserve, this.outflowReserve];\n if (this.obligation) {\n if (action === 'depositAndBorrow') {\n const deposit = this.obligation.state.deposits.find((deposit) =>\n deposit.depositReserve.equals(this.reserve.address)\n );\n\n if (!deposit) {\n this.preLoadedDepositReservesSameTx.push(this.reserve.address);\n }\n } else {\n const borrow = this.obligation.state.borrows.find((borrow) =>\n borrow.borrowReserve.equals(this.reserve.address)\n );\n\n if (!borrow) {\n throw Error(`Unable to find obligation borrow to repay for ${this.obligation.state.owner.toBase58()}`);\n }\n\n const cumulativeBorrowRateObligation = KaminoObligation.getCumulativeBorrowRate(borrow);\n\n const cumulativeBorrowRateReserve = this.reserve.getEstimatedCumulativeBorrowRate(this.currentSlot);\n const fullRepay = KaminoObligation.getBorrowAmount(borrow)\n .mul(cumulativeBorrowRateReserve)\n .div(cumulativeBorrowRateObligation);\n\n const amountDecimal = new Decimal(this.amount.toString());\n\n if (fullRepay.lte(amountDecimal)) {\n this.preLoadedBorrowReservesSameTx.push(this.reserve.address);\n }\n }\n } else {\n // Obligation doesn't exist yet, so we have to preload the deposit reserve\n this.preLoadedDepositReservesSameTx.push(this.reserve.address);\n }\n } else if (action === 'liquidate' && !this.outflowReserve.address.equals(this.reserve.address)) {\n currentReserves = [this.outflowReserve, this.reserve];\n } else {\n currentReserves = [this.reserve];\n }\n } else {\n currentReserves = [this.reserve];\n }\n\n const uniqueReserveAddresses = new PublicKeySet(this.depositReserves.concat(this.borrowReserves));\n const currentReserveAddresses = new PublicKeySet(currentReserves.map((reserve) => reserve.address));\n\n // Union of addresses\n const allReservesExcludingCurrent = [...uniqueReserveAddresses.toArray()].filter(\n (address) => !currentReserveAddresses.contains(address)\n );\n\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addToSetupIxs);\n if (addInitObligationForFarm) {\n if (action === 'liquidate') {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addToSetupIxs);\n await this.addInitObligationForFarm(this.outflowReserve!, ReserveFarmKind.Collateral, addToSetupIxs);\n } else if (\n action === 'depositAndBorrow' ||\n action === 'depositCollateral' ||\n action === 'withdraw' ||\n action === 'deposit'\n ) {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Collateral, addToSetupIxs);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Debt, addToSetupIxs);\n }\n } else if (action === 'repayAndWithdraw' || action === 'borrow' || action === 'repay') {\n // todo - probably don't need to add both debt and collateral for everything here\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addToSetupIxs);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Collateral, addToSetupIxs);\n }\n } else {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Collateral, addToSetupIxs);\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addToSetupIxs);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Collateral, addToSetupIxs);\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Debt, addToSetupIxs);\n }\n }\n }\n this.addRefreshReserveIxs(currentReserveAddresses.toArray(), addToSetupIxs);\n\n if (action === 'repayAndWithdraw' && !addToSetupIxs && isClosingPosition) {\n // addToSetupIxs === addInBetween (same thing)\n // If this is a repay and withdraw, and it's not the first action, and it's closing a position\n // we don't need to include the repay reserve in the refresh obligation\n // I am ashamed of this code, we need to rewrite this entire thing\n this.addRefreshObligationIx(addToSetupIxs, true);\n } else {\n this.addRefreshObligationIx(addToSetupIxs, false);\n }\n\n if (addToSetupIxs) {\n // If this is an setup ixn (therefore not an in-between), it means it's either a one off action\n // or the first of a two-token-action\n if (action === 'liquidate') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addToSetupIxs, ReserveFarmKind.Collateral);\n this.addRefreshFarmsForReserve([this.reserve], addToSetupIxs, ReserveFarmKind.Debt);\n } else if (\n action === 'depositAndBorrow' ||\n action === 'depositCollateral' ||\n action === 'withdraw' ||\n action === 'deposit'\n ) {\n this.addRefreshFarmsForReserve(\n currentReserves,\n addToSetupIxs,\n ReserveFarmKind.Collateral,\n undefined,\n twoTokenAction\n );\n } else if (action === 'repayAndWithdraw' || action === 'borrow' || action === 'repay') {\n this.addRefreshFarmsForReserve(\n currentReserves,\n addToSetupIxs,\n ReserveFarmKind.Debt,\n undefined,\n twoTokenAction\n );\n } else {\n throw new Error(`Could not decide on refresh farm for action ${action}`);\n }\n } else {\n // If this is an inbetween, it means it's part of a two-token-action\n // so we skip the refresh farm obligation of the first reserve as that operation already happened\n // add added to 'setup' ixns\n if (action === 'depositAndBorrow') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addToSetupIxs, ReserveFarmKind.Debt);\n } else if (action === 'repayAndWithdraw') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addToSetupIxs, ReserveFarmKind.Collateral);\n } else {\n throw new Error(`Could not decide on refresh farm for action ${action}`);\n }\n }\n\n if (action === 'depositAndBorrow' && requestElevationGroup) {\n const groupsColl = this.reserve.state.config.elevationGroups;\n const groupsDebt = this.outflowReserve!.state.config.elevationGroups;\n const groups = this.kaminoMarket.state.elevationGroups;\n const commonElevationGroups = [...groupsColl].filter((item) => groupsDebt.includes(item) && item !== 0);\n\n console.log(\n 'Groups of coll reserve',\n groupsColl,\n 'Groups of debt reserve',\n groupsDebt,\n 'Common groups',\n commonElevationGroups\n );\n\n if (commonElevationGroups.length === 0) {\n console.log('No common elevation groups found, staying with default');\n } else {\n const eModeGroupWithMaxLtv = commonElevationGroups.reduce((prev, curr) => {\n const prevGroup = groups.find((group) => group.id === prev);\n const currGroup = groups.find((group) => group.id === curr);\n return prevGroup!.ltvPct > currGroup!.ltvPct ? prev : curr;\n });\n\n const eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtv)!.id;\n console.log('Setting eModeGroup to', eModeGroup);\n\n if (eModeGroup !== 0 && eModeGroup !== this.obligation?.state.elevationGroup) {\n this.addRequestElevationIx(eModeGroup, false);\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addToSetupIxs);\n this.addRefreshReserveIxs(currentReserveAddresses.toArray(), addToSetupIxs);\n this.addRefreshObligationIx(addToSetupIxs);\n }\n }\n }\n }\n }\n\n async addSupportIxs(\n action: ActionType,\n includeAtaIxns: boolean,\n requestElevationGroup: boolean,\n includeUserMetadata: boolean,\n addInitObligationForFarm: boolean,\n twoTokenAction: boolean = false\n ) {\n if (!['mint', 'redeem'].includes(action)) {\n const [, ownerUserMetadata] = await this.kaminoMarket.getUserMetadata(this.owner);\n if (!ownerUserMetadata && includeUserMetadata) {\n await this.addInitUserMetadataIxs();\n }\n\n await this.addInitReferrerTokenStateIxs();\n await this.addInitObligationIxs();\n }\n\n await this.addSupportIxsWithoutInitObligation(\n action,\n includeAtaIxns,\n true,\n requestElevationGroup,\n addInitObligationForFarm,\n false,\n twoTokenAction\n );\n }\n\n private static optionalAccount(pubkey: PublicKey, programId: PublicKey = PROGRAM_ID): PublicKey {\n if (isNotNullPubkey(pubkey)) {\n return pubkey;\n } else {\n return programId;\n }\n }\n\n private addRefreshReserveIxs(reserves: PublicKey[], addToSetupIxs: boolean = true) {\n reserves.forEach((reserveAddress) => {\n const foundReserve = this.kaminoMarket.getReserveByAddress(reserveAddress);\n if (!foundReserve) {\n throw new Error(`Could not find reserve ${reserveAddress} in reserves`);\n }\n\n const { state } = foundReserve;\n\n const refreshReserveIx = refreshReserve(\n {\n lendingMarket: this.kaminoMarket.getAddress(),\n reserve: reserveAddress,\n pythOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.pythConfiguration.price,\n this.kaminoMarket.programId\n ),\n switchboardPriceOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.priceAggregator,\n this.kaminoMarket.programId\n ),\n switchboardTwapOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.twapAggregator,\n this.kaminoMarket.programId\n ),\n scopePrices: KaminoAction.optionalAccount(\n state.config.tokenInfo.scopeConfiguration.priceFeed,\n this.kaminoMarket.programId\n ),\n },\n this.kaminoMarket.programId\n );\n\n if (addToSetupIxs) {\n this.setupIxs.push(refreshReserveIx);\n this.setupIxsLabels.push(`RefreshReserve[${reserveAddress}]`);\n } else {\n this.inBetweenIxs.push(refreshReserveIx);\n this.inBetweenIxsLabels.push(`RefreshReserve[${reserveAddress}]`);\n }\n });\n }\n\n public static getRefreshAllReserves(kaminoMarket: KaminoMarket, reserves: PublicKey[]): TransactionInstruction[] {\n return reserves.map((reserveAddress): TransactionInstruction => {\n const foundReserve = kaminoMarket.getReserveByAddress(reserveAddress);\n if (!foundReserve) {\n throw new Error(`Could not find reserve ${reserveAddress} in reserves`);\n }\n\n const { state } = foundReserve;\n return refreshReserve(\n {\n reserve: reserveAddress,\n lendingMarket: state.lendingMarket,\n pythOracle: this.optionalAccount(state.config.tokenInfo.pythConfiguration.price, kaminoMarket.programId),\n switchboardPriceOracle: this.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.priceAggregator,\n kaminoMarket.programId\n ),\n switchboardTwapOracle: this.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.twapAggregator,\n kaminoMarket.programId\n ),\n scopePrices: this.optionalAccount(\n state.config.tokenInfo.scopeConfiguration.priceFeed,\n kaminoMarket.programId\n ),\n },\n kaminoMarket.programId\n );\n });\n }\n\n private addRefreshObligationIx(addToSetupIxs: boolean = true, skipBorrowObligations: boolean = false) {\n const marketAddress = this.kaminoMarket.getAddress();\n const obligationPda = this.getObligationPda();\n const refreshObligationIx = refreshObligation(\n {\n lendingMarket: marketAddress,\n obligation: obligationPda,\n },\n this.kaminoMarket.programId\n );\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const preloadedBorrowReservesString = this.preLoadedBorrowReservesSameTx.map((reserve) => reserve.toString());\n const borrowReservesList = this.borrowReserves.filter(\n (reserve) => !preloadedBorrowReservesString.includes(reserve.toString())\n );\n\n const borrowReserveAccountMetas = borrowReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowReservesReferrerTokenStates = borrowReservesList\n .map((reserve) => {\n if (this.referrer.equals(PublicKey.default)) {\n return { pubkey: this.kaminoMarket.programId, isSigner: false, isWritable: true };\n }\n const referrerTokenStateAddress = referrerTokenStatePda(this.referrer, reserve, this.kaminoMarket.programId)[0];\n return { pubkey: referrerTokenStateAddress, isSigner: false, isWritable: true };\n })\n .filter((x) => !x.pubkey.equals(this.kaminoMarket.programId));\n\n refreshObligationIx.keys = refreshObligationIx.keys.concat([\n ...depositReserveAccountMetas,\n ...(skipBorrowObligations ? [] : [...borrowReserveAccountMetas, ...borrowReservesReferrerTokenStates]),\n ]);\n\n if (addToSetupIxs) {\n this.setupIxs.push(refreshObligationIx);\n this.setupIxsLabels.push(`RefreshObligation[${obligationPda.toString()}]`);\n } else {\n this.inBetweenIxs.push(refreshObligationIx);\n this.inBetweenIxsLabels.push(`RefreshObligation[${obligationPda.toString()}]`);\n }\n }\n\n private addRequestElevationIx(elevationGroup: number, addToSetupIxs: boolean) {\n const obligationPda = this.getObligationPda();\n const args: RequestElevationGroupArgs = {\n elevationGroup,\n };\n const accounts: RequestElevationGroupAccounts = {\n owner: this.owner,\n obligation: obligationPda,\n lendingMarket: this.kaminoMarket.getAddress(),\n };\n\n const requestElevationGroupIx = requestElevationGroup(args, accounts, this.kaminoMarket.programId);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const preloadedBorrowReservesString = this.preLoadedBorrowReservesSameTx.map((reserve) => reserve.toString());\n const borrowReservesList = this.borrowReserves.filter(\n (reserve) => !preloadedBorrowReservesString.includes(reserve.toString())\n );\n\n const borrowReserveAccountMetas = borrowReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowReservesReferrerTokenStates = borrowReservesList\n .map((reserve) => {\n if (this.referrer.equals(PublicKey.default)) {\n return { pubkey: this.kaminoMarket.programId, isSigner: false, isWritable: true };\n }\n const reserveState = this.kaminoMarket.getReserveByAddress(reserve)!;\n const referrerTokenStateAddress = referrerTokenStatePda(\n this.referrer,\n reserveState.address,\n this.kaminoMarket.programId\n )[0];\n return { pubkey: referrerTokenStateAddress, isSigner: false, isWritable: true };\n })\n .filter((x) => !x.pubkey.equals(this.kaminoMarket.programId));\n\n requestElevationGroupIx.keys = requestElevationGroupIx.keys.concat([\n ...depositReserveAccountMetas,\n ...borrowReserveAccountMetas,\n ...borrowReservesReferrerTokenStates,\n ]);\n\n if (addToSetupIxs) {\n this.setupIxs.push(requestElevationGroupIx);\n this.setupIxsLabels.push(`RequestElevation[${obligationPda}], elevation_group:${elevationGroup}`);\n } else {\n this.inBetweenIxs.push(requestElevationGroupIx);\n this.inBetweenIxsLabels.push(`RequestElevation[${obligationPda}], elevation_group:${elevationGroup}`);\n }\n }\n\n private addRefreshFarmsForReserve(\n reserves: KaminoReserve[],\n addToSetupIxs: boolean = true,\n mode: typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n crank: PublicKey = this.payer,\n twoTokenAction: boolean = false\n ) {\n const BASE_SEED_USER_STATE = Buffer.from('user');\n const getPda = (farm: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [BASE_SEED_USER_STATE, farm.toBytes(), this.getObligationPda().toBytes()],\n farmsId\n )[0];\n\n const farms: [\n typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n PublicKey,\n PublicKey,\n KaminoReserve\n ][] = [];\n\n for (const kaminoReserve of reserves) {\n if (mode === ReserveFarmKind.Collateral && !kaminoReserve.state.farmCollateral.equals(PublicKey.default)) {\n farms.push([\n ReserveFarmKind.Collateral,\n kaminoReserve.state.farmCollateral,\n getPda(kaminoReserve.state.farmCollateral),\n kaminoReserve,\n ]);\n }\n if (mode === ReserveFarmKind.Debt && !kaminoReserve.state.farmDebt.equals(PublicKey.default)) {\n farms.push([\n ReserveFarmKind.Debt,\n kaminoReserve.state.farmDebt,\n getPda(kaminoReserve.state.farmDebt),\n kaminoReserve,\n ]);\n }\n }\n\n farms.forEach(\n (arg: [typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt, PublicKey, PublicKey, KaminoReserve]) => {\n const args: RefreshObligationFarmsForReserveArgs = { mode: arg[0].discriminator };\n const accounts: RefreshObligationFarmsForReserveAccounts = {\n crank,\n obligation: this.getObligationPda(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: arg[3].address,\n reserveFarmState: arg[1],\n obligationFarmUserState: arg[2],\n lendingMarket: this.kaminoMarket.getAddress(),\n farmsProgram: farmsId,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n };\n const refreshFarmForObligationix = refreshObligationFarmsForReserve(\n args,\n accounts,\n this.kaminoMarket.programId\n );\n\n if (addToSetupIxs) {\n this.setupIxs.push(refreshFarmForObligationix);\n this.setupIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n if (twoTokenAction) {\n // If two token action, this refresh needs to be the first inbetween ix\n this.inBetweenIxs.push(refreshFarmForObligationix);\n this.inBetweenIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n } else {\n this.refreshFarmsCleanupTxnIxs.push(refreshFarmForObligationix);\n this.refreshFarmsCleanupTxnIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n }\n } else {\n this.inBetweenIxs.push(refreshFarmForObligationix);\n this.inBetweenIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n\n this.refreshFarmsCleanupTxnIxs.push(refreshFarmForObligationix);\n this.refreshFarmsCleanupTxnIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n }\n }\n );\n }\n\n private addRefreshFarmsCleanupTxnIxsToCleanupIxs() {\n this.cleanupIxs.splice(this.cleanupIxs.length - 1, 0, ...this.refreshFarmsCleanupTxnIxs);\n this.cleanupIxsLabels.splice(this.cleanupIxsLabels.length - 1, 0, ...this.refreshFarmsCleanupTxnIxsLabels);\n }\n\n private async addInitObligationForFarm(\n reserve: KaminoReserve,\n mode: typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n addToSetupIxs: boolean = true\n ): Promise<void> {\n const BASE_SEED_USER_STATE = Buffer.from('user');\n const getPda = (farm: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [BASE_SEED_USER_STATE, farm.toBytes(), this.getObligationPda().toBytes()],\n farmsId\n )[0];\n\n const farms: [number, PublicKey, PublicKey][] = [];\n\n if (mode === ReserveFarmKind.Collateral && isNotNullPubkey(reserve.state.farmCollateral)) {\n const pda = getPda(reserve.state.farmCollateral);\n const account = await this.kaminoMarket.getConnection().getAccountInfo(pda);\n if (!account) {\n farms.push([ReserveFarmKind.Collateral.discriminator, reserve.state.farmCollateral, pda]);\n }\n }\n\n if (mode === ReserveFarmKind.Debt && isNotNullPubkey(reserve.state.farmDebt)) {\n const pda = getPda(reserve.state.farmDebt);\n const account = await this.kaminoMarket.getConnection().getAccountInfo(pda);\n if (!account) {\n farms.push([ReserveFarmKind.Debt.discriminator, reserve.state.farmDebt, getPda(reserve.state.farmDebt)]);\n }\n }\n\n farms.forEach((arg: [number, PublicKey, PublicKey]) => {\n const args: InitObligationFarmsForReserveArgs = { mode: arg[0] };\n const accounts: InitObligationFarmsForReserveAccounts = {\n owner: this.obligation ? this.obligation.state.owner : this.owner,\n payer: this.owner,\n obligation: this.getObligationPda(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: reserve.address,\n reserveFarmState: arg[1],\n obligationFarm: arg[2],\n lendingMarket: this.kaminoMarket.getAddress(),\n farmsProgram: farmsId,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n };\n const initObligationForFarm = initObligationFarmsForReserve(args, accounts, this.kaminoMarket.programId);\n if (addToSetupIxs) {\n this.setupIxs.push(initObligationForFarm);\n this.setupIxsLabels.push(\n `InitObligationForFarm[${reserve.address.toString()}, ${this.getObligationPda().toString()}]`\n );\n } else {\n this.inBetweenIxs.push(initObligationForFarm);\n this.inBetweenIxsLabels.push(\n `InitObligationForFarm[${reserve.address.toString()}, ${this.getObligationPda().toString()}]`\n );\n }\n });\n }\n\n private async addInitObligationIxs() {\n if (!this.obligation) {\n const obligationPda = this.getObligationPda();\n const [userMetadataAddress, _bump] = userMetadataPda(this.owner, this.kaminoMarket.programId);\n const initObligationIx = initObligation(\n {\n args: {\n tag: this.obligationType!.toArgs().tag,\n id: this.obligationType!.toArgs().id,\n },\n },\n {\n obligationOwner: this.owner,\n feePayer: this.payer,\n obligation: obligationPda,\n lendingMarket: this.kaminoMarket.getAddress(),\n seed1Account: this.obligationType!.toArgs().seed1,\n seed2Account: this.obligationType!.toArgs().seed2,\n ownerUserMetadata: userMetadataAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n this.setupIxs.push(initObligationIx);\n this.setupIxsLabels.push(`InitObligation[${obligationPda.toString()}]`);\n }\n }\n\n private async addInitUserMetadataIxs() {\n const [createLutIx, lookupTableAddress] = await createLookupTableIx(this.kaminoMarket.getConnection(), this.owner);\n this.setupIxs.push(createLutIx);\n this.setupIxsLabels.push(`createUserLutIx[${lookupTableAddress.toString()}]`);\n const [userMetadataAddress, _bump] = userMetadataPda(this.owner, this.kaminoMarket.programId);\n const referrerUserMetadataAddress = this.referrer.equals(PublicKey.default)\n ? this.kaminoMarket.programId\n : userMetadataPda(this.referrer, this.kaminoMarket.programId)[0];\n const initUserMetadataIx = initUserMetadata(\n {\n userLookupTable: lookupTableAddress,\n },\n {\n owner: this.owner,\n feePayer: this.payer,\n userMetadata: userMetadataAddress,\n referrerUserMetadata: referrerUserMetadataAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n this.setupIxs.push(initUserMetadataIx);\n this.setupIxsLabels.push(`initUserMetadata[${userMetadataAddress.toString()}]`);\n }\n\n private async addInitReferrerTokenStateIxs(reservesArr: KaminoReserve[] = []) {\n if (this.referrer.equals(PublicKey.default)) {\n return;\n }\n\n const reserves = reservesArr.length !== 0 ? reservesArr : [...new Set([this.reserve, this.outflowReserve])];\n const tokenStatesToCreate: [PublicKey, PublicKey][] = [];\n for (const reserve of reserves) {\n if (!reserve) {\n continue;\n }\n\n const referrerTokenStateAddress = referrerTokenStatePda(\n this.referrer,\n reserve.address,\n this.kaminoMarket.programId\n )[0];\n\n if (!(await checkIfAccountExists(this.kaminoMarket.getConnection(), referrerTokenStateAddress))) {\n tokenStatesToCreate.push([referrerTokenStateAddress, reserve?.address]);\n }\n }\n\n tokenStatesToCreate.forEach(([referrerTokenStateAddress, reserveAddress]) => {\n const initreferrerTokenStateIx = initReferrerTokenState(\n {\n referrer: this.referrer,\n },\n {\n lendingMarket: this.kaminoMarket.getAddress(),\n payer: this.owner,\n reserve: reserveAddress,\n referrerTokenState: referrerTokenStateAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n\n this.setupIxs.unshift(initreferrerTokenStateIx);\n this.setupIxsLabels.unshift(\n `InitReferrerTokenState[${referrerTokenStateAddress.toString()} res=${reserveAddress}]`\n );\n });\n }\n\n private addWithdrawReferrerFeesIxs() {\n const referrerTokenStateAddress = referrerTokenStatePda(\n this.owner,\n this.reserve.address,\n this.kaminoMarket.programId\n )[0];\n\n const withdrawReferrerFeesIx = withdrawReferrerFees(\n {\n referrer: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n referrerTokenState: referrerTokenStateAddress,\n reserveSupplyLiquidity: this.reserve.state.liquidity.supplyVault,\n referrerTokenAccount: this.userTokenAccountAddress,\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n },\n this.kaminoMarket.programId\n );\n\n this.lendingIxs.push(withdrawReferrerFeesIx);\n this.lendingIxsLabels.push(`WithdrawReferrerFeesIx[${this.owner.toString()}]`);\n }\n\n private addComputeBudgetIxn(units: number) {\n this.setupIxs.push(buildComputeBudgetIx(units));\n this.setupIxsLabels.push(`AddComputeBudget[${units}]`);\n }\n\n private async addAtaIxs(action: ActionType) {\n if (this.mint.equals(WRAPPED_SOL_MINT) || this.secondaryMint?.equals(WRAPPED_SOL_MINT)) {\n await this.updateWSOLAccount(action);\n }\n\n if ((action === 'withdraw' || action === 'borrow' || action === 'redeem') && !this.mint.equals(WRAPPED_SOL_MINT)) {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.reserve.getLiquidityMint(),\n this.owner,\n this.reserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT && this.hostAta) {\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateLiquidityUserAta[${this.owner}]`);\n } else {\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateLiquidityUserAta[${this.owner}]`);\n }\n }\n }\n\n if (action === 'liquidate') {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n if (!this.outflowReserve) {\n throw new Error(`Outflow reserve state not found ${this.mint}`);\n }\n\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getLiquidityMint(),\n this.owner,\n this.outflowReserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n } else {\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n }\n }\n\n const userCollateralAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.userCollateralAccountAddress);\n if (!userCollateralAccountInfo) {\n const [, createUserCollateralAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getCTokenMint(),\n this.owner,\n TOKEN_PROGRAM_ID,\n this.userCollateralAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserCollateralAccountIx);\n this.preTxnIxsLabels.push(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n } else {\n this.setupIxs.unshift(createUserCollateralAccountIx);\n this.setupIxsLabels.unshift(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n }\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.mint}`);\n }\n }\n\n if (\n action === 'depositAndBorrow' ||\n (action === 'repayAndWithdraw' && !this.secondaryMint?.equals(WRAPPED_SOL_MINT))\n ) {\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.secondaryMint}`);\n }\n\n if (!this.outflowReserve) {\n throw new Error(`Outflow reserve state not found ${this.mint}`);\n }\n\n const additionalUserTokenAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.additionalTokenAccountAddress);\n\n if (!additionalUserTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getLiquidityMint(),\n this.owner,\n this.outflowReserve.getLiquidityTokenProgram(),\n this.additionalTokenAccountAddress\n );\n\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateAdditionalUserTokenAta[${this.owner}]`);\n }\n }\n\n if (action === 'withdraw' || action === 'mint' || action === 'deposit' || action === 'repayAndWithdraw') {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n // TODO: Might need to remove this\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.reserve.getLiquidityMint(),\n this.owner,\n this.reserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n }\n }\n if (action === 'mint') {\n const userCollateralAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.userCollateralAccountAddress);\n\n if (!userCollateralAccountInfo) {\n const collateralMintPubkey = this.reserve.getCTokenMint();\n const [, createUserCollateralAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n collateralMintPubkey,\n this.owner,\n TOKEN_PROGRAM_ID,\n this.userCollateralAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserCollateralAccountIx);\n this.preTxnIxsLabels.push(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n } else {\n this.setupIxs.unshift(createUserCollateralAccountIx);\n this.setupIxsLabels.unshift(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n }\n }\n }\n }\n\n private async updateWSOLAccount(action: ActionType) {\n const preIxs: Array<TransactionInstruction> = [];\n const postIxs: Array<TransactionInstruction> = [];\n const preIxsLabels: Array<string> = [];\n const postIxsLabels: Array<string> = [];\n\n if (action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n return;\n }\n\n let safeRepay = new BN(this.amount);\n\n if (this.obligation && action === 'repay' && this.amount.eq(new BN(U64_MAX))) {\n const borrow = this.obligation.state.borrows.find(\n (borrow) => borrow.borrowReserve.toString() === this.reserve.address.toString()\n );\n\n if (!borrow) {\n throw Error(`Unable to find obligation borrow to repay for ${this.obligation.state.owner.toBase58()}`);\n }\n\n const cumulativeBorrowRateObligation = KaminoObligation.getCumulativeBorrowRate(borrow);\n const cumulativeBorrowRateReserve = this.reserve.getEstimatedCumulativeBorrowRate(this.currentSlot);\n // TODO: shouldn't this calc be added to all other stuff as well?\n safeRepay = new BN(\n Math.floor(\n KaminoObligation.getBorrowAmount(borrow)\n .mul(cumulativeBorrowRateReserve)\n .div(cumulativeBorrowRateObligation)\n .add(new Decimal(SOL_PADDING_FOR_INTEREST.toString()))\n .toNumber()\n ).toString()\n );\n }\n\n let userTokenAccountAddress = this.userTokenAccountAddress;\n if (this.secondaryMint?.equals(WRAPPED_SOL_MINT)) {\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.secondaryMint}`);\n }\n userTokenAccountAddress = this.additionalTokenAccountAddress;\n }\n\n const userWSOLAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(userTokenAccountAddress);\n\n const rentExempt = await this.kaminoMarket.getConnection().getMinimumBalanceForRentExemption(165);\n\n // Add rent exemption lamports for WSOL accounts that need to be pre-funded for inflow/send transactions\n const sendAction =\n action === 'deposit' ||\n action === 'repay' ||\n action === 'mint' ||\n (action === 'liquidate' && this.secondaryMint?.equals(WRAPPED_SOL_MINT)); // only sync WSOL amount if liquidator repays SOL which is secondaryMint\n\n const transferLamportsIx = SystemProgram.transfer({\n fromPubkey: this.owner,\n toPubkey: userTokenAccountAddress,\n lamports: (userWSOLAccountInfo ? 0 : rentExempt) + (sendAction ? parseInt(safeRepay.toString(), 10) : 0),\n });\n preIxs.push(transferLamportsIx);\n preIxsLabels.push(`TransferLamportsToUserAtaSOL[${userTokenAccountAddress}]`);\n\n const closeWSOLAccountIx = createCloseAccountInstruction(\n userTokenAccountAddress,\n this.owner,\n this.owner,\n TOKEN_PROGRAM_ID\n );\n\n const syncIx = syncNative(userTokenAccountAddress);\n if (userWSOLAccountInfo) {\n if (sendAction) {\n preIxs.push(syncIx);\n preIxsLabels.push(`SyncUserAtaSOL[${userTokenAccountAddress}]`);\n } else {\n postIxs.push(closeWSOLAccountIx);\n postIxsLabels.push(`CloseUserAtaSOL[${userTokenAccountAddress}]`);\n }\n } else {\n const [, createUserWSOLAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n NATIVE_MINT,\n this.owner,\n TOKEN_PROGRAM_ID,\n userTokenAccountAddress\n );\n preIxs.push(createUserWSOLAccountIx);\n preIxsLabels.push(`CreateUserAtaSOL[${userTokenAccountAddress}]`);\n preIxs.push(syncIx);\n preIxsLabels.push(`SyncUserAtaSOL[${userTokenAccountAddress}]`);\n postIxs.push(closeWSOLAccountIx);\n postIxsLabels.push(`CloseUserAtaSOL[${userTokenAccountAddress}]`);\n }\n\n // TODO: Consider for liquidations and other types of actions if we have to split up some ixs in 2-3 txs\n // if (this.positions && this.positions >= POSITION_LIMIT) {\n // this.preTxnIxs.push(...preIxs);\n // this.preTxnIxsLabels.push(...preIxsLabels);\n // this.postTxnIxs.push(...postIxs);\n // this.postTxnIxsLabels.push(...postIxsLabels);\n // } else {\n // }\n this.setupIxs.unshift(...preIxs);\n this.setupIxsLabels.unshift(...preIxsLabels);\n this.cleanupIxs.push(...postIxs);\n this.cleanupIxsLabels.push(...postIxsLabels);\n }\n\n static async initializeMultiTokenAction(\n kaminoMarket: KaminoMarket,\n action: ActionType,\n inflowAmount: string | BN,\n inflowTokenMint: PublicKey,\n outflowTokenMint: PublicKey,\n payer: PublicKey,\n obligationOwner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n outflowAmount?: string | BN,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const inflowReserve = kaminoMarket.getReserveByMint(inflowTokenMint);\n const outflowReserve = kaminoMarket.getReserveByMint(outflowTokenMint);\n\n if (!outflowReserve || !inflowReserve) {\n throw new Error('reserve states are not fetched');\n }\n\n const {\n userTokenAccountAddress: userOutflowTokenAccountAddress,\n userCollateralAccountAddress: userOutflowCollateralAccountAddress,\n } = KaminoAction.getUserAccountAddresses(payer, outflowReserve.state);\n\n const {\n userTokenAccountAddress: userInflowTokenAccountAddress,\n userCollateralAccountAddress: userInflowCollateralAccountAddress,\n } = KaminoAction.getUserAccountAddresses(payer, inflowReserve.state);\n\n const { kaminoObligation, depositReserves, borrowReserves, distinctReserveCount } =\n await KaminoAction.loadObligation(\n action,\n kaminoMarket,\n obligationOwner,\n inflowReserve.address,\n obligation,\n outflowReserve.address\n );\n\n const [_, userMetadata] = await kaminoMarket.getUserMetadata(payer);\n if (userMetadata) {\n referrer = userMetadata.referrer;\n }\n\n const referrerKey = kaminoObligation ? kaminoObligation.state.referrer : referrer;\n\n let userTokenAccountAddress: PublicKey;\n let userCollateralAccountAddress: PublicKey;\n let additionalUserTokenAccountAddress: PublicKey;\n let secondaryMint: PublicKey;\n let primaryMint: PublicKey;\n\n if (action === 'liquidate') {\n userTokenAccountAddress = userOutflowTokenAccountAddress;\n userCollateralAccountAddress = userOutflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userInflowTokenAccountAddress;\n primaryMint = outflowTokenMint;\n secondaryMint = inflowTokenMint;\n } else if (action === 'depositAndBorrow') {\n userTokenAccountAddress = userInflowTokenAccountAddress;\n userCollateralAccountAddress = userInflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userOutflowTokenAccountAddress;\n primaryMint = inflowTokenMint;\n secondaryMint = outflowTokenMint;\n } else if (action === 'repayAndWithdraw') {\n primaryMint = inflowTokenMint;\n secondaryMint = outflowTokenMint;\n userTokenAccountAddress = userInflowTokenAccountAddress;\n userCollateralAccountAddress = userOutflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userOutflowTokenAccountAddress;\n } else {\n throw new Error('Invalid action');\n }\n\n return new KaminoAction(\n kaminoMarket,\n payer,\n kaminoObligation || obligation,\n userTokenAccountAddress,\n userCollateralAccountAddress,\n primaryMint,\n distinctReserveCount,\n inflowAmount,\n depositReserves,\n borrowReserves,\n inflowReserve,\n currentSlot,\n undefined,\n secondaryMint,\n additionalUserTokenAccountAddress,\n outflowReserve,\n outflowAmount,\n referrerKey\n );\n }\n\n static async initializeWithdrawReferrerFees(\n mint: PublicKey,\n owner: PublicKey,\n kaminoMarket: KaminoMarket,\n currentSlot: number = 0,\n hostAta?: PublicKey\n ) {\n const reserve = kaminoMarket.getReserveByMint(mint);\n if (reserve === undefined) {\n throw new Error(`Reserve ${mint} not found in market ${kaminoMarket.getAddress().toBase58()}`);\n }\n\n const { atas, createAtasIxns } = await getAtasWithCreateIxnsIfMissing(kaminoMarket.getConnection(), owner, [\n reserve.getLiquidityMint(),\n ]);\n\n const userTokenAccountAddress = atas[0];\n\n return {\n axn: new KaminoAction(\n kaminoMarket,\n owner,\n new VanillaObligation(kaminoMarket.programId),\n userTokenAccountAddress,\n PublicKey.default,\n mint,\n 0,\n new BN(0),\n [],\n [],\n reserve,\n currentSlot,\n hostAta,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined\n ),\n createAtasIxns,\n };\n }\n\n getObligationPda(): PublicKey {\n return this.obligation\n ? this.obligation.obligationAddress\n : this.obligationType!.toPda(this.kaminoMarket.getAddress(), this.owner);\n }\n\n getAdditionalDepositReservesList(): PublicKey[] {\n const depositReservesList = this.depositReserves;\n\n // check if there's any member in the preloadedDepositReserves that is not in the depositReserves\n // if so, add it to the depositReserves\n for (let i = 0; i < this.preLoadedDepositReservesSameTx.length; i++) {\n const preloadedDepositReserve = this.preLoadedDepositReservesSameTx[i];\n\n // Check if the depositReserves array contains the current preloadedDepositReserve\n const found = this.depositReserves.some((depositReserve) => {\n return depositReserve.equals(preloadedDepositReserve);\n });\n\n // If not found, push the current preloadedDepositReserve to the depositReserves array\n if (!found) {\n depositReservesList.push(this.preLoadedDepositReservesSameTx[i]);\n }\n }\n\n return depositReservesList;\n }\n}\n"]}
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/classes/action.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Connection,\n PublicKey,\n RpcResponseAndContext,\n SimulatedTransactionResponse,\n SystemProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n Transaction,\n TransactionInstruction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, NATIVE_MINT, TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport BN from 'bn.js';\nimport Decimal from 'decimal.js';\nimport {\n borrowObligationLiquidity,\n depositObligationCollateral,\n depositReserveLiquidity,\n depositReserveLiquidityAndObligationCollateral,\n initObligation,\n initObligationFarmsForReserve,\n InitObligationFarmsForReserveAccounts,\n InitObligationFarmsForReserveArgs,\n initReferrerTokenState,\n initUserMetadata,\n liquidateObligationAndRedeemReserveCollateral,\n redeemReserveCollateral,\n refreshObligation,\n refreshObligationFarmsForReserve,\n RefreshObligationFarmsForReserveAccounts,\n RefreshObligationFarmsForReserveArgs,\n refreshReserve,\n repayObligationLiquidity,\n requestElevationGroup,\n RequestElevationGroupAccounts,\n RequestElevationGroupArgs,\n withdrawObligationCollateralAndRedeemReserveCollateral,\n withdrawReferrerFees,\n} from '../idl_codegen/instructions';\nimport {\n buildComputeBudgetIx,\n createAssociatedTokenAccountIdempotentInstruction,\n ObligationType,\n syncNative,\n U64_MAX,\n referrerTokenStatePda,\n userMetadataPda,\n getAtasWithCreateIxnsIfMissing,\n checkIfAccountExists,\n createLookupTableIx,\n isNotNullPubkey,\n PublicKeySet,\n WRAPPED_SOL_MINT,\n getAssociatedTokenAddress,\n} from '../utils';\nimport { KaminoMarket } from './market';\nimport { KaminoObligation } from './obligation';\nimport { KaminoReserve } from './reserve';\nimport { ReserveFarmKind } from '../idl_codegen/types';\nimport { farmsId } from '@hubbleprotocol/farms-sdk';\nimport { Reserve } from '../idl_codegen/accounts';\nimport { VanillaObligation } from '../utils/ObligationType';\nimport { PROGRAM_ID } from '../lib';\nimport { createCloseAccountInstruction } from '../utils/token';\n\nexport const POSITION_LIMIT = 10;\nexport const BORROWS_LIMIT = 5;\nexport const DEPOSITS_LIMIT = 8;\n\nconst SOL_PADDING_FOR_INTEREST = new BN('1000000');\n\nexport type ActionType =\n | 'deposit'\n | 'borrow'\n | 'withdraw'\n | 'repay'\n | 'mint'\n | 'redeem'\n | 'depositCollateral'\n | 'liquidate'\n | 'depositAndBorrow'\n | 'repayAndWithdraw'\n | 'refreshObligation'\n | 'requestElevationGroup'\n | 'withdrawReferrerFees';\n\nexport class KaminoAction {\n kaminoMarket: KaminoMarket;\n\n reserve: KaminoReserve;\n\n outflowReserve: KaminoReserve | undefined;\n\n owner: PublicKey;\n payer: PublicKey;\n\n obligation: KaminoObligation | null = null;\n\n referrer: PublicKey;\n\n userTokenAccountAddress: PublicKey;\n\n userCollateralAccountAddress: PublicKey;\n\n additionalTokenAccountAddress?: PublicKey;\n\n /**\n * Null unless the obligation is not passed\n */\n obligationType: ObligationType | null = null;\n\n mint: PublicKey;\n\n secondaryMint?: PublicKey;\n\n positions?: number;\n\n amount: BN;\n outflowAmount?: BN;\n\n hostAta?: PublicKey;\n\n setupIxs: Array<TransactionInstruction>;\n setupIxsLabels: Array<string>;\n\n inBetweenIxs: Array<TransactionInstruction>;\n inBetweenIxsLabels: Array<string>;\n\n lendingIxs: Array<TransactionInstruction>;\n lendingIxsLabels: Array<string>;\n\n cleanupIxs: Array<TransactionInstruction>;\n cleanupIxsLabels: Array<string>;\n\n preTxnIxs: Array<TransactionInstruction>;\n preTxnIxsLabels: Array<string>;\n\n postTxnIxs: Array<TransactionInstruction>;\n postTxnIxsLabels: Array<string>;\n\n refreshFarmsCleanupTxnIxs: Array<TransactionInstruction>;\n refreshFarmsCleanupTxnIxsLabels: Array<string>;\n\n depositReserves: Array<PublicKey>;\n borrowReserves: Array<PublicKey>;\n\n preLoadedDepositReservesSameTx: Array<PublicKey>;\n preLoadedBorrowReservesSameTx: Array<PublicKey>;\n\n currentSlot: number;\n\n private constructor(\n kaminoMarket: KaminoMarket,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType | null,\n userTokenAccountAddress: PublicKey,\n userCollateralAccountAddress: PublicKey,\n mint: PublicKey,\n positions: number,\n amount: string | BN,\n depositReserves: Array<PublicKey>,\n borrowReserves: Array<PublicKey>,\n reserveState: KaminoReserve,\n currentSlot: number,\n hostAta?: PublicKey,\n secondaryMint?: PublicKey,\n additionalTokenAccountAddress?: PublicKey,\n outflowReserveState?: KaminoReserve,\n outflowAmount?: string | BN,\n referrer?: PublicKey,\n payer?: PublicKey\n ) {\n if (obligation instanceof KaminoObligation) {\n this.obligation = obligation;\n } else if (obligation !== null) {\n this.obligationType = obligation;\n }\n\n this.kaminoMarket = kaminoMarket;\n this.owner = owner;\n this.payer = payer ?? owner;\n this.amount = new BN(amount);\n this.mint = mint;\n this.positions = positions;\n this.hostAta = hostAta;\n this.userTokenAccountAddress = userTokenAccountAddress;\n this.userCollateralAccountAddress = userCollateralAccountAddress;\n this.setupIxs = [];\n this.setupIxsLabels = [];\n this.inBetweenIxs = [];\n this.inBetweenIxsLabels = [];\n this.lendingIxs = [];\n this.lendingIxsLabels = [];\n this.cleanupIxs = [];\n this.cleanupIxsLabels = [];\n this.preTxnIxs = [];\n this.preTxnIxsLabels = [];\n this.postTxnIxs = [];\n this.postTxnIxsLabels = [];\n this.refreshFarmsCleanupTxnIxs = [];\n this.refreshFarmsCleanupTxnIxsLabels = [];\n this.depositReserves = depositReserves;\n this.borrowReserves = borrowReserves;\n this.additionalTokenAccountAddress = additionalTokenAccountAddress;\n this.secondaryMint = secondaryMint;\n this.reserve = reserveState;\n this.outflowReserve = outflowReserveState;\n this.outflowAmount = outflowAmount ? new BN(outflowAmount) : undefined;\n this.preLoadedDepositReservesSameTx = [];\n this.preLoadedBorrowReservesSameTx = [];\n this.referrer = referrer ? referrer : PublicKey.default;\n this.currentSlot = currentSlot;\n }\n\n static async initialize(\n action: ActionType,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n kaminoMarket: KaminoMarket,\n obligation: KaminoObligation | ObligationType,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n hostAta?: PublicKey,\n payer?: PublicKey\n ) {\n const reserve = kaminoMarket.getReserveByMint(mint);\n if (reserve === undefined) {\n throw new Error(`Reserve ${mint} not found in market ${kaminoMarket.getAddress().toBase58()}`);\n }\n\n const { userTokenAccountAddress, userCollateralAccountAddress } = KaminoAction.getUserAccountAddresses(\n payer ?? owner,\n reserve.state\n );\n\n const { kaminoObligation, depositReserves, borrowReserves, distinctReserveCount } =\n await KaminoAction.loadObligation(action, kaminoMarket, owner, reserve.address, obligation);\n\n const [_, userMetadata] = await kaminoMarket.getUserMetadata(owner);\n if (userMetadata) {\n referrer = userMetadata.referrer;\n }\n\n const referrerKey = kaminoObligation ? kaminoObligation.state.referrer : referrer;\n\n return new KaminoAction(\n kaminoMarket,\n owner,\n kaminoObligation || obligation,\n userTokenAccountAddress,\n userCollateralAccountAddress,\n mint,\n distinctReserveCount,\n amount,\n depositReserves,\n borrowReserves,\n reserve,\n currentSlot,\n hostAta,\n undefined,\n undefined,\n undefined,\n undefined,\n referrerKey,\n payer\n );\n }\n\n private static getUserAccountAddresses(owner: PublicKey, reserve: Reserve) {\n const userTokenAccountAddress = getAssociatedTokenAddress(\n reserve.liquidity.mintPubkey,\n owner,\n true,\n reserve.liquidity.tokenProgram,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n const userCollateralAccountAddress = getAssociatedTokenAddress(\n reserve.collateral.mintPubkey,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n return { userTokenAccountAddress, userCollateralAccountAddress };\n }\n\n private static async loadObligation(\n action: ActionType,\n kaminoMarket: KaminoMarket,\n owner: PublicKey,\n reserve: PublicKey,\n obligation: KaminoObligation | ObligationType,\n outflowReserve?: PublicKey\n ) {\n let kaminoObligation: KaminoObligation | null;\n const depositReserves: Array<PublicKey> = [];\n const borrowReserves: Array<PublicKey> = [];\n if (obligation instanceof KaminoObligation) {\n kaminoObligation = obligation;\n } else {\n const obligationAddress = obligation.toPda(kaminoMarket.getAddress(), owner);\n kaminoObligation = await KaminoObligation.load(kaminoMarket, obligationAddress);\n }\n if (kaminoObligation !== null) {\n depositReserves.push(...[...kaminoObligation.deposits.keys()]);\n borrowReserves.push(...[...kaminoObligation.borrows.keys()]);\n }\n\n if (!outflowReserve && action === 'depositAndBorrow') {\n throw new Error(`Outflow reserve has not been set for depositAndBorrow`);\n }\n\n // Union of addresses\n const distinctReserveCount =\n [\n ...new Set([\n ...borrowReserves.map((e) => e.toBase58()),\n ...(action === 'borrow' ? [reserve.toBase58()] : []),\n ...(action === 'depositAndBorrow' ? [reserve.toBase58()] : []),\n ]),\n ].length +\n [\n ...new Set([\n ...depositReserves.map((e) => e.toBase58()),\n ...(action === 'deposit' ? [reserve.toBase58()] : []),\n ...(action === 'depositAndBorrow' ? [outflowReserve!.toBase58()] : []),\n ]),\n ].length;\n\n if (distinctReserveCount > POSITION_LIMIT) {\n throw Error(`Obligation already has max number of positions: ${POSITION_LIMIT}`);\n }\n\n return {\n kaminoObligation,\n depositReserves,\n borrowReserves,\n distinctReserveCount,\n };\n }\n\n static async buildRefreshObligationTxns(\n kaminoMarket: KaminoMarket,\n payer: PublicKey,\n obligation: KaminoObligation,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n currentSlot: number = 0\n ) {\n // placeholder for action initialization\n const firstReserve = obligation.state.deposits[0].depositReserve;\n const firstKaminoReserve = kaminoMarket.getReserveByAddress(firstReserve);\n if (!firstKaminoReserve) {\n throw new Error(`Reserve ${firstReserve.toBase58()} not found`);\n }\n const axn = await KaminoAction.initialize(\n 'refreshObligation',\n '0',\n firstKaminoReserve?.getLiquidityMint(),\n obligation.state.owner,\n kaminoMarket,\n obligation,\n kaminoMarket.programId,\n currentSlot\n );\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n axn.addRefreshObligation(payer);\n\n return axn;\n }\n\n static async buildRequestElevationGroupTxns(\n kaminoMarket: KaminoMarket,\n payer: PublicKey,\n obligation: KaminoObligation,\n elevationGroup: number,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n currentSlot: number = 0\n ) {\n const firstReserve = obligation.state.deposits[0].depositReserve;\n const firstKaminoReserve = kaminoMarket.getReserveByAddress(firstReserve);\n if (!firstKaminoReserve) {\n throw new Error(`Reserve ${firstReserve.toBase58()} not found`);\n }\n const axn = await KaminoAction.initialize(\n 'requestElevationGroup',\n '0',\n firstKaminoReserve?.getLiquidityMint(),\n obligation.state.owner,\n kaminoMarket,\n obligation,\n kaminoMarket.programId,\n currentSlot\n );\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n axn.addRefreshObligation(payer);\n axn.addRequestElevationIx(elevationGroup, true);\n\n return axn;\n }\n\n static async buildDepositTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initialize(\n 'deposit',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'deposit',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addDepositIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildBorrowTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n hostAta?: PublicKey\n ) {\n const axn = await KaminoAction.initialize(\n 'borrow',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot,\n hostAta\n );\n const addInitObligationForFarm = true;\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'borrow',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addBorrowIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildDepositReserveLiquidityTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initialize(\n 'mint',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'mint',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addDepositReserveLiquidityIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildRedeemReserveCollateralTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initialize(\n 'redeem',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'redeem',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addRedeemReserveCollateralIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildDepositObligationCollateralTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initialize(\n 'depositCollateral',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'depositCollateral',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addDepositObligationCollateralIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildDepositAndBorrowTxns(\n kaminoMarket: KaminoMarket,\n depositAmount: string | BN,\n depositMint: PublicKey,\n borrowAmount: string | BN,\n borrowMint: PublicKey,\n payer: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'depositAndBorrow',\n depositAmount,\n depositMint,\n borrowMint,\n payer,\n payer,\n obligation,\n borrowAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarmForDeposit = true;\n const addInitObligationForFarmForBorrow = false;\n const twoTokenAction = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n await axn.addSupportIxs(\n 'deposit',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarmForDeposit,\n twoTokenAction\n );\n await axn.addDepositAndBorrowIx();\n await axn.addInBetweenIxs(\n 'depositAndBorrow',\n includeAtaIxns,\n requestElevationGroup,\n addInitObligationForFarmForBorrow\n );\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildRepayAndWithdrawTxns(\n kaminoMarket: KaminoMarket,\n repayAmount: string | BN,\n repayMint: PublicKey,\n withdrawAmount: string | BN,\n withdrawMint: PublicKey,\n payer: PublicKey,\n currentSlot: number,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n isClosingPosition: boolean = false,\n referrer: PublicKey = PublicKey.default\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'repayAndWithdraw',\n repayAmount,\n repayMint,\n withdrawMint,\n payer,\n payer,\n obligation,\n withdrawAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarmForRepay = true;\n const addInitObligationForFarmForWithdraw = false;\n const twoTokenAction = true;\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'repay',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarmForRepay,\n twoTokenAction\n );\n await axn.addRepayAndWithdrawIxs();\n await axn.addInBetweenIxs(\n 'repayAndWithdraw',\n includeAtaIxns,\n requestElevationGroup,\n addInitObligationForFarmForWithdraw,\n isClosingPosition\n );\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildWithdrawTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initialize(\n 'withdraw',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'withdraw',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addWithdrawIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n /**\n *\n * @param kaminoMarket\n * @param amount\n * @param mint\n * @param owner\n * @param obligation - obligation to repay or the PDA seeds\n * @param currentSlot\n * @param payer - if not set then owner is used\n * @param extraComputeBudget - if > 0 then adds the ixn\n * @param includeAtaIxns - if true it includes create and close wsol and token atas\n * @param requestElevationGroup\n * @param includeUserMetadata - if true it includes user metadata\n * @param referrer\n */\n static async buildRepayTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n currentSlot: number,\n payer: PublicKey | undefined = undefined,\n extraComputeBudget: number = 1_000_000,\n includeAtaIxns: boolean = true,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true,\n referrer: PublicKey = PublicKey.default\n ) {\n const axn = await KaminoAction.initialize(\n 'repay',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot,\n undefined,\n payer\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'repay',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addRepayIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildLiquidateTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n minCollateralReceiveAmount: string | BN,\n repayTokenMint: PublicKey,\n withdrawTokenMint: PublicKey,\n liquidator: PublicKey,\n obligationOwner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas, and creates all other token atas if they don't exist\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n maxAllowedLtvOverridePercent: number = 0,\n currentSlot: number = 0\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'liquidate',\n amount,\n repayTokenMint,\n withdrawTokenMint,\n liquidator,\n obligationOwner,\n obligation,\n minCollateralReceiveAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n await axn.addSupportIxs(\n 'liquidate',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addLiquidateIx(maxAllowedLtvOverridePercent);\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildWithdrawReferrerFeeTxns(\n owner: PublicKey,\n tokenMint: PublicKey,\n kaminoMarket: KaminoMarket,\n currentSlot: number = 0\n ) {\n const { axn, createAtasIxns } = await KaminoAction.initializeWithdrawReferrerFees(\n tokenMint,\n owner,\n kaminoMarket,\n currentSlot\n );\n\n axn.preTxnIxs.push(...createAtasIxns);\n axn.preTxnIxsLabels.push(`createAtasIxs[${axn.userTokenAccountAddress.toString()}]`);\n\n axn.addRefreshReserveIxs([axn.reserve.address]);\n axn.addWithdrawReferrerFeesIxs();\n\n return axn;\n }\n\n async getTransactions() {\n const txns: {\n preLendingTxn: Transaction | null;\n lendingTxn: Transaction | null;\n postLendingTxn: Transaction | null;\n } = {\n preLendingTxn: null,\n lendingTxn: null,\n postLendingTxn: null,\n };\n\n if (this.preTxnIxs.length) {\n txns.preLendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.preTxnIxs);\n }\n\n if (this.lendingIxs.length === 2) {\n txns.lendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(\n ...this.setupIxs,\n ...[this.lendingIxs[0]],\n ...this.inBetweenIxs,\n ...[this.lendingIxs[1]],\n ...this.cleanupIxs\n );\n } else {\n txns.lendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.setupIxs, ...this.lendingIxs, ...this.cleanupIxs);\n }\n\n if (this.postTxnIxs.length) {\n txns.postLendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.postTxnIxs);\n }\n\n return txns;\n }\n\n async sendTransactions(sendTransaction: (txn: Transaction, connection: Connection) => Promise<TransactionSignature>) {\n const txns = await this.getTransactions();\n\n await this.sendSingleTransaction(txns.preLendingTxn, sendTransaction);\n\n const signature = await this.sendSingleTransaction(txns.lendingTxn, sendTransaction);\n\n await this.sendSingleTransaction(txns.postLendingTxn, sendTransaction);\n\n return signature;\n }\n\n private async sendSingleTransaction(\n txn: Transaction | null,\n sendTransaction: (txn: Transaction, connection: Connection) => Promise<TransactionSignature>\n ) {\n if (!txn) return '';\n\n const signature = await sendTransaction(txn, this.kaminoMarket.getConnection());\n await this.kaminoMarket.getConnection().confirmTransaction(signature);\n\n return signature;\n }\n\n async simulateTransactions(\n sendTransaction: (\n txn: Transaction,\n connection: Connection\n ) => Promise<RpcResponseAndContext<SimulatedTransactionResponse>>\n ) {\n const txns = await this.getTransactions();\n\n await this.simulateSingleTransaction(txns.preLendingTxn, sendTransaction);\n\n const signature = await this.simulateSingleTransaction(txns.lendingTxn, sendTransaction);\n\n await this.simulateSingleTransaction(txns.postLendingTxn, sendTransaction);\n\n return signature;\n }\n\n private async simulateSingleTransaction(\n txn: Transaction | null,\n sendTransaction: (\n txn: Transaction,\n connection: Connection\n ) => Promise<RpcResponseAndContext<SimulatedTransactionResponse>>\n ) {\n if (!txn) return '';\n return await sendTransaction(txn, this.kaminoMarket.getConnection());\n }\n\n addDepositIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidityAndObligationCollateral`);\n this.lendingIxs.push(\n depositReserveLiquidityAndObligationCollateral(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveDestinationDepositCollateral: this.reserve.state.collateral.supplyVault, // destinationCollateral\n userSourceLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addDepositReserveLiquidityIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidity`);\n this.lendingIxs.push(\n depositReserveLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n userDestinationCollateral: this.userCollateralAccountAddress,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addRedeemReserveCollateralIx() {\n this.lendingIxsLabels.push(`redeemReserveCollateral`);\n this.lendingIxs.push(\n redeemReserveCollateral(\n {\n collateralAmount: this.amount,\n },\n {\n owner: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n userSourceCollateral: this.userCollateralAccountAddress,\n userDestinationLiquidity: this.userTokenAccountAddress,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addDepositObligationCollateralIx() {\n this.lendingIxsLabels.push(`depositObligationCollateral`);\n this.lendingIxs.push(\n depositObligationCollateral(\n {\n collateralAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n depositReserve: this.reserve.address,\n reserveDestinationCollateral: this.reserve.state.collateral.supplyVault,\n userSourceCollateral: this.userCollateralAccountAddress,\n tokenProgram: TOKEN_PROGRAM_ID,\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addBorrowIx() {\n this.lendingIxsLabels.push(`borrowObligationLiquidity`);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowIx = borrowObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n borrowReserve: this.reserve.address,\n borrowReserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveSourceLiquidity: this.reserve.state.liquidity.supplyVault,\n userDestinationLiquidity: this.userTokenAccountAddress,\n borrowReserveLiquidityFeeReceiver: this.reserve.state.liquidity.feeVault,\n referrerTokenState: referrerTokenStatePda(this.referrer, this.reserve.address, this.kaminoMarket.programId)[0],\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n borrowIx.keys = this.obligation?.state.elevationGroup\n ? borrowIx.keys.concat([...depositReserveAccountMetas])\n : borrowIx.keys;\n this.lendingIxs.push(borrowIx);\n }\n\n async addDepositAndBorrowIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidityAndObligationCollateral`);\n this.lendingIxsLabels.push(`borrowObligationLiquidity`);\n this.lendingIxs.push(\n depositReserveLiquidityAndObligationCollateral(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveDestinationDepositCollateral: this.reserve.state.collateral.supplyVault, // destinationCollateral\n userSourceLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n\n if (!this.outflowReserve) {\n throw new Error(`outflowReserve not set`);\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`additionalTokenAccountAddress not set`);\n }\n\n if (!this.outflowAmount) {\n throw new Error(`outflowAmount not set`);\n }\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n if (depositReservesList.length === 0) {\n depositReservesList.push(this.reserve.address);\n }\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowIx = borrowObligationLiquidity(\n {\n liquidityAmount: this.outflowAmount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n borrowReserve: this.outflowReserve.address,\n borrowReserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n reserveSourceLiquidity: this.outflowReserve.state.liquidity.supplyVault,\n userDestinationLiquidity: this.additionalTokenAccountAddress,\n borrowReserveLiquidityFeeReceiver: this.outflowReserve.state.liquidity.feeVault,\n referrerTokenState: referrerTokenStatePda(\n this.referrer,\n this.outflowReserve.address,\n this.kaminoMarket.programId\n )[0],\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n\n borrowIx.keys = borrowIx.keys.concat([...depositReserveAccountMetas]);\n\n this.lendingIxs.push(borrowIx);\n }\n\n async addRepayAndWithdrawIxs() {\n this.lendingIxsLabels.push(\n `repayObligationLiquidity(reserve=${this.reserve!.address})(obligation=${this.getObligationPda()})`\n );\n this.lendingIxsLabels.push(`withdrawObligationCollateralAndRedeemReserveCollateral`);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n const repayIx = repayObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n repayReserve: this.reserve!.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n reserveDestinationLiquidity: this.reserve.state.liquidity.supplyVault,\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n\n repayIx.keys = repayIx.keys.concat([...depositReserveAccountMetas]);\n\n this.lendingIxs.push(repayIx);\n if (!this.outflowReserve) {\n throw new Error(`outflowReserve not set`);\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`additionalTokenAccountAddress not set`);\n }\n\n if (!this.outflowAmount) {\n throw new Error(`outflowAmount not set`);\n }\n\n const collateralExchangeRate = this.outflowReserve.getEstimatedCollateralExchangeRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n\n this.lendingIxs.push(\n withdrawObligationCollateralAndRedeemReserveCollateral(\n {\n collateralAmount: this.outflowAmount.eq(new BN(U64_MAX))\n ? this.outflowAmount\n : new BN(new Decimal(this.outflowAmount.toString()).mul(collateralExchangeRate).ceil().toString()),\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n withdrawReserve: this.outflowReserve.address,\n reserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n reserveCollateralMint: this.outflowReserve.getCTokenMint(),\n reserveLiquiditySupply: this.outflowReserve.state.liquidity.supplyVault,\n reserveSourceCollateral: this.outflowReserve.state.collateral.supplyVault,\n userDestinationLiquidity: this.additionalTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n async addWithdrawIx() {\n const collateralExchangeRate = this.reserve.getEstimatedCollateralExchangeRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n\n const collateralAmount = this.amount.eq(new BN(U64_MAX))\n ? this.amount\n : new BN(new Decimal(this.amount.toString()).mul(collateralExchangeRate).ceil().toString());\n\n this.lendingIxsLabels.push(`withdrawObligationCollateralAndRedeemReserveCollateral`);\n this.lendingIxs.push(\n withdrawObligationCollateralAndRedeemReserveCollateral(\n {\n collateralAmount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n withdrawReserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveSourceCollateral: this.reserve.state.collateral.supplyVault,\n userDestinationLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n async addRepayIx() {\n this.lendingIxsLabels.push(\n `repayObligationLiquidity(reserve=${this.reserve.address})(obligation=${this.getObligationPda()})`\n );\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const repayIx = repayObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.payer,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n repayReserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n reserveDestinationLiquidity: this.reserve.state.liquidity.supplyVault,\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n\n repayIx.keys =\n this.obligation?.state.elevationGroup !== 0 ? repayIx.keys.concat([...depositReserveAccountMetas]) : repayIx.keys;\n\n this.lendingIxs.push(repayIx);\n }\n\n async addLiquidateIx(maxAllowedLtvOverridePercent: number = 0) {\n this.lendingIxsLabels.push(`liquidateObligationAndRedeemReserveCollateral`);\n if (!this.outflowReserve) {\n throw Error(`Withdraw reserve during liquidation is not defined`);\n }\n if (!this.additionalTokenAccountAddress) {\n throw Error(`Liquidating token account address is not defined`);\n }\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const liquidateIx = liquidateObligationAndRedeemReserveCollateral(\n {\n liquidityAmount: this.amount,\n // TODO: Configure this when updating liquidator with new interface\n minAcceptableReceivedLiquidityAmount: this.outflowAmount || new BN(0),\n maxAllowedLtvOverridePercent: new BN(maxAllowedLtvOverridePercent),\n },\n {\n liquidator: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n repayReserve: this.reserve.address,\n repayReserveLiquidityMint: this.reserve.getLiquidityMint(),\n repayReserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n withdrawReserve: this.outflowReserve.address,\n withdrawReserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n withdrawReserveCollateralMint: this.outflowReserve.getCTokenMint(),\n withdrawReserveCollateralSupply: this.outflowReserve.state.collateral.supplyVault,\n withdrawReserveLiquiditySupply: this.outflowReserve.state.liquidity.supplyVault,\n userSourceLiquidity: this.additionalTokenAccountAddress,\n userDestinationCollateral: this.userCollateralAccountAddress,\n userDestinationLiquidity: this.userTokenAccountAddress,\n withdrawReserveLiquidityFeeReceiver: this.outflowReserve.state.liquidity.feeVault,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n repayLiquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n withdrawLiquidityTokenProgram: this.outflowReserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n liquidateIx.keys =\n this.obligation?.state.elevationGroup !== 0\n ? liquidateIx.keys.concat([...depositReserveAccountMetas])\n : liquidateIx.keys;\n this.lendingIxs.push(liquidateIx);\n }\n\n async addInBetweenIxs(\n action: ActionType,\n includeAtaIxns: boolean,\n requestElevationGroup: boolean,\n addInitObligationForFarm: boolean,\n isClosingPosition: boolean = false\n ) {\n await this.addSupportIxsWithoutInitObligation(\n action,\n includeAtaIxns,\n false,\n requestElevationGroup,\n addInitObligationForFarm,\n isClosingPosition\n );\n }\n\n addRefreshObligation(crank: PublicKey) {\n const uniqueReserveAddresses = new PublicKeySet(this.depositReserves.concat(this.borrowReserves)).toArray();\n\n const addAllToSetupIxns = true;\n // Union of addresses\n const allReservesExcludingCurrent = [...uniqueReserveAddresses];\n\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addAllToSetupIxns);\n this.addRefreshFarmsForReserve(\n this.depositReserves.map((r) => this.kaminoMarket.getReserveByAddress(r)!),\n addAllToSetupIxns,\n ReserveFarmKind.Collateral,\n crank\n );\n this.addRefreshFarmsForReserve(\n this.borrowReserves.map((r) => this.kaminoMarket.getReserveByAddress(r)!),\n addAllToSetupIxns,\n ReserveFarmKind.Debt,\n crank\n );\n this.addRefreshObligationIx(addAllToSetupIxns, false);\n }\n\n async addSupportIxsWithoutInitObligation(\n action: ActionType,\n includeAtaIxns: boolean,\n addToSetupIxs: boolean = true,\n requestElevationGroup: boolean = false,\n addInitObligationForFarm: boolean = false,\n isClosingPosition: boolean = false,\n twoTokenAction: boolean = false\n ) {\n // TODO: why are we not doing this first?\n if (includeAtaIxns) {\n await this.addAtaIxs(action);\n }\n\n if (\n [\n 'depositCollateral',\n 'deposit',\n 'withdraw',\n 'borrow',\n 'liquidate',\n 'repay',\n 'depositAndBorrow',\n 'repayAndWithdraw',\n 'refreshObligation',\n ].includes(action)\n ) {\n // The support ixns in order are:\n // 0. Init obligation ixn\n // 0. Token Ata ixns\n // 0. Init obligation for farm\n // 1. Ixns to refresh the reserves of the obligation not related to the current action\n // 2. Ixn to refresh the reserve of the current action\n // 3. Ixn to refresh the obligation\n // 4. Ixn to refresh the `debt` farm of the obligation\n // 5. Ixn to refresh the `collateral` farm of the obligation\n // 6. The instruction itself\n // 7. Ixn to refresh the `debt` farm of the obligation\n // 8. Ixn to refresh the `collateral` farm of the obligation\n\n let currentReserves: KaminoReserve[] = [];\n\n if (action === 'liquidate' || action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n if (!this.outflowReserve) {\n throw new Error('outflowReserve is undefined');\n }\n\n if (action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n currentReserves = [this.reserve, this.outflowReserve];\n if (this.obligation) {\n if (action === 'depositAndBorrow') {\n const deposit = this.obligation.state.deposits.find((deposit) =>\n deposit.depositReserve.equals(this.reserve.address)\n );\n\n if (!deposit) {\n this.preLoadedDepositReservesSameTx.push(this.reserve.address);\n }\n } else {\n const borrow = this.obligation.state.borrows.find((borrow) =>\n borrow.borrowReserve.equals(this.reserve.address)\n );\n\n if (!borrow) {\n throw Error(`Unable to find obligation borrow to repay for ${this.obligation.state.owner.toBase58()}`);\n }\n\n const cumulativeBorrowRateObligation = KaminoObligation.getCumulativeBorrowRate(borrow);\n\n const cumulativeBorrowRateReserve = this.reserve.getEstimatedCumulativeBorrowRate(this.currentSlot);\n const fullRepay = KaminoObligation.getBorrowAmount(borrow)\n .mul(cumulativeBorrowRateReserve)\n .div(cumulativeBorrowRateObligation);\n\n const amountDecimal = new Decimal(this.amount.toString());\n\n if (fullRepay.lte(amountDecimal)) {\n this.preLoadedBorrowReservesSameTx.push(this.reserve.address);\n }\n }\n } else {\n // Obligation doesn't exist yet, so we have to preload the deposit reserve\n this.preLoadedDepositReservesSameTx.push(this.reserve.address);\n }\n } else if (action === 'liquidate' && !this.outflowReserve.address.equals(this.reserve.address)) {\n currentReserves = [this.outflowReserve, this.reserve];\n } else {\n currentReserves = [this.reserve];\n }\n } else {\n currentReserves = [this.reserve];\n }\n\n const uniqueReserveAddresses = new PublicKeySet(this.depositReserves.concat(this.borrowReserves));\n const currentReserveAddresses = new PublicKeySet(currentReserves.map((reserve) => reserve.address));\n\n // Union of addresses\n const allReservesExcludingCurrent = [...uniqueReserveAddresses.toArray()].filter(\n (address) => !currentReserveAddresses.contains(address)\n );\n\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addToSetupIxs);\n if (addInitObligationForFarm) {\n if (action === 'liquidate') {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addToSetupIxs);\n await this.addInitObligationForFarm(this.outflowReserve!, ReserveFarmKind.Collateral, addToSetupIxs);\n } else if (\n action === 'depositAndBorrow' ||\n action === 'depositCollateral' ||\n action === 'withdraw' ||\n action === 'deposit'\n ) {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Collateral, addToSetupIxs);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Debt, addToSetupIxs);\n }\n } else if (action === 'repayAndWithdraw' || action === 'borrow' || action === 'repay') {\n // todo - probably don't need to add both debt and collateral for everything here\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addToSetupIxs);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Collateral, addToSetupIxs);\n }\n } else {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Collateral, addToSetupIxs);\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addToSetupIxs);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Collateral, addToSetupIxs);\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Debt, addToSetupIxs);\n }\n }\n }\n this.addRefreshReserveIxs(currentReserveAddresses.toArray(), addToSetupIxs);\n\n if (action === 'repayAndWithdraw' && !addToSetupIxs && isClosingPosition) {\n // addToSetupIxs === addInBetween (same thing)\n // If this is a repay and withdraw, and it's not the first action, and it's closing a position\n // we don't need to include the repay reserve in the refresh obligation\n // I am ashamed of this code, we need to rewrite this entire thing\n this.addRefreshObligationIx(addToSetupIxs, true);\n } else {\n this.addRefreshObligationIx(addToSetupIxs, false);\n }\n\n if (addToSetupIxs) {\n // If this is an setup ixn (therefore not an in-between), it means it's either a one off action\n // or the first of a two-token-action\n if (action === 'liquidate') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addToSetupIxs, ReserveFarmKind.Collateral);\n this.addRefreshFarmsForReserve([this.reserve], addToSetupIxs, ReserveFarmKind.Debt);\n } else if (\n action === 'depositAndBorrow' ||\n action === 'depositCollateral' ||\n action === 'withdraw' ||\n action === 'deposit'\n ) {\n this.addRefreshFarmsForReserve(\n currentReserves,\n addToSetupIxs,\n ReserveFarmKind.Collateral,\n undefined,\n twoTokenAction\n );\n } else if (action === 'repayAndWithdraw' || action === 'borrow' || action === 'repay') {\n this.addRefreshFarmsForReserve(\n currentReserves,\n addToSetupIxs,\n ReserveFarmKind.Debt,\n undefined,\n twoTokenAction\n );\n } else {\n throw new Error(`Could not decide on refresh farm for action ${action}`);\n }\n } else {\n // If this is an inbetween, it means it's part of a two-token-action\n // so we skip the refresh farm obligation of the first reserve as that operation already happened\n // add added to 'setup' ixns\n if (action === 'depositAndBorrow') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addToSetupIxs, ReserveFarmKind.Debt);\n } else if (action === 'repayAndWithdraw') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addToSetupIxs, ReserveFarmKind.Collateral);\n } else {\n throw new Error(`Could not decide on refresh farm for action ${action}`);\n }\n }\n\n if (action === 'depositAndBorrow' && requestElevationGroup) {\n const groupsColl = this.reserve.state.config.elevationGroups;\n const groupsDebt = this.outflowReserve!.state.config.elevationGroups;\n const groups = this.kaminoMarket.state.elevationGroups;\n const commonElevationGroups = [...groupsColl].filter(\n (item) =>\n groupsDebt.includes(item) && item !== 0 && groups[item - 1].debtReserve.equals(this.outflowReserve!.address)\n );\n\n console.log(\n 'Groups of coll reserve',\n groupsColl,\n 'Groups of debt reserve',\n groupsDebt,\n 'Common groups',\n commonElevationGroups\n );\n\n if (commonElevationGroups.length === 0) {\n console.log('No common elevation groups found, staying with default');\n } else {\n const eModeGroupWithMaxLtvAndDebtReserve = commonElevationGroups.reduce((prev, curr) => {\n const prevGroup = groups.find((group) => group.id === prev);\n const currGroup = groups.find((group) => group.id === curr);\n return prevGroup!.ltvPct > currGroup!.ltvPct ? prev : curr;\n });\n\n const eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtvAndDebtReserve)!.id;\n console.log('Setting eModeGroup to', eModeGroup);\n\n if (eModeGroup !== 0 && eModeGroup !== this.obligation?.state.elevationGroup) {\n this.addRequestElevationIx(eModeGroup, false);\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addToSetupIxs);\n this.addRefreshReserveIxs(currentReserveAddresses.toArray(), addToSetupIxs);\n this.addRefreshObligationIx(addToSetupIxs);\n }\n }\n }\n }\n }\n\n async addSupportIxs(\n action: ActionType,\n includeAtaIxns: boolean,\n requestElevationGroup: boolean,\n includeUserMetadata: boolean,\n addInitObligationForFarm: boolean,\n twoTokenAction: boolean = false\n ) {\n if (!['mint', 'redeem'].includes(action)) {\n const [, ownerUserMetadata] = await this.kaminoMarket.getUserMetadata(this.owner);\n if (!ownerUserMetadata && includeUserMetadata) {\n await this.addInitUserMetadataIxs();\n }\n\n await this.addInitReferrerTokenStateIxs();\n await this.addInitObligationIxs();\n }\n\n await this.addSupportIxsWithoutInitObligation(\n action,\n includeAtaIxns,\n true,\n requestElevationGroup,\n addInitObligationForFarm,\n false,\n twoTokenAction\n );\n }\n\n private static optionalAccount(pubkey: PublicKey, programId: PublicKey = PROGRAM_ID): PublicKey {\n if (isNotNullPubkey(pubkey)) {\n return pubkey;\n } else {\n return programId;\n }\n }\n\n private addRefreshReserveIxs(reserves: PublicKey[], addToSetupIxs: boolean = true) {\n reserves.forEach((reserveAddress) => {\n const foundReserve = this.kaminoMarket.getReserveByAddress(reserveAddress);\n if (!foundReserve) {\n throw new Error(`Could not find reserve ${reserveAddress} in reserves`);\n }\n\n const { state } = foundReserve;\n\n const refreshReserveIx = refreshReserve(\n {\n lendingMarket: this.kaminoMarket.getAddress(),\n reserve: reserveAddress,\n pythOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.pythConfiguration.price,\n this.kaminoMarket.programId\n ),\n switchboardPriceOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.priceAggregator,\n this.kaminoMarket.programId\n ),\n switchboardTwapOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.twapAggregator,\n this.kaminoMarket.programId\n ),\n scopePrices: KaminoAction.optionalAccount(\n state.config.tokenInfo.scopeConfiguration.priceFeed,\n this.kaminoMarket.programId\n ),\n },\n this.kaminoMarket.programId\n );\n\n if (addToSetupIxs) {\n this.setupIxs.push(refreshReserveIx);\n this.setupIxsLabels.push(`RefreshReserve[${reserveAddress}]`);\n } else {\n this.inBetweenIxs.push(refreshReserveIx);\n this.inBetweenIxsLabels.push(`RefreshReserve[${reserveAddress}]`);\n }\n });\n }\n\n public static getRefreshAllReserves(kaminoMarket: KaminoMarket, reserves: PublicKey[]): TransactionInstruction[] {\n return reserves.map((reserveAddress): TransactionInstruction => {\n const foundReserve = kaminoMarket.getReserveByAddress(reserveAddress);\n if (!foundReserve) {\n throw new Error(`Could not find reserve ${reserveAddress} in reserves`);\n }\n\n const { state } = foundReserve;\n return refreshReserve(\n {\n reserve: reserveAddress,\n lendingMarket: state.lendingMarket,\n pythOracle: this.optionalAccount(state.config.tokenInfo.pythConfiguration.price, kaminoMarket.programId),\n switchboardPriceOracle: this.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.priceAggregator,\n kaminoMarket.programId\n ),\n switchboardTwapOracle: this.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.twapAggregator,\n kaminoMarket.programId\n ),\n scopePrices: this.optionalAccount(\n state.config.tokenInfo.scopeConfiguration.priceFeed,\n kaminoMarket.programId\n ),\n },\n kaminoMarket.programId\n );\n });\n }\n\n private addRefreshObligationIx(addToSetupIxs: boolean = true, skipBorrowObligations: boolean = false) {\n const marketAddress = this.kaminoMarket.getAddress();\n const obligationPda = this.getObligationPda();\n const refreshObligationIx = refreshObligation(\n {\n lendingMarket: marketAddress,\n obligation: obligationPda,\n },\n this.kaminoMarket.programId\n );\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const preloadedBorrowReservesString = this.preLoadedBorrowReservesSameTx.map((reserve) => reserve.toString());\n const borrowReservesList = this.borrowReserves.filter(\n (reserve) => !preloadedBorrowReservesString.includes(reserve.toString())\n );\n\n const borrowReserveAccountMetas = borrowReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowReservesReferrerTokenStates = borrowReservesList\n .map((reserve) => {\n if (this.referrer.equals(PublicKey.default)) {\n return { pubkey: this.kaminoMarket.programId, isSigner: false, isWritable: true };\n }\n const referrerTokenStateAddress = referrerTokenStatePda(this.referrer, reserve, this.kaminoMarket.programId)[0];\n return { pubkey: referrerTokenStateAddress, isSigner: false, isWritable: true };\n })\n .filter((x) => !x.pubkey.equals(this.kaminoMarket.programId));\n\n refreshObligationIx.keys = refreshObligationIx.keys.concat([\n ...depositReserveAccountMetas,\n ...(skipBorrowObligations ? [] : [...borrowReserveAccountMetas, ...borrowReservesReferrerTokenStates]),\n ]);\n\n if (addToSetupIxs) {\n this.setupIxs.push(refreshObligationIx);\n this.setupIxsLabels.push(`RefreshObligation[${obligationPda.toString()}]`);\n } else {\n this.inBetweenIxs.push(refreshObligationIx);\n this.inBetweenIxsLabels.push(`RefreshObligation[${obligationPda.toString()}]`);\n }\n }\n\n private addRequestElevationIx(elevationGroup: number, addToSetupIxs: boolean) {\n const obligationPda = this.getObligationPda();\n const args: RequestElevationGroupArgs = {\n elevationGroup,\n };\n const accounts: RequestElevationGroupAccounts = {\n owner: this.owner,\n obligation: obligationPda,\n lendingMarket: this.kaminoMarket.getAddress(),\n };\n\n const requestElevationGroupIx = requestElevationGroup(args, accounts, this.kaminoMarket.programId);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const preloadedBorrowReservesString = this.preLoadedBorrowReservesSameTx.map((reserve) => reserve.toString());\n const borrowReservesList = this.borrowReserves.filter(\n (reserve) => !preloadedBorrowReservesString.includes(reserve.toString())\n );\n\n const borrowReserveAccountMetas = borrowReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowReservesReferrerTokenStates = borrowReservesList\n .map((reserve) => {\n if (this.referrer.equals(PublicKey.default)) {\n return { pubkey: this.kaminoMarket.programId, isSigner: false, isWritable: true };\n }\n const reserveState = this.kaminoMarket.getReserveByAddress(reserve)!;\n const referrerTokenStateAddress = referrerTokenStatePda(\n this.referrer,\n reserveState.address,\n this.kaminoMarket.programId\n )[0];\n return { pubkey: referrerTokenStateAddress, isSigner: false, isWritable: true };\n })\n .filter((x) => !x.pubkey.equals(this.kaminoMarket.programId));\n\n requestElevationGroupIx.keys = requestElevationGroupIx.keys.concat([\n ...depositReserveAccountMetas,\n ...borrowReserveAccountMetas,\n ...borrowReservesReferrerTokenStates,\n ]);\n\n if (addToSetupIxs) {\n this.setupIxs.push(requestElevationGroupIx);\n this.setupIxsLabels.push(`RequestElevation[${obligationPda}], elevation_group:${elevationGroup}`);\n } else {\n this.inBetweenIxs.push(requestElevationGroupIx);\n this.inBetweenIxsLabels.push(`RequestElevation[${obligationPda}], elevation_group:${elevationGroup}`);\n }\n }\n\n private addRefreshFarmsForReserve(\n reserves: KaminoReserve[],\n addToSetupIxs: boolean = true,\n mode: typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n crank: PublicKey = this.payer,\n twoTokenAction: boolean = false\n ) {\n const BASE_SEED_USER_STATE = Buffer.from('user');\n const getPda = (farm: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [BASE_SEED_USER_STATE, farm.toBytes(), this.getObligationPda().toBytes()],\n farmsId\n )[0];\n\n const farms: [\n typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n PublicKey,\n PublicKey,\n KaminoReserve\n ][] = [];\n\n for (const kaminoReserve of reserves) {\n if (mode === ReserveFarmKind.Collateral && !kaminoReserve.state.farmCollateral.equals(PublicKey.default)) {\n farms.push([\n ReserveFarmKind.Collateral,\n kaminoReserve.state.farmCollateral,\n getPda(kaminoReserve.state.farmCollateral),\n kaminoReserve,\n ]);\n }\n if (mode === ReserveFarmKind.Debt && !kaminoReserve.state.farmDebt.equals(PublicKey.default)) {\n farms.push([\n ReserveFarmKind.Debt,\n kaminoReserve.state.farmDebt,\n getPda(kaminoReserve.state.farmDebt),\n kaminoReserve,\n ]);\n }\n }\n\n farms.forEach(\n (arg: [typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt, PublicKey, PublicKey, KaminoReserve]) => {\n const args: RefreshObligationFarmsForReserveArgs = { mode: arg[0].discriminator };\n const accounts: RefreshObligationFarmsForReserveAccounts = {\n crank,\n obligation: this.getObligationPda(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: arg[3].address,\n reserveFarmState: arg[1],\n obligationFarmUserState: arg[2],\n lendingMarket: this.kaminoMarket.getAddress(),\n farmsProgram: farmsId,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n };\n const refreshFarmForObligationix = refreshObligationFarmsForReserve(\n args,\n accounts,\n this.kaminoMarket.programId\n );\n\n if (addToSetupIxs) {\n this.setupIxs.push(refreshFarmForObligationix);\n this.setupIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n if (twoTokenAction) {\n // If two token action, this refresh needs to be the first inbetween ix\n this.inBetweenIxs.push(refreshFarmForObligationix);\n this.inBetweenIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n } else {\n this.refreshFarmsCleanupTxnIxs.push(refreshFarmForObligationix);\n this.refreshFarmsCleanupTxnIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n }\n } else {\n this.inBetweenIxs.push(refreshFarmForObligationix);\n this.inBetweenIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n\n this.refreshFarmsCleanupTxnIxs.push(refreshFarmForObligationix);\n this.refreshFarmsCleanupTxnIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n }\n }\n );\n }\n\n private addRefreshFarmsCleanupTxnIxsToCleanupIxs() {\n this.cleanupIxs.splice(this.cleanupIxs.length - 1, 0, ...this.refreshFarmsCleanupTxnIxs);\n this.cleanupIxsLabels.splice(this.cleanupIxsLabels.length - 1, 0, ...this.refreshFarmsCleanupTxnIxsLabels);\n }\n\n private async addInitObligationForFarm(\n reserve: KaminoReserve,\n mode: typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n addToSetupIxs: boolean = true\n ): Promise<void> {\n const BASE_SEED_USER_STATE = Buffer.from('user');\n const getPda = (farm: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [BASE_SEED_USER_STATE, farm.toBytes(), this.getObligationPda().toBytes()],\n farmsId\n )[0];\n\n const farms: [number, PublicKey, PublicKey][] = [];\n\n if (mode === ReserveFarmKind.Collateral && isNotNullPubkey(reserve.state.farmCollateral)) {\n const pda = getPda(reserve.state.farmCollateral);\n const account = await this.kaminoMarket.getConnection().getAccountInfo(pda);\n if (!account) {\n farms.push([ReserveFarmKind.Collateral.discriminator, reserve.state.farmCollateral, pda]);\n }\n }\n\n if (mode === ReserveFarmKind.Debt && isNotNullPubkey(reserve.state.farmDebt)) {\n const pda = getPda(reserve.state.farmDebt);\n const account = await this.kaminoMarket.getConnection().getAccountInfo(pda);\n if (!account) {\n farms.push([ReserveFarmKind.Debt.discriminator, reserve.state.farmDebt, getPda(reserve.state.farmDebt)]);\n }\n }\n\n farms.forEach((arg: [number, PublicKey, PublicKey]) => {\n const args: InitObligationFarmsForReserveArgs = { mode: arg[0] };\n const accounts: InitObligationFarmsForReserveAccounts = {\n owner: this.obligation ? this.obligation.state.owner : this.owner,\n payer: this.owner,\n obligation: this.getObligationPda(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: reserve.address,\n reserveFarmState: arg[1],\n obligationFarm: arg[2],\n lendingMarket: this.kaminoMarket.getAddress(),\n farmsProgram: farmsId,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n };\n const initObligationForFarm = initObligationFarmsForReserve(args, accounts, this.kaminoMarket.programId);\n if (addToSetupIxs) {\n this.setupIxs.push(initObligationForFarm);\n this.setupIxsLabels.push(\n `InitObligationForFarm[${reserve.address.toString()}, ${this.getObligationPda().toString()}]`\n );\n } else {\n this.inBetweenIxs.push(initObligationForFarm);\n this.inBetweenIxsLabels.push(\n `InitObligationForFarm[${reserve.address.toString()}, ${this.getObligationPda().toString()}]`\n );\n }\n });\n }\n\n private async addInitObligationIxs() {\n if (!this.obligation) {\n const obligationPda = this.getObligationPda();\n const [userMetadataAddress, _bump] = userMetadataPda(this.owner, this.kaminoMarket.programId);\n const initObligationIx = initObligation(\n {\n args: {\n tag: this.obligationType!.toArgs().tag,\n id: this.obligationType!.toArgs().id,\n },\n },\n {\n obligationOwner: this.owner,\n feePayer: this.payer,\n obligation: obligationPda,\n lendingMarket: this.kaminoMarket.getAddress(),\n seed1Account: this.obligationType!.toArgs().seed1,\n seed2Account: this.obligationType!.toArgs().seed2,\n ownerUserMetadata: userMetadataAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n this.setupIxs.push(initObligationIx);\n this.setupIxsLabels.push(`InitObligation[${obligationPda.toString()}]`);\n }\n }\n\n private async addInitUserMetadataIxs() {\n const [createLutIx, lookupTableAddress] = await createLookupTableIx(this.kaminoMarket.getConnection(), this.owner);\n this.setupIxs.push(createLutIx);\n this.setupIxsLabels.push(`createUserLutIx[${lookupTableAddress.toString()}]`);\n const [userMetadataAddress, _bump] = userMetadataPda(this.owner, this.kaminoMarket.programId);\n const referrerUserMetadataAddress = this.referrer.equals(PublicKey.default)\n ? this.kaminoMarket.programId\n : userMetadataPda(this.referrer, this.kaminoMarket.programId)[0];\n const initUserMetadataIx = initUserMetadata(\n {\n userLookupTable: lookupTableAddress,\n },\n {\n owner: this.owner,\n feePayer: this.payer,\n userMetadata: userMetadataAddress,\n referrerUserMetadata: referrerUserMetadataAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n this.setupIxs.push(initUserMetadataIx);\n this.setupIxsLabels.push(`initUserMetadata[${userMetadataAddress.toString()}]`);\n }\n\n private async addInitReferrerTokenStateIxs(reservesArr: KaminoReserve[] = []) {\n if (this.referrer.equals(PublicKey.default)) {\n return;\n }\n\n const reserves = reservesArr.length !== 0 ? reservesArr : [...new Set([this.reserve, this.outflowReserve])];\n const tokenStatesToCreate: [PublicKey, PublicKey][] = [];\n for (const reserve of reserves) {\n if (!reserve) {\n continue;\n }\n\n const referrerTokenStateAddress = referrerTokenStatePda(\n this.referrer,\n reserve.address,\n this.kaminoMarket.programId\n )[0];\n\n if (!(await checkIfAccountExists(this.kaminoMarket.getConnection(), referrerTokenStateAddress))) {\n tokenStatesToCreate.push([referrerTokenStateAddress, reserve?.address]);\n }\n }\n\n tokenStatesToCreate.forEach(([referrerTokenStateAddress, reserveAddress]) => {\n const initreferrerTokenStateIx = initReferrerTokenState(\n {\n referrer: this.referrer,\n },\n {\n lendingMarket: this.kaminoMarket.getAddress(),\n payer: this.owner,\n reserve: reserveAddress,\n referrerTokenState: referrerTokenStateAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n\n this.setupIxs.unshift(initreferrerTokenStateIx);\n this.setupIxsLabels.unshift(\n `InitReferrerTokenState[${referrerTokenStateAddress.toString()} res=${reserveAddress}]`\n );\n });\n }\n\n private addWithdrawReferrerFeesIxs() {\n const referrerTokenStateAddress = referrerTokenStatePda(\n this.owner,\n this.reserve.address,\n this.kaminoMarket.programId\n )[0];\n\n const withdrawReferrerFeesIx = withdrawReferrerFees(\n {\n referrer: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n referrerTokenState: referrerTokenStateAddress,\n reserveSupplyLiquidity: this.reserve.state.liquidity.supplyVault,\n referrerTokenAccount: this.userTokenAccountAddress,\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n },\n this.kaminoMarket.programId\n );\n\n this.lendingIxs.push(withdrawReferrerFeesIx);\n this.lendingIxsLabels.push(`WithdrawReferrerFeesIx[${this.owner.toString()}]`);\n }\n\n private addComputeBudgetIxn(units: number) {\n this.setupIxs.push(buildComputeBudgetIx(units));\n this.setupIxsLabels.push(`AddComputeBudget[${units}]`);\n }\n\n private async addAtaIxs(action: ActionType) {\n if (this.mint.equals(WRAPPED_SOL_MINT) || this.secondaryMint?.equals(WRAPPED_SOL_MINT)) {\n await this.updateWSOLAccount(action);\n }\n\n if ((action === 'withdraw' || action === 'borrow' || action === 'redeem') && !this.mint.equals(WRAPPED_SOL_MINT)) {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.reserve.getLiquidityMint(),\n this.owner,\n this.reserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT && this.hostAta) {\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateLiquidityUserAta[${this.owner}]`);\n } else {\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateLiquidityUserAta[${this.owner}]`);\n }\n }\n }\n\n if (action === 'liquidate') {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n if (!this.outflowReserve) {\n throw new Error(`Outflow reserve state not found ${this.mint}`);\n }\n\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getLiquidityMint(),\n this.owner,\n this.outflowReserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n } else {\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n }\n }\n\n const userCollateralAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.userCollateralAccountAddress);\n if (!userCollateralAccountInfo) {\n const [, createUserCollateralAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getCTokenMint(),\n this.owner,\n TOKEN_PROGRAM_ID,\n this.userCollateralAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserCollateralAccountIx);\n this.preTxnIxsLabels.push(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n } else {\n this.setupIxs.unshift(createUserCollateralAccountIx);\n this.setupIxsLabels.unshift(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n }\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.mint}`);\n }\n }\n\n if (\n action === 'depositAndBorrow' ||\n (action === 'repayAndWithdraw' && !this.secondaryMint?.equals(WRAPPED_SOL_MINT))\n ) {\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.secondaryMint}`);\n }\n\n if (!this.outflowReserve) {\n throw new Error(`Outflow reserve state not found ${this.mint}`);\n }\n\n const additionalUserTokenAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.additionalTokenAccountAddress);\n\n if (!additionalUserTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getLiquidityMint(),\n this.owner,\n this.outflowReserve.getLiquidityTokenProgram(),\n this.additionalTokenAccountAddress\n );\n\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateAdditionalUserTokenAta[${this.owner}]`);\n }\n }\n\n if (action === 'withdraw' || action === 'mint' || action === 'deposit' || action === 'repayAndWithdraw') {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n // TODO: Might need to remove this\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.reserve.getLiquidityMint(),\n this.owner,\n this.reserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n }\n }\n if (action === 'mint') {\n const userCollateralAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.userCollateralAccountAddress);\n\n if (!userCollateralAccountInfo) {\n const collateralMintPubkey = this.reserve.getCTokenMint();\n const [, createUserCollateralAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n collateralMintPubkey,\n this.owner,\n TOKEN_PROGRAM_ID,\n this.userCollateralAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserCollateralAccountIx);\n this.preTxnIxsLabels.push(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n } else {\n this.setupIxs.unshift(createUserCollateralAccountIx);\n this.setupIxsLabels.unshift(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n }\n }\n }\n }\n\n private async updateWSOLAccount(action: ActionType) {\n const preIxs: Array<TransactionInstruction> = [];\n const postIxs: Array<TransactionInstruction> = [];\n const preIxsLabels: Array<string> = [];\n const postIxsLabels: Array<string> = [];\n\n if (action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n return;\n }\n\n let safeRepay = new BN(this.amount);\n\n if (this.obligation && action === 'repay' && this.amount.eq(new BN(U64_MAX))) {\n const borrow = this.obligation.state.borrows.find(\n (borrow) => borrow.borrowReserve.toString() === this.reserve.address.toString()\n );\n\n if (!borrow) {\n throw Error(`Unable to find obligation borrow to repay for ${this.obligation.state.owner.toBase58()}`);\n }\n\n const cumulativeBorrowRateObligation = KaminoObligation.getCumulativeBorrowRate(borrow);\n const cumulativeBorrowRateReserve = this.reserve.getEstimatedCumulativeBorrowRate(this.currentSlot);\n // TODO: shouldn't this calc be added to all other stuff as well?\n safeRepay = new BN(\n Math.floor(\n KaminoObligation.getBorrowAmount(borrow)\n .mul(cumulativeBorrowRateReserve)\n .div(cumulativeBorrowRateObligation)\n .add(new Decimal(SOL_PADDING_FOR_INTEREST.toString()))\n .toNumber()\n ).toString()\n );\n }\n\n let userTokenAccountAddress = this.userTokenAccountAddress;\n if (this.secondaryMint?.equals(WRAPPED_SOL_MINT)) {\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.secondaryMint}`);\n }\n userTokenAccountAddress = this.additionalTokenAccountAddress;\n }\n\n const userWSOLAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(userTokenAccountAddress);\n\n const rentExempt = await this.kaminoMarket.getConnection().getMinimumBalanceForRentExemption(165);\n\n // Add rent exemption lamports for WSOL accounts that need to be pre-funded for inflow/send transactions\n const sendAction =\n action === 'deposit' ||\n action === 'repay' ||\n action === 'mint' ||\n (action === 'liquidate' && this.secondaryMint?.equals(WRAPPED_SOL_MINT)); // only sync WSOL amount if liquidator repays SOL which is secondaryMint\n\n const transferLamportsIx = SystemProgram.transfer({\n fromPubkey: this.owner,\n toPubkey: userTokenAccountAddress,\n lamports: (userWSOLAccountInfo ? 0 : rentExempt) + (sendAction ? parseInt(safeRepay.toString(), 10) : 0),\n });\n preIxs.push(transferLamportsIx);\n preIxsLabels.push(`TransferLamportsToUserAtaSOL[${userTokenAccountAddress}]`);\n\n const closeWSOLAccountIx = createCloseAccountInstruction(\n userTokenAccountAddress,\n this.owner,\n this.owner,\n TOKEN_PROGRAM_ID\n );\n\n const syncIx = syncNative(userTokenAccountAddress);\n if (userWSOLAccountInfo) {\n if (sendAction) {\n preIxs.push(syncIx);\n preIxsLabels.push(`SyncUserAtaSOL[${userTokenAccountAddress}]`);\n } else {\n postIxs.push(closeWSOLAccountIx);\n postIxsLabels.push(`CloseUserAtaSOL[${userTokenAccountAddress}]`);\n }\n } else {\n const [, createUserWSOLAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n NATIVE_MINT,\n this.owner,\n TOKEN_PROGRAM_ID,\n userTokenAccountAddress\n );\n preIxs.push(createUserWSOLAccountIx);\n preIxsLabels.push(`CreateUserAtaSOL[${userTokenAccountAddress}]`);\n preIxs.push(syncIx);\n preIxsLabels.push(`SyncUserAtaSOL[${userTokenAccountAddress}]`);\n postIxs.push(closeWSOLAccountIx);\n postIxsLabels.push(`CloseUserAtaSOL[${userTokenAccountAddress}]`);\n }\n\n // TODO: Consider for liquidations and other types of actions if we have to split up some ixs in 2-3 txs\n // if (this.positions && this.positions >= POSITION_LIMIT) {\n // this.preTxnIxs.push(...preIxs);\n // this.preTxnIxsLabels.push(...preIxsLabels);\n // this.postTxnIxs.push(...postIxs);\n // this.postTxnIxsLabels.push(...postIxsLabels);\n // } else {\n // }\n this.setupIxs.unshift(...preIxs);\n this.setupIxsLabels.unshift(...preIxsLabels);\n this.cleanupIxs.push(...postIxs);\n this.cleanupIxsLabels.push(...postIxsLabels);\n }\n\n static async initializeMultiTokenAction(\n kaminoMarket: KaminoMarket,\n action: ActionType,\n inflowAmount: string | BN,\n inflowTokenMint: PublicKey,\n outflowTokenMint: PublicKey,\n payer: PublicKey,\n obligationOwner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n outflowAmount?: string | BN,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const inflowReserve = kaminoMarket.getReserveByMint(inflowTokenMint);\n const outflowReserve = kaminoMarket.getReserveByMint(outflowTokenMint);\n\n if (!outflowReserve || !inflowReserve) {\n throw new Error('reserve states are not fetched');\n }\n\n const {\n userTokenAccountAddress: userOutflowTokenAccountAddress,\n userCollateralAccountAddress: userOutflowCollateralAccountAddress,\n } = KaminoAction.getUserAccountAddresses(payer, outflowReserve.state);\n\n const {\n userTokenAccountAddress: userInflowTokenAccountAddress,\n userCollateralAccountAddress: userInflowCollateralAccountAddress,\n } = KaminoAction.getUserAccountAddresses(payer, inflowReserve.state);\n\n const { kaminoObligation, depositReserves, borrowReserves, distinctReserveCount } =\n await KaminoAction.loadObligation(\n action,\n kaminoMarket,\n obligationOwner,\n inflowReserve.address,\n obligation,\n outflowReserve.address\n );\n\n const [_, userMetadata] = await kaminoMarket.getUserMetadata(payer);\n if (userMetadata) {\n referrer = userMetadata.referrer;\n }\n\n const referrerKey = kaminoObligation ? kaminoObligation.state.referrer : referrer;\n\n let userTokenAccountAddress: PublicKey;\n let userCollateralAccountAddress: PublicKey;\n let additionalUserTokenAccountAddress: PublicKey;\n let secondaryMint: PublicKey;\n let primaryMint: PublicKey;\n\n if (action === 'liquidate') {\n userTokenAccountAddress = userOutflowTokenAccountAddress;\n userCollateralAccountAddress = userOutflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userInflowTokenAccountAddress;\n primaryMint = outflowTokenMint;\n secondaryMint = inflowTokenMint;\n } else if (action === 'depositAndBorrow') {\n userTokenAccountAddress = userInflowTokenAccountAddress;\n userCollateralAccountAddress = userInflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userOutflowTokenAccountAddress;\n primaryMint = inflowTokenMint;\n secondaryMint = outflowTokenMint;\n } else if (action === 'repayAndWithdraw') {\n primaryMint = inflowTokenMint;\n secondaryMint = outflowTokenMint;\n userTokenAccountAddress = userInflowTokenAccountAddress;\n userCollateralAccountAddress = userOutflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userOutflowTokenAccountAddress;\n } else {\n throw new Error('Invalid action');\n }\n\n return new KaminoAction(\n kaminoMarket,\n payer,\n kaminoObligation || obligation,\n userTokenAccountAddress,\n userCollateralAccountAddress,\n primaryMint,\n distinctReserveCount,\n inflowAmount,\n depositReserves,\n borrowReserves,\n inflowReserve,\n currentSlot,\n undefined,\n secondaryMint,\n additionalUserTokenAccountAddress,\n outflowReserve,\n outflowAmount,\n referrerKey\n );\n }\n\n static async initializeWithdrawReferrerFees(\n mint: PublicKey,\n owner: PublicKey,\n kaminoMarket: KaminoMarket,\n currentSlot: number = 0,\n hostAta?: PublicKey\n ) {\n const reserve = kaminoMarket.getReserveByMint(mint);\n if (reserve === undefined) {\n throw new Error(`Reserve ${mint} not found in market ${kaminoMarket.getAddress().toBase58()}`);\n }\n\n const { atas, createAtasIxns } = await getAtasWithCreateIxnsIfMissing(kaminoMarket.getConnection(), owner, [\n reserve.getLiquidityMint(),\n ]);\n\n const userTokenAccountAddress = atas[0];\n\n return {\n axn: new KaminoAction(\n kaminoMarket,\n owner,\n new VanillaObligation(kaminoMarket.programId),\n userTokenAccountAddress,\n PublicKey.default,\n mint,\n 0,\n new BN(0),\n [],\n [],\n reserve,\n currentSlot,\n hostAta,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined\n ),\n createAtasIxns,\n };\n }\n\n getObligationPda(): PublicKey {\n return this.obligation\n ? this.obligation.obligationAddress\n : this.obligationType!.toPda(this.kaminoMarket.getAddress(), this.owner);\n }\n\n getAdditionalDepositReservesList(): PublicKey[] {\n const depositReservesList = this.depositReserves;\n\n // check if there's any member in the preloadedDepositReserves that is not in the depositReserves\n // if so, add it to the depositReserves\n for (let i = 0; i < this.preLoadedDepositReservesSameTx.length; i++) {\n const preloadedDepositReserve = this.preLoadedDepositReservesSameTx[i];\n\n // Check if the depositReserves array contains the current preloadedDepositReserve\n const found = this.depositReserves.some((depositReserve) => {\n return depositReserve.equals(preloadedDepositReserve);\n });\n\n // If not found, push the current preloadedDepositReserve to the depositReserves array\n if (!found) {\n depositReservesList.push(this.preLoadedDepositReservesSameTx[i]);\n }\n }\n\n return depositReservesList;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kamino-finance/klend-sdk",
3
- "version": "2.12.0",
3
+ "version": "2.12.1",
4
4
  "description": "Typescript SDK for interacting with the Kamino Lending (klend) protocol",
5
5
  "repository": {
6
6
  "type": "git",