@kamino-finance/klend-sdk 3.2.5 → 3.2.7

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":"repay_with_collateral_operations.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_operations.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iDAAqD;AACrD,wCAAmG;AACnG,0CAA6F;AAC7F,oCAMkB;AAClB,6CAAoE;AACpE,4DAAiC;AAE1B,MAAM,kBAAkB,GAAG,CAAC,KAKlC,EAIC,EAAE;IACF,mDAAmD;IACnD,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IAE7E,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAElG,OAAO;QACL,WAAW;QACX,YAAY;QACZ,mBAAmB;KACpB,CAAC;AACJ,CAAC,CAAC;AAxBW,QAAA,kBAAkB,sBAwB7B;AASK,MAAM,0BAA0B,GAAG,CAAC,KAS1C,EAGC,EAAE;IACF,MAAM,EACJ,WAAW,EACX,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,GACZ,GAAG,KAAK,CAAC;IACV,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,GAAG,IAAI,EAAE,KAAI,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;IAEhF,MAAM,oBAAoB,GAAG,UAAW;SACrC,8BAA8B,CAC7B,YAAY,EACZ,WAAY,EACZ,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,WAAC,OAAA,MAAA,MAAM,CAAC,aAAa,0CAAE,MAAM,CAAC,WAAY,CAAC,OAAO,CAAC,CAAA,EAAA,CAAE,EAC/F,WAAW,CACZ;SACA,eAAe,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAG,EAAE,oBAAO,CAAC,UAAU,CAAC,CAAC;IAC9F,0HAA0H;IAC1H,MAAM,qBAAqB,GAAG,WAAW;SACtC,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,OAAO,CAAC,CAAC,CAAC;SACnD,eAAe,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAG,EAAE,oBAAO,CAAC,UAAU,CAAC,CAAC;IAE9F,MAAM,UAAU,GAAG,IAAA,0BAAkB,EAAC;QACpC,WAAW,EAAE,qBAAqB;QAClC,eAAe;QACf,WAAW;QACX,eAAe,EAAE,eAAe;KACjC,CAAC,CAAC;IAEH,OAAO;QACL,UAAU,EAAE;YACV,mBAAmB,EAAE,IAAA,iCAAuB,EAAC,UAAU,CAAC,YAAY,EAAE,WAAY,CAAC,KAAK,CAAC,QAAQ,CAAC;iBAC/F,IAAI,EAAE;iBACN,QAAQ,EAAE;YACb,SAAS,EAAE,aAAa;YACxB,UAAU,EAAE,aAAa;SAC1B;QACD,aAAa,EAAE;YACb,WAAW;YACX,eAAe;YACf,WAAW;YACX,WAAW;SACZ;KACF,CAAC;AACJ,CAAC,CAAC;AA9DW,QAAA,0BAA0B,8BA8DrC;AAEK,MAAM,oBAAoB,GAAG,CAAO,KAe1C,EAME,EAAE;IACH,MAAM,EACJ,YAAY,EACZ,wBAAwB,EACxB,MAAM,EACN,aAAa,EACb,aAAa,EACb,KAAK,EACL,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,QAAQ,EACR,OAAO,EACP,WAAW,EACX,yBAAyB,GAC1B,GAAG,KAAK,CAAC;IAEV,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAChD,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACjE,2EAA2E;IAC3E,MAAM,eAAe,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,EAAE,KAAI,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;IAEzE,MAAM,oBAAoB,GAAG,UAAW;SACrC,8BAA8B,CAC7B,YAAY,EACZ,WAAY,EACZ,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,WAAC,OAAA,MAAA,MAAM,CAAC,aAAa,0CAAE,MAAM,CAAC,WAAY,CAAC,OAAO,CAAC,CAAA,EAAA,CAAE,EAC/F,WAAW,CACZ;SACA,eAAe,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAG,EAAE,oBAAO,CAAC,UAAU,CAAC,CAAC;IAC9F,0HAA0H;IAC1H,MAAM,WAAW,GAAG,MAAM;SACvB,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,OAAO,CAAC,CAAC,CAAC;SACnD,eAAe,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAG,EAAE,oBAAO,CAAC,UAAU,CAAC,CAAC;IAE9F,MAAM,KAAK,GAAG,IAAA,0BAAkB,EAAC;QAC/B,WAAW;QACX,eAAe;QACf,WAAW;QACX,eAAe;KAChB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAA,iBAAM,EAAC,KAAK,CAAC,CAAC,CAAC;IAExC,kCAAkC;IAClC,MAAM,iBAAiB,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,WAAY,CAAC,aAAa,EAAE,CAAC,CAAC;IACvF,MAAM,8BAA8B,GAAG;QACrC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,wBAAwB,EAAG;QACxC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,wBAAwB,EAAG;QACxC,4BAAgB;KACjB,CAAC;IAEF,MAAM,UAAU,GAAG,wBAAwB,IAAI,IAAA,0CAAkC,EAAC,OAAO,CAAC,CAAC;IAC3F,MAAM,EACJ,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,EACtB,cAAc,EACd,aAAa,GACd,GAAG,MAAM,IAAA,sCAA8B,EAAC,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,8BAA8B,CAAC,CAAC;IAE/G,0DAA0D;IAC1D,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,IAAA,mCAAwB,EAAC;QACjE,cAAc,EAAE,UAAU,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM;QACzD,eAAe,EAAE,KAAK;QACtB,sBAAsB,EAAE,YAAY,CAAC,yBAAyB,EAAE;QAChE,oBAAoB,EAAE,YAAY,CAAC,UAAU,EAAE;QAC/C,OAAO,EAAE,WAAY;QACrB,cAAc,EAAE,IAAA,iCAAuB,EAAC,WAAW,EAAE,WAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE;QACzF,cAAc,EAAE,YAAY;QAC5B,eAAe,EAAE,YAAY,CAAC,SAAS;QACvC,kBAAkB,EAAE,YAAY,CAAC,SAAS;QAC1C,SAAS,EAAE,YAAY,CAAC,SAAS;KAClC,CAAC,CAAC;IAEH,+FAA+F;IAC/F,MAAM,sBAAsB,GAAG,MAAM,sBAAY,CAAC,yBAAyB,CACzE,YAAY,EACZ,iBAAiB,CAAC,CAAC,CAAC,eAAO,CAAC,CAAC,CAAC,IAAA,iCAAuB,EAAC,WAAW,EAAE,WAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAClH,IAAI,mBAAS,CAAC,aAAa,CAAC,EAC5B,iBAAiB;QACf,CAAC,CAAC,eAAO;QACT,CAAC,CAAC,IAAA,iCAAuB,EAAC,KAAK,CAAC,YAAY,EAAE,WAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAC9F,IAAI,mBAAS,CAAC,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,UAAU,EACV,CAAC,EACD,KAAK,EACL,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,QAAQ,CACT,CAAC;IAEF,MAAM,IAAI,GAAG;QACX,GAAG,UAAU;QACb,GAAG,cAAc;QACjB,GAAG,CAAC,cAAc,CAAC;QACnB,GAAG,sBAAsB,CAAC,QAAQ;QAClC,GAAG,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzC,GAAG,sBAAsB,CAAC,YAAY;QACtC,GAAG,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzC,GAAG,sBAAsB,CAAC,UAAU;QACpC,GAAG,CAAC,aAAa,CAAC;QAClB,GAAG,aAAa;KACjB,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,oBAAY,CAAY,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvB,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;IAE3D,4CAA4C;IAC5C,IAAI,yBAAyB,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,EAAE;YACR,qBAAqB,EAAE,EAAE;YACzB,UAAU,EAAE,EAAE,mBAAmB,EAAE,CAAC,EAAE,SAAS,EAAE,mBAAS,CAAC,OAAO,EAAE,UAAU,EAAE,mBAAS,CAAC,OAAO,EAAE;YACnG,kBAAkB,EAAE,kBAAkB;YACtC,aAAa,EAAE;gBACb,WAAW;gBACX,eAAe;gBACf,WAAW;gBACX,WAAW;aACZ;SACF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CACT,qBAAqB,EACrB,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,EAC7B,UAAU,EACV,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EACpC,MAAM,CACP,CAAC;IAEF,MAAM,UAAU,GAAe;QAC7B,mBAAmB,EAAE,IAAA,iCAAuB,EAAC,KAAK,CAAC,YAAY,EAAE,WAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;QAC/G,SAAS,EAAE,aAAa;QACxB,UAAU,EAAE,aAAa;KAC1B,CAAC;IAEF,iDAAiD;IACjD,MAAM,CAAC,QAAQ,EAAE,qBAAqB,CAAC,GAAG,MAAM,OAAO,CACrD,UAAU,CAAC,mBAAmB,EAC9B,UAAU,CAAC,SAAS,EACpB,UAAU,CAAC,UAAU,EACrB,WAAW,CAAC,QAAQ,EAAE,CACvB,CAAC;IAEF,MAAM,gBAAgB,GAAG,IAAA,8BAAsB,EAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAE9D,OAAO;QACL,IAAI,EAAE;YACJ,GAAG,UAAU;YACb,GAAG,cAAc;YACjB,GAAG,CAAC,cAAc,CAAC;YACnB,GAAG,sBAAsB,CAAC,QAAQ;YAClC,GAAG,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACzC,GAAG,sBAAsB,CAAC,YAAY;YACtC,GAAG,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACzC,GAAG,sBAAsB,CAAC,UAAU;YACpC,GAAG,gBAAgB;YACnB,GAAG,CAAC,aAAa,CAAC;YAClB,GAAG,aAAa;SACjB;QACD,qBAAqB;QACrB,UAAU;QACV,kBAAkB;QAClB,aAAa,EAAE;YACb,WAAW;YACX,eAAe;YACf,WAAW;YACX,WAAW;SACZ;KACF,CAAC;AACJ,CAAC,CAAA,CAAC;AAzMW,QAAA,oBAAoB,wBAyM/B","sourcesContent":["import { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { KaminoAction, KaminoMarket, KaminoObligation, numberToLamportsDecimal } from '../classes';\nimport { SwapInputs, SwapIxnsProvider, getFlashLoanInstructions, toJson } from '../leverage';\nimport {\n PublicKeySet,\n U64_MAX,\n getAtasWithCreateIxnsIfMissing,\n getComputeBudgetAndPriorityFeeIxns,\n removeBudgetAndAtaIxns,\n} from '../utils';\nimport { PublicKey, TransactionInstruction } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\n\nexport const repayWithCollCalcs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashLoanFeePct: Decimal;\n}): {\n repayAmount: Decimal;\n collToSwapIn: Decimal;\n swapDebtExpectedOut: Decimal;\n} => {\n // Initialize local variables from the props object\n const { repayAmount, priceDebtToColl, slippagePct, flashLoanFeePct } = props;\n\n const slippage = slippagePct.div('100');\n const flashLoanFee = flashLoanFeePct.div('100');\n\n const swapDebtExpectedOut = repayAmount.mul(new Decimal(1.0).add(flashLoanFee));\n const collToSwapIn = swapDebtExpectedOut.mul(new Decimal(1.0).add(slippage)).mul(priceDebtToColl);\n\n return {\n repayAmount,\n collToSwapIn,\n swapDebtExpectedOut,\n };\n};\n\nexport type InitialInputs = {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n currentSlot: number;\n};\n\nexport const getRepayWithCollSwapInputs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n obligation: KaminoObligation;\n currentSlot: number;\n}): {\n swapInputs: SwapInputs;\n initialInputs: InitialInputs;\n} => {\n const {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n kaminoMarket,\n debtTokenMint,\n collTokenMint,\n obligation,\n currentSlot,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee().ceil() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n kaminoMarket,\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\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 repaying enough\n const repayAmountIrAdjusted = repayAmount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const repayCalcs = repayWithCollCalcs({\n repayAmount: repayAmountIrAdjusted,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct: flashLoanFeePct,\n });\n\n return {\n swapInputs: {\n inputAmountLamports: numberToLamportsDecimal(repayCalcs.collToSwapIn, collReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n};\n\nexport const getRepayWithCollIxns = async (props: {\n kaminoMarket: KaminoMarket;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n amount: Decimal;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n owner: PublicKey;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n isClosingPosition: boolean;\n obligation: KaminoObligation;\n referrer: PublicKey;\n swapper: SwapIxnsProvider;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n initialInputs: InitialInputs;\n}> => {\n const {\n kaminoMarket,\n budgetAndPriorityFeeIxns,\n amount,\n debtTokenMint,\n collTokenMint,\n owner,\n priceDebtToColl,\n slippagePct,\n isClosingPosition,\n obligation,\n referrer,\n swapper,\n currentSlot,\n getTotalKlendAccountsOnly,\n } = props;\n\n const connection = kaminoMarket.getConnection();\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n // const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n kaminoMarket,\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\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 = amount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const calcs = repayWithCollCalcs({\n repayAmount,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct,\n });\n\n console.log('Ops Calcs', toJson(calcs));\n\n // // 1. Create atas & budget txns\n const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n const mintsToCreateAtasTokenPrograms = [\n collReserve?.getLiquidityTokenProgram()!,\n debtReserve?.getLiquidityTokenProgram()!,\n TOKEN_PROGRAM_ID,\n ];\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, owner, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n // 1. Flash borrow & repay the debt to repay amount needed\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length,\n walletPublicKey: owner,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor(),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 2. Repay using the flash borrowed funds & withdraw collateral to swap and pay the flash loan\n const repayAndWithdrawAction = await KaminoAction.buildRepayAndWithdrawTxns(\n kaminoMarket,\n isClosingPosition ? U64_MAX : numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n new PublicKey(debtTokenMint),\n isClosingPosition\n ? U64_MAX\n : numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toString(),\n new PublicKey(collTokenMint),\n owner,\n currentSlot,\n obligation,\n 0,\n false,\n undefined,\n undefined,\n isClosingPosition,\n referrer\n );\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\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 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 initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n }\n\n console.log(\n 'Expected to swap in',\n calcs.collToSwapIn.toString(),\n 'coll for',\n calcs.swapDebtExpectedOut.toString(),\n 'debt'\n );\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n // 3. Swap collateral to debt to repay flash loan\n const [swapIxns, lookupTablesAddresses] = await swapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct.toNumber()\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\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 lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n};\n"]}
1
+ {"version":3,"file":"repay_with_collateral_operations.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { KaminoAction, KaminoMarket, KaminoObligation, numberToLamportsDecimal } from '../classes';\nimport { SwapInputs, SwapIxnsProvider, getFlashLoanInstructions, toJson } from '../leverage';\nimport {\n PublicKeySet,\n U64_MAX,\n getAtasWithCreateIxnsIfMissing,\n getComputeBudgetAndPriorityFeeIxns,\n removeBudgetAndAtaIxns,\n} from '../utils';\nimport { PublicKey, TransactionInstruction } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\n\nexport const repayWithCollCalcs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashLoanFeePct: Decimal;\n}): {\n repayAmount: Decimal;\n collToSwapIn: Decimal;\n swapDebtExpectedOut: Decimal;\n} => {\n // Initialize local variables from the props object\n const { repayAmount, priceDebtToColl, slippagePct, flashLoanFeePct } = props;\n\n const slippage = slippagePct.div('100');\n const flashLoanFee = flashLoanFeePct.div('100');\n\n const swapDebtExpectedOut = repayAmount.mul(new Decimal(1.0).add(flashLoanFee));\n const collToSwapIn = swapDebtExpectedOut.mul(new Decimal(1.0).add(slippage)).mul(priceDebtToColl);\n\n return {\n repayAmount,\n collToSwapIn,\n swapDebtExpectedOut,\n };\n};\n\nexport type InitialInputs = {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n currentSlot: number;\n};\n\nexport const getRepayWithCollSwapInputs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n obligation: KaminoObligation;\n currentSlot: number;\n}): {\n swapInputs: SwapInputs;\n initialInputs: InitialInputs;\n} => {\n const {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n kaminoMarket,\n debtTokenMint,\n collTokenMint,\n obligation,\n currentSlot,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee().ceil() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n kaminoMarket,\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\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 repaying enough\n const repayAmountIrAdjusted = repayAmount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const repayCalcs = repayWithCollCalcs({\n repayAmount: repayAmountIrAdjusted,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct: flashLoanFeePct,\n });\n\n return {\n swapInputs: {\n inputAmountLamports: numberToLamportsDecimal(repayCalcs.collToSwapIn, collReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n};\n\nexport const getRepayWithCollIxns = async (props: {\n kaminoMarket: KaminoMarket;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n amount: Decimal;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n owner: PublicKey;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n isClosingPosition: boolean;\n obligation: KaminoObligation;\n referrer: PublicKey;\n swapper: SwapIxnsProvider;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n initialInputs: InitialInputs;\n}> => {\n const {\n kaminoMarket,\n budgetAndPriorityFeeIxns,\n amount,\n debtTokenMint,\n collTokenMint,\n owner,\n priceDebtToColl,\n slippagePct,\n isClosingPosition,\n obligation,\n referrer,\n swapper,\n currentSlot,\n getTotalKlendAccountsOnly,\n } = props;\n\n const connection = kaminoMarket.getConnection();\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n // const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n kaminoMarket,\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\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 = amount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const calcs = repayWithCollCalcs({\n repayAmount,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct,\n });\n\n console.log('Ops Calcs', toJson(calcs));\n\n // // 1. Create atas & budget txns\n const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n const mintsToCreateAtasTokenPrograms = [\n collReserve?.getLiquidityTokenProgram()!,\n debtReserve?.getLiquidityTokenProgram()!,\n TOKEN_PROGRAM_ID,\n ];\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, owner, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n // 1. Flash borrow & repay the debt to repay amount needed\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length,\n walletPublicKey: owner,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor(),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n const requestElevationGroup = obligation.state.elevationGroup !== 0 ? true : false;\n\n // 2. Repay using the flash borrowed funds & withdraw collateral to swap and pay the flash loan\n const repayAndWithdrawAction = await KaminoAction.buildRepayAndWithdrawTxns(\n kaminoMarket,\n isClosingPosition ? U64_MAX : numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n new PublicKey(debtTokenMint),\n isClosingPosition\n ? U64_MAX\n : numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toString(),\n new PublicKey(collTokenMint),\n owner,\n currentSlot,\n obligation,\n 0,\n false,\n requestElevationGroup,\n undefined,\n isClosingPosition,\n referrer\n );\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\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 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 initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n }\n\n console.log(\n 'Expected to swap in',\n calcs.collToSwapIn.toString(),\n 'coll for',\n calcs.swapDebtExpectedOut.toString(),\n 'debt'\n );\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n // 3. Swap collateral to debt to repay flash loan\n const [swapIxns, lookupTablesAddresses] = await swapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct.toNumber()\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\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 lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kamino-finance/klend-sdk",
3
- "version": "3.2.5",
3
+ "version": "3.2.7",
4
4
  "description": "Typescript SDK for interacting with the Kamino Lending (klend) protocol",
5
5
  "repository": {
6
6
  "type": "git",