{"version":3,"file":"withdrawCollateral.mjs","sources":["../../../../../src/plugins/collateralModule/operations/withdrawCollateral.ts"],"sourcesContent":["import { PublicKey } from '@solana/web3.js';\nimport { createWithdrawCollateralInstruction } from '@convergence-rfq/rfq';\n\nimport { SendAndConfirmTransactionResponse } from '../../rpcModule';\nimport {\n  Operation,\n  OperationHandler,\n  OperationScope,\n  useOperation,\n  Signer,\n  makeConfirmOptionsFinalizedOnMainnet,\n} from '../../../types';\nimport { Convergence } from '../../../Convergence';\nimport {\n  TransactionBuilder,\n  TransactionBuilderOptions,\n} from '../../../utils/TransactionBuilder';\n\nimport { protocolCache } from '../../protocolModule/cache';\nimport { collateralMintCache } from '../cache';\nimport { addDecimals } from '../../..//utils/conversions';\nimport { addComputeBudgetIxsIfNeeded } from '@/utils/helpers';\n\nconst Key = 'WithdrawCollateralOperation' as const;\n\n/**\n * withdraws a collateral account.\n *\n * ```ts\n * const rfq = await convergence\n *   .collateral()\n *   .withdrawCollateral({ amount: 100 };\n * ```\n *\n * @group Operations\n * @category Constructors\n */\nexport const withdrawCollateralOperation =\n  useOperation<WithdrawCollateralOperation>(Key);\n\n/**\n * @group Operations\n * @category Types\n */\nexport type WithdrawCollateralOperation = Operation<\n  typeof Key,\n  WithdrawCollateralInput,\n  WithdrawCollateralOutput\n>;\n\n/**\n * @group Operations\n * @category Inputs\n */\nexport type WithdrawCollateralInput = {\n  /**\n   * The user for whom collateral is withdrawn.\n   *\n   * @defaultValue `convergence.identity().publicKey`\n   */\n  user?: Signer;\n\n  /** The address of the user's token account where withdrawn\n   * tokens will be transferred to. */\n  userTokens?: PublicKey;\n\n  /**\n   * The address of the protocol.\n   *\n   * @defaultValue `convergence.protocol().pdas().protcol()`\n   */\n  protocol?: PublicKey;\n\n  /** The address of the user's collateral info account. */\n  collateralInfo?: PublicKey;\n\n  /** The address of the user's collateral token account. */\n  collateralToken?: PublicKey;\n\n  /*\n   * Args\n   */\n\n  /** The amount to withdraw */\n  amount: number;\n};\n\n/**\n * @group Operations\n * @category Outputs\n */\nexport type WithdrawCollateralOutput = {\n  /** The blockchain response from sending and confirming the transaction. */\n  response: SendAndConfirmTransactionResponse;\n};\n\n/**\n * @group Operations\n * @category Handlers\n */\nexport const withdrawCollateralOperationHandler: OperationHandler<WithdrawCollateralOperation> =\n  {\n    handle: async (\n      operation: WithdrawCollateralOperation,\n      convergence: Convergence,\n      scope: OperationScope\n    ) => {\n      scope.throwIfCanceled();\n\n      const builder = await withdrawCollateralBuilder(\n        convergence,\n        {\n          ...operation.input,\n        },\n        scope\n      );\n      scope.throwIfCanceled();\n\n      const confirmOptions = makeConfirmOptionsFinalizedOnMainnet(\n        convergence,\n        scope.confirmOptions\n      );\n      const output = await builder.sendAndConfirm(convergence, confirmOptions);\n      scope.throwIfCanceled();\n\n      return output;\n    },\n  };\n\nexport type WithdrawCollateralBuilderParams = WithdrawCollateralInput;\n\n/**\n * @group Transaction Builders\n * @category Contexts\n */\nexport type WithdrawCollateralBuilderContext = Omit<\n  WithdrawCollateralOutput,\n  'collateral'\n>;\n\n/**\n * withdraws a collateral account.\n *\n * ```ts\n * const transactionBuilder = await convergence\n *   .rfqs()\n *   .builders()\n *   .withdrawCollateral();\n * ```\n *\n * @group Transaction Builders\n * @category Constructors\n */\nexport const withdrawCollateralBuilder = async (\n  convergence: Convergence,\n  params: WithdrawCollateralBuilderParams,\n  options: TransactionBuilderOptions = {}\n): Promise<TransactionBuilder<WithdrawCollateralBuilderContext>> => {\n  const { programs } = options;\n  const rfqProgram = convergence.programs().getRfq(programs);\n\n  const protocolModel = await protocolCache.get(convergence);\n\n  const {\n    user = convergence.identity(),\n    protocol = convergence.protocol().pdas().protocol(),\n    collateralInfo = convergence\n      .collateral()\n      .pdas()\n      .collateralInfo({ user: user.publicKey }),\n    collateralToken = convergence\n      .collateral()\n      .pdas()\n      .collateralToken({ user: user.publicKey }),\n    userTokens = convergence.tokens().pdas().associatedTokenAccount({\n      mint: protocolModel.collateralMint,\n      owner: user.publicKey,\n      programs,\n    }),\n    amount,\n  } = params;\n\n  const collateralMint = await collateralMintCache.get(convergence);\n  const collateralDecimals = collateralMint.decimals;\n\n  const txBuilder = TransactionBuilder.make<WithdrawCollateralBuilderContext>()\n    .setFeePayer(user)\n    .add({\n      instruction: createWithdrawCollateralInstruction(\n        {\n          user: user.publicKey,\n          userTokens,\n          protocol,\n          collateralInfo,\n          collateralToken,\n        },\n        {\n          amount: addDecimals(amount, collateralDecimals),\n        },\n        rfqProgram.address\n      ),\n      signers: [user],\n      key: 'withdrawCollateral',\n    });\n\n  await addComputeBudgetIxsIfNeeded(txBuilder, convergence);\n  return txBuilder;\n};\n"],"names":["Key","withdrawCollateralOperation","useOperation","withdrawCollateralOperationHandler","handle","_handle","_asyncToGenerator","_regeneratorRuntime","mark","_callee","operation","convergence","scope","builder","confirmOptions","output","wrap","_callee$","_context","prev","next","throwIfCanceled","withdrawCollateralBuilder","_objectSpread","input","sent","makeConfirmOptionsFinalizedOnMainnet","sendAndConfirm","abrupt","stop","_x","_x2","_x3","apply","arguments","_ref","_callee2","params","options","programs","rfqProgram","protocolModel","_params$user","user","_params$protocol","protocol","_params$collateralInf","collateralInfo","_params$collateralTok","collateralToken","_params$userTokens","userTokens","amount","collateralMint","collateralDecimals","txBuilder","_args2","_callee2$","_context2","length","undefined","getRfq","protocolCache","get","identity","pdas","collateral","publicKey","tokens","associatedTokenAccount","mint","owner","collateralMintCache","decimals","TransactionBuilder","make","setFeePayer","add","instruction","createWithdrawCollateralInstruction","addDecimals","address","signers","key","addComputeBudgetIxsIfNeeded","_x4","_x5"],"mappings":";;;;;;;;;AAuBA,IAAMA,GAAG,GAAG,6BAAsC,CAAA;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACaC,2BAA2B,GACtCC,YAAY,CAA8BF,GAAG,EAAC;;AAEhD;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;;AAkCA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACO,IAAMG,kCAAiF,GAC5F;EACEC,MAAM,EAAA,YAAA;AAAA,IAAA,IAAAC,OAAA,GAAAC,iBAAA,eAAAC,mBAAA,EAAAC,CAAAA,IAAA,CAAE,SAAAC,OACNC,CAAAA,SAAsC,EACtCC,WAAwB,EACxBC,KAAqB,EAAA;AAAA,MAAA,IAAAC,OAAA,EAAAC,cAAA,EAAAC,MAAA,CAAA;AAAA,MAAA,OAAAR,mBAAA,EAAA,CAAAS,IAAA,CAAA,SAAAC,SAAAC,QAAA,EAAA;AAAA,QAAA,OAAA,CAAA,EAAA,QAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;AAAA,UAAA,KAAA,CAAA;YAErBR,KAAK,CAACS,eAAe,EAAE,CAAA;AAACH,YAAAA,QAAA,CAAAE,IAAA,GAAA,CAAA,CAAA;YAAA,OAEFE,yBAAyB,CAC7CX,WAAW,EAAAY,cAAA,CAENb,EAAAA,EAAAA,SAAS,CAACc,KAAK,CAEpBZ,EAAAA,KACF,CAAC,CAAA;AAAA,UAAA,KAAA,CAAA;YANKC,OAAO,GAAAK,QAAA,CAAAO,IAAA,CAAA;YAObb,KAAK,CAACS,eAAe,EAAE,CAAA;YAEjBP,cAAc,GAAGY,oCAAoC,CACzDf,WAAW,EACXC,KAAK,CAACE,cACR,CAAC,CAAA;AAAAI,YAAAA,QAAA,CAAAE,IAAA,GAAA,CAAA,CAAA;AAAA,YAAA,OACoBP,OAAO,CAACc,cAAc,CAAChB,WAAW,EAAEG,cAAc,CAAC,CAAA;AAAA,UAAA,KAAA,CAAA;YAAlEC,MAAM,GAAAG,QAAA,CAAAO,IAAA,CAAA;YACZb,KAAK,CAACS,eAAe,EAAE,CAAA;AAAC,YAAA,OAAAH,QAAA,CAAAU,MAAA,CAAA,QAAA,EAEjBb,MAAM,CAAA,CAAA;AAAA,UAAA,KAAA,EAAA,CAAA;AAAA,UAAA,KAAA,KAAA;YAAA,OAAAG,QAAA,CAAAW,IAAA,EAAA,CAAA;AAAA,SAAA;AAAA,OAAA,EAAApB,OAAA,CAAA,CAAA;KACd,CAAA,CAAA,CAAA;AAAA,IAAA,SAAAL,MAAA0B,CAAAA,EAAA,EAAAC,GAAA,EAAAC,GAAA,EAAA;AAAA,MAAA,OAAA3B,OAAA,CAAA4B,KAAA,CAAA,IAAA,EAAAC,SAAA,CAAA,CAAA;AAAA,KAAA;AAAA,IAAA,OAAA9B,MAAA,CAAA;AAAA,GAAA,EAAA;AACH,EAAC;;AAIH;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACakB,yBAAyB,gBAAA,YAAA;AAAA,EAAA,IAAAa,IAAA,GAAA7B,iBAAA,eAAAC,mBAAA,EAAA,CAAAC,IAAA,CAAG,SAAA4B,QAAAA,CACvCzB,WAAwB,EACxB0B,MAAuC,EAAA;AAAA,IAAA,IAAAC,OAAA;MAAAC,QAAA;MAAAC,UAAA;MAAAC,aAAA;MAAAC,YAAA;MAAAC,IAAA;MAAAC,gBAAA;MAAAC,QAAA;MAAAC,qBAAA;MAAAC,cAAA;MAAAC,qBAAA;MAAAC,eAAA;MAAAC,kBAAA;MAAAC,UAAA;MAAAC,MAAA;MAAAC,cAAA;MAAAC,kBAAA;MAAAC,SAAA;AAAAC,MAAAA,MAAA,GAAAtB,SAAA,CAAA;AAAA,IAAA,OAAA3B,mBAAA,EAAA,CAAAS,IAAA,CAAA,SAAAyC,UAAAC,SAAA,EAAA;AAAA,MAAA,OAAA,CAAA,EAAA,QAAAA,SAAA,CAAAvC,IAAA,GAAAuC,SAAA,CAAAtC,IAAA;AAAA,QAAA,KAAA,CAAA;AACvCkB,UAAAA,OAAkC,GAAAkB,MAAA,CAAAG,MAAA,GAAAH,CAAAA,IAAAA,MAAA,CAAAI,CAAAA,CAAAA,KAAAA,SAAA,GAAAJ,MAAA,CAAG,CAAA,CAAA,GAAA,EAAE,CAAA;UAE/BjB,QAAQ,GAAKD,OAAO,CAApBC,QAAQ,CAAA;UACVC,UAAU,GAAG7B,WAAW,CAAC4B,QAAQ,EAAE,CAACsB,MAAM,CAACtB,QAAQ,CAAC,CAAA;AAAAmB,UAAAA,SAAA,CAAAtC,IAAA,GAAA,CAAA,CAAA;AAAA,UAAA,OAE9B0C,aAAa,CAACC,GAAG,CAACpD,WAAW,CAAC,CAAA;AAAA,QAAA,KAAA,CAAA;UAApD8B,aAAa,GAAAiB,SAAA,CAAAjC,IAAA,CAAA;AAAAiB,UAAAA,YAAA,GAmBfL,MAAM,CAhBRM,IAAI,EAAJA,IAAI,GAAAD,YAAA,KAAG/B,KAAAA,CAAAA,GAAAA,WAAW,CAACqD,QAAQ,EAAE,GAAAtB,YAAA,EAAAE,gBAAA,GAgB3BP,MAAM,CAfRQ,QAAQ,EAARA,QAAQ,GAAAD,gBAAA,KAAA,KAAA,CAAA,GAAGjC,WAAW,CAACkC,QAAQ,EAAE,CAACoB,IAAI,EAAE,CAACpB,QAAQ,EAAE,GAAAD,gBAAA,EAAAE,qBAAA,GAejDT,MAAM,CAdRU,cAAc,EAAdA,cAAc,GAAAD,qBAAA,KAAA,KAAA,CAAA,GAAGnC,WAAW,CACzBuD,UAAU,EAAE,CACZD,IAAI,EAAE,CACNlB,cAAc,CAAC;YAAEJ,IAAI,EAAEA,IAAI,CAACwB,SAAAA;WAAW,CAAC,GAAArB,qBAAA,EAAAE,qBAAA,GAWzCX,MAAM,CAVRY,eAAe,EAAfA,eAAe,GAAAD,qBAAA,KAAGrC,KAAAA,CAAAA,GAAAA,WAAW,CAC1BuD,UAAU,EAAE,CACZD,IAAI,EAAE,CACNhB,eAAe,CAAC;YAAEN,IAAI,EAAEA,IAAI,CAACwB,SAAAA;WAAW,CAAC,GAAAnB,qBAAA,EAAAE,kBAAA,GAO1Cb,MAAM,CANRc,UAAU,EAAVA,UAAU,GAAAD,kBAAA,KAAGvC,KAAAA,CAAAA,GAAAA,WAAW,CAACyD,MAAM,EAAE,CAACH,IAAI,EAAE,CAACI,sBAAsB,CAAC;YAC9DC,IAAI,EAAE7B,aAAa,CAACY,cAAc;YAClCkB,KAAK,EAAE5B,IAAI,CAACwB,SAAS;AACrB5B,YAAAA,QAAQ,EAARA,QAAAA;WACD,CAAC,GAAAW,kBAAA,EACFE,MAAM,GACJf,MAAM,CADRe,MAAM,CAAA;AAAAM,UAAAA,SAAA,CAAAtC,IAAA,GAAA,CAAA,CAAA;AAAA,UAAA,OAGqBoD,mBAAmB,CAACT,GAAG,CAACpD,WAAW,CAAC,CAAA;AAAA,QAAA,KAAA,CAAA;UAA3D0C,cAAc,GAAAK,SAAA,CAAAjC,IAAA,CAAA;UACd6B,kBAAkB,GAAGD,cAAc,CAACoB,QAAQ,CAAA;AAE5ClB,UAAAA,SAAS,GAAGmB,kBAAkB,CAACC,IAAI,EAAoC,CAC1EC,WAAW,CAACjC,IAAI,CAAC,CACjBkC,GAAG,CAAC;YACHC,WAAW,EAAEC,mCAAmC,CAC9C;cACEpC,IAAI,EAAEA,IAAI,CAACwB,SAAS;AACpBhB,cAAAA,UAAU,EAAVA,UAAU;AACVN,cAAAA,QAAQ,EAARA,QAAQ;AACRE,cAAAA,cAAc,EAAdA,cAAc;AACdE,cAAAA,eAAe,EAAfA,eAAAA;AACF,aAAC,EACD;AACEG,cAAAA,MAAM,EAAE4B,WAAW,CAAC5B,MAAM,EAAEE,kBAAkB,CAAA;AAChD,aAAC,EACDd,UAAU,CAACyC,OACb,CAAC;YACDC,OAAO,EAAE,CAACvC,IAAI,CAAC;AACfwC,YAAAA,GAAG,EAAE,oBAAA;AACP,WAAC,CAAC,CAAA;AAAAzB,UAAAA,SAAA,CAAAtC,IAAA,GAAA,EAAA,CAAA;AAAA,UAAA,OAEEgE,2BAA2B,CAAC7B,SAAS,EAAE5C,WAAW,CAAC,CAAA;AAAA,QAAA,KAAA,EAAA;AAAA,UAAA,OAAA+C,SAAA,CAAA9B,MAAA,CAAA,QAAA,EAClD2B,SAAS,CAAA,CAAA;AAAA,QAAA,KAAA,EAAA,CAAA;AAAA,QAAA,KAAA,KAAA;UAAA,OAAAG,SAAA,CAAA7B,IAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA,EAAAO,QAAA,CAAA,CAAA;GACjB,CAAA,CAAA,CAAA;AAAA,EAAA,OAAA,SAtDYd,yBAAyBA,CAAA+D,GAAA,EAAAC,GAAA,EAAA;AAAA,IAAA,OAAAnD,IAAA,CAAAF,KAAA,CAAA,IAAA,EAAAC,SAAA,CAAA,CAAA;AAAA,GAAA,CAAA;AAAA,CAsDrC;;;;"}