{"version":3,"file":"BondingCurveAccount.mjs","sources":["../../../src/BondingCurveAccount.ts"],"sourcesContent":["import { struct, bool, u64, Layout } from \"@coral-xyz/borsh\";\r\n\r\nexport class BondingCurveAccount {\r\n  public discriminator: bigint;\r\n  public virtualTokenReserves: bigint;\r\n  public virtualSolReserves: bigint;\r\n  public realTokenReserves: bigint;\r\n  public realSolReserves: bigint;\r\n  public tokenTotalSupply: bigint;\r\n  public complete: boolean;\r\n\r\n  constructor(\r\n    discriminator: bigint,\r\n    virtualTokenReserves: bigint,\r\n    virtualSolReserves: bigint,\r\n    realTokenReserves: bigint,\r\n    realSolReserves: bigint,\r\n    tokenTotalSupply: bigint,\r\n    complete: boolean\r\n  ) {\r\n    this.discriminator = discriminator;\r\n    this.virtualTokenReserves = virtualTokenReserves;\r\n    this.virtualSolReserves = virtualSolReserves;\r\n    this.realTokenReserves = realTokenReserves;\r\n    this.realSolReserves = realSolReserves;\r\n    this.tokenTotalSupply = tokenTotalSupply;\r\n    this.complete = complete;\r\n  }\r\n\r\n  getBuyPrice(amount: bigint): bigint {\r\n    if (this.complete) {\r\n      throw new Error(\"Curve is complete\");\r\n    }\r\n\r\n    if (amount <= 0n) {\r\n      return 0n;\r\n    }\r\n\r\n    // Calculate the product of virtual reserves\r\n    let n = this.virtualSolReserves * this.virtualTokenReserves;\r\n\r\n    // Calculate the new virtual sol reserves after the purchase\r\n    let i = this.virtualSolReserves + amount;\r\n\r\n    // Calculate the new virtual token reserves after the purchase\r\n    let r = n / i + 1n;\r\n\r\n    // Calculate the amount of tokens to be purchased\r\n    let s = this.virtualTokenReserves - r;\r\n\r\n    // Return the minimum of the calculated tokens and real token reserves\r\n    return s < this.realTokenReserves ? s : this.realTokenReserves;\r\n  }\r\n\r\n  getSellPrice(amount: bigint, feeBasisPoints: bigint): bigint {\r\n    if (this.complete) {\r\n      throw new Error(\"Curve is complete\");\r\n    }\r\n\r\n    if (amount <= 0n) {\r\n      return 0n;\r\n    }\r\n\r\n    // Calculate the proportional amount of virtual sol reserves to be received\r\n    let n =\r\n      (amount * this.virtualSolReserves) / (this.virtualTokenReserves + amount);\r\n\r\n    // Calculate the fee amount in the same units\r\n    let a = (n * feeBasisPoints) / 10000n;\r\n\r\n    // Return the net amount after deducting the fee\r\n    return n - a;\r\n  }\r\n\r\n  getMarketCapSOL(): bigint {\r\n    if (this.virtualTokenReserves === 0n) {\r\n      return 0n;\r\n    }\r\n\r\n    return (\r\n      (this.tokenTotalSupply * this.virtualSolReserves) /\r\n      this.virtualTokenReserves\r\n    );\r\n  }\r\n\r\n  getFinalMarketCapSOL(feeBasisPoints: bigint): bigint {\r\n    let totalSellValue = this.getBuyOutPrice(\r\n      this.realTokenReserves,\r\n      feeBasisPoints\r\n    );\r\n    let totalVirtualValue = this.virtualSolReserves + totalSellValue;\r\n    let totalVirtualTokens = this.virtualTokenReserves - this.realTokenReserves;\r\n\r\n    if (totalVirtualTokens === 0n) {\r\n      return 0n;\r\n    }\r\n\r\n    return (this.tokenTotalSupply * totalVirtualValue) / totalVirtualTokens;\r\n  }\r\n\r\n  getBuyOutPrice(amount: bigint, feeBasisPoints: bigint): bigint {\r\n    let solTokens =\r\n      amount < this.virtualTokenReserves ? this.virtualTokenReserves : amount;\r\n    let totalSellValue =\r\n      (solTokens * this.virtualSolReserves) /\r\n        (this.virtualTokenReserves - solTokens) +\r\n      1n;\r\n    let fee = (totalSellValue * feeBasisPoints) / 10000n;\r\n    return totalSellValue + fee;\r\n  }\r\n\r\n  public static fromBuffer(buffer: Buffer): BondingCurveAccount {\r\n    const structure: Layout<BondingCurveAccount> = struct([\r\n      u64(\"discriminator\"),\r\n      u64(\"virtualTokenReserves\"),\r\n      u64(\"virtualSolReserves\"),\r\n      u64(\"realTokenReserves\"),\r\n      u64(\"realSolReserves\"),\r\n      u64(\"tokenTotalSupply\"),\r\n      bool(\"complete\"),\r\n    ]);\r\n\r\n    let value = structure.decode(buffer);\r\n    return new BondingCurveAccount(\r\n      BigInt(value.discriminator),\r\n      BigInt(value.virtualTokenReserves),\r\n      BigInt(value.virtualSolReserves),\r\n      BigInt(value.realTokenReserves),\r\n      BigInt(value.realSolReserves),\r\n      BigInt(value.tokenTotalSupply),\r\n      value.complete\r\n    );\r\n  }\r\n}\r\n"],"names":[],"mappings":";;MAEa,mBAAmB,CAAA;AACvB,IAAA,aAAa;AACb,IAAA,oBAAoB;AACpB,IAAA,kBAAkB;AAClB,IAAA,iBAAiB;AACjB,IAAA,eAAe;AACf,IAAA,gBAAgB;AAChB,IAAA,QAAQ;AAEf,IAAA,WAAA,CACE,aAAqB,EACrB,oBAA4B,EAC5B,kBAA0B,EAC1B,iBAAyB,EACzB,eAAuB,EACvB,gBAAwB,EACxB,QAAiB,EAAA;AAEjB,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa;AAClC,QAAA,IAAI,CAAC,oBAAoB,GAAG,oBAAoB;AAChD,QAAA,IAAI,CAAC,kBAAkB,GAAG,kBAAkB;AAC5C,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB;AAC1C,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe;AACtC,QAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB;AACxC,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;;AAG1B,IAAA,WAAW,CAAC,MAAc,EAAA;AACxB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;;AAGtC,QAAA,IAAI,MAAM,IAAI,EAAE,EAAE;AAChB,YAAA,OAAO,EAAE;;;QAIX,IAAI,CAAC,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,oBAAoB;;AAG3D,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,kBAAkB,GAAG,MAAM;;AAGxC,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;;AAGlB,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,GAAG,CAAC;;AAGrC,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,iBAAiB;;IAGhE,YAAY,CAAC,MAAc,EAAE,cAAsB,EAAA;AACjD,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;;AAGtC,QAAA,IAAI,MAAM,IAAI,EAAE,EAAE;AAChB,YAAA,OAAO,EAAE;;;AAIX,QAAA,IAAI,CAAC,GACH,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC;;QAG3E,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,IAAI,MAAM;;QAGrC,OAAO,CAAC,GAAG,CAAC;;IAGd,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,oBAAoB,KAAK,EAAE,EAAE;AACpC,YAAA,OAAO,EAAE;;QAGX,QACE,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,kBAAkB;YAChD,IAAI,CAAC,oBAAoB;;AAI7B,IAAA,oBAAoB,CAAC,cAAsB,EAAA;AACzC,QAAA,IAAI,cAAc,GAAG,IAAI,CAAC,cAAc,CACtC,IAAI,CAAC,iBAAiB,EACtB,cAAc,CACf;AACD,QAAA,IAAI,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,GAAG,cAAc;QAChE,IAAI,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,iBAAiB;AAE3E,QAAA,IAAI,kBAAkB,KAAK,EAAE,EAAE;AAC7B,YAAA,OAAO,EAAE;;QAGX,OAAO,CAAC,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,IAAI,kBAAkB;;IAGzE,cAAc,CAAC,MAAc,EAAE,cAAsB,EAAA;AACnD,QAAA,IAAI,SAAS,GACX,MAAM,GAAG,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,GAAG,MAAM;QACzE,IAAI,cAAc,GAChB,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB;AAClC,aAAC,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;AACzC,YAAA,EAAE;QACJ,IAAI,GAAG,GAAG,CAAC,cAAc,GAAG,cAAc,IAAI,MAAM;QACpD,OAAO,cAAc,GAAG,GAAG;;IAGtB,OAAO,UAAU,CAAC,MAAc,EAAA;QACrC,MAAM,SAAS,GAAgC,MAAM,CAAC;YACpD,GAAG,CAAC,eAAe,CAAC;YACpB,GAAG,CAAC,sBAAsB,CAAC;YAC3B,GAAG,CAAC,oBAAoB,CAAC;YACzB,GAAG,CAAC,mBAAmB,CAAC;YACxB,GAAG,CAAC,iBAAiB,CAAC;YACtB,GAAG,CAAC,kBAAkB,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC;AACjB,SAAA,CAAC;QAEF,IAAI,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;QACpC,OAAO,IAAI,mBAAmB,CAC5B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAC3B,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAClC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAChC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAC/B,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,EAC7B,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAC9B,KAAK,CAAC,QAAQ,CACf;;AAEJ;;;;"}