import { describe, it, expect } from "vitest"; import { computeFeeBreakdown } from "./fee.js"; const TREASURY = "6dNVUMrJ8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8"; describe("computeFeeBreakdown", () => { it("takes a 5% base fee of the gross (500 bps of 1_000_000 = 50_000; net 950_000)", () => { const fee = computeFeeBreakdown({ grossLamports: 1_000_000n, feeBps: 500, treasury: TREASURY, }); expect(fee.grossLamports).toBe("1000000"); expect(fee.feeBps).toBe(500); expect(fee.feeLamports).toBe("50000"); expect(fee.totalToTreasuryLamports).toBe("50000"); expect(fee.netToUserLamports).toBe("950000"); expect(fee.treasury).toBe(TREASURY); // No contribution requested → fields omitted. expect(fee.contributionBps).toBeUndefined(); expect(fee.contributionLamports).toBeUndefined(); }); it("adds an optional contribution on top of the base fee", () => { const fee = computeFeeBreakdown({ grossLamports: 1_000_000n, feeBps: 500, // 50_000 contributionBps: 200, // 20_000 treasury: TREASURY, }); expect(fee.feeLamports).toBe("50000"); expect(fee.contributionBps).toBe(200); expect(fee.contributionLamports).toBe("20000"); expect(fee.totalToTreasuryLamports).toBe("70000"); expect(fee.netToUserLamports).toBe("930000"); }); it("caps the contribution at maxContributionBps", () => { const fee = computeFeeBreakdown({ grossLamports: 1_000_000n, feeBps: 500, contributionBps: 5_000, // requested 50% maxContributionBps: 300, // capped to 3% = 30_000 treasury: TREASURY, }); expect(fee.contributionBps).toBe(300); expect(fee.contributionLamports).toBe("30000"); expect(fee.totalToTreasuryLamports).toBe("80000"); // 50_000 + 30_000 expect(fee.netToUserLamports).toBe("920000"); }); it("never lets the total exceed gross (net is never negative)", () => { const fee = computeFeeBreakdown({ grossLamports: 1_000_000n, feeBps: 9_000, // 90% contributionBps: 9_000, // +90% → would be 180% of gross maxContributionBps: 10_000, treasury: TREASURY, }); expect(BigInt(fee.totalToTreasuryLamports)).toBeLessThanOrEqual(1_000_000n); expect(fee.totalToTreasuryLamports).toBe("1000000"); expect(fee.netToUserLamports).toBe("0"); expect(BigInt(fee.netToUserLamports)).toBeGreaterThanOrEqual(0n); }); it("0 bps → 0 fee, full amount to the user", () => { const fee = computeFeeBreakdown({ grossLamports: 1_000_000n, feeBps: 0, treasury: TREASURY, }); expect(fee.feeLamports).toBe("0"); expect(fee.totalToTreasuryLamports).toBe("0"); expect(fee.netToUserLamports).toBe("1000000"); }); it("accepts a string gross and stays exact for large u64 values", () => { const fee = computeFeeBreakdown({ grossLamports: "18446744073709551615", // u64 max feeBps: 500, treasury: TREASURY, }); expect(fee.grossLamports).toBe("18446744073709551615"); // 5% of u64 max, BigInt-exact. expect(fee.feeLamports).toBe("922337203685477580"); }); });