import { ethers } from "ethers";
const provider = new ethers.BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
const FACTORY = "0x5F65Df9DCf7d764CA9d319Baf89611d289546A81";
const factory = new ethers.Contract(FACTORY, [
"function buy(address token, uint256 minTokensOut) payable",
"function sell(address token, uint256 tokenAmount, uint256 minKasOut)",
"function getTokenInfo(address token) view returns (tuple(uint256 tokenId, address creator, address pool, uint256 tokenReserves, uint256 kasReserves, uint256 createdAt, bool fulfilled, bool graduated, string metadataUri, uint256 paramVersion))",
"function getTokenParamVersion(address token) view returns (tuple(uint256 graduationThreshold, uint256 virtualToken, uint256 virtualKas, uint160 sqrtPriceX96Token0, uint160 sqrtPriceX96Token1, bool active))",
"function bondingCurve() view returns (address)",
], signer);
// Get BondingCurve address
const bcAddress = await factory.bondingCurve();
const bc = new ethers.Contract(bcAddress, [
"function calculateBuyReturnWithParams(uint256,uint256,uint256,uint256,uint256) pure returns (uint256)",
"function calculateSellReturnWithParams(uint256,uint256,uint256,uint256,uint256) pure returns (uint256)",
], provider);
const TOKEN = "0x..."; // your token address
// Read current state
const info = await factory.getTokenInfo(TOKEN);
const params = await factory.getTokenParamVersion(TOKEN);
// --- BUY ---
const kasIn = ethers.parseEther("100");
const buyReturn = await bc.calculateBuyReturnWithParams(
kasIn,
info.tokenReserves,
info.kasReserves,
params.virtualToken,
params.virtualKas
);
const minTokens = buyReturn * 80n / 100n; // 20% slippage
const buyTx = await factory.buy(TOKEN, minTokens, { value: kasIn });
await buyTx.wait();
// --- SELL ---
const tokensIn = ethers.parseEther("500000");
const sellReturn = await bc.calculateSellReturnWithParams(
tokensIn,
info.tokenReserves,
info.kasReserves,
params.virtualToken,
params.virtualKas
);
const minKas = sellReturn * 80n / 100n; // 20% slippage
// Approve first
const token = new ethers.Contract(TOKEN, [
"function approve(address,uint256) returns (bool)",
], signer);
await (await token.approve(FACTORY, tokensIn)).wait();
const sellTx = await factory.sell(TOKEN, tokensIn, minKas);
await sellTx.wait();