{"assessments":[],"deployments":[{"attestationHash":"c9384eb643d7ead2830c9b81ef91d4df0802747896b8f14b99c38801fe1d52b0","chainId":1,"contracts":[{"address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","blockNumber":26262798,"name":"PoolInitializationGuard","role":"hook","txHash":"0x19b8c7dfc937f0706c25c191944e805172c0862f8880189075b1fd266a832da8"},{"address":"0xebb425c28b783fa3addf7a69e92383373ce35de5","blockNumber":26262798,"name":"WindowShopperToken","role":"token","txHash":"0x19b8c7dfc937f0706c25c191944e805172c0862f8880189075b1fd266a832da8"},{"address":"0x6b5ee360aae9511030ceac6173c0405a59dcdd62","blockNumber":26262798,"name":"MerkleDistributor","role":"distributor","txHash":"0x19b8c7dfc937f0706c25c191944e805172c0862f8880189075b1fd266a832da8"}],"id":"c7e5d823-a906-4002-8fbc-f3451e5ac4a3","manifestHash":"123aca747c70f3054c1c128f3faa7ac73189264e4badf0cb0beacb9a7778c69a","status":"live"}],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"84f391b5-9430-4aa8-b782-21e8fad3c868","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"369c303743f61619f4c1dffedefc09b83f1b4e172919294a0ac98cc445e27d34","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":"adf3bf7f4a6503f42e50792e5841ab2aa168694521f97a7718dcbccb3712aaeb","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":"32f42f6d4a6595e93143d8f3f747b63aa7f58191fc7bf183c9cf613d0aa587c5","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":"7ca35a82062a8b2bd79ea23210d53b3e99653984fcfdc2f32b6543e5a426df4f","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":"62dabb69e7d5e5a9587b05ddb95bff9547b41ca673c8223c995dcd6577e7da74","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":"3001059d22ae8ca460ba9cd952812c2191cfcf190d475bc999037e92cdb4be72","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"816fe39c7efd64504a19175b0f4dd9186d61069f37a22684c90358a18c60bddc","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"816fe39c7efd64504a19175b0f4dd9186d61069f37a22684c90358a18c60bddc","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"bff76f5fa6a9b6687cefde7863da6c52f986794dfedf83735a348a8ac79f5792","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"3a8f18076d54a5e6bbff9087fbea1116c8b509de6e8448a770defa4c613a9073","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"ab3f8f2aa4e7f3b3ada558c0dcf522ba733ca3df3b1da92c707a0fe305816d5f","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"ab3f8f2aa4e7f3b3ada558c0dcf522ba733ca3df3b1da92c707a0fe305816d5f","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.\nWhat it does: X：x.com/windowshoppermd","parentJobId":null,"planHash":"45419c15cb6cf3413a62b230cabcf350b4e8e38cd5376ab313fda2331d6d8c67","previousHash":"dd0f772c8028fe7bd3cd7ed34893c0a4fecc431f3bf2520df068d3d4aa6652e7","projectId":"84f391b5-9430-4aa8-b782-21e8fad3c868","publication":{"commit":"aac7905429854a5d094211cf87942b2e5d121f45","deliveredAt":"2026-10-24T13:26:13.632Z","repoUrl":"https://github.com/identity-md-launches/launch-2534-imdwindowshopper"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"c04b06512ffe66bdc97f96e742f9243c4d9d5cf3dfbbf3c2fd781a35af8fea81","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"fee808a3be3a3c819612505c26db17648068b22c3785a1670130f29784ea64a5","device":"262346efaedbfe8b","findings":[],"hash":"3001059d22ae8ca460ba9cd952812c2191cfcf190d475bc999037e92cdb4be72","nodeId":"9fd6a7e5-a4fc-45f1-b2cc-134d30b65a24","outcome":"completed","summary":"Done. The IMDwindowshopper (WWW) token is implemented, tested, documented, and committed as c406f06.\n\n**What was built**\n\n- `src/WindowShopperToken.sol`: a fixed-supply ERC-20 built on vendored OpenZeppelin v5.4.0 (ERC20, ERC20Burnable, ERC20Permit). The constructor takes no arguments and mints 1,000,000,000 WWW with 18 decimals once to `msg.sender`, which is the launch factory. There is no owner, minter, pause, blocklist, fee, or upgrade path, so the supply can only shrink and every launch flow moves exactly what it says.\n- `script/DeployWindowShopperToken.s.sol`: a local deploy helper whose `deploy()` function reads nothing from the environment and is what the tests call.\n- `test/`: 40 tests, all passing with the verifier's fuzz seed and a minimal environment. They cover metadata and the one-time mint, transfer, approve, transferFrom, burn, burnFrom and permit with both success and failure cases, plus the launch floor properties from the protected test (exact 10% swarm flow, no call grows supply, no privileged call moves or freezes a holder, no receive or fallback, runtime under EIP-170, and no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT in the bytecode). Four fuzz tests check conservation of supply and balance and allowance bounds.\n- `README.md`: assumptions, manifest values for the launch, operational responsibilities, and the note that this is not an audit.\n- `foundry.toml`: pins solc 0.8.26, `bytecode_hash = \"none\"`, optimizer on, ffi off, no filesystem permissions, and the verifier's fuzz seed. forge-std v1.11.0 and the ERC20, utils and interfaces parts of OpenZeppelin are vendored under `lib/` as plain files with no git submodules.\n\n**Checks run**\n\n| Check | Result |\n| --- | --- |\n| `forge build` | passes, runtime 4,321 bytes |\n| `forge test` (seed pinned, empty env) | 40 passed, 0 failed |\n| `forge fmt --check` | passes |\n| Clean clone of the commit, same three checks | passes |\n\n**Notes for the requester**\n\n- Slither was not available on this machine, so it did not run. The source uses no selfdestruct, delegatecall, encodePacked, or external library calls.\n- The sandbox's placeholder dotfiles and the `.claude/` directory were left out of the commit since they are not part of the deliverable.\n- No `launch.json` was written. The manifest step owns it.","treeHash":"8d8c78c8c20aaa6323977f9a2ca2d78893d51975","usage":{"cachedInputTokens":968131,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":22975,"runtime":"claude","turns":28,"wallClockMs":304313}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"be306690d4a9deec","findings":[{"citation":"resolved","description":"Merged from audit_flow (the only specialist finding; audit_permissions, audit_economics, audit_math and write_foundry_tests reported none). WindowShopperToken inherits OpenZeppelin v5.4.0 ERC20Permit unchanged; I confirmed every one of the 119 vendored Solidity files under lib/openzeppelin-contracts/contracts is byte-identical to the @openzeppelin/contracts 5.4.0 npm release (only the five README.adoc files are extra; they are not compiled). As in every EIP-2612 token, permit() reads the owner's signature from calldata and may be called by anyone (lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol lines 42-63). Once a signature is public, an observer can submit it first: the nonce advances and the allowance is set to exactly the signed value for the signed spender, after which the owner's own transaction that bundles permit() with a follow-up call reverts with ERC2612InvalidSigner because the struct hash now embeds the next nonce. No funds move, no allowance other than the one the owner signed is created, and nothing is frozen. This is a documented property of the standard and of the OpenZeppelin implementation, not a defect in this contract, and it is recorded for integrators: wrap permit() in try/catch or check allowance() before calling it, and keep deadlines short as the README advises. Severity recalibrated to info: no loss, no wrong-party payment, no breakage; the contract should not change for it.","line":17,"path":"src/WindowShopperToken.sol","reproduction":"State: token deployed by test contract (holds 1e27); signer S = vm.addr(0xA11CE) is sent 100e18; nonces(S) == 0; spender B = 0xB0B; deadline = block.timestamp + 1 hours. S signs the EIP-712 digest keccak256(0x1901 || DOMAIN_SEPARATOR() || keccak256(abi.encode(PERMIT_TYPEHASH, S, B, 5e18, 0, deadline))). Step 1: unrelated address C = 0xCAFE calls token.permit(S, B, 5e18, deadline, v, r, s). Expected and actual: succeeds; allowance(S,B) == 5e18; nonces(S) == 1. Step 2: S calls token.permit(S, B, 5e18, deadline, v, r, s) with the same signature. Expected by an integrator bundling permit+transferFrom: success. Actual: reverts (ERC2612InvalidSigner) because the hash is now computed with nonce 1; allowance(S,B) stays 5e18 and balanceOf(S) stays 100e18. Verified with forge test on a scratch file test/scratch/PermitFrontRun.t.sol (test_permitFrontRun: step 1 passes, step 2 hits vm.expectRevert, post-state assertions hold).","severity":"info","snippet":"contract WindowShopperToken is ERC20, ERC20Burnable, ERC20Permit {","title":"permit() signatures can be submitted by any third party first, so a signer's own permit-then-act bundle reverts (inherent to EIP-2612; no code change required)"}],"hash":"32f42f6d4a6595e93143d8f3f747b63aa7f58191fc7bf183c9cf613d0aa587c5","nodeId":"fad5ed33-2752-43b6-b779-78e6e7d02083","outcome":"completed","summary":"Review complete. The findings file is written and no repository file was changed.\n\n**Outcome:** the token is clean. It is three unmodified OpenZeppelin 5.4.0 mixins plus an argument-less constructor that mints the whole supply to the deployer. I kept one informational observation and found no defects of my own.\n\n**What I verified**\n\n- **Vendored library is genuine.** Every one of the 119 Solidity files under `lib/openzeppelin-contracts` is byte-identical to the npm 5.4.0 tarball. Only five README.adoc files are extra, and they are not compiled.\n- **Build and tests.** All 76 project tests pass with the pinned fuzz seed, and the formatter check passes.\n- **ABI and bytecode.** No mint, owner, pause, blocklist, receive or fallback is exposed. No link references, no DELEGATECALL, CALLCODE or SELFDESTRUCT. Runtime is 4,321 bytes and creation code 6,084 bytes, well under the factory's limits.\n- **Manifest.** Only schema keys, constructor arguments empty to match the constructor, total supply equals what the constructor mints, decimals match, addresses lowercase, notes short.\n- **Static analysis lead.** The aderyn large-literal note is the supply constant, which evaluates to exactly 1e27 as the manifest requires. Not a defect.\n\n**Specialist findings**\n\n- The only one, from audit_flow, is that a third party can submit a permit signature first, making the signer's own permit-then-act bundle revert. I reproduced it with a scratch Foundry test. It is inherent to EIP-2612 and creates no allowance beyond what was signed, so it stays at info with an explicit \"no code change required\" note.\n- The other four areas reported nothing, and nothing needed merging.\n\n**Coverage.** All six entry points are answered: five hold, and permit carries the info finding. Three extra rows record the fixed-supply invariant, the dependency authenticity check and the manifest check.","treeHash":null,"usage":{"cachedInputTokens":479232,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":12114,"runtime":"claude","turns":21,"wallClockMs":198249}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a7ac9f7a7687c25e","findings":[],"hash":"369c303743f61619f4c1dffedefc09b83f1b4e172919294a0ac98cc445e27d34","nodeId":"a44d1982-3b17-4541-9558-eb1d05a8e0e1","outcome":"completed","summary":"The review is complete. `.imd-findings.json` holds an empty findings list and a ten-row coverage record. The working tree is clean apart from the findings file and my scratch test, which is git-ignored.\n\n**Result: no reproducible defect in the economics area.** The token is OpenZeppelin ERC20 + ERC20Burnable + ERC20Permit with a constructor that mints one billion WWW to the deployer. It has no custom transfer logic, no owner, and no mint path after construction.\n\nWhat I checked against the Economic Security, Invariant and Flow Gap guides:\n\n- **Supply conservation and monotonicity.** A stateful invariant run of 256 sequences times 500 random transfer, transferFrom, approve, burn and burnFrom calls kept sum of balances equal to totalSupply and totalSupply equal to the initial supply minus burns. Zero reverts.\n- **Launch flows.** The 10/60/30 split of the supply is exact with no dust, and every flow the factory, distributor, pool manager and traders perform moves exactly the asked amount. There is no fee, hook or exemption list to get wrong.\n- **Allowance coupling.** burnFrom and transferFrom are bounded by the allowance identically, and the factory cannot move or burn a holder's balance without approval.\n- **Permit.** Deadline, nonce, EIP-712 domain and low-s signature checks all hold. The domain separator rebuilds on a chain-id change, so no cross-chain replay. A third party submitting someone's permit first sets exactly the signed allowance, which is a known ERC-2612 property and not a value-misrouting defect.\n- **Dependency integrity.** Every vendored file under OpenZeppelin and forge-std is byte-identical to upstream tags v5.4.0 and v1.11.0. The compiled ABI exposes only the expected selectors.\n- **Static-analysis lead.** The aderyn large-literal note on line 28 evaluates to exactly 1e27 and is not a defect.\n\nAll six listed entry points are marked `holds`. One row is `unreached`: no launch.json exists in the tree yet, so the manifest could not be compared against the code. The README's intended manifest values are consistent with the source.\n\nTools run: forge build, the project's 40 tests, forge fmt check, and my scratch test file under test/scratch with seven passing checks.","treeHash":null,"usage":{"cachedInputTokens":797699,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":15736,"runtime":"claude","turns":31,"wallClockMs":231382}},{"artifacts":[],"attempt":1,"bundleHash":"af57250fbb855003f4e8c4769940e0986fc9391c7a41b706c86b6e1bfd49ffb5","device":"82601570d69ec3a9","findings":[],"hash":"3a8f18076d54a5e6bbff9087fbea1116c8b509de6e8448a770defa4c613a9073","nodeId":"6fb314c7-c939-47a7-b53c-2cb6f2f18e43","outcome":"completed","summary":"Added failure-path, boundary, permit-security, and four-actor invariant tests under `test/`.\n\nVerification passed offline with the required seed: **76 tests passed, 0 failed**, including **32,768 randomized handler calls**. `forge build` and formatting checks passed.\n\nNo contract defects were identified. All changes are confined to `test/`.","treeHash":"0d6c7ddde7300480754d60f024b0f706c9b9ff7a","usage":{"cachedInputTokens":1563520,"inputTokens":189338,"model":"gpt-6-astra","outputTokens":26928,"runtime":"codex","turns":7,"wallClockMs":648706}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"99e4819277ea59fc","findings":[],"hash":"62dabb69e7d5e5a9587b05ddb95bff9547b41ca673c8223c995dcd6577e7da74","nodeId":"bcf15a4c-a373-4cc1-a300-f0f5ce7b7731","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree is unchanged apart from it.\n\n**Result: no defects in the permission model.** `.imd-findings.json` holds an empty findings list and ten coverage rows, one per listed entry point plus four invariants, all `holds`.\n\n**What I checked, from the Access Control, Trust Gap and Asymmetry guides:**\n\n- **Permission map.** The token has no owner, role, minter, pauser, initializer, proxy, receive or fallback. The ABI's only state-changing entries are the six listed functions and a no-argument constructor. Storage holds only balances, allowances, supply, name, symbol, EIP-712 fallbacks and nonces.\n- **Deployer power.** The factory receives the whole supply but has no power over a holder beyond any stranger's. Its calls to `transferFrom` and `burnFrom` against a holder revert on allowance, as the protected floor test requires.\n- **Permit.** Deadline, nonce, chain-bound domain, low-s and zero-recover checks all hold. I probed zero owner, wrong chain, malleated s and replay. Each reverts and sets no allowance.\n- **Asymmetry.** `approve` and `permit` end in the same `_approve`. `transferFrom` and `burnFrom` both spend allowance before `_update`. There is no admin variant of any user function, and no fee or exemption branch exists on the transfer path.\n- **Library integrity.** All twenty compiled OpenZeppelin dependencies are byte-identical to the upstream v5.4.0 tag, so no backdoor hides in the vendored code.\n\n**Trust note, not a finding.** Anyone may submit a holder's valid permit signature before the holder's own bundled transaction, which then reverts on the nonce. This is standard ERC-2612 behaviour and grants exactly what was signed, so I recorded it in the permit coverage row rather than as a defect.\n\n**Static-analysis lead.** The aderyn large-literal note at line 28 is not a defect. The constant evaluates to exactly 1e27 and the existing supply test confirms it.\n\n**Tools run.** `forge build`, the project's 40 tests, and nine scratch probe tests of my own, all passing. The scratch file is deleted. Slither and Mythril were not run.","treeHash":null,"usage":{"cachedInputTokens":805586,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":17121,"runtime":"claude","turns":34,"wallClockMs":265250}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3f91b58cf7cd2d45","findings":[],"hash":"7ca35a82062a8b2bd79ea23210d53b3e99653984fcfdc2f32b6543e5a426df4f","nodeId":"19e11878-5c93-412b-9933-7130e4e82704","outcome":"completed","summary":"The review found no defects. The findings file holds an empty list and nine coverage rows, and the working tree is otherwise untouched.\n\n**What I checked, in the assigned area**\n\n- **Math Precision:** the only arithmetic in `src/WindowShopperToken.sol` is the supply constant. The exponent is a uint8 but Solidity evaluates a literal base to a non-literal power in uint256, so it yields exactly one billion times ten to the eighteenth with no wrap. Decimals, the constant and `totalSupply()` all agree with the manifest values. The inherited ERC-20 arithmetic checks balance and allowance before its unchecked subtractions, and the sum of balances equals total supply under fuzzing.\n- **Boundary:** every entry point was driven with zero, whole-supply, max-uint and off-by-one inputs. Transfers to the zero address revert, max-uint transfers revert with the exact error, infinite allowance is never decremented while max-minus-one is, burning the whole balance drives supply to zero cleanly, and zero-amount transferFrom or burnFrom with no allowance moves nothing. The token has no payable function, external call, sentinel branch or bytes decoding, so those checklist items do not apply.\n- **Numerical Gap:** the permit deadline is inclusive at the exact timestamp and rejects one second later, the nonce is consumed only on success, malleable high-s signatures and a zero owner revert, and the EIP-712 domain separator matches the declared name and version and rebinds on chain-id change.\n\n**Supply-chain check:** every Solidity file under the vendored OpenZeppelin directory is byte-identical to the upstream v5.4.0 release archive, so the inherited code is the audited library's, not a modified copy.\n\n**Outside my area:** no owner, mint, pause, blocklist, receive, fallback, DELEGATECALL or SELFDESTRUCT exists, and the project's own 40 tests pass with the pinned fuzz seed. The aderyn large-literal note is cosmetic. The one trust assumption worth recording for the judge is that whoever deploys receives the whole supply, which is the launch factory by design.","treeHash":null,"usage":{"cachedInputTokens":459198,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":11663,"runtime":"claude","turns":20,"wallClockMs":161861}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4ebee02fc506f27c","findings":[{"citation":"resolved","description":"The token inherits OpenZeppelin v5.4.0 ERC20Permit unchanged (verified byte-identical to the npm 5.4.0 release). As in every EIP-2612 token, permit() takes the owner's signature from calldata and may be called by anyone. Once a signature is broadcast, an observer can submit the identical permit first; the nonce is consumed and the allowance is set exactly as the owner intended, but the owner's own transaction that bundles permit() with a follow-up call (for example a router doing permit then transferFrom) reverts with ERC2612InvalidSigner because the nonce has moved. No funds are lost and no allowance other than the one the owner signed is created. This is a known property of the standard and of the OpenZeppelin implementation, not a bug in this contract; it is recorded so that integrators of WWW wrap permit() in a try/catch or check the allowance before calling it, and so that the README's advice to use short deadlines is understood as a mitigation of this griefing path. Nothing in the contract should change for it.","line":17,"path":"src/WindowShopperToken.sol","reproduction":"State: signer S holds any balance; nonce(S)=0. S signs Permit(owner=S, spender=B, value=5e18, nonce=0, deadline=now+1h). Step 1: an unrelated address C calls token.permit(S, B, 5e18, deadline, v, r, s) -> succeeds, allowance(S,B)=5e18, nonces(S)=1. Step 2: S (or S's router) calls token.permit(S, B, 5e18, deadline, v, r, s) with the same signature -> reverts with ERC2612InvalidSigner(recovered, S) because the struct hash now embeds nonce 1. Expected by an integrator bundling permit+transferFrom in one transaction: success; actual: the bundle reverts even though the intended allowance is already in place. Verified with forge test (test_permitFrontRun in a scratch test): step 1 succeeds, step 2 reverts.","severity":"info","snippet":"contract WindowShopperToken is ERC20, ERC20Burnable, ERC20Permit {","title":"permit() can be submitted by any third party first, which makes the signer's own permit-then-act transaction revert (inherent to EIP-2612, integrators must tolerate it)"}],"hash":"adf3bf7f4a6503f42e50792e5841ab2aa168694521f97a7718dcbccb3712aaeb","nodeId":"072550f7-427a-4e7c-b157-f40bd8448fa5","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. No tracked file was changed; `test/scratch/` is gitignored and holds only my verification test.\n\n**Result: no defect found in the token.** The contract is a constructor plus three unmodified OpenZeppelin mixins, and every entry point traced as intended.\n\nWhat I checked, per the Execution Trace, Periphery and First Principles guides:\n\n- **Periphery.** All 119 vendored OpenZeppelin files are byte-identical to the npm 5.4.0 release, so no tampered `ERC20.sol` hides behind the clean `src/`. GitHub was blocked by the proxy, so forge-std could not be diffed, but it affects only tests, not the deployed bytecode.\n- **Execution trace.** Each of the six state-changing entry points was traced through checks, state writes and revert paths. Scratch tests confirmed the edge paths the project suite skips: permit with a zero owner, high-s signatures, burnFrom with an infinite allowance, atomic revert of transferFrom to the zero address, and domain separator rebuilding on a chain fork.\n- **First principles.** The constructor mints the whole supply once to the deployer with no arguments, the ABI exposes no mint, owner, pause or upgrade path, the storage layout has no extra slots, and the launch flows move exact amounts. The README deployment parameters match the compiled constants.\n\nOne info-level item is recorded: permit can be submitted by any third party first, so a signer's bundled permit-then-act transaction reverts. This is inherent to EIP-2612 and needs no code change, only awareness from integrators.\n\nCoverage record: six entry points answered, all `holds` except `permit`, which points at the info item. Five extra rows cover the constructor, library integrity, the opcode floor and manifest consistency, with forge-std marked `unreached`.","treeHash":null,"usage":{"cachedInputTokens":803411,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":17168,"runtime":"claude","turns":23,"wallClockMs":259173}},{"artifacts":[],"attempt":1,"bundleHash":"6852bce5b0c21c8ee1cd3696566ee45805dca7d2c604add93d05ffabaae64024","device":"b12a68c6f8a8ce99","findings":[],"hash":"bff76f5fa6a9b6687cefde7863da6c52f986794dfedf83735a348a8ac79f5792","nodeId":"855f3afd-d782-4809-aa65-556045e603b1","outcome":"completed","summary":"I've written `launch.json` for WindowShopperToken, the only contract in the accepted tree. It parses as valid JSON, and `forge build` and `forge test` pass with the verifier's fuzz seed (40 tests, 0 failures). No other file changed.\n\nWhat the manifest says:\n- **Token:** `contract` is `WindowShopperToken`, `name` is \"IMDwindowshopper\", `symbol` is \"WWW\", `decimals` is 18.\n- **Constructor arguments:** none (`[]`), because the constructor takes no parameters.\n- **Total supply:** `\"1000000000000000000000000000\"`. That is 1,000,000,000 tokens with 18 decimals, exactly what the constructor mints once to `msg.sender`.\n- **Application contracts:** none (`[]`), because the accepted tree has none.\n- **Pool:** paired with IMD at `0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7`, fee 12500, tick spacing 60, initial price `\"79228162514264337593543950336\"` (one to one).\n- **Economics:** copied exactly as the job gave it.\n- **Notes:** describe only what the source actually does. It is a fixed-supply ERC-20 that holders can burn from and that supports signature approvals (OpenZeppelin ERC20, ERC20Burnable and ERC20Permit). There is no owner, minting after launch, pause, blocklist or fee. The notes also include the X link.\n\nThe schema validator isn't available on this machine, so I checked the keys and types by hand against the example in the brief rather than running a validator.","treeHash":"4e14c9e7654a21e3e6e85f8fa8fedc5f0c634bdd","usage":{"cachedInputTokens":100367,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":1866,"runtime":"claude","turns":5,"wallClockMs":25280}}],"verification":[{"checks":[{"durationMs":1257,"exitCode":0,"name":"build","output":"Compiling 44 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.06s\nCompiler run successful!\n","passed":true},{"durationMs":222,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployWindowShopperToken.t.sol:DeployWindowShopperTokenTest\n[PASS] test_deployMintsSupplyToTheScriptAsDeployer() (gas: 2558499)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 478.23µs (246.92µs CPU time)\n\nRan 39 tests for test/WindowShopperToken.t.sol:WindowShopperTokenTest\n[PASS] testFuzz_allowanceBoundsTransferFrom(uint256,uint256) (runs: 256, μ: 164600, ~: 185108)\nLogs:\n  Bound result 659918\n  Bound result 600415464925618057593663955\n\n[PASS] testFuzz_burnOnlyShrinksSupply(uint256,uint256) (runs: 256, μ: 126270, ~: 126733)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 96\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 100323, ~: 100408)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 999999990000000000000000096\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 92897, ~: 93341)\nLogs:\n  Bound result 896996168291426942989355875\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 60028)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 30862)\n[PASS] test_burnFromRevertsWithoutAllowance() (gas: 103236)\n[PASS] test_burnFromSpendsAllowance() (gas: 172951)\n[PASS] test_burnReducesBalanceAndSupply() (gas: 114147)\n[PASS] test_burnRevertsAboveBalance() (gas: 92342)\n[PASS] test_constructorEmitsMintEvents() (gas: 10917)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 17732)\n[PASS] test_deployerCannotBurnAHolderWithoutAllowance() (gas: 92975)\n[PASS] test_eachDeploymentMintsToItsOwnDeployer() (gas: 24166)\n[PASS] test_launchFlowsMoveExactAmounts() (gas: 140332)\n[PASS] test_metadata() (gas: 52890)\n[PASS] test_noCallIncreasesSupply() (gas: 657309)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 449336)\n[PASS] test_permitCannotBeReplayed() (gas: 130999)\n[PASS] test_permitRevertsForTamperedValue() (gas: 69385)\n[PASS] test_permitRevertsForWrongSigner() (gas: 73947)\n[PASS] test_permitRevertsWhenExpired() (gas: 43671)\n[PASS] test_permitSetsAllowanceAndBumpsNonce() (gas: 109376)\n[PASS] test_permitThenTransferFrom() (gas: 219611)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 2687977)\n[PASS] test_runtimeFitsEIP170() (gas: 5336)\n[PASS] test_selfTransferKeepsBalance() (gas: 97481)\n[PASS] test_supplyIsOneBillionWith18Decimals() (gas: 19149)\n[PASS] test_tokenHasNoReceiveOrFallback() (gas: 79075)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 140138)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 145747)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 92936)\n[PASS] test_transferFromSpendsAllowance() (gas: 190744)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrease() (gas: 172557)\n[PASS] test_transferMovesExactAmount() (gas: 89408)\n[PASS] test_transferOfZeroSucceeds() (gas: 44583)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 33303)\n[PASS] test_transferRevertsWhenBalanceInsufficient() (gas: 92776)\n[PASS] test_transferToZeroAddressReverts() (gas: 35594)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 19.35ms (65.21ms CPU time)\n\nRan 2 test suites in 20.34ms (19.83ms CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":47,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WindowShopperToken.approve(address,uint256)\",\"WindowShopperToken.burn(uint256)\",\"WindowShopperToken.burnFrom(address,uint256)\",\"WindowShopperToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"WindowShopperToken.transfer(address,uint256)\",\"WindowShopperToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":130,\"foundry.toml\":25,\"remappings.txt\":2,\"script/DeployWindowShopperToken.s.sol\":23,\"src/WindowShopperToken.sol\":43,\"test/DeployWindowShopperToken.t.sol\":18,\"test/WindowShopperToken.t.sol\":489},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2111,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":556,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/WindowShopperToken.sol:28: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3001059d22ae8ca460ba9cd952812c2191cfcf190d475bc999037e92cdb4be72","verifiedTreeHash":"8d8c78c8c20aaa6323977f9a2ca2d78893d51975","verifierVersion":"0.1.0+ad64f8c4"},{"checks":[{"durationMs":6374,"exitCode":0,"name":"build","output":"Compiling 49 files with Solc 0.8.26\nSolc 0.8.26 finished in 5.67s\nCompiler run successful!\n","passed":true},{"durationMs":17328,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployWindowShopperToken.t.sol:DeployWindowShopperTokenTest\n[PASS] test_deployMintsSupplyToTheScriptAsDeployer() (gas: 2558499)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.92ms (2.19ms CPU time)\n\nRan 16 tests for test/WindowShopperTokenPermit.t.sol:WindowShopperTokenPermitTest\n[PASS] testFuzz_invalidVRejectsWithoutStateChanges(uint8) (runs: 1000, μ: 116507, ~: 116509)\n[PASS] testFuzz_permitCannotBeUsedWithTamperedFields(uint256,uint8) (runs: 1000, μ: 152309, ~: 153103)\n[PASS] testFuzz_permitFundsTransferAndBurnWithinOneAllowance(uint256,uint256,uint256) (runs: 1000, μ: 245261, ~: 247449)\nLogs:\n  Bound result 0\n  Bound result 0\n\n[PASS] test_chainChangeInvalidatesOldDomainAndAcceptsNewDomain() (gas: 299740)\n[PASS] test_domainMatchesTheClientEncodingAndDiscoveryFields() (gas: 20931)\n[PASS] test_futureNonceRejectsUntilThePreviousPermitIsUsed() (gas: 241576)\n[PASS] test_malleableHighSRejectsButCanonicalSignatureStillWorks() (gas: 194361)\n[PASS] test_maximumDeadlineAndAllowanceThenSignedRevocation() (gas: 300146)\n[PASS] test_noncesAndApprovalsAreIndependentAcrossOwnersAndSpenders() (gas: 304554)\n[PASS] test_permitExpiresOneSecondAfterDeadlineWithoutConsumingNonce() (gas: 180436)\n[PASS] test_permitIsValidAtTheExactDeadlineAndAnyRelayerMaySubmit() (gas: 120451)\n[PASS] test_permitToZeroSpenderRollsBackItsNonce() (gas: 204112)\n[PASS] test_replayCannotRestoreASpentOrRevokedApproval() (gas: 354918)\n[PASS] test_signatureIsBoundToItsTokenDeployment() (gas: 235196)\n[PASS] test_zeroOwnerCannotBeAuthorizedByAnEmptySignature() (gas: 130318)\n[PASS] test_zeroSignatureRejectsAndPreservesExistingApproval() (gas: 110929)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 150.88ms (416.51ms CPU time)\n\nRan 39 tests for test/WindowShopperToken.t.sol:WindowShopperTokenTest\n[PASS] testFuzz_allowanceBoundsTransferFrom(uint256,uint256) (runs: 256, μ: 163271, ~: 143628)\nLogs:\n  Bound result 7\n  Bound result 6567\n\n[PASS] testFuzz_burnOnlyShrinksSupply(uint256,uint256) (runs: 256, μ: 125897, ~: 126733)\nLogs:\n  Bound result 0\n  Bound result 0\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 100128, ~: 100408)\nLogs:\n  Bound result 7\n  Bound result 6567\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 92969, ~: 93341)\nLogs:\n  Bound result 23414506\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 60028)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 30862)\n[PASS] test_burnFromRevertsWithoutAllowance() (gas: 103236)\n[PASS] test_burnFromSpendsAllowance() (gas: 172951)\n[PASS] test_burnReducesBalanceAndSupply() (gas: 114147)\n[PASS] test_burnRevertsAboveBalance() (gas: 92342)\n[PASS] test_constructorEmitsMintEvents() (gas: 10917)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 17732)\n[PASS] test_deployerCannotBurnAHolderWithoutAllowance() (gas: 92975)\n[PASS] test_eachDeploymentMintsToItsOwnDeployer() (gas: 24166)\n[PASS] test_launchFlowsMoveExactAmounts() (gas: 140332)\n[PASS] test_metadata() (gas: 52890)\n[PASS] test_noCallIncreasesSupply() (gas: 657309)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 449336)\n[PASS] test_permitCannotBeReplayed() (gas: 130999)\n[PASS] test_permitRevertsForTamperedValue() (gas: 69385)\n[PASS] test_permitRevertsForWrongSigner() (gas: 73947)\n[PASS] test_permitRevertsWhenExpired() (gas: 43671)\n[PASS] test_permitSetsAllowanceAndBumpsNonce() (gas: 109376)\n[PASS] test_permitThenTransferFrom() (gas: 219611)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 2687977)\n[PASS] test_runtimeFitsEIP170() (gas: 5336)\n[PASS] test_selfTransferKeepsBalance() (gas: 97481)\n[PASS] test_supplyIsOneBillionWith18Decimals() (gas: 19149)\n[PASS] test_tokenHasNoReceiveOrFallback() (gas: 79075)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 140138)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 145747)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 92936)\n[PASS] test_transferFromSpendsAllowance() (gas: 190744)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrease() (gas: 172557)\n[PASS] test_transferMovesExactAmount() (gas: 89408)\n[PASS] test_transferOfZeroSucceeds() (gas: 44583)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 33303)\n[PASS] test_transferRevertsWhenBalanceInsufficient() (gas: 92776)\n[PASS] test_transferToZeroAddressReverts() (gas: 35594)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 156.20ms (508.84ms CPU time)\n\nRan 17 tests for test/WindowShopperTokenEdges.t.sol:WindowShopperTokenEdgesTest\n[PASS] testFuzz_allowanceBelongsToSpecificOwnerAndSpender(uint256) (runs: 1000, μ: 266215, ~: 265939)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_failedDelegatedOverdrawRollsBackAllowance(uint256,uint256,bool) (runs: 1000, μ: 202451, ~: 202368)\nLogs:\n  Bound result 826288825376905447468412251\n  Bound result 329601165181832985241873851630686240364214911982142694\n\n[PASS] testFuzz_failedZeroRecipientRestoresSpentAllowance(uint256,bool) (runs: 1000, μ: 189445, ~: 188618)\nLogs:\n  Bound result 189148926210992525868787453\n\n[PASS] testFuzz_insufficientAllowanceCannotBurnOrTransfer(uint256,uint256,bool) (runs: 1000, μ: 184510, ~: 183813)\nLogs:\n  Bound result 2043438992\n  Bound result 2043438995\n\n[PASS] testFuzz_splitAndSingleTransfersAreEquivalent(uint256,uint256) (runs: 1000, μ: 192395, ~: 193491)\nLogs:\n  Bound result 327099955345750\n  Bound result 21758766459638\n\n[PASS] testFuzz_transfersRoundTripWithoutFees(uint256,uint256) (runs: 1000, μ: 256242, ~: 256782)\nLogs:\n  Bound result 256\n  Bound result 135\n\n[PASS] test_approveReplacesAllowanceAndCanRevokeInfinity() (gas: 343300)\n[PASS] test_burningEntireSupplyLeavesAUsableZeroSupplyToken() (gas: 270243)\n[PASS] test_fullSupplyDelegatedBurnAndRepeatedBurnFailure() (gas: 216125)\n[PASS] test_infiniteBurnAllowanceSurvivesRepeatedBurnsAndTransfers() (gas: 277099)\n[PASS] test_maximumAmountsCannotWrapBalancesOrSupply() (gas: 263589)\n[PASS] test_ownerStillNeedsSelfAllowanceForDelegatedCalls() (gas: 308554)\n[PASS] test_selfTransferFromSpendsAllowanceWithoutChangingBalance() (gas: 185843)\n[PASS] test_transferFromAndBurnFromShareOneFiniteAllowance() (gas: 306857)\n[PASS] test_zeroOneAndFullSupplyTransfersRoundTrip() (gas: 388806)\n[PASS] test_zeroOperationsFromEmptyAccountEmitAndKeepState() (gas: 191543)\n[PASS] test_zeroValueDoesNotMakeZeroRecipientOrSpenderValid() (gas: 148677)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 156.30ms (831.70ms CPU time)\n\nRan 3 tests for test/WindowShopperTokenInvariant.t.sol:WindowShopperTokenInvariantTest\n[PASS]\nWindowShopperTokenInvariantTest invariants:\n[PASS] invariant_allowancesAndNoncesMatchAuthorizations\n[PASS] invariant_balancesMatchAuthorizedMovements\n[PASS] invariant_supplyEqualsBalancesAndInitialSupplyMinusBurns\n WindowShopperTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭---------------------------+-------------------------+-------+---------+----------╮\n| Contract                  | Selector                | Calls | Reverts | Discards |\n+==================================================================================+\n| WindowShopperTokenHandler | advanceTime             | 2768  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | approve                 | 2656  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | burn                    | 2721  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | burnFrom                | 2798  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | permit                  | 2751  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | rejectMint              | 2637  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | rejectOverdraw          | 2786  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | rejectPermit            | 2820  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | rejectZeroAddress       | 2730  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | revokeAndRejectSpending | 2703  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | transfer                | 2682  | 0       | 0        |\n|---------------------------+-------------------------+-------+---------+----------|\n| WindowShopperTokenHandler | transferFrom            | 2716  | 0       | 0        |\n╰---------------------------+-------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 96\n  Bound result 0\n  Bound result 130\n  Bound result 2155038236\n  Bound result 13\n  Bound result 222975163143345434187174931\n  Bound result 4689043615062119580735284\n  Bound result 0\n  Bound result 4114\n  Bound result 604\n  Bound result 11688\n  Bound result 12\n  Bound result 48879\n  Bound result 9\n  Bound result 115792089237316195423570985008687907853269984665640541703664342415466897550173\n  Bound result 3163\n  Bound result 880824791\n  Bound result 115792089237316195423570985008687907853269984665640541703664342432452984669330\n  Bound result 23\n  Bound result 12490\n  Bound result 10930\n  Bound result 86\n  Bound result 506505\n  Bound result 0\n  Bound result 0\n  Bound result 13\n  Bound result 258212\n  Bound result 639\n  Bound result 64199\n  Bound result 604797\n  Bound result 0\n  Bound result 3093743780\n  Bound result 127\n  Bound result 101083885672387626755299765\n  Bound result 64199\n  Bound result 49569\n  Bound result 58555008241579824023385015\n  Bound result 9\n  Bound result 1\n  Bound result 0\n  Bound result 244\n  Bound result 288973693\n  Bound result 11\n  Bound result 0\n  Bound result 0\n  Bound result 86\n  Bound result 0\n  Bound result 400960\n  Bound result 115792089237316195423570985008687907853269984665640309350413968945793548920229\n  Bound result 4\n  Bound result 0\n  Bound result 560550788316275808\n  Bound result 111668015\n  Bound result 13242855\n  Bound result 169\n  Bound result 28711\n  Bound result 7199\n  Bound result 0\n  Bound result 96\n  Bound result 1333\n  Bound result 18768568770377175803276920\n  Bound result 115792089237316195423570985008687907853269984665640473678352058526155430042410\n  Bound result 63679866052560538532595530\n  Bound result 1\n  Bound result 115792089237316195423570985008687907853269984665640309350413968950131515503355\n  Bound result 0\n  Bound result 0\n  Bound result 254\n  Bound result 13390\n  Bound result 2285\n  Bound result 22335793241592445351267455\n  Bound result 149913\n  Bound result 0\n  Bound result 0\n  Bound result 12206\n  Bound result 0\n  Bound result 30\n  Bound result 555653\n  Bound result 660\n  Bound result 96\n  Bound result 10000\n  Bound result 0\n  Bound result 27\n\n[PASS] test_handlerCanReachAndVerifyAnEmptySupply() (gas: 1205821)\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n\n[PASS] test_handlerExercisesSuccessfulAndRejectedActions() (gas: 1916159)\nLogs:\n  Bound result 11\n  Bound result 7\n  Bound result 3\n  Bound result 5\n  Bound result 86400\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 16.98s (16.96s CPU time)\n\nRan 5 test suites in 16.98s (17.44s CPU time): 76 tests passed, 0 failed, 0 skipped (76 total tests)\n","passed":true},{"durationMs":149,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WindowShopperToken.approve(address,uint256)\",\"WindowShopperToken.burn(uint256)\",\"WindowShopperToken.burnFrom(address,uint256)\",\"WindowShopperToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"WindowShopperToken.transfer(address,uint256)\",\"WindowShopperToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":130,\"foundry.toml\":25,\"remappings.txt\":2,\"script/DeployWindowShopperToken.s.sol\":23,\"src/WindowShopperToken.sol\":43,\"test/DeployWindowShopperToken.t.sol\":18,\"test/README.md\":61,\"test/WindowShopperToken.t.sol\":489,\"test/WindowShopperTokenEdges.t.sol\":305,\"test/WindowShopperTokenInvariant.t.sol\":121,\"test/WindowShopperTokenPermit.t.sol\":315,\"test/handlers/WindowShopperTokenHandler.sol\":255,\"test/helpers/WWWPermitData.sol\":39},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3a8f18076d54a5e6bbff9087fbea1116c8b509de6e8448a770defa4c613a9073","verifiedTreeHash":"0d6c7ddde7300480754d60f024b0f706c9b9ff7a","verifierVersion":"0.1.0+ad64f8c4"},{"checks":[{"durationMs":2168,"exitCode":0,"name":"build","output":"Compiling 44 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.92s\nCompiler run successful!\n","passed":true},{"durationMs":348,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployWindowShopperToken.t.sol:DeployWindowShopperTokenTest\n[PASS] test_deployMintsSupplyToTheScriptAsDeployer() (gas: 2558499)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 15.48ms (6.71ms CPU time)\n\nRan 39 tests for test/WindowShopperToken.t.sol:WindowShopperTokenTest\n[PASS] testFuzz_allowanceBoundsTransferFrom(uint256,uint256) (runs: 256, μ: 164600, ~: 185108)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 96\n\n[PASS] testFuzz_burnOnlyShrinksSupply(uint256,uint256) (runs: 256, μ: 126270, ~: 126733)\nLogs:\n  Bound result 64199\n  Bound result 6567\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 100323, ~: 100408)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 999999990000000000000000096\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 92897, ~: 93341)\nLogs:\n  Bound result 896996168291426942989355875\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 60028)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 30862)\n[PASS] test_burnFromRevertsWithoutAllowance() (gas: 103236)\n[PASS] test_burnFromSpendsAllowance() (gas: 172951)\n[PASS] test_burnReducesBalanceAndSupply() (gas: 114147)\n[PASS] test_burnRevertsAboveBalance() (gas: 92342)\n[PASS] test_constructorEmitsMintEvents() (gas: 10917)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 17732)\n[PASS] test_deployerCannotBurnAHolderWithoutAllowance() (gas: 92975)\n[PASS] test_eachDeploymentMintsToItsOwnDeployer() (gas: 24166)\n[PASS] test_launchFlowsMoveExactAmounts() (gas: 140332)\n[PASS] test_metadata() (gas: 52890)\n[PASS] test_noCallIncreasesSupply() (gas: 657309)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 449336)\n[PASS] test_permitCannotBeReplayed() (gas: 130999)\n[PASS] test_permitRevertsForTamperedValue() (gas: 69385)\n[PASS] test_permitRevertsForWrongSigner() (gas: 73947)\n[PASS] test_permitRevertsWhenExpired() (gas: 43671)\n[PASS] test_permitSetsAllowanceAndBumpsNonce() (gas: 109376)\n[PASS] test_permitThenTransferFrom() (gas: 219611)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 2687977)\n[PASS] test_runtimeFitsEIP170() (gas: 5336)\n[PASS] test_selfTransferKeepsBalance() (gas: 97481)\n[PASS] test_supplyIsOneBillionWith18Decimals() (gas: 19149)\n[PASS] test_tokenHasNoReceiveOrFallback() (gas: 79075)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 140138)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 145747)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 92936)\n[PASS] test_transferFromSpendsAllowance() (gas: 190744)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrease() (gas: 172557)\n[PASS] test_transferMovesExactAmount() (gas: 89408)\n[PASS] test_transferOfZeroSucceeds() (gas: 44583)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 33303)\n[PASS] test_transferRevertsWhenBalanceInsufficient() (gas: 92776)\n[PASS] test_transferToZeroAddressReverts() (gas: 35594)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 59.54ms (253.48ms CPU time)\n\nRan 2 test suites in 65.81ms (75.02ms CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":83,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WindowShopperToken.approve(address,uint256)\",\"WindowShopperToken.burn(uint256)\",\"WindowShopperToken.burnFrom(address,uint256)\",\"WindowShopperToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"WindowShopperToken.transfer(address,uint256)\",\"WindowShopperToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":130,\"foundry.toml\":25,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployWindowShopperToken.s.sol\":23,\"src/WindowShopperToken.sol\":43,\"test/DeployWindowShopperToken.t.sol\":18,\"test/WindowShopperToken.t.sol\":489},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"bff76f5fa6a9b6687cefde7863da6c52f986794dfedf83735a348a8ac79f5792","verifiedTreeHash":"4e14c9e7654a21e3e6e85f8fa8fedc5f0c634bdd","verifierVersion":"0.1.0+ad64f8c4"}]}