{"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":"a3dd2626-0c8c-4759-b6dd-2af722722cf0","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"65dc61216ce2bb52ac14fcff28952be830b807055d6ee5809f88e3f630abfb79","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":"107e4dd3d8f2fd7027a77e5ade5c73c00e6713f7a6e822dee1b2662254401b27","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":"3402234a84fe262fd0009591f3aae52bc622bb8bc239ca08de43a30e1791acd8","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":"0d7e5fc0f064781842d2dd7935f184017f36be48e48c9d938501101ed67c6557","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":"f77fa1b5bd9dbf29e9e818901e7140326748574f9771537446f38142514c8f63","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":"5818a0821ab6148653b2e669bfb8b1e9682956b2a6c650cad4a0d7f4d3b76153","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":"585de534bed7ce649b488dde867b32e1e003346b4c0dd6671f9e3d5036d273c6","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"da6e03a4e420951fac8f5b13a12d2aeba8d0947bfd9b263fe5e374f9e1b81b3e","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: WheelPad (WHEELPAD).\nToken name: WheelPad\nToken symbol: WHEELPAD\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"b24d35c43f34bbbf2bbcc9c6b43c62c944402c4d0eb4cb3f46bfd9f3c04f2838","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"a3dd2626-0c8c-4759-b6dd-2af722722cf0","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-3207-wheelpad"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52167","feedbackHash":"3796041041de4a78afe6678284bbce1e64ea547071bd276c1187a454e69cf204","nodeKey":"audit_economics","submissionHash":"65dc61216ce2bb52ac14fcff28952be830b807055d6ee5809f88e3f630abfb79","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53923","feedbackHash":"ab2dd45ad85a957c5693efa7cd97bc03860112455d14560a38ad0ebe3ba98b98","nodeKey":"audit_flow","submissionHash":"107e4dd3d8f2fd7027a77e5ade5c73c00e6713f7a6e822dee1b2662254401b27","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53925","feedbackHash":"deb8aee9ac06158c63fa8d6770f6b39626a542da70aeed4b1816920aba1fa53e","nodeKey":"audit_judge","submissionHash":"3402234a84fe262fd0009591f3aae52bc622bb8bc239ca08de43a30e1791acd8","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52366","feedbackHash":"a091ab8fb6a67fb6d14752943fea763211d9571c0a8cd9922a5f15b0a732c65e","nodeKey":"audit_math","submissionHash":"0d7e5fc0f064781842d2dd7935f184017f36be48e48c9d938501101ed67c6557","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52165","feedbackHash":"eb0431f5be5f5ddb633ca00d1b7bf22417f9481b40f86379ebae3b54cfe2aacb","nodeKey":"audit_permissions","submissionHash":"f77fa1b5bd9dbf29e9e818901e7140326748574f9771537446f38142514c8f63","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51086","feedbackHash":"56c4e64a98c31fd0b1296b1e91c09f497a967bda3d9212214d31e16dd0ec3628","nodeKey":"build_contract_project","submissionHash":"5818a0821ab6148653b2e669bfb8b1e9682956b2a6c650cad4a0d7f4d3b76153","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51157","feedbackHash":"d3ae650cf93e6e712abe752a7cf1b0b2bacb5ecf70446e08014244702ec0c3ab","nodeKey":"manifest","submissionHash":"585de534bed7ce649b488dde867b32e1e003346b4c0dd6671f9e3d5036d273c6","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51488","feedbackHash":"73e17d9b7cc9cc74b6cf179b24f34a7a4502835c56d6dd5d9b48aa2b47aca159","nodeKey":"write_foundry_tests","submissionHash":"da6e03a4e420951fac8f5b13a12d2aeba8d0947bfd9b263fe5e374f9e1b81b3e","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"ddae1400bb061e379ba179c621526232406b59733d2cadc8b6c8be77232895fe","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1188f01303e45ecd","findings":[],"hash":"0d7e5fc0f064781842d2dd7935f184017f36be48e48c9d938501101ed67c6557","nodeId":"71db25dc-06a9-475a-950d-b56be5be8c78","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json` with zero findings and eight coverage rows.\n\n**Outcome:** WheelPad is a sixteen-line contract that inherits the unmodified OpenZeppelin v5.0.2 ERC20 and mints one billion tokens with 18 decimals to the deployer once. I found no defect in the Math Precision, Boundary or Numerical Gap areas, and none outside them severe enough to report.\n\n**What I verified, each with concrete inputs:**\n- The supply literal folds exactly to 1e27, matches the brief, and the launch splits of 10%, 80% and 10% divide with no remainder, so no launch flow can arrive short by rounding.\n- Transfers at 0, 1 wei, the full balance, balance plus one and uint256 max behave as the standard says: exact moves or typed reverts, never a panic or a wrap. Self-transfers at full balance are lossless.\n- Allowances at max never decrement, at max minus one decrement exactly, and an allowance short by one reverts with the typed error before any state change.\n- The sum of balances equals total supply after two hundred fragmented transfers and a 512-run fuzz, because the contract has no division, scaling, casts or decimals conversion to drift.\n- There is no payable, receive, fallback, external call or bytes decoding, so the Boundary guide's call-site and sentinel checks have nothing to reach. Value-bearing calls and unknown selectors revert.\n- The vendored ERC20 and Context files hash to the lock file's digests and to upstream v5.0.2 fetched from GitHub, so the arithmetic reviewed is the audited upstream code.\n\n**Leads rejected:** the aderyn large-numeric-literal note on line 10 is a style warning. The compiler evaluates the literal expression exactly at compile time, and the stored constant is the intended value with ample headroom.\n\n**Not reached:** the protected floor tests need the v4-core library and launch environment variables that are not in this tree, so I could not run them. The token is a plain ERC20 without transfer hooks, so nothing in its code taxes or blocks the factory, distributor or pool manager flows those tests exercise.\n\nThe scratch test directory was removed after the run. The untracked dotfiles in the working tree are environment artifacts that predate this task.","treeHash":null,"usage":{"cachedInputTokens":313335,"cost":{"source":"runtime","usdMicros":1664278},"inputTokens":194,"model":"claude-fable-5-1","outputTokens":9519,"runtime":"claude","turns":7,"wallClockMs":142259}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"733f63ff9321d57a","findings":[],"hash":"107e4dd3d8f2fd7027a77e5ade5c73c00e6713f7a6e822dee1b2662254401b27","nodeId":"0944a999-3a23-42fa-a674-98974a2f00e2","outcome":"completed","summary":"The review is complete and the findings file is written. No tracked file was changed.\n\n**Outcome: no defects found in the control-flow area.** `.imd-findings.json` holds an empty findings list and eight coverage rows, one per listed entry point plus five invariant rows.\n\n**What was checked**\n\n- **Execution Trace.** Both state-changing paths were traced through the vendored OpenZeppelin base. The allowance is spent before the balance moves, but both happen in one frame, so a failing transfer leaves the allowance untouched. Self-transfer, zero-value, zero-address sentinels, and the sticky max allowance all behave as the standard specifies. There are no external calls, hooks, fees, or stale reads.\n- **Periphery.** The six vendored OpenZeppelin files hash identically to the lock file and to the upstream v5.0.2 release fetched from GitHub. No extra files sit in the library directory. The runtime bytecode contains no DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL or STATICCALL in reachable code.\n- **First Principles.** The constructor's only assumption is that its immediate caller is the factory. The protected harness deploys via CREATE2 from the factory address, so that holds. The supply constant equals ten to the twenty-seventh, matching the brief. The ABI exposes nothing but the three standard mutators, and a 22-signature privileged-call battery from both the factory and a stranger reverts without moving supply or balances.\n\n**Leads from static analysis.** The aderyn \"large numeric literal\" note is a compile-time constant that evaluates correctly. It is not a defect and was not reported.\n\n**Not reached.** The Uniswap v4 seed and swap cannot run here because v4-core is not vendored. Since the token has no transfer customisation, nothing in my area can affect those flows, but only the network's harness executes them. This is recorded as an unreached row.\n\nThe existing suite of 36 tests and my seven scratch tests all pass. The scratch file lives under `test/scratch/`, which is ignored and not submitted.","treeHash":null,"usage":{"cachedInputTokens":635640,"cost":{"source":"runtime","usdMicros":2500447},"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14709,"runtime":"claude","turns":24,"wallClockMs":255660}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"96ecbe9236c400bb","findings":[{"citation":"resolved","description":"DEPENDENCIES.md and dependencies.lock.json state that lib/forge-std is unmodified forge-std v1.9.6 with per-file SHA-256 digests. Six files in lib/forge-std/src (StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IMulticall3.sol) hash differently from the lock. All six OpenZeppelin v5.0.2 files match. forge-std is used only by tests, so the token's creation and runtime bytecode are unaffected; this is a provenance-record inconsistency, not a code defect. Both lib/forge-std and dependencies.lock.json were introduced in the same commit (7ea2f42), so the lock was written against a different forge-std copy than the one vendored.","line":40,"path":"dependencies.lock.json","reproduction":"For each entry in dependencies.lock.json[1].files_sha256, compute sha256 of lib/forge-std/<rel>. Expected: digest equals the recorded value. Actual: lib/forge-std/src/Vm.sol hashes to 9ef7ee8c9a0a4fb18b830e85ce5cd31a56b97781e126ad1e7801389c49b0f408 instead of the recorded value; five other forge-std files also differ. All lib/openzeppelin-contracts files match.","severity":"info","snippet":"      \"src/Vm.sol\": \"37cdc22402df6c218ca65502e7fa2a24a3ce5b796eaaee330ad84fb9578bc73c\",","title":"dependencies.lock.json does not match six vendored forge-std files (test-only)"}],"hash":"3402234a84fe262fd0009591f3aae52bc622bb8bc239ca08de43a30e1791acd8","nodeId":"a27fd9de-4a0b-4b38-8e50-072a92db4625","outcome":"completed","summary":"The review is complete and the findings file is written. No tracked file was changed.\n\n**Outcome.** The WheelPad token is a plain, unmodified OpenZeppelin v5.0.2 ERC20 with a parameterless constructor that mints the full supply to the deployer. I found no code defect. All five specialists reported no findings, so there was nothing to reproduce or merge, and my own pass agrees with them.\n\n**What I verified against the code and by running it:**\n- Build is clean and all 60 existing tests pass, including the two invariant suites.\n- A scratch test deployed the token through a CREATE2 factory and confirmed exact supply, decimals, name and symbol, whole transfers factory to distributor to claimant, the approve and transferFrom revert and success paths, infinite-allowance handling, and that every admin selector in the protected floor's lists reverts.\n- The reachable-opcode scan from the protected test finds no DELEGATECALL, CALLCODE or SELFDESTRUCT in the runtime.\n- Creation and runtime bytecode are far below the size limits, and the empty constructorArgs in launch.json match the constructor.\n- The six vendored OpenZeppelin files hash-match the lock file, so the compiled ERC20 is upstream.\n- The aderyn large-literal lead evaluates to exactly the manifest supply and is style only.\n\n**One info finding kept.** Six test-only forge-std files in lib/forge-std differ from the digests recorded in dependencies.lock.json, which claims unmodified v1.9.6. This does not touch the token's bytecode. It is a provenance-record inconsistency, cited at the lock file's Vm.sol entry with the actual versus recorded hash.\n\n**Coverage record.** All three entry points are marked holds with reasons, plus five invariant rows covering fixed supply, factory deployability, forbidden opcodes and privileged calls, the aderyn lead, and dependency provenance.","treeHash":null,"usage":{"cachedInputTokens":276189,"cost":{"source":"runtime","usdMicros":1289625},"inputTokens":194,"model":"claude-fable-5-1","outputTokens":8143,"runtime":"claude","turns":7,"wallClockMs":172114}},{"artifacts":[],"attempt":1,"bundleHash":"f14ac8db1d7a5c37204348abeaf651f3d1b1e45e60e843955df65a08ffc90b4a","device":"080780b6898c2241","findings":[],"hash":"5818a0821ab6148653b2e669bfb8b1e9682956b2a6c650cad4a0d7f4d3b76153","nodeId":"97005753-40ff-4ef3-a743-f3f35fbf9a8e","outcome":"completed","summary":"Implemented WheelPad (WHEELPAD): 1,000,000,000 tokens, 18 decimals, minted once to the deployer.\n\nIncluded vendored dependencies, deployment/security documentation, and success, failure, fuzz, and invariant tests.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passed.\n- `forge test` passed: 36 tests using the supplied fuzz seed.\n- `forge fmt --check` passed.\n\nThe external protected launch harness was unavailable locally.","treeHash":"0bb2d4122ef496beb6714e0d3927f4edc514c196","usage":{"cachedInputTokens":387968,"inputTokens":43766,"model":"gpt-6-astra","outputTokens":15242,"runtime":"codex","turns":5,"wallClockMs":433613}},{"artifacts":[],"attempt":1,"bundleHash":"32e9b55665d7ffb3683679820e0f09a74a7f12c949a6cb9b3e268aec17a42d38","device":"a6d6df9f16a14651","findings":[],"hash":"585de534bed7ce649b488dde867b32e1e003346b4c0dd6671f9e3d5036d273c6","nodeId":"c74b5b06-4856-4f72-8d9c-9ea13568febd","outcome":"completed","summary":"Created [launch.json](/home/imd/.identitymd/work/a3dd2626-0c8c-4759-b6dd-2af722722cf0/c74b5b06-4856-4f72-8d9c-9ea13568febd/launch.json) matching WheelPad’s constructor, supply, and required pool/economics.\n\n`forge build` succeeded; all 36 tests passed with the supplied fuzz seed. Only `launch.json` is changed for submission.","treeHash":"888cde6ecb91a5bb3146d5d925b2c444562f179c","usage":{"cachedInputTokens":234880,"cost":{"source":"estimated","usdMicros":604400},"inputTokens":24467,"model":"gpt-6-astra","outputTokens":2497,"runtime":"codex","turns":3,"wallClockMs":76637}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1ca477e8d9b58040","findings":[],"hash":"65dc61216ce2bb52ac14fcff28952be830b807055d6ee5809f88e3f630abfb79","nodeId":"2edcfc80-ce58-40c3-910f-4e0c9891b06c","outcome":"completed","summary":"The review is complete. `.imd-findings.json` holds an empty findings list and nine coverage rows, and no tracked source, library or config file was changed.\n\n**Result: no defects in the economics area.** WheelPad is a 15-line contract inheriting the vendored OpenZeppelin v5.0.2 ERC20 with one constructor mint. Every vendored OZ file matched its SHA-256 in the lock file, so the inherited transfer logic is the audited upstream code.\n\nWhat I verified against the Economic Security, Invariant and Flow Gap guides, with a scratch Foundry suite that passed in full:\n\n- **Supply invariant.** The constructor is the only writer of total supply and mints exactly 1e27 to its immediate caller. Deployed through a CREATE2 factory, the factory held everything and no other address held anything.\n- **Conservation.** Sum of balances equals total supply under fuzzed transfer, transferFrom, self-transfer and infinite allowance, in addition to the project's own stateful invariant run with zero reverts.\n- **Launch flows arrive whole.** Swarm share to a distributor, distributor claim, pool seed, remainder transfer, and a pool-manager style push and pull all moved the exact amounts. There is no exemption logic, fee, hook or callback to get wrong.\n- **No external surface.** The reachable runtime contains no CALL-family, CREATE or SELFDESTRUCT opcode, so there is no reentrancy or dependency-failure path. ETH and unknown selectors revert.\n- **Sentinels.** Transfers and approvals to the zero address revert. Tokens sent to the token's own address are stranded by design and the README says so.\n\nThe static-analysis lead on the large numeric literal evaluates to exactly 1e27 and is a style note only. Trust assumptions are minimal: there is no owner, minter, pauser or upgrade path, and the deployer's only distinction is receiving the supply, which the factory launch requires.\n\nBoth protected tests remain outside what this standalone tree can run, since they import the network's LaunchLiquidity and PoolManager harness. Nothing in the token gives them a path to fail.","treeHash":null,"usage":{"cachedInputTokens":687760,"cost":{"source":"runtime","usdMicros":2325525},"inputTokens":354,"model":"claude-fable-5-1","outputTokens":13289,"runtime":"claude","turns":30,"wallClockMs":199206}},{"artifacts":[],"attempt":1,"bundleHash":"82afdf48ab9b3b146e011ff4c51bb16302b901a27b707eba5ee4ed7ce5028519","device":"5835e48821d8827d","findings":[],"hash":"da6e03a4e420951fac8f5b13a12d2aeba8d0947bfd9b263fe5e374f9e1b81b3e","nodeId":"3d230157-884f-43b4-bf52-fea2583a89b6","outcome":"completed","summary":"I added two test files on top of the existing suite, and I found no defects in `WheelPad`. `forge build` and `forge test` pass with the verifier's seed: 60 tests across 4 suites, none failing. The token is a plain OpenZeppelin ERC-20 that mints 1,000,000,000 × 10¹⁸ to whoever deploys it and has no owner, mint, burn, pause or upgrade functions. Because there was nothing to report, I didn't write `.imd-findings.json`.\n\nThe existing 36 tests (`test/WheelPad.t.sol`, `test/WheelPad.invariant.t.sol`) were already thorough and I left them unchanged.\n\n**`test/WheelPad.edge.t.sol`** (20 tests):\n- **Launch in one call:** a helper contract deploys the token at a predictable address and sends the 10% swarm share, the pool seed (any share from 0 to 90%) and the remainder, all in one transaction. The test checks each recipient gets exactly its amount and the deployer keeps nothing. Deploying again with the same address seed reverts.\n- **Boundaries:** spending an exact balance or allowance, then 1 wei more, fails. A maximum allowance can't spend more than the balance. An allowance one below the maximum is reduced on each spend, while the maximum isn't. The address zero can't send or approve.\n- **Failed calls leave no trace:** no events, no balance or allowance changes. Spending an allowance emits only a `Transfer` event.\n- **Bad input is rejected:** truncated or malformed call data, a dirty address argument, and spending through the token's own address.\n- **Code scan:** the token's deployed code contains no `DELEGATECALL`, `CALLCODE` or `SELFDESTRUCT` the code can actually reach. This mirrors the launch's own check.\n- **Fuzz properties:**\n  - random call data from random callers never changes the supply or any balance;\n  - transfers between any two addresses, including to oneself, update balances correctly and keep the supply fixed;\n  - a new approval replaces the old one rather than adding to it;\n  - a maximum allowance survives any spending;\n  - a failed `transferFrom` uses up no allowance;\n  - strangers can't move anything.\n\n**`test/WheelPad.ghost.invariant.t.sol`** (4 invariants, random call sequences):\n- **What the handler does:** it acts as the deployer, the token's own address, named users and up to 12 random addresses. It mixes valid calls with invalid ones (zero address, over balance, over allowance) and also sends random call data. Every outcome is checked against the rules, and the handler never reverts itself.\n- **What must hold after every sequence:**\n  - the supply stays fixed and all of it is held by the tracked addresses;\n  - each balance equals its starting amount plus what came in minus what went out;\n  - no call broke the balance or allowance rules;\n  - the token never holds ETH.\n- **No empty runs:** a final check fails any run where no transfer succeeded or no invalid call was attempted.\n\nI didn't install anything, and all edits are under `test/`. The two new files are not committed.","treeHash":"d23c1c51a59ab6ccca4298686efde42facc4c65d","usage":{"cachedInputTokens":294898,"cost":{"source":"runtime","usdMicros":760817},"inputTokens":15,"model":"claude-opus-5-5","outputTokens":14562,"runtime":"claude","turns":10,"wallClockMs":148332}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e12f98dda6acc55f","findings":[],"hash":"f77fa1b5bd9dbf29e9e818901e7140326748574f9771537446f38142514c8f63","nodeId":"a041419d-2385-4960-92d4-9db92d8cbea4","outcome":"completed","summary":"The permissions review of WheelPad is complete and found no defects. The findings file at `.imd-findings.json` holds an empty findings list and nine coverage rows, all `holds`. No tracked file was changed, and the scratch test directory was removed.\n\n**What the token is.** A single contract inheriting unmodified OpenZeppelin v5.0.2 ERC20, with one constructor that mints 1,000,000,000 tokens at 18 decimals to the immediate caller. I verified all five vendored library files byte-for-byte against upstream v5.0.2 over the network. The compiled ABI has exactly three state-changing functions, the ones the verifier listed, plus views, with no owner, initializer, receive or fallback.\n\n**Access Control pass.** There are no roles, modifiers or inline permission checks to map. The only writers of balances and allowances are reached through `transfer`, `transferFrom` and `approve`, each keyed on `msg.sender` through the stock Context contract. The mint branch inside the library is unreachable after construction because a zero sender is rejected both by the allowance check and by the transfer helper, which I confirmed with a probe calling `transferFrom` from the zero address at amounts 0 and 1. No deployer, factory or other address can pull a holder's balance without that holder's allowance.\n\n**Asymmetry pass.** The approve and transferFrom pair writes the same allowance slot in mirror directions. The two deviations are OpenZeppelin's standard behaviour: an unlimited allowance never decrements, and spending emits no Approval event. Both are documented in the README and are not defects. Self-transfer, zero-amount and failure paths are atomic and symmetric.\n\n**Trust Gap pass.** There is no privileged actor, price, fee or formula, so none of the access-by-economics seams exist. The factory holds the supply as an ordinary balance with no powers over other holders.\n\n**What I could not run.** The protected launch test needs the network's Uniswap v4 PoolManager harness, which this tree does not vendor. I reproduced the parts that do not need it: a CREATE2 deploy credits the factory with the whole supply, launch-style transfers are exact, and the runtime contains no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT. The pool seed and swap paths were not executed here. The project's own 36 unit, fuzz and invariant tests pass, and the formatting check passes. The one static-analysis lead, a large numeric literal, is a compile-time constant of 10^27 and is style only.","treeHash":null,"usage":{"cachedInputTokens":501956,"cost":{"source":"runtime","usdMicros":2303113},"inputTokens":258,"model":"claude-fable-5-1","outputTokens":11955,"runtime":"claude","turns":20,"wallClockMs":179336}}],"verification":[{"checks":[{"durationMs":1154,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.08s\nCompiler run successful!\n","passed":true},{"durationMs":3446,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 35 tests for test/WheelPad.t.sol:WheelPadTest\n[PASS] testFuzz_ApprovalStoresExactValue(uint256) (runs: 512, μ: 73519, ~: 73746)\n[PASS] testFuzz_DeploymentMintsOnlyToImmediateCaller(address) (runs: 512, μ: 587611, ~: 587611)\n[PASS] testFuzz_RevertWhenTransferExceedsBalance(uint256,uint256) (runs: 512, μ: 126856, ~: 127213)\nLogs:\n  Bound result 2\n  Bound result 22140\n\n[PASS] testFuzz_RevertWhenTransferFromExceedsAllowance(uint256,uint256) (runs: 512, μ: 122766, ~: 123501)\nLogs:\n  Bound result 12992\n  Bound result 50000000000000000000\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 93045, ~: 93207)\nLogs:\n  Bound result 15463\n\n[PASS] testFuzz_TransferFromUpdatesBalancesAndAllowance(uint256,uint256) (runs: 512, μ: 162474, ~: 164874)\nLogs:\n  Bound result 381136909738265352542296861\n  Bound result 231046732396205261045247409\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 163674)\n[PASS] test_ApprovalEmitsEventAndDoesNotMoveTokens() (gas: 88842)\n[PASS] test_ApprovalIsIndependentOfBalanceAndOtherOwners() (gas: 138078)\n[PASS] test_ConstructorEmitsMintEvent() (gas: 575009)\n[PASS] test_DelegatedSelfTransferConsumesAllowanceWithoutMovingBalance() (gas: 103182)\n[PASS] test_DeployerCannotTakeAnotherHoldersTokens() (gas: 157936)\n[PASS] test_FactoryReceivesEntireSupplyAndLaunchTransfersAreExact() (gas: 1123000)\n[PASS] test_FailedTransferFromPreservesAllowanceWhenBalanceIsInsufficient() (gas: 126108)\n[PASS] test_FailedTransferFromPreservesAllowanceWhenRecipientIsZero() (gas: 103779)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 204172)\n[PASS] test_MetadataAndInitialSupply() (gas: 107523)\n[PASS] test_NoMintBurnAdminOrUpgradeEntrypoints() (gas: 802452)\n[PASS] test_RejectsNativeCurrencyAndUnknownCalls() (gas: 109039)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 54530)\n[PASS] test_RevertWhenOwnerCallsTransferFromWithoutSelfApproval() (gas: 35680)\n[PASS] test_RevertWhenSelfTransferExceedsBalance() (gas: 40341)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 44932)\n[PASS] test_RevertWhenTransferFromHasInsufficientAllowance() (gas: 115685)\n[PASS] test_RevertWhenTransferIsMaximumUint() (gas: 35598)\n[PASS] test_RevertWhenTransferToZeroIncludingZeroAmount() (gas: 71905)\n[PASS] test_RevertWhenUnapprovedCallerUsesAnotherSpendersAllowance() (gas: 105341)\n[PASS] test_RevertWhenZeroTransferFromUsesInvalidAddresses() (gas: 62761)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51420)\n[PASS] test_TransferEmitsEventAndReturnsTrue() (gas: 91516)\n[PASS] test_TransferEntireSupply() (gas: 75744)\n[PASS] test_TransferFromSpendsFiniteAllowanceAndEmitsTransfer() (gas: 244319)\n[PASS] test_TransferToTokenContractDoesNotBurn() (gas: 76086)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 63145)\n[PASS] test_ZeroTransferFromNeedsNoAllowanceForValidAddresses() (gas: 81491)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 23.17ms (124.61ms CPU time)\n\nRan 1 test for test/WheelPad.invariant.t.sol:WheelPadInvariantTest\n[PASS]\nWheelPadInvariantTest invariants:\n[PASS] invariant_BalancesAndAllowancesMatchIndependentModel\n[PASS] invariant_TotalSupplyAndAggregateBalancesStayFixed\n WheelPadInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+--------------+-------+---------+----------╮\n| Contract        | Selector     | Calls | Reverts | Discards |\n+=============================================================+\n| WheelPadHandler | approve      | 2705  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| WheelPadHandler | transfer     | 2724  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| WheelPadHandler | transferFrom | 2763  | 0       | 0        |\n╰-----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 50000000000000000000\n  Bound result 509356003816633026727334238\n  Bound result 0\n  Bound result 5250\n  Bound result 0\n  Bound result 2068\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 11\n  Bound result 6127\n  Bound result 0\n  Bound result 356019540767253311609861152\n  Bound result 278\n  Bound result 5319\n  Bound result 4195219154969395085521\n  Bound result 8\n  Bound result 0\n  Bound result 0\n  Bound result 637370392474707364690499496\n  Bound result 0\n  Bound result 5881\n  Bound result 0\n  Bound result 157198259\n  Bound result 8\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.35s (3.35s CPU time)\n\nRan 2 test suites in 3.35s (3.37s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":37,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WheelPad.approve(address,uint256)\",\"WheelPad.transfer(address,uint256)\",\"WheelPad.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":20,\"README.md\":114,\"SECURITY.md\":34,\"dependencies.lock.json\":52,\"foundry.toml\":21,\"remappings.txt\":2,\"src/WheelPad.sol\":16,\"test/WheelPad.invariant.t.sol\":114,\"test/WheelPad.t.sol\":395,\"test/helpers/WheelPadFactory.sol\":15},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":429,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":200,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/WheelPad.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5818a0821ab6148653b2e669bfb8b1e9682956b2a6c650cad4a0d7f4d3b76153","verifiedTreeHash":"0bb2d4122ef496beb6714e0d3927f4edc514c196","verifierVersion":"0.1.0+9b8047c1"},{"checks":[{"durationMs":1097,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.02s\nCompiler run successful!\n","passed":true},{"durationMs":3331,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 35 tests for test/WheelPad.t.sol:WheelPadTest\n[PASS] testFuzz_ApprovalStoresExactValue(uint256) (runs: 512, μ: 73519, ~: 73746)\n[PASS] testFuzz_DeploymentMintsOnlyToImmediateCaller(address) (runs: 512, μ: 587611, ~: 587611)\n[PASS] testFuzz_RevertWhenTransferExceedsBalance(uint256,uint256) (runs: 512, μ: 126856, ~: 127213)\nLogs:\n  Bound result 2\n  Bound result 22140\n\n[PASS] testFuzz_RevertWhenTransferFromExceedsAllowance(uint256,uint256) (runs: 512, μ: 122766, ~: 123501)\nLogs:\n  Bound result 163908484616348416071001459\n  Bound result 242408184000288862541816374\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 93045, ~: 93207)\nLogs:\n  Bound result 32453251254291907077932\n\n[PASS] testFuzz_TransferFromUpdatesBalancesAndAllowance(uint256,uint256) (runs: 512, μ: 162474, ~: 164874)\nLogs:\n  Bound result 153991827826167233952201504\n  Bound result 20048000678360761639635449\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 163674)\n[PASS] test_ApprovalEmitsEventAndDoesNotMoveTokens() (gas: 88842)\n[PASS] test_ApprovalIsIndependentOfBalanceAndOtherOwners() (gas: 138078)\n[PASS] test_ConstructorEmitsMintEvent() (gas: 575009)\n[PASS] test_DelegatedSelfTransferConsumesAllowanceWithoutMovingBalance() (gas: 103182)\n[PASS] test_DeployerCannotTakeAnotherHoldersTokens() (gas: 157936)\n[PASS] test_FactoryReceivesEntireSupplyAndLaunchTransfersAreExact() (gas: 1123000)\n[PASS] test_FailedTransferFromPreservesAllowanceWhenBalanceIsInsufficient() (gas: 126108)\n[PASS] test_FailedTransferFromPreservesAllowanceWhenRecipientIsZero() (gas: 103779)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 204172)\n[PASS] test_MetadataAndInitialSupply() (gas: 107523)\n[PASS] test_NoMintBurnAdminOrUpgradeEntrypoints() (gas: 802452)\n[PASS] test_RejectsNativeCurrencyAndUnknownCalls() (gas: 109039)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 54530)\n[PASS] test_RevertWhenOwnerCallsTransferFromWithoutSelfApproval() (gas: 35680)\n[PASS] test_RevertWhenSelfTransferExceedsBalance() (gas: 40341)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 44932)\n[PASS] test_RevertWhenTransferFromHasInsufficientAllowance() (gas: 115685)\n[PASS] test_RevertWhenTransferIsMaximumUint() (gas: 35598)\n[PASS] test_RevertWhenTransferToZeroIncludingZeroAmount() (gas: 71905)\n[PASS] test_RevertWhenUnapprovedCallerUsesAnotherSpendersAllowance() (gas: 105341)\n[PASS] test_RevertWhenZeroTransferFromUsesInvalidAddresses() (gas: 62761)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51420)\n[PASS] test_TransferEmitsEventAndReturnsTrue() (gas: 91516)\n[PASS] test_TransferEntireSupply() (gas: 75744)\n[PASS] test_TransferFromSpendsFiniteAllowanceAndEmitsTransfer() (gas: 244319)\n[PASS] test_TransferToTokenContractDoesNotBurn() (gas: 76086)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 63145)\n[PASS] test_ZeroTransferFromNeedsNoAllowanceForValidAddresses() (gas: 81491)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 19.74ms (115.07ms CPU time)\n\nRan 1 test for test/WheelPad.invariant.t.sol:WheelPadInvariantTest\n[PASS]\nWheelPadInvariantTest invariants:\n[PASS] invariant_BalancesAndAllowancesMatchIndependentModel\n[PASS] invariant_TotalSupplyAndAggregateBalancesStayFixed\n WheelPadInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+--------------+-------+---------+----------╮\n| Contract        | Selector     | Calls | Reverts | Discards |\n+=============================================================+\n| WheelPadHandler | approve      | 2705  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| WheelPadHandler | transfer     | 2724  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| WheelPadHandler | transferFrom | 2763  | 0       | 0        |\n╰-----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 50000000000000000000\n  Bound result 509356003816633026727334238\n  Bound result 0\n  Bound result 5250\n  Bound result 0\n  Bound result 2068\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 11\n  Bound result 6127\n  Bound result 0\n  Bound result 356019540767253311609861152\n  Bound result 278\n  Bound result 5319\n  Bound result 4195219154969395085521\n  Bound result 8\n  Bound result 0\n  Bound result 0\n  Bound result 637370392474707364690499496\n  Bound result 0\n  Bound result 5881\n  Bound result 0\n  Bound result 157198259\n  Bound result 8\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.23s (3.23s CPU time)\n\nRan 2 test suites in 3.23s (3.25s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":37,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WheelPad.approve(address,uint256)\",\"WheelPad.transfer(address,uint256)\",\"WheelPad.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":20,\"README.md\":114,\"SECURITY.md\":34,\"dependencies.lock.json\":52,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/WheelPad.sol\":16,\"test/WheelPad.invariant.t.sol\":114,\"test/WheelPad.t.sol\":395,\"test/helpers/WheelPadFactory.sol\":15},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"585de534bed7ce649b488dde867b32e1e003346b4c0dd6671f9e3d5036d273c6","verifiedTreeHash":"888cde6ecb91a5bb3146d5d925b2c444562f179c","verifierVersion":"0.1.0+9b8047c1"},{"checks":[{"durationMs":1858,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.78s\nCompiler run successful!\n","passed":true},{"durationMs":3409,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 20 tests for test/WheelPad.edge.t.sol:WheelPadEdgeTest\n[PASS] testFuzz_ApproveOverwritesRatherThanAccumulates(uint256,uint256) (runs: 1000, μ: 110753, ~: 110907)\n[PASS] testFuzz_ArbitraryCalldataCannotChangeSupplyOrBalances(address,bytes) (runs: 1000, μ: 126929, ~: 126744)\n[PASS] testFuzz_InfiniteAllowanceSurvivesAnySpend(uint256,uint256) (runs: 1000, μ: 213768, ~: 215046)\nLogs:\n  Bound result 1\n  Bound result 58486271497153702651294920\n\n[PASS] testFuzz_LaunchFlowInOneCallDeliversExactAmounts(bytes32,uint256) (runs: 256, μ: 1225808, ~: 1226811)\nLogs:\n  Bound result 8153\n\n[PASS] testFuzz_NonHolderCannotMoveAnything(address,uint256) (runs: 1000, μ: 75149, ~: 75396)\nLogs:\n  Bound result 482822165799189495564764820\n\n[PASS] testFuzz_TransferBetweenArbitraryHolders(address,address,uint256,uint256) (runs: 1000, μ: 166645, ~: 171336)\nLogs:\n  Bound result 1040207439480116556469671607443835120361485387737\n  Bound result 780072696990694616889947835835531444415353038590\n  Bound result 5320458355859337\n  Bound result 2335248549\n\n[PASS] testFuzz_TransferFromRevertsWhenBalanceBelowAllowance(uint256,uint256) (runs: 1000, μ: 173363, ~: 173890)\nLogs:\n  Bound result 999999999999999999999999998\n  Bound result 1000000000000000000000000000\n\n[PASS] test_ApprovingTokenContractGivesItNoPower() (gas: 152907)\n[PASS] test_EachDeploymentIsIndependent() (gas: 682253)\n[PASS] test_FailedCallsLeaveNoTrace() (gas: 155061)\n[PASS] test_MalformedCalldataIsRejected() (gas: 83223)\n[PASS] test_MaxAllowanceCannotExceedBalance() (gas: 162927)\n[PASS] test_MaxMinusOneAllowanceIsDecremented() (gas: 123952)\n[PASS] test_RuntimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2473308)\n[PASS] test_SameSaltCannotRedeployOverAnExistingToken() (gas: 1040469102)\n[PASS] test_SelfApprovalAllowsOwnerTransferFrom() (gas: 149321)\n[PASS] test_SpendingAllowanceDoesNotEmitApproval() (gas: 120957)\n[PASS] test_TransferExactBalanceThenOneWeiMoreFails() (gas: 138421)\n[PASS] test_TransferFromExactAllowanceThenOneWeiMoreFails() (gas: 146753)\n[PASS] test_ZeroAddressCannotBeImpersonatedToSpend() (gas: 127641)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 623.45ms (1.59s CPU time)\n\nRan 4 tests for test/WheelPad.ghost.invariant.t.sol:WheelPadGhostInvariantTest\n[PASS] invariant_BalancesMatchGhostFlows() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| WheelPadGhostHandler | addActor     | 1682  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | approve      | 1637  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | poke         | 1634  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | transfer     | 1671  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | transferFrom | 1568  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 91\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639944\n  Bound result 0\n  Bound result 0\n  Bound result 15000000000000000000\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 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 378398739564852157674788946\n  Bound result 0\n  Bound result 81280017337115256053305925289732226824731854882018937312762656609989631018183\n  Bound result 0\n  Bound result 0\n\n[PASS] invariant_NativeCurrencyNeverHeld() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| WheelPadGhostHandler | addActor     | 1682  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | approve      | 1637  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | poke         | 1634  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | transfer     | 1671  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | transferFrom | 1568  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 91\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639944\n  Bound result 0\n  Bound result 0\n  Bound result 15000000000000000000\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 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 378398739564852157674788946\n  Bound result 0\n  Bound result 81280017337115256053305925289732226824731854882018937312762656609989631018183\n  Bound result 0\n  Bound result 0\n\n[PASS] invariant_NoCallBrokeTheRules() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| WheelPadGhostHandler | addActor     | 1682  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | approve      | 1637  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | poke         | 1634  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | transfer     | 1671  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | transferFrom | 1568  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 91\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639944\n  Bound result 0\n  Bound result 0\n  Bound result 15000000000000000000\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 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 378398739564852157674788946\n  Bound result 0\n  Bound result 81280017337115256053305925289732226824731854882018937312762656609989631018183\n  Bound result 0\n  Bound result 0\n\n[PASS] invariant_SupplyIsFixedAndFullyAccountedFor() (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| WheelPadGhostHandler | addActor     | 3294  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | approve      | 3299  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | poke         | 3316  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | transfer     | 3276  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| WheelPadGhostHandler | transferFrom | 3199  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 187259140458679556952481487282246614184162098243313464\n  Bound result 17421\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129640116\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 963204426014882706149178189\n  Bound result 931\n  Bound result 86\n  Bound result 0\n  Bound result 0\n  Bound result 1744951362920238263560419716893320130206692938732\n  Bound result 15000000000000000000\n  Bound result 42302429819082623365999127335112675471891578911466549455909343697324960707262\n  Bound result 0\n  Bound result 9997\n  Bound result 0\n  Bound result 0\n  Bound result 253\n  Bound result 0\n  Bound result 15000000000000000000\n  Bound result 0\n  Bound result 268\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.19s (5.49s CPU time)\n\nRan 35 tests for test/WheelPad.t.sol:WheelPadTest\n[PASS] testFuzz_ApprovalStoresExactValue(uint256) (runs: 512, μ: 73601, ~: 73746)\n[PASS] testFuzz_DeploymentMintsOnlyToImmediateCaller(address) (runs: 512, μ: 587611, ~: 587611)\n[PASS] testFuzz_RevertWhenTransferExceedsBalance(uint256,uint256) (runs: 512, μ: 126985, ~: 127243)\nLogs:\n  Bound result 999999999999999999999999999\n  Bound result 22140\n\n[PASS] testFuzz_RevertWhenTransferFromExceedsAllowance(uint256,uint256) (runs: 512, μ: 122939, ~: 123503)\nLogs:\n  Bound result 23190\n  Bound result 22138\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 93080, ~: 93395)\nLogs:\n  Bound result 795447332648835708827523361\n\n[PASS] testFuzz_TransferFromUpdatesBalancesAndAllowance(uint256,uint256) (runs: 512, μ: 163092, ~: 164878)\nLogs:\n  Bound result 3037\n  Bound result 243\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 163674)\n[PASS] test_ApprovalEmitsEventAndDoesNotMoveTokens() (gas: 88842)\n[PASS] test_ApprovalIsIndependentOfBalanceAndOtherOwners() (gas: 138078)\n[PASS] test_ConstructorEmitsMintEvent() (gas: 575009)\n[PASS] test_DelegatedSelfTransferConsumesAllowanceWithoutMovingBalance() (gas: 103182)\n[PASS] test_DeployerCannotTakeAnotherHoldersTokens() (gas: 157936)\n[PASS] test_FactoryReceivesEntireSupplyAndLaunchTransfersAreExact() (gas: 1123000)\n[PASS] test_FailedTransferFromPreservesAllowanceWhenBalanceIsInsufficient() (gas: 126108)\n[PASS] test_FailedTransferFromPreservesAllowanceWhenRecipientIsZero() (gas: 103779)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 204172)\n[PASS] test_MetadataAndInitialSupply() (gas: 107523)\n[PASS] test_NoMintBurnAdminOrUpgradeEntrypoints() (gas: 802452)\n[PASS] test_RejectsNativeCurrencyAndUnknownCalls() (gas: 109039)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 54530)\n[PASS] test_RevertWhenOwnerCallsTransferFromWithoutSelfApproval() (gas: 35680)\n[PASS] test_RevertWhenSelfTransferExceedsBalance() (gas: 40341)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 44932)\n[PASS] test_RevertWhenTransferFromHasInsufficientAllowance() (gas: 115685)\n[PASS] test_RevertWhenTransferIsMaximumUint() (gas: 35598)\n[PASS] test_RevertWhenTransferToZeroIncludingZeroAmount() (gas: 71905)\n[PASS] test_RevertWhenUnapprovedCallerUsesAnotherSpendersAllowance() (gas: 105341)\n[PASS] test_RevertWhenZeroTransferFromUsesInvalidAddresses() (gas: 62761)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51420)\n[PASS] test_TransferEmitsEventAndReturnsTrue() (gas: 91516)\n[PASS] test_TransferEntireSupply() (gas: 75744)\n[PASS] test_TransferFromSpendsFiniteAllowanceAndEmitsTransfer() (gas: 244319)\n[PASS] test_TransferToTokenContractDoesNotBurn() (gas: 76086)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 63145)\n[PASS] test_ZeroTransferFromNeedsNoAllowanceForValidAddresses() (gas: 81491)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 2.19s (3.08s CPU time)\n\nRan 1 test for test/WheelPad.invariant.t.sol:WheelPadInvariantTest\n[PASS]\nWheelPadInvariantTest invariants:\n[PASS] invariant_BalancesAndAllowancesMatchIndependentModel\n[PASS] invariant_TotalSupplyAndAggregateBalancesStayFixed\n WheelPadInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+--------------+-------+---------+----------╮\n| Contract        | Selector     | Calls | Reverts | Discards |\n+=============================================================+\n| WheelPadHandler | approve      | 2705  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| WheelPadHandler | transfer     | 2724  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| WheelPadHandler | transferFrom | 2763  | 0       | 0        |\n╰-----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 95\n  Bound result 0\n  Bound result 0\n  Bound result 5224\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 30000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 393860417849846705877608448\n  Bound result 276\n  Bound result 140188991855308653467622167\n  Bound result 4195219154969395085521\n  Bound result 3\n  Bound result 0\n  Bound result 95\n  Bound result 215241506901181881942663808\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.31s (3.31s CPU time)\n\nRan 4 test suites in 3.32s (8.32s CPU time): 60 tests passed, 0 failed, 0 skipped (60 total tests)\n","passed":true},{"durationMs":65,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WheelPad.approve(address,uint256)\",\"WheelPad.transfer(address,uint256)\",\"WheelPad.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":20,\"README.md\":114,\"SECURITY.md\":34,\"dependencies.lock.json\":52,\"foundry.toml\":21,\"remappings.txt\":2,\"src/WheelPad.sol\":16,\"test/WheelPad.edge.t.sol\":321,\"test/WheelPad.ghost.invariant.t.sol\":203,\"test/WheelPad.invariant.t.sol\":114,\"test/WheelPad.t.sol\":395,\"test/helpers/WheelPadFactory.sol\":15},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"da6e03a4e420951fac8f5b13a12d2aeba8d0947bfd9b263fe5e374f9e1b81b3e","verifiedTreeHash":"d23c1c51a59ab6ccca4298686efde42facc4c65d","verifierVersion":"0.1.0+9b8047c1"}]}