{"name":"skill:custom-token-launch","files":[{"path":".imd/reads/skills/custom-token-launch.md","digest":"be811da62d1d3e1a66255fd53cfc5720d6246538b957baaced77b018fd4e3e0a","content":"A custom token launch deploys the requester's token and 0–8 application contracts through\nProjectFactory.launchCustom. The token is the requester's: its name, symbol, supply and transfer\nrules are whatever the objective asks for — burns, taxes, vesting, reflections, governance. Its\nconstructor mints the whole supply to msg.sender, which is the factory, and the manifest states\nthat supply exactly (token.totalSupply, in minor units). Use bytecode_hash = \"none\" in foundry.toml.\n\nThe token's contract name (token.contract in launch.json) is its Solidity identifier, at most 32\nletters, digits or underscores: the factory records it as 32 bytes. It is not the token's name or\nsymbol, which its `name()` and `symbol()` return. A token named AIPepeArmyBillionDollarStartup0Staff\nis written as `contract IPOToken` returning that name; job 20df68d4 named the contract after the\ntoken, 36 characters, and no manifest could describe it. Library functions the token or its\ncontracts call are internal, since the launch cannot deploy bytecode with unlinked libraries.\n\nTen percent of the supply goes to the swarm by construction: the factory forwards it to the launch's\nMerkleDistributor before it seeds the pool or forwards anything to the requester. Two percent is\nsplit equally among the wallets that did accepted work on this project, eight percent equally among\nthe paired seats connected when the launch is admitted (one share per seat). This share is never written in the manifest and cannot be changed by it. The requester's\neconomics (economics.poolBps of the whole supply seeding the single-sided pool, the opening cap in\neconomics.initialMarketCapWei from which the deployer derives the price, and economics.remainderTo\nfor the rest of the requester's ninety percent) come from the job and are copied into the manifest\nverbatim; admission refuses any other copy.\n\nThe launch flows must be exact. The factory transfers the swarm's share to the distributor, seeds\nthe pool through the Uniswap v4 PoolManager, and forwards the remainder; the distributor transfers\nclaims; traders buy from and sell into the PoolManager. A token with a fee or a burn on transfer\npasses only if these flows move exactly what they say. The token's constructor may take the three\nlaunch addresses to exempt: $factory (address), $poolManager (address) and $launchNumber (uint64 or\nwider), in any order among static arguments. The distributor's address depends on the token's, so\nit is not an argument; a token that needs it calls distributorOf(launchNumber) on the factory at\ntransfer time. Exempt msg.sender == factory, the PoolManager, and that distributor, and ordinary\ntransfers may do what they like.\n\nWhat the floor refuses: a supply that is not the manifest's or not minted to the factory; a supply\nthat can grow after launch, from anyone; a launch flow that arrives short; a seed or a swap that\nreverts; a privileged call (pause, blacklist, freeze, lock, seize, burnFrom) that moves or freezes a\nholder's balance; DELEGATECALL, CALLCODE, SELFDESTRUCT; decimals that disagree with the manifest.\n\nThe manifest step writes launch.json once the build is accepted; the builder does not. It uses\nkind \"custom_token\": token {contract, name, symbol, decimals, constructorArgs,\ntotalSupply}, contracts [{contract, constructorArgs}] in dependency order with $token, $requester\n(economics.remainderTo) or $contract:EarlierName in address arguments, pool {pairedCurrency: the\ncurrency the job names (the zero address for ETH, or the chain's pair token such as IMD), fee,\ntickSpacing, initialPrice as decimal sqrtPriceX96, provenance only}, economics copied from the job,\nand notes. economics.initialMarketCapWei is in the paired currency's minor units: wei of ETH, or of\nthe pair token. MerkleDistributor is reserved. No initialization calls, no dynamic\nconstructor types, no proxies. Never access a wallet key or broadcast transactions from a task."}]}