{"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":"64b14c7b-880d-459f-bdb1-7e66d17f351f","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"59dbd7b85e074705d85f70df11194101c870a23e665871cf4bc35176a8781a00","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":"0131a7c0146037108efd0fdd3dc8ed17244579d7a1b3d8a951ad7fa9b6a1d8a3","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":"4ba18b715628f2418790ad6f24d836aae223bec45f69266cdb74f2cb9fea115e","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":"2c304090cae881dee0ef1f585df66063e5539f38505826628c42f31bbaa830b0","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":"6145fd17b1a263368b9e9d5e6312144ed46b1c92678b77ace4dbe4a546b09a19","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":"c7c62535dd1da4c471d27849e9848ca36f63b6fcfc263f76676949d70a7aa858","dependsOn":[],"execution":{"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":"48a59de0afe65f42ff41dd13656db011db85eb3b86603666490c2ad7b4e1feff","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"98b514994ad78616a6dcf0cf774affefd5661e95bf6a7fa8e1a97c8ba13f65e4","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: IMDwindowshopper (WWW).\nToken name: IMDwindowshopper\nToken symbol: WWW\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"7dedbc66cbb43719675d08c24ca92bcf5e726e215d7219193dd0eb37b188a9da","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"64b14c7b-880d-459f-bdb1-7e66d17f351f","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2790-imdwindowshopper"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52641","feedbackHash":"cdf3bafa199f8d459ad6b10cfd519c9a4e8ce9fcd6eab51be98382cdbcd2e5d0","nodeKey":"audit_economics","submissionHash":"59dbd7b85e074705d85f70df11194101c870a23e665871cf4bc35176a8781a00","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50988","feedbackHash":"6d2288ba23414f7d68de42e98deabbfb888eee33ae247e33625c2fd2e6b9169e","nodeKey":"audit_flow","submissionHash":"0131a7c0146037108efd0fdd3dc8ed17244579d7a1b3d8a951ad7fa9b6a1d8a3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52169","feedbackHash":"1d0d1f91fbd9b5fa7756eb63521993822617fd3dc4dfbbad9df518492335bcee","nodeKey":"audit_judge","submissionHash":"4ba18b715628f2418790ad6f24d836aae223bec45f69266cdb74f2cb9fea115e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52131","feedbackHash":"7e99877b3ac9d1e7a46edb788958fe2627f0ca269181a80143b388fb72bb6e18","nodeKey":"audit_math","submissionHash":"2c304090cae881dee0ef1f585df66063e5539f38505826628c42f31bbaa830b0","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50986","feedbackHash":"2619fdbd14e34c65c2447e3f60a08b6db1fabebcd178c22442de07ca343859bc","nodeKey":"audit_permissions","submissionHash":"6145fd17b1a263368b9e9d5e6312144ed46b1c92678b77ace4dbe4a546b09a19","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"54144","feedbackHash":"a7000d3f82b1cf23b02f1a4db40cf03e3aeadaf0f41a00c90ab6eb08ea1eb7d4","nodeKey":"build_contract_project","submissionHash":"c7c62535dd1da4c471d27849e9848ca36f63b6fcfc263f76676949d70a7aa858","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51431","feedbackHash":"0877d4b7c1f7a415a65d7fff66726346c1f73e481c84612bd3b90000c2106a1d","nodeKey":"manifest","submissionHash":"48a59de0afe65f42ff41dd13656db011db85eb3b86603666490c2ad7b4e1feff","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52261","feedbackHash":"77b5b94a715e87e4048fe013463c2db81c84815db82815eea293720de7d51bbb","nodeKey":"write_foundry_tests","submissionHash":"98b514994ad78616a6dcf0cf774affefd5661e95bf6a7fa8e1a97c8ba13f65e4","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"5cac63a5fcc93f65d0860e184c7dc05d7b59577a370fe1f754419c265cea05ff","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa2b0b9c7ebc1547","findings":[{"citation":"resolved","description":"Periphery pass. lib/README.md tells the verifier that every vendored source is unmodified and can be checked with `sha256sum --check lib/SHA256SUMS`. Running that exact command on the delivered tree fails: 7 of the 36 recorded files (lib/forge-std/src/StdJson.sol, interfaces/IMulticall3.sol, console.sol, Vm.sol, interfaces/IERC7540.sol, StdAssertions.sol, StdToml.sol) do not match the hashes recorded in lib/SHA256SUMS. I downloaded upstream forge-std v1.9.7 and compared: each of the 7 files differs from upstream only by whitespace/line wrapping (forge fmt style), with no change after stripping whitespace, so the test library is semantically intact. The 5 OpenZeppelin files match upstream v5.4.0 byte-for-byte. The token's own runtime bytecode is unaffected, because forge-std is only imported by tests. The defect is that the project's documented integrity check does not pass on the tree as shipped, so a reviewer who follows the README gets a FAILED result and cannot distinguish this benign reformatting from a substantive tamper without doing the upstream diff themselves. Fix: either regenerate lib/SHA256SUMS from the files as shipped, or restore the 7 files to the upstream v1.9.7 bytes (and exclude lib/ from forge fmt), so the documented command exits 0.","line":8,"path":"lib/README.md","reproduction":"From the repository root run `sha256sum --check lib/SHA256SUMS`. Expected (per lib/README.md:8-10): every line `OK`, exit code 0. Actual: 29 `OK`, 7 `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), `WARNING: 7 computed checksums did NOT match`, exit code 1. Example: recorded hash for lib/forge-std/src/Vm.sol is 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1, actual sha256 of the shipped file is a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15. Comparing against upstream forge-std v1.9.7 (`diff`), the only differences are line wrapping; stripping all whitespace yields identical content.","severity":"low","snippet":"Sources are unmodified. Upstream licenses are included beside each dependency.\n`SHA256SUMS` records each vendored source and license; check from the project root\nwith `sha256sum --check lib/SHA256SUMS`.","title":"Vendored-library provenance claim is false: lib/SHA256SUMS does not verify (7 forge-std files differ from their recorded hashes)"}],"hash":"0131a7c0146037108efd0fdd3dc8ed17244579d7a1b3d8a951ad7fa9b6a1d8a3","nodeId":"9f327ada-7335-4fb3-911b-62e39e64a535","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` with one low finding and seven coverage rows, and the working tree is otherwise unchanged.\n\n**Outcome.** The token itself is clean within my area. `IMDwindowshopper` is a 16-line contract that inherits the unmodified OpenZeppelin v5.4.0 ERC20 and mints exactly 10^27 base units to the constructor's caller once. No defect was found in any of the three state-changing entry points.\n\n**What I covered, by guide.**\n- **Execution Trace.** Traced approve, transfer and transferFrom from entry to final state through the inherited `_approve`, `_transfer`, `_update` and `_spendAllowance`. Sentinel inputs (zero sender, zero receiver, zero spender, max allowance, max minus one), partial-update atomicity across the allowance and balance legs, self-transfers, and value sent to nonpayable functions all behave as specified. The launch flows (10 percent to a distributor, a whole claim, 70 percent to a pool manager, buys and sells both ways) move exactly the requested amounts.\n- **Periphery.** All five vendored OpenZeppelin files are byte-identical to upstream v5.4.0, verified by download and hash. The compiled ABI exposes only the three nonpayable functions plus views, with no receive or fallback. I re-ran the protected harness's reachable-opcode scan on the compiled runtime in a scratch test, and it passes. The one defect is here: seven forge-std files differ from the hashes recorded in `lib/SHA256SUMS`, so the README's own integrity command fails. I confirmed against upstream v1.9.7 that the differences are whitespace only and test-only, so this is rated low.\n- **First Principles.** Deployment via raw CREATE2 from a contract address assigns the supply to that contract, never to the origin. No role, owner or initializer exists, so there is nothing for a first outside caller to seize. The project's own 34 tests plus my 8 scratch tests all pass.\n\n**Not reached.** Nothing within the assigned area was left untraced. I did not assess the README's stated launch chain or paired-currency address, since no network table was supplied and those are outside my guides.","treeHash":null,"usage":{"cachedInputTokens":701726,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":16874,"runtime":"claude","turns":27,"wallClockMs":280340}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"de319b702da6aa2e","findings":[{"citation":"resolved","description":"Outside the math area, and it does not change the deployed token. lib/README.md tells the reader to verify the vendored files with `sha256sum --check lib/SHA256SUMS` and says the sources are unmodified. The committed files fail that check. The recorded hashes are the upstream v1.9.7 hashes, and 7 committed forge-std files differ from upstream. Comparing with all whitespace removed, the differences are layout only (they look like formatter output), so test behaviour does not change. forge-std is imported only by tests. All 5 OpenZeppelin files that compile into the token match the v5.4.0 tag byte for byte. Impact: anyone running the documented provenance check gets a failure, and the claim as written is false. Fix: restore the 7 upstream files, or regenerate the 7 sums and reword the claim to say they were reformatted.","line":8,"path":"lib/README.md","reproduction":"From the repository root at b21c7ee run `sha256sum --check lib/SHA256SUMS`. Expected: every line OK. Actual: 'WARNING: 7 computed checksums did NOT match', with FAILED on lib/forge-std/src/StdJson.sol, StdToml.sol, StdAssertions.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol and interfaces/IERC7540.sol. Example: SHA256SUMS records 9068805b59ac1d0e... for Vm.sol, which is the upstream v1.9.7 hash (archive sha256 45157353ab49eab0..., as lib/README.md states); the committed Vm.sol hashes to a1b1c82924aecf0f....","severity":"info","snippet":"Sources are unmodified. Upstream licenses are included beside each dependency.","title":"lib/README.md says vendored sources are unmodified, but its own checksum check fails on 7 forge-std files"}],"hash":"2c304090cae881dee0ef1f585df66063e5539f38505826628c42f31bbaa830b0","nodeId":"66796157-4f68-4ab7-8ff9-aa172503d331","outcome":"completed","summary":"The math audit of IMDwindowshopper found no defects in the token. The only finding is an info-level provenance problem in `lib/`, which doesn't affect the deployed token. Findings and coverage are in `.imd-findings.json`, all three entry points answer `holds`, and no tracked file changed.\n\n**Finding: `lib/README.md:8` (info, outside the math area)**\n- **What fails:** the README says the vendored sources are unmodified, but its own check, `sha256sum --check lib/SHA256SUMS`, fails on 7 `forge-std` files.\n- **Impact:** the differences are whitespace only, and `forge-std` is used only by tests.\n- **Deployed code:** all 5 OpenZeppelin files that compile into the token match the v5.4.0 tag byte for byte.\n\n**Why the guides found nothing else:** the token adds only a constant and one constructor mint to unmodified OpenZeppelin ERC20.\n- **Math Precision:** there are no divisions, casts, scale conversions or shares. The only arithmetic is the constant, which is exactly 10^27 in the bytecode, plus balance and allowance updates. The unchecked additions can't overflow because balances sum to 10^27.\n- **Boundary:**\n  - **External surface:** the token has no external calls, payable functions or `bytes` inputs.\n  - **Rejected input:** amounts of balance+1 and `uint256` max revert without wrapping, including on self-transfers. A zero `from` or `to`, dirty address bits, short calldata and attached ETH also revert.\n  - **Allowances:** `max-1` decrements and `max` stays unlimited. A failed spend leaves the allowance unchanged.\n- **Numerical Gap:** zero-value paths break no invariant, and the launch split of 1e26, 7e26 and 2e26 sums to the supply exactly.\n\n**Checks run:**\n- The project's own suite passes 34 of 34.\n- My differential fuzz (512 runs of 120 operations, using edge amounts) matched a plain model after every operation. Its actors included the caller, the token and the zero address.\n- WWW also seeded and swapped both ways on a real v4 `PoolManager` at this launch's numbers, in both currency orders. The tick was about ±131230, liquidity about 9.93e23, and supply stayed fixed.\n- A bytecode walk found no reachable `DELEGATECALL`, `CALLCODE`, `SELFDESTRUCT`, `CALL` or `CREATE`.\n\n**Static analysis leads:** Slither reported nothing. Aderyn's large-numeric-literal line is style only, because the value is correct, so I left it out.\n\n**Known behaviour, not reported:** the `approve` race and zero-value `transferFrom` without allowance are standard ERC-20 behaviour the README documents. A 1-wei buy returning 0 tokens comes from v4's fee rounding, not from this token.\n\n**Not covered:**\n- **Protected test harness:** I couldn't run it because `src/LaunchLiquidity.sol` and the related contracts aren't supplied. The v4 run used my own seed and swap code against upstream v4-core `main`, without the launch's hook, and its price and ticks are my own calculation rather than the deployer's.\n- **Not in this tree:** the per-wallet distributor split and the deployer's price derivation.\n- **Manifest:** there is no `launch.json` yet, so none was checked.\n\nScratch tests, build output and temp downloads are removed.","treeHash":null,"usage":{"cachedInputTokens":676858,"inputTokens":18,"model":"claude-opus-5-5","outputTokens":28305,"runtime":"claude","turns":21,"wallClockMs":280605}},{"artifacts":[],"attempt":1,"bundleHash":"70dbea4282ae34c98a4b11fd1a98311d169187f0576c092ebd877a597f128dfd","device":"74f6c6912a376f27","findings":[],"hash":"48a59de0afe65f42ff41dd13656db011db85eb3b86603666490c2ad7b4e1feff","nodeId":"b606d8ed-95df-4b3c-8778-5cb7b5e11f9e","outcome":"completed","summary":"Created [launch.json](/home/imd-worker/.identitymd/work/64b14c7b-880d-459f-bdb1-7e66d17f351f/b606d8ed-95df-4b3c-8778-5cb7b5e11f9e/launch.json) with the exact token supply, empty constructor arguments, no application contracts, and required pool and economics values.\n\n`forge build` succeeded; all 34 tests passed with the supplied fuzz seed. Manifest fields and compiled constructor ABI were checked. Only `launch.json` is changed for submission.","treeHash":"b3289067af77d54c5a527957924d436155a4c721","usage":{"cachedInputTokens":161024,"inputTokens":32806,"model":"gpt-6-astra","outputTokens":2320,"runtime":"codex","turns":3,"wallClockMs":62368}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e8816d4386532a66","findings":[{"citation":"resolved","description":"Merged from four identical reports (audit_economics, audit_math, audit_flow, write_foundry_tests); same root cause, one finding. lib/README.md states the vendored dependencies are unmodified and tells a reviewer to confirm that by running the recorded checksum file. On the committed tree (git status clean at 712f01d) that command reports 7 FAILED lines, all under lib/forge-std/src: StdJson.sol, interfaces/IMulticall3.sol, console.sol, Vm.sol, interfaces/IERC7540.sol, StdAssertions.sol, StdToml.sol. I reproduced the cause: the 7 hashes recorded in lib/SHA256SUMS are the sha256 of the upstream forge-std v1.9.7 files (fetched from the v1.9.7 tag and hashed: all 7 match the recorded values), while the committed files have been re-wrapped by a formatter; stripping all whitespace from each committed file and its upstream counterpart yields identical hashes for all 7, so the change is layout only. The 5 OpenZeppelin files that compile into the token (ERC20.sol, IERC20.sol, IERC20Metadata.sol, Context.sol, draft-IERC6093.sol) are byte-identical to the v5.4.0 tag, so the deployed token's code, bytecode and behaviour are not affected; forge-std is imported only by tests. Impact: the project's own documented integrity check fails on a clean checkout, and the 'unmodified' claim in the shipped provenance note is false. A reviewer following the README cannot distinguish this benign reformatting from a substantive tamper without repeating the upstream diff. No funds, supply or transfer guarantee is at risk, so severity is low. Fix (either): restore the 7 files to their upstream v1.9.7 bytes and exclude lib/ from `forge fmt`, or regenerate lib/SHA256SUMS from the files as shipped and reword line 8 to say forge-std was reformatted. Note lib/ was outside the builder's write budget, so this needs the path to be writable for whoever fixes it.","line":8,"path":"lib/README.md","reproduction":"From the repository root at commit 712f01d run: sha256sum --check lib/SHA256SUMS. Expected (per lib/README.md lines 8-10): every line OK, exit code 0. Actual: 29 OK, 7 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), 'sha256sum: WARNING: 7 computed checksums did NOT match', exit code 1. Example: lib/SHA256SUMS records 9068805b59ac1d0e... for lib/forge-std/src/Vm.sol, which equals sha256 of upstream forge-std v1.9.7 src/Vm.sol; the committed Vm.sol hashes to a1b1c82924aecf0f.... `tr -d ' \\t\\n\\r' < lib/forge-std/src/Vm.sol | sha256sum` equals the same command on the upstream file (fe772424ec5d5c1b...), proving a whitespace-only difference. All lib/openzeppelin-contracts entries report OK and match the v5.4.0 tag byte for byte.","severity":"low","snippet":"Sources are unmodified. Upstream licenses are included beside each dependency.\n`SHA256SUMS` records each vendored source and license; check from the project root\nwith `sha256sum --check lib/SHA256SUMS`.","title":"lib/README.md claims vendored sources are unmodified and verifiable with `sha256sum --check lib/SHA256SUMS`, but that check fails on 7 committed forge-std files"}],"hash":"4ba18b715628f2418790ad6f24d836aae223bec45f69266cdb74f2cb9fea115e","nodeId":"3e4d8852-e2ca-4b3c-be7c-07e39528ca34","outcome":"completed","summary":"The review is complete and the findings file is written. The working tree is otherwise clean, so nothing else needs to be requested.\n\n**Outcome.** The IMDwindowshopper token is a plain OpenZeppelin v5.4.0 ERC-20 with a one-time constructor mint and no admin surface. I found no defect in the Solidity code. One low-severity documentation finding is kept, merged from the four specialists' identical reports.\n\n**What I verified against the code and tree:**\n- All five vendored OpenZeppelin files are byte-identical to the upstream v5.4.0 tag. The three entry points approve, transfer and transferFrom are the unmodified library bodies, traced through `_approve`, `_update` and `_spendAllowance`.\n- The constructor mints exactly 10^27 units to msg.sender once. The ABI exposes no mint, burn, owner, pause or blacklist function.\n- Runtime bytecode is 1753 bytes with no DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL, STATICCALL or CREATE opcodes. CREATE2 deployment from a factory assigns the supply to the factory.\n- The manifest launch.json uses only schema keys, an empty constructorArgs list matching the zero-parameter constructor, and the correct supply and decimals.\n- The project builds and all 94 tests pass with the README's fuzz seed. The aderyn large-literal lead is a compile-time constant and was dropped.\n\n**Kept finding (low).** The lib/README.md says vendored sources are unmodified and verifiable with the checksum file, but that command fails on seven forge-std files. I reproduced the cause: the recorded hashes equal upstream v1.9.7, and the committed files differ from upstream only by whitespace. The token's compiled code is unaffected, since forge-std is test-only. The fix is to restore the upstream bytes or regenerate the sums and reword the claim.\n\n**Output.** The findings file holds one finding and seven coverage rows, with all three verifier-listed entry points marked as holding. No critical or high finding exists, so no proof test was needed, and the scratch directory was left empty.","treeHash":null,"usage":{"cachedInputTokens":351115,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":9444,"runtime":"claude","turns":18,"wallClockMs":151421}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"803eeae3d8b63de3","findings":[{"citation":"resolved","description":"The README states the vendored dependencies are unmodified and tells a reviewer to confirm that with the recorded checksum file. Running that exact command on the committed tree (git diff HEAD is clean, so these are the committed contents) reports 7 mismatches, all in lib/forge-std/src: StdJson.sol, interfaces/IMulticall3.sol, console.sol, Vm.sol, interfaces/IERC7540.sol, StdAssertions.sol and StdToml.sol. Every OpenZeppelin file (ERC20.sol, Context.sol, IERC20.sol, IERC20Metadata.sol, draft-IERC6093.sol, LICENSE) verifies, and I read the vendored ERC20.sol in full: its transfer, approve, transferFrom, _update, _approve and _spendAllowance bodies are the unmodified OpenZeppelin v5.4.0 code, so the production token is not affected. forge-std is used only by tests. The defect is in the provenance evidence the project ships: either the SHA256SUMS file or the forge-std copy was replaced after the other was written, so the integrity check the README offers cannot be relied on as written. No economic or security impact on the token; no proof test is attached because this is not a Solidity defect.","line":8,"path":"lib/README.md","reproduction":"From the repository root run: sha256sum --check lib/SHA256SUMS. Expected (per README line 8-10): every line OK, exit 0. Actual: 'sha256sum: WARNING: 7 computed checksums did NOT match', exit 1, with FAILED on 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. All lib/openzeppelin-contracts entries report OK. Fix: regenerate lib/SHA256SUMS from the committed forge-std files (or restore the v1.9.7 files the sums describe) so the README's instruction holds.","severity":"info","snippet":"Sources are unmodified. Upstream licenses are included beside each dependency.\n`SHA256SUMS` records each vendored source and license; check from the project root\nwith `sha256sum --check lib/SHA256SUMS`.","title":"lib/README.md says the vendored sources verify against lib/SHA256SUMS, but seven committed forge-std files fail that check"}],"hash":"59dbd7b85e074705d85f70df11194101c870a23e665871cf4bc35176a8781a00","nodeId":"459e58ba-c146-48b9-8078-036e5d3f5d6b","outcome":"completed","summary":"The economics review is complete and the findings file is written. The token has no economic defects.\n\n**Outcome.** The IMDwindowshopper token is a bare OpenZeppelin v5.4.0 ERC20 with a single constructor mint of 10^27 base units to `msg.sender`. Nothing in the Economic Security, Invariant or Flow Gap guides reaches it: there are no external calls, oracles, fees, burns, hooks, callbacks, admin roles or post-deployment mint paths. All three listed entry points hold.\n\n**What I verified**\n\n- Read the vendored ERC20 in full. Its `transfer`, `approve`, `transferFrom`, `_update`, `_approve` and `_spendAllowance` bodies are the unmodified upstream code, and every OpenZeppelin file matches the project's checksum file.\n- Ran the project's own suite with the README's fuzz seed: 34 tests pass, including the two stateful invariants.\n- Wrote scratch tests against the compiled bytecode that replicate the protected harness: CREATE2 deployment from a factory, exact 10% / 70% / 20% flows, whole claims, transfers in both swap directions, a deployer attempting `transferFrom` on a holder without allowance, 14 admin and mint selectors, and the reachable-opcode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT. All pass. The scratch directory was removed afterward.\n- Both static-analysis leads were checked. Slither reported nothing. Aderyn's large-numeric-literal line is the supply constant, which is the correct value and is asserted by the tests.\n\n**One info-level note recorded.** The library README says the vendored sources verify against `lib/SHA256SUMS`, but running that command on the committed tree reports seven forge-std files that do not match. Those files are test-only and the production ERC20 files all verify, so there is no token impact. It is reported because the provenance claim as written is false and reproducible.\n\n**Coverage.** Nine rows in `.imd-findings.json`: all three ABI entry points plus the fixed-supply and balance-sum invariants, the constructor mint, the opcode scan, and one row each for the Economic Security and Flow Gap guide passes, all `holds`. Nothing was left unreached. I could not fetch upstream OpenZeppelin from GitHub to compare hashes independently because the sandbox denied that host, so library authenticity rests on reading the code and the project's own checksum file.","treeHash":null,"usage":{"cachedInputTokens":559638,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":13678,"runtime":"claude","turns":25,"wallClockMs":224841}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ef5038c1bdac3372","findings":[],"hash":"6145fd17b1a263368b9e9d5e6312144ed46b1c92678b77ace4dbe4a546b09a19","nodeId":"805269a9-be6e-4759-bbe8-673852bcd5e6","outcome":"completed","summary":"The permissions review of IMDwindowshopper found no defects. The findings file is written with an empty findings list and nine coverage rows, and the working tree has no other changes.\n\n**What I checked, against the Access Control, Trust Gap and Asymmetry guides:**\n\n- **Permission model.** The token is a 16-line contract inheriting OpenZeppelin ERC20 with a constructor-only mint. The compiled ABI exposes exactly the three listed state-changing functions and no receive, fallback, owner, initializer, pause, blacklist, mint or burn. Every storage slot has a single writer path with a consistent guard: balances move only through `_update`, allowances only through `_approve`, and total supply only in the constructor.\n- **Deployer privilege.** A scratch Foundry probe confirmed the deployer cannot spend a holder's tokens without an allowance, a stranger with zero allowance can move at most zero tokens, and allowance replace and sticky-max semantics behave as documented.\n- **Asymmetry.** The transfer and transferFrom paths share identical validation. The mint and burn branches of `_update` are unreachable after construction because `_transfer` rejects both zero addresses.\n- **Trust gap.** There is no privileged actor, fee, price, recipient or settable parameter, so no access-times-economics intersection exists. The sole trust assumption is that the constructor caller, the launch factory, receives the whole supply, which is the requested design.\n- **Supply chain and launch floor.** The five vendored OpenZeppelin files hash identically to the upstream v5.4.0 tag. An opcode walk of the runtime bytecode finds no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT. Supply is exactly 10^27 base units with 18 decimals, and the contract identifier is 16 characters.\n\n**Leads I dropped.** The aderyn large-numeric-literal note is style only, and the literal evaluates to the exact manifest supply. Zero-value transferFrom with no allowance succeeds and emits a Transfer event from any address, which is standard ERC-20 and OpenZeppelin behaviour and moves no balance, so I did not report it.\n\n**Coverage.** All three entry points are recorded as holds, plus six invariant rows. Nothing in my area was left unreached. The project's own 34 tests pass, including the two stateful invariant suites. The protected Uniswap v4 seed and swap harness cannot run here because v4-core is not vendored, so the real pool flow remains the network's verification stage to confirm.","treeHash":null,"usage":{"cachedInputTokens":510855,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":10085,"runtime":"claude","turns":23,"wallClockMs":179166}},{"artifacts":[],"attempt":1,"bundleHash":"7a3bdfe99f47ef12714fd089bf59006b394d47ab039ff7eb3b1eccf4dce3d2e7","device":"dedc96e38388cb45","findings":[{"description":"lib/README.md says the vendored sources are unmodified and tells readers to check them with `sha256sum --check lib/SHA256SUMS`. At this commit that check fails for seven forge-std files, so the documented integrity check reports a failure on a clean tree. The difference is formatting only: with spaces, newlines, tabs and commas removed, each file hashes the same as forge-std v1.9.7, and the manifest's recorded hashes equal the upstream files. forge-std is test-only and does not reach the deployed token. All five OpenZeppelin files the token compiles against are byte-identical to the v5.4.0 tag, so the token's bytecode is not affected. lib/ is outside this task's writable paths, so it is reported here rather than repaired.","line":2,"path":"lib/SHA256SUMS","reproduction":"From the repository root run `sha256sum --check lib/SHA256SUMS`. Expected: every line OK, as lib/README.md implies. Actual: FAILED for lib/forge-std/src/StdJson.sol, StdToml.sol, StdAssertions.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol and interfaces/IERC7540.sol, with 'WARNING: 7 computed checksums did NOT match'. Diffing against the v1.9.7 tag shows only re-wrapped lines, for example the `serialize` signatures in StdToml.sol. Either restore the upstream bytes or regenerate the manifest and change the 'unmodified' wording.","severity":"info","title":"lib/SHA256SUMS does not verify: seven forge-std files were reformatted after the manifest was written"}],"hash":"98b514994ad78616a6dcf0cf774affefd5661e95bf6a7fa8e1a97c8ba13f65e4","nodeId":"6783f8d7-98a4-40ac-8398-b8523e1a22fb","outcome":"completed","summary":"The test suite for IMDwindowshopper (WWW) is finished: `forge build` succeeds and `forge test` passes all 94 tests on the verifier seed. I found no defects in the token. Nothing is committed: the three new test files are untracked in the working tree, and the accepted tests and `src/` are unchanged.\n\n**New test files**\n| File | Tests | What it adds |\n|---|---|---|\n| `test/IMDwindowshopper.edges.t.sol` | 45 unit tests | zero-address caller and `from`, the order errors are checked in, truncated or malformed calldata, the `max - 1` allowance, absence of events and storage writes, the compiled bytecode's external surface and banned opcodes |\n| `test/IMDwindowshopper.properties.t.sol` | 13 fuzz tests, 1,000 runs each | inverses, splitting a transfer or spend, repeated approvals, aliased parties, any selector outside the ABI, the launch flows in one transaction across 0–90% pool share |\n| `test/IMDwindowshopper.ledger.invariant.t.sol` | 9 invariants, 1 reachability test | 14 handler actions over 256 runs of 128 calls; balances are tracked by two independent ledgers, one from the operations and one from emitted logs, and recipients can be any address, including the token itself |\n\n**How it was checked**\n- **Mutation testing:** I ran 27 deliberately broken versions of the token in throwaway copies (fees, hidden mint or rescue, callbacks, time locks and similar), and all 27 were caught. Eleven of them were caught only by the new files. A no-op control passed, as it should.\n- **Deep campaign:** on a different seed, 20,000 fuzz runs per test and about 230,000 invariant calls all passed. That run also confirmed the inline run counts take effect.\n- **Vendored OpenZeppelin:** the five files the token compiles against match the v5.4.0 tag byte for byte, and the token source is plain ASCII.\n\n**Reported in `.imd-findings.json` (one info item):** `sha256sum --check lib/SHA256SUMS` fails on seven forge-std files, which contradicts `lib/README.md`, line 8, \"Sources are unmodified\". The differences are formatting only, forge-std is test-only, and it never reaches the deployed token. `lib/` is outside the paths I may change, so I reported it rather than fixed it.\n\n**Limits of these tests**\n- **Pool flows:** these are simulated with plain transfers, so a real Uniswap v4 seed and swap is still left to the protected harness, which needs files this repo doesn't have.\n- **Hidden triggers:** the bytecode checks would not catch a backdoor set off by one specific amount with no new selector. The token rules that out by its source (16 lines plus unmodified OpenZeppelin), not by these tests.\n- **README:** its test counts (\"Five fuzz tests\", \"Two stateful invariants\") are now out of date, and it's outside the paths I may change.","treeHash":"e33d91285b2d4a8301e7b50acd864d8c5af5d599","usage":{"cachedInputTokens":1345394,"inputTokens":31,"model":"claude-opus-5-5","outputTokens":76088,"runtime":"claude","turns":27,"wallClockMs":987909}},{"artifacts":[],"attempt":1,"bundleHash":"60ee69c8cf575188a830c75cd0789ed145798e43c5fe3db1957728336cc59b7f","device":"9a9cbce82297045e","findings":[],"hash":"c7c62535dd1da4c471d27849e9848ca36f63b6fcfc263f76676949d70a7aa858","nodeId":"6eb7b22a-d53d-46e0-9f56-b49026eb28ff","outcome":"completed","summary":"Implemented IMDwindowshopper (WWW): 1 billion tokens, 18 decimals, minted once to the deployer.\n\nIncludes vendored dependencies, success/failure tests, fuzz and invariant tests, and deployment documentation in README.md.\n\nPassed Solidity 0.8.26 checks:\n- `forge build`\n- `forge test` — 34 passed using the required seed\n- `forge fmt --check`","treeHash":"daefdba5e75e49dc84a636c953bf8b2afc882a6f","usage":{"cachedInputTokens":388096,"inputTokens":45348,"model":"gpt-6-astra","outputTokens":13109,"runtime":"codex","turns":5,"wallClockMs":288233}}],"verification":[{"checks":[{"durationMs":1618,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.51s\nCompiler run successful!\n","passed":true},{"durationMs":3266,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 33 tests for test/IMDwindowshopper.t.sol:IMDwindowshopperTest\n[PASS] testFuzz_approveAnyAmount(uint256) (runs: 256, μ: 88645, ~: 88671)\n[PASS] testFuzz_excessAllowanceSpendReverts(uint256,uint256) (runs: 256, μ: 122843, ~: 123379)\nLogs:\n  Bound result 17806\n  Bound result 999999999999999999999994325\n\n[PASS] testFuzz_excessBalanceTransferReverts(uint256,uint256) (runs: 256, μ: 126956, ~: 127714)\nLogs:\n  Bound result 17806\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129634260\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 93157, ~: 93136)\nLogs:\n  Bound result 148241603985305981315080451\n\n[PASS] testFuzz_transferFromUsesOnlyApprovedAmount(uint256,uint256) (runs: 256, μ: 161863, ~: 164899)\nLogs:\n  Bound result 17806\n  Bound result 12131\n\n[PASS] test_approvalIsSpecificToOwnerAndSpender() (gas: 175453)\n[PASS] test_approveDoesNotRequireCurrentBalance() (gas: 78615)\n[PASS] test_approveEmitsEventWithoutMovingFunds() (gas: 88743)\n[PASS] test_approveReplacesAllowanceAndCanRevokeIt() (gas: 167108)\n[PASS] test_approveToZeroReverts() (gas: 37661)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9676)\n[PASS] test_deployerCannotSpendHolderTokensWithoutApproval() (gas: 160114)\n[PASS] test_factoryCreate2ReceivesEntireSupplyAndTransfersExactShares() (gas: 599564)\n[PASS] test_infiniteAllowanceIsNotReduced() (gas: 139255)\n[PASS] test_metadataAndInitialSupply() (gas: 107584)\n[PASS] test_nativeCurrencyAndUnknownCallsAreRejected() (gas: 58883)\n[PASS] test_noMintBurnAdminOrUpgradeEntryPoints() (gas: 1540816)\n[PASS] test_selfTransferPreservesBalance() (gas: 51410)\n[PASS] test_transferDeliversExactAmountAndEmitsEvent() (gas: 93461)\n[PASS] test_transferEntireBalance() (gas: 75799)\n[PASS] test_transferExceedingBalanceRevertsAtomically() (gas: 120047)\n[PASS] test_transferFromConsumesAllowanceAndEmitsTransfer() (gas: 149775)\n[PASS] test_transferFromExactAllowanceCannotBeRepeated() (gas: 161834)\n[PASS] test_transferFromInsufficientBalancePreservesAllowance() (gas: 178472)\n[PASS] test_transferFromToSelfConsumesAllowanceButPreservesBalance() (gas: 107624)\n[PASS] test_transferFromToZeroPreservesAllowance() (gas: 114190)\n[PASS] test_transferFromWithoutApprovalReverts() (gas: 57869)\n[PASS] test_transferOneBaseUnit() (gas: 78512)\n[PASS] test_transferToContractDoesNotCallRecipient() (gas: 98802)\n[PASS] test_transferToZeroReverts() (gas: 47664)\n[PASS] test_zeroTransferFromEmptyAccountSucceedsAndEmitsEvent() (gas: 63145)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 68911)\n[PASS] test_zeroTransferToZeroReverts() (gas: 30391)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 15.93ms (70.14ms CPU time)\n\nRan 1 test for test/IMDwindowshopper.invariant.t.sol:IMDwindowshopperInvariantTest\n[PASS]\nIMDwindowshopperInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchModel\n[PASS] invariant_supplyIsFixedAndAllTokensAreAccountedFor\n IMDwindowshopperInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+---------------+-------+---------+----------╮\n| Contract     | Selector      | Calls | Reverts | Discards |\n+===========================================================+\n| TokenHandler | approve       | 2090  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| TokenHandler | rejectedSpend | 2025  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| TokenHandler | transfer      | 2047  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| TokenHandler | transferFrom  | 2030  | 0       | 0        |\n╰--------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 438650419742663188705210290\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5544\n  Bound result 0\n  Bound result 0\n  Bound result 11\n  Bound result 159\n  Bound result 74\n  Bound result 0\n  Bound result 4383\n  Bound result 5784\n  Bound result 948541928026267833110668235\n  Bound result 0\n  Bound result 0\n  Bound result 3356\n  Bound result 1496\n  Bound result 3\n  Bound result 1930\n  Bound result 0\n  Bound result 0\n  Bound result 4000000000000000000\n  Bound result 90\n  Bound result 58\n  Bound result 68\n  Bound result 5457\n  Bound result 100\n  Bound result 6\n  Bound result 2331\n  Bound result 1\n  Bound result 100000000000000000000\n  Bound result 0\n  Bound result 26865021067686467339\n  Bound result 104150494580633029621338179\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.08s (3.08s CPU time)\n\nRan 2 test suites in 3.08s (3.09s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":51,"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,\"README.md\":96,\"foundry.toml\":21,\"launch.json\":20,\"remappings.txt\":2,\"src/IMDwindowshopper.sol\":16,\"test/IMDwindowshopper.invariant.t.sol\":107,\"test/IMDwindowshopper.t.sol\":409},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"48a59de0afe65f42ff41dd13656db011db85eb3b86603666490c2ad7b4e1feff","verifiedTreeHash":"b3289067af77d54c5a527957924d436155a4c721","verifierVersion":"0.1.0+a6eb4461"},{"checks":[{"durationMs":3273,"exitCode":0,"name":"build","output":"Compiling 30 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.16s\nCompiler run successful!\n","passed":true},{"durationMs":30344,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 33 tests for test/IMDwindowshopper.t.sol:IMDwindowshopperTest\n[PASS] testFuzz_approveAnyAmount(uint256) (runs: 256, μ: 88563, ~: 88665)\n[PASS] testFuzz_excessAllowanceSpendReverts(uint256,uint256) (runs: 256, μ: 123119, ~: 123384)\nLogs:\n  Bound result 409911157641960713839033328\n  Bound result 409911157641960713839033330\n\n[PASS] testFuzz_excessBalanceTransferReverts(uint256,uint256) (runs: 256, μ: 127224, ~: 127780)\nLogs:\n  Bound result 210204933543412965900673255\n  Bound result 210204933543412965900673257\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 93007, ~: 93112)\nLogs:\n  Bound result 24576\n\n[PASS] testFuzz_transferFromUsesOnlyApprovedAmount(uint256,uint256) (runs: 256, μ: 162908, ~: 164899)\nLogs:\n  Bound result 988208763372958633689298739\n  Bound result 212598365716813494187342344\n\n[PASS] test_approvalIsSpecificToOwnerAndSpender() (gas: 175453)\n[PASS] test_approveDoesNotRequireCurrentBalance() (gas: 78615)\n[PASS] test_approveEmitsEventWithoutMovingFunds() (gas: 88743)\n[PASS] test_approveReplacesAllowanceAndCanRevokeIt() (gas: 167108)\n[PASS] test_approveToZeroReverts() (gas: 37661)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9676)\n[PASS] test_deployerCannotSpendHolderTokensWithoutApproval() (gas: 160114)\n[PASS] test_factoryCreate2ReceivesEntireSupplyAndTransfersExactShares() (gas: 599564)\n[PASS] test_infiniteAllowanceIsNotReduced() (gas: 139255)\n[PASS] test_metadataAndInitialSupply() (gas: 107584)\n[PASS] test_nativeCurrencyAndUnknownCallsAreRejected() (gas: 58883)\n[PASS] test_noMintBurnAdminOrUpgradeEntryPoints() (gas: 1540816)\n[PASS] test_selfTransferPreservesBalance() (gas: 51410)\n[PASS] test_transferDeliversExactAmountAndEmitsEvent() (gas: 93461)\n[PASS] test_transferEntireBalance() (gas: 75799)\n[PASS] test_transferExceedingBalanceRevertsAtomically() (gas: 120047)\n[PASS] test_transferFromConsumesAllowanceAndEmitsTransfer() (gas: 149775)\n[PASS] test_transferFromExactAllowanceCannotBeRepeated() (gas: 161834)\n[PASS] test_transferFromInsufficientBalancePreservesAllowance() (gas: 178472)\n[PASS] test_transferFromToSelfConsumesAllowanceButPreservesBalance() (gas: 107624)\n[PASS] test_transferFromToZeroPreservesAllowance() (gas: 114190)\n[PASS] test_transferFromWithoutApprovalReverts() (gas: 57869)\n[PASS] test_transferOneBaseUnit() (gas: 78512)\n[PASS] test_transferToContractDoesNotCallRecipient() (gas: 98802)\n[PASS] test_transferToZeroReverts() (gas: 47664)\n[PASS] test_zeroTransferFromEmptyAccountSucceedsAndEmitsEvent() (gas: 63145)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 68911)\n[PASS] test_zeroTransferToZeroReverts() (gas: 30391)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 477.16ms (756.49ms CPU time)\n\nRan 13 tests for test/IMDwindowshopper.properties.t.sol:IMDwindowshopperPropertiesTest\n[PASS] testFuzz_aHolderCanLeaveWithEverythingAtAnyTime(address,uint256,uint40) (runs: 1000, μ: 131223, ~: 130981)\nLogs:\n  Bound result 18\n\n[PASS] testFuzz_aliasedPartiesConserveTokens(uint256,uint256,uint256,uint256,uint256) (runs: 1000, μ: 226222, ~: 235101)\nLogs:\n  Bound result 132765270312732054836884062\n  Bound result 78916505579734548012075455\n\n[PASS] testFuzz_callsLeaveThirdPartiesUntouched(address,uint256,uint256) (runs: 1000, μ: 360640, ~: 362268)\nLogs:\n  Bound result 247607981064507219696169023\n  Bound result 183289322803188133632768554\n\n[PASS] testFuzz_callsOutsideTheAbiFailAndChangeNothing(address,bytes4,bytes) (runs: 1000, μ: 177923, ~: 177710)\n[PASS] testFuzz_distributorClaimsPayInFull(uint256) (runs: 1000, μ: 2191115, ~: 2240119)\nLogs:\n  Bound result 35\n\n[PASS] testFuzz_infiniteAllowanceIsNeverConsumed(uint256) (runs: 1000, μ: 171908, ~: 171757)\nLogs:\n  Bound result 339550625120203362453961254\n\n[PASS] testFuzz_lastApprovalWinsAndRepeatingItChangesNothing(uint256,uint256) (runs: 1000, μ: 144645, ~: 144667)\n[PASS] testFuzz_launchFlowsArriveWhole(uint256,bytes32) (runs: 1000, μ: 490064, ~: 490572)\nLogs:\n  Bound result 8718\n\n[PASS] testFuzz_repeatedPullsNeverExceedTheGrant(uint256,uint256[8]) (runs: 1000, μ: 740808, ~: 752998)\nLogs:\n  Bound result 782031417212059915707784831\n  Bound result 310233721952635258676356779\n  Bound result 2\n  Bound result 59389319429748883122566051\n  Bound result 631585017063\n  Bound result 166548165361272757806884977\n  Bound result 8610339420860373781528636\n  Bound result 10158676898325390500\n  Bound result 27217689933973135831383403\n\n[PASS] testFuzz_spendOverBalanceRevertsWhateverTheAllowance(uint256,uint256,bool) (runs: 1000, μ: 185155, ~: 185190)\nLogs:\n  Bound result 92\n  Bound result 18000\n\n[PASS] testFuzz_splittingASpendReachesTheSameState(uint256,uint256,uint256) (runs: 1000, μ: 264284, ~: 268380)\nLogs:\n  Bound result 74\n  Bound result 8\n  Bound result 0\n\n[PASS] testFuzz_splittingATransferReachesTheSameState(address,uint256,uint256) (runs: 1000, μ: 189425, ~: 190613)\nLogs:\n  Bound result 639761282376382322454754675\n  Bound result 397263882164181865134994487\n\n[PASS] testFuzz_transferThenReturnRestoresBothBalances(address,uint256) (runs: 1000, μ: 111063, ~: 111165)\nLogs:\n  Bound result 17\n\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 477.21ms (5.81s CPU time)\n\nRan 45 tests for test/IMDwindowshopper.edges.t.sol:IMDwindowshopperEdgesTest\n[PASS] test_addressArgumentsWithDirtyHighBitsAreRejected() (gas: 120632)\n[PASS] test_allowanceFollowsTheOwnerNotTheTokens() (gas: 148002)\n[PASS] test_allowanceIsCheckedBeforeBalance() (gas: 141031)\n[PASS] test_allowanceIsCheckedBeforeReceiver() (gas: 36002)\n[PASS] test_allowanceOutlivesAnEmptiedBalance() (gas: 317875)\n[PASS] test_approveEmitsOneLogEvenWhenTheValueIsUnchanged() (gas: 90953)\n[PASS] test_approveWritesOnlyTheAllowance() (gas: 61177)\n[PASS] test_compiledCodeHasNoExternalInteractionOrEnvironmentRead() (gas: 2703254)\n[PASS] test_compiledDispatcherHoldsOnlyTheDocumentedSurface() (gas: 1299920)\n[PASS] test_constructorMintsToTheCallerNotTheTransactionOrigin() (gas: 24447)\n[PASS] test_constructorRejectsNativeValue() (gas: 703680)\n[PASS] test_constructorRevertsWhenTheDeployerIsTheZeroAddress() (gas: 4153)\n[PASS] test_everyFunctionRefusesNativeValue() (gas: 343438)\n[PASS] test_finiteSpendEmitsTransferButNoApproval() (gas: 124656)\n[PASS] test_finiteSpendWritesTheBalancesAndTheAllowance() (gas: 126691)\n[PASS] test_holderMustApproveItselfToUseTransferFrom() (gas: 161577)\n[PASS] test_infiniteAllowanceSurvivesARejectedSpendAndCanBeRevoked() (gas: 157176)\n[PASS] test_infiniteSpendEmitsTransferButNoApproval() (gas: 121771)\n[PASS] test_infiniteSpendLeavesTheAllowanceSlotUnwritten() (gas: 121407)\n[PASS] test_metadataIsExactlyTheBriefsAsciiBytes() (gas: 24012)\n[PASS] test_oneBelowTheMaximumAllowanceIsFinite() (gas: 124853)\n[PASS] test_ownerSpenderAndRecipientMayAllBeTheSameAccount() (gas: 105416)\n[PASS] test_receiverIsCheckedBeforeBalance() (gas: 32922)\n[PASS] test_rejectedCallsEmitNothing() (gas: 110141)\n[PASS] test_replacingAnAllowanceDoesNotAccountForWhatWasAlreadySpent() (gas: 217113)\n[PASS] test_runtimeFitsEip170() (gas: 7891)\n[PASS] test_sameCreate2SaltCannotMintASecondTime() (gas: 230929)\n[PASS] test_selfTransferEmitsOneLog() (gas: 41717)\n[PASS] test_selfTransferOverBalanceRevertsAndDoesNotInflate() (gas: 40253)\n[PASS] test_separateDeploymentsShareNoState() (gas: 137739)\n[PASS] test_spendingFromTheZeroAddressReverts() (gas: 65657)\n[PASS] test_storageLayoutMatchesTheSlotsTheseTestsWatch() (gas: 60539)\n[PASS] test_tokensSentToTheTokenItselfStayCountedAndNoCallerCanRemoveThem() (gas: 186171)\n[PASS] test_transferDeliversToARecipientThatRefusesEveryCall() (gas: 227432)\n[PASS] test_transferEmitsOneLogAndNothingElse() (gas: 68676)\n[PASS] test_transferFromTheZeroAddressReverts() (gas: 40063)\n[PASS] test_transferOfTheMaximumAmountReverts() (gas: 42512)\n[PASS] test_transferOneMoreThanTheWholeSupplyReverts() (gas: 35493)\n[PASS] test_transferWritesOnlyTheTwoBalances() (gas: 68213)\n[PASS] test_transfersAreIndependentOfTimeBlockAndChain() (gas: 119642)\n[PASS] test_truncatedCalldataIsRejected() (gas: 98453)\n[PASS] test_writesReturnExactlyOneAbiEncodedTrue() (gas: 156640)\n[PASS] test_zeroAddressCannotApproveOrSpend() (gas: 87451)\n[PASS] test_zeroValueSpendKeepsAnExistingAllowance() (gas: 109316)\n[PASS] test_zeroValueSpendToTheZeroAddressReverts() (gas: 36188)\nSuite result: ok. 45 passed; 0 failed; 0 skipped; finished in 477.31ms (35.08ms CPU time)\n\nRan 1 test for test/IMDwindowshopper.invariant.t.sol:IMDwindowshopperInvariantTest\n[PASS]\nIMDwindowshopperInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchModel\n[PASS] invariant_supplyIsFixedAndAllTokensAreAccountedFor\n IMDwindowshopperInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+---------------+-------+---------+----------╮\n| Contract     | Selector      | Calls | Reverts | Discards |\n+===========================================================+\n| TokenHandler | approve       | 2090  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| TokenHandler | rejectedSpend | 2025  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| TokenHandler | transfer      | 2047  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| TokenHandler | transferFrom  | 2030  | 0       | 0        |\n╰--------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 438650419742663188705210290\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 2\n  Bound result 0\n  Bound result 0\n  Bound result 91\n  Bound result 5753\n  Bound result 948541928026267833110668235\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 1525\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 64\n  Bound result 6083\n  Bound result 0\n  Bound result 2548\n  Bound result 5373\n  Bound result 777\n  Bound result 250\n  Bound result 774\n  Bound result 8000000000000000000\n  Bound result 0\n  Bound result 57\n  Bound result 43\n  Bound result 879580473031576726597139439\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.00s (2.99s CPU time)\n\nRan 2 tests for test/IMDwindowshopper.ledger.invariant.t.sol:IMDwindowshopperLedgerInvariantTest\n[PASS]\nIMDwindowshopperLedgerInvariantTest invariants:\n[PASS] invariant_allowancesMatchTheOperationLedger\n[PASS] invariant_balancesMatchTheOperationLedger\n[PASS] invariant_everyHolderSumsToTheSupply\n[PASS] invariant_metadataNeverChanges\n[PASS] invariant_supplyNeverChanges\n[PASS] invariant_tokenContractGrantsNoAllowance\n[PASS] invariant_tokenHoldsNoEther\n[PASS] invariant_transferLogsReconstructEveryBalance\n[PASS] invariant_zeroAddressStaysEmpty\n IMDwindowshopperLedgerInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭---------------+---------------------------+-------+---------+----------╮\n| Contract      | Selector                  | Calls | Reverts | Discards |\n+========================================================================+\n| LedgerHandler | approve                   | 2329  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | refuseEther               | 2403  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | refuseUnknownCall         | 2249  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | rejectApproveZero         | 2404  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | rejectPullFromTheToken    | 2325  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | rejectSpendOverAllowance  | 2235  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | rejectSpendOverBalance    | 2276  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | rejectSpendToZero         | 2294  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | rejectTransferOverBalance | 2317  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | rejectTransferToZero      | 2376  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | transfer                  | 2354  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | transferFrom              | 2312  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | transferToAnyone          | 2461  | 0       | 0        |\n|---------------+---------------------------+-------+---------+----------|\n| LedgerHandler | transferToTheToken        | 2433  | 0       | 0        |\n╰---------------+---------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 185454420256882688\n  Bound result 706887517289120635570895227\n  Bound result 1840\n  Bound result 4228666474\n  Bound result 2831\n  Bound result 13\n  Bound result 10000000000000000000\n  Bound result 11\n  Bound result 4\n  Bound result 11\n  Bound result 30151\n  Bound result 3460\n  Bound result 199999999999999999999996540\n  Bound result 12026\n  Bound result 1\n  Bound result 1928370390\n  Bound result 758\n  Bound result 7141\n  Bound result 5\n  Bound result 390\n  Bound result 11424\n  Bound result 2021\n  Bound result 7531\n  Bound result 11026\n  Bound result 6450\n  Bound result 15110006783\n  Bound result 81736475725752411649910876306743881184\n  Bound result 115792089237316195423570985008687907853269984665640164039457584007913129641975\n  Bound result 3467327167160270333052799810373536622999959440319862397840265439637615\n  Bound result 115792089237316195423570985008687907853269984665640164053606356486583136551473\n  Bound result 244\n  Bound result 29879\n  Bound result 682209530\n  Bound result 92\n  Bound result 9311\n  Bound result 20\n  Bound result 13\n  Bound result 127\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 14\n  Bound result 1725540769\n  Bound result 86\n  Bound result 60\n  Bound result 10574\n  Bound result 173\n  Bound result 1000000000000000000000000000\n  Bound result 1087\n  Bound result 9496931309737790613393233563945239117006884497695829140336390858578702\n  Bound result 893\n  Bound result 14\n\n[PASS] test_everyHandlerPathIsReachableAndChecked() (gas: 3887986)\nLogs:\n  Bound result 1\n  Bound result 200000000000000000000000001\n  Bound result 200000000000000000000000001\n  Bound result 0\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 30.19s (30.19s CPU time)\n\nRan 5 test suites in 30.19s (34.62s CPU time): 94 tests passed, 0 failed, 0 skipped (94 total tests)\n","passed":true},{"durationMs":66,"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,\"README.md\":96,\"foundry.toml\":21,\"remappings.txt\":2,\"src/IMDwindowshopper.sol\":16,\"test/IMDwindowshopper.edges.t.sol\":649,\"test/IMDwindowshopper.invariant.t.sol\":107,\"test/IMDwindowshopper.ledger.invariant.t.sol\":486,\"test/IMDwindowshopper.properties.t.sol\":303,\"test/IMDwindowshopper.t.sol\":409},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"98b514994ad78616a6dcf0cf774affefd5661e95bf6a7fa8e1a97c8ba13f65e4","verifiedTreeHash":"e33d91285b2d4a8301e7b50acd864d8c5af5d599","verifierVersion":"0.1.0+a6eb4461"},{"checks":[{"durationMs":1583,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.48s\nCompiler run successful!\n","passed":true},{"durationMs":3483,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 33 tests for test/IMDwindowshopper.t.sol:IMDwindowshopperTest\n[PASS] testFuzz_approveAnyAmount(uint256) (runs: 256, μ: 88645, ~: 88671)\n[PASS] testFuzz_excessAllowanceSpendReverts(uint256,uint256) (runs: 256, μ: 122843, ~: 123379)\nLogs:\n  Bound result 17806\n  Bound result 999999999999999999999994325\n\n[PASS] testFuzz_excessBalanceTransferReverts(uint256,uint256) (runs: 256, μ: 126956, ~: 127714)\nLogs:\n  Bound result 210204933543412965900673255\n  Bound result 210204933543412965900673257\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 93157, ~: 93136)\nLogs:\n  Bound result 483020986101061467066538876\n\n[PASS] testFuzz_transferFromUsesOnlyApprovedAmount(uint256,uint256) (runs: 256, μ: 161863, ~: 164899)\nLogs:\n  Bound result 17806\n  Bound result 12131\n\n[PASS] test_approvalIsSpecificToOwnerAndSpender() (gas: 175453)\n[PASS] test_approveDoesNotRequireCurrentBalance() (gas: 78615)\n[PASS] test_approveEmitsEventWithoutMovingFunds() (gas: 88743)\n[PASS] test_approveReplacesAllowanceAndCanRevokeIt() (gas: 167108)\n[PASS] test_approveToZeroReverts() (gas: 37661)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9676)\n[PASS] test_deployerCannotSpendHolderTokensWithoutApproval() (gas: 160114)\n[PASS] test_factoryCreate2ReceivesEntireSupplyAndTransfersExactShares() (gas: 599564)\n[PASS] test_infiniteAllowanceIsNotReduced() (gas: 139255)\n[PASS] test_metadataAndInitialSupply() (gas: 107584)\n[PASS] test_nativeCurrencyAndUnknownCallsAreRejected() (gas: 58883)\n[PASS] test_noMintBurnAdminOrUpgradeEntryPoints() (gas: 1540816)\n[PASS] test_selfTransferPreservesBalance() (gas: 51410)\n[PASS] test_transferDeliversExactAmountAndEmitsEvent() (gas: 93461)\n[PASS] test_transferEntireBalance() (gas: 75799)\n[PASS] test_transferExceedingBalanceRevertsAtomically() (gas: 120047)\n[PASS] test_transferFromConsumesAllowanceAndEmitsTransfer() (gas: 149775)\n[PASS] test_transferFromExactAllowanceCannotBeRepeated() (gas: 161834)\n[PASS] test_transferFromInsufficientBalancePreservesAllowance() (gas: 178472)\n[PASS] test_transferFromToSelfConsumesAllowanceButPreservesBalance() (gas: 107624)\n[PASS] test_transferFromToZeroPreservesAllowance() (gas: 114190)\n[PASS] test_transferFromWithoutApprovalReverts() (gas: 57869)\n[PASS] test_transferOneBaseUnit() (gas: 78512)\n[PASS] test_transferToContractDoesNotCallRecipient() (gas: 98802)\n[PASS] test_transferToZeroReverts() (gas: 47664)\n[PASS] test_zeroTransferFromEmptyAccountSucceedsAndEmitsEvent() (gas: 63145)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 68911)\n[PASS] test_zeroTransferToZeroReverts() (gas: 30391)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 21.13ms (100.75ms CPU time)\n\nRan 1 test for test/IMDwindowshopper.invariant.t.sol:IMDwindowshopperInvariantTest\n[PASS]\nIMDwindowshopperInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchModel\n[PASS] invariant_supplyIsFixedAndAllTokensAreAccountedFor\n IMDwindowshopperInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+---------------+-------+---------+----------╮\n| Contract     | Selector      | Calls | Reverts | Discards |\n+===========================================================+\n| TokenHandler | approve       | 2090  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| TokenHandler | rejectedSpend | 2025  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| TokenHandler | transfer      | 2047  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| TokenHandler | transferFrom  | 2030  | 0       | 0        |\n╰--------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 438650419742663188705210290\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5544\n  Bound result 0\n  Bound result 0\n  Bound result 11\n  Bound result 159\n  Bound result 74\n  Bound result 0\n  Bound result 4383\n  Bound result 5784\n  Bound result 948541928026267833110668235\n  Bound result 0\n  Bound result 0\n  Bound result 3356\n  Bound result 1496\n  Bound result 3\n  Bound result 1930\n  Bound result 0\n  Bound result 0\n  Bound result 4000000000000000000\n  Bound result 90\n  Bound result 58\n  Bound result 68\n  Bound result 5457\n  Bound result 100\n  Bound result 6\n  Bound result 2331\n  Bound result 1\n  Bound result 100000000000000000000\n  Bound result 0\n  Bound result 26865021067686467339\n  Bound result 104150494580633029621338179\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.35s (3.35s CPU time)\n\nRan 2 test suites in 3.35s (3.37s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":60,"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,\"README.md\":96,\"foundry.toml\":21,\"remappings.txt\":2,\"src/IMDwindowshopper.sol\":16,\"test/IMDwindowshopper.invariant.t.sol\":107,\"test/IMDwindowshopper.t.sol\":409},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1066,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":403,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/IMDwindowshopper.sol:11: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c7c62535dd1da4c471d27849e9848ca36f63b6fcfc263f76676949d70a7aa858","verifiedTreeHash":"daefdba5e75e49dc84a636c953bf8b2afc882a6f","verifierVersion":"0.1.0+a6eb4461"}]}