{"version":3,"file":"bondingCurveAccount.mjs","sources":["../../../src/bondingCurveAccount.ts"],"sourcesContent":["import { struct, bool, u64, Layout } from \"@coral-xyz/borsh\";\n\nexport class BondingCurveAccount {\n  public discriminator: bigint;\n  public virtualTokenReserves: bigint;\n  public virtualSolReserves: bigint;\n  public realTokenReserves: bigint;\n  public realSolReserves: bigint;\n  public tokenTotalSupply: bigint;\n  public complete: boolean;\n\n  constructor(\n    discriminator: bigint,\n    virtualTokenReserves: bigint,\n    virtualSolReserves: bigint,\n    realTokenReserves: bigint,\n    realSolReserves: bigint,\n    tokenTotalSupply: bigint,\n    complete: boolean\n  ) {\n    this.discriminator = discriminator;\n    this.virtualTokenReserves = virtualTokenReserves;\n    this.virtualSolReserves = virtualSolReserves;\n    this.realTokenReserves = realTokenReserves;\n    this.realSolReserves = realSolReserves;\n    this.tokenTotalSupply = tokenTotalSupply;\n    this.complete = complete;\n  }\n\n  getBuyPrice(amount: bigint): bigint {\n    if (this.complete) {\n      throw new Error(\"Curve is complete\");\n    }\n\n    if (amount <= 0n) {\n      return 0n;\n    }\n\n    // Calculate the product of virtual reserves\n    let n = this.virtualSolReserves * this.virtualTokenReserves;\n\n    // Calculate the new virtual sol reserves after the purchase\n    let i = this.virtualSolReserves + amount;\n\n    // Calculate the new virtual token reserves after the purchase\n    let r = n / i + 1n;\n\n    // Calculate the amount of tokens to be purchased\n    let s = this.virtualTokenReserves - r;\n\n    // Return the minimum of the calculated tokens and real token reserves\n    return s < this.realTokenReserves ? s : this.realTokenReserves;\n  }\n\n  getSellPrice(amount: bigint, feeBasisPoints: bigint): bigint {\n    if (this.complete) {\n      throw new Error(\"Curve is complete\");\n    }\n\n    if (amount <= 0n) {\n      return 0n;\n    }\n\n    // Calculate the proportional amount of virtual sol reserves to be received\n    let n =\n      (amount * this.virtualSolReserves) / (this.virtualTokenReserves + amount);\n\n    // Calculate the fee amount in the same units\n    let a = (n * feeBasisPoints) / 10000n;\n\n    // Return the net amount after deducting the fee\n    return n - a;\n  }\n\n  getMarketCapSOL(): bigint {\n    if (this.virtualTokenReserves === 0n) {\n      return 0n;\n    }\n\n    return (\n      (this.tokenTotalSupply * this.virtualSolReserves) /\n      this.virtualTokenReserves\n    );\n  }\n\n  getFinalMarketCapSOL(feeBasisPoints: bigint): bigint {\n    let totalSellValue = this.getBuyOutPrice(\n      this.realTokenReserves,\n      feeBasisPoints\n    );\n    let totalVirtualValue = this.virtualSolReserves + totalSellValue;\n    let totalVirtualTokens = this.virtualTokenReserves - this.realTokenReserves;\n\n    if (totalVirtualTokens === 0n) {\n      return 0n;\n    }\n\n    return (this.tokenTotalSupply * totalVirtualValue) / totalVirtualTokens;\n  }\n\n  getBuyOutPrice(amount: bigint, feeBasisPoints: bigint): bigint {\n    let solTokens =\n      amount < this.virtualTokenReserves ? this.virtualTokenReserves : amount;\n    let totalSellValue =\n      (solTokens * this.virtualSolReserves) /\n        (this.virtualTokenReserves - solTokens) +\n      1n;\n    let fee = (totalSellValue * feeBasisPoints) / 10000n;\n    return totalSellValue + fee;\n  }\n\n  public static fromBuffer(buffer: Buffer): BondingCurveAccount {\n    const structure: Layout<BondingCurveAccount> = struct([\n      u64(\"discriminator\"),\n      u64(\"virtualTokenReserves\"),\n      u64(\"virtualSolReserves\"),\n      u64(\"realTokenReserves\"),\n      u64(\"realSolReserves\"),\n      u64(\"tokenTotalSupply\"),\n      bool(\"complete\"),\n    ]);\n\n    let value = structure.decode(buffer);\n    return new BondingCurveAccount(\n      BigInt(value.discriminator),\n      BigInt(value.virtualTokenReserves),\n      BigInt(value.virtualSolReserves),\n      BigInt(value.realTokenReserves),\n      BigInt(value.realSolReserves),\n      BigInt(value.tokenTotalSupply),\n      value.complete\n    );\n  }\n}\n"],"names":[],"mappings":"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"}