Developer Quickstart 
Kick-start integrations with the Twin.fun bonding curve contract using ethers v6.
Setup 
- Install dependencies (ethers v6 recommended).
- Configure RPC access for Base Sepolia and/or mainnet deployments.
- Import the ABI for DigitalTwinSharesV1.
Read Price & Buy (ethers v6) 
ts
import { ethers } from "ethers";
import abi from "./DigitalTwinSharesV1.abi.json";
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL!);
const wallet   = new ethers.Wallet(process.env.PRIVATE_KEY!, provider);
const addr     = "0x065fb766051c9a212218c9D5e8a9B83fb555C17c"; // Base Sepolia
const c        = new ethers.Contract(addr, abi, wallet);
const id = "0x85f4f72079114bfcac1003134e5424f4"; // bytes16
await (async () => {
  const amount   = 1n;
  const price    = await c.getBuyPrice(id, amount);
  const feeP     = await c.protocolFeePercent();
  const feeS     = await c.subjectFeePercent();
  const protocol = (price * feeP) / (10n ** 18n);
  const subject  = (price * feeS) / (10n ** 18n);
  const value    = price + protocol + subject;
  const tx = await c.buyShares(id, amount, { value });
  await tx.wait();
})();Sell & Estimate Proceeds 
ts
const amount = 1n;
const after  = await c.getSellPriceAfterFee(id, amount);
const tx     = await c.sellShares(id, amount);
await tx.wait();Common Errors & Fixes 
- Insufficient value: compute getBuyPriceAfterFeeand send the exactmsg.value.
- Creation guard: at zero supply, amountmust be ≥minSharesToCreate.
- Owner required: the twin is pre-claimed; the mapped owner must perform the first buy.
