{"version":3,"file":"amm.mjs","sources":["../../../src/amm.ts"],"sourcesContent":["import { BondingCurveAccount } from \"./bondingCurveAccount.js\";\nimport { GlobalAccount } from \"./globalAccount.js\";\n\nexport type BuyResult = {\n    token_amount: bigint;\n    sol_amount: bigint;\n};\n\nexport type SellResult = {\n    token_amount: bigint;\n    sol_amount: bigint;\n};\n\nexport class AMM {\n    constructor(\n        public virtualSolReserves: bigint,\n        public virtualTokenReserves: bigint,\n        public realSolReserves: bigint,\n        public realTokenReserves: bigint,\n        public initialVirtualTokenReserves: bigint\n    ) {}\n\n    static fromGlobalAccount(global: GlobalAccount): AMM {\n        return new AMM(\n            global.initialVirtualSolReserves,\n            global.initialVirtualTokenReserves,\n            0n,\n            global.initialRealTokenReserves,\n            global.initialVirtualTokenReserves\n        );\n    }\n\n    static fromBondingCurveAccount(bonding_curve: BondingCurveAccount, initialVirtualTokenReserves: bigint): AMM {\n        return new AMM(\n            bonding_curve.virtualSolReserves,\n            bonding_curve.virtualTokenReserves,\n            bonding_curve.realSolReserves,\n            bonding_curve.realTokenReserves,\n            initialVirtualTokenReserves\n        );\n    }\n\n    getBuyPrice(tokens: bigint): bigint {\n        const product_of_reserves = this.virtualSolReserves * this.virtualTokenReserves;\n        const new_virtual_token_reserves = this.virtualTokenReserves - tokens;\n        const new_virtual_sol_reserves = product_of_reserves / new_virtual_token_reserves + 1n;\n        const amount_needed = new_virtual_sol_reserves > this.virtualSolReserves ? new_virtual_sol_reserves - this.virtualSolReserves : 0n;\n        return amount_needed > 0n ? amount_needed : 0n;\n    }\n\n    applyBuy(token_amount: bigint): BuyResult {\n        const final_token_amount = token_amount > this.realTokenReserves ? this.realTokenReserves : token_amount;\n        const sol_amount = this.getBuyPrice(final_token_amount);\n\n        this.virtualTokenReserves = this.virtualTokenReserves - final_token_amount;\n        this.realTokenReserves = this.realTokenReserves - final_token_amount;\n\n        this.virtualSolReserves = this.virtualSolReserves + sol_amount;\n        this.realSolReserves = this.realSolReserves + sol_amount;\n\n        return {\n            token_amount: final_token_amount,\n            sol_amount: sol_amount\n        }\n    }\n\n    applySell(token_amount: bigint): SellResult {\n        this.virtualTokenReserves = this.virtualTokenReserves + token_amount;\n        this.realTokenReserves = this.realTokenReserves + token_amount;\n\n        const sell_price = this.getSellPrice(token_amount);\n\n        this.virtualSolReserves = this.virtualSolReserves - sell_price;\n        this.realSolReserves = this.realSolReserves - sell_price;\n\n        return {\n            token_amount: token_amount,\n            sol_amount: sell_price\n        }\n    }\n\n    getSellPrice(tokens: bigint): bigint {\n        const scaling_factor = this.initialVirtualTokenReserves;\n        const token_sell_proportion = (tokens * scaling_factor) / this.virtualTokenReserves;\n        const sol_received = (this.virtualSolReserves * token_sell_proportion) / scaling_factor;\n        return sol_received < this.realSolReserves ? sol_received : this.realSolReserves;\n    }\n}"],"names":[],"mappings":"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"}