{"version":3,"sources":["../../src/modules/estSwapHandler.ts"],"sourcesContent":["import { TradeSizeExceedsError } from \"../common/TradeSizeExceedsError\";\nimport { toBigNumber } from \"../helpers\";\nimport { BookEntry, EstSwapResult, SwapSourceField } from \"../types/swap.type\";\n\nexport class EstSwapHandler {\n  private _entries: BookEntry[];\n  private _field: SwapSourceField;\n  private _amount: number;\n\n  constructor(entries: BookEntry[], field: SwapSourceField, amount: number) {\n    this._entries = entries;\n    this._field = field;\n    this._amount = amount;\n  }\n\n  get(): EstSwapResult {\n    const { amountIn, amountOut } = this._findClosestAmount();\n\n    const compareAmount = this._field == \"input\" ? amountIn : amountOut;\n    const targetAmount = this._field == \"input\" ? amountOut : amountIn;\n\n    if (toBigNumber(compareAmount).isZero()) {\n      return {\n        amount: this._amount,\n        estAmount: 0,\n        field: this._field,\n      };\n    }\n\n    const singleTargetAmount = toBigNumber(targetAmount).div(compareAmount);\n    const tempresult = toBigNumber(singleTargetAmount)\n      .multipliedBy(this._amount)\n      .toFixed(0);\n\n    const estAmount = toBigNumber(tempresult).gt(0) ? Number(tempresult) : 0;\n\n    const result: EstSwapResult = {\n      amount: this._amount,\n      estAmount: estAmount,\n      field: this._field,\n    };\n\n    if (this.isAmountInGreatherThanAllowed) {\n      result.error = new TradeSizeExceedsError(this.maxAmountIn.toString());\n    }\n\n    return result;\n  }\n\n  private _findClosestAmount() {\n    if (!this._entries.length) {\n      throw new Error(\"Book entries is empty\");\n    }\n\n    const getAmount = (entry: BookEntry) => {\n      return this._field == \"input\"\n        ? toBigNumber(entry.amountIn)\n        : toBigNumber(entry.amountOut);\n    };\n\n    let closest = this._entries[0];\n    let closestDiff = toBigNumber(this._amount).minus(getAmount(closest)).abs();\n\n    for (let i = 1; i < this._entries.length; i++) {\n      const entry = this._entries[i];\n      const currentAmount = getAmount(entry);\n      const currentDiff = toBigNumber(this._amount).minus(currentAmount).abs();\n\n      if (currentDiff.isLessThan(closestDiff)) {\n        closest = this._entries[i];\n        closestDiff = currentDiff;\n      }\n    }\n\n    return closest;\n  }\n\n  private get maxAmountIn() {\n    const entries = this._entries.at(-1);\n\n    return toBigNumber(this._entries.at(-1)?.amountIn ?? 0);\n  }\n\n  private get isAmountInGreatherThanAllowed() {\n    return toBigNumber(this._amount).gt(this.maxAmountIn);\n  }\n}\n"],"mappings":"6EAIO,IAAMA,EAAN,KAAqB,CAK1B,YAAYC,EAAsBC,EAAwBC,EAAgB,CACxE,KAAK,SAAWF,EAChB,KAAK,OAASC,EACd,KAAK,QAAUC,CACjB,CAEA,KAAqB,CACnB,GAAM,CAAE,SAAAC,EAAU,UAAAC,CAAU,EAAI,KAAK,mBAAmB,EAElDC,EAAgB,KAAK,QAAU,QAAUF,EAAWC,EACpDE,EAAe,KAAK,QAAU,QAAUF,EAAYD,EAE1D,GAAII,EAAYF,CAAa,EAAE,OAAO,EACpC,MAAO,CACL,OAAQ,KAAK,QACb,UAAW,EACX,MAAO,KAAK,MACd,EAGF,IAAMG,EAAqBD,EAAYD,CAAY,EAAE,IAAID,CAAa,EAChEI,EAAaF,EAAYC,CAAkB,EAC9C,aAAa,KAAK,OAAO,EACzB,QAAQ,CAAC,EAENE,EAAYH,EAAYE,CAAU,EAAE,GAAG,CAAC,EAAI,OAAOA,CAAU,EAAI,EAEjEE,EAAwB,CAC5B,OAAQ,KAAK,QACb,UAAWD,EACX,MAAO,KAAK,MACd,EAEA,OAAI,KAAK,gCACPC,EAAO,MAAQ,IAAIC,EAAsB,KAAK,YAAY,SAAS,CAAC,GAG/DD,CACT,CAEQ,oBAAqB,CAC3B,GAAI,CAAC,KAAK,SAAS,OACjB,MAAM,IAAI,MAAM,uBAAuB,EAGzC,IAAME,EAAaC,GACV,KAAK,QAAU,QAClBP,EAAYO,EAAM,QAAQ,EAC1BP,EAAYO,EAAM,SAAS,EAG7BC,EAAU,KAAK,SAAS,CAAC,EACzBC,EAAcT,EAAY,KAAK,OAAO,EAAE,MAAMM,EAAUE,CAAO,CAAC,EAAE,IAAI,EAE1E,QAASE,EAAI,EAAGA,EAAI,KAAK,SAAS,OAAQA,IAAK,CAC7C,IAAMH,EAAQ,KAAK,SAASG,CAAC,EACvBC,EAAgBL,EAAUC,CAAK,EAC/BK,EAAcZ,EAAY,KAAK,OAAO,EAAE,MAAMW,CAAa,EAAE,IAAI,EAEnEC,EAAY,WAAWH,CAAW,IACpCD,EAAU,KAAK,SAASE,CAAC,EACzBD,EAAcG,EAElB,CAEA,OAAOJ,CACT,CAEA,IAAY,aAAc,CACxB,IAAMf,EAAU,KAAK,SAAS,GAAG,EAAE,EAEnC,OAAOO,EAAY,KAAK,SAAS,GAAG,EAAE,GAAG,UAAY,CAAC,CACxD,CAEA,IAAY,+BAAgC,CAC1C,OAAOA,EAAY,KAAK,OAAO,EAAE,GAAG,KAAK,WAAW,CACtD,CACF","names":["EstSwapHandler","entries","field","amount","amountIn","amountOut","compareAmount","targetAmount","toBigNumber","singleTargetAmount","tempresult","estAmount","result","TradeSizeExceedsError","getAmount","entry","closest","closestDiff","i","currentAmount","currentDiff"]}