{"version":3,"file":"getSettlementResult.cjs","sources":["../../../../../src/plugins/rfqModule/operations/getSettlementResult.ts"],"sourcesContent":["import { Rfq, Response } from '../models';\nimport { Operation, SyncOperationHandler, useOperation } from '../../../types';\nimport { LEG_MULTIPLIER_DECIMALS } from '../constants';\nimport { Confirmation } from '../models/Confirmation';\nimport { roundDown, roundUp } from '@/utils';\nimport { extractLegsMultiplier } from '@/plugins/rfqModule/helpers';\nconst Key = 'GetSettlementResult' as const;\n\nexport type Receiver = 'taker' | 'maker';\n\nexport interface SettlementPartyInfo {\n  amount: number;\n  receiver: Receiver;\n}\n\n/**\n * getSettlementResult.\n *\n * ```ts\n * const result = await convergence.rfqs().getSettlementResult({\n *  response,\n * rfq,\n * })\n * ```\n *\n * @group Operations\n * @category Constructors\n */\nexport const getSettlementResultOperation =\n  useOperation<GetSettlementResult>(Key);\n\n/**\n * @group Operations\n * @category Types\n */\nexport type GetSettlementResult = Operation<\n  typeof Key,\n  GetSettlementResultInput,\n  GetSettlementResultOutput\n>;\n\n/**\n * @group Operations\n * @category Inputs\n */\nexport type GetSettlementResultInput = {\n  response: Response;\n  rfq: Rfq;\n  confirmation?: Confirmation;\n};\n\n/**\n * @group Operations\n * @category Outputs\n */\nexport type GetSettlementResultOutput = {\n  quote: SettlementPartyInfo;\n  legs: SettlementPartyInfo[];\n};\n\n/**\n * @group Operations\n * @category Handlers\n */\nexport const getSettlementResultHandler: SyncOperationHandler<GetSettlementResult> =\n  {\n    handle: (operation: GetSettlementResult): GetSettlementResultOutput => {\n      const {\n        response,\n        rfq,\n        confirmation: passedConfirmation,\n      } = operation.input;\n      let confirmation: Confirmation;\n      //Checks\n      if (!response.rfq.equals(rfq.address)) {\n        throw new Error('Response does not match RFQ');\n      }\n      if (passedConfirmation) {\n        confirmation = passedConfirmation;\n      } else if (response?.confirmed) {\n        confirmation = response.confirmed;\n      } else {\n        throw new Error(\n          'Unconfirmed response requires passing explicit confirmation'\n        );\n      }\n\n      const quoteReceiver = getQuoteTokensReceiver(response, confirmation);\n      const quoteAmount = getQuoteAssetsAmountToTransfer(\n        rfq,\n        response,\n        confirmation\n      );\n      const quote = {\n        receiver: quoteReceiver,\n        amount: quoteAmount,\n      };\n      const legs = rfq.legs.map((_, index) => {\n        const legReceiver = getLegAssetsReceiver(rfq, index, confirmation);\n        const legAmount = getLegAssetsAmountToTransfer(\n          rfq,\n          response,\n          index,\n          confirmation\n        );\n        return {\n          receiver: legReceiver,\n          amount: legAmount,\n        };\n      });\n      return { quote, legs };\n    },\n  };\n\nconst getLegAssetsReceiver = (\n  rfq: Rfq,\n  legIndex: number,\n  confirmation: Confirmation\n) => {\n  const leg = rfq.legs[legIndex];\n  let receiver: Receiver = 'taker';\n  if (leg.getSide() === 'short') {\n    receiver = inverseReceiver(receiver);\n  }\n  if (confirmation.side === 'bid') {\n    receiver = inverseReceiver(receiver);\n  }\n  return receiver;\n};\n\nconst getQuoteTokensReceiver = (\n  response: Response,\n  confirmation: Confirmation\n) => {\n  const quote = getConfirmedQuote(response, confirmation);\n  let receiver: Receiver = 'maker';\n  const price = quote?.price;\n  if (confirmation.side === 'bid') {\n    receiver = inverseReceiver(receiver);\n  }\n  if (price < 0) {\n    receiver = inverseReceiver(receiver);\n  }\n  return receiver;\n};\n\nconst getLegAssetsAmountToTransfer = (\n  rfq: Rfq,\n  response: Response,\n  legIndex: number,\n  confirmation: Confirmation\n) => {\n  const leg = rfq.legs[legIndex];\n  const quote = getConfirmedQuote(response, confirmation);\n  const legsMultiplier = extractLegsMultiplier(rfq, quote, confirmation);\n  let legAmount = leg.getAmount() * legsMultiplier;\n  const receiver = getLegAssetsReceiver(rfq, legIndex, confirmation);\n\n  if (receiver === 'maker') {\n    legAmount = roundUp(legAmount, LEG_MULTIPLIER_DECIMALS);\n  } else if (receiver === 'taker') {\n    legAmount = roundDown(legAmount, LEG_MULTIPLIER_DECIMALS);\n  }\n\n  return legAmount;\n};\n\nconst getQuoteAssetsAmountToTransfer = (\n  rfq: Rfq,\n  response: Response,\n  confirmation: Confirmation\n) => {\n  const quote = getConfirmedQuote(response, confirmation);\n  const legsMultiplier = extractLegsMultiplier(rfq, quote, confirmation);\n  if (rfq.size.type === 'fixed-quote') {\n    return rfq.size.amount;\n  }\n  const positivePrice = Math.abs(Number(quote?.price));\n  let quoteAmount = legsMultiplier * positivePrice;\n  const receiver = getQuoteTokensReceiver(response, confirmation);\n\n  if (receiver === 'maker') {\n    quoteAmount = roundUp(quoteAmount, LEG_MULTIPLIER_DECIMALS);\n  } else if (receiver === 'taker') {\n    quoteAmount = roundDown(quoteAmount, LEG_MULTIPLIER_DECIMALS);\n  }\n\n  return quoteAmount;\n};\n\nconst getConfirmedQuote = (response: Response, confirmation: Confirmation) => {\n  if (confirmation.side === 'ask' && response?.ask) {\n    return response.ask;\n  } else if (confirmation.side === 'bid' && response?.bid) {\n    return response.bid;\n  }\n  throw new Error('Confirmed quote not found');\n};\n\nconst inverseReceiver = (receiver: Receiver): Receiver => {\n  return receiver === 'maker' ? 'taker' : 'maker';\n};\n"],"names":["Key","getSettlementResultOperation","useOperation","getSettlementResultHandler","handle","operation","_operation$input","input","response","rfq","passedConfirmation","confirmation","equals","address","Error","confirmed","quoteReceiver","getQuoteTokensReceiver","quoteAmount","getQuoteAssetsAmountToTransfer","quote","receiver","amount","legs","map","_","index","legReceiver","getLegAssetsReceiver","legAmount","getLegAssetsAmountToTransfer","legIndex","leg","getSide","inverseReceiver","side","getConfirmedQuote","price","legsMultiplier","extractLegsMultiplier","getAmount","roundUp","LEG_MULTIPLIER_DECIMALS","roundDown","size","type","positivePrice","Math","abs","Number","ask","bid"],"mappings":"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"}