# launch:quick-create — Ammora SDK 0.3.8 Create an immutable Config and launch a token in one transaction. npm run launch:quick-create -- This is the public Quick Create path. It is permissionless, but it is not a reduced-security encoder: the connected client verifies the shared factory, registry, one-shot forwarder and optional callback before returning a plan. The receipt remains canonical if another Config is created between planning and inclusion, so the example resolves both the final Config identity and the launched token addresses from that receipt. [Read in Docs](https://docs.ammora.org/examples?command=launch%3Aquick-create) · [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:quick-create -- ` (`tsx src/launch/quick-create.ts`). Omit `--` and arguments when the source accepts none. ## Entry file: `src/launch/quick-create.ts` ```typescript /** * Create an immutable Config and launch a token in one transaction. * * npm run launch:quick-create -- * * This is the public Quick Create path. It is permissionless, but it is not a * reduced-security encoder: the connected client verifies the shared factory, * registry, one-shot forwarder and optional callback before returning a plan. * The receipt remains canonical if another Config is created between planning * and inclusion, so the example resolves both the final Config identity and the * launched token addresses from that receipt. */ import { buildRegisterConfigAndCreateAmmoraV4Launch, getAmmoraV4ConfigAtBlock, parseAmmoraV4ConfigCreatedReceipt, parseAmmoraV4LaunchCreatedReceipt, verifyAmmoraV4CoreAtBlock, } from "@ammora-protocol/sdk"; import { zeroAddress } from "viem"; import { readBlock, reader, signer, v4Deployment } from "../shared/env.js"; import { main, send } from "../shared/run.js"; import { deriveConfigFromTemplate } from "./config-from-template.js"; main(async () => { const [ templateArgument, supplyArgument, thresholdArgument, name, symbol, metadataURI, ] = process.argv.slice(2); if ( !templateArgument || !supplyArgument || !thresholdArgument || !name || !symbol || !metadataURI ) { throw new Error( "usage: ", ); } if (!/^\d+$/.test(templateArgument)) { throw new Error("template config id must be a positive integer"); } const { wallet, account } = signer(); const client = await reader(); const contracts = v4Deployment().contracts.launch; const { number: snapshotBlock } = await readBlock(client); await verifyAmmoraV4CoreAtBlock(client, { configRegistry: contracts.configRegistry, launchFactory: contracts.factory, graduationAdapter: contracts.graduationAdapter, feePolicy: contracts.feePolicy, }, snapshotBlock); const template = await getAmmoraV4ConfigAtBlock( client, contracts.configRegistry, BigInt(templateArgument), snapshotBlock, ); if (!template.enabled) throw new Error(`template Config #${templateArgument} is disabled`); const { config, curve } = deriveConfigFromTemplate( template, BigInt(supplyArgument), BigInt(thresholdArgument), ); const transaction = buildRegisterConfigAndCreateAmmoraV4Launch(config, curve, { name, symbol, metadataURI, creatorMetadataURI: metadataURI, tokenDecimals: config.tokenDecimals, callback: zeroAddress, callbackData: "0x", }); console.log(`factory ${contracts.factory}`); console.log(`registry ${contracts.configRegistry}`); console.log(`template #${templateArgument}`); console.log(`owner ${account.address}`); console.log(`feeClaimer ${config.partnerRecipient}`); console.log(`totalSupply ${config.totalSupply}`); console.log(`migrationBase ${config.migrationBaseThreshold}`); console.log(`value ${transaction.value} wei`); console.log(""); const hash = await send( "quick create Config and launch", { to: contracts.factory, ...transaction }, wallet, account, client, ); const receipt = await client.getTransactionReceipt({ hash }); const created = parseAmmoraV4ConfigCreatedReceipt(receipt, contracts.configRegistry); const launch = parseAmmoraV4LaunchCreatedReceipt(receipt, contracts.factory); const confirmed = await getAmmoraV4ConfigAtBlock( client, contracts.configRegistry, created.configId, receipt.blockNumber, ); if (launch.configId !== created.configId || launch.configHash !== created.configHash || confirmed.configHash !== created.configHash || confirmed.identity.owner.toLowerCase() !== account.address.toLowerCase()) { throw new Error("atomic V4 Quick Create receipt does not match confirmed registry state"); } console.log(""); console.log(`config #${created.configId}`); console.log(`hash ${created.configHash}`); console.log(`owner ${created.owner}`); console.log(`feeClaimer ${created.feeClaimer}`); console.log(`token ${launch.token}`); console.log(`curve ${launch.curve}`); console.log(`version ${launch.protocolVersion}`); console.log(`block ${receipt.blockNumber}`); }); ``` ## 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/config-from-template.ts](https://docs.ammora.org/examples/source/src/launch/config-from-template.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.