# launch:quote — Ammora SDK 0.3.8 npm run launch:quote -- [buy|sell ] [Read in Docs](https://docs.ammora.org/examples?command=launch%3Aquote) · [Detailed guide](https://docs.ammora.org/guides/launchpad) · [Local setup](https://docs.ammora.org/guides/example-setup) ## Context and execution GIWA Sepolia 91342. Public SDK 0.3.8, Math 0.3.0. Source revision: `a9b3fd798fa51495e8defec99a25de59e4d70672`. Install the SDK in your app, or prepare the example project using the local setup guide for its npm commands. Review the entry source and guide for required arguments, roles and deployment selection. `AMMORA_SEND=0` does not turn send-only commands into previews. Never put CLI keys in a browser or resend an uncertain transaction. Command: `npm run launch:quote -- ` (`tsx src/launch/quote-curve.ts`). Omit `--` and arguments when the source accepts none. ## Entry file: `src/launch/quote-curve.ts` ```typescript /** npm run launch:quote -- [buy|sell ] */ import { AMMORA_FEE_POLICY_VERSION, AmmoraV4LaunchCurveClient, ammoraLaunchFactoryV4Abi, verifyAmmoraV4CoreAtBlock, } from "@ammora-protocol/sdk"; import { zeroAddress } from "viem"; import { address, readBlock, reader, v4Deployment } from "../shared/env.js"; import { printJson, rawAmount } from "../shared/input.js"; import { main } from "../shared/run.js"; import { readCurveQuote } from "./curve-quote.js"; main(async () => { const [curveArg, direction, raw, ...extra] = process.argv.slice(2); if (!curveArg || extra.length || (direction !== undefined && direction !== "buy" && direction !== "sell")) { throw new Error("usage: [buy|sell ]"); } const curve = address("AMMORA_LAUNCH_CURVE", curveArg); const request = direction ? { amountIn: rawAmount(raw, "amountInRaw"), baseForQuote: direction === "sell" } : undefined; const client = await reader(); const launch = v4Deployment().contracts.launch; const core = { configRegistry: launch.configRegistry, launchFactory: launch.factory, graduationAdapter: launch.graduationAdapter, feePolicy: launch.feePolicy }; const block = await readBlock(client); await verifyAmmoraV4CoreAtBlock(client, core, block.number); const code = await client.getCode({ address: curve, blockNumber: block.number }); if (!code || code === "0x") throw new Error(`No curve at snapshot block ${block.number}. For a new launch, set AMMORA_READ_RECEIPT to its confirmed creation hash, or wait for the reviewed confirmation window.`); const sdk = new AmmoraV4LaunchCurveClient(client, curve, core); const result = await readCurveQuote(sdk, block.number, request); // Raw state/quote methods alone do not authenticate a curve. Bind it to the // reviewed factory and immutable policy at that same block before displaying it. const factoryToken = await client.readContract({ address: launch.factory, abi: ammoraLaunchFactoryV4Abi, functionName: "tokenForCurve", args: [curve], blockNumber: block.number }); if (factoryToken === zeroAddress || factoryToken.toLowerCase() !== result.state.baseToken.toLowerCase() || result.state.feePolicy.toLowerCase() !== launch.feePolicy.toLowerCase() || result.state.feePolicyVersion !== AMMORA_FEE_POLICY_VERSION) { throw new Error("curve is not bound to the reviewed V4 factory and fee policy"); } printJson({ curve, blockNumber: block.number, blockHash: block.hash, snapshot: block.snapshot, direction: direction ?? null, ...result, note: result.state.status === 1 ? "Read-only snapshot. Re-quote and simulate before signing; partial sells remain strict." : "Curve is not active; no curve trade quoted. ReadyToMigrate requires a separate migration; after graduation use canonicalPool.", }); }); ``` ## Supporting files Keep relative paths intact. Local imports are listed recursively; JSON templates are choices to review, not approved inputs. Runtime-selected files and wallet/environment setup still follow the detailed guide. - [src/launch/curve-quote.ts](https://docs.ammora.org/examples/source/src/launch/curve-quote.ts.txt) - [src/shared/env.ts](https://docs.ammora.org/examples/source/src/shared/env.ts.txt) - [src/shared/input.ts](https://docs.ammora.org/examples/source/src/shared/input.ts.txt) - [src/shared/retry.ts](https://docs.ammora.org/examples/source/src/shared/retry.ts.txt) - [src/shared/rpc.ts](https://docs.ammora.org/examples/source/src/shared/rpc.ts.txt) - [src/shared/run.ts](https://docs.ammora.org/examples/source/src/shared/run.ts.txt) - [src/launch/config-document.example.json](https://docs.ammora.org/examples/source/src/launch/config-document.example.json.txt) - [src/launch/team/fees.example.json](https://docs.ammora.org/examples/source/src/launch/team/fees.example.json.txt) - [src/launch/team/recipients.example.json](https://docs.ammora.org/examples/source/src/launch/team/recipients.example.json.txt) - [package.json](https://docs.ammora.org/examples/source/package.json.txt) - [package-lock.json](https://docs.ammora.org/examples/source/package-lock.json.txt) - [tsconfig.json](https://docs.ammora.org/examples/source/tsconfig.json.txt) - [.env.giwa.example](https://docs.ammora.org/examples/source/file.env.giwa.example.txt) - [.nvmrc](https://docs.ammora.org/examples/source/file.nvmrc.txt) ## AI implementation checklist Use the actual SDK exports and parameter types in the linked files. Start with reads and unsigned plans where supported. Use a connected wallet for browser signing. Preserve raw integer units, exact approvals, caller authority, deadlines and receipt reconciliation. Report local checks separately from live-chain verification.