{"version":3,"file":"prepareSettlementAndPrepareMoreLegs.cjs","sources":["../../../../../src/plugins/rfqModule/operations/prepareSettlementAndPrepareMoreLegs.ts"],"sourcesContent":["import { PublicKey } from '@solana/web3.js';\n\nimport { Convergence } from '../../../Convergence';\nimport {\n  Operation,\n  OperationHandler,\n  OperationScope,\n  useOperation,\n  Signer,\n  makeConfirmOptionsFinalizedOnMainnet,\n} from '../../../types';\nimport { SendAndConfirmTransactionResponse } from '../../rpcModule';\nimport { prepareSettlementBuilder } from './prepareSettlement';\nimport { prepareMoreLegsSettlementBuilder } from './prepareMoreLegsSettlement';\n\nconst Key = 'PrepareSettlementAndPrepareMoreLegsOperation' as const;\n\n/**\n * Prepares for settlement and prepares more legs for settlement.\n *\n * ```ts\n * await convergence\n *   .rfqs()\n *   .prepareSettlementAndPrepareMoreLegs({\n *     rfq: rfq.address,\n *     response: rfqResponse.address,\n *     legAmountToPrepare: 3\n *   });\n * ```\n *\n * @group Operations\n * @category Constructors\n */\nexport const prepareSettlementAndPrepareMoreLegsOperation =\n  useOperation<PrepareSettlementAndPrepareMoreLegsOperation>(Key);\n\n/**\n * @group Operations\n * @category Types\n */\nexport type PrepareSettlementAndPrepareMoreLegsOperation = Operation<\n  typeof Key,\n  PrepareSettlementAndPrepareMoreLegsInput,\n  PrepareSettlementAndPrepareMoreLegsOutput\n>;\n\n/**\n * @group Operations\n * @category Inputs\n */\nexport type PrepareSettlementAndPrepareMoreLegsInput = {\n  /**\n   * The caller to prepare settlement of the Rfq.\n   *\n   * @defaultValue `convergence.identity()`\n   */\n  caller?: Signer;\n\n  /**\n   * The protocol address.\n   * @defaultValue `convergence.protocol().pdas().protocol(),`\n   */\n  protocol?: PublicKey;\n\n  /** The address of the Rfq account. */\n  rfq: PublicKey;\n\n  /** The address of the Response account. */\n  response: PublicKey;\n\n  /*\n   * Args\n   */\n\n  /** The number of legs to prepare settlement for. */\n  legAmountToPrepare: number;\n};\n\n/**\n * @group Operations\n * @category Outputs\n */\nexport type PrepareSettlementAndPrepareMoreLegsOutput = {\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 prepareSettlementAndPrepareMoreLegsOperationHandler: OperationHandler<PrepareSettlementAndPrepareMoreLegsOperation> =\n  {\n    handle: async (\n      operation: PrepareSettlementAndPrepareMoreLegsOperation,\n      convergence: Convergence,\n      scope: OperationScope\n    ): Promise<PrepareSettlementAndPrepareMoreLegsOutput> => {\n      const { legAmountToPrepare, rfq } = operation.input;\n      const rfqModel = await convergence.rfqs().findRfqByAddress({\n        address: rfq,\n      });\n\n      const result = await prepareSettlementBuilder(\n        convergence,\n        rfqModel,\n        {\n          ...operation.input,\n        },\n        scope\n      );\n      scope.throwIfCanceled();\n\n      let slicedLegAmount = legAmountToPrepare;\n      const { ataTxBuilderArray } = result;\n      let prepareBuilder = result.prepareSettlementTxBuilder;\n\n      while (!prepareBuilder.checkTransactionFits()) {\n        const halvedLegAmount = Math.trunc(slicedLegAmount / 2);\n\n        const result = await prepareSettlementBuilder(\n          convergence,\n          rfqModel,\n          {\n            ...operation.input,\n            legAmountToPrepare: halvedLegAmount,\n          },\n          scope\n        );\n        prepareBuilder = result.prepareSettlementTxBuilder;\n\n        slicedLegAmount = halvedLegAmount;\n      }\n\n      const confirmOptions = makeConfirmOptionsFinalizedOnMainnet(\n        convergence,\n        scope.confirmOptions\n      );\n\n      const latestValidBlockHeight = await convergence\n        .rpc()\n        .getLatestBlockhash();\n      const ataTxs = ataTxBuilderArray.map((builder) =>\n        builder.toTransaction(latestValidBlockHeight)\n      );\n\n      const prepareSettlementTx = prepareBuilder.toTransaction(\n        latestValidBlockHeight\n      );\n      const [signedAtaTxs, [signedPrepareSettlementTx]] = await convergence\n        .identity()\n        .signTransactionMatrix(ataTxs, [prepareSettlementTx]);\n\n      await Promise.all(\n        signedAtaTxs.map((signedTx) =>\n          convergence\n            .rpc()\n            .serializeAndSendTransaction(signedTx, latestValidBlockHeight)\n        )\n      );\n\n      const output = await convergence\n        .rpc()\n        .serializeAndSendTransaction(\n          signedPrepareSettlementTx,\n          latestValidBlockHeight\n        );\n\n      scope.throwIfCanceled();\n\n      if (slicedLegAmount < legAmountToPrepare) {\n        let prepareMoreLegsSlicedLegAmount =\n          legAmountToPrepare - slicedLegAmount;\n\n        let prepareMoreBuilder = await prepareMoreLegsSettlementBuilder(\n          convergence,\n          {\n            ...operation.input,\n            legAmountToPrepare: prepareMoreLegsSlicedLegAmount,\n            sidePreparedLegs: slicedLegAmount,\n          },\n          scope\n        );\n\n        while (!prepareMoreBuilder.checkTransactionFits()) {\n          const halvedLegAmount = Math.trunc(\n            prepareMoreLegsSlicedLegAmount / 2\n          );\n\n          prepareMoreBuilder = await prepareMoreLegsSettlementBuilder(\n            convergence,\n            {\n              ...operation.input,\n              sidePreparedLegs: slicedLegAmount,\n              legAmountToPrepare: halvedLegAmount,\n            },\n            scope\n          );\n          prepareMoreLegsSlicedLegAmount = halvedLegAmount;\n        }\n\n        await prepareMoreBuilder.sendAndConfirm(convergence, confirmOptions);\n        scope.throwIfCanceled();\n\n        let prepareMoreSidePrepared = 0;\n\n        if (\n          prepareMoreLegsSlicedLegAmount <\n          legAmountToPrepare - slicedLegAmount\n        ) {\n          while (\n            slicedLegAmount +\n              prepareMoreLegsSlicedLegAmount +\n              prepareMoreSidePrepared <\n              legAmountToPrepare &&\n            legAmountToPrepare -\n              slicedLegAmount -\n              prepareMoreLegsSlicedLegAmount >\n              0\n          ) {\n            const amountToPrepare =\n              legAmountToPrepare -\n              slicedLegAmount -\n              prepareMoreLegsSlicedLegAmount -\n              prepareMoreSidePrepared;\n\n            const prepareMoreBuilder = await prepareMoreLegsSettlementBuilder(\n              convergence,\n              {\n                ...operation.input,\n                sidePreparedLegs:\n                  slicedLegAmount +\n                  prepareMoreLegsSlicedLegAmount +\n                  prepareMoreSidePrepared,\n                legAmountToPrepare: amountToPrepare,\n              },\n              scope\n            );\n\n            await prepareMoreBuilder.sendAndConfirm(\n              convergence,\n              confirmOptions\n            );\n\n            prepareMoreSidePrepared += amountToPrepare;\n          }\n        }\n      }\n\n      return { response: output };\n    },\n  };\n"],"names":["Key","prepareSettlementAndPrepareMoreLegsOperation","useOperation","prepareSettlementAndPrepareMoreLegsOperationHandler","handle","_handle","_asyncToGenerator","_regeneratorRuntime","mark","_callee","operation","convergence","scope","_operation$input","legAmountToPrepare","rfq","rfqModel","result","slicedLegAmount","ataTxBuilderArray","prepareBuilder","halvedLegAmount","_result","confirmOptions","latestValidBlockHeight","ataTxs","prepareSettlementTx","_yield$convergence$id","_yield$convergence$id2","signedAtaTxs","_yield$convergence$id3","signedPrepareSettlementTx","output","prepareMoreLegsSlicedLegAmount","prepareMoreBuilder","_halvedLegAmount","prepareMoreSidePrepared","amountToPrepare","_prepareMoreBuilder","wrap","_callee$","_context","prev","next","input","rfqs","findRfqByAddress","address","sent","prepareSettlementBuilder","_objectSpread","throwIfCanceled","prepareSettlementTxBuilder","checkTransactionFits","Math","trunc","makeConfirmOptionsFinalizedOnMainnet","rpc","getLatestBlockhash","map","builder","toTransaction","identity","signTransactionMatrix","_slicedToArray","Promise","all","signedTx","serializeAndSendTransaction","prepareMoreLegsSettlementBuilder","sidePreparedLegs","sendAndConfirm","abrupt","response","stop","_x","_x2","_x3","apply","arguments"],"mappings":"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"}