{"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":"d34f696c-846b-4b59-b426-50d0a086abfb","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"f8dfc28643839c048ec17267239674b785c0cf7ec03d97e258081365cea4ffa3","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":"8ea0f678058ef847fb83606df0ce0df99099162e8876c21eca284cf5deeaab27","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":"564c5079b489f84419555996e7b69d1fce0c14ec89b650308dd9014f0926a941","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":"66dae9a31e84a8f233bb3fc8603832d8680a3d86e7579d35ecaea0d2eff336de","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":"4c58567c72583e588213276d1147c4ebb8a88db63ab2ab5da4cdb898b37d8749","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":"391c74c51670f6a900515bb22c320d131ef82f482d517603c3d761e378c83ee1","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":"e498f1a387d868899bd56575f2696979c484f0601d1139e0a98ba160a72d80bc","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"ad4b0421a74ed45540c8e22715178b344ef60843e189c07df0538eb6c48959c9","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: ImdWindowShopper (IWS).\nToken name: ImdWindowShopper\nToken symbol: IWS\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"b16d2e8eeeb0ed73a2432f23dc71761c6fb7f3f457ab6893c0f2c9961e779aeb","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"d34f696c-846b-4b59-b426-50d0a086abfb","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2395-imdwindowshopper"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52256","feedbackHash":"0196f1fdde360bc564f3c68d998ecaaeda6a07c33b97e07a3467da03129c6226","nodeKey":"audit_economics","submissionHash":"f8dfc28643839c048ec17267239674b785c0cf7ec03d97e258081365cea4ffa3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52585","feedbackHash":"a48cf906420d59a217685cbe6790183410a9e06096cf01311dc3a0695c2a2bc6","nodeKey":"audit_flow","submissionHash":"8ea0f678058ef847fb83606df0ce0df99099162e8876c21eca284cf5deeaab27","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52136","feedbackHash":"094e420cf4e439c703e28bb03e685f221e2bb3a0ef086598060f2f1f053e66b1","nodeKey":"audit_judge","submissionHash":"564c5079b489f84419555996e7b69d1fce0c14ec89b650308dd9014f0926a941","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51333","feedbackHash":"37f54209eb9adde31b50603491b90a09c66f4d3c337a16d3850f4ea0ecf10333","nodeKey":"audit_math","submissionHash":"66dae9a31e84a8f233bb3fc8603832d8680a3d86e7579d35ecaea0d2eff336de","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51334","feedbackHash":"62d5b380eeae77aa8885790ed05646c1d488211899fb8247770a78f0007a5257","nodeKey":"audit_permissions","submissionHash":"4c58567c72583e588213276d1147c4ebb8a88db63ab2ab5da4cdb898b37d8749","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50990","feedbackHash":"4de7138ca28b5b4ceafb5f03a67bd10f5f975014f2203d5453ca6407cc7fd6cb","nodeKey":"build_contract_project","submissionHash":"391c74c51670f6a900515bb22c320d131ef82f482d517603c3d761e378c83ee1","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50975","feedbackHash":"41f3baca19126ccc978cea55c14840b9efcebdd6b30510a6f053621b377416f5","nodeKey":"manifest","submissionHash":"e498f1a387d868899bd56575f2696979c484f0601d1139e0a98ba160a72d80bc","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51145","feedbackHash":"23e2a970628f8984fba4b62a6824a60e38cf41262a5eaf3a4ba407602a2870cd","nodeKey":"write_foundry_tests","submissionHash":"ad4b0421a74ed45540c8e22715178b344ef60843e189c07df0538eb6c48959c9","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"58e4aff10438bfaaed7a4fe34e1e46ac1282b9a34f5941032fb62c7626685d83","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"fa6c33876a1337823d3490f48d9cda45d40278770f9720707d18935837cbfa36","device":"1f805d33d69c340e","findings":[],"hash":"391c74c51670f6a900515bb22c320d131ef82f482d517603c3d761e378c83ee1","nodeId":"219275ce-d1bf-4a0e-9834-41023cc564cc","outcome":"completed","summary":"Implemented ImdWindowShopper (IWS) with 18 decimals and exactly 1,000,000,000 tokens minted once to the deployer.\n\nDependencies are vendored for offline builds. Deployment assumptions and operational responsibilities are documented in README.md.\n\nValidation passed with Solidity 0.8.26:\n\n- Offline build\n- All 33 tests, including fuzzing with the required seed and stateful invariants\n- `forge fmt --check`\n\nThe full protected launch integration remains for the independent verifier.","treeHash":"34a98a768fdad8628c45bf93ac368c0c5960b3de","usage":{"cachedInputTokens":576000,"inputTokens":51417,"model":"gpt-6-astra","outputTokens":14760,"runtime":"codex","turns":5,"wallClockMs":371208}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"433c37ef2c9c708d","findings":[{"citation":"resolved","description":"The dependency integrity procedure the project documents does not hold for the tree as committed. Running the documented command from the repository root reports seven forge-std files whose SHA-256 does not match lib/SHA256SUMS: lib/forge-std/src/StdJson.sol, interfaces/IMulticall3.sol, console.sol, Vm.sol, interfaces/IERC7540.sol, StdAssertions.sol and StdToml.sol. All five OpenZeppelin files (ERC20.sol, IERC20.sol, IERC20Metadata.sol, Context.sol, draft-IERC6093.sol) match, and ERC20.sol reads as the unmodified v5.4.0 release, so the production bytecode is not affected. The mismatched files are test-only (forge-std). The defect is the trust claim: a reviewer following DEPENDENCIES.md cannot confirm that the pinned forge-std v1.9.7 is what is vendored, and the test harness that validates the token runs on an unverified forge-std. Fix: regenerate lib/SHA256SUMS from the actual v1.9.7 archive contents (or re-vendor forge-std v1.9.7) so the documented check passes, and note in DEPENDENCIES.md which forge-std release the sums describe.","line":22,"path":"DEPENDENCIES.md","reproduction":"From the repository root run: sha256sum --check lib/SHA256SUMS. Expected (per DEPENDENCIES.md line 21-22): every line OK. Actual: 'sha256sum: WARNING: 7 computed checksums did NOT match', with lib/forge-std/src/Vm.sol listed as FAILED (recorded 9068805b...2cb1, computed a1b1c829...2a15) and lib/forge-std/src/StdJson.sol listed as FAILED (recorded 0211b47e...511f, computed 61bbf9b3...cb83), plus the five other forge-std files named above. No lib/openzeppelin-contracts file fails.","severity":"info","snippet":"locally from the repository root with `sha256sum --check lib/SHA256SUMS`.","title":"DEPENDENCIES.md promises a passing vendored-file hash check, but seven forge-std files fail it"}],"hash":"4c58567c72583e588213276d1147c4ebb8a88db63ab2ab5da4cdb898b37d8749","nodeId":"9750ebe0-fdad-41f9-96dc-90a0b0a88ee7","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. The working tree is otherwise untouched.\n\n**Result: no permission defects in the token.** ImdWindowShopper is an eleven-line contract inheriting the unmodified OpenZeppelin v5.4.0 ERC-20. It has no owner, roles, initializer, proxy, pause, blacklist, mint, burn or exemption list, so the Access Control, Trust Gap and Asymmetry failure modes have no surface to attach to.\n\nWhat I verified for each listed entry point:\n\n- **approve** writes only the caller's own allowance row and rejects a zero spender. No other actor can set a holder's allowance.\n- **transfer** debits only the caller, rejects a zero recipient, and treats the factory, distributor, pool manager and ordinary holders identically. Launch flows arrive whole.\n- **transferFrom** spends allowance before moving tokens, keeps max allowance unreduced, and reverts atomically on short balance or allowance. The deployer has no bypass.\n\nSupporting checks: the constructor mints the full supply once to msg.sender with no arguments. The compiled ABI exposes only the three state-changing ERC-20 functions plus views. An opcode walk of the runtime found no DELEGATECALL, CALLCODE or SELFDESTRUCT. All 33 local tests, the fuzz runs and the invariant suite pass, and `forge fmt --check` is clean.\n\n**One informational finding.** DEPENDENCIES.md tells reviewers to confirm vendored files with a hash check, but that check fails for seven forge-std files. The OpenZeppelin files all pass, so production bytecode is unaffected. The fix is to regenerate the sums file from the forge-std release actually vendored.\n\nThe coverage record has ten rows: the three entry points and seven invariants, all `holds` except the dependency-hash note, which points at the finding. No proof test was needed since nothing rose to high or critical.","treeHash":null,"usage":{"cachedInputTokens":647241,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":9083,"runtime":"claude","turns":23,"wallClockMs":178434}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"00920b27421b9a80","findings":[{"citation":"resolved","description":"Merged from all four specialists (economics, permissions, math, flow), who reported the same root cause. DEPENDENCIES.md line 4 states the upstream files have not been modified and line 22 tells the reader to confirm this with `sha256sum --check lib/SHA256SUMS`. On the committed tree (HEAD d36251f, `git status` clean) that command exits 1 and reports 7 checksums that do not match, all under lib/forge-std/src/: StdJson.sol, StdToml.sol, StdAssertions.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol and interfaces/IERC7540.sol. I re-downloaded both pinned archives from the URLs the file names; their SHA-256 values equal the ones DEPENDENCIES.md records (OpenZeppelin b89829be...50d1, forge-std 45157353...ee94). Every hash in lib/SHA256SUMS equals the hash of the corresponding genuine upstream file (30 of 30 forge-std entries OK against the extracted archive), so the recorded sums are correct and it is the seven vendored copies that were changed after hashing. The change is formatting only: with all whitespace stripped, each of the seven files hashes identically to its upstream counterpart (for example a diff of Vm.sol shows multi-line function signatures joined onto one line). All five vendored OpenZeppelin v5.4.0 files that compile into ImdWindowShopper (ERC20.sol, IERC20.sol, IERC20Metadata.sol, Context.sol, draft-IERC6093.sol) are byte-identical to upstream, so the token's bytecode and behaviour are unaffected; forge-std is test-only and is not deployed. Impact is confined to the provenance claim the repository makes about itself: an operator following the documented procedure gets an integrity failure and cannot tell a harmless reformat from a tampered test library without repeating the comparison above. No funds, roles or launch flows are affected, so this is low. Fix (either): restore the seven files byte-for-byte from the pinned v1.9.7 archive so the documented check passes; or regenerate lib/SHA256SUMS from the files as vendored and reword DEPENDENCIES.md line 4 to say the forge-std files were reformatted (forge fmt) and are otherwise identical to upstream.","line":4,"path":"DEPENDENCIES.md","reproduction":"From the repository root on a clean checkout run `sha256sum --check lib/SHA256SUMS`. Expected (per DEPENDENCIES.md lines 4 and 21-22): every line prints OK and the command exits 0. Actual: 7 lines print FAILED (lib/forge-std/src/StdJson.sol, interfaces/IMulticall3.sol, console.sol, Vm.sol, interfaces/IERC7540.sol, StdAssertions.sol, StdToml.sol), the summary is 'sha256sum: WARNING: 7 computed checksums did NOT match', exit status 1. Example: lib/SHA256SUMS line 21 records 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1 for lib/forge-std/src/Vm.sol; `sha256sum lib/forge-std/src/Vm.sol` prints a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15. Cause check: download https://codeload.github.com/foundry-rs/forge-std/tar.gz/refs/tags/v1.9.7 (SHA-256 45157353ab49eab01d294565866731e599b32401757229689ee459aa26b7ee94), extract, and for each of the 7 files compare `tr -d ' \\t\\n\\r' < upstream | sha256sum` with the same over the vendored copy: all 7 pairs are equal, so the difference is whitespace only. `cmp` of each vendored OpenZeppelin file against the extracted v5.4.0 archive reports no difference.","severity":"low","snippet":"to compile or test after checkout. The upstream files have not been modified.","title":"DEPENDENCIES.md claims the vendored files are unmodified and that `sha256sum --check lib/SHA256SUMS` verifies them, but the check fails on seven reformatted forge-std files"}],"hash":"564c5079b489f84419555996e7b69d1fce0c14ec89b650308dd9014f0926a941","nodeId":"d1a1cdf6-9a41-45ad-b4a2-fbad68d98f17","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root. No source files were changed.\n\n**Outcome:** one low-severity finding, merged from the four specialists, who all reported the same root cause. The token itself is clean.\n\n**What I verified**\n\n- The token is an unmodified OpenZeppelin v5.4.0 ERC20 with a parameterless constructor that mints 1e27 units to msg.sender. No owner, mint, burn, pause or blacklist path exists, and the ABI exposes only the three listed entry points plus views.\n- The five vendored OpenZeppelin files compiled into the token are byte-identical to the upstream v5.4.0 archive, which I re-downloaded and checked against the archive hash DEPENDENCIES.md records.\n- The build succeeds and all 55 project tests pass, including the invariant suites. Creation and runtime bytecode are far under the protocol size limits.\n- launch.json uses only schema keys, lowercase addresses, an empty constructorArgs list matching the zero-parameter constructor, and a totalSupply equal to what the constructor mints.\n- The aderyn large-numeric-literal lead is a compile-time constant with no defect.\n\n**The kept finding (low):** DEPENDENCIES.md states the vendored files are unmodified and directs the reader to `sha256sum --check lib/SHA256SUMS`. That command fails on seven forge-std files. The recorded hashes are the genuine upstream v1.9.7 hashes. The vendored copies differ only in whitespace, which I confirmed by comparing whitespace-stripped hashes against the extracted archive. forge-std is test-only, so there is no effect on deployed bytecode, only a false provenance claim. The fix is to restore the seven files byte-for-byte or to regenerate the sums and reword the claim.\n\n**Coverage:** all three entry points answered as holds, with extra rows for the constructor, the fixed-supply and no-privilege invariants, the manifest, and the static-analysis lead.","treeHash":null,"usage":{"cachedInputTokens":377985,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":8575,"runtime":"claude","turns":13,"wallClockMs":189860}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"41f7c1458e1278ad","findings":[{"citation":"resolved","description":"Outside the assigned math area, reported because it is reproducible and the documentation directs the launch operator to this exact check. DEPENDENCIES.md states that the vendored upstream files have not been modified and that `sha256sum --check lib/SHA256SUMS` verifies them. In the committed tree (HEAD dc2a700, working tree clean) the check fails for seven forge-std files: StdJson.sol, interfaces/IMulticall3.sol, console.sol, Vm.sol, interfaces/IERC7540.sol, StdAssertions.sol, StdToml.sol. For example lib/SHA256SUMS lists Vm.sol as 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1 while the file in the tree hashes to a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15 (2369 lines). All six OpenZeppelin files match their recorded hashes, so the production dependency (ERC20.sol and its imports, v5.4.0) is intact and this does not affect the token's bytecode or behaviour; only the test-side dependency differs from its documented pin. Impact is limited to a false provenance statement: an operator following the README/DEPENDENCIES instructions gets a failed check and cannot tell whether forge-std v1.9.7 is really what is vendored (lib/forge-std has no package.json to confirm the version). The cause may be that the verifier's toolchain (forge 1.8.3) substituted a newer forge-std; contributors may not edit lib/, so the fix is documentation-side: either regenerate the hash list under the launch process's authority or state in DEPENDENCIES.md which forge-std revision is actually vendored and that the hash list covers only the OpenZeppelin files.","line":21,"path":"DEPENDENCIES.md","reproduction":"From the repository root on commit dc2a700 with a clean working tree run: `sha256sum --check lib/SHA256SUMS 2>/dev/null | grep -v ': OK$'`. Expected per DEPENDENCIES.md lines 4 and 21-22: no output (every file OK). Actual: seven lines ending in FAILED (lib/forge-std/src/StdJson.sol, lib/forge-std/src/interfaces/IMulticall3.sol, lib/forge-std/src/console.sol, lib/forge-std/src/Vm.sol, lib/forge-std/src/interfaces/IERC7540.sol, lib/forge-std/src/StdAssertions.sol, lib/forge-std/src/StdToml.sol) and the summary 'WARNING: 7 computed checksums did NOT match'. `git diff HEAD --stat -- lib` prints nothing, so the mismatch is in the committed tree, not a local modification.","severity":"low","snippet":"`lib/SHA256SUMS` records hashes of every included upstream file. Verify them\nlocally from the repository root with `sha256sum --check lib/SHA256SUMS`.","title":"DEPENDENCIES.md integrity claim fails: sha256sum --check lib/SHA256SUMS reports 7 forge-std files modified in the committed tree"}],"hash":"66dae9a31e84a8f233bb3fc8603832d8680a3d86e7579d35ecaea0d2eff336de","nodeId":"f0cbec08-d6a4-42e6-8a79-4338f857fe63","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with one low finding and eight coverage rows. Git status is clean because `.gitignore` excludes the findings file and the scratch test, and no tracked file was changed.\n\n**Outcome for the assigned area (Math Precision, Boundary, Numerical Gap): no defects.** The token is a 17-line fixed-supply OpenZeppelin v5.4.0 ERC-20. It contains no division, no narrowing casts, no scale conversion, no external calls, no payable path and no bytes decoding, so most failure modes in the three guides have no surface here. What does exist was traced and tested:\n\n- **Supply constant** `1_000_000_000 * 10 ** 18` evaluates to exactly 1e27, the 28-digit manifest literal, and `decimals()` is 18. The aderyn large-literal lead is not a defect.\n- **Launch split** of 10%/80%/10% divides 1e27 with zero remainder, so the swarm share, pool seed and remainder are exact. 1e27 is far below the int128 bound of Uniswap v4's delta accounting.\n- **Transfer arithmetic** in OpenZeppelin's `_update` checks balance before the unchecked subtraction. The unchecked addition is bounded by total supply. Amount 0, full balance, self-transfer, max uint, zero recipient and zero sender all behave as the README documents.\n- **Allowance arithmetic** checks before the unchecked decrement, keeps the max-uint sentinel, treats max-minus-one as finite, and restores the allowance on every revert path.\n- **Invariants** of constant supply and sum-of-balances held across the project's 256x64 invariant runs, its 1024-run fuzz tests and my scratch fuzz. The full project suite passes (33 tests) and `forge fmt --check` is clean.\n\n**One low finding, outside the area:** DEPENDENCIES.md tells the operator to verify vendored files with `sha256sum --check lib/SHA256SUMS`, but in the committed tree that check fails for seven forge-std files, including Vm.sol. All six OpenZeppelin files match, so the production dependency and bytecode are unaffected. The mismatch may come from the verifier's toolchain swapping forge-std, and contributors cannot edit `lib/`, so the fix is documentation-side. The finding carries the exact command and expected-versus-actual output.\n\n**Coverage:** all three ABI entry points (approve, transfer, transferFrom) are marked `holds`, plus five invariant and boundary rows. Nothing was left unreached. Slither and Mythril were not run beyond the supplied static-analysis output.","treeHash":null,"usage":{"cachedInputTokens":789747,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":15299,"runtime":"claude","turns":29,"wallClockMs":251379}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3c1226d190150ef0","findings":[{"citation":"resolved","description":"DEPENDENCIES.md says the vendored upstream files are unmodified, and line 22 tells the reader to check this with `sha256sum --check lib/SHA256SUMS`. That command fails on seven forge-std files. A diff against the upstream v1.9.7 archive (its SHA-256 45157353ab49eab01d294565866731e599b32401757229689ee459aa26b7ee94 matches the one DEPENDENCIES.md records) shows only whitespace and line-wrapping changes, the kind forge fmt makes, for example long function signatures joined onto one line. Once all whitespace is removed, each file is identical to upstream, so test behaviour is unchanged. forge-std is used only by tests and is not in the deployed bytecode. The vendored OpenZeppelin v5.4.0 files, which are compiled into the token, are byte-identical to the upstream release. The only impact is that the provenance check the project documents does not pass, so a verifier following DEPENDENCIES.md sees an integrity failure. There is no on-chain effect.","line":4,"path":"DEPENDENCIES.md","reproduction":"From the repository root, run `sha256sum --check lib/SHA256SUMS`. Expected: every line OK, as DEPENDENCIES.md says. Actual: FAILED for lib/forge-std/src/StdJson.sol, interfaces/IMulticall3.sol, console.sol, Vm.sol, interfaces/IERC7540.sol, StdAssertions.sol and StdToml.sol ('7 computed checksums did NOT match'). For example, SHA256SUMS records 9068805b...2cb1 for Vm.sol, but the file hashes to a1b1c829...2a15. `diff` against forge-std-1.9.7/src/Vm.sol from the upstream archive shows line 827 `getDeployment(...)` joined from 4 lines into 1. Comparing after `tr -d ' \\n\\t\\r'` shows all 7 files are equal to upstream. Fix: restore the upstream formatting of the 7 files, or regenerate SHA256SUMS and remove the 'not been modified' claim.","severity":"info","snippet":"to compile or test after checkout. The upstream files have not been modified.","title":"Recorded dependency integrity check fails: 7 vendored forge-std files are reformatted, contradicting DEPENDENCIES.md"}],"hash":"8ea0f678058ef847fb83606df0ce0df99099162e8876c21eca284cf5deeaab27","nodeId":"52cbb3d7-76d0-4a1a-801b-d855d8dabc3b","outcome":"completed","summary":"I found no exploitable defect in ImdWindowShopper (IWS). The only finding is informational: the dependency integrity check the project documents fails. My findings and coverage are in `.imd-findings.json`. The full test suite passed (33 tests, including fuzz and invariant tests) and `forge fmt --check` is clean; I made no other file changes.\n\n**What the token is:** `src/ImdWindowShopper.sol` is a plain OpenZeppelin v5.4.0 ERC20. It mints 10^27 units to `msg.sender` once, in the constructor. It has no overrides, no owner, no assembly and no hooks.\n\n**Coverage of my three guides:**\n- **Execution Trace:** I traced `approve`, `transfer` and `transferFrom` from entry to final state.\n  - No mismatched inputs, fees or callbacks can make a transfer arrive short, so the factory, distributor and PoolManager flows move exactly what they say.\n  - An unlimited (max) allowance is never reduced, and a failed call undoes everything, including the allowance change.\n  - Allowance left over after a spend is ordinary ERC20 behaviour, and the README already documents it.\n- **Periphery:** I diffed the vendored OpenZeppelin files against the upstream v5.4.0 release; they are byte-identical, so nothing is hidden in the base contract.\n- **First Principles:** I checked every assumption the code makes:\n  - The supply can never grow after deployment.\n  - `decimals()` returns 18, and the name and symbol are exact.\n  - No privileged call can move or freeze a holder's balance.\n  - There is no DELEGATECALL or SELFDESTRUCT.\n\nAll three entry points are marked `holds`, plus three invariant rows.\n\n**Finding 1 (info), `DEPENDENCIES.md:4`:** the file says the vendored files are unmodified, but `sha256sum --check lib/SHA256SUMS` fails on 7 forge-std files. I compared them with the upstream v1.9.7 archive, whose hash matches the one the file records. The changes are whitespace and line-wrapping only, the kind `forge fmt` makes; with whitespace removed, every file matches upstream. forge-std is used only by tests, so nothing deployed is affected. The fix is to restore the upstream formatting, or regenerate `SHA256SUMS` and drop the \"not modified\" claim.\n\n**Limits:** I had no Uniswap v4 or launch harness, so the protected integration tests did not run here; the token has no transfer hooks that could affect them. Slither and Mythril were not run; the supplied static-analysis output showed only the aderyn large-number-literal note, which is not a defect.\n\nAfter my run, `git status` shows untracked dotfiles and folders I did not create, such as `.bashrc`, `.gitconfig`, `.gitmodules`, `.mcp.json`, `.claude/` and `.vscode`. They look like environment artifacts, so I left them alone. Check them before you submit, since a submission that changes files is rejected.","treeHash":null,"usage":{"cachedInputTokens":586689,"inputTokens":26,"model":"claude-opus-5-5","outputTokens":7681,"runtime":"claude","turns":13,"wallClockMs":109560}},{"artifacts":[],"attempt":1,"bundleHash":"cf21ac475a5c2eba428cac44ed086a6458013ed58a4a7877487ff54ad2804c73","device":"3b9f88f55251764d","findings":[],"hash":"ad4b0421a74ed45540c8e22715178b344ef60843e189c07df0538eb6c48959c9","nodeId":"8f42acf9-068d-4a72-9678-34a41a332d08","outcome":"completed","summary":"I added `test/ImdWindowShopper.adversarial.t.sol`. The whole suite now passes with the verifier's fuzz seed: 55 tests across 4 suites, 0 failures. `forge build` is clean, and the only change in the working tree is that new file.\n\n**What was already there:** the earlier work already had a good unit and fuzz suite, plus one invariant suite. That invariant suite only made calls that were meant to succeed. I kept all of it and added to it.\n\n**What the new file adds:**\n- **A second invariant suite**, 256 runs of 64 random calls each. The supply starts with a factory-style contract, as it does at launch, and five actors call in random order. Mixed in with normal transfers, approvals (some unlimited) and delegated spends are calls that must fail:\n  - spending more than a balance;\n  - spending more than an allowance;\n  - sending to the zero address;\n  - calling admin functions that don't exist (mint, burn, burnFrom, pause, blacklist, transferOwnership).\n\n  Each failing call must revert with the exact ERC-20 error. The invariants are that the total supply never changes, the actors' balances add up to the full supply, and every balance and allowance matches separately tracked expected values.\n- **Edge cases:**\n  - calls made from the zero address;\n  - an owner approving themself;\n  - the same transfer or delegated spend made twice;\n  - allowances larger than the supply;\n  - an allowance of one less than the maximum, which shrinks as it's spent, while the true maximum never does.\n- **Bad calls:** sending ETH to functions that don't accept it, cut-off calldata, and unknown function selectors (also fuzzed) all fail.\n- **Launch flow:** a helper contract deploys the token and splits it to distributor, pool and remainder in a single call, as the factory does in one transaction. A fuzz test checks the amounts come out exact for any pool share up to 90%, and deploying twice with the same salt fails.\n\n**Defects:** none found, so I didn't write `.imd-findings.json`. The token is a plain OpenZeppelin v5.4.0 ERC-20 with no owner, mint, burn or transfer fee. During the work one test failed. That was my wrong expected error, not a contract bug: the token checks the allowance before the owner address, which is the library's normal behaviour. I corrected the test.\n\nI couldn't run the protected launch checks here. They need the network's launch harness and Uniswap v4, which only the verifier has. The new file isn't committed.","treeHash":"8d0fd0ede8406f2c37c97e9925e651059d69cab9","usage":{"cachedInputTokens":340107,"inputTokens":16,"model":"claude-opus-5-5","outputTokens":11725,"runtime":"claude","turns":10,"wallClockMs":143124}},{"artifacts":[],"attempt":1,"bundleHash":"de3dcab938fb1644bd88a0e92761c06799c8cc6ee8056e6651bd9cfc9a77f073","device":"377843575071cdb1","findings":[],"hash":"e498f1a387d868899bd56575f2696979c484f0601d1139e0a98ba160a72d80bc","nodeId":"6ea2d758-ab03-4127-bf9b-1918a25589e7","outcome":"completed","summary":"Created [launch.json](/home/worker/.identitymd/work/d34f696c-846b-4b59-b426-50d0a086abfb/6ea2d758-ab03-4127-bf9b-1918a25589e7/launch.json) matching the accepted token, exact supply, empty constructor arguments, and required pool and economics values.\n\nManifest checks and `forge build` passed. `forge test` passed all 33 tests with the supplied fuzz seed. Only `launch.json` is changed for submission.","treeHash":"134d6ffd8416f988574ca6141ba343beb7c5e9a6","usage":{"cachedInputTokens":209408,"inputTokens":23900,"model":"gpt-6-astra","outputTokens":2539,"runtime":"codex","turns":3,"wallClockMs":80351}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"72f49cf84b9ab056","findings":[{"citation":"resolved","description":"DEPENDENCIES.md states that the vendored upstream files are unmodified and tells the reader to verify them with `sha256sum --check lib/SHA256SUMS`. That check fails on seven forge-std files: lib/forge-std/src/StdJson.sol, StdToml.sol, StdAssertions.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol and interfaces/IERC7540.sol. The hashes recorded in lib/SHA256SUMS are the genuine upstream v1.9.7 hashes (verified against the archive whose SHA-256 is 45157353ab49...ee94, downloaded from the URL the file names), so it is the vendored copies that were changed after hashing. The change is formatting only: with all whitespace removed every one of the seven files is byte-identical to upstream, so no behaviour differs and the production dependency (OpenZeppelin v5.4.0 ERC20.sol and its four transitive imports) is byte-identical to upstream and passes the check. forge-std is used only by tests and is not deployed. Impact is limited to the integrity claim the repository makes about itself: a verifier following the documented procedure gets a failed check and cannot distinguish a harmless reformat from a tampered test library without doing the comparison above. This is outside the economics area and is reported because it has a concrete reproduction, not because it affects funds. Fix: either copy the seven upstream files back byte-for-byte (the pinned archive is the source), or regenerate lib/SHA256SUMS from the files as vendored and amend the note to say the files were reformatted.","line":4,"path":"DEPENDENCIES.md","reproduction":"From the repository root run `sha256sum --check lib/SHA256SUMS`. Expected (per DEPENDENCIES.md): every line reports OK. Actual: 7 lines report FAILED (lib/forge-std/src/StdJson.sol, interfaces/IMulticall3.sol, console.sol, Vm.sol, interfaces/IERC7540.sol, StdAssertions.sol, StdToml.sol) and the command exits non-zero with 'WARNING: 7 computed checksums did NOT match'. Confirming the cause: `diff /tmp/forge-std-1.9.7/src/Vm.sol lib/forge-std/src/Vm.sol` shows only multi-line signatures joined onto one line (e.g. upstream lines 827-830 `function getDeployment(string calldata contractName, uint64 chainId)\\n external\\n view\\n returns (address deployedAddress);` versus the vendored single line), and `tr -d ' \\t\\n\\r' < upstream | sha256sum` equals the same over the vendored file for all seven.","severity":"low","snippet":"to compile or test after checkout. The upstream files have not been modified.","title":"Vendored forge-std files do not match the recorded integrity hashes; the documented sha256sum check fails"}],"hash":"f8dfc28643839c048ec17267239674b785c0cf7ec03d97e258081365cea4ffa3","nodeId":"fa95295b-e3bc-4520-95e5-14ad1df61902","outcome":"completed","summary":"The review is complete and the findings file is written. Nothing else needs to be requested.\n\n**Outcome:** the token holds in my area. ImdWindowShopper is the unmodified OpenZeppelin v5.4.0 ERC-20 with one constructor mint of exactly 10^27 units to msg.sender, no further entry points, and no external calls. I found one low-severity defect, outside the economics area, and recorded it with a concrete reproduction.\n\n**What I checked, against the Economic Security, Invariant and Flow Gap guides:**\n- **Supply conservation and growth.** The only mint is in the constructor. The ABI exposes exactly approve, transfer and transferFrom. The existing stateful invariant suite plus a scratch fuzz test confirmed the sum of balances equals total supply under arbitrary addresses, including the token and factory addresses.\n- **Launch flows.** The ten percent swarm share leaves the factory whole and is claimable whole. Pool round trips move exact amounts for 1 wei and large transfers. No fee, burn, hook or callback exists, so the protected seed and swap checks have nothing to trip on.\n- **Flow gaps and reentrancy.** A reachability scan of the runtime bytecode found no CALL-family, CREATE or SELFDESTRUCT opcodes. There is no receive or fallback, so stray ETH reverts.\n- **Economic trust assumptions.** No owner, pauser, blacklist, minter or upgrade role exists. The only trusted party is the launch factory holding the initial supply, which is the design.\n- **Dependency integrity.** The five OpenZeppelin files are byte-identical to the v5.4.0 archive.\n\n**The one finding (low).** The dependency notes say the vendored files are unmodified and tell the reader to verify them with the recorded hash list. That check fails on seven forge-std files. The recorded hashes are the genuine upstream v1.9.7 hashes. The vendored copies were reformatted after hashing. With whitespace stripped they are identical to upstream, and forge-std is test-only, so there is no runtime impact. The fix is to restore the byte-exact upstream files or regenerate the hash list and amend the note.\n\n**Coverage record.** All three entry points are marked holds, with six additional rows for the invariants and flows I traced. The scratch test was removed, and the working tree contains only the findings file and the pinned inputs.","treeHash":null,"usage":{"cachedInputTokens":616078,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":14555,"runtime":"claude","turns":25,"wallClockMs":189222}}],"verification":[{"checks":[{"durationMs":1062,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 993.61ms\nCompiler run successful!\n","passed":true},{"durationMs":4826,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/ImdWindowShopper.t.sol:ImdWindowShopperTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 1024, μ: 126957, ~: 127127)\nLogs:\n  Bound result 8\n  Bound result 13\n\n[PASS] testFuzz_transferConservesBalances(address,uint256) (runs: 1024, μ: 92822, ~: 93116)\nLogs:\n  Bound result 539232425829283274037309449\n\n[PASS] testFuzz_transferFromAboveAllowanceReverts(uint256,uint256) (runs: 1024, μ: 125063, ~: 125399)\nLogs:\n  Bound result 20781\n  Bound result 27032\n\n[PASS] testFuzz_transferFromRespectsBalanceAndAllowance(uint256,uint256) (runs: 1024, μ: 166381, ~: 167202)\nLogs:\n  Bound result 433495005958717357487946419\n  Bound result 238286416986327143004142263704236135397531962703788333\n\n[PASS] test_approveEmitsEventWithoutMovingTokens() (gas: 88734)\n[PASS] test_approveReplacesAllowanceAndCanRevoke() (gas: 163796)\n[PASS] test_approveZeroSpenderReverts() (gas: 30387)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9676)\n[PASS] test_create2MintsToFactoryNotCallerOrOrigin() (gas: 305301)\n[PASS] test_launchDistributionClaimsAndPoolTransfersAreExact() (gas: 658002)\n[PASS] test_metadataAndWholeSupply() (gas: 107584)\n[PASS] test_noMintBurnOrAdministrationEntrypoints() (gas: 1380441)\n[PASS] test_otherSpenderCannotUseAllowance() (gas: 92723)\n[PASS] test_plainEtherTransferReverts() (gas: 36798)\n[PASS] test_selfTransferPreservesBalance() (gas: 51410)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 93527)\n[PASS] test_transferEntireBalance() (gas: 75831)\n[PASS] test_transferFromInsufficientAllowanceRevertsAtomically() (gas: 115733)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 126223)\n[PASS] test_transferFromKeepsInfiniteAllowance() (gas: 128979)\n[PASS] test_transferFromMovesExactAmountAndConsumesFiniteAllowance() (gas: 244063)\n[PASS] test_transferFromSelfStillConsumesAllowance() (gas: 105360)\n[PASS] test_transferFromWithoutAllowanceRevertsEvenForDeployer() (gas: 105555)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 81493)\n[PASS] test_transferFromZeroRecipientRestoresAllowance() (gas: 114215)\n[PASS] test_transferFromZeroSenderReverts() (gas: 35321)\n[PASS] test_transferMaxUintRevertsWithoutChangingSupply() (gas: 52759)\n[PASS] test_transferToContractDoesNotCallRecipient() (gas: 173801)\n[PASS] test_transferToZeroReverts() (gas: 47641)\n[PASS] test_transferWithInsufficientBalanceReverts() (gas: 57449)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73400)\n[PASS] test_zeroTransferToZeroAlsoReverts() (gas: 30478)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 27.16ms (110.42ms CPU time)\n\nRan 1 test for test/ImdWindowShopper.invariant.t.sol:ImdWindowShopperInvariantTest\n[PASS]\nImdWindowShopperInvariantTest invariants:\n[PASS] invariant_allowancesMatchIndependentAccounting\n[PASS] invariant_balancesMatchIndependentAccounting\n[PASS] invariant_supplyIsConstantAndAllTokensAreAccountedFor\n ImdWindowShopperInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 4144  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | revoke       | 4023  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 4092  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 4125  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 89\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 1515\n  Bound result 0\n  Bound result 15\n  Bound result 826074472\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 117300740\n  Bound result 0\n  Bound result 4717\n  Bound result 0\n  Bound result 54737212110432112052502110\n  Bound result 30000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 8384606807198635911452335\n  Bound result 599\n  Bound result 867\n  Bound result 300\n  Bound result 100000000000000000000\n  Bound result 5\n  Bound result 6737008183948512437\n  Bound result 0\n  Bound result 9\n  Bound result 13\n  Bound result 214\n  Bound result 4844\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.75s (4.75s CPU time)\n\nRan 2 test suites in 4.75s (4.78s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":32,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ImdWindowShopper.approve(address,uint256)\",\"ImdWindowShopper.transfer(address,uint256)\",\"ImdWindowShopper.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":22,\"README.md\":112,\"foundry.toml\":19,\"remappings.txt\":2,\"src/ImdWindowShopper.sol\":17,\"test/ImdWindowShopper.invariant.t.sol\":112,\"test/ImdWindowShopper.t.sol\":392,\"test/helpers/LaunchFactory.sol\":15},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":367,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":219,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/ImdWindowShopper.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"391c74c51670f6a900515bb22c320d131ef82f482d517603c3d761e378c83ee1","verifiedTreeHash":"34a98a768fdad8628c45bf93ac368c0c5960b3de","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":1871,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.78s\nCompiler run successful!\n","passed":true},{"durationMs":6211,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/ImdWindowShopper.t.sol:ImdWindowShopperTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 1024, μ: 126835, ~: 127163)\nLogs:\n  Bound result 520517884082035378931102115\n  Bound result 3623915976529248242351943554362725472154657\n\n[PASS] testFuzz_transferConservesBalances(address,uint256) (runs: 1024, μ: 92858, ~: 93128)\nLogs:\n  Bound result 417470527923779243698095011\n\n[PASS] testFuzz_transferFromAboveAllowanceReverts(uint256,uint256) (runs: 1024, μ: 124973, ~: 125400)\nLogs:\n  Bound result 30000000000000000000\n  Bound result 999999970000000000000002172\n\n[PASS] testFuzz_transferFromRespectsBalanceAndAllowance(uint256,uint256) (runs: 1024, μ: 166266, ~: 167214)\nLogs:\n  Bound result 140846314869452931570650933\n  Bound result 8397941011598579349098631815968031412231104\n\n[PASS] test_approveEmitsEventWithoutMovingTokens() (gas: 88734)\n[PASS] test_approveReplacesAllowanceAndCanRevoke() (gas: 163796)\n[PASS] test_approveZeroSpenderReverts() (gas: 30387)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9676)\n[PASS] test_create2MintsToFactoryNotCallerOrOrigin() (gas: 305301)\n[PASS] test_launchDistributionClaimsAndPoolTransfersAreExact() (gas: 658002)\n[PASS] test_metadataAndWholeSupply() (gas: 107584)\n[PASS] test_noMintBurnOrAdministrationEntrypoints() (gas: 1380441)\n[PASS] test_otherSpenderCannotUseAllowance() (gas: 92723)\n[PASS] test_plainEtherTransferReverts() (gas: 36798)\n[PASS] test_selfTransferPreservesBalance() (gas: 51410)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 93527)\n[PASS] test_transferEntireBalance() (gas: 75831)\n[PASS] test_transferFromInsufficientAllowanceRevertsAtomically() (gas: 115733)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 126223)\n[PASS] test_transferFromKeepsInfiniteAllowance() (gas: 128979)\n[PASS] test_transferFromMovesExactAmountAndConsumesFiniteAllowance() (gas: 244063)\n[PASS] test_transferFromSelfStillConsumesAllowance() (gas: 105360)\n[PASS] test_transferFromWithoutAllowanceRevertsEvenForDeployer() (gas: 105555)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 81493)\n[PASS] test_transferFromZeroRecipientRestoresAllowance() (gas: 114215)\n[PASS] test_transferFromZeroSenderReverts() (gas: 35321)\n[PASS] test_transferMaxUintRevertsWithoutChangingSupply() (gas: 52759)\n[PASS] test_transferToContractDoesNotCallRecipient() (gas: 173801)\n[PASS] test_transferToZeroReverts() (gas: 47641)\n[PASS] test_transferWithInsufficientBalanceReverts() (gas: 57449)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73400)\n[PASS] test_zeroTransferToZeroAlsoReverts() (gas: 30478)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 76.07ms (280.90ms CPU time)\n\nRan 21 tests for test/ImdWindowShopper.adversarial.t.sol:ImdWindowShopperAdversarialTest\n[PASS] testFuzz_approveStoresExactValue(address,address,uint256) (runs: 1024, μ: 78250, ~: 78627)\nLogs:\n  Bound result 43585113425735704531338778636715963377846831338\n  Bound result 956351107407257483198373972271499404999119026987\n\n[PASS] testFuzz_infiniteAllowanceNeverDecreases(uint256,uint256) (runs: 1024, μ: 194430, ~: 196275)\nLogs:\n  Bound result 140846314869452931570650933\n  Bound result 343540762014961188317253980\n\n[PASS] testFuzz_oneCallLaunchDistributesExactly(bytes32,uint256) (runs: 1024, μ: 553706, ~: 555033)\nLogs:\n  Bound result 5441\n\n[PASS] testFuzz_strangerCannotMoveHolderFunds(address,uint256) (runs: 1024, μ: 104387, ~: 104728)\nLogs:\n  Bound result 959866220412789759\n\n[PASS] testFuzz_transferToAnyNonZeroRecipient(address,uint256) (runs: 1024, μ: 100894, ~: 101212)\nLogs:\n  Bound result 121866736003319449686549113311917885821346204516\n  Bound result 47699104124873085134774673\n\n[PASS] testFuzz_unknownSelectorsNeverSucceed(bytes4,bytes) (runs: 1024, μ: 50202, ~: 50013)\n[PASS] test_allowanceAboveSupplyIsBoundedByBalance() (gas: 166040)\n[PASS] test_approveFromZeroAddressCallerReverts() (gas: 33054)\n[PASS] test_create2SameSaltTwiceFails() (gas: 537530)\n[PASS] test_maxMinusOneAllowanceIsFiniteAndDecreases() (gas: 123915)\n[PASS] test_nonPayableEntrypointsRejectEther() (gas: 118305)\n[PASS] test_ownerApprovingThemselfStillNeedsAllowanceForTransferFrom() (gas: 156286)\n[PASS] test_sameTransferFromTwiceExhaustsAllowance() (gas: 146645)\n[PASS] test_sameTransferTwiceExhaustsBalance() (gas: 145368)\n[PASS] test_supplyIsExactlyTenToTheTwentySeventh() (gas: 26112)\n[PASS] test_transferFromZeroAddressCallerReverts() (gas: 33056)\n[PASS] test_transferFromZeroOwnerWithAmountReverts() (gas: 38131)\n[PASS] test_truncatedCalldataReverts() (gas: 51332)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 84487)\n[PASS] test_unknownSelectorReverts() (gas: 51113)\n[PASS] test_zeroAddressCannotBeGivenAnAllowanceToSpend() (gas: 37882)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 80.74ms (299.40ms CPU time)\n\nRan 1 test for test/ImdWindowShopper.invariant.t.sol:ImdWindowShopperInvariantTest\n[PASS]\nImdWindowShopperInvariantTest invariants:\n[PASS] invariant_allowancesMatchIndependentAccounting\n[PASS] invariant_balancesMatchIndependentAccounting\n[PASS] invariant_supplyIsConstantAndAllTokensAreAccountedFor\n ImdWindowShopperInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 4144  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | revoke       | 4023  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 4092  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 4125  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 89\n  Bound result 0\n  Bound result 12000000000000000000\n  Bound result 8000\n  Bound result 1072\n  Bound result 249999999999999999999975996\n  Bound result 0\n  Bound result 60000000000000000000\n  Bound result 1889567280\n  Bound result 2\n  Bound result 9\n  Bound result 6\n  Bound result 261\n  Bound result 8000\n  Bound result 4771\n  Bound result 0\n  Bound result 54737212110432112052502110\n  Bound result 109956529763588460397577596\n  Bound result 105\n  Bound result 2\n  Bound result 0\n  Bound result 162434688179693163016069026\n  Bound result 10\n  Bound result 0\n  Bound result 719206527\n  Bound result 4005798109735026032776261\n  Bound result 0\n  Bound result 0\n  Bound result 1140430890377183981174521\n  Bound result 15\n  Bound result 13\n  Bound result 0\n  Bound result 6233\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.97s (5.96s CPU time)\n\nRan 1 test for test/ImdWindowShopper.adversarial.t.sol:ImdWindowShopperHostileInvariantTest\n[PASS]\nImdWindowShopperHostileInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchGhosts\n[PASS] invariant_supplyNeverChanges\n ImdWindowShopperHostileInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------+--------------------+-------+---------+----------╮\n| Contract       | Selector           | Calls | Reverts | Discards |\n+==================================================================+\n| HostileHandler | approve            | 2345  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| HostileHandler | callAdminSelector  | 2325  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| HostileHandler | overspendAllowance | 2325  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| HostileHandler | overspendBalance   | 2286  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| HostileHandler | sendToZero         | 2325  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| HostileHandler | transfer           | 2379  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| HostileHandler | transferFrom       | 2399  | 0       | 0        |\n╰----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 9000\n  Bound result 0\n  Bound result 1000000000000000000000000000\n  Bound result 0\n  Bound result 40000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 1064470261\n  Bound result 50000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1135\n  Bound result 40838970354862969224503008405555107\n  Bound result 0\n  Bound result 9216\n  Bound result 18\n  Bound result 0\n  Bound result 1000000000000000001\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639933\n  Bound result 0\n  Bound result 5736\n  Bound result 0\n  Bound result 0\n  Bound result 2734\n  Bound result 0\n  Bound result 255\n  Bound result 0\n  Bound result 5261156953203440054240134857249816095270703\n  Bound result 0\n  Bound result 0\n  Bound result 1262\n  Bound result 778\n  Bound result 28991747241295553400041084136077622912468722261399930639522872560536181139\n  Bound result 1921\n  Bound result 0\n  Bound result 0\n  Bound result 1234\n  Bound result 731\n  Bound result 0\n  Bound result 819\n  Bound result 1000000000000000001\n  Bound result 8000\n  Bound result 6184052139624\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.11s (6.11s CPU time)\n\nRan 4 test suites in 6.11s (12.23s CPU time): 55 tests passed, 0 failed, 0 skipped (55 total tests)\n","passed":true},{"durationMs":45,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ImdWindowShopper.approve(address,uint256)\",\"ImdWindowShopper.transfer(address,uint256)\",\"ImdWindowShopper.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":22,\"README.md\":112,\"foundry.toml\":19,\"remappings.txt\":2,\"src/ImdWindowShopper.sol\":17,\"test/ImdWindowShopper.adversarial.t.sol\":417,\"test/ImdWindowShopper.invariant.t.sol\":112,\"test/ImdWindowShopper.t.sol\":392,\"test/helpers/LaunchFactory.sol\":15},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ad4b0421a74ed45540c8e22715178b344ef60843e189c07df0538eb6c48959c9","verifiedTreeHash":"8d0fd0ede8406f2c37c97e9925e651059d69cab9","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":1236,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.16s\nCompiler run successful!\n","passed":true},{"durationMs":4754,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/ImdWindowShopper.t.sol:ImdWindowShopperTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 1024, μ: 126957, ~: 127127)\nLogs:\n  Bound result 9\n  Bound result 728815563385977040452943777879061427756277306518\n\n[PASS] testFuzz_transferConservesBalances(address,uint256) (runs: 1024, μ: 92822, ~: 93116)\nLogs:\n  Bound result 539232425829283274037309449\n\n[PASS] testFuzz_transferFromAboveAllowanceReverts(uint256,uint256) (runs: 1024, μ: 125063, ~: 125399)\nLogs:\n  Bound result 140849233901404343002258532\n  Bound result 931182603005187505970978912\n\n[PASS] testFuzz_transferFromRespectsBalanceAndAllowance(uint256,uint256) (runs: 1024, μ: 166381, ~: 167202)\nLogs:\n  Bound result 9\n  Bound result 728815563385977040452943777879061427756277306518\n\n[PASS] test_approveEmitsEventWithoutMovingTokens() (gas: 88734)\n[PASS] test_approveReplacesAllowanceAndCanRevoke() (gas: 163796)\n[PASS] test_approveZeroSpenderReverts() (gas: 30387)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9676)\n[PASS] test_create2MintsToFactoryNotCallerOrOrigin() (gas: 305301)\n[PASS] test_launchDistributionClaimsAndPoolTransfersAreExact() (gas: 658002)\n[PASS] test_metadataAndWholeSupply() (gas: 107584)\n[PASS] test_noMintBurnOrAdministrationEntrypoints() (gas: 1380441)\n[PASS] test_otherSpenderCannotUseAllowance() (gas: 92723)\n[PASS] test_plainEtherTransferReverts() (gas: 36798)\n[PASS] test_selfTransferPreservesBalance() (gas: 51410)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 93527)\n[PASS] test_transferEntireBalance() (gas: 75831)\n[PASS] test_transferFromInsufficientAllowanceRevertsAtomically() (gas: 115733)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 126223)\n[PASS] test_transferFromKeepsInfiniteAllowance() (gas: 128979)\n[PASS] test_transferFromMovesExactAmountAndConsumesFiniteAllowance() (gas: 244063)\n[PASS] test_transferFromSelfStillConsumesAllowance() (gas: 105360)\n[PASS] test_transferFromWithoutAllowanceRevertsEvenForDeployer() (gas: 105555)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 81493)\n[PASS] test_transferFromZeroRecipientRestoresAllowance() (gas: 114215)\n[PASS] test_transferFromZeroSenderReverts() (gas: 35321)\n[PASS] test_transferMaxUintRevertsWithoutChangingSupply() (gas: 52759)\n[PASS] test_transferToContractDoesNotCallRecipient() (gas: 173801)\n[PASS] test_transferToZeroReverts() (gas: 47641)\n[PASS] test_transferWithInsufficientBalanceReverts() (gas: 57449)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73400)\n[PASS] test_zeroTransferToZeroAlsoReverts() (gas: 30478)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 27.80ms (111.29ms CPU time)\n\nRan 1 test for test/ImdWindowShopper.invariant.t.sol:ImdWindowShopperInvariantTest\n[PASS]\nImdWindowShopperInvariantTest invariants:\n[PASS] invariant_allowancesMatchIndependentAccounting\n[PASS] invariant_balancesMatchIndependentAccounting\n[PASS] invariant_supplyIsConstantAndAllTokensAreAccountedFor\n ImdWindowShopperInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 4144  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | revoke       | 4023  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 4092  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 4125  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 89\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 1515\n  Bound result 0\n  Bound result 15\n  Bound result 826074472\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 117300740\n  Bound result 0\n  Bound result 4717\n  Bound result 0\n  Bound result 54737212110432112052502110\n  Bound result 30000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 8384606807198635911452335\n  Bound result 599\n  Bound result 867\n  Bound result 300\n  Bound result 100000000000000000000\n  Bound result 5\n  Bound result 6737008183948512437\n  Bound result 0\n  Bound result 9\n  Bound result 13\n  Bound result 214\n  Bound result 4844\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.68s (4.68s CPU time)\n\nRan 2 test suites in 4.68s (4.71s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":40,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ImdWindowShopper.approve(address,uint256)\",\"ImdWindowShopper.transfer(address,uint256)\",\"ImdWindowShopper.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":22,\"README.md\":112,\"foundry.toml\":19,\"launch.json\":24,\"remappings.txt\":2,\"src/ImdWindowShopper.sol\":17,\"test/ImdWindowShopper.invariant.t.sol\":112,\"test/ImdWindowShopper.t.sol\":392,\"test/helpers/LaunchFactory.sol\":15},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e498f1a387d868899bd56575f2696979c484f0601d1139e0a98ba160a72d80bc","verifiedTreeHash":"134d6ffd8416f988574ca6141ba343beb7c5e9a6","verifierVersion":"0.1.0+560ab6a2"}]}