@kamino-finance/klend-sdk 3.0.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/leverage/operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { Connection, LAMPORTS_PER_SOL, PublicKey, TransactionInstruction } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { KaminoAction, KaminoMarket, KaminoObligation, lamportsToNumberDecimal as fromLamports } from '../classes';\nimport { getFlashLoanInstructions } from './instructions';\n\nimport { numberToLamportsDecimal as toLamports } from '../classes';\nimport {\n LeverageObligation,\n MultiplyObligation,\n ObligationType,\n ObligationTypeTag,\n PublicKeySet,\n U64_MAX,\n WRAPPED_SOL_MINT,\n getAssociatedTokenAddress,\n getAtasWithCreateIxnsIfMissing,\n getComputeBudgetAndPriorityFeeIxns,\n getDepositWsolIxns,\n removeBudgetAndAtaIxns,\n} from '../utils';\nimport { calcAdjustAmounts, calcWithdrawAmounts, simulateMintKToken, toJson } from './calcs';\nimport { TOKEN_PROGRAM_ID, createCloseAccountInstruction } from '@solana/spl-token';\nimport { Kamino, InstructionsWithLookupTables, StrategyWithAddress, TokenAmounts } from '@hubbleprotocol/kamino-sdk';\nimport { getExpectedTokenBalanceAfterBorrow, getKtokenToTokenSwapper, getTokenToKtokenSwapper } from './utils';\n\nexport type SwapIxnsProvider = (\n amountInLamports: number,\n amountInMint: PublicKey,\n amountOutMint: PublicKey,\n slippagePct: number,\n amountDebtAtaBalance?: Decimal\n) => Promise<[TransactionInstruction[], PublicKey[]]>;\n\nexport type PriceAinBProvider = (mintA: PublicKey, mintB: PublicKey) => Promise<Decimal>;\n\nexport type IsKtokenProvider = (token: PublicKey | string) => Promise<boolean>;\n\nexport type SwapInputs = {\n inputAmountLamports: number;\n inputMint: PublicKey;\n outputMint: PublicKey;\n};\n\nexport type KaminoDepositSwapOverride = (\n kaminoMarket: KaminoMarket,\n kamino: Kamino,\n depositor: PublicKey,\n amountInMint: PublicKey,\n amountOutMint: PublicKey,\n amountIn: Decimal,\n slippageFactor: Decimal,\n amountDebtAtaBalance: Decimal\n) => Promise<InstructionsWithLookupTables>;\n\nexport const depositLeverageCalcs = (props: {\n depositAmount: Decimal;\n depositTokenIsCollToken: boolean;\n depositTokenIsSol: boolean;\n priceDebtToColl: Decimal;\n targetLeverage: Decimal;\n slippagePct: Decimal;\n flashLoanFee: Decimal;\n}): {\n flashBorrowInCollToken: Decimal;\n initDepositInSol: Decimal;\n debtTokenToBorrow: Decimal;\n collTokenToDeposit: Decimal;\n swapDebtTokenIn: Decimal;\n swapCollTokenExpectedOut: Decimal;\n} => {\n // Initialize local variables from the props object\n const {\n depositAmount,\n depositTokenIsCollToken,\n depositTokenIsSol,\n priceDebtToColl,\n targetLeverage,\n slippagePct,\n flashLoanFee,\n } = props;\n const slippage = slippagePct.div('100');\n\n const initDepositInSol = depositTokenIsSol ? depositAmount : new Decimal(0);\n\n // Core logic\n if (depositTokenIsCollToken) {\n const y = targetLeverage.mul(priceDebtToColl);\n const x = flashLoanFee.add('1').mul(slippage.add('1')).div(priceDebtToColl);\n const finalColl = depositAmount.mul(x).div(x.sub(targetLeverage.sub('1').div(y)));\n const debt = finalColl.sub(depositAmount).mul(x);\n const flashBorrowColl = finalColl.sub(depositAmount).mul(flashLoanFee.add('1'));\n\n return {\n flashBorrowInCollToken: flashBorrowColl,\n initDepositInSol,\n debtTokenToBorrow: debt,\n collTokenToDeposit: finalColl,\n swapDebtTokenIn: debt,\n swapCollTokenExpectedOut: finalColl.sub(depositAmount),\n };\n } else {\n const y = targetLeverage.mul(priceDebtToColl);\n const x = flashLoanFee.add('1').mul(slippage.add('1')).div(priceDebtToColl);\n const finalColl = depositAmount.div(x.sub(targetLeverage.sub('1').div(y)));\n const flashBorrowColl = finalColl.mul(flashLoanFee.add('1'));\n const debt = targetLeverage.sub('1').mul(finalColl).div(y);\n\n return {\n flashBorrowInCollToken: flashBorrowColl,\n initDepositInSol,\n debtTokenToBorrow: debt,\n collTokenToDeposit: finalColl,\n swapDebtTokenIn: debt.add(depositAmount),\n swapCollTokenExpectedOut: finalColl,\n };\n }\n};\n\nexport const depositLeverageKtokenCalcs = async (props: {\n kamino: Kamino;\n strategy: StrategyWithAddress;\n debtTokenMint: PublicKey;\n depositAmount: Decimal;\n depositTokenIsCollToken: boolean;\n depositTokenIsSol: boolean;\n priceDebtToColl: Decimal;\n targetLeverage: Decimal;\n slippagePct: Decimal;\n flashLoanFee: Decimal;\n priceAinB: PriceAinBProvider;\n strategyHoldings?: TokenAmounts;\n}): Promise<{\n flashBorrowInDebtToken: Decimal;\n initDepositInSol: Decimal;\n collTokenToDeposit: Decimal;\n debtTokenToBorrow: Decimal; // debtTokenToBorrow = flashBorrowInDebtToken + flashLoanFee\n requiredCollateral: Decimal;\n singleSidedDeposit: Decimal;\n}> => {\n const {\n kamino,\n strategy,\n debtTokenMint,\n depositAmount,\n depositTokenIsCollToken,\n depositTokenIsSol,\n priceDebtToColl,\n targetLeverage,\n slippagePct,\n flashLoanFee,\n priceAinB,\n strategyHoldings,\n } = props;\n const initDepositInSol = depositTokenIsSol ? depositAmount : new Decimal(0);\n const slippage = slippagePct.div('100');\n\n let flashBorrowInDebtToken: Decimal;\n let collTokenToDeposit: Decimal;\n let debtTokenToBorrow: Decimal;\n\n if (depositTokenIsCollToken) {\n const x = slippage.add('1').div(priceDebtToColl);\n const y = flashLoanFee.add('1').mul(priceDebtToColl);\n const z = targetLeverage.mul(y).div(targetLeverage.sub(1));\n flashBorrowInDebtToken = depositAmount.div(z.minus(new Decimal(1).div(x)));\n collTokenToDeposit = depositAmount.add(flashBorrowInDebtToken.div(x));\n debtTokenToBorrow = flashBorrowInDebtToken.mul(new Decimal(1).add(flashLoanFee));\n\n return {\n flashBorrowInDebtToken,\n initDepositInSol,\n collTokenToDeposit,\n debtTokenToBorrow,\n requiredCollateral: collTokenToDeposit.sub(depositAmount), // Assuming netValue is requiredCollateral, adjust as needed\n singleSidedDeposit: flashBorrowInDebtToken,\n };\n } else {\n const y = targetLeverage.mul(priceDebtToColl);\n // although we will only swap ~half of the debt token, we account for the slippage on the entire amount as we are working backwards from the minimum collateral and do not know the exact swap proportion in advance\n // This also allows for some variation in the pool ratios between calculation + submitting the tx\n const x = flashLoanFee.add('1').mul(slippage.add('1')).div(priceDebtToColl);\n // Calculate the amount of collateral tokens we will deposit in order to achieve the desired leverage after swapping a portion of the debt token and flash loan fees\n const finalColl = depositAmount.div(x.sub(targetLeverage.sub('1').div(y)));\n // Calculate how many A and B tokens we will need to actually mint the desired amount of ktoken collateral\n // The actual amount of ktokens received may be less than the finalColl due to smart proportional contract logic\n // So we use the actualColl as the amount we will deposit\n const [estimatedA, estimatedB, actualColl] = await simulateMintKToken(\n kamino!,\n strategy!,\n finalColl,\n strategyHoldings\n );\n const pxAinB = await priceAinB(strategy!.strategy.tokenAMint, strategy!.strategy.tokenBMint);\n const isTokenADeposit = strategy.strategy.tokenAMint.equals(debtTokenMint);\n // Calculate the amount we need to flash borrow by combining value of A and B into the debt token\n const singleSidedDepositAmount = isTokenADeposit\n ? estimatedA.add(estimatedB.div(pxAinB))\n : estimatedB.add(estimatedA.mul(pxAinB));\n\n // Add slippage to the entire amount, add flash loan fee to part we will flash borrow\n flashBorrowInDebtToken = singleSidedDepositAmount\n .div(new Decimal('1').sub(slippage))\n .sub(depositAmount)\n .div(new Decimal('1').sub(flashLoanFee));\n // Deposit the min ktoken amount we calculated at the beginning\n // Any slippage will be left in the user's wallet as ktokens\n collTokenToDeposit = actualColl;\n debtTokenToBorrow = flashBorrowInDebtToken.div(new Decimal('1').sub(flashLoanFee));\n // Add slippage to ensure we try to swap/deposit as much as possible after flash loan fees\n const singleSidedDeposit = singleSidedDepositAmount.div(new Decimal('1').sub(slippage));\n\n return {\n flashBorrowInDebtToken,\n initDepositInSol,\n collTokenToDeposit,\n debtTokenToBorrow,\n requiredCollateral: collTokenToDeposit, // Assuming collTokenToDeposit is requiredCollateral, adjust as needed\n singleSidedDeposit,\n };\n }\n};\n\nexport const getDepositWithLeverageSwapInputs = (props: {\n depositAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n targetLeverage: Decimal;\n kaminoMarket: KaminoMarket;\n selectedTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n}): {\n swapInputs: SwapInputs;\n} => {\n const {\n depositAmount,\n priceDebtToColl,\n slippagePct,\n targetLeverage,\n kaminoMarket,\n selectedTokenMint,\n debtTokenMint,\n collTokenMint,\n } = props;\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const selectedTokenIsCollToken = selectedTokenMint.equals(collTokenMint);\n const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const depositTokenIsSol = !solTokenReserve ? false : selectedTokenMint.equals(solTokenReserve!.getLiquidityMint());\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const calcs = depositLeverageCalcs({\n depositAmount,\n depositTokenIsCollToken: selectedTokenIsCollToken,\n depositTokenIsSol,\n priceDebtToColl,\n targetLeverage,\n slippagePct,\n flashLoanFee,\n });\n\n return {\n swapInputs: {\n inputAmountLamports: toLamports(calcs.swapDebtTokenIn, debtReserve!.state.liquidity.mintDecimals.toNumber())\n .ceil()\n .toNumber(),\n inputMint: debtTokenMint,\n outputMint: collTokenMint,\n },\n };\n};\n\nexport const getDepositWithLeverageIxns = async (props: {\n connection: Connection;\n budgetAndPriorityFeeIxns?: TransactionInstruction[];\n user: PublicKey;\n amount: Decimal;\n selectedTokenMint: PublicKey;\n collTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n targetLeverage: Decimal;\n kaminoMarket: KaminoMarket;\n slippagePct: Decimal;\n priceDebtToColl: Decimal;\n swapper: SwapIxnsProvider;\n referrer: PublicKey;\n isKtoken: IsKtokenProvider;\n priceAinB: PriceAinBProvider;\n kamino: Kamino | undefined;\n obligationTypeTagOverride: ObligationTypeTag;\n obligation: KaminoObligation | null;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n scopeFeed?: string;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n}> => {\n const {\n connection,\n budgetAndPriorityFeeIxns,\n user,\n amount,\n selectedTokenMint,\n collTokenMint,\n debtTokenMint,\n targetLeverage,\n kaminoMarket,\n slippagePct,\n priceDebtToColl,\n swapper,\n referrer,\n isKtoken,\n priceAinB,\n kamino,\n obligationTypeTagOverride = 1,\n obligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const flashLoanFee = collReserve!.getFlashLoanFee() || new Decimal(0);\n\n const selectedTokenIsCollToken = selectedTokenMint.equals(collTokenMint);\n const depositTokenIsSol = !solTokenReserve ? false : selectedTokenMint.equals(solTokenReserve!.getLiquidityMint());\n\n const collIsKtoken = await isKtoken(collTokenMint);\n const strategy = collIsKtoken ? (await kamino!.getStrategyByKTokenMint(collTokenMint))! : undefined;\n\n const calcs = depositLeverageCalcs({\n depositAmount: amount,\n depositTokenIsCollToken: selectedTokenIsCollToken,\n depositTokenIsSol,\n priceDebtToColl,\n targetLeverage,\n slippagePct,\n flashLoanFee,\n });\n let calcsKtoken;\n if (collIsKtoken) {\n calcsKtoken = await depositLeverageKtokenCalcs({\n kamino: kamino!,\n strategy: strategy!,\n debtTokenMint,\n depositAmount: amount,\n depositTokenIsCollToken: selectedTokenIsCollToken,\n depositTokenIsSol,\n priceDebtToColl,\n targetLeverage,\n slippagePct,\n flashLoanFee,\n priceAinB,\n });\n // Rounding to exact number of decimals so this value is passed through in all calcs without rounding inconsistencies\n calcsKtoken.flashBorrowInDebtToken = calcsKtoken.flashBorrowInDebtToken.toDecimalPlaces(\n debtReserve?.state.liquidity.mintDecimals.toNumber()!,\n Decimal.ROUND_CEIL\n );\n calcsKtoken.debtTokenToBorrow = calcsKtoken.debtTokenToBorrow.toDecimalPlaces(\n debtReserve?.state.liquidity.mintDecimals.toNumber()!,\n Decimal.ROUND_CEIL\n );\n calcsKtoken.singleSidedDeposit = calcsKtoken.singleSidedDeposit.toDecimalPlaces(\n debtReserve?.state.liquidity.mintDecimals.toNumber()!,\n Decimal.ROUND_CEIL\n );\n }\n\n console.log('Ops Calcs', toJson(!collIsKtoken ? calcs : calcsKtoken));\n console.log(\n 'Infos',\n toJson({\n depositTokenIsSol,\n selectedTokenIsCollToken,\n initDepositInSol: calcs.initDepositInSol,\n })\n );\n\n // 1. Create atas & budget txns\n let mintsToCreateAtas: PublicKey[] = [];\n let mintsToCreateAtasTokenPrograms: PublicKey[] = [];\n if (collIsKtoken) {\n const secondTokenAta = strategy!.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBMint\n : strategy!.strategy.tokenAMint;\n const secondTokenTokenProgarm = strategy?.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBTokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenBTokenProgram\n : strategy!.strategy.tokenATokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenATokenProgram;\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint(), secondTokenAta];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n secondTokenTokenProgarm,\n ];\n } else {\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n ];\n }\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n const {\n atas: [collTokenAta, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n // TODO: this needs to work the other way around also\n // TODO: marius test this with shorting leverage and with leverage looping\n const fillWsolAtaIxns: TransactionInstruction[] = [];\n if (depositTokenIsSol) {\n fillWsolAtaIxns.push(\n ...getDepositWsolIxns(\n user,\n selectedTokenIsCollToken ? collTokenAta : debtTokenAta,\n toLamports(calcs.initDepositInSol, solTokenReserve!.stats.decimals).ceil()\n )\n );\n }\n\n // 1. Flash borrow & repay the collateral amount needed for given leverage\n // if user deposits coll, then we borrow the diff, else we borrow the entire amount\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length + fillWsolAtaIxns.length,\n walletPublicKey: user,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: !collIsKtoken ? collReserve! : debtReserve!,\n amountLamports: toLamports(\n !collIsKtoken ? calcs.flashBorrowInCollToken : calcsKtoken.flashBorrowInDebtToken,\n !collIsKtoken ? collReserve!.stats.decimals : debtReserve!.stats.decimals\n ),\n destinationAta: !collIsKtoken ? collTokenAta : debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n console.log(\n 'Borrowing: ',\n toLamports(!collIsKtoken ? calcs.debtTokenToBorrow : calcsKtoken.debtTokenToBorrow, debtReserve!.stats.decimals)\n .ceil()\n .toString()\n );\n // 3. Deposit initial tokens + borrowed tokens into reserve\n let obligationType: ObligationType;\n if (obligationTypeTagOverride === ObligationTypeTag.Multiply) {\n // multiply\n obligationType = new MultiplyObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else if (obligationTypeTagOverride === ObligationTypeTag.Leverage) {\n // leverage\n obligationType = new LeverageObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else {\n throw Error('Obligation type tag not supported for leverage, please use 1 - multiply or 3 - leverage');\n }\n\n const scopeRefresh = scopeFeed ? { includeScopeRefresh: true, scopeFeed: scopeFeed } : undefined;\n\n const kaminoDepositAndBorrowAction = await KaminoAction.buildDepositAndBorrowTxns(\n kaminoMarket,\n toLamports(!collIsKtoken ? calcs.collTokenToDeposit : calcsKtoken.collTokenToDeposit, collReserve!.stats.decimals)\n .floor()\n .toString(),\n collTokenMint,\n toLamports(!collIsKtoken ? calcs.debtTokenToBorrow : calcsKtoken.debtTokenToBorrow, debtReserve!.stats.decimals)\n .ceil()\n .toString(),\n debtTokenMint,\n user,\n obligation ? obligation : obligationType,\n 0,\n false,\n true, // emode\n false, // to be checked and created in a setup tx in the UI\n referrer,\n currentSlot,\n scopeRefresh\n );\n\n console.log(\n 'Expected to swap in',\n !collIsKtoken ? calcs.swapDebtTokenIn.toNumber().toString() : calcsKtoken.singleSidedDeposit.toNumber().toString(),\n 'debt for',\n !collIsKtoken ? calcs.swapCollTokenExpectedOut.toString() : calcsKtoken.requiredCollateral.toNumber().toString(),\n 'coll'\n );\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...kaminoDepositAndBorrowAction.setupIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[0]],\n ...kaminoDepositAndBorrowAction.inBetweenIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[1]],\n ...kaminoDepositAndBorrowAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n ixns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n let depositSwapper: SwapIxnsProvider;\n let expectedDebtTokenAtaBalance: Decimal = new Decimal(0); // only needed for kTokens\n\n if (!collIsKtoken) {\n depositSwapper = swapper;\n } else {\n if (kamino === undefined) {\n throw Error('Ktoken use as collateral for leverage without Kamino instance');\n }\n depositSwapper = await getTokenToKtokenSwapper(connection, kaminoMarket, kamino, user, swapper, priceAinB, false);\n\n let futureBalanceInAta = new Decimal(0);\n if (debtTokenMint.equals(WRAPPED_SOL_MINT)) {\n futureBalanceInAta = futureBalanceInAta.add(\n !collIsKtoken ? calcs.initDepositInSol : calcsKtoken.initDepositInSol\n );\n }\n futureBalanceInAta = futureBalanceInAta.add(\n !collIsKtoken ? calcs.debtTokenToBorrow : calcsKtoken.flashBorrowInDebtToken\n );\n expectedDebtTokenAtaBalance = await getExpectedTokenBalanceAfterBorrow(\n connection,\n debtTokenMint,\n user,\n toLamports(futureBalanceInAta.toDecimalPlaces(debtReserve!.stats.decimals), debtReserve!.stats.decimals),\n debtReserve!.state.liquidity.mintDecimals.toNumber()\n );\n }\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: toLamports(\n !collIsKtoken ? calcs.swapDebtTokenIn : calcsKtoken.singleSidedDeposit,\n debtReserve!.stats.decimals\n )\n .ceil()\n .toNumber(),\n inputMint: debtTokenMint,\n outputMint: collTokenMint,\n };\n\n const [swapIxns, lookupTablesAddresses] = await depositSwapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct.toNumber(),\n expectedDebtTokenAtaBalance\n );\n\n if (collIsKtoken) {\n if (strategy?.strategy.strategyLookupTable) {\n lookupTablesAddresses.push(strategy?.strategy.strategyLookupTable!);\n } else {\n console.log('Strategy lookup table not found');\n }\n }\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n if (!collIsKtoken) {\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...kaminoDepositAndBorrowAction.setupIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[0]],\n ...kaminoDepositAndBorrowAction.inBetweenIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[1]],\n ...kaminoDepositAndBorrowAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ],\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts: totalKlendAccounts,\n };\n } else {\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...swapInstructions,\n ...kaminoDepositAndBorrowAction.setupIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[0]],\n ...kaminoDepositAndBorrowAction.inBetweenIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[1]],\n ...kaminoDepositAndBorrowAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ],\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n};\n\nexport const getWithdrawWithLeverageSwapInputs = (props: {\n amount: Decimal;\n deposited: Decimal;\n borrowed: Decimal;\n priceCollToDebt: Decimal;\n slippagePct: number;\n isClosingPosition: boolean;\n kaminoMarket: KaminoMarket;\n selectedTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n userObligation: KaminoObligation;\n currentSlot: number;\n}): {\n swapInputs: SwapInputs;\n} => {\n const {\n amount,\n deposited,\n borrowed,\n priceCollToDebt,\n slippagePct,\n isClosingPosition,\n kaminoMarket,\n selectedTokenMint,\n debtTokenMint,\n collTokenMint,\n userObligation,\n currentSlot,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n const selectedTokenIsCollToken = selectedTokenMint.equals(collTokenMint);\n\n const { adjustDepositPosition: withdrawAmount, adjustBorrowPosition: initialRepayAmount } = isClosingPosition\n ? { adjustDepositPosition: deposited, adjustBorrowPosition: borrowed }\n : calcWithdrawAmounts({\n collTokenMint: collTokenMint,\n priceCollToDebt: new Decimal(priceCollToDebt),\n currentDepositPosition: deposited,\n currentBorrowPosition: borrowed,\n withdrawAmount: new Decimal(amount),\n selectedTokenMint: selectedTokenMint,\n });\n\n const irSlippageBpsForDebt = userObligation\n .estimateObligationInterestRate(kaminoMarket, debtReserve!, userObligation.state.borrows[0]!, currentSlot)\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const repayAmount = initialRepayAmount\n .mul(irSlippageBpsForDebt.add('0.1').div('10_000').add('1'))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const swapAmountIfWithdrawingColl = repayAmount\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(new Decimal(1 + slippagePct / 100))\n .div(priceCollToDebt);\n\n const swapAmountIfWithdrawingDebt = withdrawAmount;\n\n const collTokenSwapIn = selectedTokenIsCollToken ? swapAmountIfWithdrawingColl : swapAmountIfWithdrawingDebt;\n\n return {\n swapInputs: {\n inputAmountLamports: toLamports(collTokenSwapIn, collReserve!.state.liquidity.mintDecimals.toNumber())\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n };\n};\n\nexport const getWithdrawWithLeverageIxns = async (props: {\n connection: Connection;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n user: PublicKey;\n amount: Decimal;\n deposited: Decimal;\n borrowed: Decimal;\n collTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n priceCollToDebt: Decimal;\n selectedTokenMint: PublicKey;\n isClosingPosition: boolean;\n kaminoMarket: KaminoMarket;\n slippagePct: number;\n swapper: SwapIxnsProvider;\n referrer: PublicKey;\n isKtoken: IsKtokenProvider;\n kamino: Kamino | undefined;\n obligationTypeTagOverride: ObligationTypeTag;\n obligation: KaminoObligation | null;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n scopeFeed?: string;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n}> => {\n const {\n connection,\n budgetAndPriorityFeeIxns,\n user,\n amount,\n deposited,\n borrowed,\n collTokenMint,\n debtTokenMint,\n priceCollToDebt,\n selectedTokenMint,\n isClosingPosition,\n kaminoMarket,\n slippagePct,\n swapper,\n referrer,\n isKtoken,\n kamino,\n obligationTypeTagOverride,\n obligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n } = props;\n\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n const collIsKtoken = await isKtoken(collTokenMint);\n\n const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const selectedTokenIsCollToken = selectedTokenMint.equals(collTokenMint);\n const depositTokenIsSol = !solTokenReserve ? false : selectedTokenMint.equals(solTokenReserve!.getLiquidityMint());\n\n let obligationType: ObligationType;\n if (obligationTypeTagOverride == ObligationTypeTag.Multiply) {\n // multiply\n obligationType = new MultiplyObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else if (obligationTypeTagOverride == ObligationTypeTag.Leverage) {\n // leverage\n obligationType = new LeverageObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else {\n throw Error(\n `Obligation type tag ${obligationTypeTagOverride} not supported for leverage, please use multiply (1) or leverage (3) obligation type`\n );\n }\n\n // 1. Calculate coll_amount and debt_amount to repay such that we maintain leverage and we withdraw to\n // the wallet `amountInDepositTokenToWithdrawToWallet` amount of collateral token\n // We need to withdraw withdrawAmountInDepositToken coll tokens\n // and repay repayAmountInBorrowToken debt tokens\n // TODO marius: do the same in useDeposit\n const { adjustDepositPosition: withdrawAmount, adjustBorrowPosition: initialRepayAmount } = isClosingPosition\n ? { adjustDepositPosition: deposited, adjustBorrowPosition: borrowed }\n : calcWithdrawAmounts({\n collTokenMint: collTokenMint,\n priceCollToDebt: new Decimal(priceCollToDebt),\n currentDepositPosition: deposited,\n currentBorrowPosition: borrowed,\n withdrawAmount: new Decimal(amount),\n selectedTokenMint: selectedTokenMint,\n });\n\n // Add slippage for the accrued interest rate amount\n const userObligation = obligation\n ? obligation\n : await kaminoMarket.getObligationByAddress(obligationType.toPda(kaminoMarket.getAddress(), user));\n const irSlippageBpsForDebt = userObligation!\n .estimateObligationInterestRate(kaminoMarket, debtReserve!, userObligation?.state.borrows[0]!, currentSlot)\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1 to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not reapying enough\n const repayAmount = initialRepayAmount\n .mul(irSlippageBpsForDebt.add('0.1').div('10_000').add('1'))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n // 6. Get swap ixns\n // 5. Get swap estimations to understand how much we need to borrow from borrow reserve\n // prevent withdrawing more then deposited if we close position\n const depositTokenWithdrawAmount = !isClosingPosition\n ? withdrawAmount.mul(new Decimal(1).plus(flashLoanFee))\n : withdrawAmount;\n\n // We are swapping debt token\n // When withdrawing coll, it means we just need to swap enough to pay for the flash borrow\n const swapAmountIfWithdrawingColl = repayAmount\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(new Decimal(1 + slippagePct / 100))\n .div(priceCollToDebt);\n\n // When withdrawing debt, it means we need to swap just the collateral we are withdrwaing\n // enough to cover the debt we are repaying, leaving the remaining in the wallet\n const swapAmountIfWithdrawingDebt = withdrawAmount;\n\n const collTokenSwapIn = selectedTokenIsCollToken ? swapAmountIfWithdrawingColl : swapAmountIfWithdrawingDebt;\n const debtTokenExpectedSwapOut = collTokenSwapIn.mul(priceCollToDebt).div(new Decimal(1 + slippagePct / 100));\n\n const strategy = collIsKtoken ? await kamino?.getStrategyByKTokenMint(collTokenMint) : undefined;\n\n console.log('Expecting to swap', collTokenSwapIn.toString(), 'coll for', debtTokenExpectedSwapOut.toString(), 'debt');\n // 1. Create atas & budget txns & user metadata\n let mintsToCreateAtas: PublicKey[] = [];\n let mintsToCreateAtasTokenPrograms: PublicKey[] = [];\n if (collIsKtoken) {\n const secondTokenAta = strategy!.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBMint\n : strategy!.strategy.tokenAMint;\n const secondTokenTokenProgarm = strategy?.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBTokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenBTokenProgram\n : strategy!.strategy.tokenATokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenATokenProgram;\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint(), secondTokenAta];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n secondTokenTokenProgarm,\n ];\n } else {\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n ];\n }\n\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n const closeWsolAtaIxns: TransactionInstruction[] = [];\n if (depositTokenIsSol || debtTokenMint.equals(WRAPPED_SOL_MINT)) {\n const wsolAta = getAssociatedTokenAddress(WRAPPED_SOL_MINT, user, false);\n closeWsolAtaIxns.push(createCloseAccountInstruction(wsolAta, user, user, [], TOKEN_PROGRAM_ID));\n }\n closeAtasIxns.push(...closeWsolAtaIxns);\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n\n // TODO: marius test this with shorting leverage and with leverage looping\n // This is here so that we have enough wsol to repay in case the kAB swapped to sol after estimates is not enough\n const fillWsolAtaIxns: TransactionInstruction[] = [];\n if (debtTokenMint.equals(WRAPPED_SOL_MINT)) {\n const halfSolBalance = (await connection.getBalance(user)) / LAMPORTS_PER_SOL / 2;\n const balanceToWrap = halfSolBalance < 0.1 ? halfSolBalance : 0.1;\n fillWsolAtaIxns.push(\n ...getDepositWsolIxns(user, debtTokenAta, toLamports(balanceToWrap, solTokenReserve!.stats.decimals).ceil())\n );\n }\n\n // 2. Prepare the flash borrow and flash repay amounts and ixns\n // We borrow exactly how much we need to repay\n // and repay that + flash amount fee\n\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length + fillWsolAtaIxns.length,\n walletPublicKey: user,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: toLamports(repayAmount, debtReserve!.stats.decimals),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 6. Repay borrowed tokens and Withdraw tokens from reserve that will be swapped to repay flash loan\n const repayAndWithdrawAction = await KaminoAction.buildRepayAndWithdrawTxns(\n kaminoMarket,\n isClosingPosition ? U64_MAX : toLamports(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n debtTokenMint,\n isClosingPosition ? U64_MAX : toLamports(depositTokenWithdrawAmount, collReserve!.stats.decimals).ceil().toString(),\n collTokenMint,\n user,\n currentSlot,\n userObligation ? userObligation : obligationType,\n 0,\n false,\n false,\n false, // to be checked and created in a setup tx in the UI (won't be the case for withdraw anyway as this would be created in deposit)\n isClosingPosition,\n referrer,\n { includeScopeRefresh: true, scopeFeed: scopeFeed! }\n );\n\n const klendIxns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n klendIxns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n let withdrawSwapper: SwapIxnsProvider;\n\n if (collIsKtoken) {\n if (kamino === undefined) {\n throw Error('Ktoken use as collateral for leverage without Kamino instance');\n }\n withdrawSwapper = await getKtokenToTokenSwapper(kaminoMarket, kamino, user, swapper);\n } else {\n withdrawSwapper = swapper;\n }\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: toLamports(collTokenSwapIn, collReserve!.stats.decimals).ceil().toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n const [swapIxns, lookupTablesAddresses] = await withdrawSwapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct\n );\n\n // TODO MARIUS: remove first instruction that is setBudget ixn\n\n if (collIsKtoken) {\n if (strategy?.strategy.strategyLookupTable) {\n lookupTablesAddresses.push(strategy?.strategy.strategyLookupTable!);\n } else {\n console.log('Strategy lookup table not found');\n }\n }\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n // Send ixns and lookup tables\n return {\n ixns,\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts: totalKlendAccounts,\n };\n};\n\nexport const getAdjustLeverageSwapInputs = (props: {\n deposited: Decimal;\n borrowed: Decimal;\n priceCollToDebt: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: number;\n targetLeverage: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n}): {\n swapInputs: SwapInputs;\n} => {\n const {\n deposited,\n borrowed,\n priceCollToDebt,\n priceDebtToColl,\n slippagePct,\n targetLeverage,\n kaminoMarket,\n debtTokenMint,\n collTokenMint,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const { adjustDepositPosition, adjustBorrowPosition } = calcAdjustAmounts({\n currentDepositPosition: deposited,\n currentBorrowPosition: borrowed,\n targetLeverage: targetLeverage,\n priceCollToDebt: priceCollToDebt,\n flashLoanFee: new Decimal(flashLoanFee),\n });\n const isDeposit = adjustDepositPosition.gte(0) && adjustBorrowPosition.gte(0);\n\n if (isDeposit) {\n const borrowAmount = adjustDepositPosition\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(new Decimal(1 + slippagePct / 100))\n .div(priceDebtToColl);\n\n return {\n swapInputs: {\n inputAmountLamports: toLamports(borrowAmount, debtReserve!.state.liquidity.mintDecimals.toNumber())\n .ceil()\n .toNumber(),\n inputMint: debtTokenMint,\n outputMint: collTokenMint,\n },\n };\n } else {\n const withdrawAmountWithSlippageAndFlashLoanFee = Decimal.abs(adjustDepositPosition)\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(1 + slippagePct / 100);\n\n return {\n swapInputs: {\n inputAmountLamports: toLamports(\n withdrawAmountWithSlippageAndFlashLoanFee,\n collReserve!.state.liquidity.mintDecimals.toNumber()\n )\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n };\n }\n};\n\nexport const getAdjustLeverageIxns = async (props: {\n connection: Connection;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n user: PublicKey;\n kaminoMarket: KaminoMarket;\n priceDebtToColl: Decimal;\n priceCollToDebt: Decimal;\n targetLeverage: Decimal;\n slippagePct: number;\n depositedLamports: Decimal;\n borrowedLamports: Decimal;\n collTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n swapper: SwapIxnsProvider;\n referrer: PublicKey;\n isKtoken: IsKtokenProvider;\n priceAinB: PriceAinBProvider;\n kamino: Kamino | undefined;\n obligationTypeTagOverride: ObligationTypeTag;\n obligation: KaminoObligation | null;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n scopeFeed: string | undefined;\n}) => {\n const {\n connection,\n budgetAndPriorityFeeIxns,\n user,\n kaminoMarket,\n priceDebtToColl,\n priceCollToDebt,\n targetLeverage,\n slippagePct,\n depositedLamports,\n borrowedLamports,\n collTokenMint,\n debtTokenMint,\n swapper,\n referrer,\n isKtoken,\n priceAinB,\n kamino,\n obligationTypeTagOverride,\n obligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n } = props;\n\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n\n const deposited = fromLamports(depositedLamports, collReserve!.stats.decimals);\n const borrowed = fromLamports(borrowedLamports, debtReserve!.stats.decimals);\n const userObligation = obligation\n ? obligation\n : (await kaminoMarket.getUserObligationsByTag(obligationTypeTagOverride, user)).filter(\n (obligation: KaminoObligation) =>\n obligation.getBorrowByMint(debtReserve!.getLiquidityMint()) !== undefined &&\n obligation.getDepositByMint(collReserve!.getLiquidityMint()) !== undefined\n )[0];\n const currentLeverage = userObligation!.refreshedStats.leverage;\n const isDepositViaLeverage = targetLeverage.gte(new Decimal(currentLeverage));\n\n let flashLoanFee = new Decimal(0);\n if (isDepositViaLeverage) {\n flashLoanFee = collReserve!.getFlashLoanFee() || new Decimal(0);\n } else {\n flashLoanFee = debtReserve!.getFlashLoanFee() || new Decimal(0);\n }\n\n const { adjustDepositPosition, adjustBorrowPosition } = calcAdjustAmounts({\n currentDepositPosition: deposited,\n currentBorrowPosition: borrowed,\n targetLeverage: targetLeverage,\n priceCollToDebt: priceCollToDebt,\n flashLoanFee: new Decimal(flashLoanFee),\n });\n\n let ixns: TransactionInstruction[] = [];\n let lookupTablesAddresses: PublicKey[] = [];\n let swapInputs: SwapInputs;\n let totalKlendAccounts: number = 0;\n\n const isDeposit = adjustDepositPosition.gte(0) && adjustBorrowPosition.gte(0);\n if (isDepositViaLeverage !== isDeposit) {\n throw new Error('Invalid target leverage');\n }\n\n // leverage increased so we need to deposit and borrow more\n if (isDeposit) {\n console.log('Increasing leaverage');\n // TODO: marius why are we not using both adjustDepositPosition & adjustBorrowPosition\n const res = await getIncreaseLeverageIxns({\n connection,\n budgetAndPriorityFeeIxns,\n user,\n kaminoMarket,\n depositAmount: adjustDepositPosition,\n collTokenMint,\n debtTokenMint,\n slippagePct,\n priceDebtToColl,\n priceCollToDebt,\n swapper,\n referrer,\n isKtoken,\n priceAinB,\n kamino,\n obligationTypeTagOverride,\n obligation: userObligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n });\n ixns = res.ixns;\n lookupTablesAddresses = res.lookupTablesAddresses;\n swapInputs = res.swapInputs;\n totalKlendAccounts = res.totalKlendAccounts;\n } else {\n console.log('Decreasing leverage');\n const res = await getDecreaseLeverageIxns({\n connection,\n budgetAndPriorityFeeIxns,\n user,\n kaminoMarket,\n withdrawAmount: Decimal.abs(adjustDepositPosition),\n repayAmount: Decimal.abs(adjustBorrowPosition),\n collTokenMint,\n debtTokenMint,\n slippagePct,\n swapper,\n referrer,\n isKtoken,\n kamino,\n obligationTypeTagOverride,\n obligation: userObligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n });\n ixns = res.ixns;\n lookupTablesAddresses = res.lookupTablesAddresses;\n swapInputs = res.swapInputs;\n totalKlendAccounts = res.totalKlendAccounts;\n }\n\n return {\n ixns,\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n };\n};\n\n/**\n * Deposit and borrow tokens if leverage increased\n */\nexport const getIncreaseLeverageIxns = async (props: {\n connection: Connection;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n user: PublicKey;\n kaminoMarket: KaminoMarket;\n depositAmount: Decimal;\n collTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n slippagePct: number;\n priceDebtToColl: Decimal;\n priceCollToDebt: Decimal;\n swapper: SwapIxnsProvider;\n referrer: PublicKey;\n isKtoken: IsKtokenProvider;\n priceAinB: PriceAinBProvider;\n kamino: Kamino | undefined;\n obligationTypeTagOverride: ObligationTypeTag;\n obligation: KaminoObligation | null;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n scopeFeed: string | undefined;\n}) => {\n const {\n connection,\n budgetAndPriorityFeeIxns,\n user,\n kaminoMarket,\n depositAmount,\n collTokenMint,\n debtTokenMint,\n slippagePct,\n priceDebtToColl,\n priceCollToDebt,\n swapper,\n referrer,\n isKtoken,\n priceAinB,\n kamino,\n obligationTypeTagOverride = 1,\n obligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const collIsKtoken = await isKtoken(collTokenMint);\n\n const flashLoanFee = collReserve!.getFlashLoanFee() || new Decimal(0);\n\n if (!priceDebtToColl || !priceCollToDebt) {\n throw new Error('Price is not loaded. Please, reload the page and try again');\n }\n\n // TODO: why are we recalculating here again\n const strategy = collIsKtoken ? await kamino?.getStrategyByKTokenMint(collTokenMint) : undefined;\n\n // 1. Create atas & budget txns\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n let mintsToCreateAtas: PublicKey[] = [];\n let mintsToCreateAtasTokenPrograms: PublicKey[] = [];\n if (collIsKtoken) {\n const secondTokenAta = strategy!.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBMint\n : strategy!.strategy.tokenAMint;\n const secondTokenTokenProgarm = strategy?.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBTokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenBTokenProgram\n : strategy!.strategy.tokenATokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenATokenProgram;\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint(), secondTokenAta];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n secondTokenTokenProgarm,\n ];\n } else {\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n ];\n }\n\n const {\n atas: [collTokenAta, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n // 2. Create borrow flash loan instruction\n\n // used if coll is Ktoken and we borrow debt token instead\n const amountToFashBorrowDebt = depositAmount\n .div(priceDebtToColl)\n .mul(new Decimal(1 + slippagePct / 100))\n .toDecimalPlaces(debtReserve!.stats.decimals, Decimal.ROUND_UP);\n // .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber());\n\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length, // TODO: how about user metadata ixns\n walletPublicKey: user,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: !collIsKtoken ? collReserve! : debtReserve!,\n amountLamports: toLamports(\n !collIsKtoken ? depositAmount : amountToFashBorrowDebt,\n !collIsKtoken ? collReserve!.stats.decimals : debtReserve!.stats.decimals\n ),\n destinationAta: !collIsKtoken ? collTokenAta : debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 3. Deposit initial tokens + borrowed tokens into reserve\n let obligationType: ObligationType;\n if (obligationTypeTagOverride === ObligationTypeTag.Multiply) {\n // multiply\n obligationType = new MultiplyObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else if (obligationTypeTagOverride === ObligationTypeTag.Leverage) {\n // leverage\n obligationType = new LeverageObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else {\n throw Error('Obligation type tag not supported for leverage, please use 1 - multiply or 3 - leverage');\n }\n\n const depositAction = await KaminoAction.buildDepositTxns(\n kaminoMarket,\n toLamports(depositAmount, collReserve!.stats.decimals).floor().toString(),\n collTokenMint,\n user,\n obligation ? obligation : obligationType,\n 0,\n false,\n false,\n false, // to be checked and create in a setup tx in the UI (won't be the case for adjust anyway as this would be created in deposit)\n referrer,\n currentSlot,\n { includeScopeRefresh: true, scopeFeed: scopeFeed! }\n );\n\n // 4. Get swap estimations to understand how much we need to borrow from borrow reserve\n const borrowAmount = depositAmount\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(new Decimal(1 + slippagePct / 100))\n .div(priceDebtToColl);\n\n const _collTokenExpectedSwapOut = depositAmount.mul(new Decimal(1).plus(flashLoanFee));\n\n // 5. Borrow tokens in borrow token reserve that will be swapped to repay flash loan\n const borrowAction = await KaminoAction.buildBorrowTxns(\n kaminoMarket,\n toLamports(borrowAmount, debtReserve!.stats.decimals).ceil().toString(),\n debtTokenMint,\n user,\n obligation ? obligation : obligationType,\n 0,\n false,\n false,\n false, // to be checked and create in a setup tx in the UI (won't be the case for adjust anyway as this would be created in deposit)\n referrer,\n currentSlot,\n { includeScopeRefresh: true, scopeFeed: scopeFeed! }\n );\n\n const klendIxns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...depositAction.setupIxs,\n ...depositAction.lendingIxs,\n ...depositAction.cleanupIxs,\n ...borrowAction.setupIxs,\n ...borrowAction.lendingIxs,\n ...borrowAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n klendIxns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n let depositSwapper: SwapIxnsProvider;\n let expectedDebtTokenAtaBalance = new Decimal(0);\n\n if (collIsKtoken) {\n if (kamino === undefined) {\n throw Error('Ktoken use as collateral for leverage without Kamino instance');\n }\n depositSwapper = await getTokenToKtokenSwapper(connection, kaminoMarket, kamino, user, swapper, priceAinB, false);\n\n expectedDebtTokenAtaBalance = await getExpectedTokenBalanceAfterBorrow(\n connection,\n debtTokenMint,\n user,\n toLamports(!collIsKtoken ? borrowAmount : amountToFashBorrowDebt, debtReserve!.stats.decimals).floor(),\n debtReserve!.state.liquidity.mintDecimals.toNumber()\n );\n } else {\n depositSwapper = swapper;\n }\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: toLamports(!collIsKtoken ? borrowAmount : amountToFashBorrowDebt, debtReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: debtTokenMint,\n outputMint: collTokenMint,\n };\n\n const [swapIxns, lookupTablesAddresses] = await depositSwapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct,\n expectedDebtTokenAtaBalance\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n const ixns = !collIsKtoken\n ? [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...depositAction.setupIxs,\n ...depositAction.lendingIxs,\n ...depositAction.cleanupIxs,\n ...borrowAction.setupIxs,\n ...borrowAction.lendingIxs,\n ...borrowAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ]\n : [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...swapInstructions,\n ...depositAction.setupIxs,\n ...depositAction.lendingIxs,\n ...depositAction.cleanupIxs,\n ...borrowAction.setupIxs,\n ...borrowAction.lendingIxs,\n ...borrowAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n ixns.forEach((ixn, i) => {\n console.log(`ixn ${i + 1}: ${ixn.programId.toString()}`);\n });\n\n // Create and send transaction\n if (collIsKtoken) {\n if (strategy?.strategy.strategyLookupTable) {\n lookupTablesAddresses.push(strategy?.strategy.strategyLookupTable!);\n } else {\n console.log('Strategy lookup table not found');\n }\n }\n return {\n ixns,\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n };\n};\n\n/**\n * Withdraw and repay tokens if leverage decreased\n */\nexport const getDecreaseLeverageIxns = async (props: {\n connection: Connection;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n user: PublicKey;\n kaminoMarket: KaminoMarket;\n withdrawAmount: Decimal;\n repayAmount: Decimal;\n collTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n slippagePct: number;\n swapper: SwapIxnsProvider;\n referrer: PublicKey;\n isKtoken: IsKtokenProvider;\n kamino: Kamino | undefined;\n obligationTypeTagOverride: ObligationTypeTag;\n obligation: KaminoObligation | null;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n scopeFeed: string | undefined;\n}) => {\n const {\n connection,\n budgetAndPriorityFeeIxns,\n user,\n kaminoMarket,\n withdrawAmount,\n repayAmount,\n collTokenMint,\n debtTokenMint,\n slippagePct,\n swapper,\n referrer,\n isKtoken,\n kamino,\n obligationTypeTagOverride = 1,\n obligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n } = props;\n\n console.log(\n 'getDecreaseLeverageIxns',\n toJson({ withdrawAmount, repayAmount, collTokenMint, debtTokenMint, slippagePct })\n );\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const collIsKtoken = await isKtoken(collTokenMint);\n\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const strategy = collIsKtoken ? await kamino?.getStrategyByKTokenMint(collTokenMint) : undefined;\n\n // 1. Create atas & budget txns\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n let mintsToCreateAtas: PublicKey[] = [];\n let mintsToCreateAtasTokenPrograms: PublicKey[] = [];\n if (collIsKtoken) {\n const secondTokenAta = strategy!.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBMint\n : strategy!.strategy.tokenAMint;\n const secondTokenTokenProgarm = strategy?.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBTokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenBTokenProgram\n : strategy!.strategy.tokenATokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenATokenProgram;\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint(), secondTokenAta];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n secondTokenTokenProgarm,\n ];\n } else {\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n ];\n }\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n // TODO: Mihai/Marius check if we can improve this logic and not convert any SOL\n // This is here so that we have enough wsol to repay in case the kAB swapped to sol after estimates is not enough\n const closeWsolAtaIxns: TransactionInstruction[] = [];\n if (debtTokenMint.equals(WRAPPED_SOL_MINT)) {\n const wsolAta = await getAssociatedTokenAddress(WRAPPED_SOL_MINT, user, false);\n closeWsolAtaIxns.push(createCloseAccountInstruction(wsolAta, user, user, [], TOKEN_PROGRAM_ID));\n }\n closeAtasIxns.push(...closeWsolAtaIxns);\n\n const fillWsolAtaIxns: TransactionInstruction[] = [];\n if (debtTokenMint.equals(WRAPPED_SOL_MINT)) {\n const halfSolBalance = (await connection.getBalance(user)) / LAMPORTS_PER_SOL / 2;\n const balanceToWrap = halfSolBalance < 0.1 ? halfSolBalance : 0.1;\n fillWsolAtaIxns.push(\n ...getDepositWsolIxns(user, debtTokenAta, toLamports(balanceToWrap, debtReserve!.stats.decimals).ceil())\n );\n }\n\n // 3. Flash borrow & repay amount to repay (debt)\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length + fillWsolAtaIxns.length,\n walletPublicKey: user,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: toLamports(repayAmount, debtReserve!.stats.decimals),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 4. Actually do the repay of the flash borrowed amounts\n let obligationType: ObligationType;\n if (obligationTypeTagOverride === ObligationTypeTag.Multiply) {\n // multiply\n obligationType = new MultiplyObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else if (obligationTypeTagOverride === ObligationTypeTag.Leverage) {\n // leverage\n obligationType = new LeverageObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else {\n throw Error('Obligation type tag not supported for leverage, please use 1 - multiply or 3 - leverage');\n }\n\n const scopeRefresh = scopeFeed ? { includeScopeRefresh: true, scopeFeed: scopeFeed } : undefined;\n\n const repayAction = await KaminoAction.buildRepayTxns(\n kaminoMarket,\n toLamports(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n debtTokenMint,\n user,\n obligation ? obligation : obligationType,\n currentSlot,\n undefined,\n 0,\n false,\n false,\n false, // to be checked and create in a setup tx in the UI (won't be the case for adjust anyway as this would be created in deposit)\n referrer,\n scopeRefresh\n );\n\n // 6. Withdraw collateral (a little bit more to be able to pay for the slippage on swap)\n const withdrawAmountWithSlippageAndFlashLoanFee = withdrawAmount\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(1 + slippagePct / 100);\n\n const withdrawAction = await KaminoAction.buildWithdrawTxns(\n kaminoMarket,\n toLamports(withdrawAmountWithSlippageAndFlashLoanFee, collReserve!.stats.decimals).ceil().toString(),\n collTokenMint,\n user,\n obligation ? obligation : obligationType,\n 0,\n false,\n false,\n false, // to be checked and create in a setup tx in the UI (won't be the case for adjust anyway as this would be created in deposit)\n referrer,\n currentSlot,\n { includeScopeRefresh: true, scopeFeed: scopeFeed! }\n );\n\n const klendIxns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...repayAction.setupIxs,\n ...repayAction.lendingIxs,\n ...repayAction.cleanupIxs,\n ...withdrawAction.setupIxs,\n ...withdrawAction.lendingIxs,\n ...withdrawAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n klendIxns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n let withdrawSwapper: SwapIxnsProvider;\n\n if (collIsKtoken) {\n if (kamino === undefined) {\n throw Error('Ktoken use as collateral for leverage without Kamino instance');\n }\n withdrawSwapper = await getKtokenToTokenSwapper(kaminoMarket, kamino, user, swapper);\n } else {\n withdrawSwapper = swapper;\n }\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: toLamports(withdrawAmountWithSlippageAndFlashLoanFee, collReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n // 5. Get swap ixns\n const [swapIxns, lookupTablesAddresses] = await withdrawSwapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...repayAction.setupIxs,\n ...repayAction.lendingIxs,\n ...repayAction.cleanupIxs,\n ...withdrawAction.setupIxs,\n ...withdrawAction.lendingIxs,\n ...withdrawAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n ixns.forEach((ixn, i) => {\n console.log(`ixn ${i + 1}: ${ixn.programId.toString()}`);\n });\n\n if (collIsKtoken) {\n if (strategy?.strategy.strategyLookupTable) {\n lookupTablesAddresses.push(strategy?.strategy.strategyLookupTable!);\n } else {\n console.log('Strategy lookup table not found');\n }\n }\n // Create and send transaction\n return {\n ixns,\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n };\n};\n"]}
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/leverage/operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { Connection, LAMPORTS_PER_SOL, PublicKey, TransactionInstruction } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { KaminoAction, KaminoMarket, KaminoObligation, lamportsToNumberDecimal as fromLamports } from '../classes';\nimport { getFlashLoanInstructions } from './instructions';\n\nimport { numberToLamportsDecimal as toLamports } from '../classes';\nimport {\n LeverageObligation,\n MultiplyObligation,\n ObligationType,\n ObligationTypeTag,\n PublicKeySet,\n U64_MAX,\n WRAPPED_SOL_MINT,\n getAssociatedTokenAddress,\n getAtasWithCreateIxnsIfMissing,\n getComputeBudgetAndPriorityFeeIxns,\n getDepositWsolIxns,\n removeBudgetAndAtaIxns,\n} from '../utils';\nimport { calcAdjustAmounts, calcWithdrawAmounts, simulateMintKToken, toJson } from './calcs';\nimport { TOKEN_PROGRAM_ID, createCloseAccountInstruction } from '@solana/spl-token';\nimport {\n Kamino,\n InstructionsWithLookupTables,\n StrategyWithAddress,\n TokenAmounts,\n} from '@kamino-finance/kliquidity-sdk';\nimport { getExpectedTokenBalanceAfterBorrow, getKtokenToTokenSwapper, getTokenToKtokenSwapper } from './utils';\n\nexport type SwapIxnsProvider = (\n amountInLamports: number,\n amountInMint: PublicKey,\n amountOutMint: PublicKey,\n slippagePct: number,\n amountDebtAtaBalance?: Decimal\n) => Promise<[TransactionInstruction[], PublicKey[]]>;\n\nexport type PriceAinBProvider = (mintA: PublicKey, mintB: PublicKey) => Promise<Decimal>;\n\nexport type IsKtokenProvider = (token: PublicKey | string) => Promise<boolean>;\n\nexport type SwapInputs = {\n inputAmountLamports: number;\n inputMint: PublicKey;\n outputMint: PublicKey;\n};\n\nexport type KaminoDepositSwapOverride = (\n kaminoMarket: KaminoMarket,\n kamino: Kamino,\n depositor: PublicKey,\n amountInMint: PublicKey,\n amountOutMint: PublicKey,\n amountIn: Decimal,\n slippageFactor: Decimal,\n amountDebtAtaBalance: Decimal\n) => Promise<InstructionsWithLookupTables>;\n\nexport const depositLeverageCalcs = (props: {\n depositAmount: Decimal;\n depositTokenIsCollToken: boolean;\n depositTokenIsSol: boolean;\n priceDebtToColl: Decimal;\n targetLeverage: Decimal;\n slippagePct: Decimal;\n flashLoanFee: Decimal;\n}): {\n flashBorrowInCollToken: Decimal;\n initDepositInSol: Decimal;\n debtTokenToBorrow: Decimal;\n collTokenToDeposit: Decimal;\n swapDebtTokenIn: Decimal;\n swapCollTokenExpectedOut: Decimal;\n} => {\n // Initialize local variables from the props object\n const {\n depositAmount,\n depositTokenIsCollToken,\n depositTokenIsSol,\n priceDebtToColl,\n targetLeverage,\n slippagePct,\n flashLoanFee,\n } = props;\n const slippage = slippagePct.div('100');\n\n const initDepositInSol = depositTokenIsSol ? depositAmount : new Decimal(0);\n\n // Core logic\n if (depositTokenIsCollToken) {\n const y = targetLeverage.mul(priceDebtToColl);\n const x = flashLoanFee.add('1').mul(slippage.add('1')).div(priceDebtToColl);\n const finalColl = depositAmount.mul(x).div(x.sub(targetLeverage.sub('1').div(y)));\n const debt = finalColl.sub(depositAmount).mul(x);\n const flashBorrowColl = finalColl.sub(depositAmount).mul(flashLoanFee.add('1'));\n\n return {\n flashBorrowInCollToken: flashBorrowColl,\n initDepositInSol,\n debtTokenToBorrow: debt,\n collTokenToDeposit: finalColl,\n swapDebtTokenIn: debt,\n swapCollTokenExpectedOut: finalColl.sub(depositAmount),\n };\n } else {\n const y = targetLeverage.mul(priceDebtToColl);\n const x = flashLoanFee.add('1').mul(slippage.add('1')).div(priceDebtToColl);\n const finalColl = depositAmount.div(x.sub(targetLeverage.sub('1').div(y)));\n const flashBorrowColl = finalColl.mul(flashLoanFee.add('1'));\n const debt = targetLeverage.sub('1').mul(finalColl).div(y);\n\n return {\n flashBorrowInCollToken: flashBorrowColl,\n initDepositInSol,\n debtTokenToBorrow: debt,\n collTokenToDeposit: finalColl,\n swapDebtTokenIn: debt.add(depositAmount),\n swapCollTokenExpectedOut: finalColl,\n };\n }\n};\n\nexport const depositLeverageKtokenCalcs = async (props: {\n kamino: Kamino;\n strategy: StrategyWithAddress;\n debtTokenMint: PublicKey;\n depositAmount: Decimal;\n depositTokenIsCollToken: boolean;\n depositTokenIsSol: boolean;\n priceDebtToColl: Decimal;\n targetLeverage: Decimal;\n slippagePct: Decimal;\n flashLoanFee: Decimal;\n priceAinB: PriceAinBProvider;\n strategyHoldings?: TokenAmounts;\n}): Promise<{\n flashBorrowInDebtToken: Decimal;\n initDepositInSol: Decimal;\n collTokenToDeposit: Decimal;\n debtTokenToBorrow: Decimal; // debtTokenToBorrow = flashBorrowInDebtToken + flashLoanFee\n requiredCollateral: Decimal;\n singleSidedDeposit: Decimal;\n}> => {\n const {\n kamino,\n strategy,\n debtTokenMint,\n depositAmount,\n depositTokenIsCollToken,\n depositTokenIsSol,\n priceDebtToColl,\n targetLeverage,\n slippagePct,\n flashLoanFee,\n priceAinB,\n strategyHoldings,\n } = props;\n const initDepositInSol = depositTokenIsSol ? depositAmount : new Decimal(0);\n const slippage = slippagePct.div('100');\n\n let flashBorrowInDebtToken: Decimal;\n let collTokenToDeposit: Decimal;\n let debtTokenToBorrow: Decimal;\n\n if (depositTokenIsCollToken) {\n const x = slippage.add('1').div(priceDebtToColl);\n const y = flashLoanFee.add('1').mul(priceDebtToColl);\n const z = targetLeverage.mul(y).div(targetLeverage.sub(1));\n flashBorrowInDebtToken = depositAmount.div(z.minus(new Decimal(1).div(x)));\n collTokenToDeposit = depositAmount.add(flashBorrowInDebtToken.div(x));\n debtTokenToBorrow = flashBorrowInDebtToken.mul(new Decimal(1).add(flashLoanFee));\n\n return {\n flashBorrowInDebtToken,\n initDepositInSol,\n collTokenToDeposit,\n debtTokenToBorrow,\n requiredCollateral: collTokenToDeposit.sub(depositAmount), // Assuming netValue is requiredCollateral, adjust as needed\n singleSidedDeposit: flashBorrowInDebtToken,\n };\n } else {\n const y = targetLeverage.mul(priceDebtToColl);\n // although we will only swap ~half of the debt token, we account for the slippage on the entire amount as we are working backwards from the minimum collateral and do not know the exact swap proportion in advance\n // This also allows for some variation in the pool ratios between calculation + submitting the tx\n const x = flashLoanFee.add('1').mul(slippage.add('1')).div(priceDebtToColl);\n // Calculate the amount of collateral tokens we will deposit in order to achieve the desired leverage after swapping a portion of the debt token and flash loan fees\n const finalColl = depositAmount.div(x.sub(targetLeverage.sub('1').div(y)));\n // Calculate how many A and B tokens we will need to actually mint the desired amount of ktoken collateral\n // The actual amount of ktokens received may be less than the finalColl due to smart proportional contract logic\n // So we use the actualColl as the amount we will deposit\n const [estimatedA, estimatedB, actualColl] = await simulateMintKToken(\n kamino!,\n strategy!,\n finalColl,\n strategyHoldings\n );\n const pxAinB = await priceAinB(strategy!.strategy.tokenAMint, strategy!.strategy.tokenBMint);\n const isTokenADeposit = strategy.strategy.tokenAMint.equals(debtTokenMint);\n // Calculate the amount we need to flash borrow by combining value of A and B into the debt token\n const singleSidedDepositAmount = isTokenADeposit\n ? estimatedA.add(estimatedB.div(pxAinB))\n : estimatedB.add(estimatedA.mul(pxAinB));\n\n // Add slippage to the entire amount, add flash loan fee to part we will flash borrow\n flashBorrowInDebtToken = singleSidedDepositAmount\n .div(new Decimal('1').sub(slippage))\n .sub(depositAmount)\n .div(new Decimal('1').sub(flashLoanFee));\n // Deposit the min ktoken amount we calculated at the beginning\n // Any slippage will be left in the user's wallet as ktokens\n collTokenToDeposit = actualColl;\n debtTokenToBorrow = flashBorrowInDebtToken.div(new Decimal('1').sub(flashLoanFee));\n // Add slippage to ensure we try to swap/deposit as much as possible after flash loan fees\n const singleSidedDeposit = singleSidedDepositAmount.div(new Decimal('1').sub(slippage));\n\n return {\n flashBorrowInDebtToken,\n initDepositInSol,\n collTokenToDeposit,\n debtTokenToBorrow,\n requiredCollateral: collTokenToDeposit, // Assuming collTokenToDeposit is requiredCollateral, adjust as needed\n singleSidedDeposit,\n };\n }\n};\n\nexport const getDepositWithLeverageSwapInputs = (props: {\n depositAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n targetLeverage: Decimal;\n kaminoMarket: KaminoMarket;\n selectedTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n}): {\n swapInputs: SwapInputs;\n} => {\n const {\n depositAmount,\n priceDebtToColl,\n slippagePct,\n targetLeverage,\n kaminoMarket,\n selectedTokenMint,\n debtTokenMint,\n collTokenMint,\n } = props;\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const selectedTokenIsCollToken = selectedTokenMint.equals(collTokenMint);\n const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const depositTokenIsSol = !solTokenReserve ? false : selectedTokenMint.equals(solTokenReserve!.getLiquidityMint());\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const calcs = depositLeverageCalcs({\n depositAmount,\n depositTokenIsCollToken: selectedTokenIsCollToken,\n depositTokenIsSol,\n priceDebtToColl,\n targetLeverage,\n slippagePct,\n flashLoanFee,\n });\n\n return {\n swapInputs: {\n inputAmountLamports: toLamports(calcs.swapDebtTokenIn, debtReserve!.state.liquidity.mintDecimals.toNumber())\n .ceil()\n .toNumber(),\n inputMint: debtTokenMint,\n outputMint: collTokenMint,\n },\n };\n};\n\nexport const getDepositWithLeverageIxns = async (props: {\n connection: Connection;\n budgetAndPriorityFeeIxns?: TransactionInstruction[];\n user: PublicKey;\n amount: Decimal;\n selectedTokenMint: PublicKey;\n collTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n targetLeverage: Decimal;\n kaminoMarket: KaminoMarket;\n slippagePct: Decimal;\n priceDebtToColl: Decimal;\n swapper: SwapIxnsProvider;\n referrer: PublicKey;\n isKtoken: IsKtokenProvider;\n priceAinB: PriceAinBProvider;\n kamino: Kamino | undefined;\n obligationTypeTagOverride: ObligationTypeTag;\n obligation: KaminoObligation | null;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n scopeFeed?: string;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n}> => {\n const {\n connection,\n budgetAndPriorityFeeIxns,\n user,\n amount,\n selectedTokenMint,\n collTokenMint,\n debtTokenMint,\n targetLeverage,\n kaminoMarket,\n slippagePct,\n priceDebtToColl,\n swapper,\n referrer,\n isKtoken,\n priceAinB,\n kamino,\n obligationTypeTagOverride = 1,\n obligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const flashLoanFee = collReserve!.getFlashLoanFee() || new Decimal(0);\n\n const selectedTokenIsCollToken = selectedTokenMint.equals(collTokenMint);\n const depositTokenIsSol = !solTokenReserve ? false : selectedTokenMint.equals(solTokenReserve!.getLiquidityMint());\n\n const collIsKtoken = await isKtoken(collTokenMint);\n const strategy = collIsKtoken ? (await kamino!.getStrategyByKTokenMint(collTokenMint))! : undefined;\n\n const calcs = depositLeverageCalcs({\n depositAmount: amount,\n depositTokenIsCollToken: selectedTokenIsCollToken,\n depositTokenIsSol,\n priceDebtToColl,\n targetLeverage,\n slippagePct,\n flashLoanFee,\n });\n let calcsKtoken;\n if (collIsKtoken) {\n calcsKtoken = await depositLeverageKtokenCalcs({\n kamino: kamino!,\n strategy: strategy!,\n debtTokenMint,\n depositAmount: amount,\n depositTokenIsCollToken: selectedTokenIsCollToken,\n depositTokenIsSol,\n priceDebtToColl,\n targetLeverage,\n slippagePct,\n flashLoanFee,\n priceAinB,\n });\n // Rounding to exact number of decimals so this value is passed through in all calcs without rounding inconsistencies\n calcsKtoken.flashBorrowInDebtToken = calcsKtoken.flashBorrowInDebtToken.toDecimalPlaces(\n debtReserve?.state.liquidity.mintDecimals.toNumber()!,\n Decimal.ROUND_CEIL\n );\n calcsKtoken.debtTokenToBorrow = calcsKtoken.debtTokenToBorrow.toDecimalPlaces(\n debtReserve?.state.liquidity.mintDecimals.toNumber()!,\n Decimal.ROUND_CEIL\n );\n calcsKtoken.singleSidedDeposit = calcsKtoken.singleSidedDeposit.toDecimalPlaces(\n debtReserve?.state.liquidity.mintDecimals.toNumber()!,\n Decimal.ROUND_CEIL\n );\n }\n\n console.log('Ops Calcs', toJson(!collIsKtoken ? calcs : calcsKtoken));\n console.log(\n 'Infos',\n toJson({\n depositTokenIsSol,\n selectedTokenIsCollToken,\n initDepositInSol: calcs.initDepositInSol,\n })\n );\n\n // 1. Create atas & budget txns\n let mintsToCreateAtas: PublicKey[] = [];\n let mintsToCreateAtasTokenPrograms: PublicKey[] = [];\n if (collIsKtoken) {\n const secondTokenAta = strategy!.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBMint\n : strategy!.strategy.tokenAMint;\n const secondTokenTokenProgarm = strategy?.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBTokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenBTokenProgram\n : strategy!.strategy.tokenATokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenATokenProgram;\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint(), secondTokenAta];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n secondTokenTokenProgarm,\n ];\n } else {\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n ];\n }\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n const {\n atas: [collTokenAta, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n // TODO: this needs to work the other way around also\n // TODO: marius test this with shorting leverage and with leverage looping\n const fillWsolAtaIxns: TransactionInstruction[] = [];\n if (depositTokenIsSol) {\n fillWsolAtaIxns.push(\n ...getDepositWsolIxns(\n user,\n selectedTokenIsCollToken ? collTokenAta : debtTokenAta,\n toLamports(calcs.initDepositInSol, solTokenReserve!.stats.decimals).ceil()\n )\n );\n }\n\n // 1. Flash borrow & repay the collateral amount needed for given leverage\n // if user deposits coll, then we borrow the diff, else we borrow the entire amount\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length + fillWsolAtaIxns.length,\n walletPublicKey: user,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: !collIsKtoken ? collReserve! : debtReserve!,\n amountLamports: toLamports(\n !collIsKtoken ? calcs.flashBorrowInCollToken : calcsKtoken.flashBorrowInDebtToken,\n !collIsKtoken ? collReserve!.stats.decimals : debtReserve!.stats.decimals\n ),\n destinationAta: !collIsKtoken ? collTokenAta : debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n console.log(\n 'Borrowing: ',\n toLamports(!collIsKtoken ? calcs.debtTokenToBorrow : calcsKtoken.debtTokenToBorrow, debtReserve!.stats.decimals)\n .ceil()\n .toString()\n );\n // 3. Deposit initial tokens + borrowed tokens into reserve\n let obligationType: ObligationType;\n if (obligationTypeTagOverride === ObligationTypeTag.Multiply) {\n // multiply\n obligationType = new MultiplyObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else if (obligationTypeTagOverride === ObligationTypeTag.Leverage) {\n // leverage\n obligationType = new LeverageObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else {\n throw Error('Obligation type tag not supported for leverage, please use 1 - multiply or 3 - leverage');\n }\n\n const scopeRefresh = scopeFeed ? { includeScopeRefresh: true, scopeFeed: scopeFeed } : undefined;\n\n const kaminoDepositAndBorrowAction = await KaminoAction.buildDepositAndBorrowTxns(\n kaminoMarket,\n toLamports(!collIsKtoken ? calcs.collTokenToDeposit : calcsKtoken.collTokenToDeposit, collReserve!.stats.decimals)\n .floor()\n .toString(),\n collTokenMint,\n toLamports(!collIsKtoken ? calcs.debtTokenToBorrow : calcsKtoken.debtTokenToBorrow, debtReserve!.stats.decimals)\n .ceil()\n .toString(),\n debtTokenMint,\n user,\n obligation ? obligation : obligationType,\n 0,\n false,\n true, // emode\n false, // to be checked and created in a setup tx in the UI\n referrer,\n currentSlot,\n scopeRefresh\n );\n\n console.log(\n 'Expected to swap in',\n !collIsKtoken ? calcs.swapDebtTokenIn.toNumber().toString() : calcsKtoken.singleSidedDeposit.toNumber().toString(),\n 'debt for',\n !collIsKtoken ? calcs.swapCollTokenExpectedOut.toString() : calcsKtoken.requiredCollateral.toNumber().toString(),\n 'coll'\n );\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...kaminoDepositAndBorrowAction.setupIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[0]],\n ...kaminoDepositAndBorrowAction.inBetweenIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[1]],\n ...kaminoDepositAndBorrowAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n ixns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n let depositSwapper: SwapIxnsProvider;\n let expectedDebtTokenAtaBalance: Decimal = new Decimal(0); // only needed for kTokens\n\n if (!collIsKtoken) {\n depositSwapper = swapper;\n } else {\n if (kamino === undefined) {\n throw Error('Ktoken use as collateral for leverage without Kamino instance');\n }\n depositSwapper = await getTokenToKtokenSwapper(connection, kaminoMarket, kamino, user, swapper, priceAinB, false);\n\n let futureBalanceInAta = new Decimal(0);\n if (debtTokenMint.equals(WRAPPED_SOL_MINT)) {\n futureBalanceInAta = futureBalanceInAta.add(\n !collIsKtoken ? calcs.initDepositInSol : calcsKtoken.initDepositInSol\n );\n }\n futureBalanceInAta = futureBalanceInAta.add(\n !collIsKtoken ? calcs.debtTokenToBorrow : calcsKtoken.flashBorrowInDebtToken\n );\n expectedDebtTokenAtaBalance = await getExpectedTokenBalanceAfterBorrow(\n connection,\n debtTokenMint,\n user,\n toLamports(futureBalanceInAta.toDecimalPlaces(debtReserve!.stats.decimals), debtReserve!.stats.decimals),\n debtReserve!.state.liquidity.mintDecimals.toNumber()\n );\n }\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: toLamports(\n !collIsKtoken ? calcs.swapDebtTokenIn : calcsKtoken.singleSidedDeposit,\n debtReserve!.stats.decimals\n )\n .ceil()\n .toNumber(),\n inputMint: debtTokenMint,\n outputMint: collTokenMint,\n };\n\n const [swapIxns, lookupTablesAddresses] = await depositSwapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct.toNumber(),\n expectedDebtTokenAtaBalance\n );\n\n if (collIsKtoken) {\n if (strategy?.strategy.strategyLookupTable) {\n lookupTablesAddresses.push(strategy?.strategy.strategyLookupTable!);\n } else {\n console.log('Strategy lookup table not found');\n }\n }\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n if (!collIsKtoken) {\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...kaminoDepositAndBorrowAction.setupIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[0]],\n ...kaminoDepositAndBorrowAction.inBetweenIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[1]],\n ...kaminoDepositAndBorrowAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ],\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts: totalKlendAccounts,\n };\n } else {\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...swapInstructions,\n ...kaminoDepositAndBorrowAction.setupIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[0]],\n ...kaminoDepositAndBorrowAction.inBetweenIxs,\n ...[kaminoDepositAndBorrowAction.lendingIxs[1]],\n ...kaminoDepositAndBorrowAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ],\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n};\n\nexport const getWithdrawWithLeverageSwapInputs = (props: {\n amount: Decimal;\n deposited: Decimal;\n borrowed: Decimal;\n priceCollToDebt: Decimal;\n slippagePct: number;\n isClosingPosition: boolean;\n kaminoMarket: KaminoMarket;\n selectedTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n userObligation: KaminoObligation;\n currentSlot: number;\n}): {\n swapInputs: SwapInputs;\n} => {\n const {\n amount,\n deposited,\n borrowed,\n priceCollToDebt,\n slippagePct,\n isClosingPosition,\n kaminoMarket,\n selectedTokenMint,\n debtTokenMint,\n collTokenMint,\n userObligation,\n currentSlot,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n const selectedTokenIsCollToken = selectedTokenMint.equals(collTokenMint);\n\n const { adjustDepositPosition: withdrawAmount, adjustBorrowPosition: initialRepayAmount } = isClosingPosition\n ? { adjustDepositPosition: deposited, adjustBorrowPosition: borrowed }\n : calcWithdrawAmounts({\n collTokenMint: collTokenMint,\n priceCollToDebt: new Decimal(priceCollToDebt),\n currentDepositPosition: deposited,\n currentBorrowPosition: borrowed,\n withdrawAmount: new Decimal(amount),\n selectedTokenMint: selectedTokenMint,\n });\n\n const irSlippageBpsForDebt = userObligation\n .estimateObligationInterestRate(kaminoMarket, debtReserve!, userObligation.state.borrows[0]!, currentSlot)\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const repayAmount = initialRepayAmount\n .mul(irSlippageBpsForDebt.add('0.1').div('10_000').add('1'))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const swapAmountIfWithdrawingColl = repayAmount\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(new Decimal(1 + slippagePct / 100))\n .div(priceCollToDebt);\n\n const swapAmountIfWithdrawingDebt = withdrawAmount;\n\n const collTokenSwapIn = selectedTokenIsCollToken ? swapAmountIfWithdrawingColl : swapAmountIfWithdrawingDebt;\n\n return {\n swapInputs: {\n inputAmountLamports: toLamports(collTokenSwapIn, collReserve!.state.liquidity.mintDecimals.toNumber())\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n };\n};\n\nexport const getWithdrawWithLeverageIxns = async (props: {\n connection: Connection;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n user: PublicKey;\n amount: Decimal;\n deposited: Decimal;\n borrowed: Decimal;\n collTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n priceCollToDebt: Decimal;\n selectedTokenMint: PublicKey;\n isClosingPosition: boolean;\n kaminoMarket: KaminoMarket;\n slippagePct: number;\n swapper: SwapIxnsProvider;\n referrer: PublicKey;\n isKtoken: IsKtokenProvider;\n kamino: Kamino | undefined;\n obligationTypeTagOverride: ObligationTypeTag;\n obligation: KaminoObligation | null;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n scopeFeed?: string;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n}> => {\n const {\n connection,\n budgetAndPriorityFeeIxns,\n user,\n amount,\n deposited,\n borrowed,\n collTokenMint,\n debtTokenMint,\n priceCollToDebt,\n selectedTokenMint,\n isClosingPosition,\n kaminoMarket,\n slippagePct,\n swapper,\n referrer,\n isKtoken,\n kamino,\n obligationTypeTagOverride,\n obligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n } = props;\n\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n const collIsKtoken = await isKtoken(collTokenMint);\n\n const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const selectedTokenIsCollToken = selectedTokenMint.equals(collTokenMint);\n const depositTokenIsSol = !solTokenReserve ? false : selectedTokenMint.equals(solTokenReserve!.getLiquidityMint());\n\n let obligationType: ObligationType;\n if (obligationTypeTagOverride == ObligationTypeTag.Multiply) {\n // multiply\n obligationType = new MultiplyObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else if (obligationTypeTagOverride == ObligationTypeTag.Leverage) {\n // leverage\n obligationType = new LeverageObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else {\n throw Error(\n `Obligation type tag ${obligationTypeTagOverride} not supported for leverage, please use multiply (1) or leverage (3) obligation type`\n );\n }\n\n // 1. Calculate coll_amount and debt_amount to repay such that we maintain leverage and we withdraw to\n // the wallet `amountInDepositTokenToWithdrawToWallet` amount of collateral token\n // We need to withdraw withdrawAmountInDepositToken coll tokens\n // and repay repayAmountInBorrowToken debt tokens\n // TODO marius: do the same in useDeposit\n const { adjustDepositPosition: withdrawAmount, adjustBorrowPosition: initialRepayAmount } = isClosingPosition\n ? { adjustDepositPosition: deposited, adjustBorrowPosition: borrowed }\n : calcWithdrawAmounts({\n collTokenMint: collTokenMint,\n priceCollToDebt: new Decimal(priceCollToDebt),\n currentDepositPosition: deposited,\n currentBorrowPosition: borrowed,\n withdrawAmount: new Decimal(amount),\n selectedTokenMint: selectedTokenMint,\n });\n\n // Add slippage for the accrued interest rate amount\n const userObligation = obligation\n ? obligation\n : await kaminoMarket.getObligationByAddress(obligationType.toPda(kaminoMarket.getAddress(), user));\n const irSlippageBpsForDebt = userObligation!\n .estimateObligationInterestRate(kaminoMarket, debtReserve!, userObligation?.state.borrows[0]!, currentSlot)\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1 to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not reapying enough\n const repayAmount = initialRepayAmount\n .mul(irSlippageBpsForDebt.add('0.1').div('10_000').add('1'))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n // 6. Get swap ixns\n // 5. Get swap estimations to understand how much we need to borrow from borrow reserve\n // prevent withdrawing more then deposited if we close position\n const depositTokenWithdrawAmount = !isClosingPosition\n ? withdrawAmount.mul(new Decimal(1).plus(flashLoanFee))\n : withdrawAmount;\n\n // We are swapping debt token\n // When withdrawing coll, it means we just need to swap enough to pay for the flash borrow\n const swapAmountIfWithdrawingColl = repayAmount\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(new Decimal(1 + slippagePct / 100))\n .div(priceCollToDebt);\n\n // When withdrawing debt, it means we need to swap just the collateral we are withdrwaing\n // enough to cover the debt we are repaying, leaving the remaining in the wallet\n const swapAmountIfWithdrawingDebt = withdrawAmount;\n\n const collTokenSwapIn = selectedTokenIsCollToken ? swapAmountIfWithdrawingColl : swapAmountIfWithdrawingDebt;\n const debtTokenExpectedSwapOut = collTokenSwapIn.mul(priceCollToDebt).div(new Decimal(1 + slippagePct / 100));\n\n const strategy = collIsKtoken ? await kamino?.getStrategyByKTokenMint(collTokenMint) : undefined;\n\n console.log('Expecting to swap', collTokenSwapIn.toString(), 'coll for', debtTokenExpectedSwapOut.toString(), 'debt');\n // 1. Create atas & budget txns & user metadata\n let mintsToCreateAtas: PublicKey[] = [];\n let mintsToCreateAtasTokenPrograms: PublicKey[] = [];\n if (collIsKtoken) {\n const secondTokenAta = strategy!.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBMint\n : strategy!.strategy.tokenAMint;\n const secondTokenTokenProgarm = strategy?.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBTokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenBTokenProgram\n : strategy!.strategy.tokenATokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenATokenProgram;\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint(), secondTokenAta];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n secondTokenTokenProgarm,\n ];\n } else {\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n ];\n }\n\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n const closeWsolAtaIxns: TransactionInstruction[] = [];\n if (depositTokenIsSol || debtTokenMint.equals(WRAPPED_SOL_MINT)) {\n const wsolAta = getAssociatedTokenAddress(WRAPPED_SOL_MINT, user, false);\n closeWsolAtaIxns.push(createCloseAccountInstruction(wsolAta, user, user, [], TOKEN_PROGRAM_ID));\n }\n closeAtasIxns.push(...closeWsolAtaIxns);\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n\n // TODO: marius test this with shorting leverage and with leverage looping\n // This is here so that we have enough wsol to repay in case the kAB swapped to sol after estimates is not enough\n const fillWsolAtaIxns: TransactionInstruction[] = [];\n if (debtTokenMint.equals(WRAPPED_SOL_MINT)) {\n const halfSolBalance = (await connection.getBalance(user)) / LAMPORTS_PER_SOL / 2;\n const balanceToWrap = halfSolBalance < 0.1 ? halfSolBalance : 0.1;\n fillWsolAtaIxns.push(\n ...getDepositWsolIxns(user, debtTokenAta, toLamports(balanceToWrap, solTokenReserve!.stats.decimals).ceil())\n );\n }\n\n // 2. Prepare the flash borrow and flash repay amounts and ixns\n // We borrow exactly how much we need to repay\n // and repay that + flash amount fee\n\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length + fillWsolAtaIxns.length,\n walletPublicKey: user,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: toLamports(repayAmount, debtReserve!.stats.decimals),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 6. Repay borrowed tokens and Withdraw tokens from reserve that will be swapped to repay flash loan\n const repayAndWithdrawAction = await KaminoAction.buildRepayAndWithdrawTxns(\n kaminoMarket,\n isClosingPosition ? U64_MAX : toLamports(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n debtTokenMint,\n isClosingPosition ? U64_MAX : toLamports(depositTokenWithdrawAmount, collReserve!.stats.decimals).ceil().toString(),\n collTokenMint,\n user,\n currentSlot,\n userObligation ? userObligation : obligationType,\n 0,\n false,\n false,\n false, // to be checked and created in a setup tx in the UI (won't be the case for withdraw anyway as this would be created in deposit)\n isClosingPosition,\n referrer,\n { includeScopeRefresh: true, scopeFeed: scopeFeed! }\n );\n\n const klendIxns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n klendIxns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n let withdrawSwapper: SwapIxnsProvider;\n\n if (collIsKtoken) {\n if (kamino === undefined) {\n throw Error('Ktoken use as collateral for leverage without Kamino instance');\n }\n withdrawSwapper = await getKtokenToTokenSwapper(kaminoMarket, kamino, user, swapper);\n } else {\n withdrawSwapper = swapper;\n }\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: toLamports(collTokenSwapIn, collReserve!.stats.decimals).ceil().toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n const [swapIxns, lookupTablesAddresses] = await withdrawSwapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct\n );\n\n // TODO MARIUS: remove first instruction that is setBudget ixn\n\n if (collIsKtoken) {\n if (strategy?.strategy.strategyLookupTable) {\n lookupTablesAddresses.push(strategy?.strategy.strategyLookupTable!);\n } else {\n console.log('Strategy lookup table not found');\n }\n }\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n // Send ixns and lookup tables\n return {\n ixns,\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts: totalKlendAccounts,\n };\n};\n\nexport const getAdjustLeverageSwapInputs = (props: {\n deposited: Decimal;\n borrowed: Decimal;\n priceCollToDebt: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: number;\n targetLeverage: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n}): {\n swapInputs: SwapInputs;\n} => {\n const {\n deposited,\n borrowed,\n priceCollToDebt,\n priceDebtToColl,\n slippagePct,\n targetLeverage,\n kaminoMarket,\n debtTokenMint,\n collTokenMint,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const { adjustDepositPosition, adjustBorrowPosition } = calcAdjustAmounts({\n currentDepositPosition: deposited,\n currentBorrowPosition: borrowed,\n targetLeverage: targetLeverage,\n priceCollToDebt: priceCollToDebt,\n flashLoanFee: new Decimal(flashLoanFee),\n });\n const isDeposit = adjustDepositPosition.gte(0) && adjustBorrowPosition.gte(0);\n\n if (isDeposit) {\n const borrowAmount = adjustDepositPosition\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(new Decimal(1 + slippagePct / 100))\n .div(priceDebtToColl);\n\n return {\n swapInputs: {\n inputAmountLamports: toLamports(borrowAmount, debtReserve!.state.liquidity.mintDecimals.toNumber())\n .ceil()\n .toNumber(),\n inputMint: debtTokenMint,\n outputMint: collTokenMint,\n },\n };\n } else {\n const withdrawAmountWithSlippageAndFlashLoanFee = Decimal.abs(adjustDepositPosition)\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(1 + slippagePct / 100);\n\n return {\n swapInputs: {\n inputAmountLamports: toLamports(\n withdrawAmountWithSlippageAndFlashLoanFee,\n collReserve!.state.liquidity.mintDecimals.toNumber()\n )\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n };\n }\n};\n\nexport const getAdjustLeverageIxns = async (props: {\n connection: Connection;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n user: PublicKey;\n kaminoMarket: KaminoMarket;\n priceDebtToColl: Decimal;\n priceCollToDebt: Decimal;\n targetLeverage: Decimal;\n slippagePct: number;\n depositedLamports: Decimal;\n borrowedLamports: Decimal;\n collTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n swapper: SwapIxnsProvider;\n referrer: PublicKey;\n isKtoken: IsKtokenProvider;\n priceAinB: PriceAinBProvider;\n kamino: Kamino | undefined;\n obligationTypeTagOverride: ObligationTypeTag;\n obligation: KaminoObligation | null;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n scopeFeed: string | undefined;\n}) => {\n const {\n connection,\n budgetAndPriorityFeeIxns,\n user,\n kaminoMarket,\n priceDebtToColl,\n priceCollToDebt,\n targetLeverage,\n slippagePct,\n depositedLamports,\n borrowedLamports,\n collTokenMint,\n debtTokenMint,\n swapper,\n referrer,\n isKtoken,\n priceAinB,\n kamino,\n obligationTypeTagOverride,\n obligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n } = props;\n\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n\n const deposited = fromLamports(depositedLamports, collReserve!.stats.decimals);\n const borrowed = fromLamports(borrowedLamports, debtReserve!.stats.decimals);\n const userObligation = obligation\n ? obligation\n : (await kaminoMarket.getUserObligationsByTag(obligationTypeTagOverride, user)).filter(\n (obligation: KaminoObligation) =>\n obligation.getBorrowByMint(debtReserve!.getLiquidityMint()) !== undefined &&\n obligation.getDepositByMint(collReserve!.getLiquidityMint()) !== undefined\n )[0];\n const currentLeverage = userObligation!.refreshedStats.leverage;\n const isDepositViaLeverage = targetLeverage.gte(new Decimal(currentLeverage));\n\n let flashLoanFee = new Decimal(0);\n if (isDepositViaLeverage) {\n flashLoanFee = collReserve!.getFlashLoanFee() || new Decimal(0);\n } else {\n flashLoanFee = debtReserve!.getFlashLoanFee() || new Decimal(0);\n }\n\n const { adjustDepositPosition, adjustBorrowPosition } = calcAdjustAmounts({\n currentDepositPosition: deposited,\n currentBorrowPosition: borrowed,\n targetLeverage: targetLeverage,\n priceCollToDebt: priceCollToDebt,\n flashLoanFee: new Decimal(flashLoanFee),\n });\n\n let ixns: TransactionInstruction[] = [];\n let lookupTablesAddresses: PublicKey[] = [];\n let swapInputs: SwapInputs;\n let totalKlendAccounts: number = 0;\n\n const isDeposit = adjustDepositPosition.gte(0) && adjustBorrowPosition.gte(0);\n if (isDepositViaLeverage !== isDeposit) {\n throw new Error('Invalid target leverage');\n }\n\n // leverage increased so we need to deposit and borrow more\n if (isDeposit) {\n console.log('Increasing leaverage');\n // TODO: marius why are we not using both adjustDepositPosition & adjustBorrowPosition\n const res = await getIncreaseLeverageIxns({\n connection,\n budgetAndPriorityFeeIxns,\n user,\n kaminoMarket,\n depositAmount: adjustDepositPosition,\n collTokenMint,\n debtTokenMint,\n slippagePct,\n priceDebtToColl,\n priceCollToDebt,\n swapper,\n referrer,\n isKtoken,\n priceAinB,\n kamino,\n obligationTypeTagOverride,\n obligation: userObligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n });\n ixns = res.ixns;\n lookupTablesAddresses = res.lookupTablesAddresses;\n swapInputs = res.swapInputs;\n totalKlendAccounts = res.totalKlendAccounts;\n } else {\n console.log('Decreasing leverage');\n const res = await getDecreaseLeverageIxns({\n connection,\n budgetAndPriorityFeeIxns,\n user,\n kaminoMarket,\n withdrawAmount: Decimal.abs(adjustDepositPosition),\n repayAmount: Decimal.abs(adjustBorrowPosition),\n collTokenMint,\n debtTokenMint,\n slippagePct,\n swapper,\n referrer,\n isKtoken,\n kamino,\n obligationTypeTagOverride,\n obligation: userObligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n });\n ixns = res.ixns;\n lookupTablesAddresses = res.lookupTablesAddresses;\n swapInputs = res.swapInputs;\n totalKlendAccounts = res.totalKlendAccounts;\n }\n\n return {\n ixns,\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n };\n};\n\n/**\n * Deposit and borrow tokens if leverage increased\n */\nexport const getIncreaseLeverageIxns = async (props: {\n connection: Connection;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n user: PublicKey;\n kaminoMarket: KaminoMarket;\n depositAmount: Decimal;\n collTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n slippagePct: number;\n priceDebtToColl: Decimal;\n priceCollToDebt: Decimal;\n swapper: SwapIxnsProvider;\n referrer: PublicKey;\n isKtoken: IsKtokenProvider;\n priceAinB: PriceAinBProvider;\n kamino: Kamino | undefined;\n obligationTypeTagOverride: ObligationTypeTag;\n obligation: KaminoObligation | null;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n scopeFeed: string | undefined;\n}) => {\n const {\n connection,\n budgetAndPriorityFeeIxns,\n user,\n kaminoMarket,\n depositAmount,\n collTokenMint,\n debtTokenMint,\n slippagePct,\n priceDebtToColl,\n priceCollToDebt,\n swapper,\n referrer,\n isKtoken,\n priceAinB,\n kamino,\n obligationTypeTagOverride = 1,\n obligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const collIsKtoken = await isKtoken(collTokenMint);\n\n const flashLoanFee = collReserve!.getFlashLoanFee() || new Decimal(0);\n\n if (!priceDebtToColl || !priceCollToDebt) {\n throw new Error('Price is not loaded. Please, reload the page and try again');\n }\n\n // TODO: why are we recalculating here again\n const strategy = collIsKtoken ? await kamino?.getStrategyByKTokenMint(collTokenMint) : undefined;\n\n // 1. Create atas & budget txns\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n let mintsToCreateAtas: PublicKey[] = [];\n let mintsToCreateAtasTokenPrograms: PublicKey[] = [];\n if (collIsKtoken) {\n const secondTokenAta = strategy!.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBMint\n : strategy!.strategy.tokenAMint;\n const secondTokenTokenProgarm = strategy?.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBTokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenBTokenProgram\n : strategy!.strategy.tokenATokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenATokenProgram;\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint(), secondTokenAta];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n secondTokenTokenProgarm,\n ];\n } else {\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n ];\n }\n\n const {\n atas: [collTokenAta, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n // 2. Create borrow flash loan instruction\n\n // used if coll is Ktoken and we borrow debt token instead\n const amountToFashBorrowDebt = depositAmount\n .div(priceDebtToColl)\n .mul(new Decimal(1 + slippagePct / 100))\n .toDecimalPlaces(debtReserve!.stats.decimals, Decimal.ROUND_UP);\n // .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber());\n\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length, // TODO: how about user metadata ixns\n walletPublicKey: user,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: !collIsKtoken ? collReserve! : debtReserve!,\n amountLamports: toLamports(\n !collIsKtoken ? depositAmount : amountToFashBorrowDebt,\n !collIsKtoken ? collReserve!.stats.decimals : debtReserve!.stats.decimals\n ),\n destinationAta: !collIsKtoken ? collTokenAta : debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 3. Deposit initial tokens + borrowed tokens into reserve\n let obligationType: ObligationType;\n if (obligationTypeTagOverride === ObligationTypeTag.Multiply) {\n // multiply\n obligationType = new MultiplyObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else if (obligationTypeTagOverride === ObligationTypeTag.Leverage) {\n // leverage\n obligationType = new LeverageObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else {\n throw Error('Obligation type tag not supported for leverage, please use 1 - multiply or 3 - leverage');\n }\n\n const depositAction = await KaminoAction.buildDepositTxns(\n kaminoMarket,\n toLamports(depositAmount, collReserve!.stats.decimals).floor().toString(),\n collTokenMint,\n user,\n obligation ? obligation : obligationType,\n 0,\n false,\n false,\n false, // to be checked and create in a setup tx in the UI (won't be the case for adjust anyway as this would be created in deposit)\n referrer,\n currentSlot,\n { includeScopeRefresh: true, scopeFeed: scopeFeed! }\n );\n\n // 4. Get swap estimations to understand how much we need to borrow from borrow reserve\n const borrowAmount = depositAmount\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(new Decimal(1 + slippagePct / 100))\n .div(priceDebtToColl);\n\n const _collTokenExpectedSwapOut = depositAmount.mul(new Decimal(1).plus(flashLoanFee));\n\n // 5. Borrow tokens in borrow token reserve that will be swapped to repay flash loan\n const borrowAction = await KaminoAction.buildBorrowTxns(\n kaminoMarket,\n toLamports(borrowAmount, debtReserve!.stats.decimals).ceil().toString(),\n debtTokenMint,\n user,\n obligation ? obligation : obligationType,\n 0,\n false,\n false,\n false, // to be checked and create in a setup tx in the UI (won't be the case for adjust anyway as this would be created in deposit)\n referrer,\n currentSlot,\n { includeScopeRefresh: true, scopeFeed: scopeFeed! }\n );\n\n const klendIxns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...depositAction.setupIxs,\n ...depositAction.lendingIxs,\n ...depositAction.cleanupIxs,\n ...borrowAction.setupIxs,\n ...borrowAction.lendingIxs,\n ...borrowAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n klendIxns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n let depositSwapper: SwapIxnsProvider;\n let expectedDebtTokenAtaBalance = new Decimal(0);\n\n if (collIsKtoken) {\n if (kamino === undefined) {\n throw Error('Ktoken use as collateral for leverage without Kamino instance');\n }\n depositSwapper = await getTokenToKtokenSwapper(connection, kaminoMarket, kamino, user, swapper, priceAinB, false);\n\n expectedDebtTokenAtaBalance = await getExpectedTokenBalanceAfterBorrow(\n connection,\n debtTokenMint,\n user,\n toLamports(!collIsKtoken ? borrowAmount : amountToFashBorrowDebt, debtReserve!.stats.decimals).floor(),\n debtReserve!.state.liquidity.mintDecimals.toNumber()\n );\n } else {\n depositSwapper = swapper;\n }\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: toLamports(!collIsKtoken ? borrowAmount : amountToFashBorrowDebt, debtReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: debtTokenMint,\n outputMint: collTokenMint,\n };\n\n const [swapIxns, lookupTablesAddresses] = await depositSwapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct,\n expectedDebtTokenAtaBalance\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n const ixns = !collIsKtoken\n ? [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...depositAction.setupIxs,\n ...depositAction.lendingIxs,\n ...depositAction.cleanupIxs,\n ...borrowAction.setupIxs,\n ...borrowAction.lendingIxs,\n ...borrowAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ]\n : [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...swapInstructions,\n ...depositAction.setupIxs,\n ...depositAction.lendingIxs,\n ...depositAction.cleanupIxs,\n ...borrowAction.setupIxs,\n ...borrowAction.lendingIxs,\n ...borrowAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n ixns.forEach((ixn, i) => {\n console.log(`ixn ${i + 1}: ${ixn.programId.toString()}`);\n });\n\n // Create and send transaction\n if (collIsKtoken) {\n if (strategy?.strategy.strategyLookupTable) {\n lookupTablesAddresses.push(strategy?.strategy.strategyLookupTable!);\n } else {\n console.log('Strategy lookup table not found');\n }\n }\n return {\n ixns,\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n };\n};\n\n/**\n * Withdraw and repay tokens if leverage decreased\n */\nexport const getDecreaseLeverageIxns = async (props: {\n connection: Connection;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n user: PublicKey;\n kaminoMarket: KaminoMarket;\n withdrawAmount: Decimal;\n repayAmount: Decimal;\n collTokenMint: PublicKey;\n debtTokenMint: PublicKey;\n slippagePct: number;\n swapper: SwapIxnsProvider;\n referrer: PublicKey;\n isKtoken: IsKtokenProvider;\n kamino: Kamino | undefined;\n obligationTypeTagOverride: ObligationTypeTag;\n obligation: KaminoObligation | null;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n scopeFeed: string | undefined;\n}) => {\n const {\n connection,\n budgetAndPriorityFeeIxns,\n user,\n kaminoMarket,\n withdrawAmount,\n repayAmount,\n collTokenMint,\n debtTokenMint,\n slippagePct,\n swapper,\n referrer,\n isKtoken,\n kamino,\n obligationTypeTagOverride = 1,\n obligation,\n currentSlot,\n getTotalKlendAccountsOnly,\n scopeFeed,\n } = props;\n\n console.log(\n 'getDecreaseLeverageIxns',\n toJson({ withdrawAmount, repayAmount, collTokenMint, debtTokenMint, slippagePct })\n );\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const collIsKtoken = await isKtoken(collTokenMint);\n\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const strategy = collIsKtoken ? await kamino?.getStrategyByKTokenMint(collTokenMint) : undefined;\n\n // 1. Create atas & budget txns\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n let mintsToCreateAtas: PublicKey[] = [];\n let mintsToCreateAtasTokenPrograms: PublicKey[] = [];\n if (collIsKtoken) {\n const secondTokenAta = strategy!.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBMint\n : strategy!.strategy.tokenAMint;\n const secondTokenTokenProgarm = strategy?.strategy.tokenAMint.equals(debtTokenMint)\n ? strategy!.strategy.tokenBTokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenBTokenProgram\n : strategy!.strategy.tokenATokenProgram.equals(PublicKey.default)\n ? TOKEN_PROGRAM_ID\n : strategy!.strategy.tokenATokenProgram;\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint(), secondTokenAta];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n secondTokenTokenProgarm,\n ];\n } else {\n mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n mintsToCreateAtasTokenPrograms = [\n collReserve!.getLiquidityTokenProgram(),\n debtReserve!.getLiquidityTokenProgram(),\n TOKEN_PROGRAM_ID,\n ];\n }\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n // TODO: Mihai/Marius check if we can improve this logic and not convert any SOL\n // This is here so that we have enough wsol to repay in case the kAB swapped to sol after estimates is not enough\n const closeWsolAtaIxns: TransactionInstruction[] = [];\n if (debtTokenMint.equals(WRAPPED_SOL_MINT)) {\n const wsolAta = await getAssociatedTokenAddress(WRAPPED_SOL_MINT, user, false);\n closeWsolAtaIxns.push(createCloseAccountInstruction(wsolAta, user, user, [], TOKEN_PROGRAM_ID));\n }\n closeAtasIxns.push(...closeWsolAtaIxns);\n\n const fillWsolAtaIxns: TransactionInstruction[] = [];\n if (debtTokenMint.equals(WRAPPED_SOL_MINT)) {\n const halfSolBalance = (await connection.getBalance(user)) / LAMPORTS_PER_SOL / 2;\n const balanceToWrap = halfSolBalance < 0.1 ? halfSolBalance : 0.1;\n fillWsolAtaIxns.push(\n ...getDepositWsolIxns(user, debtTokenAta, toLamports(balanceToWrap, debtReserve!.stats.decimals).ceil())\n );\n }\n\n // 3. Flash borrow & repay amount to repay (debt)\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length + fillWsolAtaIxns.length,\n walletPublicKey: user,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: toLamports(repayAmount, debtReserve!.stats.decimals),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 4. Actually do the repay of the flash borrowed amounts\n let obligationType: ObligationType;\n if (obligationTypeTagOverride === ObligationTypeTag.Multiply) {\n // multiply\n obligationType = new MultiplyObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else if (obligationTypeTagOverride === ObligationTypeTag.Leverage) {\n // leverage\n obligationType = new LeverageObligation(collTokenMint, debtTokenMint, kaminoMarket.programId);\n } else {\n throw Error('Obligation type tag not supported for leverage, please use 1 - multiply or 3 - leverage');\n }\n\n const scopeRefresh = scopeFeed ? { includeScopeRefresh: true, scopeFeed: scopeFeed } : undefined;\n\n const repayAction = await KaminoAction.buildRepayTxns(\n kaminoMarket,\n toLamports(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n debtTokenMint,\n user,\n obligation ? obligation : obligationType,\n currentSlot,\n undefined,\n 0,\n false,\n false,\n false, // to be checked and create in a setup tx in the UI (won't be the case for adjust anyway as this would be created in deposit)\n referrer,\n scopeRefresh\n );\n\n // 6. Withdraw collateral (a little bit more to be able to pay for the slippage on swap)\n const withdrawAmountWithSlippageAndFlashLoanFee = withdrawAmount\n .mul(new Decimal(1).plus(flashLoanFee))\n .mul(1 + slippagePct / 100);\n\n const withdrawAction = await KaminoAction.buildWithdrawTxns(\n kaminoMarket,\n toLamports(withdrawAmountWithSlippageAndFlashLoanFee, collReserve!.stats.decimals).ceil().toString(),\n collTokenMint,\n user,\n obligation ? obligation : obligationType,\n 0,\n false,\n false,\n false, // to be checked and create in a setup tx in the UI (won't be the case for adjust anyway as this would be created in deposit)\n referrer,\n currentSlot,\n { includeScopeRefresh: true, scopeFeed: scopeFeed! }\n );\n\n const klendIxns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...repayAction.setupIxs,\n ...repayAction.lendingIxs,\n ...repayAction.cleanupIxs,\n ...withdrawAction.setupIxs,\n ...withdrawAction.lendingIxs,\n ...withdrawAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n klendIxns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n let withdrawSwapper: SwapIxnsProvider;\n\n if (collIsKtoken) {\n if (kamino === undefined) {\n throw Error('Ktoken use as collateral for leverage without Kamino instance');\n }\n withdrawSwapper = await getKtokenToTokenSwapper(kaminoMarket, kamino, user, swapper);\n } else {\n withdrawSwapper = swapper;\n }\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: toLamports(withdrawAmountWithSlippageAndFlashLoanFee, collReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n // 5. Get swap ixns\n const [swapIxns, lookupTablesAddresses] = await withdrawSwapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...fillWsolAtaIxns,\n ...[flashBorrowIxn],\n ...repayAction.setupIxs,\n ...repayAction.lendingIxs,\n ...repayAction.cleanupIxs,\n ...withdrawAction.setupIxs,\n ...withdrawAction.lendingIxs,\n ...withdrawAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n ixns.forEach((ixn, i) => {\n console.log(`ixn ${i + 1}: ${ixn.programId.toString()}`);\n });\n\n if (collIsKtoken) {\n if (strategy?.strategy.strategyLookupTable) {\n lookupTablesAddresses.push(strategy?.strategy.strategyLookupTable!);\n } else {\n console.log('Strategy lookup table not found');\n }\n }\n // Create and send transaction\n return {\n ixns,\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { Kamino, StrategyWithAddress } from '@hubbleprotocol/kamino-sdk';
1
+ import { Kamino, StrategyWithAddress } from '@kamino-finance/kliquidity-sdk';
2
2
  import { KaminoMarket, KaminoReserve } from '../classes';
3
3
  import { Connection, PublicKey, TransactionInstruction } from '@solana/web3.js';
4
4
  import { PriceAinBProvider, SwapIxnsProvider } from './operations';
@@ -13,9 +13,9 @@ export interface DepositAmountsForSwap {
13
13
  tokenBToSwapAmount: Decimal;
14
14
  }
15
15
  export declare const getTokenToKtokenSwapper: (connection: Connection, kaminoMarket: KaminoMarket, kamino: Kamino, depositor: PublicKey, swapper: SwapIxnsProvider, priceAinB: PriceAinBProvider, includeAtaIxns?: boolean) => Promise<SwapIxnsProvider>;
16
- export declare function getKtokenDepositIxs(connection: Connection, kamino: Kamino, depositor: PublicKey, depositTokenMint: PublicKey, ktokenMint: PublicKey, amountToDeposit: Decimal, slippageBps: Decimal, amountExpectedDepositAtaBalance: Decimal, swapper: SwapIxnsProvider, priceAinB: PriceAinBProvider, includeAtaIxns?: boolean): Promise<import("@hubbleprotocol/kamino-sdk").InstructionsWithLookupTables>;
16
+ export declare function getKtokenDepositIxs(connection: Connection, kamino: Kamino, depositor: PublicKey, depositTokenMint: PublicKey, ktokenMint: PublicKey, amountToDeposit: Decimal, slippageBps: Decimal, amountExpectedDepositAtaBalance: Decimal, swapper: SwapIxnsProvider, priceAinB: PriceAinBProvider, includeAtaIxns?: boolean): Promise<import("@kamino-finance/kliquidity-sdk").InstructionsWithLookupTables>;
17
17
  export declare const getKtokenToTokenSwapper: (kaminoMarket: KaminoMarket, kamino: Kamino, depositor: PublicKey, swapper: SwapIxnsProvider) => Promise<SwapIxnsProvider>;
18
- export declare function getKtokenWithdrawIxs(kamino: Kamino, withdrawer: PublicKey, kaminoStrategy: StrategyWithAddress, amountToWithdraw: Decimal): Promise<import("@hubbleprotocol/kamino-sdk").WithdrawShares>;
18
+ export declare function getKtokenWithdrawIxs(kamino: Kamino, withdrawer: PublicKey, kaminoStrategy: StrategyWithAddress, amountToWithdraw: Decimal): Promise<import("@kamino-finance/kliquidity-sdk").WithdrawShares>;
19
19
  export declare function getKtokenWithdrawEstimatesAndPrice(kamino: Kamino, kaminoStrategy: StrategyWithAddress, amountToWithdraw: Decimal): Promise<Decimal[]>;
20
20
  export declare function swapProviderToKaminoSwapProvider(swapper: SwapIxnsProvider): KaminoSwapperIxBuilder;
21
21
  export declare const getExpectedTokenBalanceAfterBorrow: (connection: Connection, mint: PublicKey, owner: PublicKey, amountToBorrowLamports: Decimal, amountToBorrowmintDecimals: number) => Promise<Decimal>;