{"version":3,"file":"getResponseStateAndAction.cjs","sources":["../../../../../src/plugins/rfqModule/operations/getResponseStateAndAction.ts"],"sourcesContent":["import { DefaultingParty } from '@convergence-rfq/rfq';\nimport {\n  Rfq,\n  Response,\n  ResponseSide,\n  AuthoritySide,\n  inverseResponseSide,\n} from '../models';\nimport { Operation, SyncOperationHandler, useOperation } from '../../../types';\nimport { ResponseTimers, RfqTimers } from '@/utils/classes';\nconst Key = 'GetResponseStateAndAction' as const;\nexport type ResponseState =\n  | 'Active'\n  | 'Cancelled'\n  | 'Expired'\n  | 'MakerDefaulted'\n  | 'TakerDefaulted'\n  | 'BothDefaulted'\n  | 'Settled'\n  | 'SettlingPreparations'\n  | 'ReadyForSettling'\n  | 'WaitingForLastLook'\n  | 'OnlyMakerPrepared'\n  | 'OnlyTakerPrepared'\n  | 'Rejected';\n\nexport type ResponseAction = 'Cancel' | 'Cleanup' | 'Settle' | 'Approve' | null;\n\n/**\n * getResponseStateAndAction.\n *\n * ```ts\n * const result = await convergence.rfqs().getResponseStateAndAction({\n * response,\n * rfq,\n * caller: 'taker'| 'maker,\n * responseSide: 'ask' | 'bid'\n * })\n * ```\n *\n * @group Operations\n * @category Constructors\n */\nexport const getResponseStateAndActionOperation =\n  useOperation<GetResponseStateAndAction>(Key);\n\n/**\n * @group Operations\n * @category Types\n */\nexport type GetResponseStateAndAction = Operation<\n  typeof Key,\n  GetResponseStateAndActionInput,\n  GetResponseStateAndActionOutput\n>;\n\n/**\n * @group Operations\n * @category Inputs\n */\nexport type GetResponseStateAndActionInput = {\n  response: Response;\n  rfq: Rfq;\n  caller: 'taker' | 'maker';\n  responseSide: 'ask' | 'bid';\n};\n\n/**\n * @group Operations\n * @category Outputs\n */\nexport type GetResponseStateAndActionOutput = {\n  responseState: ResponseState;\n  responseAction: ResponseAction;\n};\n\n/**\n * @group Operations\n * @category Handlers\n */\nexport const getResponseStateAndActionHandler: SyncOperationHandler<GetResponseStateAndAction> =\n  {\n    handle: (\n      operation: GetResponseStateAndAction\n    ): GetResponseStateAndActionOutput => {\n      const { response, caller, rfq, responseSide } = operation.input;\n      if (!response.rfq.equals(rfq.address)) {\n        throw new Error('Response does not match RFQ');\n      }\n      const responseTimers = new ResponseTimers(response);\n      const rfqTimers = new RfqTimers(rfq);\n      const responseState = getResponseState(\n        response,\n        rfq,\n        rfqTimers,\n        responseTimers,\n        responseSide\n      );\n      const responseAction = getResponseAction(response, responseState, caller);\n      return { responseState, responseAction };\n    },\n  };\n\nconst getResponseState = (\n  response: Response,\n  rfq: Rfq,\n  rfqTimers: RfqTimers,\n  responseTimers: ResponseTimers,\n  responseSide: ResponseSide\n): ResponseState => {\n  const responseExpired = responseTimers.isResponseExpired();\n  const settlementWindowElapsed = rfqTimers.isRfqSettlementWindowElapsed();\n  const confirmedInverseResponseSide =\n    response?.confirmed?.side === inverseResponseSide(responseSide);\n  const responseConfirmed = response?.confirmed !== null;\n  const makerPrepared = hasMakerPrepared(response, rfq);\n  const takerPrepared = hasTakerPrepared(response, rfq);\n  const defaultingParty = getDefautingParty(\n    response,\n    settlementWindowElapsed,\n    makerPrepared,\n    takerPrepared\n  );\n\n  if (responseConfirmed && confirmedInverseResponseSide) return 'Rejected';\n  switch (response.state) {\n    case 'active':\n      if (!responseExpired) return 'Active';\n      return 'Expired';\n    case 'canceled':\n      return 'Cancelled';\n    case 'waiting-for-last-look':\n      if (!responseExpired) return 'WaitingForLastLook';\n      return 'Expired';\n    case 'settling-preparations':\n      if (!settlementWindowElapsed) {\n        if (makerPrepared) return 'OnlyMakerPrepared';\n        if (takerPrepared) return 'OnlyTakerPrepared';\n        return 'SettlingPreparations';\n      }\n      switch (defaultingParty) {\n        case DefaultingParty.Maker:\n          return 'MakerDefaulted';\n        case DefaultingParty.Taker:\n          return 'TakerDefaulted';\n        case DefaultingParty.Both:\n          return 'BothDefaulted';\n      }\n    case 'ready-for-settling':\n      return 'ReadyForSettling';\n    case 'settled':\n      return 'Settled';\n    case 'defaulted':\n      switch (defaultingParty) {\n        case DefaultingParty.Maker:\n          return 'MakerDefaulted';\n        case DefaultingParty.Taker:\n          return 'TakerDefaulted';\n        case DefaultingParty.Both:\n          return 'BothDefaulted';\n      }\n    default:\n      throw new Error('Invalid Response state');\n  }\n};\n\nconst getResponseAction = (\n  response: Response,\n  responseState: ResponseState,\n  caller: AuthoritySide\n): ResponseAction => {\n  const responseConfirmed = response?.confirmed !== null;\n  switch (caller) {\n    case 'maker':\n      switch (responseState) {\n        case 'Active':\n          if (!responseConfirmed) return 'Cancel';\n          break;\n        case 'Expired':\n        case 'Cancelled':\n        case 'Settled':\n          return 'Cleanup';\n        case 'SettlingPreparations':\n        case 'OnlyMakerPrepared':\n        case 'OnlyTakerPrepared':\n        case 'ReadyForSettling':\n          return 'Settle';\n        case 'Rejected':\n          return null;\n      }\n      break;\n\n    case 'taker':\n      switch (responseState) {\n        case 'Active':\n          if (!responseConfirmed) return 'Approve';\n          break;\n        case 'SettlingPreparations':\n        case 'OnlyMakerPrepared':\n        case 'OnlyTakerPrepared':\n        case 'ReadyForSettling':\n          return 'Settle';\n        case 'Settled':\n        case 'Expired':\n        case 'Cancelled':\n          return 'Cleanup';\n        case 'Rejected':\n          return null;\n      }\n      break;\n  }\n  return null;\n};\n\nconst getDefautingParty = (\n  response: Response,\n  settlementWindowElapsed: boolean,\n  makerPrepared: boolean,\n  takerPrepared: boolean\n): DefaultingParty | null => {\n  const { defaultingParty } = response;\n  if (defaultingParty !== null) return defaultingParty;\n  const defaulted =\n    settlementWindowElapsed && (!makerPrepared || !takerPrepared);\n\n  if (defaulted && defaultingParty === null) {\n    if (!makerPrepared && !takerPrepared) return DefaultingParty.Both;\n    if (!makerPrepared) return DefaultingParty.Maker;\n    if (!takerPrepared) return DefaultingParty.Taker;\n  }\n\n  return null;\n};\n\nconst hasMakerPrepared = (response: Response, rfq: Rfq) => {\n  if (response.model === 'escrowResponse') {\n    return response.makerPreparedLegs === rfq.legs.length;\n  }\n\n  return response.makerPrepared;\n};\n\nconst hasTakerPrepared = (response: Response, rfq: Rfq) => {\n  if (response.model === 'escrowResponse') {\n    return response.takerPreparedLegs === rfq.legs.length;\n  }\n\n  return response.takerPrepared;\n};\n"],"names":["Key","getResponseStateAndActionOperation","useOperation","getResponseStateAndActionHandler","handle","operation","_operation$input","input","response","caller","rfq","responseSide","equals","address","Error","responseTimers","ResponseTimers","rfqTimers","RfqTimers","responseState","getResponseState","responseAction","getResponseAction","_response$confirmed","responseExpired","isResponseExpired","settlementWindowElapsed","isRfqSettlementWindowElapsed","confirmedInverseResponseSide","confirmed","side","inverseResponseSide","responseConfirmed","makerPrepared","hasMakerPrepared","takerPrepared","hasTakerPrepared","defaultingParty","getDefautingParty","state","DefaultingParty","Maker","Taker","Both","defaulted","model","makerPreparedLegs","legs","length","takerPreparedLegs"],"mappings":"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"}