{"name":"skill:evm-contracts-launch","files":[{"path":".imd/reads/skills/evm-contracts-launch.md","digest":"614a8ae0bc0a6c900746a21ef09f578c046cea7ee078663aaa198650ee9703e5","content":"An `evm_contracts` launch deploys only 1–8 named application contracts through the project factory.\nDo not create LaunchToken, MerkleDistributor or a pool to satisfy another launch mode. Build what\nthe approved brief requests. This recipe creates no on-chain contributor reward allocation.\nUse bytecode_hash = \"none\" in foundry.toml. Never read wallet keys or broadcast from a worker task.\n\nConfigure applications fully in nonpayable constructors. Supported arguments are address,\nuint8…uint256, int8…int256, bool (0/1), bytes32 and structs of these. launch.json writes a struct one\nentry per field in declaration order, a negative integer as its 32-byte two's complement, and native\nETH as a Currency field of 0. No dynamic arguments, payable constructors,\npost-deployment initialization calls, proxies, DELEGATECALL, CALLCODE or SELFDESTRUCT.\nApplications may accept ETH later if the brief requires it; deployment sends zero ETH.\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\nOnly the manifest step writes launch.json, after the build is accepted; a builder writes none,\nsince a launch.json in its tree is checked as a manifest and rejects its work when incomplete. It\nhas exactly kind, contracts and notes. The kind is \"evm_contracts\". Each contract\nentry has contract (a unique Solidity identifier of at most 32 ASCII characters) and constructorArgs.\nMerkleDistributor is reserved. Arguments are decimal/hex static words, $owner, or\n$contract:EarlierName; references must point backward and fill address arguments. There is no\n$token. $owner is the wallet that paid for the launch, or the owner the request's owner field\nnames; never a wallet invented by a worker. An owner address the brief itself states for a\ncontract is written as that static address instead of $owner.\nConstructors run with the factory as msg.sender; assigning ownership to msg.sender would trap\ncontrol at that factory. Use an explicit owner argument filled by $owner. IMD never owns or runs a\nlaunch's contracts: never tx.origin, which is IMD's launch wallet, and never an IMD address. A\nlaunch nobody paid for whose request named no owner has none; if a contract needs one, stop with\nneeds_input asking for the owner's address.\n\nA Uniswap v4 hook cannot be one of these contracts. The factory deploys each at an address set by\nthe launch, and a hook deploys only at an address whose low 14 bits are its permission flags, so its\nconstructor reverts there. Deploy a deployer instead: a contract that takes the hook's constructor\nvalues, exposes `predict(bytes32 salt)`, the CREATE2 address the hook would get from this deployer,\nand `deploy(bytes32 salt, address expected)`, which checks `expected == predict(salt)` and that its\nlow 14 bits are the hook's flags before it creates the hook. Deliver a script that mines a salt\nagainst the deployer's live address and calls `deploy`, and list it in the README under \"After\nlaunch\". Launch 2407 went live this way with OGClubHookDeployer; 2431b879, e70e221f and 61b2582d\nlisted their hooks themselves and stopped at the manifest (2026-10-20 and 21).\n\nThe protected floor rehearses constructors, dependency addresses, runtime size and forbidden\nopcodes. It does not prove application correctness or that a constructor cannot create another\ncontract. Independent tests and review must cover the actual behavior, privileges, custody,\nbeneficiaries and any external dependencies in the approved brief.\n\nThe manifest assignment changes only launch.json. The final independent review sees source,\ntests and manifest, including arguments that grant privileges. The deployment service checks the\nsigned bytes and policy, simulates the full transaction and enforces its gas ceiling. No website\nshould invent addresses: the existing deployment handoff provides the confirmed contract set."}]}