{"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":"a7e47ca8-87ae-4a71-b4be-08d4eb2c87ef","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"bd22ce54b3a6567455e83bd1aa9e03adf1ae12723a21425fc7ed64ee2f93ffbd","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":"1fcdd453c675ddbe1d5ec52a9734871edb33ad9b219f363537b4a44858147e01","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":"d924284529e4d7a5ed4197030c04ab2c112ad720e61b9d86b935d1506452b324","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":"91d0addd87fe9d330b84191bc0d95fab88c31196291218a3de1d7d585ba808b2","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":"6e2238c0d15d3035137749a019330a736224ce1a2ee7f13d97a6058237c4b24c","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":"bf8701007a4d063451adf67abf6c224a9095a507175e61dfdb608d20beadc6cf","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":"9143f37983f84c691c8fbeefd12e1c72d64feab0e980936edd4d3c69be07ff6e","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"52d64d0839aaf94d07d53c36efea16fb2f330c6e9ba3f320283107c614e65547","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: WindowShopper (WWW).\nToken name: WindowShopper\nToken symbol: WWW\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"de09f3dbe78be736bc979ddae7aecca060d9636ef1d5826e6c65b581deb499dd","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"a7e47ca8-87ae-4a71-b4be-08d4eb2c87ef","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2813-windowshopper"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52188","feedbackHash":"032b8adee7efa85a6c0778d56b88de07a7d7671ba703fe4e90d4679fbdad60a7","nodeKey":"audit_economics","submissionHash":"bd22ce54b3a6567455e83bd1aa9e03adf1ae12723a21425fc7ed64ee2f93ffbd","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52174","feedbackHash":"ddd8ce81ee786b5625510144b44c878c708213233afa6c8c574901d0d39beb38","nodeKey":"audit_flow","submissionHash":"1fcdd453c675ddbe1d5ec52a9734871edb33ad9b219f363537b4a44858147e01","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52615","feedbackHash":"9841bc48262428cf5593ae417827ee0282f0bbee941875a1dbed0235b0c3ac5b","nodeKey":"audit_judge","submissionHash":"d924284529e4d7a5ed4197030c04ab2c112ad720e61b9d86b935d1506452b324","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51374","feedbackHash":"e9ca87147fb158e5a73991fa56f13cc8917e495829bb2473d172d1980259a9ba","nodeKey":"audit_math","submissionHash":"91d0addd87fe9d330b84191bc0d95fab88c31196291218a3de1d7d585ba808b2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52480","feedbackHash":"c93e0c9e5dbd84e81f329931f1bb4d300b88ff80a77b7b0b2414ca68c8197d30","nodeKey":"audit_permissions","submissionHash":"6e2238c0d15d3035137749a019330a736224ce1a2ee7f13d97a6058237c4b24c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52279","feedbackHash":"0d4c0481ae6690f36877ecff3a0005da785a25fa4a0e81133c27c12a10d19175","nodeKey":"build_contract_project","submissionHash":"bf8701007a4d063451adf67abf6c224a9095a507175e61dfdb608d20beadc6cf","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51475","feedbackHash":"e3c5e1da8dd9bc3dc1626a7527561665e8f222cfe295a66b74dadab70482939d","nodeKey":"manifest","submissionHash":"9143f37983f84c691c8fbeefd12e1c72d64feab0e980936edd4d3c69be07ff6e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52482","feedbackHash":"a8da2de29ac6797019afac439a146484e11a75f0530f9fa03b3b863a7ff73b45","nodeKey":"write_foundry_tests","submissionHash":"52d64d0839aaf94d07d53c36efea16fb2f330c6e9ba3f320283107c614e65547","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"36e8e024dd78106f4215fddc8d8d101f47e93aa96e75d260f628c5e1407cb17d","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b4f6137e7c93a2b3","findings":[{"citation":"resolved","description":"Periphery/provenance. DEPENDENCIES.md states that the vendored library sources are unmodified and that `sha256sum -c DEPENDENCIES.sha256` verifies them; README.md:69-71 reports that local validation passed. On the committed tree, six forge-std files (lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol) no longer match the hashes recorded in DEPENDENCIES.sha256 (lines 5, 10, 14, 17, 18 and the IMulticall3 entry). The recorded hashes are exactly the upstream forge-std v1.9.6 hashes (verified by fetching the files from the v1.9.6 tag and hashing them), so the hashes were taken from pristine copies and the on-disk files were changed afterwards. A diff against upstream shows only line-wrapping changes consistent with a `forge fmt` run under the project's 120-column setting (multi-line function signatures collapsed to one line, the console.sol assembly block reflowed); no semantic change was found. The production dependency is intact: all five vendored OpenZeppelin v5.1.0 files are byte-identical to upstream. Impact is limited to the integrity check the project ships for reviewers and operators: anyone following DEPENDENCIES.md gets a failure and cannot distinguish a benign reformat from a tampered test library without re-deriving the diff themselves. forge-std is test-only, so the deployed token bytecode is unaffected. Fix: either restore the six files to their upstream v1.9.6 bytes (so the recorded hashes and the 'unmodified' statement are true again) and exclude lib/ from `forge fmt` (for example `ignore = [\"lib/**\"]` under [fmt] in foundry.toml, which is the config owner's change), or regenerate DEPENDENCIES.sha256 from the tree as committed and amend DEPENDENCIES.md to say the forge-std files are upstream v1.9.6 reformatted by forge fmt. The first option keeps the stronger guarantee.","line":15,"path":"DEPENDENCIES.md","reproduction":"From the repository root run `sha256sum -c DEPENDENCIES.sha256`. Expected (per DEPENDENCIES.md:17-18 and README.md:69-71): every line reports OK and the command exits 0. Actual: six lines report FAILED (lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol), sha256sum prints 'WARNING: 6 computed checksums did NOT match' and exits 1. Confirming the cause: `sha256sum lib/forge-std/src/StdAssertions.sol` gives 3fbf4a025b4fc94eaca4c38c1f3dacb37bee10f12ee81994cfaf365ac1ce7384 while DEPENDENCIES.sha256 line 5 records d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780, which is the hash of the upstream v1.9.6 file; `diff <(curl -s https://raw.githubusercontent.com/foundry-rs/forge-std/v1.9.6/src/StdAssertions.sol) lib/forge-std/src/StdAssertions.sol` shows only the signature of assertApproxEqAbs(uint256,uint256,uint256,string) collapsed from five lines to one. The same holds for the other five files. All OpenZeppelin files under lib/openzeppelin-contracts pass the check and are byte-identical to the v5.1.0 tag.","severity":"low","snippet":"Solidity files under `src/` and both licenses. The source files are unmodified.","title":"Vendored forge-std files were reformatted after their checksums were recorded, so the documented provenance check fails and the 'unmodified' claim is false"}],"hash":"1fcdd453c675ddbe1d5ec52a9734871edb33ad9b219f363537b4a44858147e01","nodeId":"1a1bfacc-2f33-4d5c-b781-b72eb1794f2a","outcome":"completed","summary":"Review complete. The findings file is written at the repository root and the working tree is otherwise untouched.\n\n**Outcome.** The WindowShopper token has no control-flow defect. It is the OpenZeppelin v5.1.0 ERC20 with a single constructor mint of 10^27 base units to msg.sender, no constructor arguments, no owner, no hooks, no external calls and no receive or fallback. I found one low-severity provenance defect in the vendored test library.\n\n**What I checked in my area.**\n- Execution Trace: traced approve, transfer and transferFrom through the OZ base to final state, including the zero-address, insufficient-balance, insufficient-allowance, max-allowance, self-transfer and zero-value paths. Every failure path reverts with full rollback and every success path moves exactly the requested amount.\n- Periphery: all five vendored OpenZeppelin files are byte-identical to the upstream v5.1.0 tag. Context returns plain msg.sender, so there is no forwarder path.\n- First Principles: the only assumption is that the deploying caller is the factory, which launchCustom guarantees. The supply cannot grow afterwards because `_mint` is internal and unreachable. The compiled ABI exposes nothing beyond ERC-20 plus a view constant, and a reachability scan of the runtime and creation bytecode found no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- The project suite passes with the README's seed. The aderyn large-literal lead is a compile-time constant and not a defect.\n\n**The one finding (low).** Six forge-std files were reformatted after their checksums were recorded, so the check DEPENDENCIES.md prescribes fails and its \"unmodified\" statement is false. The reproduction is this command from the repository root:\n\n```\nsha256sum -c DEPENDENCIES.sha256\n```\n\nIt reports six FAILED lines and exits 1. The recorded hashes are the upstream v1.9.6 hashes, and the diff against upstream is line wrapping only, so test behaviour and the token bytecode are unaffected. The suggested fix is to restore the upstream bytes and keep lib/ out of the formatter, or regenerate the checksum file and amend the claim.\n\n**Coverage.** All three listed entry points are marked holds, with additional rows for the constructor, the ABI surface, the bytecode and decimals invariants, the two vendored libraries, the static-analysis lead and the protected floor's expectations. The protected floor test itself needs the verifier's Uniswap v4 harness, which is not vendored here, so it was read and reasoned against rather than run.","treeHash":null,"usage":{"cachedInputTokens":558706,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":13905,"runtime":"claude","turns":24,"wallClockMs":180817}},{"artifacts":[],"attempt":1,"bundleHash":"fa4ea9daf53500925edb531ef1c5fde5b1d8bc5c6fea0019ee9145398709326f","device":"e8e860c7f2306473","findings":[],"hash":"52d64d0839aaf94d07d53c36efea16fb2f330c6e9ba3f320283107c614e65547","nodeId":"df628beb-fa49-4334-9f76-53281c444c73","outcome":"completed","summary":"I found no defects in WindowShopper (WWW), so there is no `.imd-findings.json`. With the verifier's fuzz seed, `forge build` succeeds and `forge test` passes 53 tests: the 36 already in the repository plus 17 new ones.\n\nThe token itself is just OpenZeppelin's ERC-20 (version 5.1.0, vendored in `lib/`) with the name, symbol and a one-time mint of 10^27 base units (1 billion tokens) to the deployer. There is no owner, fee, pause, mint or burn function that anyone can call. The tests I added found nothing to report.\n\nI left the earlier tests unchanged and added one file, `test/WindowShopper.adversarial.t.sol`. It isn't committed.\n\n**Launch checks, mirroring the protected launch tests:**\n- **Fuzzed launch in one call:** a helper deploys the token at a fixed address and splits the supply in the same call: 10% to the distributor, 0–90% to the pool, the rest to the requester. Every share arrives exactly, nothing is left with the factory, and claims out of the distributor arrive exactly down to the last wei.\n- **Same address, no re-mint:** the token lands at the predicted address, and a second deploy with the same salt reverts.\n- **Bytecode scan:** the deployed code contains no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT, and is under the 24,576-byte size limit.\n- **Admin calls:** 22 common admin-style calls (mint, pause, blocklist, freeze, burnFrom, setFee, increaseAllowance, …) fail whether the deployer or a holder sends them. The deployer has no hidden allowance over holders, and holders can still transfer afterwards.\n\n**Failure paths and edge cases:**\n- A fuzz test confirms any function the token doesn't declare reverts and changes nothing, whoever calls it. A call with no data also reverts.\n- `transferFrom` with the zero address as the owner reverts even for 0 tokens.\n- Spending an allowance emits only a `Transfer` event, with no `Approval`.\n- An unlimited allowance still can't move more than the owner holds.\n- Also covered: approving yourself as spender, a 1-wei transfer and an overdraft by 1 wei, and tokens sent to the token's own address.\n- Fuzz tests cover transfers between any two addresses, overdrafts returning the exact error, and unlimited allowances never going down.\n\n**Invariant tests** (256 runs of 64 random calls each):\n- A handler makes 10 kinds of call. Valid transfers, approvals and `transferFrom` go to a growing set of fuzzed addresses. Invalid ones are mixed in: overdrafts, overspent allowances, transfers to the zero address, approving the zero address, and mint/burn attempts. Every invalid call must revert with the exact expected error and change nothing.\n- After every call the tests check four things: total supply never changes, the tracked holders together hold all of it, every balance and allowance matches the handler's own record, and no balance exceeds the supply.\n- All 10 kinds of call ran about 1,600 times each.\n\nThe run counts are set inside the test file, since `foundry.toml` isn't mine to change.","treeHash":"24f74a7cb8dbd94cbf6e700cf4a51b92809aef08","usage":{"cachedInputTokens":402743,"inputTokens":20,"model":"claude-opus-5-5","outputTokens":16827,"runtime":"claude","turns":10,"wallClockMs":214372}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b0b4e7bbc84f9d80","findings":[{"citation":"resolved","description":"DEPENDENCIES.md (lines 15 and 17-18) and README.md (lines 107-108, 'Neither library is modified') tell the reviewer and the launch operator to verify the vendored tree with `sha256sum -c DEPENDENCIES.sha256`. Running that command from the project root fails: 6 of 32 recorded checksums do not match. The six files are lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol and interfaces/IMulticall3.sol. The recorded digests are those of the upstream forge-std v1.9.6 files (confirmed by fetching the raw upstream files: e.g. StdAssertions.sol upstream d4c89eec..., recorded d4c89eec..., local 3fbf4a02...). The local copies differ from upstream only by `forge fmt` line-joining (multi-line function signatures collapsed to one 120-column line), so the files were reformatted after the digests were recorded and the 'unmodified' statement is no longer true. All five OpenZeppelin production files match upstream v5.1.0 byte for byte, so the compiled token is unaffected; forge-std is test-only. Impact is limited to provenance: the one verification step the project documents reports failure, which an operator must either investigate by hand or ignore, and ignoring a failed integrity check is the habit this record exists to prevent. Fix: either restore the six files to their upstream bytes (and exclude lib/ from forge fmt) or regenerate DEPENDENCIES.sha256 from the tree as shipped and drop the 'unmodified' claim for forge-std. Outside the assigned permissions area; reported because it is concrete and reproducible.","line":15,"path":"DEPENDENCIES.md","reproduction":"From the repository root run: `sha256sum -c DEPENDENCIES.sha256`. Expected (per DEPENDENCIES.md:17-18 and README.md:107-108): every line OK, exit 0. Actual: 26 OK, 6 FAILED (lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol), 'WARNING: 6 computed checksums did NOT match', exit status 1. `diff <(curl -sL https://raw.githubusercontent.com/foundry-rs/forge-std/v1.9.6/src/StdAssertions.sol) lib/forge-std/src/StdAssertions.sol` shows whitespace-only differences (joined signature lines), confirming the recorded digest is upstream's and the tree's copy was reformatted.","severity":"low","snippet":"Solidity files under `src/` and both licenses. The source files are unmodified.","title":"Documented dependency integrity check fails: six vendored forge-std files do not match DEPENDENCIES.sha256"}],"hash":"6e2238c0d15d3035137749a019330a736224ce1a2ee7f13d97a6058237c4b24c","nodeId":"5712de3b-9876-46a6-bd1f-365ae123945d","outcome":"completed","summary":"The review is complete and the findings file is written. Nothing in the tree was changed apart from the ignored build cache and the findings file itself.\n\n**Result: the permission model holds.** WindowShopper is an unmodified OpenZeppelin v5.1.0 ERC-20 with a parameterless constructor that mints the full supply to the deploying caller once. There are no roles, no initializer, no hooks, no fallback, and no code path that writes total supply after deployment. I traced all three state-changing entry points through the vendored library and found no access gap, trust seam, or paired-function asymmetry.\n\nWhat I verified, in my area and around it:\n\n- **Access Control:** approve writes only the caller's own allowance, transfer moves only the caller's balance, and transferFrom checks the from-to-caller allowance before moving anything. The factory, deployer EOA and strangers cannot pull a holder's tokens without approval. Twenty-two admin selectors from the protected floor all revert from both deployer and stranger.\n- **Trust Gap:** no privileged actor exists, so no admin action can create asymmetry between holders. The factory simply holds the supply it minted, which is the launch design.\n- **Asymmetry:** approve and transferFrom mirror correctly, max allowance is not decremented, failed transferFrom paths revert atomically so allowance is never consumed on failure. Zero-value transferFrom by a stranger succeeds and emits a zero Transfer event, which is standard ERC-20 behaviour and documented in the README.\n- **Launch floor:** supply constant equals exactly ten to the twenty-seventh, decimals are eighteen, CREATE2 deployment from a factory leaves the whole supply with the factory, and the runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT. I replicated the protected floor's opcode scan in a scratch test and it passed.\n\n**One low finding, outside my area but reproducible.** The documented integrity check fails. Running `sha256sum -c DEPENDENCIES.sha256` reports six forge-std files as mismatched. The recorded digests are upstream v1.9.6's, but the local copies were reformatted by forge fmt after the digests were taken. The five OpenZeppelin production files match upstream byte for byte, so the compiled token is unaffected. The fix is to restore the six test-only files or regenerate the checksum file and drop the \"unmodified\" claim.\n\nNot reached: the protected harness's live seed and swap path needs v4-core and the verifier's environment, so I could not execute it locally. Since the token has no fee, burn or hook, every transfer delivers the exact amount, which is what that path depends on.","treeHash":null,"usage":{"cachedInputTokens":602879,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14440,"runtime":"claude","turns":29,"wallClockMs":214806}},{"artifacts":[],"attempt":1,"bundleHash":"fb8381dd7e518234b34993c50508acbe46a6c11789503cae3cb4c196deb051bc","device":"4d218e2d11a36af4","findings":[],"hash":"9143f37983f84c691c8fbeefd12e1c72d64feab0e980936edd4d3c69be07ff6e","nodeId":"55f451e3-4bc6-4434-97b0-32b49d0f81b4","outcome":"completed","summary":"Created `launch.json` matching WindowShopper’s constructor, supply, and required pool/economics values. Only the manifest changed.\n\nValidation passed: manifest fields and compiled ABI match; `forge build` succeeded; all 36 tests passed with the supplied fuzz seed.","treeHash":"ebb09ad106e6c5d6fbfafb64efc8d034bbf2b30d","usage":{"cachedInputTokens":193280,"inputTokens":35863,"model":"gpt-6-astra","outputTokens":2489,"runtime":"codex","turns":3,"wallClockMs":54196}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"13603a08ada71730","findings":[],"hash":"91d0addd87fe9d330b84191bc0d95fab88c31196291218a3de1d7d585ba808b2","nodeId":"12d44de2-38de-4204-9e7b-45e5c10bc49d","outcome":"completed","summary":"I found no math defects in WindowShopper (WWW), so `.imd-findings.json` has an empty findings list plus a coverage row for each of the three entry points and one for the supply invariant. I changed no project files.\n\n**What the code is:** `src/WindowShopper.sol` is a plain OpenZeppelin v5 ERC20. Its only addition is a constant, `INITIAL_SUPPLY = 1_000_000_000 * 10 ** 18`, which the constructor mints once to `msg.sender`. There is no fee, burn, tax, rounding, narrowing cast or custom arithmetic.\n\n**What I checked, using the Math Precision, Boundary and Numerical Gap guides:**\n- **Supply constant:** it is computed exactly at compile time as 10^27 (1e27), far below 2^256. `decimals()` returns 18, so the supply is exactly 1 billion WWW.\n- **`transfer` and `transferFrom`:** a transfer reverts if the amount is more than the sender's balance, before any subtraction happens. The unchecked addition to the recipient can't overflow because no balance can exceed the total supply. Sending zero, sending your whole balance and sending to yourself each move exactly the amount asked.\n- **Allowances:** `transferFrom` reverts if the allowance is too small, before reducing it. An allowance of `type(uint256).max` is never reduced, which is the standard \"unlimited\" behaviour, not a bug.\n- **`approve`:** it reverts for the zero address as owner or spender, stores the value exactly, and does no arithmetic.\n- **Supply can't change:** nothing after the constructor can mint or burn, so the total supply stays at 1e27.\n- **Launch flows:** the factory's transfers, the distributor's claims and pool swaps all move exact amounts, since nothing is taken on transfer.\n\n**Static analysis lead:** aderyn flagged a large numeric literal at `src/WindowShopper.sol:10`. It's a style note: the number is written with digit separators and is exactly right, so I didn't report it.\n\n**Tests:** `forge test` passes all 36 tests, including the invariant suite (8,192 calls, no reverts). I didn't write any new tests.\n\n**Not covered:** I didn't go through the other nine specialty guides in depth because they belong to the other reviewers. In passing I saw no owner, pause, blacklist or mint function.","treeHash":null,"usage":{"cachedInputTokens":144046,"inputTokens":10,"model":"claude-opus-5-5","outputTokens":2384,"runtime":"claude","turns":5,"wallClockMs":36810}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d4b53d656a3fbe07","findings":[{"citation":"resolved","description":"DEPENDENCIES.md (lines 15-18) states the vendored source files are unmodified and tells the reader to verify them with `sha256sum -c DEPENDENCIES.sha256`; README.md line 108 repeats that neither library is modified. Running that command on the delivered tree fails for six forge-std files: StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol and interfaces/IMulticall3.sol. Diffing those files against upstream forge-std v1.9.6 shows whitespace-only reformatting (long signatures re-joined onto one line, consistent with `forge fmt` at line_length 120 having been run over lib/), so there is no semantic change and no effect on the production token. All five vendored OpenZeppelin v5.1.0 files were independently diffed against the upstream tag and are byte-identical, and their checksums pass. Outside the economics area; reported because the documented integrity check is the reader's only stated way to confirm provenance and it does not hold as delivered. Fix: either regenerate DEPENDENCIES.sha256 from the tree as shipped and state that lib/forge-std was reformatted, or restore the six files from the v1.9.6 tag so the recorded checksums match.","line":5,"path":"DEPENDENCIES.sha256","reproduction":"From the repository root run `sha256sum -c DEPENDENCIES.sha256`. Expected (per DEPENDENCIES.md): every line reports OK. Actual: `lib/forge-std/src/StdAssertions.sol: FAILED`, `lib/forge-std/src/StdJson.sol: FAILED`, `lib/forge-std/src/StdToml.sol: FAILED`, `lib/forge-std/src/Vm.sol: FAILED`, `lib/forge-std/src/console.sol: FAILED`, `lib/forge-std/src/interfaces/IMulticall3.sol: FAILED`, exit status 1. `sha256sum lib/forge-std/src/StdAssertions.sol` prints 3fbf4a025b4fc94e... rather than the recorded d4c89eec70d267de.... `diff <(curl -sL https://raw.githubusercontent.com/foundry-rs/forge-std/v1.9.6/src/StdAssertions.sol) lib/forge-std/src/StdAssertions.sol` shows 48 lines of whitespace-only differences.","severity":"info","snippet":"d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780  lib/forge-std/src/StdAssertions.sol","title":"DEPENDENCIES.sha256 does not match six vendored forge-std files, so the documented provenance check fails"}],"hash":"bd22ce54b3a6567455e83bd1aa9e03adf1ae12723a21425fc7ed64ee2f93ffbd","nodeId":"6e556231-e039-4214-bda2-d6bae3352fe3","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with one informational finding and nine coverage rows. The working tree is clean apart from that findings file.\n\n**Outcome for the economics area: no defects.** The token is a 15-line wrapper over an unmodified OpenZeppelin v5.1.0 ERC-20 that mints the full supply once to the deployer. I checked it against every failure mode in the Economic Security, Invariant and Flow Gap guides and all three entry points hold.\n\n- **Economic Security.** The token makes no external calls, so no dependency can block a claim or seed. There is no fee, burn, blacklist, pause, hook or owner, so no flow arrives short and no privileged hand can move or freeze a balance. Transfers and approvals to the zero address revert. Tokens sent to the contract's own address are stranded, but only by the sender's own action, which the README documents.\n- **Invariant.** Only the constructor writes total supply. Probing mint and issue selectors from an outsider and from the factory fails. The project's stateful suite and my own flow model both conserve the sum of balances at exactly one billion tokens.\n- **Flow Gap.** I modeled the launch as the protected test performs it: factory mint, ten percent to the distributor, claim out of the distributor, seed to the pool manager, remainder forwarded, then a buy and a sell through allowance. Every amount arrived exactly.\n\n**One informational finding, outside my area.** The README and DEPENDENCIES.md tell the reader to verify vendored files with `sha256sum -c DEPENDENCIES.sha256`, and that command fails on six forge-std files. The differences are whitespace-only reformatting of test-only code, and all five OpenZeppelin production files are byte-identical to the upstream tag. The fix is to regenerate the checksum file or restore the six files.\n\n**Verification run.** The full project suite passed with the README's fuzz seed, and my four scratch tests passed before I removed them. Static analysis leads were checked: the aderyn large-literal note is the correct supply constant, not a defect. Not run: the protected harness, which needs the verifier's environment, and Slither or Mythril.","treeHash":null,"usage":{"cachedInputTokens":515160,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":13606,"runtime":"claude","turns":25,"wallClockMs":199500}},{"artifacts":[],"attempt":1,"bundleHash":"20e3c4ee89cc30caa20e0f6ac826713798cd5efd5f8902e67f81ed299a8a5f62","device":"fb0c125072325b07","findings":[],"hash":"bf8701007a4d063451adf67abf6c224a9095a507175e61dfdb608d20beadc6cf","nodeId":"cd27939f-24aa-48d1-9fac-72387cd67dd8","outcome":"completed","summary":"Implemented WindowShopper (WWW) with 18 decimals and 1,000,000,000 tokens minted once to the deployer. No later minting or administrative powers.\n\nValidation passed: `forge build`, seeded `forge test`, `forge fmt --check`, and a fresh offline build. Tests include 35 unit/fuzz tests and three stateful invariants.\n\nDependencies are vendored. Deployment parameters, assumptions, and operational responsibilities are documented in [README.md](/home/imd7/.identitymd/work/a7e47ca8-87ae-4a71-b4be-08d4eb2c87ef/cd27939f-24aa-48d1-9fac-72387cd67dd8/README.md).","treeHash":"c81f00fff5cc54a809047ec888b4150cd6fc3031","usage":{"cachedInputTokens":483305,"inputTokens":54223,"model":"gpt-6.1-sol","outputTokens":14406,"runtime":"codex","turns":5,"wallClockMs":149081}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b8fd8054ea57c5d8","findings":[{"citation":"resolved","description":"This merges three duplicate specialist findings that share one root cause: audit_flow (low), audit_economics (info) and audit_permissions (low). DEPENDENCIES.md:15-18 says the vendored sources are unmodified and tells readers to check them with `sha256sum -c DEPENDENCIES.sha256`. README.md:108 says 'Neither library is modified.' Six forge-std files do not match their recorded digests: lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol and interfaces/IMulticall3.sol. The recorded digests are the upstream forge-std v1.9.6 digests. The files on disk differ from upstream by whitespace only, the line-joining a `forge fmt` run at line_length 120 produces. Every OpenZeppelin v5.1.0 file passes the check, and ERC20.sol is byte-identical to the upstream tag (be0df7e4...). The deployed token is therefore unaffected, and forge-std is used only by tests. The harm is to provenance: the one integrity check the project documents fails, and a reader cannot tell a benign reformat from tampering without diffing each file by hand. Severity is low because no funds and no deployed behaviour are affected. Fix: restore the six files from the forge-std v1.9.6 tag and keep `forge fmt` away from lib/. Or regenerate DEPENDENCIES.sha256 from the shipped tree and correct the 'unmodified' statements in DEPENDENCIES.md:15 and README.md:108.","line":15,"path":"DEPENDENCIES.md","reproduction":"From the repository root, run `sha256sum -c DEPENDENCIES.sha256`. Expected, per DEPENDENCIES.md:17-18: every line OK, exit 0. Actual: 26 OK and 6 FAILED (lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol). The output ends with 'sha256sum: WARNING: 6 computed checksums did NOT match' and the exit status is 1. To confirm the cause, run `curl -sL https://raw.githubusercontent.com/foundry-rs/forge-std/v1.9.6/src/StdAssertions.sol | sha256sum`. It prints d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780, the digest recorded at DEPENDENCIES.sha256:5, while the local file hashes differently. A plain diff against upstream shows 48 changed lines in StdAssertions.sol, 14 in StdJson.sol, 14 in StdToml.sol, 72 in Vm.sol, 28 in console.sol and 7 in IMulticall3.sol. Diffing again with all whitespace stripped shows 0 lines for all six, so the changes are formatting only.","severity":"low","snippet":"Solidity files under `src/` and both licenses. The source files are unmodified.","title":"Documented dependency integrity check fails: six vendored forge-std files were reformatted after their checksums were recorded, so DEPENDENCIES.md's 'unmodified' claim is false"}],"hash":"d924284529e4d7a5ed4197030c04ab2c112ad720e61b9d86b935d1506452b324","nodeId":"1c41d0d1-b2ea-4b3a-a8d2-d9c394d8d58d","outcome":"completed","summary":"I found one problem, and it is low severity: the documented check on the bundled libraries fails. The token code itself has no defects, and the results are in `.imd-findings.json`.\n\n**The kept finding: `DEPENDENCIES.md:15`.** All three specialists who reported something (flow, economics and permissions) reported this same problem, so I merged their reports into one. It fails like this:\n- Running `sha256sum -c DEPENDENCIES.sha256` gives 26 OK and 6 FAILED, and exits with status 1.\n- The six failing files are all from forge-std: `StdAssertions.sol`, `StdJson.sol`, `StdToml.sol`, `Vm.sol`, `console.sol` and `interfaces/IMulticall3.sol`.\n- I downloaded the upstream forge-std v1.9.6 copies. The hashes recorded in the checksum file are upstream's hashes. The local copies differ from upstream only in whitespace, which looks like a `forge fmt` run over `lib/`.\n- So the statements that the libraries are \"unmodified\" (`DEPENDENCIES.md:15` and `README.md:108`) are false.\n\nNothing that gets deployed is affected: forge-std is only used by tests, and the OpenZeppelin `ERC20.sol` is byte-identical to the v5.1.0 release. I rated it low, not high or critical, so it carries no failing test.\n\n**The three entry points all hold:**\n- `approve`, `transfer` and `transferFrom` are the standard OpenZeppelin v5.1.0 ERC20 functions, with nothing overridden.\n- Transfers move exactly the amount asked, with no fee or burn, so the factory, distributor and pool transfers arrive in full.\n- There is no owner, mint function, pause, blacklist, `DELEGATECALL` or `SELFDESTRUCT`.\n- The constructor mints 1,000,000,000 × 10¹⁸ once to the deployer, which matches `totalSupply` and `decimals: 18` in `launch.json`.\n- The constructor takes no arguments, matching `constructorArgs: []`, and the deployed code is 1,752 bytes, well under the 24,576-byte limit.\n\n**Other checks:**\n- `forge build` succeeds and `forge test` passes all 53 tests.\n- I dropped the Aderyn \"large numeric literal\" warning: `1_000_000_000 * 10 ** 18` is written clearly and is correct.\n- I could not check that the economics in `launch.json` match the job's, because the job's figures weren't given to me.\n\nI changed no repository files; the only file I wrote is `.imd-findings.json`, which git ignores.","treeHash":null,"usage":{"cachedInputTokens":182707,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":4584,"runtime":"claude","turns":6,"wallClockMs":75835}}],"verification":[{"checks":[{"durationMs":2470,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.35s\nCompiler run successful!\n","passed":true},{"durationMs":13037,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 35 tests for test/WindowShopper.t.sol:WindowShopperTest\n[PASS] testFuzz_approvalReplacementUsesLatestValue(uint256,uint256) (runs: 1024, μ: 114454, ~: 114509)\n[PASS] testFuzz_selfTransferPreservesSupply(uint256) (runs: 1024, μ: 55142, ~: 54872)\nLogs:\n  Bound result 26409\n\n[PASS] testFuzz_transferAboveSupplyAlwaysReverts(uint256) (runs: 1024, μ: 69212, ~: 69545)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129640036\n\n[PASS] testFuzz_transferConservesSupply(uint256,address) (runs: 1024, μ: 111034, ~: 111300)\nLogs:\n  Bound result 202\n\n[PASS] testFuzz_transferFromAboveAllowanceAlwaysReverts(uint256,uint256) (runs: 1024, μ: 123086, ~: 123511)\nLogs:\n  Bound result 398987864122030567235346602\n  Bound result 484543158680824161441416765\n\n[PASS] testFuzz_transferFromConsumesOnlyFiniteAllowance(uint256,uint256) (runs: 1024, μ: 164964, ~: 165610)\nLogs:\n  Bound result 139644300\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007912989995888\n\n[PASS] test_allowancesBelongToApprovingAccount() (gas: 142171)\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 163673)\n[PASS] test_approveEmitsEventWithoutMovingTokens() (gas: 99031)\n[PASS] test_approveZeroSpenderReverts() (gas: 37618)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9664)\n[PASS] test_contractDeployerReceivesSupplyInsteadOfTransactionOrigin() (gas: 336797)\n[PASS] test_create2FactoryCanDistributeSupplyWithoutFees() (gas: 596675)\n[PASS] test_deployerCannotTransferFromHolderWithoutApproval() (gas: 157849)\n[PASS] test_directEtherPaymentReverts() (gas: 40127)\n[PASS] test_emptyAccountCannotTransferOtherHoldersTokens() (gas: 57317)\n[PASS] test_maximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 214348)\n[PASS] test_maximumTransferAmountRevertsInsteadOfOverflowing() (gas: 42378)\n[PASS] test_metadataAndSupply() (gas: 107648)\n[PASS] test_noMintBurnPauseSeizureOrUpgradeEntryPoints() (gas: 850183)\n[PASS] test_selfTransferDoesNotChangeBalance() (gas: 51508)\n[PASS] test_transferAboveBalanceRevertsAndPreservesBalances() (gas: 54991)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 93606)\n[PASS] test_transferEntireSupplyAndBack() (gas: 134555)\n[PASS] test_transferFromAboveAllowancePreservesState() (gas: 115676)\n[PASS] test_transferFromAboveBalanceRollsBackAllowance() (gas: 178443)\n[PASS] test_transferFromCanSpendAllowanceExactlyOnce() (gas: 161664)\n[PASS] test_transferFromEmitsEventAndDecreasesAllowance() (gas: 160051)\n[PASS] test_transferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103271)\n[PASS] test_transferFromToZeroRollsBackAllowance() (gas: 114122)\n[PASS] test_transferToZeroRevertsAndPreservesBalances() (gas: 58109)\n[PASS] test_unapprovedSpenderCannotMoveFunds() (gas: 119729)\n[PASS] test_zeroAmountTransferToZeroStillReverts() (gas: 30457)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73345)\n[PASS] test_zeroTransferFromWithoutApprovalSucceeds() (gas: 81424)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 83.77ms (498.78ms CPU time)\n\nRan 16 tests for test/WindowShopper.adversarial.t.sol:WindowShopperAdversarialTest\n[PASS] testFuzz_arbitraryHoldersTransferExactly(address,address,uint256,uint256) (runs: 1000, μ: 161042, ~: 162306)\nLogs:\n  Bound result 9148849784441146602313\n  Bound result 2\n\n[PASS] testFuzz_infiniteAllowanceNeverDecreases(uint256,uint256) (runs: 1000, μ: 195725, ~: 196544)\nLogs:\n  Bound result 964971546627409515781704999\n  Bound result 31648653244535263921338847\n\n[PASS] testFuzz_oneCallLaunchFlowsArriveWhole(bytes32,uint256) (runs: 256, μ: 807951, ~: 809039)\nLogs:\n  Bound result 7757\n\n[PASS] testFuzz_overdraftAlwaysRevertsWithExactError(uint256,uint256) (runs: 1000, μ: 116697, ~: 116813)\nLogs:\n  Bound result 990015828341491009508597191\n  Bound result 201094821492354096327378922448949786905016\n\n[PASS] testFuzz_unknownSelectorsRevertAndChangeNothing(bytes4,bytes,address) (runs: 1000, μ: 48115, ~: 47843)\n[PASS] test_create2AddressIsDeterministicAndSaltCannotBeReused() (gas: 723396)\n[PASS] test_emptyCalldataWithoutValueReverts() (gas: 29025)\n[PASS] test_maxAllowanceStillBoundedByBalance() (gas: 162859)\n[PASS] test_oneWeiTransferAndBack() (gas: 153699)\n[PASS] test_privilegedCallsFromDeployerNeitherMintNorFreeze() (gas: 1216299)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2473682)\n[PASS] test_selfApprovalIsAnOrdinaryAllowance() (gas: 149290)\n[PASS] test_spendingAllowanceEmitsOnlyTransfer() (gas: 127045)\n[PASS] test_tokensSentToTokenAddressAreStuckButCounted() (gas: 76070)\n[PASS] test_transferFromZeroOwnerRevertsEvenForZeroAmount() (gas: 37836)\n[PASS] test_transferFromZeroOwnerWithAmountRevertsOnAllowance() (gas: 38063)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 95.50ms (436.95ms CPU time)\n\nRan 1 test for test/WindowShopper.invariant.t.sol:WindowShopperInvariantTest\n[PASS]\nWindowShopperInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchIndependentModel\n[PASS] invariant_metadataRemainsFixed\n[PASS] invariant_supplyIsConstantAndFullyAccountedFor\n WindowShopperInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| WindowShopperHandler | approve      | 2737  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WindowShopperHandler | transfer     | 2748  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WindowShopperHandler | transferFrom | 2707  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 963204426014882706149178188\n  Bound result 0\n  Bound result 439107742227104755258792842\n  Bound result 0\n  Bound result 5689\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 609\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 244\n  Bound result 101\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 1\n  Bound result 260\n  Bound result 0\n  Bound result 2479\n  Bound result 402\n  Bound result 0\n  Bound result 77\n  Bound result 0\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.54s (3.53s CPU time)\n\nRan 1 test for test/WindowShopper.adversarial.t.sol:WindowShopperAdversarialInvariantTest\n[PASS]\nWindowShopperAdversarialInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchModel\n[PASS] invariant_noBalanceExceedsSupply\n[PASS] invariant_totalSupplyFixedAndFullyHeldByTrackedHolders\n WindowShopperAdversarialInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+----------------------+-------+---------+----------╮\n| Contract           | Selector             | Calls | Reverts | Discards |\n+========================================================================+\n| AdversarialHandler | approve              | 1607  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| AdversarialHandler | approveZeroSpender   | 1671  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| AdversarialHandler | overdraw             | 1618  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| AdversarialHandler | overspendAllowance   | 1643  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| AdversarialHandler | transfer             | 1669  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| AdversarialHandler | transferFrom         | 1637  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| AdversarialHandler | transferFromToZero   | 1610  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| AdversarialHandler | transferToNewAddress | 1633  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| AdversarialHandler | transferToZero       | 1716  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| AdversarialHandler | tryMint              | 1580  | 0       | 0        |\n╰--------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 114560410975229756354818905915381521841570982798188500\n  Bound result 14\n  Bound result 0\n  Bound result 341907293817945760808\n  Bound result 0\n  Bound result 458391099619689038312129944870874706025228284860\n  Bound result 341907293817945760808\n  Bound result 0\n  Bound result 0\n  Bound result 695\n  Bound result 7939\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 14151691364620165220208266945070971023093274095259076055810748334\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 124512160\n  Bound result 0\n  Bound result 1239446558\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 95\n  Bound result 18\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 495790613316\n  Bound result 3\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 8727\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.89s (12.89s CPU time)\n\nRan 4 test suites in 12.89s (16.61s CPU time): 53 tests passed, 0 failed, 0 skipped (53 total tests)\n","passed":true},{"durationMs":79,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WindowShopper.approve(address,uint256)\",\"WindowShopper.transfer(address,uint256)\",\"WindowShopper.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":18,\"DEPENDENCIES.sha256\":32,\"LICENSE\":21,\"README.md\":110,\"foundry.toml\":21,\"remappings.txt\":2,\"src/WindowShopper.sol\":15,\"test/WindowShopper.adversarial.t.sol\":547,\"test/WindowShopper.invariant.t.sol\":103,\"test/WindowShopper.t.sol\":416},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"52d64d0839aaf94d07d53c36efea16fb2f330c6e9ba3f320283107c614e65547","verifiedTreeHash":"24f74a7cb8dbd94cbf6e700cf4a51b92809aef08","verifierVersion":"0.1.0+a6eb4461"},{"checks":[{"durationMs":1560,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.46s\nCompiler run successful!\n","passed":true},{"durationMs":3868,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 35 tests for test/WindowShopper.t.sol:WindowShopperTest\n[PASS] testFuzz_approvalReplacementUsesLatestValue(uint256,uint256) (runs: 1024, μ: 114452, ~: 114515)\n[PASS] testFuzz_selfTransferPreservesSupply(uint256) (runs: 1024, μ: 55142, ~: 54872)\nLogs:\n  Bound result 5025\n\n[PASS] testFuzz_transferAboveSupplyAlwaysReverts(uint256) (runs: 1024, μ: 69200, ~: 69545)\nLogs:\n  Bound result 1912618638814248068903695676030372014467732003\n\n[PASS] testFuzz_transferConservesSupply(uint256,address) (runs: 1024, μ: 110949, ~: 111300)\nLogs:\n  Bound result 1000000000\n\n[PASS] testFuzz_transferFromAboveAllowanceAlwaysReverts(uint256,uint256) (runs: 1024, μ: 123055, ~: 123511)\nLogs:\n  Bound result 398987864122030567235346602\n  Bound result 484543158680824161441416765\n\n[PASS] testFuzz_transferFromConsumesOnlyFiniteAllowance(uint256,uint256) (runs: 1024, μ: 164941, ~: 165610)\nLogs:\n  Bound result 137845140\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007912991818264\n\n[PASS] test_allowancesBelongToApprovingAccount() (gas: 142171)\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 163673)\n[PASS] test_approveEmitsEventWithoutMovingTokens() (gas: 99031)\n[PASS] test_approveZeroSpenderReverts() (gas: 37618)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9664)\n[PASS] test_contractDeployerReceivesSupplyInsteadOfTransactionOrigin() (gas: 336797)\n[PASS] test_create2FactoryCanDistributeSupplyWithoutFees() (gas: 596675)\n[PASS] test_deployerCannotTransferFromHolderWithoutApproval() (gas: 157849)\n[PASS] test_directEtherPaymentReverts() (gas: 40127)\n[PASS] test_emptyAccountCannotTransferOtherHoldersTokens() (gas: 57317)\n[PASS] test_maximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 214348)\n[PASS] test_maximumTransferAmountRevertsInsteadOfOverflowing() (gas: 42378)\n[PASS] test_metadataAndSupply() (gas: 107648)\n[PASS] test_noMintBurnPauseSeizureOrUpgradeEntryPoints() (gas: 850183)\n[PASS] test_selfTransferDoesNotChangeBalance() (gas: 51508)\n[PASS] test_transferAboveBalanceRevertsAndPreservesBalances() (gas: 54991)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 93606)\n[PASS] test_transferEntireSupplyAndBack() (gas: 134555)\n[PASS] test_transferFromAboveAllowancePreservesState() (gas: 115676)\n[PASS] test_transferFromAboveBalanceRollsBackAllowance() (gas: 178443)\n[PASS] test_transferFromCanSpendAllowanceExactlyOnce() (gas: 161664)\n[PASS] test_transferFromEmitsEventAndDecreasesAllowance() (gas: 160051)\n[PASS] test_transferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103271)\n[PASS] test_transferFromToZeroRollsBackAllowance() (gas: 114122)\n[PASS] test_transferToZeroRevertsAndPreservesBalances() (gas: 58109)\n[PASS] test_unapprovedSpenderCannotMoveFunds() (gas: 119729)\n[PASS] test_zeroAmountTransferToZeroStillReverts() (gas: 30457)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73345)\n[PASS] test_zeroTransferFromWithoutApprovalSucceeds() (gas: 81424)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 62.73ms (358.97ms CPU time)\n\nRan 1 test for test/WindowShopper.invariant.t.sol:WindowShopperInvariantTest\n[PASS]\nWindowShopperInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchIndependentModel\n[PASS] invariant_metadataRemainsFixed\n[PASS] invariant_supplyIsConstantAndFullyAccountedFor\n WindowShopperInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| WindowShopperHandler | approve      | 2737  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WindowShopperHandler | transfer     | 2748  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WindowShopperHandler | transferFrom | 2707  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 17\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 999999999999999999999999999\n  Bound result 0\n  Bound result 123000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 439107742227104755258792842\n  Bound result 0\n  Bound result 5689\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 609\n  Bound result 3953\n  Bound result 0\n  Bound result 0\n  Bound result 3953\n  Bound result 60000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 200\n  Bound result 0\n  Bound result 34003369003728416910\n  Bound result 30\n  Bound result 10\n  Bound result 2480\n  Bound result 3666\n  Bound result 0\n  Bound result 3102\n  Bound result 0\n  Bound result 154\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.74s (3.74s CPU time)\n\nRan 2 test suites in 3.74s (3.80s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":66,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WindowShopper.approve(address,uint256)\",\"WindowShopper.transfer(address,uint256)\",\"WindowShopper.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":18,\"DEPENDENCIES.sha256\":32,\"LICENSE\":21,\"README.md\":110,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/WindowShopper.sol\":15,\"test/WindowShopper.invariant.t.sol\":103,\"test/WindowShopper.t.sol\":416},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9143f37983f84c691c8fbeefd12e1c72d64feab0e980936edd4d3c69be07ff6e","verifiedTreeHash":"ebb09ad106e6c5d6fbfafb64efc8d034bbf2b30d","verifierVersion":"0.1.0+a6eb4461"},{"checks":[{"durationMs":1526,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.42s\nCompiler run successful!\n","passed":true},{"durationMs":3639,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 35 tests for test/WindowShopper.t.sol:WindowShopperTest\n[PASS] testFuzz_approvalReplacementUsesLatestValue(uint256,uint256) (runs: 1024, μ: 114452, ~: 114515)\n[PASS] testFuzz_selfTransferPreservesSupply(uint256) (runs: 1024, μ: 55142, ~: 54872)\nLogs:\n  Bound result 9741\n\n[PASS] testFuzz_transferAboveSupplyAlwaysReverts(uint256) (runs: 1024, μ: 69200, ~: 69545)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639943\n\n[PASS] testFuzz_transferConservesSupply(uint256,address) (runs: 1024, μ: 110949, ~: 111300)\nLogs:\n  Bound result 684\n\n[PASS] testFuzz_transferFromAboveAllowanceAlwaysReverts(uint256,uint256) (runs: 1024, μ: 123055, ~: 123511)\nLogs:\n  Bound result 398987864122030567235346602\n  Bound result 484543158680824161441416765\n\n[PASS] testFuzz_transferFromConsumesOnlyFiniteAllowance(uint256,uint256) (runs: 1024, μ: 164941, ~: 165610)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000001\n\n[PASS] test_allowancesBelongToApprovingAccount() (gas: 142171)\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 163673)\n[PASS] test_approveEmitsEventWithoutMovingTokens() (gas: 99031)\n[PASS] test_approveZeroSpenderReverts() (gas: 37618)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9664)\n[PASS] test_contractDeployerReceivesSupplyInsteadOfTransactionOrigin() (gas: 336797)\n[PASS] test_create2FactoryCanDistributeSupplyWithoutFees() (gas: 596675)\n[PASS] test_deployerCannotTransferFromHolderWithoutApproval() (gas: 157849)\n[PASS] test_directEtherPaymentReverts() (gas: 40127)\n[PASS] test_emptyAccountCannotTransferOtherHoldersTokens() (gas: 57317)\n[PASS] test_maximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 214348)\n[PASS] test_maximumTransferAmountRevertsInsteadOfOverflowing() (gas: 42378)\n[PASS] test_metadataAndSupply() (gas: 107648)\n[PASS] test_noMintBurnPauseSeizureOrUpgradeEntryPoints() (gas: 850183)\n[PASS] test_selfTransferDoesNotChangeBalance() (gas: 51508)\n[PASS] test_transferAboveBalanceRevertsAndPreservesBalances() (gas: 54991)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 93606)\n[PASS] test_transferEntireSupplyAndBack() (gas: 134555)\n[PASS] test_transferFromAboveAllowancePreservesState() (gas: 115676)\n[PASS] test_transferFromAboveBalanceRollsBackAllowance() (gas: 178443)\n[PASS] test_transferFromCanSpendAllowanceExactlyOnce() (gas: 161664)\n[PASS] test_transferFromEmitsEventAndDecreasesAllowance() (gas: 160051)\n[PASS] test_transferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103271)\n[PASS] test_transferFromToZeroRollsBackAllowance() (gas: 114122)\n[PASS] test_transferToZeroRevertsAndPreservesBalances() (gas: 58109)\n[PASS] test_unapprovedSpenderCannotMoveFunds() (gas: 119729)\n[PASS] test_zeroAmountTransferToZeroStillReverts() (gas: 30457)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73345)\n[PASS] test_zeroTransferFromWithoutApprovalSucceeds() (gas: 81424)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 64.70ms (388.96ms CPU time)\n\nRan 1 test for test/WindowShopper.invariant.t.sol:WindowShopperInvariantTest\n[PASS]\nWindowShopperInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchIndependentModel\n[PASS] invariant_metadataRemainsFixed\n[PASS] invariant_supplyIsConstantAndFullyAccountedFor\n WindowShopperInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| WindowShopperHandler | approve      | 2737  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WindowShopperHandler | transfer     | 2748  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WindowShopperHandler | transferFrom | 2707  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 17\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 999999999999999999999999999\n  Bound result 0\n  Bound result 123000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 439107742227104755258792842\n  Bound result 0\n  Bound result 5689\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 609\n  Bound result 3953\n  Bound result 0\n  Bound result 0\n  Bound result 3953\n  Bound result 60000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 200\n  Bound result 0\n  Bound result 34003369003728416910\n  Bound result 30\n  Bound result 10\n  Bound result 2480\n  Bound result 3666\n  Bound result 0\n  Bound result 3102\n  Bound result 0\n  Bound result 154\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.51s (3.50s CPU time)\n\nRan 2 test suites in 3.51s (3.57s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":70,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WindowShopper.approve(address,uint256)\",\"WindowShopper.transfer(address,uint256)\",\"WindowShopper.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":18,\"DEPENDENCIES.sha256\":32,\"LICENSE\":21,\"README.md\":110,\"foundry.toml\":21,\"remappings.txt\":2,\"src/WindowShopper.sol\":15,\"test/WindowShopper.invariant.t.sol\":103,\"test/WindowShopper.t.sol\":416},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":578,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":283,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/WindowShopper.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"bf8701007a4d063451adf67abf6c224a9095a507175e61dfdb608d20beadc6cf","verifiedTreeHash":"c81f00fff5cc54a809047ec888b4150cd6fc3031","verifierVersion":"0.1.0+a6eb4461"}]}