{"assessments":[],"deployments":[{"attestationHash":"b7019dcfe3be9cb6c08d37bc596763c3ea790ee29e6195783f5fe80127c04773","chainId":1,"contracts":[{"address":"0x2180b6ebfaa632122b4497d36231ecb7ae55a3fe","blockNumber":26407271,"name":"MerkleDistributor","role":"distributor","txHash":"0xa3c51d8961024f49594e28451ad56fee972ea63e24fc0224329fd1383c1cf357"},{"address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","blockNumber":26407271,"name":"PoolInitializationGuard","role":"hook","txHash":"0xa3c51d8961024f49594e28451ad56fee972ea63e24fc0224329fd1383c1cf357"},{"address":"0x3097d0eaf1b29af80a2338f30ea2f427c36e6fad","blockNumber":26407271,"name":"WindowShopperToken","role":"token","txHash":"0xa3c51d8961024f49594e28451ad56fee972ea63e24fc0224329fd1383c1cf357"}],"id":"0b299638-bfc2-4c0c-adca-bf385accd985","manifestHash":"8cd36bd2114a3ca41f5d9b3c39b7407b50970ff359e3e7a3756f80012f84f03a","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":"6b3b2bc3-6004-4e3d-ba3d-98674cf6f377","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"4b07c754d2795ce6e7df994f20ecd05ee3a44fda41edff3a77168cbe0bb45ed8","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":"b33f60cfcd0f1d0b1b03d235a89087854483f6d719d7dca5d326fd5dfdad03cf","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":"56625cbfe45c45aac55fb5cb44de68ff03dd3100340048480e2e9a4628a99301","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":"4eae75cea55d7d4c12c66637e82881b0ded91f87ad2fcb487de5b6fb7ef68bb5","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":"f6a8b753498463648878ddd125a2a2d4b5d06802326e87244305b001c3b0b31c","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":"fad68b1d92fc3733f86be38e8786c9342256e6ca90a3586087db1c6b973c3475","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":"4a506c615c2af1ea72fc18078fdafc08e6c9e659ae67fcb124714964526a272b","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"f63509a71a131900bdd5d5acf39352883f2722e3d679de22d35e044af03b2d77","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"1ddb4d02eb75e52d5f38cfd5c9bb54f332687b81929c68880cf1e8a6ab27254d","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"1ddb4d02eb75e52d5f38cfd5c9bb54f332687b81929c68880cf1e8a6ab27254d","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: IMDwindowshopper (WWW).\nToken name: IMDwindowshopper\nToken symbol: WWW\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"d4cfef16f4a1549c329770cd1972853eb41bc08806a8617d64e21ae38d120bdd","previousHash":"1dad5da89bd0613336d6066f34ac182a2aa0b50ae77cf088e166539d85230c2b","projectId":"6b3b2bc3-6004-4e3d-ba3d-98674cf6f377","publication":{"commit":"0fcc43167a4d5da02cf36064317ab9215e18c2b0","deliveredAt":"2026-11-13T16:34:10.886Z","repoUrl":"https://github.com/identity-md-launches/launch-3259-imdwindowshopper"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"78a52dcf2fe22d1248e55c5efe676931043a64aa3f6025bc24cb77df999fe1d5","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"1cae6bd25a61657fab62e7e87e61c41dcf2e5ff276737a95c2def6a62180f1d9","device":"f843b0d093c69ab9","findings":[],"hash":"4a506c615c2af1ea72fc18078fdafc08e6c9e659ae67fcb124714964526a272b","nodeId":"60122d60-69f1-4a29-961d-92f72206b04f","outcome":"completed","summary":"Done. The manifest is written and verified, and it is the only new or changed file in the tree.\n\n**What launch.json describes**\n\n- **Token:** `WindowShopperToken`, name IMDwindowshopper, symbol WWW, 18 decimals, empty constructor arguments. The compiled ABI confirms the constructor takes no parameters.\n- **Supply:** 1000000000000000000000000000 minor units, exactly what the constructor mints once to msg.sender.\n- **Contracts:** none. The accepted tree has only the token, so no application contracts are named.\n- **Pool and economics:** copied verbatim from the launch terms. IMD as the paired currency, fee 12500, tick spacing 60, the one-to-one provenance price, and the requester's economics object unchanged.\n- **Notes:** a plain description of the token's behaviour and the launch flows, well under the 4000 character limit.\n\n**Checks run**\n\n- `forge build` compiled cleanly with the pinned solc 0.8.26.\n- `forge test` with the verifier's fuzz seed passed all 26 tests across both suites.\n- A JSON check confirmed the schema keys, the supply string, the empty constructor arguments and the verbatim pool and economics objects.\n- `git status` shows launch.json as the only addition. No configuration file was touched.","treeHash":"cda795e5b18750cdc397ad37cdba39d37556eb12","usage":{"cachedInputTokens":133636,"cost":{"source":"runtime","usdMicros":872189},"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3288,"runtime":"claude","turns":10,"wallClockMs":83617}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bfeaa965edf57623","findings":[],"hash":"4b07c754d2795ce6e7df994f20ecd05ee3a44fda41edff3a77168cbe0bb45ed8","nodeId":"798bb2ba-680c-4af5-bb15-d28db99cbebf","outcome":"completed","summary":"I found no defects in the economics area, so `.imd-findings.json` has an empty findings list. It also has a coverage row for each of the three listed entry points, all `holds`, plus three rows for the supply invariants and launch flows I checked.\n\n**What the code is:** `src/WindowShopperToken.sol` is a plain ERC-20 built on OpenZeppelin 5.4.0. It adds only constants, a `decimals()` that returns 18, and a constructor that mints all 1,000,000,000 × 10^18 tokens to `msg.sender` once. It has no owner, no fee or burn on transfer, no exemptions, no hooks, no mint or burn after deployment, and no upgrade path.\n\n**Checks against the Economic Security, Invariant and Flow Gap guides:**\n- **The vendored library is unmodified.** I downloaded OpenZeppelin v5.4.0 and compared `ERC20.sol`, `IERC20.sol`, `IERC20Metadata.sol`, `Context.sol` and `draft-IERC6093.sol`. All five are identical to the vendored copies, so the transfer and allowance logic is OpenZeppelin's own.\n- **Supply can't change.** The only `_mint` is in the constructor, and no other path mints or burns. Total supply stays at 10^27 and the constructor's recipient holds all of it at deployment. Decimals match the manifest.\n- **Launch flows arrive exact.** I wrote a throwaway fuzz test (2,000 runs) of the launch split: 10% to the distributor, any pool share up to 90% to the PoolManager, the rest to the requester, then a `transferFrom` out of the pool address. Every recipient got exactly what was sent, the deployer ended with nothing, and allowances went down exactly. Since there's no tax and no exemption logic, the seed and swaps through the PoolManager can't arrive short.\n- **Edge cases behave normally.** A `transferFrom` to yourself spends the allowance and leaves the balance unchanged; zero-amount transfers work; spending past the allowance reverts.\n- **No privileged party can move a holder's balance.** There's no owner, and `transferFrom` needs the holder's own approval.\n\n**Tests:** the project's existing suite passes, 26 of 26. My throwaway test also passed, and I deleted it afterwards.\n\n**Leads I set aside:** Slither reported nothing. Aderyn flagged a \"large numeric literal\" at line 26, but that is just the supply constant and isn't a defect. The standard ERC-20 issue where a spender can front-run a change of allowance applies here as it does to any OpenZeppelin token. I didn't report it because it isn't specific to this code and comes with no failing input.\n\n**Coverage:** I checked the whole token, since it is the only source file. I couldn't run the launch-floor tests in `.imd/reads/protected` locally: they need the verifier's environment variables and the floor sources. Instead I checked by reading that the token meets each of their conditions.\n\nI changed no repository files apart from writing `.imd-findings.json`.","treeHash":null,"usage":{"cachedInputTokens":189096,"cost":{"source":"runtime","usdMicros":352705},"inputTokens":12,"model":"claude-opus-5-5","outputTokens":4146,"runtime":"claude","turns":6,"wallClockMs":51544}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3f91b58cf7cd2d45","findings":[],"hash":"4eae75cea55d7d4c12c66637e82881b0ded91f87ad2fcb487de5b6fb7ef68bb5","nodeId":"9cb13319-8e7f-4cf6-a40e-db792435ada8","outcome":"completed","summary":"The review is complete. No defects were found in the assigned area, and the findings file is written with an empty findings list and a full coverage record.\n\n**What was reviewed.** The token is a single contract, `src/WindowShopperToken.sol`, which inherits OpenZeppelin 5.4.0 ERC20 and adds four constants plus a constructor mint. I checked it against the Math Precision, Boundary and Numerical Gap guides, then the Mindset, and traced the three entry points through the inherited `_update`, `_approve` and `_spendAllowance` code.\n\n**What held, with the inputs tried.**\n- The supply constant evaluates to exactly 1e27 at compile time. The cast from the 8-bit decimals constant is widening, so the aderyn \"large numeric literal\" lead is not a defect.\n- Transfers of the whole supply, supply plus one, and max uint256 behave correctly. The over-balance cases revert with the exact OpenZeppelin error rather than wrapping. A 2000-run fuzz over four holders kept the sum of balances equal to total supply.\n- Allowances overwrite rather than accumulate. Exact allowances spend to zero, max-minus-one allowances decrement normally, and max allowances stay infinite. An allowance larger than the balance reverts on balance and mints nothing.\n- The token has no division, fee, fixed-point scale, external call, payable path, sentinel branch, bytes decoding or narrowing cast, so the three checklists have no value path to attack.\n- The five vendored OpenZeppelin files the token imports are byte-identical to upstream v5.4.0, ruling out a tampered library.\n\n**Checks run.** The project builds, and all 26 existing tests pass. My scratch boundary suite of 9 tests passed and was removed afterwards. The static analysis lines were reproduced and dismissed as described above.\n\n**Coverage record.** Each of the three listed entry points has a `holds` row, plus three invariant rows covering the fixed supply, the supply constant and the absence of arithmetic on the value path. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":507656,"cost":{"source":"runtime","usdMicros":2013997},"inputTokens":290,"model":"claude-fable-5-1","outputTokens":9374,"runtime":"claude","turns":10,"wallClockMs":129626}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"cd8076510aad8b8e","findings":[],"hash":"56625cbfe45c45aac55fb5cb44de68ff03dd3100340048480e2e9a4628a99301","nodeId":"569617e5-b727-401b-9e8f-64ea2412431d","outcome":"completed","summary":"The review is complete. The findings file is written with no defects and full coverage, and no repository file was changed.\n\n**Outcome:** the IMDwindowshopper (WWW) token is a clean, fixed-supply ERC-20 and I found no defect to report. All five specialists reported nothing, so there was nothing to merge or drop, and my own pass confirmed their result.\n\n**What I verified**\n\n- **Source and dependency.** The token at `src/WindowShopperToken.sol` only inherits OpenZeppelin ERC20 and overrides `decimals`. The five vendored OpenZeppelin files it depends on are byte-identical to the upstream 5.4.0 release.\n- **Entry points.** I ran my own scratch test over approve, transfer and transferFrom. Exact amounts move, zero-address receiver and spender revert, insufficient balance and allowance revert with the standard errors, the infinite allowance is preserved, and self-transfer does not inflate. The project's own 60 tests also pass.\n- **Protected floor.** The constructor mints the whole supply to the deployer with no arguments and no external calls. No mint, burn, owner, pause or blacklist selector exists. Runtime code has no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT, and creation and runtime sizes are far below the protocol limits. I could not run the protected test itself because it imports Uniswap v4 and launch sources absent from this tree, so I traced each of its assertions against the code instead.\n- **Manifest.** The launch manifest uses only schema keys, with correct types, lowercase addresses, an empty constructor argument list matching the no-arg constructor, and the exact supply.\n- **Static analysis lead.** The aderyn large-numeric-literal note is a style remark on an exact compile-time constant and is not a defect.\n\nThe findings file holds an empty findings list and nine coverage rows, one for each of the three listed entry points plus the constructor, the supply and flow invariants, deployability, the manifest and the aderyn lead. The scratch test directory was removed, so the working tree is unchanged apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":217255,"cost":{"source":"runtime","usdMicros":1168311},"inputTokens":162,"model":"claude-fable-5-1","outputTokens":6696,"runtime":"claude","turns":6,"wallClockMs":169842}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4aa8623bfb8d8e5e","findings":[],"hash":"b33f60cfcd0f1d0b1b03d235a89087854483f6d719d7dca5d326fd5dfdad03cf","nodeId":"f56a77ae-8f6f-403c-a626-612e12be021a","outcome":"completed","summary":"The control-flow review of IMDwindowshopper (WWW) is complete. It found no defects. The findings file at the repository root holds an empty findings list and seven coverage rows, and no tracked file was changed.\n\n**What the token is.** `src/WindowShopperToken.sol` inherits OpenZeppelin 5.4.0 ERC-20 unchanged and adds only four public constants, a constructor that mints the whole supply to the deployer, and a pure `decimals()` returning 18. The three listed entry points are the library's own.\n\n**What I checked, by guide**\n\n- **Execution Trace.** Traced approve, transfer and transferFrom through `_approve`, `_spendAllowance`, `_transfer` and `_update`. Zero-address sentinels revert on every path. Allowance is checked before balance. Partial spends leave an exact, usable residual. The max allowance never decrements and max minus one does. Self-transfer and spender-equals-owner paths conserve balance. There are no hooks or external calls, so no callback or reentrancy surface. Supply is conserved under fuzzed interleavings of all three entry points.\n- **Periphery.** Every vendored OpenZeppelin file the token compiles is byte-identical with the published 5.4.0 npm package. No vendored Solidity file differs from upstream. The vendored forge-std matches release 1.17.0.\n- **First Principles.** The constructor mints to the constructor's caller under both CREATE and CREATE2, and the CREATE2 address prediction matches. The deployer gets no privileged path and cannot pull a holder's balance. Storage holds only the five ERC-20 slots. Every state-changing call rejects ETH, and mint, burn, permit, pause, blacklist, upgrade and initialize selectors all revert. The runtime bytecode contains no CALL, DELEGATECALL, CALLCODE, CREATE or SELFDESTRUCT.\n\n**Evidence.** The project's 26 tests pass with the verifier's fuzz seed. Eleven scratch tests I wrote under `test/scratch/` for the paths above also pass. The two static-analysis leads were a clean Slither run and an aderyn style note on the supply literal, whose folded value the tests confirm.\n\n**Not covered.** The protected launch floor test could not run here because it imports v4-core and launch helpers that are not in this tree. The token has no transfer exemptions, so its flows to the distributor and pool manager are plain transfers, and nothing in the token's control flow depends on those helpers. No launch.json exists at the repository root, so there was no manifest to check.","treeHash":null,"usage":{"cachedInputTokens":711738,"cost":{"source":"runtime","usdMicros":2560612},"inputTokens":354,"model":"claude-fable-5-1","outputTokens":18871,"runtime":"claude","turns":25,"wallClockMs":308488}},{"artifacts":[],"attempt":1,"bundleHash":"96a153cba4ae2365322b3c658b6e272905c8d60f2ee3517ecb6ce0d62ed5dd2f","device":"6e1587ffa91ea90b","findings":[],"hash":"f63509a71a131900bdd5d5acf39352883f2722e3d679de22d35e044af03b2d77","nodeId":"7a168ee3-8032-456c-8be6-4524d8acddeb","outcome":"completed","summary":"Added failure-path and boundary tests, nine fuzz properties, and four stateful invariants under `test/`.\n\nOffline `forge build` and `forge test` passed with the specified seed: **60 tests passed**, including **16,384 randomized handler calls** with zero handler reverts or discards.\n\nNo confirmed defects found. Only `test/` paths changed.","treeHash":"d340fef49cead0be333c1c04c988dca367b50188","usage":{"cachedInputTokens":1839360,"cost":{"source":"estimated","usdMicros":3938680},"inputTokens":97097,"model":"gpt-6-astra","outputTokens":22567,"runtime":"codex","turns":7,"wallClockMs":654775}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a31e321b410aaa02","findings":[],"hash":"f6a8b753498463648878ddd125a2a2d4b5d06802326e87244305b001c3b0b31c","nodeId":"304d8c27-184e-4144-9377-83b658fe5c15","outcome":"completed","summary":"The permissions review of IMDwindowshopper (WWW) is complete and found no defects. The findings file at the repository root holds an empty findings list and a nine-row coverage record, and no tracked file was changed.\n\n**What was reviewed.** The token at `src/WindowShopperToken.sol` is a 37-line fixed-supply ERC-20 inheriting unmodified OpenZeppelin v5.4.0. It has no owner, roles, modifiers, pause, blacklist, mint, burn, permit, hooks, proxy or initializer. The whole supply is minted once to the constructor's caller.\n\n**Coverage verdicts, all `holds`:**\n- `approve`: writes only the caller's own allowance slot. Zero spender reverts. The only other writer of that slot is the allowance spend inside the caller's own transferFrom.\n- `transfer`: sender is always the caller, debit and credit are exactly equal, zero recipient reverts, so the burn branch of `_update` is unreachable.\n- `transferFrom`: needs an allowance the holder granted. The factory and the holder themselves have no bypass. Amounts moved mirror `transfer` exactly.\n- Invariants checked: no privileged role in the compiled ABI or storage layout, supply fixed at 1e27 and minted only in the constructor, no DELEGATECALL, CALLCODE or SELFDESTRUCT opcodes, no receive or fallback.\n- Trust assumption recorded: the launch factory holds 100 percent of supply at construction by design and has no power over holders afterwards.\n- Trust Gap seams: no admin setter, fee, recipient or oracle exists, so no seam can form.\n\n**Evidence gathered.** The vendored OpenZeppelin ERC20, IERC20, IERC20Metadata, Context and IERC6093 files are byte-identical to upstream v5.4.0. The existing 26 tests pass. A scratch probe suite of seven extra access-control and symmetry checks passed and was then deleted. The two static-analysis leads were a clean Slither run and an aderyn large-literal style note, which is not a defect.\n\n**Not covered.** Nothing in my area was left unreached. The launch manifest does not exist yet, which is expected at this stage, and the deploy script is reference-only and outside the launch path.","treeHash":null,"usage":{"cachedInputTokens":511693,"cost":{"source":"runtime","usdMicros":1993762},"inputTokens":354,"model":"claude-fable-5-1","outputTokens":14381,"runtime":"claude","turns":17,"wallClockMs":291471}},{"artifacts":[],"attempt":1,"bundleHash":"3e156764a39e5b0f65028dc62550d54a608760bbf7ad6d91754c51d94609bae0","device":"d2d0460994f47014","findings":[],"hash":"fad68b1d92fc3733f86be38e8786c9342256e6ca90a3586087db1c6b973c3475","nodeId":"ba868a50-e5a8-44a8-a9b9-f409d5331b1c","outcome":"completed","summary":"The IMDwindowshopper (WWW) token project is complete, verified and committed on `main` as commit `dd50ded`.\n\n**What was delivered**\n\n- `src/WindowShopperToken.sol`: a plain OpenZeppelin v5 ERC-20 named IMDwindowshopper, symbol WWW, 18 decimals. The constructor mints the full 1,000,000,000 supply once to msg.sender, which at launch is the factory. There is no owner, mint, burn, pause, blacklist, fee, upgrade path, delegatecall or selfdestruct, so it meets every item of the protected floor by construction. The contract name is 18 characters, within the manifest's 32-character limit.\n- `foundry.toml` pins solc 0.8.26, cancun, optimizer on, `bytecode_hash = \"none\"`, ffi off, no filesystem permissions. `remappings.txt` points at the vendored libraries.\n- `lib/forge-std` (1.17.0) and `lib/openzeppelin-contracts` (5.4.0) vendored as ordinary files. No git submodules exist in the tree.\n- `test/WindowShopperToken.t.sol` and `test/DeployWindowShopperToken.t.sol`: 26 tests covering metadata, supply, single constructor Transfer event, transfer and transferFrom success and revert paths with exact OpenZeppelin errors, rejection of every common admin selector, ETH rejection, a runtime opcode scan, and three fuzz tests.\n- `script/DeployWindowShopperToken.s.sol`: a reference script whose `deploy()` is tested directly and reads no environment.\n- `README.md` documents assumptions, the manifest values fixed by this source, the \"After launch\" section (nothing to configure), and operational responsibilities.\n\n**Check results**\n\n| Check | Result |\n| --- | --- |\n| forge build (solc 0.8.26, offline) | pass |\n| forge test with the verifier's fuzz seed | 26 passed, 0 failed |\n| forge fmt --check | pass |\n\n**Not run**\n\nThe protected floor test could not be executed locally because its helper contracts (LaunchLiquidity, PoolInitializationGuard, HookFlags) and v4-core are not in this workspace. My own tests replicate its token-level properties: whole supply to the deployer, exact transfers, no supply growth, no privileged move or freeze, and no forbidden opcodes. Slither was not available on this worker; the source contains none of the six rejected patterns.","treeHash":"75833699f8d1220d8b8865666d8e6d44122a9e36","usage":{"cachedInputTokens":486227,"cost":{"source":"runtime","usdMicros":2098840},"inputTokens":354,"model":"claude-fable-5-1","outputTokens":17928,"runtime":"claude","turns":23,"wallClockMs":313218}}],"verification":[{"checks":[{"durationMs":1247,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.16s\nCompiler run successful!\n","passed":true},{"durationMs":141,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployWindowShopperToken.t.sol:DeployWindowShopperTokenTest\n[PASS] test_deployMintsWholeSupplyToTheScriptCaller() (gas: 1532796)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 306.99µs (151.46µs CPU time)\n\nRan 25 tests for test/WindowShopperToken.t.sol:WindowShopperTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 96898, ~: 97476)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 86477, ~: 86658)\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256,uint256) (runs: 256, μ: 176040, ~: 157600)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32897)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 64906)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 803002)\n[PASS] test_deployerCannotPullHolderBalance() (gas: 98762)\n[PASS] test_eoaDeployerAlsoReceivesWholeSupply() (gas: 679045)\n[PASS] test_metadata() (gas: 52817)\n[PASS] test_noMintOrAdminSelectorIsCallable() (gas: 677586)\n[PASS] test_rejectsPlainEther() (gas: 38701)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 916653)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 18913)\n[PASS] test_transferChainArrivesWholeAtEveryHop() (gas: 197610)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 146330)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 151896)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 98669)\n[PASS] test_transferFromSpendsAllowance() (gas: 210447)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrease() (gas: 183626)\n[PASS] test_transferMovesExactAmount() (gas: 90524)\n[PASS] test_transferOfZeroSucceeds() (gas: 44555)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 96195)\n[PASS] test_transferRevertsToZeroAddress() (gas: 91095)\n[PASS] test_transferToSelfKeepsBalance() (gas: 98785)\n[PASS] test_wholeSupplyMintedToDeployerInConstructor() (gas: 25230)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 14.49ms (31.02ms CPU time)\n\nRan 2 test suites in 15.25ms (14.79ms CPU time): 26 tests passed, 0 failed, 0 skipped (26 total tests)\n","passed":true},{"durationMs":42,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WindowShopperToken.approve(address,uint256)\",\"WindowShopperToken.transfer(address,uint256)\",\"WindowShopperToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":135,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployWindowShopperToken.s.sol\":24,\"src/WindowShopperToken.sol\":37,\"test/DeployWindowShopperToken.t.sol\":19,\"test/WindowShopperToken.t.sol\":313},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4a506c615c2af1ea72fc18078fdafc08e6c9e659ae67fcb124714964526a272b","verifiedTreeHash":"cda795e5b18750cdc397ad37cdba39d37556eb12","verifierVersion":"0.1.0+a490e3c0"},{"checks":[{"durationMs":1832,"exitCode":0,"name":"build","output":"Compiling 32 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.75s\nCompiler run successful!\n","passed":true},{"durationMs":11940,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployWindowShopperToken.t.sol:DeployWindowShopperTokenTest\n[PASS] test_deployMintsWholeSupplyToTheScriptCaller() (gas: 1532796)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 312.30µs (152.41µs CPU time)\n\nRan 25 tests for test/WindowShopperToken.t.sol:WindowShopperTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 97222, ~: 97464)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 86492, ~: 86658)\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256,uint256) (runs: 256, μ: 175609, ~: 157564)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32897)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 64906)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 803002)\n[PASS] test_deployerCannotPullHolderBalance() (gas: 98762)\n[PASS] test_eoaDeployerAlsoReceivesWholeSupply() (gas: 679045)\n[PASS] test_metadata() (gas: 52817)\n[PASS] test_noMintOrAdminSelectorIsCallable() (gas: 677586)\n[PASS] test_rejectsPlainEther() (gas: 38701)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 916653)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 18913)\n[PASS] test_transferChainArrivesWholeAtEveryHop() (gas: 197610)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 146330)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 151896)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 98669)\n[PASS] test_transferFromSpendsAllowance() (gas: 210447)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrease() (gas: 183626)\n[PASS] test_transferMovesExactAmount() (gas: 90524)\n[PASS] test_transferOfZeroSucceeds() (gas: 44555)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 96195)\n[PASS] test_transferRevertsToZeroAddress() (gas: 91095)\n[PASS] test_transferToSelfKeepsBalance() (gas: 98785)\n[PASS] test_wholeSupplyMintedToDeployerInConstructor() (gas: 25230)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 581.37ms (747.96ms CPU time)\n\nRan 32 tests for test/WindowShopperTokenProperties.t.sol:WindowShopperTokenPropertiesTest\n[PASS] testFuzz_approveOverwritesAndIsIdempotent(uint256,uint256) (runs: 1000, μ: 982646, ~: 982702)\n[PASS] testFuzz_delegatedSelfTransferHasNoBalanceEffect(uint256,uint256,uint256) (runs: 1000, μ: 187123, ~: 187619)\n[PASS] testFuzz_finiteApprovalCannotBeSpentTwice(uint256,uint256) (runs: 1000, μ: 986452, ~: 987069)\n[PASS] testFuzz_infiniteApprovalSurvivesRepeatedSpending(uint256) (runs: 1000, μ: 246369, ~: 246369)\n[PASS] testFuzz_roundTripPreservesBalancesAndUnrelatedApprovals(uint256,uint256) (runs: 1000, μ: 904016, ~: 904466)\n[PASS] testFuzz_transferAboveBalanceIsAtomic(uint256,uint256) (runs: 1000, μ: 844585, ~: 845122)\n[PASS] testFuzz_transferFromAboveAllowanceIsAtomic(uint256,uint256,uint256) (runs: 1000, μ: 844536, ~: 845999)\n[PASS] testFuzz_transferFromAboveBalanceRestoresFiniteApproval(uint256,uint256,uint256) (runs: 1000, μ: 851597, ~: 851834)\n[PASS] testFuzz_transferFromToZeroRestoresAllowance(uint256,uint256,bool) (runs: 1000, μ: 841330, ~: 840070)\n[PASS] test_approvalBelongsToCallerAndCannotAuthorizeAnotherHolder() (gas: 844079)\n[PASS] test_failedBalanceCheckDoesNotConsumeApprovalAndCanBeRetried() (gas: 942365)\n[PASS] test_fullSupplyCanMoveAndReturn() (gas: 142630)\n[PASS] test_fullSupplyDelegatedTransferExhaustsFiniteAllowance() (gas: 150871)\n[PASS] test_fullSupplySelfTransferEmitsAndPreservesState() (gas: 742754)\n[PASS] test_holderUsingTransferFromNeedsItsOwnAllowance() (gas: 900705)\n[PASS] test_infiniteAllowanceDoesNotPermitMaximumTransferFrom() (gas: 842112)\n[PASS] test_infiniteAllowanceSelfTransferPreservesState() (gas: 841900)\n[PASS] test_maximumMinusOneAllowanceIsFinite() (gas: 198444)\n[PASS] test_maximumTransferRevertsWithoutOverflowOrMutation() (gas: 740471)\n[PASS] test_nonpayableERC20CallRejectsValueWithoutApproving() (gas: 754940)\n[PASS] test_oneWeiRoundTripIsExact() (gas: 128141)\n[PASS] test_replacingInfiniteApprovalWithFiniteApprovalSetsNewLimit() (gas: 977128)\n[PASS] test_revokedInfiniteApprovalCannotBeUsedAgain() (gas: 961807)\n[PASS] test_selfTransferStillRequiresSufficientBalance() (gas: 792947)\n[PASS] test_transferFromToOwnerSpendsFiniteAllowanceWithoutMovingBalance() (gas: 176091)\n[PASS] test_transferFromToSpenderCreditsSpender() (gas: 195760)\n[PASS] test_transferFromZeroOwnerCannotMintEvenWithZeroAmount() (gas: 1126144)\n[PASS] test_transferToTokenContractIsAccountedWithoutBurning() (gas: 78154)\n[PASS] test_zeroApprovalToZeroSpenderStillReverts() (gas: 737175)\n[PASS] test_zeroTransferFromToZeroReceiverStillReverts() (gas: 741103)\n[PASS] test_zeroTransferFromWithoutBalanceOrApprovalEmitsAndPreservesState() (gas: 748810)\n[PASS] test_zeroTransferToZeroAddressStillReverts() (gas: 737148)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 581.60ms (5.05s CPU time)\n\nRan 2 tests for test/WindowShopperTokenInvariant.t.sol:WindowShopperTokenInvariantTest\n[PASS]\nWindowShopperTokenInvariantTest invariants:\n[PASS] invariant_allowancesFollowApprovalsAndSuccessfulSpending\n[PASS] invariant_balancesFollowAuthorizedFlowsAndConserveSupply\n[PASS] invariant_supplyAndMetadataAreFixed\n[PASS] invariant_validCallsSucceedAndInvalidCallsRevert\n WindowShopperTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+-----------------+-------+---------+----------╮\n| Contract                  | Selector        | Calls | Reverts | Discards |\n+==========================================================================+\n| WindowShopperTokenHandler | approve         | 1484  | 0       | 0        |\n|---------------------------+-----------------+-------+---------+----------|\n| WindowShopperTokenHandler | donateToToken   | 1484  | 0       | 0        |\n|---------------------------+-----------------+-------+---------+----------|\n| WindowShopperTokenHandler | forbiddenCall   | 1538  | 0       | 0        |\n|---------------------------+-----------------+-------+---------+----------|\n| WindowShopperTokenHandler | invalidAddress  | 1468  | 0       | 0        |\n|---------------------------+-----------------+-------+---------+----------|\n| WindowShopperTokenHandler | move            | 1417  | 0       | 0        |\n|---------------------------+-----------------+-------+---------+----------|\n| WindowShopperTokenHandler | moveAll         | 1527  | 0       | 0        |\n|---------------------------+-----------------+-------+---------+----------|\n| WindowShopperTokenHandler | revoke          | 1498  | 0       | 0        |\n|---------------------------+-----------------+-------+---------+----------|\n| WindowShopperTokenHandler | spend           | 1487  | 0       | 0        |\n|---------------------------+-----------------+-------+---------+----------|\n| WindowShopperTokenHandler | spendAll        | 1546  | 0       | 0        |\n|---------------------------+-----------------+-------+---------+----------|\n| WindowShopperTokenHandler | spendTooMuch    | 1514  | 0       | 0        |\n|---------------------------+-----------------+-------+---------+----------|\n| WindowShopperTokenHandler | transferTooMuch | 1421  | 0       | 0        |\n╰---------------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_handlerExercisesTransfersApprovalsRevocationsAndRejections() (gas: 4303050)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.83s (11.83s CPU time)\n\nRan 4 test suites in 11.83s (13.00s CPU time): 60 tests passed, 0 failed, 0 skipped (60 total tests)\n","passed":true},{"durationMs":55,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WindowShopperToken.approve(address,uint256)\",\"WindowShopperToken.transfer(address,uint256)\",\"WindowShopperToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":135,\"foundry.toml\":21,\"remappings.txt\":2,\"script/DeployWindowShopperToken.s.sol\":24,\"src/WindowShopperToken.sol\":37,\"test/DeployWindowShopperToken.t.sol\":19,\"test/PROPERTIES.md\":86,\"test/WindowShopperToken.t.sol\":313,\"test/WindowShopperTokenInvariant.t.sol\":140,\"test/WindowShopperTokenProperties.t.sol\":435,\"test/handlers/WindowShopperTokenHandler.sol\":219},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f63509a71a131900bdd5d5acf39352883f2722e3d679de22d35e044af03b2d77","verifiedTreeHash":"d340fef49cead0be333c1c04c988dca367b50188","verifierVersion":"0.1.0+a490e3c0"},{"checks":[{"durationMs":1030,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 947.84ms\nCompiler run successful!\n","passed":true},{"durationMs":105,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployWindowShopperToken.t.sol:DeployWindowShopperTokenTest\n[PASS] test_deployMintsWholeSupplyToTheScriptCaller() (gas: 1532796)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 309.31µs (154.61µs CPU time)\n\nRan 25 tests for test/WindowShopperToken.t.sol:WindowShopperTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 96898, ~: 97476)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 86477, ~: 86658)\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256,uint256) (runs: 256, μ: 176040, ~: 157600)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32897)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 64906)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 803002)\n[PASS] test_deployerCannotPullHolderBalance() (gas: 98762)\n[PASS] test_eoaDeployerAlsoReceivesWholeSupply() (gas: 679045)\n[PASS] test_metadata() (gas: 52817)\n[PASS] test_noMintOrAdminSelectorIsCallable() (gas: 677586)\n[PASS] test_rejectsPlainEther() (gas: 38701)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 916653)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 18913)\n[PASS] test_transferChainArrivesWholeAtEveryHop() (gas: 197610)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 146330)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 151896)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 98669)\n[PASS] test_transferFromSpendsAllowance() (gas: 210447)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrease() (gas: 183626)\n[PASS] test_transferMovesExactAmount() (gas: 90524)\n[PASS] test_transferOfZeroSucceeds() (gas: 44555)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 96195)\n[PASS] test_transferRevertsToZeroAddress() (gas: 91095)\n[PASS] test_transferToSelfKeepsBalance() (gas: 98785)\n[PASS] test_wholeSupplyMintedToDeployerInConstructor() (gas: 25230)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 8.94ms (27.90ms CPU time)\n\nRan 2 test suites in 9.87ms (9.25ms CPU time): 26 tests passed, 0 failed, 0 skipped (26 total tests)\n","passed":true},{"durationMs":49,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WindowShopperToken.approve(address,uint256)\",\"WindowShopperToken.transfer(address,uint256)\",\"WindowShopperToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":135,\"foundry.toml\":21,\"remappings.txt\":2,\"script/DeployWindowShopperToken.s.sol\":24,\"src/WindowShopperToken.sol\":37,\"test/DeployWindowShopperToken.t.sol\":19,\"test/WindowShopperToken.t.sol\":313},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":643,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":312,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/WindowShopperToken.sol:26: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"fad68b1d92fc3733f86be38e8786c9342256e6ca90a3586087db1c6b973c3475","verifiedTreeHash":"75833699f8d1220d8b8865666d8e6d44122a9e36","verifierVersion":"0.1.0+a490e3c0"}]}