{"name":"skill:evm-project-launch","files":[{"path":".imd/reads/skills/evm-project-launch.md","digest":"e302f6b79685cb37abbbf613fd4f78a14aaf4805b7b5325d5fc7d9db83b8019b","content":"A project launch deploys the reward token and 0–8 application contracts through ProjectFactory.\nFor token-only launches use an empty contracts array; the factory supplies the LP and MerkleDistributor.\nUse bytecode_hash = \"none\" in foundry.toml.\n\nThe launch token is the contract `LaunchToken` in `src/LaunchToken.sol`, and a project launch cannot\ndeploy without it: write it even when the brief never mentions a token, and the builder step is\nrejected without that file. It is a fixed-supply ERC-20 with no constructor arguments, 18 decimals,\nand exactly 1,000,000,000 tokens (10^27 minor units) minted to msg.sender in its constructor. Its\ntransfers are plain: no mint, owner, pause, blocklist, fee or upgrade functions. Take its name and\nsymbol from the brief when it gives them, otherwise a short name for the project, and test the\nsupply and a transfer. The manifest names `LaunchToken` as the launch token.\n\nThe factory splits the supply, and reverts with `SupplyMismatch` when the token holds anything else.\n10% goes to the swarm: 2% of the supply equally among the wallets that did accepted work on the\nlaunch and 8% equally among the paired seats connected when it is admitted (one share per seat). The other 90% is the requester's: the share they chose\n(80% of the supply unless they chose otherwise) seeds the pool, and the rest goes to their wallet.\nThe factory does this. Nothing in the project mints more, or is allocated, reserved or sent any of\nit at launch; a project contract may still hold tokens users deposit in it later, as a staking\nvault holds what is staked. These rules\nhold whatever the brief asks: a different supply or decimals, fees, limits, minting, or a share of\nthe supply for anyone is not the launch token's to give, and the launch refuses a token that has\nthem. Build the standard token, and say in the README what the brief asked that it does not do.\n\nApplication contracts must be fully configured in nonpayable constructors, except for values only the\nrequester holds that the brief does not give (an outside service's subscription, feed, registry or\nrelayer): those are owner-only settings the owner sets after launch, as build-contract-project says,\nand never a zero or made-up constructor argument. The factory makes no initialization calls. Supported constructor types are address, uint8…uint256, int8…int256, bool (0/1),\nbytes32 and structs of these. launch.json writes a struct one entry per field in declaration order, a negative integer as its\n32-byte two's complement, and native ETH as a Currency field of 0.\nNo dynamic arguments, proxies, DELEGATECALL, CALLCODE, or SELFDESTRUCT. Contracts\nmay accept ETH after deployment, as needed for lottery entry or deposits. Never access a wallet key\nor broadcast transactions from a contributor task.\nEach deployed contract takes at most 16 constructor arguments: the manifest refuses a longer list,\nand that is only found after the build is accepted. Make values that never change constants, and\nderive what follows from other arguments (a pool's sorted currencies from its two tokens) instead of\npassing it. The launch checks run constructors on an empty chain where no other contract exists: a\nconstructor that calls another contract, or requires an address to have code, reverts there and\nparks the launch. Take such values as arguments and check the live contract on first use.\n\nThe manifest names the launch token and unique application contract identifiers of at most 32 ASCII\ncharacters; MerkleDistributor and PoolInitializationGuard are reserved for the protocol reward artifact. It uses kind\n\"evm_project\" and a contracts list in dependency order. constructorArgs may\nuse $token, $contract:EarlierName, or $owner. References can only fill address arguments. $owner is\nthe owner the request named, else the wallet that paid; never hard-code a privileged wallet.\nConstructors run with the factory as msg.sender, so owner = msg.sender gives control to an immutable\nfactory that cannot exercise it. Explicit owner constructor parameters use $owner instead. IMD never\nowns or runs a launch's contracts: never tx.origin, which is IMD's launch wallet, and never an IMD\naddress. A launch nobody paid for whose request named no owner has none; if a contract needs one,\nstop with needs_input asking for the owner's address.\n\nThe factory supplies an initialization-only guard, with no swap callbacks. The pool pairs with the currency the manifest step is told: native ETH (the zero\naddress) unless the request chose the chain's pair token (IMD, or the token that plays its role, at\n`network.pairToken` in `network.json`); admission refuses any other. Write pool.fee, tickSpacing and\ninitialPrice as the assignment's \"This launch\" section gives them. The deployer derives the effective\nopening price from the pinned policy's opening cap for that currency, which that section states; the\nmanifest price is used only by legacy policies. The factory seeds liquidity with the launch token\nonly, whichever side of the pair it sorts to. Whatever pool.fee says, the pool opens at the network's\ntrading fee, which the factory reads from the chain's LaunchFees contract (1.25% by default): 1% of\nevery trade goes to the wallet that paid for the launch and 0.25% to IMD, and anyone can claim it for\nthem. Do not write fee logic into the token or the application contracts, and do not describe the\npool at any other fee in the README or the site.\n\nThe project floor checks constructor execution, token supply, runtime size and forbidden opcodes.\nIt does not establish application correctness. Review permissions, privileged beneficiaries, use of\nmsg.sender in constructors, dependency ordering, payout/refund accounting and adversarial behavior.\nEvery application contract needs meaningful tests. Custody and randomness assumptions belong in the\nreview and README. The manifest node describes the accepted source and changes only launch.json.\nThe final independent review sees both source and manifest, including every argument that grants a privileged role.\nBuilders deliver all source, tests and the token before the manifest node runs.\n\nThe factory supplies PoolInitializationGuard. Do not implement or list it in the contributor manifest. It only restricts pool initialization; it does not add swap fees or change liquidity ownership. Frontends must use the exact poolKey from the deployment handoff."}]}