{"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":"39305c67-53a3-4412-abca-ac2fdb21d6a4","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"83b91b2a7e3beb6394d517975c25943049e267fddca604fcfe22bb7f493ae281","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"6cd89354431d4cf6f099e583d6701820ea15607b36eae21c073f68b5c4f1044f","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"b8f36e0c5482f779c36afa0bbba6193acbb0f1404f5095905f7a049a0871f293","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"9a91b1e6d10e12f0546f29f63721dd1a288ab7540345390d6b20ad705df54f8d","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"ea63e9a291b773a29e5cb5bd6e1fec51becb7e988de263b31bfb937a65c6a126","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"a79820663ef6b43780b2cd07520fe8757e13c238363a1cd75c0f2fa5bb4c8b27","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"f522e10d9e356e92533e92a5fd284e1484e6afd5acf9e08cf92942e406cc1e4c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"87cd11d6e3b7c673eb86c81f80402e43fd30a19f2c841f5f19081226af9e9fac","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Perkshire IMDway (PERK).\nToken name: Perkshire IMDway\nToken symbol: PERK\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"b83bc8772bcfc0f66415f9411ea0ab1c5caeaa6548b4f5d4892ba66e772e42c3","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"39305c67-53a3-4412-abca-ac2fdb21d6a4","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1663-perkshire-imdway"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52127","feedbackHash":"4ba892c89eb61dfa9cb06ea324922c95eb01ca83a562d90d1553bf8e16c4f3ef","nodeKey":"audit_economics","submissionHash":"83b91b2a7e3beb6394d517975c25943049e267fddca604fcfe22bb7f493ae281","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52017","feedbackHash":"9644de7d5565defde5015ee8a60c4c6599c6a1defa6858de1fd3cf6480622cbd","nodeKey":"audit_flow","submissionHash":"6cd89354431d4cf6f099e583d6701820ea15607b36eae21c073f68b5c4f1044f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51483","feedbackHash":"3372d3bcf1292998f95687409efe9af516e90c10544f6cf2d846472c8fdac876","nodeKey":"audit_judge","submissionHash":"b8f36e0c5482f779c36afa0bbba6193acbb0f1404f5095905f7a049a0871f293","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51250","feedbackHash":"0284ac5b2499ad4d3b10d2bca07a172fdbe4aa0e6c3c44e7841709675b968b1b","nodeKey":"audit_math","submissionHash":"9a91b1e6d10e12f0546f29f63721dd1a288ab7540345390d6b20ad705df54f8d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51468","feedbackHash":"7308ef21aeb6dcd43b3a2718b83d08b033aaf5e57f90f2512ad3fa64b1aa7e49","nodeKey":"audit_permissions","submissionHash":"ea63e9a291b773a29e5cb5bd6e1fec51becb7e988de263b31bfb937a65c6a126","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52176","feedbackHash":"5b801d70b79c9057cba1a3e0d9c98d111f488b92ae8af9bd15a8c388c3c06dad","nodeKey":"build_contract_project","submissionHash":"a79820663ef6b43780b2cd07520fe8757e13c238363a1cd75c0f2fa5bb4c8b27","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51234","feedbackHash":"12cc62d307dbfce255b36afd52017fd0d45dab7a33042bf6e7acbba935fc629c","nodeKey":"manifest","submissionHash":"f522e10d9e356e92533e92a5fd284e1484e6afd5acf9e08cf92942e406cc1e4c","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52178","feedbackHash":"2e7dcab901b5b5284ebf43ed711d5f0789509712d13f4b57cf4ca3e5f0e15505","nodeKey":"write_foundry_tests","submissionHash":"87cd11d6e3b7c673eb86c81f80402e43fd30a19f2c841f5f19081226af9e9fac","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"2b23e9e95bf707e33aa72a53dec8865942cd3f98455b6ae533c7e7446c30fe23","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9df7d5d52e83c572","findings":[],"hash":"6cd89354431d4cf6f099e583d6701820ea15607b36eae21c073f68b5c4f1044f","nodeId":"da2a2ece-cef2-4ff1-910d-1a996d078497","outcome":"completed","summary":"The review is complete. The findings file is written with no defects and a full coverage record. Nothing else is pending.\n\n**Outcome: no defects found.** The token is a textbook fixed-supply OpenZeppelin ERC20 and every failure mode in the Execution Trace, Periphery and First Principles guides that applies to it is closed. The file `.imd-findings.json` holds an empty findings list and eight coverage rows, all `holds`.\n\n**What I verified, concretely**\n\n- **Execution Trace:** traced `approve`, `transfer` and `transferFrom` through the inherited code with real inputs. The zero address is closed as both source and sink on every path, so there is no phantom mint or burn through the public entry points. Balance and allowance guards sit before every state write. There is no fee, no callback, no msg.value path and no external call anywhere in the 1843-byte runtime, confirmed by disassembly.\n- **Periphery:** the vendored OpenZeppelin tree is byte-identical to the v5.1.0 release tarball, and forge-std is byte-identical to v1.9.7. The inherited base contract is therefore the audited upstream code, not a modified copy.\n- **First Principles:** the supply constant is exactly 1e27, the constructor takes no arguments, and a CREATE2 deployment from a factory-like contract leaves the whole supply on the factory address and nowhere else. The compiled ABI exposes only three non-view functions and no privileged selector.\n- **Launch flows:** a scratch probe moved the 10% distributor share, an 80% allowance-based pull by a pool-manager-like spender, the requester remainder, and a trader buy and sell, all with exact balances and unchanged supply. The existing 31 tests also pass.\n\n**Leads examined and dropped**\n\n- The aderyn \"large numeric literal\" line is a style note. The literal evaluates to the intended 1e27, proven at compile time and by test.\n- The standard ERC-20 allowance race is a documented property of the standard, not a defect of this code, so it is not reported.\n- The runtime uses PUSH0 and MCOPY, which require Shanghai and Cancun. The launch targets chain id 1, where both are live, so this is not a defect.\n\n**Not reached:** the network's own protected Uniswap v4 test could not run here because v4-core and the floor harness are not in this tree. My scratch probe reproduced its token-level flows without the pool.","treeHash":null,"usage":{"cachedInputTokens":675192,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":29793,"runtime":"claude","turns":37,"wallClockMs":399606}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fd5402086dce252e","findings":[{"citation":"resolved","description":"PerkToken inherits OpenZeppelin v5.1.0 ERC20 unchanged. Its approve(spender, value) overwrites the allowance without reference to the previous value, and v5 ships no increaseAllowance/decreaseAllowance. This is the well-known ERC-20 approve front-running property, not a coding defect: the brief asks for a plain ERC-20 and this is what a plain ERC-20 does. It is recorded so integrators (the requester's remainder wallet, any later vesting or treasury contract) know to set allowances to zero before changing them, or to approve exact per-use amounts. Verified by a scratch Foundry test (test/scratch, not kept). Economic impact is bounded by the owner's own balance and requires the owner to re-approve a spender they already trusted, so it is informational. No fix is proposed; adding increase/decrease helpers would widen the ABI beyond the requested plain token and is a design decision for the requester.","line":19,"path":"src/PerkToken.sol","reproduction":"State: holder H has 150e18 PERK and has called approve(S, 100e18). H then submits approve(S, 50e18) intending to lower the allowance. S front-runs with transferFrom(H, S, 100e18) (allowance 100e18 -> 0), H's approve(S, 50e18) lands (allowance -> 50e18), S calls transferFrom(H, S, 50e18). Expected by H: S can take at most 100e18 total. Actual: balanceOf(S) == 150e18. Reproduced with vm.prank sequencing against the current source; every other transfer/transferFrom/approve path behaved as a plain ERC-20 and no supply, balance or allowance invariant was broken.","severity":"info","snippet":"contract PerkToken is ERC20 {","title":"Inherited ERC-20 allowance race: a spender can spend the old and the new allowance when an owner re-approves (standard behaviour, no change required)"}],"hash":"83b91b2a7e3beb6394d517975c25943049e267fddca604fcfe22bb7f493ae281","nodeId":"b41bfd93-dcac-4d62-a7be-6008405ec0f2","outcome":"completed","summary":"The review is complete. The findings file is valid JSON, the snippet matches line 19 of the source, the scratch test directory is removed, and no tracked file was changed.\n\n**Outcome: no defects in the assigned area.** PerkToken is stock OpenZeppelin v5.1.0 ERC20 plus one constructor mint. I checked it against the Economic Security, Invariant and Flow Gap guides and every failure mode they list either has nothing to attach to or holds under test.\n\nWhat I verified, with a scratch Foundry suite that ran and passed before I deleted it:\n\n- **Conservation.** Sum of balances equals totalSupply after 256 fuzzed 32-step sequences of random transfer and transferFrom calls, including self-transfers and self-approvals.\n- **Fixed supply.** The compiled ABI has twelve selectors and none reaches mint or burn after the constructor. Transfers to the zero address revert, so supply cannot shrink by that route either. The aderyn large-literal lead evaluates to exactly the manifest's supply.\n- **Launch flows.** The factory's transfer to the distributor, a pool-manager-style transferFrom pull of the pool share, the remainder transfer, a claim, and a trader buy and sell-back each moved exactly the stated amount. The ten thousand basis-point split leaves no rounding residue.\n- **Economics.** The opening cap implies a price of 2.5e-6 IMD per PERK, within Uniswap v4's tick range. The token has no price-dependent logic, so there is nothing to sandwich or manipulate.\n- **Periphery.** No external calls, no receive or fallback, no transfer hooks, and no DELEGATECALL, CALLCODE or SELFDESTRUCT in source or runtime.\n\nThe one entry in the report is an **info** note: the inherited ERC-20 allowance race, where a spender can take both the old and the new allowance when a holder re-approves. It has a concrete reproduction but is standard behaviour for the plain token the brief requested, so I stated that no fix is required.\n\nThe coverage record answers all three listed entry points as holds, plus seven invariant and flow rows. The one thing I could not run is the protected floor test itself, since it needs the launch environment variables and the v4 harness that are not in this tree, but every property it asserts was reproduced locally.","treeHash":null,"usage":{"cachedInputTokens":811915,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":14749,"runtime":"claude","turns":32,"wallClockMs":190702}},{"artifacts":[],"attempt":1,"bundleHash":"570f80557dd6ca126d0c75bdec505f54b9c485833487a75d988418bb8b944370","device":"f768e94767a9dde3","findings":[],"hash":"87cd11d6e3b7c673eb86c81f80402e43fd30a19f2c841f5f19081226af9e9fac","nodeId":"26712cac-b199-48cc-8a72-3f304d5510df","outcome":"completed","summary":"Done. The suite is complete, verified with the verifier's fuzz seed, and committed. No defects were found in the token, so there is no findings file.\n\n**What I added** (only paths under `test/`, nothing else touched):\n\n- `test/PerkTokenInvariant.t.sol`: a handler with the deployer, six actors and the token contract itself as possible holders. It drives transfer, approve and transferFrom with bounded inputs, plus their failure paths: over-balance, over-allowance, allowance-but-no-balance, zero-address receiver and spender, ether sent to the token, and twelve admin-looking selectors. Every handler call asserts its own postcondition and the expected ERC-6093 error, and the suite runs with fail-on-revert so a silently reverting handler cannot make it vacuous. Eight invariants cover fixed supply, sum of balances equals supply, balances and allowances matching a ghost ledger, zero address holding nothing, no ether, unchanged codehash, and fixed metadata. A deterministic smoke test calls every handler function once so the run is proven non-vacuous.\n- `test/PerkTokenLaunch.t.sol`: a factory stand-in deploys through CREATE2 and pays out the 10/80/10 split in one call, checks the predicted address, the single mint event, exact arrival of every leg, distributor claims down to a dust-sized last claimant, that the supply fits Uniswap v4's int128 arithmetic, and the 32-byte contract identifier. It also pins allowance edge cases (overwrite not accumulate, revoke, spend to exactly zero, owner needs self-allowance, no Approval event on spend, allowance independent of balance) and transfer edge cases (max uint, repeated whole-balance transfer, zero-address sender, tokens stuck in the token contract, ether attached to any function), with six 1000-run property tests.\n\n**Verification**\n\n| Check | Result |\n| --- | --- |\n| `forge build` | clean |\n| `forge test` with the verifier's seed | 62 passed, 0 failed |\n| `forge test` with a different seed | 62 passed, 0 failed |\n| Invariant run | 256 runs, 16,384 handler calls, 0 unexpected reverts |\n| `forge fmt --check` | clean |\n\n**Grounding the invariants.** I ran the same handler against two scratch mutants. A fee-on-transfer mutant was caught on the first run by the handler's exact-error postcondition. A stealth-mint mutant that keeps every per-call check true was caught by exactly the two conservation invariants, while the unrelated ones stayed green. That exercise also exposed a harness problem I fixed: a liveness assertion in afterInvariant masked the real failure on forge's shrunk replay, so I replaced it with the deterministic smoke test.\n\n**Commit** `bed6508` on the current HEAD holds the two new files. The scratch directory was removed.","treeHash":"1b9b75046d2282c8ea80137a664e25eb7d9ed0f1","usage":{"cachedInputTokens":1220879,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":34327,"runtime":"claude","turns":29,"wallClockMs":493095}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0cf632e317dfab7a","findings":[],"hash":"9a91b1e6d10e12f0546f29f63721dd1a288ab7540345390d6b20ad705df54f8d","nodeId":"bf75c8ea-0dcf-4b84-bc30-30adbfd5f2e2","outcome":"completed","summary":"Review complete. No math defects found in PERK; the findings file holds an empty list with seven coverage rows.\n\n**What the code is.** `src/PerkToken.sol` is a stock OpenZeppelin 5.1.0 ERC-20 with one constructor mint of a compile-time constant. It has no division, no scale conversion, no fee, no hook, no external call, no payable or receive path, and no mint or burn after deployment. The three ABI entry points are inherited unchanged.\n\n**What I checked against the Math Precision, Boundary and Numerical Gap guides.**\n- The supply constant equals 1e27 exactly and matches the README and manifest minor units. The aderyn \"large numeric literal\" lead is style only.\n- Every unchecked block in the inherited `_update` and `_spendAllowance` sits behind a checked guard, and the unchecked adds are bounded by the fixed supply.\n- Boundary values traced and tested: 1 wei, whole supply, supply plus one, max uint, zero amount, self-transfer, zero addresses for sender, receiver and spender, allowance exactly equal to amount, max-minus-one allowance versus the max sentinel, and allowance exceeding balance.\n- Conservation of supply under fuzzed three-way splits.\n- Launch flows cannot arrive short because every transfer moves exactly the requested amount.\n\n**Commands run.** `forge build` succeeded. `forge test` passed all 31 project tests. My scratch probe in `test/scratch/MathBoundary.t.sol` passed 9 of 9 after I corrected one wrong expectation of mine about which OpenZeppelin error fires on a zero-address `transferFrom`. Slither and Aderyn were not rerun; I used the supplied output as leads.\n\n**Coverage record.** All three entry points are marked `holds`, plus four invariant rows. Nothing in my area was left unreached. Passing tests show the checked paths behave as intended; they are not a proof of absence of defects outside the math area.","treeHash":null,"usage":{"cachedInputTokens":561656,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":9170,"runtime":"claude","turns":17,"wallClockMs":192956}},{"artifacts":[],"attempt":1,"bundleHash":"769d9bfed3a4da1d1685d99b8c01a013c054db060a19ade65428bae3fbfee83c","device":"ee2cc12e7dfe571a","findings":[],"hash":"a79820663ef6b43780b2cd07520fe8757e13c238363a1cd75c0f2fa5bb4c8b27","nodeId":"dbd304b9-2c84-4eb5-902c-abbb609f869f","outcome":"completed","summary":"The deliverable is complete and committed on `main` as commit `ea11597`.\n\n**What was built**\n\n- `src/PerkToken.sol`: a plain OpenZeppelin v5.1.0 ERC-20 named Perkshire IMDway, symbol PERK, 18 decimals. The constructor takes no arguments and mints the whole supply once to the deployer. There is no owner, no mint path, no pause or blocklist, and no fee or burn on transfer, so the factory, pool manager and distributor flows move exactly what they say without needing exemptions.\n- `foundry.toml` pins solc 0.8.26, cancun, optimizer on, `bytecode_hash = \"none\"`, metadata off, ffi off, no filesystem permissions.\n- `lib/` vendors forge-std v1.9.7 and OpenZeppelin v5.1.0 as ordinary files. All git metadata and hooks were stripped, and there are no submodules.\n- `script/DeployPerkToken.s.sol`: a reviewable local deploy whose `deploy()` function tests call directly. The IMD launch does not use it.\n- `README.md` documents assumptions, the manifest fields for the launch step, the resulting 10/80/10 distribution, build settings, an \"After launch\" section stating there is nothing to configure, and the security notes.\n\n**Checks**\n\n| Check | Result |\n| --- | --- |\n| `forge build` | passes on solc 0.8.26 |\n| `forge test` with the verifier's fuzz seed | 31 passed, 0 failed |\n| `forge test` under an empty environment | 31 passed |\n| `forge fmt --check` | clean |\n\nTests cover metadata, exact supply minted to both an EOA and a contract deployer, the single mint event, transfer and allowance success and failure paths, rejection of every common mint and admin selector from both a stranger and the deployer, rejection of plain ether, an opcode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT, and four conservation fuzz tests. A scratch harness mirroring the protected test's CREATE2 deploy, swarm transfer and holder checks also passed before I removed it.\n\n**Open items for the launch, not for this repository**\n\n- The manifest step writes `launch.json` with `constructorArgs: []` and the supply in minor units from the README table.\n- Explorer verification and the independent adversarial review belong to the launch policy. Only forge build, test and fmt ran here; Slither and Mythril were not available.","treeHash":"bba0a0af58d012b7ca4354296f5d610b6ecaa5a4","usage":{"cachedInputTokens":540089,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":18711,"runtime":"claude","turns":21,"wallClockMs":242110}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f96a0c89c039c22a","findings":[],"hash":"b8f36e0c5482f779c36afa0bbba6193acbb0f1404f5095905f7a049a0871f293","nodeId":"d926cfd9-ac8f-4bb7-9897-dd7af19551f0","outcome":"completed","summary":"The review found no defects. `.imd-findings.json` contains an empty findings list and a \"holds\" coverage row for each of the three entry points: `approve`, `transfer` and `transferFrom`. I didn't run any Foundry tests. The verdicts come from reading the source, the manifest and the protected tests.\n\n- **The code:** `src/PerkToken.sol` is OpenZeppelin v5's standard ERC-20 with nothing changed. Its constructor takes no arguments and mints exactly 1,000,000,000 × 10^18 to the deployer once. There is no owner, mint path, pause, fee or burn, and it makes no external calls.\n- **`launch.json`:** it matches the schema and the token. It has empty `constructorArgs`, the correct `totalSupply`, 18 decimals and no application contracts. The economics block matches the job's values.\n- **Specialist finding dropped:** audit_economics reported (as info) the usual ERC-20 risk that a spender can front-run a change of allowance and spend both the old and new amounts. That is how every plain ERC-20 behaves, not a defect in this code, so I left it out. The other four specialist areas reported nothing, so there was nothing to merge.\n- **Static analysis:** aderyn's \"large numeric literal\" note on line 27 is the supply constant, `1_000_000_000 * 10 ** 18`, and it is correct. Slither reported nothing.","treeHash":null,"usage":{"cachedInputTokens":104041,"inputTokens":6,"model":"claude-opus-5-5","outputTokens":1054,"runtime":"claude","turns":3,"wallClockMs":14708}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ea62f3bebece9304","findings":[],"hash":"ea63e9a291b773a29e5cb5bd6e1fec51becb7e988de263b31bfb937a65c6a126","nodeId":"e9b72ed0-56e9-4a0c-a6c4-87a3e8a2d94d","outcome":"completed","summary":"I found no defects in the permissions area, so `.imd-findings.json` has an empty findings list, plus coverage rows for all three entry points.\n\n`src/PerkToken.sol` is a plain ERC-20 built on OpenZeppelin's standard token code (v5.1), and it doesn't change any of that code's behaviour. The constructor takes no arguments and mints exactly 1,000,000,000 × 10^18 tokens once, to the deployer. Nothing else in the contract can mint.\n\n- **Access Control:** the contract has no owner, roles, mint, pause, blocklist, `burnFrom` or seize function. No address, including the factory, has any power over another holder's balance or allowances.\n- **Trust Gap:** after deployment nobody holds a privileged role, so there is nothing that has to be trusted.\n- **Asymmetry:** `transfer` and `transferFrom` treat every address the same. There are no fees or exemptions, so the payouts to the distributor, the pool and the requester arrive in full.\n\nCoverage, all marked **holds**:\n- **`approve(address,uint256)`:** a caller can only set their own allowance, and a zero spender is rejected.\n- **`transfer(address,uint256)`:** it moves only the caller's own balance. It reverts if the balance is too low or the receiver is the zero address.\n- **`transferFrom(address,address,uint256)`:** it checks the caller's allowance before moving anything (a maximum allowance counts as unlimited), and no privileged caller can skip that check.\n\nI also added rows for two invariants: no privileged role exists after deployment, and the supply is fixed.\n\nThe static-analysis lead (a large number written into the code at `src/PerkToken.sol:27`) is just the supply constant, which is correct, so I didn't report it. The project's existing 31 tests pass. I changed no files apart from writing `.imd-findings.json`.","treeHash":null,"usage":{"cachedInputTokens":244645,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":2545,"runtime":"claude","turns":6,"wallClockMs":31468}},{"artifacts":[],"attempt":1,"bundleHash":"67e303ab49258db8ea09b3df8957cee62de6f1c930585420e49d26cece0b97ce","device":"d00f790fc692b1a4","findings":[],"hash":"f522e10d9e356e92533e92a5fd284e1484e6afd5acf9e08cf92942e406cc1e4c","nodeId":"444ca709-0184-47a5-8e59-aae2a0fbd313","outcome":"completed","summary":"Done. The manifest is written at `launch.json` and is the only new or changed file in the tree.\n\n**What the manifest says**\n- Kind is custom_token with token contract `PerkToken`, name Perkshire IMDway, symbol PERK, 18 decimals.\n- Constructor arguments are empty, matching the accepted constructor, which takes nothing and mints the whole supply to msg.sender.\n- Total supply is one billion tokens in minor units, exactly what the constructor's TOTAL_SUPPLY constant mints.\n- The contracts list is empty, since the accepted tree has no application contracts. The deploy script in script/ is a local convenience the launch does not use, and the notes say so.\n- Pool and economics are copied exactly as the launch gives them: IMD pair address, fee 12500, tick spacing 60, the one-to-one provenance price, and the requester's economics object verbatim.\n- Notes run well under the 4,000 character limit and describe only what is in the tree.\n\n**Verification**\n- The manifest parses as JSON with exactly the schema's six top-level keys.\n- Build and the full test suite pass with the verifier's fuzz seed: 31 tests, 0 failures.\n- `git status --porcelain` shows only the untracked launch.json. No scratch files were left, and no configuration file was touched.","treeHash":"dd82254fc2ebb5bdc15630e282f67940c7b452f5","usage":{"cachedInputTokens":209557,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":3015,"runtime":"claude","turns":10,"wallClockMs":40274}}],"verification":[{"checks":[{"durationMs":1784,"exitCode":0,"name":"build","output":"Compiling 31 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.71s\nCompiler run successful!\n","passed":true},{"durationMs":20347,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/DeployPerkToken.t.sol:DeployPerkTokenTest\n[PASS] test_deployMintsSupplyToTheCaller() (gas: 1343752)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 1850162)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 426.72µs (385.05µs CPU time)\n\nRan 29 tests for test/PerkToken.t.sol:PerkTokenTest\n[PASS] testFuzz_multiHopConservesSupply(uint96,uint96,uint96) (runs: 256, μ: 199486, ~: 201538)\nLogs:\n  Bound result 6169222997023\n  Bound result 7132945504\n  Bound result 1\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99899, ~: 100468)\nLogs:\n  Bound result 12\n  Bound result 2000000000000000000\n\n[PASS] testFuzz_transferConservesSupplyAndMovesExactly(address,uint256) (runs: 256, μ: 99634, ~: 99908)\nLogs:\n  Bound result 645792756548177941362920726\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 130419, ~: 133672)\nLogs:\n  Bound result 12\n  Bound result 2000000000000000000\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 68148)\n[PASS] test_approveZeroSpenderReverts() (gas: 32950)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8139)\n[PASS] test_constructorHasNoArguments() (gas: 3881)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 33772)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 123359)\n[PASS] test_metadata() (gas: 50397)\n[PASS] test_noMintOrAdminSelectorsExist() (gas: 1347447)\n[PASS] test_rejectsPlainEther() (gas: 39480)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2344596)\n[PASS] test_secondHandTransferIsAlsoUntaxed() (gas: 143060)\n[PASS] test_selfTransferKeepsBalance() (gas: 43424)\n[PASS] test_supplyGoesToContractDeployerWhenDeployedByContract() (gas: 196085)\n[PASS] test_totalSupplyIsOneBillionWith18Decimals() (gas: 29050)\n[PASS] test_transferEmitsEvent() (gas: 66507)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 88029)\n[PASS] test_transferFromRevertsWhenOwnerLacksBalance() (gas: 91661)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40357)\n[PASS] test_transferFromSpendsAllowance() (gas: 153919)\n[PASS] test_transferMovesExactAmount() (gas: 93554)\n[PASS] test_transferOfZeroSucceeds() (gas: 47764)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 37802)\n[PASS] test_transferRevertsWhenExceedingBalanceByOne() (gas: 92776)\n[PASS] test_transferToZeroAddressReverts() (gas: 32920)\n[PASS] test_transferWholeBalance() (gas: 78016)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 53.08ms (157.03ms CPU time)\n\nRan 29 tests for test/PerkTokenLaunch.t.sol:PerkTokenLaunchTest\n[PASS] testFuzz_approveOverwritesExactly(address,uint256,uint256) (runs: 1000, μ: 125443, ~: 125693)\n[PASS] testFuzz_infiniteAllowanceDrainsBalanceExactly(uint256) (runs: 1000, μ: 238648, ~: 238852)\nLogs:\n  Bound result 97701142903598321905541924\n\n[PASS] testFuzz_launchPaysOutExactlyForAnyPoolShare(uint256) (runs: 1000, μ: 632460, ~: 633057)\nLogs:\n  Bound result 6073\n\n[PASS] testFuzz_noApprovalNoPull(address,uint256) (runs: 1000, μ: 65418, ~: 65228)\nLogs:\n  Bound result 30000000000000000000\n\n[PASS] testFuzz_roundTripIsExact(uint256) (runs: 1000, μ: 135991, ~: 135801)\nLogs:\n  Bound result 90374733901\n\n[PASS] testFuzz_splitTransferEqualsWholeTransfer(uint256,uint256) (runs: 1000, μ: 143804, ~: 144605)\nLogs:\n  Bound result 449841214522457271066113804\n  Bound result 1\n\n[PASS] test_allowanceIsIndependentOfBalance() (gas: 280885)\n[PASS] test_allowanceSpentToZeroThenRefused() (gas: 226158)\n[PASS] test_allowancesAreIndependentPerSpender() (gas: 202654)\n[PASS] test_approveOverwritesRatherThanAccumulates() (gas: 152041)\n[PASS] test_approveZeroRevokes() (gas: 208250)\n[PASS] test_contractIdentifierFitsThirtyTwoBytes() (gas: 4544)\n[PASS] test_create2DeploymentIsPredictableAndMintsToFactory() (gas: 563606)\n[PASS] test_distributorClaimsArriveWholeIncludingTheLast() (gas: 1354783)\n[PASS] test_emptyHolderCanOnlyTransferZero() (gas: 89836)\n[PASS] test_etherAttachedToAnyFunctionReverts() (gas: 152460)\n[PASS] test_launchPaysOutExactlyInOneCall() (gas: 639155)\n[PASS] test_ownerNeedsSelfAllowanceForTransferFrom() (gas: 179046)\n[PASS] test_publicConstantsAgreeWithGetters() (gas: 569512)\n[PASS] test_redeployingSameSaltFromSameFactoryReverts() (gas: 1040467640)\n[PASS] test_sameTransferTwiceFailsTheSecondTime() (gas: 111472)\n[PASS] test_selfTransferAboveBalanceReverts() (gas: 56551)\n[PASS] test_spenderCanPullToItself() (gas: 165805)\n[PASS] test_supplyFitsPoolManagerArithmetic() (gas: 4947)\n[PASS] test_tokensSentToTokenContractAreStuckButCounted() (gas: 155530)\n[PASS] test_transferFromEmitsTransferOnly() (gas: 144134)\n[PASS] test_transferFromToZeroAddressReverts() (gas: 115071)\n[PASS] test_transferFromZeroAddressSenderReverts() (gas: 53817)\n[PASS] test_transferOfMaxUintReverts() (gas: 56807)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 53.17ms (277.36ms CPU time)\n\nRan 2 tests for test/PerkTokenInvariant.t.sol:PerkTokenInvariantTest\n[PASS]\nPerkTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchGhostLedger\n[PASS] invariant_balancesMatchGhostLedger\n[PASS] invariant_deployerOutflowEqualsOthersHoldings\n[PASS] invariant_metadataIsFixed\n[PASS] invariant_sumOfBalancesEqualsSupply\n[PASS] invariant_tokenHoldsNoEtherAndCodeIsFixed\n[PASS] invariant_totalSupplyNeverChanges\n[PASS] invariant_zeroAddressHoldsNothing\n PerkTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------+----------------------------+-------+---------+----------╮\n| Contract    | Selector                   | Calls | Reverts | Discards |\n+=======================================================================+\n| PerkHandler | approve                    | 1503  | 0       | 0        |\n|-------------+----------------------------+-------+---------+----------|\n| PerkHandler | approveZeroSpender         | 1491  | 0       | 0        |\n|-------------+----------------------------+-------+---------+----------|\n| PerkHandler | callAdminSelector          | 1518  | 0       | 0        |\n|-------------+----------------------------+-------+---------+----------|\n| PerkHandler | sendEther                  | 1482  | 0       | 0        |\n|-------------+----------------------------+-------+---------+----------|\n| PerkHandler | transfer                   | 3000  | 0       | 0        |\n|-------------+----------------------------+-------+---------+----------|\n| PerkHandler | transferAboveBalance       | 1466  | 0       | 0        |\n|-------------+----------------------------+-------+---------+----------|\n| PerkHandler | transferFrom               | 1415  | 0       | 0        |\n|-------------+----------------------------+-------+---------+----------|\n| PerkHandler | transferFromAboveAllowance | 1503  | 0       | 0        |\n|-------------+----------------------------+-------+---------+----------|\n| PerkHandler | transferFromAboveBalance   | 1454  | 0       | 0        |\n|-------------+----------------------------+-------+---------+----------|\n| PerkHandler | transferToZero             | 1552  | 0       | 0        |\n╰-------------+----------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 4\n  Bound result 0\n  Bound result 1\n  Bound result 5\n  Bound result 1\n  Bound result 0\n  Bound result 4\n  Bound result 2224732368892402\n  Bound result 1\n  Bound result 1\n  Bound result 61139635204573\n  Bound result 5\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 3\n  Bound result 2968\n  Bound result 1\n  Bound result 3\n  Bound result 7\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000000000\n  Bound result 6\n  Bound result 0\n  Bound result 5\n  Bound result 3\n  Bound result 8\n  Bound result 0\n  Bound result 6\n  Bound result 7\n  Bound result 4\n  Bound result 6\n  Bound result 5\n  Bound result 6602\n  Bound result 4\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 2\n  Bound result 6\n  Bound result 0\n  Bound result 6\n  Bound result 4\n  Bound result 0\n  Bound result 2672\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 2\n  Bound result 3\n  Bound result 6\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 7\n  Bound result 0\n  Bound result 5\n  Bound result 1581\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 20545141080632254445442462511738137082543013131204545\n  Bound result 5\n  Bound result 5\n  Bound result 11\n  Bound result 3\n  Bound result 5\n  Bound result 7\n  Bound result 7753\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 4\n  Bound result 6484471629831438320952272205969197161477758636593684921481435237796937692238\n  Bound result 6\n  Bound result 5\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 258155115790723700617701194\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 1\n  Bound result 15875\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 7\n  Bound result 72630973769147878093314378\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 10\n  Bound result 6\n  Bound result 0\n  Bound result 3\n  Bound result 3470402584788683\n  Bound result 0\n  Bound result 5\n  Bound result 4\n  Bound result 42134705528783708321917056954612655157493470522096619366474561944633201529\n  Bound result 6\n  Bound result 5459\n  Bound result 6\n  Bound result 0\n  Bound result 3\n  Bound result 5\n  Bound result 4\n  Bound result 6\n  Bound result 3\n  Bound result 10065\n  Bound result 5\n  Bound result 2\n  Bound result 4\n  Bound result 0\n  Bound result 16412329\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 15980\n  Bound result 2\n  Bound result 7\n  Bound result 0\n  Bound result 1\n  Bound result 4\n  Bound result 0\n  Bound result 7\n  Bound result 1\n  Bound result 0\n  Bound result 5\n  Bound result 27369026227381719321896938\n  Bound result 5\n  Bound result 2\n  Bound result 0\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 1059803829859108594\n\n[PASS] test_handlerExercisesEveryPathAgainstTheToken() (gas: 5060412)\nLogs:\n  Bound result 0\n  Bound result 1\n  Bound result 123000000000000000000\n  Bound result 1\n  Bound result 2\n  Bound result 23000000000000000000\n  Bound result 2\n  Bound result 2\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 7\n  Bound result 1000000000000000000\n  Bound result 3\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 3\n  Bound result 1\n  Bound result 4\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 5\n  Bound result 20000000000000000000\n  Bound result 4\n  Bound result 1\n  Bound result 6\n  Bound result 1000000000000000000\n  Bound result 3\n  Bound result 0\n  Bound result 5\n  Bound result 1\n  Bound result 5\n  Bound result 6\n  Bound result 0\n  Bound result 1\n  Bound result 2\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 3\n  Bound result 0\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 20.27s (20.27s CPU time)\n\nRan 4 test suites in 20.27s (20.37s CPU time): 62 tests passed, 0 failed, 0 skipped (62 total tests)\n","passed":true},{"durationMs":50,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PerkToken.approve(address,uint256)\",\"PerkToken.transfer(address,uint256)\",\"PerkToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":147,\"foundry.toml\":23,\"remappings.txt\":2,\"script/DeployPerkToken.s.sol\":26,\"src/PerkToken.sol\":33,\"test/DeployPerkToken.t.sol\":30,\"test/PerkToken.t.sol\":335,\"test/PerkTokenInvariant.t.sol\":449,\"test/PerkTokenLaunch.t.sol\":499},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"87cd11d6e3b7c673eb86c81f80402e43fd30a19f2c841f5f19081226af9e9fac","verifiedTreeHash":"1b9b75046d2282c8ea80137a664e25eb7d9ed0f1","verifierVersion":"0.1.0+7129bf9d"},{"checks":[{"durationMs":820,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 758.05ms\nCompiler run successful!\n","passed":true},{"durationMs":84,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/DeployPerkToken.t.sol:DeployPerkTokenTest\n[PASS] test_deployMintsSupplyToTheCaller() (gas: 1343752)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 1850162)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 407.63µs (251.07µs CPU time)\n\nRan 29 tests for test/PerkToken.t.sol:PerkTokenTest\n[PASS] testFuzz_multiHopConservesSupply(uint96,uint96,uint96) (runs: 256, μ: 199486, ~: 201538)\nLogs:\n  Bound result 1078\n  Bound result 321\n  Bound result 250\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99803, ~: 100462)\nLogs:\n  Bound result 242812515386524512390294651\n  Bound result 738571944300203979576792069\n\n[PASS] testFuzz_transferConservesSupplyAndMovesExactly(address,uint256) (runs: 256, μ: 99625, ~: 100388)\nLogs:\n  Bound result 645792756548177941362920726\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 129772, ~: 132868)\nLogs:\n  Bound result 3160624704\n  Bound result 356278506445563613927153794\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 68148)\n[PASS] test_approveZeroSpenderReverts() (gas: 32950)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8139)\n[PASS] test_constructorHasNoArguments() (gas: 3881)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 33772)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 123359)\n[PASS] test_metadata() (gas: 50397)\n[PASS] test_noMintOrAdminSelectorsExist() (gas: 1347447)\n[PASS] test_rejectsPlainEther() (gas: 39480)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2344596)\n[PASS] test_secondHandTransferIsAlsoUntaxed() (gas: 143060)\n[PASS] test_selfTransferKeepsBalance() (gas: 43424)\n[PASS] test_supplyGoesToContractDeployerWhenDeployedByContract() (gas: 196085)\n[PASS] test_totalSupplyIsOneBillionWith18Decimals() (gas: 29050)\n[PASS] test_transferEmitsEvent() (gas: 66507)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 88029)\n[PASS] test_transferFromRevertsWhenOwnerLacksBalance() (gas: 91661)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40357)\n[PASS] test_transferFromSpendsAllowance() (gas: 153919)\n[PASS] test_transferMovesExactAmount() (gas: 93554)\n[PASS] test_transferOfZeroSucceeds() (gas: 47764)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 37802)\n[PASS] test_transferRevertsWhenExceedingBalanceByOne() (gas: 92776)\n[PASS] test_transferToZeroAddressReverts() (gas: 32920)\n[PASS] test_transferWholeBalance() (gas: 78016)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 9.68ms (44.62ms CPU time)\n\nRan 2 test suites in 10.59ms (10.09ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":30,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PerkToken.approve(address,uint256)\",\"PerkToken.transfer(address,uint256)\",\"PerkToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":147,\"foundry.toml\":23,\"remappings.txt\":2,\"script/DeployPerkToken.s.sol\":26,\"src/PerkToken.sol\":33,\"test/DeployPerkToken.t.sol\":30,\"test/PerkToken.t.sol\":335},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":387,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":135,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/PerkToken.sol:27: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a79820663ef6b43780b2cd07520fe8757e13c238363a1cd75c0f2fa5bb4c8b27","verifiedTreeHash":"bba0a0af58d012b7ca4354296f5d610b6ecaa5a4","verifierVersion":"0.1.0+7129bf9d"},{"checks":[{"durationMs":859,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 792.11ms\nCompiler run successful!\n","passed":true},{"durationMs":90,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/DeployPerkToken.t.sol:DeployPerkTokenTest\n[PASS] test_deployMintsSupplyToTheCaller() (gas: 1343752)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 1850162)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 434.91µs (263.41µs CPU time)\n\nRan 29 tests for test/PerkToken.t.sol:PerkTokenTest\n[PASS] testFuzz_multiHopConservesSupply(uint96,uint96,uint96) (runs: 256, μ: 199486, ~: 201538)\nLogs:\n  Bound result 6169222997023\n  Bound result 7132945504\n  Bound result 1\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99803, ~: 100462)\nLogs:\n  Bound result 242812515386524512390294651\n  Bound result 738571944300203979576792069\n\n[PASS] testFuzz_transferConservesSupplyAndMovesExactly(address,uint256) (runs: 256, μ: 99625, ~: 100388)\nLogs:\n  Bound result 19265277244834976966\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 129772, ~: 132868)\nLogs:\n  Bound result 3160624704\n  Bound result 356278506445563613927153794\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 68148)\n[PASS] test_approveZeroSpenderReverts() (gas: 32950)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8139)\n[PASS] test_constructorHasNoArguments() (gas: 3881)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 33772)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 123359)\n[PASS] test_metadata() (gas: 50397)\n[PASS] test_noMintOrAdminSelectorsExist() (gas: 1347447)\n[PASS] test_rejectsPlainEther() (gas: 39480)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2344596)\n[PASS] test_secondHandTransferIsAlsoUntaxed() (gas: 143060)\n[PASS] test_selfTransferKeepsBalance() (gas: 43424)\n[PASS] test_supplyGoesToContractDeployerWhenDeployedByContract() (gas: 196085)\n[PASS] test_totalSupplyIsOneBillionWith18Decimals() (gas: 29050)\n[PASS] test_transferEmitsEvent() (gas: 66507)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 88029)\n[PASS] test_transferFromRevertsWhenOwnerLacksBalance() (gas: 91661)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40357)\n[PASS] test_transferFromSpendsAllowance() (gas: 153919)\n[PASS] test_transferMovesExactAmount() (gas: 93554)\n[PASS] test_transferOfZeroSucceeds() (gas: 47764)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 37802)\n[PASS] test_transferRevertsWhenExceedingBalanceByOne() (gas: 92776)\n[PASS] test_transferToZeroAddressReverts() (gas: 32920)\n[PASS] test_transferWholeBalance() (gas: 78016)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 11.12ms (46.39ms CPU time)\n\nRan 2 test suites in 12.71ms (11.55ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":32,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PerkToken.approve(address,uint256)\",\"PerkToken.transfer(address,uint256)\",\"PerkToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":147,\"foundry.toml\":23,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployPerkToken.s.sol\":26,\"src/PerkToken.sol\":33,\"test/DeployPerkToken.t.sol\":30,\"test/PerkToken.t.sol\":335},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f522e10d9e356e92533e92a5fd284e1484e6afd5acf9e08cf92942e406cc1e4c","verifiedTreeHash":"dd82254fc2ebb5bdc15630e282f67940c7b452f5","verifierVersion":"0.1.0+7129bf9d"}]}