{
  "schema": "launchpadkit/deployment-manifest@1",
  "name": "LaunchpadKit — Base Sepolia demo instance",
  "network": "Base Sepolia",
  "chainId": 84532,
  "rpc": "https://sepolia.base.org",
  "explorer": "https://sepolia.basescan.org",
  "deployedAt": "2026-09-10",
  "deployBlock": 46641847,
  "notice": "Only the addresses listed in this file are canonical for this deployment. If an address you were given is not here, it is not ours — check the code hash before interacting.",
  "source": {
    "repository": "private (license buyers receive read access)",
    "commit": "13201a29b54b9ba19df5b2d2e099265250f20f31",
    "commitShort": "13201a2",
    "committedAt": "2026-09-10T16:05:36+03:00",
    "solc": "0.8.28",
    "evmVersion": "cancun",
    "optimizer": { "enabled": true, "runs": 1 },
    "viaIR": true,
    "note": "Source and settings are unchanged since this commit; the runtime hashes below were recomputed from chain bytecode, not from build artifacts."
  },
  "quote": {
    "symbol": "WETH",
    "address": "0x4200000000000000000000000000000000000006",
    "decimals": 18,
    "note": "Canonical wrapped-native predeploy on Base; the kit supports exactly one quote asset per deployment."
  },
  "protocol": {
    "kitBps": 1000,
    "kitBpsNote": "Launch+Share tier: 10% of curve fees settle to the kit recipient on every trade.",
    "tradeFeeBps": 100,
    "creationFeeWei": "0",
    "verifiedOnly": true,
    "creatorCooldownSeconds": 60,
    "maxCreatesPerHour": 100,
    "timelockMinDelaySeconds": 172800,
    "curve": {
      "saleCapLots": "1000000",
      "initialQuotePerLot": "1000000",
      "slopeNumerator": "1",
      "slopeDenominator": "1000000000",
      "lotBase": "1000000000000",
      "note": "Demo instance uses a deliberately tiny scale (full cap ≈ 0.000001 ETH) so the whole lifecycle fits inside a faucet balance. Real deployments pick their own bounded coefficients."
    }
  },
  "contracts": [
    {
      "name": "OperatorTimelock",
      "role": "Time-locked administration: defaults, pause-resume, emergency-key rotation",
      "address": "0x0a32f2d793211d0ff1d70771b6d04aac5f8f2273",
      "runtimeBytes": 3194,
      "codeHash": "0x1eb716d4f82b9b71fc0db91b4156f4a157d0278016f18b08676fe8e0c0878fd6",
      "deployTx": "0xb16e7f017e320e88522edcb8649b1d880117f49ef0921c9249fd54d335c20a0b"
    },
    {
      "name": "CreatorRegistry",
      "role": "Registrar attestations that gate launch creation (never touches launched tokens)",
      "address": "0x6a674b677b614da05200b2c07e08e1cabd5dc918",
      "runtimeBytes": 1827,
      "codeHash": "0x021df029f84dd018515120d4317286c62f704a077067261c2e15d2637274ad12",
      "deployTx": "0xc1b2a375c2b5323d4e0fc97c4cfd6fda2f948bdfcc51edac0a5cff514c543142"
    },
    {
      "name": "LaunchFactory",
      "role": "Admission, cooldown, fee split and atomic bundle deployment",
      "address": "0x0195f93aaa925a2171f860ec0941db0339fe5214",
      "runtimeBytes": 24022,
      "codeHash": "0xce2b5e2b1941d1ea3ae370ba6fc78864ff22608bff2004cdbec1595c78464c89",
      "deployTx": "0x874804b428d8647c609b40cb5b263f821f32d4c0014513fc6dfd7c7a852801d9"
    }
  ],
  "sampleLaunch": {
    "name": "Smoke",
    "symbol": "SMK",
    "note": "First full lifecycle on this instance: create → buy to cap → graduate → real Uniswap V2 swap. Kept as a public reference.",
    "creator": "0xc46684bdc6a56bf0079628a8dd5e2ce4bd93c0a7",
    "token": "0x7fa8e6b7936057d6218fd4d2a36a0b12b6e3d450",
    "tokenCodeHash": "0x9bf839f3b4074fc8c529dd71b627bcaabc419297f768462233dbdf5869b22216",
    "curve": "0x7f5f917dccabadf502b2e5b9f1d2b52b4c9a54e2",
    "curveCodeHash": "0x1e01dee3903d4d70547e27a0ca7b2479da51883ca8b809a16010a199bfb34471",
    "lock": "0xBef1CAa27F367E32Bc2E2ec273C9a6d5C879DaD4",
    "lockCodeHash": "0x0de95d43e0dae14515df1ef04ad2c5bfe2135893597d3b09ff1ed5c82b0d438e",
    "pair": "0xc8D16060Ab1390eF876777f5698C1dDab92CDEee",
    "pairCodeHash": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5",
    "pairNote": "Canonical Uniswap V2 pair derived from the factory address and PAIR_INIT_CODE_HASH — not created by our code.",
    "txs": {
      "attest": "0x013abf43eab0bb9f584026feec12cb4bdefd9477331a21d34e248b723f259d21",
      "create": "0xd2e7e24c054e9b046f48b9948de61d037a8b1f2f72ec0ec06a7db5c64be721fc",
      "buyToCap": "0xa2082031274d7e05f9ab32685f93606fa973aeac4a0da5f0146c9a8c21f4dda8",
      "graduate": "0xa2ac3f8ea20c8bb44cda150e92dbc58302422fb6c1fc1945ec45f42898b97907",
      "swapOnV2": "0xe2a17ae705a7f6a6aa6df4f5075e50fdea4a6b97a45054d6e8a3cb99e346ab9b"
    },
    "bootstrapTxs": {
      "wrapEth": "0x74f2071153eb112027d5371093c0d2b12fb9b13f2fbeec0b216c3e8dcfce35d1",
      "approveQuote": "0x75c3423865b527ec52aa143bc6c55e22af3938001ed059906638020e6ac51bdf",
      "approveToken": "0x472dbbb07760925d67f1a9f5d731de874a3358289c1d550da6f988e368d355fd"
    }
  },
  "evidence": {
    "document": "docs/demo/testnet-base-sepolia.md",
    "onChainAssertions": [
      "curve state reads GRADUATED (3) and reserve() is 0",
      "token.canonicalPair() equals curve.pair() equals the factory pair",
      "token.canonicalPairOpen() is true — the gate opened one-way and cannot close",
      "pair.totalSupply() equals sqrt(L·Q) within 1 wei; the lock holds totalSupply − 1000 (MINIMUM_LIQUIDITY burned by V2)"
    ],
    "notClaimed": "These are chain reads, not an audit. No third-party audit of this code has been completed, and nothing here says a launched token is a good investment."
  }
}
