{"version":3,"sources":["../../../../src/raydium/cpmm/curve/constantProduct.ts","../../../../src/raydium/cpmm/curve/fee.ts"],"sourcesContent":["import BN from \"bn.js\";\nimport { RoundDirection, SwapWithoutFeesResult, TradingTokenResult } from \"./calculator\";\n\nfunction checkedRem(dividend: BN, divisor: BN): BN {\n  if (divisor.isZero()) throw Error(\"divisor is zero\");\n\n  const result = dividend.mod(divisor);\n  return result;\n}\n\nfunction checkedCeilDiv(dividend: BN, rhs: BN): BN[] {\n  if (rhs.isZero()) throw Error(\"rhs is zero\");\n\n  let quotient = dividend.div(rhs);\n\n  if (quotient.isZero()) throw Error(\"quotient is zero\");\n\n  let remainder = checkedRem(dividend, rhs);\n\n  if (remainder.gt(ZERO)) {\n    quotient = quotient.add(new BN(1));\n\n    rhs = dividend.div(quotient);\n    remainder = checkedRem(dividend, quotient);\n    if (remainder.gt(ZERO)) {\n      rhs = rhs.add(new BN(1));\n    }\n  }\n  return [quotient, rhs];\n}\n\nconst ZERO = new BN(0);\n\nexport class ConstantProductCurve {\n  static swapWithoutFees(sourceAmount: BN, swapSourceAmount: BN, swapDestinationAmount: BN): SwapWithoutFeesResult {\n    const invariant = swapSourceAmount.mul(swapDestinationAmount);\n\n    const newSwapSourceAmount = swapSourceAmount.add(sourceAmount);\n    const [newSwapDestinationAmount, _newSwapSourceAmount] = checkedCeilDiv(invariant, newSwapSourceAmount);\n\n    const sourceAmountSwapped = _newSwapSourceAmount.sub(swapSourceAmount);\n    const destinationAmountSwapped = swapDestinationAmount.sub(newSwapDestinationAmount);\n    if (destinationAmountSwapped.isZero()) throw Error(\"destinationAmountSwapped is zero\");\n\n    return {\n      sourceAmountSwapped,\n      destinationAmountSwapped,\n    };\n  }\n\n  static lpTokensToTradingTokens(\n    lpTokenAmount: BN,\n    lpTokenSupply: BN,\n    swapTokenAmount0: BN,\n    swapTokenAmount1: BN,\n    roundDirection: RoundDirection,\n  ): TradingTokenResult {\n    let tokenAmount0 = lpTokenAmount.mul(swapTokenAmount0).div(lpTokenSupply);\n    let tokenAmount1 = lpTokenAmount.mul(swapTokenAmount1).div(lpTokenSupply);\n\n    if (roundDirection === RoundDirection.Floor) {\n      return { tokenAmount0, tokenAmount1 };\n    } else if (roundDirection === RoundDirection.Ceiling) {\n      const tokenRemainder0 = checkedRem(lpTokenAmount.mul(swapTokenAmount0), lpTokenSupply);\n\n      if (tokenRemainder0.gt(ZERO) && tokenAmount0.gt(ZERO)) {\n        tokenAmount0 = tokenAmount0.add(new BN(1));\n      }\n\n      const token1Remainder = checkedRem(lpTokenAmount.mul(swapTokenAmount1), lpTokenSupply);\n\n      if (token1Remainder.gt(ZERO) && tokenAmount1.gt(ZERO)) {\n        tokenAmount1 = tokenAmount1.add(new BN(1));\n      }\n\n      return { tokenAmount0, tokenAmount1 };\n    }\n    throw Error(\"roundDirection value error\");\n  }\n}\n","import BN from \"bn.js\";\n\nexport const FEE_RATE_DENOMINATOR_VALUE = new BN(1_000_000);\n\nexport function ceilDiv(tokenAmount: BN, feeNumerator: BN, feeDenominator: BN): BN {\n  return tokenAmount.mul(feeNumerator).add(feeDenominator).sub(new BN(1)).div(feeDenominator);\n}\n\nexport function floorDiv(tokenAmount: BN, feeNumerator: BN, feeDenominator: BN): BN {\n  return tokenAmount.mul(feeNumerator).div(feeDenominator);\n}\n\nexport class CpmmFee {\n  static tradingFee(amount: BN, tradeFeeRate: BN): BN {\n    return ceilDiv(amount, tradeFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n  }\n  static protocolFee(amount: BN, protocolFeeRate: BN): BN {\n    return floorDiv(amount, protocolFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n  }\n  static fundFee(amount: BN, fundFeeRate: BN): BN {\n    return floorDiv(amount, fundFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n  }\n}\n"],"mappings":";AAAA;;;ACAA;AAEO,IAAM,6BAA6B,IAAI,GAAG,GAAS;;;ADC1D,oBAAoB,UAAc,SAAiB;AACjD,MAAI,QAAQ,OAAO;AAAG,UAAM,MAAM,iBAAiB;AAEnD,QAAM,SAAS,SAAS,IAAI,OAAO;AACnC,SAAO;AACT;AAEA,wBAAwB,UAAc,KAAe;AACnD,MAAI,IAAI,OAAO;AAAG,UAAM,MAAM,aAAa;AAE3C,MAAI,WAAW,SAAS,IAAI,GAAG;AAE/B,MAAI,SAAS,OAAO;AAAG,UAAM,MAAM,kBAAkB;AAErD,MAAI,YAAY,WAAW,UAAU,GAAG;AAExC,MAAI,UAAU,GAAG,IAAI,GAAG;AACtB,eAAW,SAAS,IAAI,IAAI,IAAG,CAAC,CAAC;AAEjC,UAAM,SAAS,IAAI,QAAQ;AAC3B,gBAAY,WAAW,UAAU,QAAQ;AACzC,QAAI,UAAU,GAAG,IAAI,GAAG;AACtB,YAAM,IAAI,IAAI,IAAI,IAAG,CAAC,CAAC;AAAA,IACzB;AAAA,EACF;AACA,SAAO,CAAC,UAAU,GAAG;AACvB;AAEA,IAAM,OAAO,IAAI,IAAG,CAAC;AAEd,iCAA2B;AAAA,SACzB,gBAAgB,cAAkB,kBAAsB,uBAAkD;AAC/G,UAAM,YAAY,iBAAiB,IAAI,qBAAqB;AAE5D,UAAM,sBAAsB,iBAAiB,IAAI,YAAY;AAC7D,UAAM,CAAC,0BAA0B,wBAAwB,eAAe,WAAW,mBAAmB;AAEtG,UAAM,sBAAsB,qBAAqB,IAAI,gBAAgB;AACrE,UAAM,2BAA2B,sBAAsB,IAAI,wBAAwB;AACnF,QAAI,yBAAyB,OAAO;AAAG,YAAM,MAAM,kCAAkC;AAErF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,SAEO,wBACL,eACA,eACA,kBACA,kBACA,gBACoB;AACpB,QAAI,eAAe,cAAc,IAAI,gBAAgB,EAAE,IAAI,aAAa;AACxE,QAAI,eAAe,cAAc,IAAI,gBAAgB,EAAE,IAAI,aAAa;AAExE,QAAI,mBAAmB,eAAsB;AAC3C,aAAO,EAAE,cAAc,aAAa;AAAA,IACtC,WAAW,mBAAmB,iBAAwB;AACpD,YAAM,kBAAkB,WAAW,cAAc,IAAI,gBAAgB,GAAG,aAAa;AAErF,UAAI,gBAAgB,GAAG,IAAI,KAAK,aAAa,GAAG,IAAI,GAAG;AACrD,uBAAe,aAAa,IAAI,IAAI,IAAG,CAAC,CAAC;AAAA,MAC3C;AAEA,YAAM,kBAAkB,WAAW,cAAc,IAAI,gBAAgB,GAAG,aAAa;AAErF,UAAI,gBAAgB,GAAG,IAAI,KAAK,aAAa,GAAG,IAAI,GAAG;AACrD,uBAAe,aAAa,IAAI,IAAI,IAAG,CAAC,CAAC;AAAA,MAC3C;AAEA,aAAO,EAAE,cAAc,aAAa;AAAA,IACtC;AACA,UAAM,MAAM,4BAA4B;AAAA,EAC1C;AACF;","names":[]}