{"version":3,"sources":["../../src/helpers/index.ts"],"sourcesContent":["import { AccountAddress, Serializer } from \"@aptos-labs/ts-sdk\";\nimport { BigNumber } from \"bignumber.js\";\nimport { RouteMatrix } from \"../types/swap.type\";\n\nexport const getSpacingFromFee = (fee: number): number => {\n  const feeSpacingMap: Record<number, number> = {\n    100: 1,\n    500: 10,\n    3000: 60,\n    10000: 200,\n  };\n\n  const spacing = feeSpacingMap[fee];\n  if (spacing === undefined) {\n    throw new Error(`Unsupported fee tier: ${fee}`);\n  }\n\n  return spacing;\n};\n\nexport const toU64 = (value: number): bigint => {\n  if (value < 0) {\n    // Convert signed value to its unsigned (two's complement) representation\n    const U64_MAX = 2n ** 64n; // Maximum value for u64\n    return U64_MAX + BigInt(value);\n  }\n  return BigInt(value);\n};\n\nexport const priceToTickIndex = (price: number, tickSpacing = 60) => {\n  if (price <= 0) {\n    throw new Error(\"Price must be greater than 0\");\n  }\n\n  const ln1_0001 = Math.log(1.0001); // Natural log of 1.0001\n  const tickIndex = Math.log(price) / ln1_0001; // Compute raw tick index\n\n  // Align tick index to tick spacing\n  return Math.floor(tickIndex / tickSpacing) * tickSpacing;\n};\n\nexport const roundPriceToTickSpacing = (price: number, fee: number) => {\n  const tickSpacing = getSpacingFromFee(fee);\n  const tick = Math.floor(Math.log(price) / Math.log(1.0001));\n  const roundedTick = Math.round(tick / tickSpacing) * tickSpacing;\n  return Math.pow(1.0001, roundedTick);\n};\n\nexport const toBigNumber = (n: BigNumber.Value, base?: number) => {\n  return new BigNumber(n, base);\n};\n\nexport const serializeSOR = ({\n  routeMatrix,\n  amounts,\n  slippage,\n}: {\n  routeMatrix: RouteMatrix[];\n  amounts: string[];\n  slippage: number;\n}) => {\n  const amountIn = amounts.at(0)!;\n  const amountOut = amounts.at(-1)!;\n\n  const amountOutMinusXPercent = toBigNumber(amountOut)\n    .minus(toBigNumber(amountOut).multipliedBy(slippage / 100))\n    .dp(0, BigNumber.ROUND_FLOOR)\n    .toString();\n\n  const tokens = routeMatrix.flatMap(({ plainPool, fromIdx, toIdx }) => [\n    plainPool.tokens[fromIdx]!,\n    plainPool.tokens[toIdx]!,\n  ]);\n\n  const seen = new Set<string>();\n\n  let tokenAddresses: string[] = [];\n\n  tokens.forEach((token) => {\n    if (!seen.has(token.tokenAddr)) {\n      seen.add(token.tokenAddr);\n      tokenAddresses = [...tokenAddresses, token.tokenAddr];\n    }\n  });\n\n  const ser = new Serializer();\n\n  // route length\n  ser.serializeU8(1);\n\n  // trade type\n  ser.serializeBool(true);\n\n  // token path\n  ser.serializeVector(\n    tokenAddresses.map((token) => AccountAddress.fromString(token))\n  );\n  // amount in\n  ser.serializeU64(BigInt(amountIn));\n\n  // amount out\n  ser.serializeU64(BigInt(amountOutMinusXPercent));\n  // ser.serializeU64(BigInt(0));\n\n  // pools\n  for (const { plainPool } of routeMatrix) {\n    if (plainPool.poolType == \"CLMM\") {\n      ser.serializeU64(3);\n    } else if (plainPool.poolType == \"STABLE\") {\n      ser.serializeU64(4);\n    } else {\n      ser.serializeU64(2);\n    }\n\n    ser.serialize(AccountAddress.fromString(plainPool.poolId));\n  }\n\n  return ser.toUint8Array();\n};\n"],"mappings":"AAAA,OAAS,kBAAAA,EAAgB,cAAAC,MAAkB,qBAC3C,OAAS,aAAAC,MAAiB,eAGnB,IAAMC,EAAqBC,GAAwB,CAQxD,IAAMC,EAPwC,CAC5C,IAAK,EACL,IAAK,GACL,IAAM,GACN,IAAO,GACT,EAE8BD,CAAG,EACjC,GAAIC,IAAY,OACd,MAAM,IAAI,MAAM,yBAAyBD,CAAG,EAAE,EAGhD,OAAOC,CACT,EAEaC,EAASC,GAChBA,EAAQ,EAEM,IAAM,IACL,OAAOA,CAAK,EAExB,OAAOA,CAAK,EAGRC,EAAmB,CAACC,EAAeC,EAAc,KAAO,CACnE,GAAID,GAAS,EACX,MAAM,IAAI,MAAM,8BAA8B,EAGhD,IAAME,EAAW,KAAK,IAAI,MAAM,EAC1BC,EAAY,KAAK,IAAIH,CAAK,EAAIE,EAGpC,OAAO,KAAK,MAAMC,EAAYF,CAAW,EAAIA,CAC/C,EAEaG,EAA0B,CAACJ,EAAeL,IAAgB,CACrE,IAAMM,EAAcP,EAAkBC,CAAG,EACnCU,EAAO,KAAK,MAAM,KAAK,IAAIL,CAAK,EAAI,KAAK,IAAI,MAAM,CAAC,EACpDM,EAAc,KAAK,MAAMD,EAAOJ,CAAW,EAAIA,EACrD,OAAO,KAAK,IAAI,OAAQK,CAAW,CACrC,EAEaC,EAAc,CAACC,EAAoBC,IACvC,IAAIhB,EAAUe,EAAGC,CAAI,EAGjBC,EAAe,CAAC,CAC3B,YAAAC,EACA,QAAAC,EACA,SAAAC,CACF,IAIM,CACJ,IAAMC,EAAWF,EAAQ,GAAG,CAAC,EACvBG,EAAYH,EAAQ,GAAG,EAAE,EAEzBI,EAAyBT,EAAYQ,CAAS,EACjD,MAAMR,EAAYQ,CAAS,EAAE,aAAaF,EAAW,GAAG,CAAC,EACzD,GAAG,EAAGpB,EAAU,WAAW,EAC3B,SAAS,EAENwB,EAASN,EAAY,QAAQ,CAAC,CAAE,UAAAO,EAAW,QAAAC,EAAS,MAAAC,CAAM,IAAM,CACpEF,EAAU,OAAOC,CAAO,EACxBD,EAAU,OAAOE,CAAK,CACxB,CAAC,EAEKC,EAAO,IAAI,IAEbC,EAA2B,CAAC,EAEhCL,EAAO,QAASM,GAAU,CACnBF,EAAK,IAAIE,EAAM,SAAS,IAC3BF,EAAK,IAAIE,EAAM,SAAS,EACxBD,EAAiB,CAAC,GAAGA,EAAgBC,EAAM,SAAS,EAExD,CAAC,EAED,IAAMC,EAAM,IAAIhC,EAGhBgC,EAAI,YAAY,CAAC,EAGjBA,EAAI,cAAc,EAAI,EAGtBA,EAAI,gBACFF,EAAe,IAAKC,GAAUhC,EAAe,WAAWgC,CAAK,CAAC,CAChE,EAEAC,EAAI,aAAa,OAAOV,CAAQ,CAAC,EAGjCU,EAAI,aAAa,OAAOR,CAAsB,CAAC,EAI/C,OAAW,CAAE,UAAAE,CAAU,IAAKP,EACtBO,EAAU,UAAY,OACxBM,EAAI,aAAa,CAAC,EACTN,EAAU,UAAY,SAC/BM,EAAI,aAAa,CAAC,EAElBA,EAAI,aAAa,CAAC,EAGpBA,EAAI,UAAUjC,EAAe,WAAW2B,EAAU,MAAM,CAAC,EAG3D,OAAOM,EAAI,aAAa,CAC1B","names":["AccountAddress","Serializer","BigNumber","getSpacingFromFee","fee","spacing","toU64","value","priceToTickIndex","price","tickSpacing","ln1_0001","tickIndex","roundPriceToTickSpacing","tick","roundedTick","toBigNumber","n","base","serializeSOR","routeMatrix","amounts","slippage","amountIn","amountOut","amountOutMinusXPercent","tokens","plainPool","fromIdx","toIdx","seen","tokenAddresses","token","ser"]}