{"assessments":[],"deployments":[{"attestationHash":"e621da6b7f45806c4780c6a5e8c6780b1ad74227446cf92a3de6f7c0aa04ebe5","chainId":1,"contracts":[{"address":"0x078c0300c95f33396c2d1b6b39cbda6ed86ad279","blockNumber":26206904,"name":"MerkleDistributor","role":"distributor","txHash":"0x7b27b380c591e4c887e618c601c05d8be0c866dfe3c6bd5bce9dfef78e89a465"},{"address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","blockNumber":26206904,"name":"PoolInitializationGuard","role":"hook","txHash":"0x7b27b380c591e4c887e618c601c05d8be0c866dfe3c6bd5bce9dfef78e89a465"},{"address":"0x3c3306fd6bdad8290b8649cee70c8f247d511382","blockNumber":26206904,"name":"KeelnetToken","role":"token","txHash":"0x7b27b380c591e4c887e618c601c05d8be0c866dfe3c6bd5bce9dfef78e89a465"}],"id":"793dfd77-3030-4d4a-b793-56e2e90041e7","manifestHash":"ae36a64fccbb9fa145196ea31c893c54eb8c158c7e0b1cfb9ba32813b65526c1","status":"live"}],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"7232fd82-4a96-4ad9-91bd-6f6352baf94e","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"652c4a5e71bd6dcdd3df4b845e8f6aa1f666be7425270cfdc79b2c9ac4ca9a93","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"fa6da76b22bd825baae3dbfa6b34b02111ad5f7b181bcb14496bcfd1badf6a5c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"96ca2367a92d57d93149be1a6c38b7e140fb581c43efb4714577ad93797921c0","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"64795c3bbdf941ab657307690afc1f1ecbce200d54e4a1970f289884f7321b96","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"52fb9668e0548af6b5bdb409e2524953a134d64a550f1845714b00674e3807d8","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"eaea66041e76cb3fc7f73a25124e4b9d111e4f0de5ab898381ea4005123c438a","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"d52a6cade4fb633ad031087fb64d6fe987a84e7a7919258ed469d3c3e7f3bc10","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"b653e68490f46fa743fc1aa1a939e19fd071807166a1d1d20415168bb1a412ea","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Keelnet (KEEL).\nToken name: Keelnet\nToken symbol: KEEL\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"e32cb05e3bc38cb384e51bcf23d093615c555729fa5404ac17377c6a7c8a75a4","previousHash":"7ea792a46ba1053d69eb6ab1a27773a4aaa62f45465b9fa3d748a966ecbd3bd3","projectId":"7232fd82-4a96-4ad9-91bd-6f6352baf94e","publication":{"commit":"320fb2e809548f313a49fca4873a7b3c27218018","deliveredAt":"2026-10-16T18:30:16.002Z","repoUrl":"https://github.com/identity-md-launches/launch-2007-keelnet"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"e1811b1e6d76be375a66d4c170bb9f3f6a9771e41dd3e342222b02ea84e76935","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"764cd99b4c628a47","findings":[],"hash":"52fb9668e0548af6b5bdb409e2524953a134d64a550f1845714b00674e3807d8","nodeId":"c574513e-b2fb-4d67-8d9a-8f8784a613cd","outcome":"completed","summary":"The review is complete. The findings file is written with an empty list and full coverage, and the tree is otherwise untouched.\n\n**Result: no defects found in the Access Control, Trust Gap or Asymmetry areas.**\n\n**What was checked**\n\n- **Permission model.** The token's ABI exposes exactly three state-changing functions, approve, transfer and transferFrom, plus the constructor. There are no modifiers, roles, owner slot, initializer, receive or fallback. The constructor mints the full supply once to msg.sender and hands out no role.\n- **Dependency integrity.** The vendored ERC20.sol, Context.sol, IERC20.sol, IERC20Metadata.sol and draft-IERC6093.sol are sha256-identical to upstream OpenZeppelin v5.4.0, so the inherited logic is stock and _msgSender is plain msg.sender with no forwarder.\n- **Weakest-guard analysis.** Each storage variable has one write path: balances through _update, allowances through _approve. No function lets a caller write another holder's allowance row or move a balance without a matching allowance. The minter retains no residual power.\n- **Asymmetry pairs.** approve sets the exact row that transferFrom decrements. transfer and transferFrom share the same internal path. The burn branch is unreachable and the mint branch runs only in the constructor.\n- **Trust-gap seams.** With no admin setter, fee recipient, oracle or price formula there is no privileged actor and no asymmetric economic primitive to combine.\n\n**Verification performed**\n\n- The existing 31-test suite passes.\n- A scratch test with five inversion cases passed: attacker cannot raise an allowance on a victim's row, self-pull still needs an allowance, the factory has no residual mint or pull power, allowance mirroring holds under fuzzing, and appended-sender calldata is not honoured. The scratch file was removed afterwards.\n- The static-analysis lead about the large numeric literal at line 24 is a compile-time constant that evaluates to the correct supply and is not a defect.\n\n**Coverage record** has seven rows, all `holds`: the three listed entry points, the constructor, and three invariants covering the absence of privileged roles, trust-gap seams and paired-surface asymmetries.","treeHash":null,"usage":{"cachedInputTokens":454205,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":10994,"runtime":"claude","turns":25,"wallClockMs":166835}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"52c98c0dc01791cd","findings":[],"hash":"64795c3bbdf941ab657307690afc1f1ecbce200d54e4a1970f289884f7321b96","nodeId":"c6b9dc9b-c7ca-43e1-8716-d2d70e96f22d","outcome":"completed","summary":"The review is complete. `.imd-findings.json` holds an empty findings list and nine coverage rows. The tree is otherwise unchanged.\n\n**Result: no defects in the assigned area.** The token is a 35-line wrapper over stock OpenZeppelin v5.4.0 ERC20 with a single compile-time constant and no custom arithmetic, so the Math Precision, Boundary and Numerical Gap guides have almost no surface to bite.\n\nWhat I checked and how:\n\n- **Supply constant.** `SUPPLY_WHOLE_TOKENS * 10 ** uint256(DECIMALS)` evaluates to exactly 1e27 since `**` binds tighter than `*`. It matches the manifest figure and fits well under uint128, so no downstream pool cast can truncate it.\n- **Entry points.** All three state-changing functions were traced through the vendored `_update`, `_approve` and `_spendAllowance`. I probed zero, exact balance, balance plus one, max uint, whole-balance self-transfer, zero receiver and spender, and the from-equals-zero-address route into `transferFrom`. Every path reverts or succeeds as intended, and none can mint.\n- **Invariants.** A fuzzed sequence of transfers among three holders kept the sum of balances equal to totalSupply across 256 runs. The 10 percent, 80 percent and one-in-a-thousand shares the factory and protected test compute divide the supply with no dust.\n- **Periphery.** The five vendored OpenZeppelin files the token depends on hash identically to the upstream v5.4.0 release, so the inherited math is unmodified.\n- **Static-analysis lead.** The aderyn \"large numeric literal\" line is style only. The literal is the brief's whole-token count and the resulting value was verified.\n\nCoverage: all three listed entry points are marked `holds`, with additional rows for the constructor constant, three invariants, the vendored library, and the aderyn lead. Nothing in my area was left unreached. The existing 31-test suite passes, and my six scratch probes passed before I deleted them, so nothing outside the findings file was added to the tree.","treeHash":null,"usage":{"cachedInputTokens":542282,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":9886,"runtime":"claude","turns":21,"wallClockMs":147445}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3a40eaafbd83a6bc","findings":[],"hash":"652c4a5e71bd6dcdd3df4b845e8f6aa1f666be7425270cfdc79b2c9ac4ca9a93","nodeId":"7a69ff1a-50af-4288-af64-037e6b17ad5a","outcome":"completed","summary":"The review is complete. The findings file is written with an empty findings list and a full coverage record. Nothing in the tracked tree changed.\n\n**Result: no defects found in the economics of Keelnet (KEEL).**\n\nWhat I checked, against the Economic Security, Invariant and Flow Gap guides:\n\n- **Supply and mint.** The constructor mints exactly 1,000,000,000 × 10^18 to msg.sender with no arguments and no external call. The compiled ABI exposes only the three state-changing ERC-20 entry points plus views, so nothing can grow, burn, pause, freeze or seize after deployment. The runtime bytecode contains no CALL, DELEGATECALL, CALLCODE, CREATE or SELFDESTRUCT.\n- **Conservation.** A 256-run fuzz of 40 random transfer and transferFrom steps across eight actors kept the sum of balances equal to totalSupply, and totalSupply equal to the brief's figure.\n- **Launch flows.** A scratch test replayed the launch: 10% to the distributor, 80% pulled by a PoolManager stand-in via transferFrom, 10% to the remainder address, then uneven claims and a buy and sell against the pool. Every leg moved exactly the requested amount.\n- **Dependency.** The five vendored OpenZeppelin files the token compiles are byte-identical to the upstream v5.4.0 tag by sha256.\n- **Opening economics.** The 3,400 IMD cap over the supply gives a tick near ±125,930, inside Uniswap v4's range for either currency order, and the seed amount fits uint128 liquidity math.\n\nTwo notes that are not defects, recorded in the coverage rows rather than as findings:\n\n- The `DECIMALS` constant is not wired into `decimals()`. They both read 18 today, so there is no failing state, but an edit to one would not follow the other.\n- The standard ERC-20 approve race and the fact that tokens sent to the token's own address are stuck are inherent to a plain ERC-20 and already documented in the README.\n\nCoverage: all three listed entry points are marked `holds`, with five extra rows for the invariants, the dependency check and the opening economics. The aderyn large-numeric-literal lead on line 24 is a style note on a correct constant and was not promoted. Static analysis from slither reported nothing.","treeHash":null,"usage":{"cachedInputTokens":873779,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":14861,"runtime":"claude","turns":30,"wallClockMs":292712}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"81314195390981c7","findings":[],"hash":"96ca2367a92d57d93149be1a6c38b7e140fb581c43efb4714577ad93797921c0","nodeId":"f62759df-405f-4e97-9979-fd0547960a40","outcome":"completed","summary":"I found no defects in Keelnet (KEEL). I wrote `.imd-findings.json` with an empty findings list and a coverage row for each of the three entry points, all marked `holds`. I changed no other files.\n\n**What's in the code:** `src/KeelnetToken.sol` is a plain OpenZeppelin v5 ERC-20 that changes none of the library's behaviour. Its constructor takes no arguments and mints 1e27 minor units (1,000,000,000 × 10^18) once to `msg.sender`. It has no owner, no way to mint more, and no fee, burn, pause or blocklist. There is no DELEGATECALL or SELFDESTRUCT.\n\n**Entry points:** `approve`, `transfer` and `transferFrom` are the library's own code. I read them in the vendored `ERC20.sol`: they move exactly the amount asked, and they revert when the balance or allowance is too small or an address is zero. So the launch flows (factory to distributor, distributor claims, pool seed and swaps) all arrive in full.\n\n**Deployment:** The token can be deployed through the factory. Its deployed code is 2,203 bytes and its creation code 3,368 bytes, well under the limits.\n\n**Manifest:** `launch.json` fits the code. Its empty `constructorArgs` matches the constructor with no arguments, and its `totalSupply`, `decimals`, `name` and `symbol` match the contract.\n\n**Tests:** All 64 of the repository's tests pass.\n\n**Specialist reports and tool output:**\n- None of the four specialists or the test writer reported anything, so there was nothing to reproduce or merge.\n- Slither reported nothing.\n- Aderyn's one note flags the `1_000_000_000` literal on line 24 as a large number. That is a style note, not a defect, so I left it out.\n\nI didn't run the protected floor tests. They import helper files that aren't in this tree, so I only read them.","treeHash":null,"usage":{"cachedInputTokens":212864,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":2617,"runtime":"claude","turns":6,"wallClockMs":46003}},{"artifacts":[],"attempt":1,"bundleHash":"a44a4349226ee42801b2024e27513ffcbd4882966ee889cb228ba15984b67699","device":"e12f98dda6acc55f","findings":[],"hash":"b653e68490f46fa743fc1aa1a939e19fd071807166a1d1d20415168bb1a412ea","nodeId":"f5ea8599-6416-42c6-9753-a7dabceb0658","outcome":"completed","summary":"Done. The suite grew from 31 to 64 tests, all passing under the verifier's seed and unseeded, and no defects were found in the token.\n\n**What I found**\n\nThe implementation is a plain OpenZeppelin v5 ERC-20 with the whole supply minted to msg.sender and no admin surface. I read it adversarially (zero address as sender, self-pulls, the allowance one below infinity, tokens sent to the contract, repeated calls, unknown selectors, CREATE2 deployment, the one-call launch flow) and every behaviour matched the brief and the launch floor. No `.imd-findings.json` was written because there is nothing to report.\n\n**What I added** (the existing `test/KeelnetToken.t.sol` is untouched)\n\n- `test/KeelnetToken.invariant.t.sol`: a handler with six actors and the token's own address as a sink, bounded inputs, ghost balances and allowances, and deliberate failure paths that check the exact ERC-6093 error (over-balance, over-allowance, zero receiver, zero spender, unknown selectors). Six invariants run with `fail-on-revert = true` over 256 runs of depth 64: constant supply, sum of balances equals supply, balances and allowances match the ghost model, no balance above supply, zero address empty, metadata and code hash unchanged. A second contract fuzzes the token's ABI directly with random senders and reverts allowed.\n- `test/KeelnetToken.edges.t.sol`: 23 unit tests and 7 fuzz tests at 1000 runs, including a helper that deploys and pays out swarm, pool and remainder shares in one call as the factory does, for any pool share from 0 to 90 percent.\n\n**Verification**\n\n- Both files were run against mutant tokens in scratch: a 1 percent burn-on-transfer was caught by the ghost model on the first sequence, and a hidden public `mint` was caught by the open-fuzz supply invariant. The harness is not vacuous.\n- `forge build` passes, `forge fmt --check` passes on the new files, nothing outside `test/` was touched, no submodules, nothing installed.\n\nThe two new files are untracked in git. I did not commit, since the pipeline makes its own commit for the job.","treeHash":"e3d3290ef922b20e24dd4d31902e5e36961fd5ef","usage":{"cachedInputTokens":1428246,"inputTokens":642,"model":"claude-fable-5-1","outputTokens":34139,"runtime":"claude","turns":30,"wallClockMs":432213}},{"artifacts":[],"attempt":1,"bundleHash":"fdb2c4b18ae60027e3c2d85dff2e01013a304cdfd8f7d52c250cdda312543698","device":"739094f0e08668ee","findings":[],"hash":"d52a6cade4fb633ad031087fb64d6fe987a84e7a7919258ed469d3c3e7f3bc10","nodeId":"427602e0-9830-4c1d-aea7-ce27486a7ea1","outcome":"completed","summary":"I've written `launch.json` for the Keelnet (KEEL) launch. It's the only file changed. `forge build` and `forge test` pass with the verifier's fuzz seed (31 of 31). The JSON parses, but I checked the schema rules by reading the file, not with a validator.\n\n- **Token:** the contract is `KeelnetToken` in `src/KeelnetToken.sol`, named Keelnet, symbol KEEL, 18 decimals. Its constructor takes no arguments, so `constructorArgs` is `[]`. It mints 1,000,000,000 × 10^18 to the deployer, so `totalSupply` is `\"1000000000000000000000000000\"`.\n- **Contracts:** `[]`. The accepted code contains only the token, with no other contracts to deploy.\n- **Pool:** paired with IMD at `0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7`, fee 12500, tick spacing 60, and initial price `79228162514264337593543950336`, all as the launch gives them.\n- **Economics:** copied exactly as given.\n- **Notes:** a short description of the token. It's a plain fixed-supply ERC-20 with no owner, no later minting, no pause, no fee and no burn, so every launch transfer moves exactly the amount sent.\n\nI didn't run the two task-supplied test files against the manifest. They need a harness and environment variables that aren't in this repo.\n\nI haven't committed `launch.json`. It's sitting as an untracked file in the working tree.","treeHash":"1200fd99d777767305304b1e7e4a7635bb6eea3c","usage":{"cachedInputTokens":196433,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":2373,"runtime":"claude","turns":7,"wallClockMs":30825}},{"artifacts":[],"attempt":1,"bundleHash":"e2e0982e1614682af4c8449158a69d44aeb729fa24525cf60ffb94a0dee1c366","device":"1a7606be97f168d4","findings":[],"hash":"eaea66041e76cb3fc7f73a25124e4b9d111e4f0de5ab898381ea4005123c438a","nodeId":"ca01e5c7-6fa1-48fa-977d-6dbceccfb073","outcome":"completed","summary":"Done. The Keelnet (KEEL) token is implemented, tested, documented, and committed on `main`.\n\n**What was built**\n\n- `src/KeelnetToken.sol` is a plain OpenZeppelin v5 ERC-20. The constructor takes no arguments and mints the whole supply to `msg.sender`, which is the launch factory. There is no owner, mint, burn, pause, blocklist, fallback, or upgrade path, and the runtime has no DELEGATECALL, CALLCODE, or SELFDESTRUCT.\n- `foundry.toml` pins solc 0.8.26, sets `bytecode_hash = \"none\"` and `cbor_metadata = false`, and keeps ffi off with no fs permissions.\n- forge-std v1.11.0 and OpenZeppelin Contracts v5.4.0 are vendored under `lib/` as ordinary committed files, with no submodule and no `.git` directories.\n- `script/DeployKeelnet.s.sol` is a reference deploy script. Its `deploy()` function takes no config and reads no environment, and the tests call it directly.\n- `README.md` documents the token parameters, assumptions, the launch's fixed economics, that there is nothing to configure after launch, operational responsibilities, and the security checklist items that apply.\n\n**Checks run**\n\n| Check | Result |\n| --- | --- |\n| `forge build` (clean) | passes |\n| `forge test` with the verifier's fuzz seed | 31 tests pass, 0 fail |\n| `forge fmt --check` | passes |\n\nThe test suite covers metadata and supply constants, the single mint event, success and typed-error failure paths for transfer, approve, and transferFrom, the deployer having no power over holders, every common admin selector reverting from both a stranger and the deployer, and three fuzz tests for supply conservation and allowance bounds. A scratch test under `test/scratch/` also confirmed the creation code deploys through CREATE2 from a factory-like contract that then holds the whole supply, and that the launch flows move exact amounts. That directory is ignored and not part of the deliverable.\n\n**Open items for the launch, not this job**\n\n- The manifest step writes `launch.json` with `constructorArgs: []` and `totalSupply` of 1000000000000000000000000000.\n- Explorer source verification is the deployer's step after deployment.","treeHash":"9628e3e1978031adeeb610cbf1592989f7b82ab8","usage":{"cachedInputTokens":727928,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":19597,"runtime":"claude","turns":24,"wallClockMs":250801}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5dd3af20ad7ac0c2","findings":[],"hash":"fa6da76b22bd825baae3dbfa6b34b02111ad5f7b181bcb14496bcfd1badf6a5c","nodeId":"5d359a39-12d7-448f-b07f-bbc40bbbcf9f","outcome":"completed","summary":"The review is complete. The findings file at the repository root holds an empty findings list and ten coverage rows, and my scratch test directory has been removed so the tree is otherwise unchanged.\n\n**Result: no defects found in the Keelnet token.** The contract is a 34-line wrapper over an unmodified OpenZeppelin v5.4.0 ERC-20 with a no-argument constructor that mints the full supply once to the deployer.\n\nWhat I checked in my area:\n\n- **Execution trace.** Traced approve, transfer and transferFrom from entry to final storage write through the inherited OpenZeppelin code. Every revert path is a typed ERC-6093 error, the allowance is spent before the balance moves, infinite allowance is preserved while max-minus-one is decremented, and self-transfers and zero-value transfers leave balances intact. No external calls exist, so there is no reentrancy or callback surface.\n- **Periphery.** Diffed the vendored OpenZeppelin and forge-std trees against their upstream v5.4.0 and v1.11.0 release tarballs. Both are byte-identical. Context returns msg.sender directly, so no forwarder path exists.\n- **First principles.** The constructor takes no arguments and calls no contract, so a CREATE2 deployment from a factory probe leaves all of the 1e27 supply with the factory. The ABI has only three state-changing functions, no receive or fallback, and the runtime bytecode contains no DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL, CREATE or transient-storage opcodes.\n- **Launch flows.** A scratch test moved the ten percent swarm share, eighty percent pool share and remainder, then a distributor claim and a pool-manager pull-back. Every transfer delivered the exact amount and the supply stayed constant. The project's own 31 tests also pass under the verifier's fuzz seed.\n\nLeads I examined and did not report: the approve front-running property of ERC-20, tokens sent to the contract's own address being stuck, the missing Approval event on transferFrom, and aderyn's large-numeric-literal note. Each is standard, documented ERC-20 behaviour or style, with no failing input that contradicts the brief.\n\nOne limitation: I could not run the protected launch test itself, since it depends on Uniswap v4 core, the LaunchLiquidity helper and launch environment variables that are not in this tree. The launch flow was reproduced with a simplified factory probe instead, and that is noted in the coverage record.","treeHash":null,"usage":{"cachedInputTokens":1426112,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":16995,"runtime":"claude","turns":34,"wallClockMs":358212}}],"verification":[{"checks":[{"durationMs":1789,"exitCode":0,"name":"build","output":"Compiling 30 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.70s\nCompiler run successful!\n","passed":true},{"durationMs":11492,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/KeelnetToken.t.sol:KeelnetTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 256, μ: 41986, ~: 42342)\nLogs:\n  Bound result 37012378084364286110594495832739009\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 108145, ~: 108378)\nLogs:\n  Bound result 1000000000000000000\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 120937, ~: 100113)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1234000000000000000000\n\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 92792)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 64926)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 32994)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8210)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 32609)\n[PASS] test_deployScriptMintsToItsCaller() (gas: 1541885)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 95368)\n[PASS] test_holderCanForwardWhatItReceived() (gas: 127146)\n[PASS] test_metadata() (gas: 52445)\n[PASS] test_noAdminSelectorChangesSupplyOrBalances() (gas: 774691)\n[PASS] test_noReceiveOrFallback() (gas: 61010)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 922921)\n[PASS] test_supplyConstantsMatchTheBrief() (gas: 16800)\n[PASS] test_supplyGoesToWhoeverDeploys() (gas: 21069)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 118608)\n[PASS] test_transferFromInfiniteAllowanceIsNotDecremented() (gas: 120474)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 87985)\n[PASS] test_transferFromRevertsWhenOwnerBalanceTooLow() (gas: 93562)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40353)\n[PASS] test_transferFromToZeroAddressReverts() (gas: 88763)\n[PASS] test_transferFromWithinAllowance() (gas: 144962)\n[PASS] test_transferMovesExactAmount() (gas: 87045)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 37752)\n[PASS] test_transferRevertsWhenAmountExceedsBalanceByOne() (gas: 38105)\n[PASS] test_transferToSelfKeepsBalance() (gas: 40694)\n[PASS] test_transferToZeroAddressReverts() (gas: 33046)\n[PASS] test_transferWholeBalance() (gas: 72365)\n[PASS] test_transferZeroAmountSucceeds() (gas: 44513)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 59.12ms (106.66ms CPU time)\n\nRan 30 tests for test/KeelnetToken.edges.t.sol:KeelnetTokenEdgesTest\n[PASS] testFuzz_approveRoundTrip(address,uint256) (runs: 1000, μ: 73481, ~: 73829)\nLogs:\n  Bound result 675783672942368654807024011190883056167357821134\n\n[PASS] testFuzz_emptyAccountCannotSendAnything(address,uint256) (runs: 1000, μ: 44755, ~: 44728)\nLogs:\n  Bound result 635193696262361086197881586503665117785858242907\n  Bound result 5223367604281219468825\n\n[PASS] testFuzz_infiniteAllowanceNeverDecrements(uint256,uint256) (runs: 1000, μ: 194086, ~: 195062)\nLogs:\n  Bound result 937\n  Bound result 24576\n\n[PASS] testFuzz_launchFlowIsExactForAnyPoolShare(uint16) (runs: 1000, μ: 797629, ~: 799154)\nLogs:\n  Bound result 1504\n\n[PASS] testFuzz_transferRoundTripRestoresBalances(uint256) (runs: 1000, μ: 111684, ~: 111458)\nLogs:\n  Bound result 1826328996755759529\n\n[PASS] testFuzz_twoTransfersConserveOrRevertExactly(uint256,uint256) (runs: 1000, μ: 153760, ~: 158220)\nLogs:\n  Bound result 10215\n  Bound result 18\n\n[PASS] testFuzz_unknownSelectorAlwaysReverts(bytes4,bytes,address) (runs: 1000, μ: 44047, ~: 43809)\n[PASS] test_allowanceAboveBalanceIsBoundedByBalanceOnPull() (gas: 206799)\n[PASS] test_allowanceIsCheckedBeforeBalanceAndFailedPullKeepsAllowance() (gas: 126635)\n[PASS] test_allowanceIsPerSpender() (gas: 92605)\n[PASS] test_allowanceOneBelowMaxIsDecremented() (gas: 123882)\n[PASS] test_approveIsOverwriteNotIncrement() (gas: 169964)\n[PASS] test_constantsAgreeWithRuntimeMetadata() (gas: 52669)\n[PASS] test_create2DeploymentMintsToCreator() (gas: 15109)\n[PASS] test_launchFlowInOneCallMovesExactAmounts() (gas: 880419)\n[PASS] test_ownerCannotTransferFromItselfWithoutSelfAllowance() (gas: 38415)\n[PASS] test_plainTransferDoesNotTouchAllowances() (gas: 129312)\n[PASS] test_sameTransferFromTwiceFailsOnceAllowanceIsSpent() (gas: 146361)\n[PASS] test_sameTransferTwiceFailsOnceBalanceIsGone() (gas: 144923)\n[PASS] test_selfAllowanceLetsOwnerTransferFromItself() (gas: 126256)\n[PASS] test_strangerCanApproveButSpenderPullsNothing() (gas: 126142)\n[PASS] test_supplyFitsInUint96AndUint128() (gas: 29723)\n[PASS] test_supplyIsExactlyOneBillionTimesTenToTheDecimals() (gas: 39344)\n[PASS] test_tokensSentToTheContractAreStuckAndStillCounted() (gas: 175063)\n[PASS] test_transferFromToSameAddressSpendsAllowanceOnly() (gas: 108483)\n[PASS] test_transferFromZeroAddressRevertsOnAllowance() (gas: 38056)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 720400)\n[PASS] test_viewsOnUnknownAddressesAreZero() (gas: 35609)\n[PASS] test_zeroAddressCannotApprove() (gas: 33154)\n[PASS] test_zeroAddressCannotTransfer() (gas: 33045)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 59.19ms (371.80ms CPU time)\n\nRan 1 test for test/KeelnetToken.invariant.t.sol:KeelnetTokenOpenInvariantTest\n[PASS]\nKeelnetTokenOpenInvariantTest invariants:\n[PASS] invariant_openKnownHoldersNeverExceedSupply\n[PASS] invariant_openMetadataUnchanged\n[PASS] invariant_openSupplyNeverChanges\n KeelnetTokenOpenInvariantTest invariants (runs: 128, calls: 4096, reverts: 2437)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| KeelnetToken | approve      | 1384  | 19      | 0        |\n|--------------+--------------+-------+---------+----------|\n| KeelnetToken | transfer     | 1351  | 1077    | 0        |\n|--------------+--------------+-------+---------+----------|\n| KeelnetToken | transferFrom | 1361  | 1341    | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 145.53ms (144.15ms CPU time)\n\nRan 2 tests for test/KeelnetToken.invariant.t.sol:KeelnetTokenInvariantTest\n[PASS]\nKeelnetTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchGhostModel\n[PASS] invariant_balancesMatchGhostModel\n[PASS] invariant_metadataAndCodeUnchanged\n[PASS] invariant_noBalanceExceedsSupplyAndZeroHoldsNothing\n[PASS] invariant_sumOfBalancesEqualsSupply\n[PASS] invariant_totalSupplyNeverChanges\n KeelnetTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------+----------------------------+-------+---------+----------╮\n| Contract       | Selector                   | Calls | Reverts | Discards |\n+==========================================================================+\n| KeelnetHandler | approve                    | 1875  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| KeelnetHandler | approveZeroSpender         | 1810  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| KeelnetHandler | transfer                   | 1843  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| KeelnetHandler | transferAboveBalance       | 1867  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| KeelnetHandler | transferFrom               | 1774  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| KeelnetHandler | transferFromAboveAllowance | 1808  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| KeelnetHandler | transferFromAboveBalance   | 1835  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| KeelnetHandler | transferToZeroAddress      | 1813  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| KeelnetHandler | unknownSelector            | 1759  | 0       | 0        |\n╰----------------+----------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2000000000000000000\n  Bound result 36921522897747468971293575\n  Bound result 0\n  Bound result 1927\n  Bound result 0\n  Bound result 1783\n  Bound result 0\n  Bound result 20000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 11520\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 340282366920938463463374607431768211455\n  Bound result 1294765064\n  Bound result 158\n  Bound result 694\n  Bound result 340282366920938463463374607431768211455\n  Bound result 11000000000000000000\n  Bound result 1068467783330446320244215054880527674270359299859943513539\n  Bound result 12153\n  Bound result 0\n  Bound result 2778212486\n  Bound result 405856683195936295942642633\n  Bound result 16476520798356942717081333518841321434072297549044075\n  Bound result 0\n  Bound result 0\n  Bound result 453373172\n  Bound result 7290\n  Bound result 2233625728\n  Bound result 0\n  Bound result 447492777168792106744354308340603196847553786231788898\n\n[PASS] test_handlerActionsAreExercised() (gas: 2593531)\nLogs:\n  Bound result 5000000000000000000\n  Bound result 7000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.39s (11.39s CPU time)\n\nRan 4 test suites in 11.39s (11.65s CPU time): 64 tests passed, 0 failed, 0 skipped (64 total tests)\n","passed":true},{"durationMs":47,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KeelnetToken.approve(address,uint256)\",\"KeelnetToken.transfer(address,uint256)\",\"KeelnetToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":13,\"README.md\":137,\"foundry.toml\":23,\"remappings.txt\":2,\"script/DeployKeelnet.s.sol\":27,\"src/KeelnetToken.sol\":34,\"test/KeelnetToken.edges.t.sol\":442,\"test/KeelnetToken.invariant.t.sol\":428,\"test/KeelnetToken.t.sol\":343},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b653e68490f46fa743fc1aa1a939e19fd071807166a1d1d20415168bb1a412ea","verifiedTreeHash":"e3d3290ef922b20e24dd4d31902e5e36961fd5ef","verifierVersion":"0.1.0+d952fceb"},{"checks":[{"durationMs":1491,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.39s\nCompiler run successful!\n","passed":true},{"durationMs":133,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/KeelnetToken.t.sol:KeelnetTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 256, μ: 41982, ~: 42342)\nLogs:\n  Bound result 37012378084364286110594495832739009\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 107821, ~: 108408)\nLogs:\n  Bound result 912104300592694924550474895\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 121485, ~: 100113)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 938463463374607091485844535\n\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 92792)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 64926)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 32994)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8210)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 32609)\n[PASS] test_deployScriptMintsToItsCaller() (gas: 1541885)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 95368)\n[PASS] test_holderCanForwardWhatItReceived() (gas: 127146)\n[PASS] test_metadata() (gas: 52445)\n[PASS] test_noAdminSelectorChangesSupplyOrBalances() (gas: 774691)\n[PASS] test_noReceiveOrFallback() (gas: 61010)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 922921)\n[PASS] test_supplyConstantsMatchTheBrief() (gas: 16800)\n[PASS] test_supplyGoesToWhoeverDeploys() (gas: 21069)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 118608)\n[PASS] test_transferFromInfiniteAllowanceIsNotDecremented() (gas: 120474)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 87985)\n[PASS] test_transferFromRevertsWhenOwnerBalanceTooLow() (gas: 93562)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40353)\n[PASS] test_transferFromToZeroAddressReverts() (gas: 88763)\n[PASS] test_transferFromWithinAllowance() (gas: 144962)\n[PASS] test_transferMovesExactAmount() (gas: 87045)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 37752)\n[PASS] test_transferRevertsWhenAmountExceedsBalanceByOne() (gas: 38105)\n[PASS] test_transferToSelfKeepsBalance() (gas: 40694)\n[PASS] test_transferToZeroAddressReverts() (gas: 33046)\n[PASS] test_transferWholeBalance() (gas: 72365)\n[PASS] test_transferZeroAmountSucceeds() (gas: 44513)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 11.16ms (40.29ms CPU time)\n\nRan 1 test suite in 12.05ms (11.16ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":53,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KeelnetToken.approve(address,uint256)\",\"KeelnetToken.transfer(address,uint256)\",\"KeelnetToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":13,\"README.md\":137,\"foundry.toml\":23,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployKeelnet.s.sol\":27,\"src/KeelnetToken.sol\":34,\"test/KeelnetToken.t.sol\":343},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d52a6cade4fb633ad031087fb64d6fe987a84e7a7919258ed469d3c3e7f3bc10","verifiedTreeHash":"1200fd99d777767305304b1e7e4a7635bb6eea3c","verifierVersion":"0.1.0+d952fceb"},{"checks":[{"durationMs":885,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 815.36ms\nCompiler run successful!\n","passed":true},{"durationMs":97,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/KeelnetToken.t.sol:KeelnetTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 256, μ: 41982, ~: 42342)\nLogs:\n  Bound result 37012378084364286110594495832739009\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 107821, ~: 108408)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 121485, ~: 100113)\nLogs:\n  Bound result 26941\n  Bound result 132603689242400089256415903\n\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 92792)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 64926)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 32994)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8210)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 32609)\n[PASS] test_deployScriptMintsToItsCaller() (gas: 1541885)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 95368)\n[PASS] test_holderCanForwardWhatItReceived() (gas: 127146)\n[PASS] test_metadata() (gas: 52445)\n[PASS] test_noAdminSelectorChangesSupplyOrBalances() (gas: 774691)\n[PASS] test_noReceiveOrFallback() (gas: 61010)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 922921)\n[PASS] test_supplyConstantsMatchTheBrief() (gas: 16800)\n[PASS] test_supplyGoesToWhoeverDeploys() (gas: 21069)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 118608)\n[PASS] test_transferFromInfiniteAllowanceIsNotDecremented() (gas: 120474)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 87985)\n[PASS] test_transferFromRevertsWhenOwnerBalanceTooLow() (gas: 93562)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40353)\n[PASS] test_transferFromToZeroAddressReverts() (gas: 88763)\n[PASS] test_transferFromWithinAllowance() (gas: 144962)\n[PASS] test_transferMovesExactAmount() (gas: 87045)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 37752)\n[PASS] test_transferRevertsWhenAmountExceedsBalanceByOne() (gas: 38105)\n[PASS] test_transferToSelfKeepsBalance() (gas: 40694)\n[PASS] test_transferToZeroAddressReverts() (gas: 33046)\n[PASS] test_transferWholeBalance() (gas: 72365)\n[PASS] test_transferZeroAmountSucceeds() (gas: 44513)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 7.91ms (27.74ms CPU time)\n\nRan 1 test suite in 8.49ms (7.91ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":37,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KeelnetToken.approve(address,uint256)\",\"KeelnetToken.transfer(address,uint256)\",\"KeelnetToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":13,\"README.md\":137,\"foundry.toml\":23,\"remappings.txt\":2,\"script/DeployKeelnet.s.sol\":27,\"src/KeelnetToken.sol\":34,\"test/KeelnetToken.t.sol\":343},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":454,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":275,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/KeelnetToken.sol:24: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"eaea66041e76cb3fc7f73a25124e4b9d111e4f0de5ab898381ea4005123c438a","verifiedTreeHash":"9628e3e1978031adeeb610cbf1592989f7b82ab8","verifierVersion":"0.1.0+d952fceb"}]}