{"version":3,"sources":["../../../src/gfx/cpmm/kamino.ts"],"sourcesContent":["import KaminoIDL from \"../idl/kamino_lending.json\";\nimport { AccountMeta, Connection, Keypair, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { Idl, Program, AnchorProvider, Wallet } from \"@project-serum/anchor\";\n\nconst KAMINO_PROGRAM_ID = \"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD\";\nconst KAMINO_MARKET_ID = \"7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF\";\n\n/**\n * Lending market authority seed\n */\nexport const LENDING_MARKET_AUTH_SEED = \"lma\";\n\nexport function getLendingMarketAuthority(lendingMarket: PublicKey, programId: PublicKey) {\n  return PublicKey.findProgramAddressSync([Buffer.from(LENDING_MARKET_AUTH_SEED), lendingMarket.toBuffer()], programId);\n}\n\nexport function getGammaPoolDestinationCollateral(\n  poolAddress: PublicKey,\n  tokenMint: PublicKey,\n  gammaId: PublicKey,\n): PublicKey {\n  return PublicKey.findProgramAddressSync(\n    [Buffer.from(\"pool_kamino_deposits\"), poolAddress.toBuffer(), tokenMint.toBuffer()],\n    gammaId,\n  )[0];\n}\n\nexport interface KaminoReserve {\n  address: PublicKey;\n  state: KaminoReserveAccount;\n}\ninterface KaminoReserveAccount {\n  version: BN;\n  lendingMarket: PublicKey;\n  farmCollateral: PublicKey;\n  farmDebt: PublicKey;\n  liquidity: ReserveLiquidity;\n  collateral: ReserveCollateral;\n  /** incomplete field definitions */\n}\n\ninterface ReserveLiquidity {\n  mintPubkey: PublicKey;\n  supplyVault: PublicKey;\n  feeVault: PublicKey;\n  /** incomplete field definitions */\n}\n\ninterface ReserveCollateral {\n  mintPubkey: PublicKey;\n  supplyVault: PublicKey;\n  /** incomplete field definitions */\n}\n\nexport async function getReservesForMarket(\n  connection: Connection,\n  marketAddress?: PublicKey,\n  kaminoProgram?: PublicKey,\n): Promise<Map<string, KaminoReserve>> {\n  const provider = new AnchorProvider(connection, new Wallet(Keypair.generate()), {\n    commitment: \"confirmed\",\n  });\n  const programId = kaminoProgram ?? KAMINO_PROGRAM_ID;\n  const kamino = new Program(KaminoIDL as unknown as Idl, programId, provider);\n  const market = marketAddress ?? new PublicKey(KAMINO_MARKET_ID);\n  const reserves = await kamino.account.reserve.all([\n    {\n      memcmp: {\n        offset: 32,\n        bytes: market.toBase58(),\n      },\n    },\n  ]);\n\n  const reservesByLiquidity = new Map<string, KaminoReserve>();\n\n  reserves.forEach((reserve) => {\n    const reserveLiquidity = reserve.account.liquidity as unknown as ReserveLiquidity;\n    reservesByLiquidity.set(reserveLiquidity.mintPubkey.toBase58(), {\n      address: reserve.publicKey,\n      state: {\n        version: reserve.account.version as unknown as BN,\n        lendingMarket: reserve.account.lendingMarket as unknown as PublicKey,\n        farmCollateral: reserve.account.farmCollateral as unknown as PublicKey,\n        farmDebt: reserve.account.farmDebt as unknown as PublicKey,\n        liquidity: reserveLiquidity,\n        collateral: reserve.account.collateral as unknown as ReserveCollateral,\n      },\n    });\n  });\n  return reservesByLiquidity;\n}\n\nexport function getReserveAccountsForWithdraw(\n  pool: PublicKey,\n  reserveA: KaminoReserve | undefined,\n  reserveB: KaminoReserve | undefined,\n  maxSharedTokenA: BN,\n  maxSharedTokenB: BN,\n  gammaProgram: PublicKey,\n  kaminoProgram?: PublicKey,\n): AccountMeta[] {\n  const programIds = new Array<PublicKey>(6).fill(gammaProgram).map((pubkey) => {\n    return { pubkey, isWritable: false, isSigner: false };\n  });\n  const accounts = new Array();\n\n  if (maxSharedTokenA.gtn(0) && reserveA) {\n    accounts.push(...getAccountsForReserve(pool, reserveA, gammaProgram, kaminoProgram));\n  } else {\n    accounts.push(...programIds);\n  }\n\n  if (maxSharedTokenB.gtn(0) && reserveB) {\n    accounts.push(...getAccountsForReserve(pool, reserveB, gammaProgram, kaminoProgram));\n  } else {\n    accounts.push(...programIds);\n  }\n\n  return accounts;\n}\n\nfunction getAccountsForReserve(\n  pool: PublicKey,\n  reserve: KaminoReserve,\n  gammaProgram: PublicKey,\n  kaminoProgram?: PublicKey,\n): AccountMeta[] {\n  const lendingMarketAuthority = getLendingMarketAuthority(\n    reserve.state.lendingMarket,\n    kaminoProgram ?? new PublicKey(KAMINO_PROGRAM_ID),\n  )[0];\n  const gammaDestination = getGammaPoolDestinationCollateral(pool, reserve.state.liquidity.mintPubkey, gammaProgram);\n  return [\n    { pubkey: reserve.address, isWritable: true, isSigner: true },\n    { pubkey: reserve.state.lendingMarket, isWritable: true, isSigner: true },\n    { pubkey: lendingMarketAuthority, isWritable: false, isSigner: true },\n    { pubkey: reserve.state.liquidity.supplyVault, isWritable: true, isSigner: true },\n    { pubkey: reserve.state.collateral.mintPubkey, isWritable: true, isSigner: true },\n    { pubkey: gammaDestination, isWritable: false, isSigner: true },\n  ];\n}\n"],"mappings":"81zCACA,OAAkC,WAAAA,EAAS,aAAAC,MAAiB,kBAE5D,OAAc,WAAAC,EAAS,kBAAAC,EAAgB,UAAAC,MAAc,wBAErD,IAAMC,EAAoB,8CACpBC,EAAmB,+CAKZC,EAA2B,MAEjC,SAASC,EAA0BC,EAA0BC,EAAsB,CACxF,OAAOT,EAAU,uBAAuB,CAAC,OAAO,KAAKM,CAAwB,EAAGE,EAAc,SAAS,CAAC,EAAGC,CAAS,CACtH,CAEO,SAASC,EACdC,EACAC,EACAC,EACW,CACX,OAAOb,EAAU,uBACf,CAAC,OAAO,KAAK,sBAAsB,EAAGW,EAAY,SAAS,EAAGC,EAAU,SAAS,CAAC,EAClFC,CACF,EAAE,EACJ,CA6BA,eAAsBC,EACpBC,EACAC,EACAC,EACqC,CACrC,IAAMC,EAAW,IAAIhB,EAAea,EAAY,IAAIZ,EAAOJ,EAAQ,SAAS,CAAC,EAAG,CAC9E,WAAY,WACd,CAAC,EACKU,EAAYQ,GAAA,KAAAA,EAAiBb,EAC7Be,EAAS,IAAIlB,EAAQmB,EAA6BX,EAAWS,CAAQ,EACrEG,EAASL,GAAA,KAAAA,EAAiB,IAAIhB,EAAUK,CAAgB,EACxDiB,EAAW,MAAMH,EAAO,QAAQ,QAAQ,IAAI,CAChD,CACE,OAAQ,CACN,OAAQ,GACR,MAAOE,EAAO,SAAS,CACzB,CACF,CACF,CAAC,EAEKE,EAAsB,IAAI,IAEhC,OAAAD,EAAS,QAASE,GAAY,CAC5B,IAAMC,EAAmBD,EAAQ,QAAQ,UACzCD,EAAoB,IAAIE,EAAiB,WAAW,SAAS,EAAG,CAC9D,QAASD,EAAQ,UACjB,MAAO,CACL,QAASA,EAAQ,QAAQ,QACzB,cAAeA,EAAQ,QAAQ,cAC/B,eAAgBA,EAAQ,QAAQ,eAChC,SAAUA,EAAQ,QAAQ,SAC1B,UAAWC,EACX,WAAYD,EAAQ,QAAQ,UAC9B,CACF,CAAC,CACH,CAAC,EACMD,CACT,CAEO,SAASG,EACdC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAf,EACe,CACf,IAAMgB,EAAa,IAAI,MAAiB,CAAC,EAAE,KAAKD,CAAY,EAAE,IAAKE,IAC1D,CAAE,OAAAA,EAAQ,WAAY,GAAO,SAAU,EAAM,EACrD,EACKC,EAAW,IAAI,MAErB,OAAIL,EAAgB,IAAI,CAAC,GAAKF,EAC5BO,EAAS,KAAK,GAAGC,EAAsBT,EAAMC,EAAUI,EAAcf,CAAa,CAAC,EAEnFkB,EAAS,KAAK,GAAGF,CAAU,EAGzBF,EAAgB,IAAI,CAAC,GAAKF,EAC5BM,EAAS,KAAK,GAAGC,EAAsBT,EAAME,EAAUG,EAAcf,CAAa,CAAC,EAEnFkB,EAAS,KAAK,GAAGF,CAAU,EAGtBE,CACT,CAEA,SAASC,EACPT,EACAH,EACAQ,EACAf,EACe,CACf,IAAMoB,EAAyB9B,EAC7BiB,EAAQ,MAAM,cACdP,GAAA,KAAAA,EAAiB,IAAIjB,EAAUI,CAAiB,CAClD,EAAE,GACIkC,EAAmB5B,EAAkCiB,EAAMH,EAAQ,MAAM,UAAU,WAAYQ,CAAY,EACjH,MAAO,CACL,CAAE,OAAQR,EAAQ,QAAS,WAAY,GAAM,SAAU,EAAK,EAC5D,CAAE,OAAQA,EAAQ,MAAM,cAAe,WAAY,GAAM,SAAU,EAAK,EACxE,CAAE,OAAQa,EAAwB,WAAY,GAAO,SAAU,EAAK,EACpE,CAAE,OAAQb,EAAQ,MAAM,UAAU,YAAa,WAAY,GAAM,SAAU,EAAK,EAChF,CAAE,OAAQA,EAAQ,MAAM,WAAW,WAAY,WAAY,GAAM,SAAU,EAAK,EAChF,CAAE,OAAQc,EAAkB,WAAY,GAAO,SAAU,EAAK,CAChE,CACF","names":["Keypair","PublicKey","Program","AnchorProvider","Wallet","KAMINO_PROGRAM_ID","KAMINO_MARKET_ID","LENDING_MARKET_AUTH_SEED","getLendingMarketAuthority","lendingMarket","programId","getGammaPoolDestinationCollateral","poolAddress","tokenMint","gammaId","getReservesForMarket","connection","marketAddress","kaminoProgram","provider","kamino","kamino_lending_default","market","reserves","reservesByLiquidity","reserve","reserveLiquidity","getReserveAccountsForWithdraw","pool","reserveA","reserveB","maxSharedTokenA","maxSharedTokenB","gammaProgram","programIds","pubkey","accounts","getAccountsForReserve","lendingMarketAuthority","gammaDestination"]}