{"version":3,"sources":["../src/vendor/spl/constants.ts","../src/instructions.ts"],"names":["PublicKey","BN"],"mappings":"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","file":"instructions.cjs","sourcesContent":["import { PublicKey } from \"@solana/web3.js\";\n\nexport const MEMO_PROGRAM_ID: PublicKey = new PublicKey(\n  \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\"\n);\n\n/** Address of the SPL Associated Token Account program */\nexport const ASSOCIATED_TOKEN_PROGRAM_ID: PublicKey = new PublicKey(\n  \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n);\n\nexport const TOKEN_PROGRAM_ID = new PublicKey(\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\");\nexport const TOKEN_2022_PROGRAM_ID = new PublicKey(\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\");\n","import { AccountMeta, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport type { BankConfigCompactRaw, BankConfigOptRaw } from \"./services\";\nimport { MarginfiProgram, WrappedI80F48 } from \"./types\";\nimport { TOKEN_PROGRAM_ID } from \"./vendor/spl\";\n\nasync function makeInitMarginfiAccountIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    marginfiGroup: PublicKey;\n    marginfiAccount: PublicKey;\n    authority: PublicKey;\n    feePayer: PublicKey;\n  }\n) {\n  return mfProgram.methods.marginfiAccountInitialize().accounts(accounts).instruction();\n}\n\nasync function makeInitMarginfiAccountPdaIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    marginfiGroup: PublicKey;\n    marginfiAccount: PublicKey;\n    authority: PublicKey;\n    feePayer: PublicKey;\n  },\n  args: {\n    accountIndex: number;\n    thirdPartyId?: number;\n  }\n) {\n  return mfProgram.methods\n    .marginfiAccountInitializePda(args.accountIndex, args.thirdPartyId ?? null)\n    .accountsPartial({\n      marginfiGroup: accounts.marginfiGroup,\n      marginfiAccount: accounts.marginfiAccount,\n      authority: accounts.authority,\n      feePayer: accounts.feePayer,\n    })\n    .instruction();\n}\n\nasync function makeJuplendDepositIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    marginfiAccount: PublicKey;\n    bank: PublicKey;\n    signerTokenAccount: PublicKey;\n\n    lendingAdmin: PublicKey;\n    supplyTokenReservesLiquidity: PublicKey;\n    lendingSupplyPositionOnLiquidity: PublicKey;\n    rateModel: PublicKey;\n    vault: PublicKey;\n    liquidity: PublicKey;\n    liquidityProgram: PublicKey;\n    rewardsRateModel: PublicKey;\n    tokenProgram: PublicKey;\n\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n    liquidityVault?: PublicKey;\n    fTokenMint?: PublicKey;\n    integrationAcc1?: PublicKey;\n    integrationAcc2?: PublicKey;\n    mint?: PublicKey;\n  },\n  args: {\n    amount: BN;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const {\n    marginfiAccount,\n    bank,\n    signerTokenAccount,\n    lendingAdmin,\n    supplyTokenReservesLiquidity,\n    lendingSupplyPositionOnLiquidity,\n    rateModel,\n    vault,\n    liquidity,\n    liquidityProgram,\n    rewardsRateModel,\n    tokenProgram,\n    ...optionalAccounts\n  } = accounts;\n\n  return mfProgram.methods\n    .juplendDeposit(args.amount)\n    .accounts(accounts)\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nasync function makeJuplendWithdrawIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    marginfiAccount: PublicKey;\n    bank: PublicKey;\n    destinationTokenAccount: PublicKey;\n    lendingAdmin: PublicKey;\n    supplyTokenReservesLiquidity: PublicKey;\n    lendingSupplyPositionOnLiquidity: PublicKey;\n    rateModel: PublicKey;\n    vault: PublicKey;\n    claimAccount: PublicKey;\n    liquidity: PublicKey;\n    liquidityProgram: PublicKey;\n    rewardsRateModel: PublicKey;\n    tokenProgram: PublicKey;\n\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n    mint?: PublicKey;\n    integrationAcc1?: PublicKey;\n    fTokenMint?: PublicKey;\n    integrationAcc2?: PublicKey;\n    integrationAcc3?: PublicKey;\n  },\n  args: {\n    amount: BN;\n    withdrawAll?: boolean | null;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const {\n    marginfiAccount,\n    bank,\n    destinationTokenAccount,\n    lendingAdmin,\n    supplyTokenReservesLiquidity,\n    lendingSupplyPositionOnLiquidity,\n    rateModel,\n    vault,\n    claimAccount,\n    liquidity,\n    liquidityProgram,\n    rewardsRateModel,\n    tokenProgram,\n    ...optionalAccounts\n  } = accounts;\n\n  return mfProgram.methods\n    .juplendWithdraw(args.amount, args.withdrawAll ?? null)\n    .accounts(accounts)\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nasync function makeKaminoDepositIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    marginfiAccount: PublicKey;\n    bank: PublicKey;\n    signerTokenAccount: PublicKey;\n    lendingMarket: PublicKey;\n\n    lendingMarketAuthority: PublicKey;\n    reserveLiquiditySupply: PublicKey;\n    reserveCollateralMint: PublicKey;\n    reserveDestinationDepositCollateral: PublicKey;\n    liquidityTokenProgram: PublicKey;\n\n    obligationFarmUserState: PublicKey | null;\n    reserveFarmState: PublicKey | null;\n\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n    liquidityVault?: PublicKey;\n    integrationAcc1?: PublicKey;\n    integrationAcc2?: PublicKey;\n    mint?: PublicKey;\n  },\n  args: {\n    amount: BN;\n    /** 0.1.9-only: refresh the reserve in-instruction. Ignored by the 1.8 program. */\n    refreshReserve?: boolean;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const {\n    marginfiAccount,\n    bank,\n    signerTokenAccount,\n    lendingMarket,\n    lendingMarketAuthority,\n    reserveLiquiditySupply,\n    reserveCollateralMint,\n    reserveDestinationDepositCollateral,\n    liquidityTokenProgram,\n    obligationFarmUserState,\n    reserveFarmState,\n    ...optionalAccounts\n  } = accounts;\n\n  return mfProgram.methods\n    .kaminoDeposit(args.amount, args.refreshReserve ?? null)\n    .accounts(accounts)\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\n/**\n * Create a Drift deposit instruction\n * Deposits tokens into a Drift spot market through a marginfi bank account\n *\n * @param mfProgram - The marginfi program instance\n * @param accounts - Required and optional accounts for the instruction\n * @param accounts.marginfiAccount - The marginfi account depositing funds\n * @param accounts.bank - The marginfi bank account for the asset\n * @param accounts.signerTokenAccount - The signer's token account (source of funds)\n * @param accounts.driftState - The Drift program state account\n * @param accounts.driftSpotMarketVault - The Drift spot market vault receiving tokens\n * @param accounts.tokenProgram - The SPL token program\n * @param accounts.driftOracle - (Optional) Oracle account for the asset\n * @param args - Instruction arguments\n * @param args.amount - Amount to deposit in native token decimals\n */\nasync function makeDriftDepositIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    marginfiAccount: PublicKey;\n    bank: PublicKey;\n    signerTokenAccount: PublicKey;\n    driftState: PublicKey;\n    driftSpotMarketVault: PublicKey;\n    tokenProgram: PublicKey;\n    driftOracle: PublicKey | null;\n\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n    liquidityVault?: PublicKey;\n    integrationAcc2?: PublicKey;\n    integrationAcc3?: PublicKey;\n    integrationAcc1?: PublicKey;\n    mint?: PublicKey;\n    driftProgram?: PublicKey;\n    systemProgram?: PublicKey;\n  },\n  args: {\n    amount: BN;\n  }\n) {\n  const {\n    marginfiAccount,\n    bank,\n    signerTokenAccount,\n    driftState,\n    driftSpotMarketVault,\n    tokenProgram,\n    driftOracle,\n    ...optionalAccounts\n  } = accounts;\n\n  return mfProgram.methods\n    .driftDeposit(args.amount)\n    .accounts({\n      marginfiAccount,\n      bank,\n      signerTokenAccount,\n      driftState,\n      driftSpotMarketVault,\n      tokenProgram,\n      driftOracle,\n    })\n    .accountsPartial(optionalAccounts)\n    .instruction();\n}\n\nasync function makeDepositIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    marginfiAccount: PublicKey;\n    signerTokenAccount: PublicKey;\n    bank: PublicKey;\n    tokenProgram: PublicKey;\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n    liquidityVault?: PublicKey;\n  },\n  args: {\n    amount: BN;\n    depositUpToLimit?: boolean;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const { marginfiAccount, signerTokenAccount, bank, tokenProgram, ...optionalAccounts } = accounts;\n\n  return mfProgram.methods\n    .lendingAccountDeposit(args.amount, args.depositUpToLimit ?? null)\n    .accounts({\n      marginfiAccount,\n      signerTokenAccount,\n      bank,\n      tokenProgram,\n    })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nasync function makeRepayIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    marginfiAccount: PublicKey;\n    signerTokenAccount: PublicKey;\n    bank: PublicKey;\n    tokenProgram: PublicKey;\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n    liquidityVault?: PublicKey;\n  },\n  args: {\n    amount: BN;\n    repayAll?: boolean;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const { marginfiAccount, signerTokenAccount, bank, tokenProgram, ...optionalAccounts } = accounts;\n\n  return mfProgram.methods\n    .lendingAccountRepay(args.amount, args.repayAll ?? null)\n    .accounts({\n      marginfiAccount,\n      signerTokenAccount,\n      bank,\n      tokenProgram,\n    })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nasync function makeDriftWithdrawIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    marginfiAccount: PublicKey;\n    bank: PublicKey;\n    destinationTokenAccount: PublicKey;\n\n    driftState: PublicKey;\n    driftSigner: PublicKey;\n    driftSpotMarketVault: PublicKey;\n    tokenProgram: PublicKey;\n\n    driftOracle: PublicKey | null;\n    driftRewardOracle: PublicKey | null;\n    driftRewardSpotMarket: PublicKey | null;\n    driftRewardMint: PublicKey | null;\n    driftRewardOracle2: PublicKey | null;\n    driftRewardSpotMarket2: PublicKey | null;\n    driftRewardMint2: PublicKey | null;\n\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n  },\n  args: {\n    amount: BN;\n    withdrawAll: boolean;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const {\n    marginfiAccount,\n    bank,\n    destinationTokenAccount,\n    driftState,\n    driftSigner,\n    driftSpotMarketVault,\n    tokenProgram,\n    driftOracle,\n    driftRewardOracle,\n    driftRewardSpotMarket,\n    driftRewardMint,\n    driftRewardOracle2,\n    driftRewardSpotMarket2,\n    driftRewardMint2,\n    ...optionalAccounts\n  } = accounts;\n\n  return mfProgram.methods\n    .driftWithdraw(args.amount, args.withdrawAll)\n    .accounts({\n      marginfiAccount,\n      bank,\n      destinationTokenAccount,\n      driftState,\n      driftSigner,\n      driftSpotMarketVault,\n      tokenProgram,\n      driftOracle,\n      driftRewardOracle,\n      driftRewardSpotMarket,\n      driftRewardMint,\n      driftRewardOracle2,\n      driftRewardSpotMarket2,\n      driftRewardMint2,\n    })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nasync function makeKaminoWithdrawIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    marginfiAccount: PublicKey;\n    bank: PublicKey;\n    destinationTokenAccount: PublicKey;\n    lendingMarket: PublicKey;\n    mint: PublicKey;\n\n    lendingMarketAuthority: PublicKey;\n    reserveLiquiditySupply: PublicKey;\n    reserveCollateralMint: PublicKey;\n    reserveSourceCollateral: PublicKey;\n    liquidityTokenProgram: PublicKey;\n\n    obligationFarmUserState: PublicKey | null;\n    reserveFarmState: PublicKey | null;\n\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n  },\n  args: {\n    amount: BN;\n    isFinalWithdrawal: boolean;\n    /**\n     * 0.1.9-only: refresh the reserve via batch refresh (flags bit 1). Do NOT set while the\n     * 1.8 program is deployed — its `Option<bool>` decoder rejects flag bytes above 1.\n     */\n    refreshReserve?: boolean;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const {\n    marginfiAccount,\n    bank,\n    destinationTokenAccount,\n    lendingMarket,\n    lendingMarketAuthority,\n    reserveLiquiditySupply,\n    reserveCollateralMint,\n    reserveSourceCollateral,\n    liquidityTokenProgram,\n    obligationFarmUserState,\n    reserveFarmState,\n    ...optionalAccounts\n  } = accounts;\n\n  // flags bit 0 = withdraw all, bit 1 = batch refresh. `isFinalWithdrawal ? 1 : null` is\n  // byte-identical to the pre-0.1.9 `withdrawAll: Option<bool>` encoding, so it lands on\n  // both the 1.8 and 1.9 programs.\n  const flags = (args.isFinalWithdrawal ? 1 : 0) | (args.refreshReserve ? 2 : 0);\n\n  return mfProgram.methods\n    .kaminoWithdraw(args.amount, flags === 0 ? null : flags)\n    .accounts({\n      marginfiAccount,\n      bank,\n      destinationTokenAccount,\n      lendingMarket,\n      lendingMarketAuthority,\n      reserveLiquiditySupply,\n      reserveCollateralMint,\n      reserveSourceCollateral,\n      liquidityTokenProgram,\n      obligationFarmUserState,\n      reserveFarmState,\n    })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nasync function makeWithdrawIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    marginfiAccount: PublicKey;\n    bank: PublicKey;\n    destinationTokenAccount: PublicKey;\n    tokenProgram: PublicKey;\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n  },\n  args: {\n    amount: BN;\n    withdrawAll?: boolean;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const { marginfiAccount, bank, destinationTokenAccount, tokenProgram, ...optionalAccounts } =\n    accounts;\n\n  return mfProgram.methods\n    .lendingAccountWithdraw(args.amount, args.withdrawAll ?? null)\n    .accounts({\n      marginfiAccount,\n      destinationTokenAccount,\n      bank,\n      tokenProgram,\n    })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nasync function makeBorrowIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    marginfiAccount: PublicKey;\n    bank: PublicKey;\n    destinationTokenAccount: PublicKey;\n    tokenProgram: PublicKey;\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n  },\n  args: {\n    amount: BN;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const { marginfiAccount, bank, destinationTokenAccount, tokenProgram, ...optionalAccounts } =\n    accounts;\n\n  return mfProgram.methods\n    .lendingAccountBorrow(args.amount)\n    .accounts({\n      marginfiAccount,\n      destinationTokenAccount,\n      bank,\n      tokenProgram,\n    })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nfunction makeLendingAccountLiquidateIx(\n  mfiProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    assetBank: PublicKey;\n    liabBank: PublicKey;\n    liquidatorMarginfiAccount: PublicKey;\n    liquidateeMarginfiAccount: PublicKey;\n    tokenProgram: PublicKey;\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n  },\n  args: {\n    assetAmount: BN;\n    liquidateeAccounts: number;\n    liquidatorAccounts: number;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const {\n    assetBank,\n    liabBank,\n    liquidatorMarginfiAccount,\n    liquidateeMarginfiAccount,\n    tokenProgram,\n    ...optionalAccounts\n  } = accounts;\n\n  return mfiProgram.methods\n    .lendingAccountLiquidate(args.assetAmount, args.liquidateeAccounts, args.liquidatorAccounts)\n    .accounts({\n      assetBank,\n      liabBank,\n      liquidatorMarginfiAccount,\n      liquidateeMarginfiAccount,\n      tokenProgram,\n    })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nfunction makePoolConfigureBankIx(\n  mfiProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    bank: PublicKey;\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    admin?: PublicKey;\n  },\n  args: {\n    bankConfigOpt: BankConfigOptRaw;\n  }\n) {\n  const { bank, ...optionalAccounts } = accounts;\n\n  return mfiProgram.methods\n    .lendingPoolConfigureBank(args.bankConfigOpt)\n    .accounts({\n      bank,\n    })\n    .accountsPartial(optionalAccounts)\n    .instruction();\n}\n\nfunction makeBeginFlashLoanIx(\n  mfiProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    marginfiAccount: PublicKey;\n    // Optional accounts - to override inference\n    authority?: PublicKey;\n    ixsSysvar?: PublicKey;\n  },\n  args: {\n    endIndex: BN;\n  }\n) {\n  const { marginfiAccount, ...optionalAccounts } = accounts;\n\n  return mfiProgram.methods\n    .lendingAccountStartFlashloan(args.endIndex)\n    .accounts({\n      marginfiAccount,\n    })\n    .accountsPartial(optionalAccounts)\n    .instruction();\n}\n\nasync function makeEndFlashLoanIx(\n  mfiProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    marginfiAccount: PublicKey;\n    // Optional accounts - to override inference\n    authority?: PublicKey;\n    // Pass explicitly when the account isn't on-chain yet (fresh-account flash loans)\n    group?: PublicKey;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const { marginfiAccount, ...optionalAccounts } = accounts;\n\n  return mfiProgram.methods\n    .lendingAccountEndFlashloan()\n    .accounts({\n      marginfiAccount,\n    })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nasync function makeAccountTransferToNewAccountIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    oldMarginfiAccount: PublicKey;\n    newMarginfiAccount: PublicKey;\n    newAuthority: PublicKey;\n    globalFeeWallet: PublicKey;\n    feePayer: PublicKey;\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    authority?: PublicKey;\n  }\n) {\n  const {\n    oldMarginfiAccount,\n    newMarginfiAccount,\n    newAuthority,\n    globalFeeWallet,\n    feePayer,\n    ...optionalAccounts\n  } = accounts;\n\n  return mfProgram.methods\n    .transferToNewAccount()\n    .accounts({\n      oldMarginfiAccount,\n      newMarginfiAccount,\n      newAuthority,\n      globalFeeWallet,\n      feePayer,\n    })\n    .accountsPartial(optionalAccounts)\n    .instruction();\n}\n\nasync function makeGroupInitIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    marginfiGroup: PublicKey;\n    admin: PublicKey;\n  }\n) {\n  return mfProgram.methods\n    .marginfiGroupInitialize()\n    .accounts({\n      marginfiGroup: accounts.marginfiGroup,\n      admin: accounts.admin,\n    })\n    .instruction();\n}\n\n/**\n * Configure the oracle for a bank\n * @param mfProgram The marginfi program\n * @param accounts The accounts required for this instruction\n * @param args The oracle setup index and feed id\n * @param remainingAccounts The remaining accounts required for this instruction, should include the feed oracle key\n */\nasync function makeLendingPoolConfigureBankOracleIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    bank: PublicKey;\n    // Optional accounts - to override inference\n    group?: PublicKey;\n    admin?: PublicKey;\n  },\n  args: {\n    /**\n     * The oracle setup index, see {@link serializeOracleSetupToIndex}\n     */\n    setup: number;\n    /**\n     * The oracle feed id\n     */\n    feedId: PublicKey;\n  },\n  /**\n   * The remaining accounts required for this instruction, should include the feed oracle key (non writable & signable)\n   */\n  remainingAccounts: AccountMeta[] = []\n) {\n  const { bank, ...optionalAccounts } = accounts;\n\n  return mfProgram.methods\n    .lendingPoolConfigureBankOracle(args.setup, args.feedId)\n    .accounts({\n      bank,\n    })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\n/**\n * Configure a bank to use an entry in a Scope OraclePrices account.\n * @param mfProgram The marginfi program\n * @param accounts The group, admin, and bank accounts required by the instruction\n * @param args The Scope OraclePrices account and its entry index\n */\nasync function makeLendingPoolConfigureBankOracleScopeIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    bank: PublicKey;\n    group?: PublicKey;\n    admin?: PublicKey;\n  },\n  args: {\n    oracle: PublicKey;\n    entryIndex: number;\n  }\n) {\n  const { bank, ...optionalAccounts } = accounts;\n\n  return mfProgram.methods\n    .lendingPoolConfigureBankOracleScope(args.oracle, args.entryIndex)\n    .accounts({ bank })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts([{ pubkey: args.oracle, isSigner: false, isWritable: false }])\n    .instruction();\n}\n\n/** Configure a fixed or Exponent PT oracle through the 0.1.11 set-oracle-price instruction. */\nasync function makeLendingPoolSetOraclePriceIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    bank: PublicKey;\n    group?: PublicKey;\n    admin?: PublicKey;\n  },\n  args: {\n    price: WrappedI80F48;\n    setup: number;\n  },\n  remainingAccounts: AccountMeta[] = []\n) {\n  const { bank, ...optionalAccounts } = accounts;\n\n  return mfProgram.methods\n    .lendingPoolSetOraclePrice(args.price, args.setup)\n    .accounts({ bank })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\n/**\n * Creates an instruction to add a permissionless staked bank to a lending pool.\n * @param mfProgram - The marginfi program instance\n * @param accounts - The accounts required for this instruction\n * @param remainingAccounts - The remaining accounts required for this instruction, including pythOracle, solPool and bankMint\n * @param args - Optional arguments for this instruction\n */\nasync function makePoolAddPermissionlessStakedBankIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    stakedSettings: PublicKey;\n    feePayer: PublicKey;\n    bankMint: PublicKey;\n    solPool: PublicKey;\n    /** The SVSP on-ramp account, derived from the stake pool (0.1.9+ program only) */\n    poolOnramp: PublicKey;\n    stakePool: PublicKey;\n    /** The validator vote account backing the stake pool (0.1.9+ program only) */\n    validatorVoteAccount: PublicKey;\n    // Optional accounts - to override inference\n    marginfiGroup?: PublicKey;\n    /**\n     * The token program to use for this instruction, defaults to the SPL token program\n     */\n    tokenProgram?: PublicKey;\n  },\n  /**\n   * The remaining accounts required for this instruction. Should include:\n   * - pythOracle: The pyth oracle key (non writable & non signer)\n   * - solPool: The sol pool key (non writable & non signer)\n   * - bankMint: The bank mint key (non writable & non signer)\n   */\n  remainingAccounts: AccountMeta[] = [],\n  args: {\n    /**\n     * The seed to use for the bank account. Defaults to 0 (new BN(0)).\n     * If the seed is not specified, the seed is set to 0, and the bank account\n     * will be created at the address {@link findPoolAddress} with the default\n     * bump.\n     */\n    seed?: BN;\n  }\n) {\n  const {\n    stakedSettings,\n    feePayer,\n    bankMint,\n    solPool,\n    poolOnramp,\n    stakePool,\n    validatorVoteAccount,\n    tokenProgram = TOKEN_PROGRAM_ID,\n    ...optionalAccounts\n  } = accounts;\n\n  return mfProgram.methods\n    .lendingPoolAddBankPermissionless(args.seed ?? new BN(0))\n    .accounts({\n      stakedSettings,\n      feePayer,\n      bankMint,\n      solPool,\n      poolOnramp,\n      stakePool,\n      validatorVoteAccount,\n      tokenProgram,\n    })\n    .accountsPartial(optionalAccounts)\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nasync function makePoolAddBankIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    marginfiGroup: PublicKey;\n    feePayer: PublicKey;\n    bankMint: PublicKey;\n    bank: PublicKey;\n    tokenProgram: PublicKey;\n    // Optional accounts - to override inference\n    admin?: PublicKey;\n    globalFeeWallet?: PublicKey;\n  },\n  args: {\n    bankConfig: BankConfigCompactRaw;\n  }\n) {\n  const { marginfiGroup, feePayer, bankMint, bank, tokenProgram, ...optionalAccounts } = accounts;\n\n  return mfProgram.methods\n    .lendingPoolAddBank({\n      ...args.bankConfig,\n      configFlags: 0,\n      pad0: [0, 0, 0, 0, 0, 0, 0, 0],\n    })\n    .accounts({\n      marginfiGroup,\n      feePayer,\n      bankMint,\n      bank,\n      tokenProgram,\n    })\n    .accountsPartial(optionalAccounts)\n    .instruction();\n}\n\nasync function makeCloseAccountIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    // Required accounts\n    marginfiAccount: PublicKey;\n    feePayer: PublicKey;\n    // Optional accounts - to override inference\n    authority?: PublicKey;\n  }\n) {\n  const { marginfiAccount, feePayer, ...optionalAccounts } = accounts;\n  return mfProgram.methods\n    .marginfiAccountClose()\n    .accounts({\n      marginfiAccount,\n      feePayer,\n    })\n    .accountsPartial(optionalAccounts)\n    .instruction();\n}\n\n// Deprecated\n// async function makeLendingAccountSortBalancesIx(\n//   mfProgram: MarginfiProgram,\n//   accounts: {\n//     marginfiAccount: PublicKey;\n//   }\n// ) {\n//   return mfProgram.methods\n//     .lendingAccountSortBalances()\n//     .accounts({\n//       marginfiAccount: accounts.marginfiAccount,\n//     })\n//     .instruction();\n// }\n\nasync function makePulseHealthIx(\n  mfProgram: MarginfiProgram,\n  accounts: {\n    marginfiAccount: PublicKey;\n  },\n  /**\n   * The remaining accounts required for this instruction. Should include:\n   * - For each balance the user has, pass bank and oracle: <bank1, oracle1, bank2, oracle2>\n   */\n  remainingAccounts: AccountMeta[] = []\n) {\n  return mfProgram.methods\n    .lendingAccountPulseHealth()\n    .accounts({\n      marginfiAccount: accounts.marginfiAccount,\n    })\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nconst instructions = {\n  makeDepositIx,\n  makeJuplendDepositIx,\n  makeDriftDepositIx,\n  makeKaminoDepositIx,\n  makeRepayIx,\n  makeWithdrawIx,\n  makeJuplendWithdrawIx,\n  makeDriftWithdrawIx,\n  makeKaminoWithdrawIx,\n  makeBorrowIx,\n  makeInitMarginfiAccountIx,\n  makeInitMarginfiAccountPdaIx,\n  makeLendingAccountLiquidateIx,\n  makePoolAddBankIx,\n  makePoolConfigureBankIx,\n  makeBeginFlashLoanIx,\n  makeEndFlashLoanIx,\n  makeAccountTransferToNewAccountIx,\n  makeGroupInitIx,\n  makeCloseAccountIx,\n  makePoolAddPermissionlessStakedBankIx,\n  makeLendingPoolConfigureBankOracleIx,\n  makeLendingPoolConfigureBankOracleScopeIx,\n  makeLendingPoolSetOraclePriceIx,\n  makePulseHealthIx,\n};\n\nexport default instructions;\n"]}