{"assessments":[],"deployments":[],"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":"f53af099-8096-42b3-9e33-abcebb2a0ffc","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"023d95353ff8975be786e0654821b9ef92b540d646354ffeef4fb7d05201e95e","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"f8adc0b79d609f51d0d3bfe8c7364877b72474e1147ee622fda85ff9c80ea9dc","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"cb5fbaa5b071eacb3c26399085aa3d4084f7d9f1b250c9a15cacda1c5ae0f02d","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","subagents":4,"tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"6a38c42ba63c1d30a6cd5d272daf2d66601622acee7d269a9548a158e9bd426f","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"af2fb43ee7ecd8e6345763cbc12aa74ed99e8b762f10db2a5dd8642d13c9681c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"8ea420f02001570cb3e85a3e88189d471cb1a63247c2972dccc9dfddb5d45ee0","dependsOn":[],"execution":{"mustProduce":["src/LaunchToken.sol"],"network":false,"profile":"foundry","requires":[],"skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"7a51a39fa2a7a45c5ae2e626654a8d880b70489c64922ac2ce9901ed80b5b584","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"3bf531d06590b871dc740c9c572a6c35467ca42d32df7880f51129a630005bc6","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"1ddb4d02eb75e52d5f38cfd5c9bb54f332687b81929c68880cf1e8a6ab27254d","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"1ddb4d02eb75e52d5f38cfd5c9bb54f332687b81929c68880cf1e8a6ab27254d","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Launch a standard evm_project token-only launch (no custom hook, no extra application contracts). Token name: Extremely Long Dog. Token symbol: XLONGDOG. Official description / bio: \"Extremely Long Dog ($XLONGDOG): the longest dog on Robinhood Chain. A community meme token for the extremely long dog from @taylor_'s viral post. Unofficial fan meme, not affiliated with or endorsed by the post's author. Website: https://midaswhale.wtf/xlongdog | Source post: https://x.com/taylor_/status/2120975103148359750\". Official website: https://midaswhale.wtf/xlongdog (put it in every website/links field the token metadata, README, explorer page or contractURI supports). Official social link (X): https://x.com/taylor_/status/2120975103148359750 (source post only; this is not an official account of @taylor_). Use the official logo from the first photo in that post, cropped square on the dog's face, as an opaque square PNG at least 512 pixels: https://pbs.twimg.com/media/HW83ZHFWEAAKK_C.jpg. Do not redraw, stylize, add text, ticker or a frame. Keep the mark inside the central circle so a wallet crop still reads as the dog. If the token supports on-chain or off-chain metadata (contractURI / token metadata JSON / README), fill in name, symbol, description, image, website (external_url) and the X link from the values above. Standard IMD token only: 1,000,000,000 supply, 18 decimals, plain transfers, no transfer tax, no mint after launch, no owner privileges over holders. economics.poolBps=9000 (all of the requester's 90% seeds the pool; the swarm still takes 10%). Do not add a max-buy, custom hook fee or other trading rules unless required by policy. If any field is missing at check, ask rather than invent a different name, symbol, chain or pair.","parentJobId":null,"planHash":"8c96e7eda7821a19b0f12dad64633f5425dddb395ca9b3f8f85a38aed76582ca","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"f53af099-8096-42b3-9e33-abcebb2a0ffc","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-3248-launch-standard-evm-project-token-only"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52675","feedbackHash":"71121f73cc6048c0da3c32ce11d360275f19e76e46e670bbc29f502f79c5085d","nodeKey":"audit_economics","submissionHash":"023d95353ff8975be786e0654821b9ef92b540d646354ffeef4fb7d05201e95e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51315","feedbackHash":"407be7592ae61d5ef22b3804e82e0c45470299935f5155130e6721d74dafedb0","nodeKey":"audit_flow","submissionHash":"f8adc0b79d609f51d0d3bfe8c7364877b72474e1147ee622fda85ff9c80ea9dc","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52114","feedbackHash":"b6f1f91dda0ac7cdac5ea0d203e26bb28782777b669e75c9c98af05464fd129f","nodeKey":"audit_judge","submissionHash":"cb5fbaa5b071eacb3c26399085aa3d4084f7d9f1b250c9a15cacda1c5ae0f02d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52617","feedbackHash":"94359a84e2627dec20b098d347d9bc82ffdb075d6f8645a6a13762c20f1b15f8","nodeKey":"audit_math","submissionHash":"6a38c42ba63c1d30a6cd5d272daf2d66601622acee7d269a9548a158e9bd426f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"54232","feedbackHash":"272648fbddd6b348a71e42c50d58e8fc38ced435c91feffcd67c56af40b0d0a3","nodeKey":"audit_permissions","submissionHash":"af2fb43ee7ecd8e6345763cbc12aa74ed99e8b762f10db2a5dd8642d13c9681c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51136","feedbackHash":"965fb33aee6c93881527fc34e90ed5f73ff71c8a645e1129afe9262461c91071","nodeKey":"build_contract_project","submissionHash":"8ea420f02001570cb3e85a3e88189d471cb1a63247c2972dccc9dfddb5d45ee0","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"53234","feedbackHash":"81d1fdc1de91b96830b43687a4ca1def5b1808ca7b9771213d60ad8700847273","nodeKey":"manifest","submissionHash":"7a51a39fa2a7a45c5ae2e626654a8d880b70489c64922ac2ce9901ed80b5b584","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51283","feedbackHash":"7b324357e04f7a28f141c0d5bd92f51e7aaf195a0bcaf106dbaf1ed32fb60927","nodeKey":"write_foundry_tests","submissionHash":"3bf531d06590b871dc740c9c572a6c35467ca42d32df7880f51129a630005bc6","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"68f6e1b48c2cf2b27b0861e96e76985e548ee5e1f97d039fdedf2aef1cd06890","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"382ebcfad965e0cd","findings":[],"hash":"023d95353ff8975be786e0654821b9ef92b540d646354ffeef4fb7d05201e95e","nodeId":"c352d3d8-dbfd-49f8-b7e1-4846294d1541","outcome":"completed","summary":"I found no economics defects in the token, so `.imd-findings.json` has an empty findings list, plus a coverage record that passes a JSON syntax check.\n\n**What I reviewed:** I checked `src/LaunchToken.sol` and the OpenZeppelin v5.2.0 ERC-20 code it uses against the Economic Security, Invariant and Flow Gap guides. The OpenZeppelin files match their recorded checksums in `lib/SHA256SUMS`, so they are unmodified. All 32 existing tests pass (31 unit tests and 1 invariant test).\n\n- **Supply:** the token mints exactly 1,000,000,000 × 10^18 once, in the constructor, to the factory that deploys it. Nothing can mint or burn afterwards, and the token sets nothing aside for anyone. That leaves the factory's split (9,000 basis points to the pool, 1,000 to the swarm) as the only allocation.\n- **Transfers:** the token adds nothing to the standard transfer code. There is no tax, max-buy, blocklist, pause, owner or hook fee. Transfers move exactly the amount asked, failed ones revert completely, and finite allowances are used up exactly.\n- **Documentation:** the README's handoff table matches the brief: `economics.poolBps = 9000`, nothing sent directly to the requester's wallet, a 10% swarm share, pool fee 12500 (1.25%), and the market cap the pool opens at is taken from the launch policy. There is no `launch.json` yet; that belongs to the later manifest step, not this review.\n\n**Coverage rows:** `approve`, `transfer` and `transferFrom` are all marked `holds`. I added three more rows for the fixed supply, the full mint to the factory, and the absence of any fee or trading rule; all three hold.\n\n**Leads I did not report:**\n- The static-analysis \"large numeric literal\" warning at line 14 is the intended supply constant, not a defect.\n- Six vendored forge-std files don't match their recorded checksums. forge-std is only used by the tests and this is outside the economics area, so I left it out of the report.","treeHash":null,"usage":{"cachedInputTokens":265325,"cost":{"source":"runtime","usdMicros":368484},"inputTokens":16,"model":"claude-opus-5-5","outputTokens":4012,"runtime":"claude","turns":8,"wallClockMs":59040}},{"artifacts":[],"attempt":1,"bundleHash":"2a83a2849b7636c143b902a89b06068640aa2d67af11a1d604764f107120270c","device":"b5ff2623f878600d","findings":[],"hash":"3bf531d06590b871dc740c9c572a6c35467ca42d32df7880f51129a630005bc6","nodeId":"cb9ec914-6130-47e8-945e-22a258836913","outcome":"completed","summary":"Added failure-path tests, six fuzz properties, and stateful invariants under `test/`.\n\nValidation passed:\n\n- `forge build`\n- Seeded `forge test`: **56 passed, 0 failed**\n- **24,576** new randomized invariant actions\n- Metadata validation\n\nNo defects reproduced. Production files and configuration remain unchanged. Live factory/pool deployment remains outside this suite.","treeHash":"75a1981bbcb260bc1226308ac4970e6553d233aa","usage":{"cachedInputTokens":1310720,"cost":{"source":"estimated","usdMicros":3353650},"inputTokens":105043,"model":"gpt-6-astra","outputTokens":19850,"runtime":"codex","turns":6,"wallClockMs":517388}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"76df9026b98e4277","findings":[],"hash":"6a38c42ba63c1d30a6cd5d272daf2d66601622acee7d269a9548a158e9bd426f","nodeId":"4a6562a9-1d6a-4248-85a8-ececc54e6772","outcome":"completed","summary":"I found no defects in the math area (Math Precision, Boundary and Numerical Gap). `.imd-findings.json` has an empty findings list and a coverage record for all three entry points, plus three invariant rows. I changed no files; the scratch test I ran is deleted.\n\n**What's in scope:** `src/LaunchToken.sol` is an unmodified OpenZeppelin v5.2.0 ERC-20 named \"Extremely Long Dog\" / XLONGDOG. Its constructor mints `1_000_000_000 * 10 ** 18` once, to whoever deploys it. There are no application contracts and no `launch.json` yet.\n\n**What I checked**\n- **Arithmetic that skips overflow checks:** in `_update`, each subtraction is checked first (`fromBalance < value` reverts). The addition can't wrap because no balance can exceed the 10²⁷ total supply. In `_spendAllowance`, the allowance is checked against the amount before it is reduced.\n- **Boundaries, run in a scratch test:**\n  - Sending the full 10²⁷ works; 10²⁷ + 1 and 2²⁵⁶ − 1 revert.\n  - An allowance exactly equal to the amount drops to 0, and one token over it reverts.\n  - An allowance of `max − 1` goes down normally; only `type(uint256).max` is treated as unlimited.\n  - Zero-amount transfers succeed, and sending to address zero reverts.\n  - A fuzzed two-step transfer test kept the total balance at 10²⁷ over 1,024 runs.\n- **Supply split:** 9000 basis points to the pool is 9×10²⁶ and the swarm's 1000 is 10²⁶. They add up to the full supply with nothing left over. The equal split of the 2% and 8% shares among wallets happens in the factory, which isn't in this tree, so I couldn't check it.\n- **Decimals and logo:** decimals is 18 everywhere. The logo is 512×512 with no transparency, and the copy embedded in the metadata matches `assets/logo.png` byte for byte.\n- **Price:** the README says the deployer works out the real opening price from the 10 ETH market cap and the token's address. The `initialPrice` value written in the manifest isn't used for this launch, which is correct.\n- **Tests:** all 32 existing tests pass. Slither reported nothing. Aderyn's large-number warning is only a style note: the value is a correct constant.\n\n**Not reported as a finding:** `docs/REVIEW.md` says the vendored files pass checksum verification, but `sha256sum -c lib/SHA256SUMS` fails for 6 forge-std files. I compared them with upstream v1.9.6 and the only difference is line wrapping from `forge fmt`. It affects test helpers only, not the deployed token, and fixing it would mean touching `lib/`, which this task forbids.","treeHash":null,"usage":{"cachedInputTokens":337162,"cost":{"source":"runtime","usdMicros":544806},"inputTokens":19,"model":"claude-opus-5-5","outputTokens":6949,"runtime":"claude","turns":10,"wallClockMs":96842}},{"artifacts":[],"attempt":1,"bundleHash":"68a422043878faf6e5d1ded5cd07f9318b5278db47e0773863da8b6e087c09fb","device":"d0cae3c2b90f3949","findings":[],"hash":"7a51a39fa2a7a45c5ae2e626654a8d880b70489c64922ac2ce9901ed80b5b584","nodeId":"5da6643f-153b-4dc1-a683-349109a002bf","outcome":"completed","summary":"Created [launch.json](/home/imd-worker/.identitymd/work/f53af099-8096-42b3-9e33-abcebb2a0ffc/5da6643f-153b-4dc1-a683-349109a002bf/launch.json) with XLONGDOG’s token-only configuration and required ETH pool settings.\n\nManifest and compiled ABI checks passed. `forge build` succeeded; `forge test` passed all 32 tests using the supplied fuzz seed.\n\nOnly `launch.json` changed.","treeHash":"1940316a448a3c78eee4fc555f5b098d3709e9cb","usage":{"cachedInputTokens":174592,"cost":{"source":"estimated","usdMicros":695332},"inputTokens":33579,"model":"gpt-6-astra","outputTokens":3699,"runtime":"codex","turns":3,"wallClockMs":99929}},{"artifacts":[],"attempt":1,"bundleHash":"6f0c8d72ddcb9d732f6a3d1576d12f3372610d7694ef6c65389ec1084ae2bcff","device":"ca0f4e05e864c332","findings":[],"hash":"8ea420f02001570cb3e85a3e88189d471cb1a63247c2972dccc9dfddb5d45ee0","nodeId":"2f7c1c3e-54db-4210-b0cc-662057a2a3f4","outcome":"completed","summary":"Implemented XLONGDOG with the standard fixed-supply token, requested 512×512 photo logo, complete metadata, vendored dependencies, and documented 90/10 launch economics.\n\nValidation passed:\n\n- Clean offline `forge build`\n- `forge test`: 32 passed with the supplied fuzz seed\n- `forge fmt --check`\n- Metadata and dependency checks\n\nReady for IMD’s manifest, independent review, and deployment steps. No transactions were broadcast.","treeHash":"1f2ab8faf1b9ba7cfdaa6d5723ba7cbb1674926b","usage":{"cachedInputTokens":1038208,"cost":{"source":"estimated","usdMicros":2731128},"inputTokens":68987,"model":"gpt-6-astra","outputTokens":20061,"runtime":"codex","turns":7,"wallClockMs":514454}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"89eed35842d609d7","findings":[{"citation":"resolved","description":"README.md lists `sha256sum -c lib/SHA256SUMS` as one of the five build-and-check steps, and lib/README.md states that forge-std is the 'Entire upstream `src/`' of v1.9.6 and that `SHA256SUMS records each vendored file`. In the committed tree the check fails: lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol and interfaces/IMulticall3.sol have different bytes from both the recorded sums and the upstream v1.9.6 release (they were re-wrapped by a formatter; after stripping whitespace they are identical to upstream, so the change is cosmetic). This is a Trust Gap item rather than an on-chain defect: forge-std is test-only, and the production dependency is clean (all five vendored OpenZeppelin files are byte-identical to upstream v5.2.0, verified against raw.githubusercontent.com). But the provenance claim a reviewer is told to rely on is false, and a checksum file that is already red teaches everyone downstream to ignore it, which defeats its purpose. Fix (either): regenerate lib/SHA256SUMS from the committed files, or restore the six upstream files byte-for-byte; and keep lib/ out of `forge fmt` so it does not drift again. No Solidity change is needed.","line":117,"path":"README.md","reproduction":"In the repository root run `sha256sum -c lib/SHA256SUMS`. Expected: 32 lines ending in `: OK`, exit code 0, as README.md's check list implies. Actual: `lib/forge-std/src/StdAssertions.sol: FAILED`, `StdJson.sol: FAILED`, `StdToml.sol: FAILED`, `Vm.sol: FAILED`, `console.sol: FAILED`, `interfaces/IMulticall3.sol: FAILED`, `WARNING: 6 computed checksums did NOT match`, exit code 1. Cross-check: `sha256sum lib/forge-std/src/Vm.sol` gives 9ef7ee8c...0f408 while lib/SHA256SUMS records 37cdc224...bc73c, which is the sha256 of upstream forge-std v1.9.6 src/Vm.sol; `diff` of the two shows 72 lines of whitespace-only differences.","severity":"low","snippet":"sha256sum -c lib/SHA256SUMS","title":"Documented integrity check `sha256sum -c lib/SHA256SUMS` fails: six vendored forge-std files match neither the recorded checksums nor upstream v1.9.6 bytes"}],"hash":"af2fb43ee7ecd8e6345763cbc12aa74ed99e8b762f10db2a5dd8642d13c9681c","nodeId":"6eba8a25-8e4c-400c-a141-39ca8c4f09b0","outcome":"completed","summary":"The review is complete. The findings file is at the repository root with one low finding and eight coverage rows.\n\n**Outcome.** The permissions area is clean. The launch token is a bare OpenZeppelin ERC20 whose only mutators are the three standard ones. No role, owner, minter, pauser, blocklist, fee, initializer, proxy or rescue path exists in the source or the compiled ABI. The single defect I could substantiate is a documentation and provenance gap, not an on-chain one.\n\n**What I verified**\n\n- Access Control: the constructor takes no arguments and mints the whole supply once to its caller, which is the factory. Inherited mint and burn are internal with no caller. Transfer, approve and transferFrom authorize only on the message sender or an explicit allowance from the holder. The factory has no bypass.\n- Asymmetry: transfer and transferFrom share the same update path. The only difference is allowance spending, which follows upstream semantics for finite and infinite allowances. Failed paths roll back allowance and balances together.\n- Trust Gap: the token holds no economics, so there is no privileged actor who can route value. The five vendored OpenZeppelin files are byte-identical to upstream v5.2.0, checked against the GitHub release.\n- The protected token floor passes against the compiled creation code with the policy supply, 18 decimals and chain 4663 set. The project's 31 unit and fuzz tests and both stateful invariants pass. The runtime contains no delegatecall, callcode or selfdestruct.\n- Off-chain branding matches the brief: name, symbol, exact bio, website in every link field, the source post as the X link with the disclaimer, and an opaque 512 by 512 PNG crop of the dog's face embedded in the metadata.\n\n**Finding (low).** The README lists a checksum verification as one of its five build-and-check steps, and the vendored dependency README claims forge-std is the unmodified upstream v1.9.6 source. That check fails with exit code 1 on the committed tree. Six forge-std files were re-wrapped by a formatter, so they match neither the recorded checksums nor upstream bytes. The differences are whitespace only and forge-std is test-only, so there is no production impact. The fix is to regenerate the checksum file or restore the upstream bytes, and keep the library directory out of formatting.\n\n**Leads not promoted.** Aderyn's large-numeric-literal note on the mint line is a style remark. The expression yields exactly ten to the twenty-seventh under checked arithmetic. The handoff table's launch owner address, chain id and pool parameters could not be cross-checked because no network file or launch section was supplied to this task. They are documentation only and do not reach the token's code.","treeHash":null,"usage":{"cachedInputTokens":669774,"cost":{"source":"runtime","usdMicros":2618540},"inputTokens":322,"model":"claude-fable-5-1","outputTokens":15187,"runtime":"claude","turns":27,"wallClockMs":340350}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"918f8261a6fd589c","findings":[{"citation":"resolved","description":"README.md lists `sha256sum -c lib/SHA256SUMS` as one of the five build-and-check commands, and lib/README.md line 4 says SHA256SUMS records each vendored file. In the committed tree the check fails for six forge-std files (StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol): their recorded digests are upstream v1.9.6 bytes, but the committed files are the output of `forge fmt` with this repository's [fmt] line_length = 120, because foundry.toml does not exclude lib/ from formatting. The difference is whitespace only; stripping whitespace gives identical content. Both specialists (permissions and flow) reported this same root cause; merged here as one finding. This is a provenance/documentation defect, not an on-chain one: forge-std is test support only, and I verified independently that all five vendored OpenZeppelin files (ERC20.sol, IERC20.sol, IERC20Metadata.sol, Context.sol, draft-IERC6093.sol) are byte-identical to upstream v5.2.0, so the production token's only dependency is clean. Impact: the documented provenance check can never pass as the tree stands, so a reviewer following the README gets a false integrity alarm and is taught to ignore the checksum file. Minimal fix (author's choice): regenerate lib/SHA256SUMS from the committed files and amend lib/README.md to say forge-std is v1.9.6 reformatted with `forge fmt`; or restore the six upstream files byte-for-byte and add `ignore = [\"lib/**\"]` under [fmt] in foundry.toml so `forge fmt --check` and the checksum file stay compatible.","line":117,"path":"README.md","reproduction":"State: clean checkout at commit b302a0c. Command, from the repository root: `sha256sum -c lib/SHA256SUMS`. Expected (per README.md line 117 and lib/README.md line 4): every one of the 32 lines ends in `: OK`, exit status 0. Actual: `lib/forge-std/src/StdAssertions.sol: FAILED`, `lib/forge-std/src/StdJson.sol: FAILED`, `lib/forge-std/src/StdToml.sol: FAILED`, `lib/forge-std/src/Vm.sol: FAILED`, `lib/forge-std/src/console.sol: FAILED`, `lib/forge-std/src/interfaces/IMulticall3.sol: FAILED`, `sha256sum: WARNING: 6 computed checksums did NOT match`, exit status 1; the other 26 lines report OK. Cross-check: `sha256sum lib/forge-std/src/Vm.sol` gives 9ef7ee8c... while SHA256SUMS records 37cdc224..., the digest of upstream forge-std v1.9.6 src/Vm.sol; `diff` of the two is whitespace-only line re-wrapping.","severity":"low","snippet":"sha256sum -c lib/SHA256SUMS","title":"Documented integrity check `sha256sum -c lib/SHA256SUMS` fails: six vendored forge-std files were reformatted after their checksums were recorded"}],"hash":"cb5fbaa5b071eacb3c26399085aa3d4084f7d9f1b250c9a15cacda1c5ae0f02d","nodeId":"18dea431-e468-479b-8342-924430b3c226","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. No project file was changed, and my scratch test copies were removed.\n\n**Outcome:** one low finding kept, no critical, high or medium defects. The token is a plain OpenZeppelin v5.2.0 ERC-20 that mints 10^27 units to its deployer with no constructor arguments and no mint, owner, pause, fee or upgrade path.\n\n**Finding kept (merged):**\n- The permissions and flow specialists reported the same root cause, so they are one finding. The README's documented check `sha256sum -c lib/SHA256SUMS` fails on six forge-std files that were re-wrapped by the project's formatter after the sums were recorded. I reproduced it on the tree: six FAILED lines, exit status 1. The difference is whitespace only and forge-std is test support, so it stays low. I also fetched upstream OpenZeppelin v5.2.0 and confirmed all five production dependency files are byte-identical.\n\n**What I verified myself:**\n- Build succeeds, and all 56 project tests pass with the README's fuzz seed, including the invariant and stateful suites.\n- The seven protected token tests pass when run against the compiled creation code on chain id 4663 with the policy supply and 18 decimals. They confirm whole-supply mint to the deployer, no admin call increases supply, exact transfers, and no DELEGATECALL or SELFDESTRUCT in runtime code.\n- Creation code is 2,706 bytes and runtime is 1,785 bytes, well under the factory limits, with no external call in the constructor.\n- The manifest uses only schema keys, an empty contracts array, a lowercase zero-address pair, numeric fee and tick spacing, a string price below 2^256, and notes under 4,000 characters.\n- Metadata and logo match the brief: the token JSON carries the exact name, symbol, description, website and X link, and the logo is an opaque 512x512 RGB PNG. The project's own metadata check passes.\n- Format check is clean on the project files. The aderyn large-literal lead is the required 10^27 supply, not a defect.\n\n**Coverage:** all three entry points (approve, transfer, transferFrom) are marked holds, plus four invariant rows for the mint, deployability, manifest and metadata.\n\n**Not run:** the Project and Owners protected tests need the factory address and a floor helper file that are supplied by the verifier, not present here.","treeHash":null,"usage":{"cachedInputTokens":379330,"cost":{"source":"runtime","usdMicros":1352864},"inputTokens":258,"model":"claude-fable-5-1","outputTokens":8126,"runtime":"claude","turns":9,"wallClockMs":121594}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e3a598aae0640402","findings":[{"citation":"resolved","description":"README.md lists `sha256sum -c lib/SHA256SUMS` as one of the five build-and-check commands, and lib/README.md (lines 4 and 9) states that SHA256SUMS records each vendored file and that forge-std is the \"Entire upstream src/\" of v1.9.6. At the committed tree (a590a21) the command fails for six files: lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol and interfaces/IMulticall3.sol (SHA256SUMS lines 5, 10, 14, 17, 18, 25). The recorded digests are the upstream v1.9.6 bytes (verified against raw.githubusercontent.com at tag v1.9.6, e.g. upstream Vm.sol = 37cdc224...), but the committed files are what `forge fmt` with this project's [fmt] config (line_length = 120) produces from them: running `forge fmt` on the upstream copies yields files byte-identical to the committed ones, and stripping all whitespace from upstream and committed copies gives identical streams, so the change is formatting only (long signatures joined onto one line) and no semantics differ. Root cause: `forge fmt` was run over lib/ after SHA256SUMS was generated, and foundry.toml's [fmt] section does not exclude lib/. Impact: the repository's stated provenance check cannot pass, so a reviewer following the README gets a false integrity alarm on test-support code, and the two documented checks are mutually incompatible as the tree stands (restoring the upstream bytes makes sha256sum pass but then `forge fmt --check` would reformat lib/). No production code is affected: the five OpenZeppelin files are byte-identical to upstream v5.2.0 and all other 26 checksums match. Minimal fix (author's choice): either regenerate lib/SHA256SUMS from the committed files and change lib/README.md's \"Entire upstream src/\" wording to say the files are upstream v1.9.6 reformatted with `forge fmt`; or restore the six upstream files and add `ignore = [\"lib/**\"]` under [fmt] in foundry.toml so the formatter leaves vendored code alone.","line":117,"path":"README.md","reproduction":"State: clean checkout of commit a590a21. Command: `sha256sum -c lib/SHA256SUMS` from the repository root. Expected (per README.md line 117 and lib/README.md line 4): every line reports OK and exit status 0. Actual: exit status 1 and `sha256sum: WARNING: 6 computed checksums did NOT match`, with FAILED for lib/forge-std/src/StdAssertions.sol (recorded d4c89eec..., actual 3fbf4a02...), StdJson.sol (0211b47e... vs 61bbf9b3...), StdToml.sol (de3fb35a... vs 187d2f0c...), Vm.sol (37cdc224... vs 9ef7ee8c...), console.sol (896c5a5a... vs a2e632dc...), interfaces/IMulticall3.sol (6620d9c5... vs 1b63ca78...). Confirmation that the difference is formatting only: download the six files from https://raw.githubusercontent.com/foundry-rs/forge-std/v1.9.6/src/<file>, their sha256 equals the recorded digests; run `forge fmt` on those copies inside this repo and `cmp` against lib/forge-std/src/<file>: identical for all six.","severity":"low","snippet":"sha256sum -c lib/SHA256SUMS","title":"Documented integrity check `sha256sum -c lib/SHA256SUMS` fails: six vendored forge-std files were reformatted after their checksums were recorded"}],"hash":"f8adc0b79d609f51d0d3bfe8c7364877b72474e1147ee622fda85ff9c80ea9dc","nodeId":"66be8069-6456-490e-9d60-22fd7efd36fb","outcome":"completed","summary":"Review complete. The findings file holds one low-severity finding and eleven coverage rows; no file in the tree was changed.\n\n**Outcome.** The token is a stock OpenZeppelin v5.2.0 ERC-20 with a no-argument constructor that mints 10^27 units to the factory. Its only state-changing entry points are approve, transfer and transferFrom, and all three hold under the Execution Trace, Periphery and First Principles passes. The one defect is in the repository's own integrity tooling, not in production code.\n\n**Finding 1 (low).** The README's documented check `sha256sum -c lib/SHA256SUMS` fails on six forge-std files. Their recorded digests are the upstream v1.9.6 bytes, but the committed files are what `forge fmt` produces from them. I verified the difference is formatting only: whitespace-stripped content is identical, and `forge fmt` on fresh upstream copies yields files byte-identical to the committed ones. Fix is either to regenerate the checksums and reword lib/README.md, or to restore the upstream bytes and exclude lib/ from the formatter.\n\n**What I verified and how:**\n- All 32 project tests pass, including 128-run stateful invariants, and `forge fmt --check` passes.\n- The protected token floor passes against the compiled creation code with chain 4663, supply 10^27 and 18 decimals.\n- The five vendored OpenZeppelin files are byte-identical to upstream v5.2.0.\n- Compiled ABI has no fallback, receive, mint, owner or upgrade surface, and the 1785-byte runtime has no forbidden opcodes on reachable paths.\n- metadata/token.json carries the exact bio, website in every link field, the source post, and an embedded PNG whose bytes equal assets/logo.png. The metadata script runs clean.\n- The logo is a 512x512 opaque RGB crop of the source photo at the documented coordinates, confirmed pixel-by-pixel with Pillow unpacked into a temp directory. The source photo matches the tweet image byte-for-byte.\n\n**Not verifiable here.** The README handoff table states a launch-owner address, a 10 ETH opening cap and pool parameters that are not in the brief I was given. They presumably come from the builder's assignment. For a token-only launch the owner is unused, so I recorded this as a note in the coverage row rather than a finding.\n\n**Static-analysis leads.** Aderyn's large-numeric-literal line is the supply expression, which equals 10^27 and is tested. Slither reported nothing. Neither became a finding.","treeHash":null,"usage":{"cachedInputTokens":806354,"cost":{"source":"runtime","usdMicros":3135613},"inputTokens":354,"model":"claude-fable-5-1","outputTokens":22466,"runtime":"claude","turns":26,"wallClockMs":322364}}],"verification":[{"checks":[{"durationMs":1914,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.81s\nCompiler run successful!\n","passed":true},{"durationMs":11139,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApprovalsBelongOnlyToCaller() (gas: 138050)\n[PASS] testApproveReplaceAndRevoke() (gas: 183351)\n[PASS] testApproveZeroSpenderReverts() (gas: 37790)\n[PASS] testConstructorEmitsSingleMint() (gas: 585424)\n[PASS] testDeployerCannotMoveHolderTokensWithoutApproval() (gas: 90590)\n[PASS] testFactoryCanTransferNinetyPercentToPoolAndTenToDistributor() (gas: 918748)\n[PASS] testFactoryReceivesSupplyWithoutExternalConfiguration() (gas: 890250)\n[PASS] testFuzzOverspendingAllowanceReverts(uint256,uint256) (runs: 1024, μ: 123539, ~: 123933)\nLogs:\n  Bound result 8085157203985\n  Bound result 201167610878995885239683706\n\n[PASS] testFuzzOverspendingBalanceReverts(uint256) (runs: 1024, μ: 59273, ~: 59615)\nLogs:\n  Bound result 1000000000000000000000000001\n\n[PASS] testFuzzTransferConservesSupply(address,uint256) (runs: 1024, μ: 93201, ~: 93298)\nLogs:\n  Bound result 1\n\n[PASS] testFuzzTransferFromConservesSupplyAndAllowance(uint256,uint256) (runs: 1024, μ: 163461, ~: 165151)\nLogs:\n  Bound result 770202112745017740530499183\n  Bound result 15021753178855597\n\n[PASS] testIdentityAndSupply() (gas: 87419)\n[PASS] testNoMintBurnAdminOrUpgradeEntrypoints() (gas: 1076636)\n[PASS] testRejectsNativeETHAndUnknownCalls() (gas: 96661)\n[PASS] testRuntimeIsBoundedAndHasNoForbiddenOpcodes() (gas: 1336537)\n[PASS] testSelfTransferPreservesBalance() (gas: 51530)\n[PASS] testSelfTransferStillRequiresEnoughBalance() (gas: 36245)\n[PASS] testTransferExceedingBalanceRevertsWithoutChanges() (gas: 55228)\n[PASS] testTransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 242124)\n[PASS] testTransferFromInsufficientAllowanceIsAtomic() (gas: 116032)\n[PASS] testTransferFromInsufficientBalanceRollsBackAllowance() (gas: 126459)\n[PASS] testTransferFromPreservesInfiniteAllowance() (gas: 128907)\n[PASS] testTransferFromToHolderConsumesAllowanceButPreservesBalance() (gas: 105383)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 114296)\n[PASS] testTransferFromZeroAmountNeedsNoAllowance() (gas: 66191)\n[PASS] testTransferFromZeroSenderReverts() (gas: 54826)\n[PASS] testTransferReturnsTrueAndEmitsExactAmount() (gas: 91602)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 72261)\n[PASS] testUnapprovedSpenderCannotMoveTokens() (gas: 118183)\n[PASS] testWholeSupplyCanMoveWithoutLimitsOrCooldowns() (gas: 187225)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmits() (gas: 62847)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 146.90ms (514.54ms CPU time)\n\nRan 22 tests for test/LaunchToken.Adversarial.t.sol:LaunchTokenAdversarialTest\n[PASS] testAdminAndMetadataProbesUseValidABIEncoding() (gas: 608697)\n[PASS] testApprovalDoesNotReserveBalanceForSpender() (gas: 377361)\n[PASS] testApprovalFromEmptyHolderCanSpendOnlyAfterFunding() (gas: 230439)\n[PASS] testApprovedOriginCannotAuthorizeAnUnapprovedRelay() (gas: 360867)\n[PASS] testApprovedRelaySpendsItsOwnAllowanceRegardlessOfOrigin() (gas: 382637)\n[PASS] testContractRecipientCannotBlockOrReenterTransfer() (gas: 541382)\n[PASS] testEveryStateChangingEntrypointRejectsETHAtomically() (gas: 202907)\n[PASS] testFuzzApprovalOverwriteIsIdempotentAndIsolated(uint256,uint256) (runs: 1000, μ: 305157, ~: 305867)\n[PASS] testFuzzFailedSpendPreservesAllowanceAndCanBeRetried(uint256,uint256) (runs: 1000, μ: 329398, ~: 329324)\nLogs:\n  Bound result 671239248606148206808972143\n  Bound result 671239248606148206808972147\n\n[PASS] testFuzzFiniteAllowanceCannotBeReplayed(uint256,uint256) (runs: 1000, μ: 242232, ~: 242873)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 243\n\n[PASS] testFuzzSplittingTransfersHasSameResultAsOneTransfer(uint256,uint256) (runs: 1000, μ: 841006, ~: 842299)\nLogs:\n  Bound result 14251\n  Bound result 242\n\n[PASS] testFuzzTimeAndBlockChangesCannotRestrictTransfers(uint48,uint48) (runs: 1000, μ: 138332, ~: 138332)\n[PASS] testFuzzTransferRoundTripsAreExact(uint256,uint8) (runs: 1000, μ: 958485, ~: 871044)\nLogs:\n  Bound result 217081001590056829787873338\n  Bound result 15\n\n[PASS] testHolderNeedsSelfApprovalForTransferFrom() (gas: 175662)\n[PASS] testInfiniteApprovalCanBeReplacedAndRevoked() (gas: 370085)\n[PASS] testMaxUintApprovalIsInfiniteButMaxMinusOneIsFinite() (gas: 254990)\n[PASS] testMaxUintSpendWithInfiniteApprovalStillNeedsBalance() (gas: 124395)\n[PASS] testOneMinorUnitMovesWithoutRoundingOrTax() (gas: 141606)\n[PASS] testSpentAllowanceDoesNotReviveWhenBalanceReturns() (gas: 368642)\n[PASS] testZeroRecipientWithInfiniteApprovalCannotBurn() (gas: 155266)\n[PASS] testZeroSpenderCannotBeApprovedEvenForZeroOrMax() (gas: 78392)\n[PASS] testZeroTransfersEmitWithoutConsumingFiniteOrInfiniteApproval() (gas: 222604)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 146.83ms (775.67ms CPU time)\n\nRan 1 test for test/LaunchToken.invariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariantAllowancesMatchApprovalsAndSpending\n[PASS] invariantSupplyAndBalancesAreConserved\n LaunchTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2694  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | move         | 2680  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | moveApproved | 2818  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 866116735907230445313836605\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 40000000000000000000\n  Bound result 4067\n  Bound result 0\n  Bound result 16623671928458240255\n  Bound result 2\n  Bound result 10\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.35s (3.35s CPU time)\n\nRan 2 tests for test/LaunchToken.Stateful.t.sol:LaunchTokenStatefulTest\n[PASS]\nLaunchTokenStatefulTest invariants:\n[PASS] invariantBalancesAndAllowancesMatchIndependentLedger\n[PASS] invariantIdentityNeverChanges\n LaunchTokenStatefulTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+----------------------------+-------+---------+----------╮\n| Contract                | Selector                   | Calls | Reverts | Discards |\n+===================================================================================+\n| AdversarialTokenHandler | approve                    | 1968  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | donateToToken              | 2097  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | rejectAllowance            | 2061  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | rejectBalanceAfterApproval | 1998  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | rejectMintOrBurn           | 1980  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | rejectTransfer             | 2132  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | rejectZeroRecipient        | 2056  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | rejectZeroSpender          | 2006  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | revokeAndReject            | 2038  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | roundTrip                  | 2099  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | transfer                   | 2041  | 0       | 0        |\n|-------------------------+----------------------------+-------+---------+----------|\n| AdversarialTokenHandler | transferFrom               | 2100  | 0       | 0        |\n╰-------------------------+----------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 237651875134482502486387607\n  Bound result 10\n  Bound result 115792089237316195423570985008687907853269984665640439039457584007913307002083\n  Bound result 420401904701613770760464046464172143063080188946768193168891727497\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129640000\n  Bound result 254\n  Bound result 7263\n  Bound result 19759615919110304086146909510776327243328840802896\n  Bound result 1364\n  Bound result 1000000000000000000\n  Bound result 120209876281281145568259944\n  Bound result 135631812605665878045182737671287331257377356213566836974360621635760697\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 139415507370760308535894108\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129648605\n  Bound result 115792089237316195423570985008687907853269984665640314039458584007913246940673\n  Bound result 997\n  Bound result 24987732596977313720725347276073394784297054857808350870444375843304198\n  Bound result 2110234840\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640314040429824866975292251481\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007914129639935\n  Bound result 264544851\n  Bound result 734123449707699236086635442\n  Bound result 115792089237316195423570985008687907853269984665640314039458584007913129639951\n  Bound result 524294212562052585926439085\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129664511\n  Bound result 5509\n  Bound result 10712\n\n[PASS] testHandlerExercisesSuccessFailureAndBoundaryPaths() (gas: 3748166)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.01s (11.02s CPU time)\n\nRan 4 test suites in 11.02s (14.66s CPU time): 56 tests passed, 0 failed, 0 skipped (56 total tests)\n","passed":true},{"durationMs":50,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":156,\"assets/README.md\":37,\"assets/logo.png\":1339,\"assets/source-photo.jpg\":949,\"docs/REVIEW.md\":47,\"foundry.toml\":21,\"metadata/token.json\":19,\"remappings.txt\":2,\"src/LaunchToken.sol\":16,\"test/LaunchToken.Adversarial.t.sol\":398,\"test/LaunchToken.Stateful.t.sol\":346,\"test/LaunchToken.invariant.t.sol\":101,\"test/LaunchToken.t.sol\":382,\"test/README.md\":93,\"tools/metadata.py\":89},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3bf531d06590b871dc740c9c572a6c35467ca42d32df7880f51129a630005bc6","verifiedTreeHash":"75a1981bbcb260bc1226308ac4970e6553d233aa","verifierVersion":"0.1.0+435fe828"},{"checks":[{"durationMs":1287,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.18s\nCompiler run successful!\n","passed":true},{"durationMs":3715,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApprovalsBelongOnlyToCaller() (gas: 138050)\n[PASS] testApproveReplaceAndRevoke() (gas: 183351)\n[PASS] testApproveZeroSpenderReverts() (gas: 37790)\n[PASS] testConstructorEmitsSingleMint() (gas: 585424)\n[PASS] testDeployerCannotMoveHolderTokensWithoutApproval() (gas: 90590)\n[PASS] testFactoryCanTransferNinetyPercentToPoolAndTenToDistributor() (gas: 918748)\n[PASS] testFactoryReceivesSupplyWithoutExternalConfiguration() (gas: 890250)\n[PASS] testFuzzOverspendingAllowanceReverts(uint256,uint256) (runs: 1024, μ: 123583, ~: 123943)\nLogs:\n  Bound result 739958537343\n  Bound result 465294695069119224472118372\n\n[PASS] testFuzzOverspendingBalanceReverts(uint256) (runs: 1024, μ: 59272, ~: 59615)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039517584007913129639935\n\n[PASS] testFuzzTransferConservesSupply(address,uint256) (runs: 1024, μ: 93114, ~: 93298)\nLogs:\n  Bound result 311638544644439618477728484\n\n[PASS] testFuzzTransferFromConservesSupplyAndAllowance(uint256,uint256) (runs: 1024, μ: 163401, ~: 165151)\nLogs:\n  Bound result 885066238860466832\n  Bound result 76187314845264344\n\n[PASS] testIdentityAndSupply() (gas: 87419)\n[PASS] testNoMintBurnAdminOrUpgradeEntrypoints() (gas: 1076636)\n[PASS] testRejectsNativeETHAndUnknownCalls() (gas: 96661)\n[PASS] testRuntimeIsBoundedAndHasNoForbiddenOpcodes() (gas: 1336537)\n[PASS] testSelfTransferPreservesBalance() (gas: 51530)\n[PASS] testSelfTransferStillRequiresEnoughBalance() (gas: 36245)\n[PASS] testTransferExceedingBalanceRevertsWithoutChanges() (gas: 55228)\n[PASS] testTransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 242124)\n[PASS] testTransferFromInsufficientAllowanceIsAtomic() (gas: 116032)\n[PASS] testTransferFromInsufficientBalanceRollsBackAllowance() (gas: 126459)\n[PASS] testTransferFromPreservesInfiniteAllowance() (gas: 128907)\n[PASS] testTransferFromToHolderConsumesAllowanceButPreservesBalance() (gas: 105383)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 114296)\n[PASS] testTransferFromZeroAmountNeedsNoAllowance() (gas: 66191)\n[PASS] testTransferFromZeroSenderReverts() (gas: 54826)\n[PASS] testTransferReturnsTrueAndEmitsExactAmount() (gas: 91602)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 72261)\n[PASS] testUnapprovedSpenderCannotMoveTokens() (gas: 118183)\n[PASS] testWholeSupplyCanMoveWithoutLimitsOrCooldowns() (gas: 187225)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmits() (gas: 62847)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 39.30ms (150.45ms CPU time)\n\nRan 1 test for test/LaunchToken.invariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariantAllowancesMatchApprovalsAndSpending\n[PASS] invariantSupplyAndBalancesAreConserved\n LaunchTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2694  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | move         | 2680  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | moveApproved | 2818  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6010\n  Bound result 123000000000000000000\n  Bound result 5018\n  Bound result 0\n  Bound result 3\n  Bound result 866116735907230445313836605\n  Bound result 5803\n  Bound result 632\n  Bound result 0\n  Bound result 5342\n  Bound result 5158\n  Bound result 0\n  Bound result 0\n  Bound result 18\n  Bound result 297\n  Bound result 86\n  Bound result 3963891462\n  Bound result 0\n  Bound result 3\n  Bound result 243\n  Bound result 19\n  Bound result 0\n  Bound result 2054\n  Bound result 1583\n  Bound result 659\n  Bound result 6483100\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.58s (3.58s CPU time)\n\nRan 2 test suites in 3.59s (3.62s CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":66,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":156,\"assets/README.md\":37,\"assets/logo.png\":1339,\"assets/source-photo.jpg\":949,\"docs/REVIEW.md\":47,\"foundry.toml\":21,\"launch.json\":17,\"metadata/token.json\":19,\"remappings.txt\":2,\"src/LaunchToken.sol\":16,\"test/LaunchToken.invariant.t.sol\":101,\"test/LaunchToken.t.sol\":382,\"tools/metadata.py\":89},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7a51a39fa2a7a45c5ae2e626654a8d880b70489c64922ac2ce9901ed80b5b584","verifiedTreeHash":"1940316a448a3c78eee4fc555f5b098d3709e9cb","verifierVersion":"0.1.0+435fe828"},{"checks":[{"durationMs":1326,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.21s\nCompiler run successful!\n","passed":true},{"durationMs":3835,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApprovalsBelongOnlyToCaller() (gas: 138050)\n[PASS] testApproveReplaceAndRevoke() (gas: 183351)\n[PASS] testApproveZeroSpenderReverts() (gas: 37790)\n[PASS] testConstructorEmitsSingleMint() (gas: 585424)\n[PASS] testDeployerCannotMoveHolderTokensWithoutApproval() (gas: 90590)\n[PASS] testFactoryCanTransferNinetyPercentToPoolAndTenToDistributor() (gas: 918748)\n[PASS] testFactoryReceivesSupplyWithoutExternalConfiguration() (gas: 890250)\n[PASS] testFuzzOverspendingAllowanceReverts(uint256,uint256) (runs: 1024, μ: 123583, ~: 123943)\nLogs:\n  Bound result 24576\n  Bound result 999999999999999999999976424\n\n[PASS] testFuzzOverspendingBalanceReverts(uint256) (runs: 1024, μ: 59272, ~: 59615)\nLogs:\n  Bound result 1000000000000000000000000001\n\n[PASS] testFuzzTransferConservesSupply(address,uint256) (runs: 1024, μ: 93114, ~: 93298)\nLogs:\n  Bound result 20290250566794\n\n[PASS] testFuzzTransferFromConservesSupplyAndAllowance(uint256,uint256) (runs: 1024, μ: 163401, ~: 165151)\nLogs:\n  Bound result 1837366890\n  Bound result 19341\n\n[PASS] testIdentityAndSupply() (gas: 87419)\n[PASS] testNoMintBurnAdminOrUpgradeEntrypoints() (gas: 1076636)\n[PASS] testRejectsNativeETHAndUnknownCalls() (gas: 96661)\n[PASS] testRuntimeIsBoundedAndHasNoForbiddenOpcodes() (gas: 1336537)\n[PASS] testSelfTransferPreservesBalance() (gas: 51530)\n[PASS] testSelfTransferStillRequiresEnoughBalance() (gas: 36245)\n[PASS] testTransferExceedingBalanceRevertsWithoutChanges() (gas: 55228)\n[PASS] testTransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 242124)\n[PASS] testTransferFromInsufficientAllowanceIsAtomic() (gas: 116032)\n[PASS] testTransferFromInsufficientBalanceRollsBackAllowance() (gas: 126459)\n[PASS] testTransferFromPreservesInfiniteAllowance() (gas: 128907)\n[PASS] testTransferFromToHolderConsumesAllowanceButPreservesBalance() (gas: 105383)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 114296)\n[PASS] testTransferFromZeroAmountNeedsNoAllowance() (gas: 66191)\n[PASS] testTransferFromZeroSenderReverts() (gas: 54826)\n[PASS] testTransferReturnsTrueAndEmitsExactAmount() (gas: 91602)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 72261)\n[PASS] testUnapprovedSpenderCannotMoveTokens() (gas: 118183)\n[PASS] testWholeSupplyCanMoveWithoutLimitsOrCooldowns() (gas: 187225)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmits() (gas: 62847)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 51.70ms (163.39ms CPU time)\n\nRan 1 test for test/LaunchToken.invariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariantAllowancesMatchApprovalsAndSpending\n[PASS] invariantSupplyAndBalancesAreConserved\n LaunchTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2694  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | move         | 2680  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | moveApproved | 2818  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6010\n  Bound result 123000000000000000000\n  Bound result 5018\n  Bound result 0\n  Bound result 3\n  Bound result 866116735907230445313836605\n  Bound result 5803\n  Bound result 632\n  Bound result 0\n  Bound result 5342\n  Bound result 5158\n  Bound result 0\n  Bound result 0\n  Bound result 18\n  Bound result 297\n  Bound result 86\n  Bound result 3963891462\n  Bound result 0\n  Bound result 3\n  Bound result 243\n  Bound result 19\n  Bound result 0\n  Bound result 2054\n  Bound result 1583\n  Bound result 659\n  Bound result 6483100\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.66s (3.66s CPU time)\n\nRan 2 test suites in 3.66s (3.71s CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":64,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":156,\"assets/README.md\":37,\"assets/logo.png\":1339,\"assets/source-photo.jpg\":949,\"docs/REVIEW.md\":47,\"foundry.toml\":21,\"metadata/token.json\":19,\"remappings.txt\":2,\"src/LaunchToken.sol\":16,\"test/LaunchToken.invariant.t.sol\":101,\"test/LaunchToken.t.sol\":382,\"tools/metadata.py\":89},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":580,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":285,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/LaunchToken.sol:14: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8ea420f02001570cb3e85a3e88189d471cb1a63247c2972dccc9dfddb5d45ee0","verifiedTreeHash":"1f2ab8faf1b9ba7cfdaa6d5723ba7cbb1674926b","verifierVersion":"0.1.0+435fe828"}]}