{"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":"4f107a40-9916-471e-a358-9f6930045d2e","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"59f755d0a839c5b7e567fd1fbf8840cb6fb32fd87de90757272273a2c1bd0fa5","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":"e3bf086208f13aec725af4bf491a04bc5064a5970bcfb3e3d51b2d03e357a114","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":"204ec56fa9143aebcc993cd7865b54b2dbe1591fae407c24d77a5c7e36c66ff7","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"52d078c1b1a445d47e06451d9906dd227b17bc1052d94291760607bd68f8752d","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":"c4329af1416a2466464d23b58b341b6907ad42d915f61fb5bce2136dce49df6a","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":"becb6e5a96df7f9f7886f036336fb03b07c0ff89df9dcd01ae7a1eb783313666","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"f0a4100714b4621c4be33e13ca93fc4d36296f9a795e4d60e9c3850ff05066e1","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"662e003c382eefd3f562db7a93779ecfe66dfc6f26f5dfa7b32e865c35c92b6e","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: ID PEPE (PEPE).\nToken name: ID PEPE\nToken symbol: PEPE\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"6b03819ea30e430ab3cc1708fadb86385171d4e666f27bc4ab550d7d78ed617e","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"4f107a40-9916-471e-a358-9f6930045d2e","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-754-id-pepe"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50974","feedbackHash":"f1d70c2ffc96c3f4ac367c69cca1ad08e8e43d272fb119bcc50220cd7be3704b","nodeKey":"audit_economics","submissionHash":"59f755d0a839c5b7e567fd1fbf8840cb6fb32fd87de90757272273a2c1bd0fa5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51430","feedbackHash":"e634ab4a082a889df79bf317f47a3e0d607500bd0eb461788e42c20ed0e2dfd6","nodeKey":"audit_flow","submissionHash":"e3bf086208f13aec725af4bf491a04bc5064a5970bcfb3e3d51b2d03e357a114","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51026","feedbackHash":"47ca405b20387849e459a6bd1457c3352925404f02ada131a386d269005e85fe","nodeKey":"audit_judge","submissionHash":"204ec56fa9143aebcc993cd7865b54b2dbe1591fae407c24d77a5c7e36c66ff7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50939","feedbackHash":"75e609173a3cfbe3cd6fba64cfb88b66f9f03caaca77cf9b8e79e438555ea8be","nodeKey":"audit_math","submissionHash":"52d078c1b1a445d47e06451d9906dd227b17bc1052d94291760607bd68f8752d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51032","feedbackHash":"f5176e376e4b63c7c91e03a6582c2916560e6bb7e2c787152f4871cd33145cb4","nodeKey":"audit_permissions","submissionHash":"c4329af1416a2466464d23b58b341b6907ad42d915f61fb5bce2136dce49df6a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51173","feedbackHash":"2f2ac474786bc74dde43ccc31c14b016383ffc3160055c6155a5cc41cb9de28d","nodeKey":"build_contract_project","submissionHash":"becb6e5a96df7f9f7886f036336fb03b07c0ff89df9dcd01ae7a1eb783313666","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51017","feedbackHash":"1e1d211bd276e57ec4f5252820c19ae2ec048032f3839f411e5ca3333f9c2107","nodeKey":"manifest","submissionHash":"f0a4100714b4621c4be33e13ca93fc4d36296f9a795e4d60e9c3850ff05066e1","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51104","feedbackHash":"7beadfdcf6c1f3b6fe6e808e2f46ec6a90974ce7af2f0837ef48dc8311a26366","nodeKey":"write_foundry_tests","submissionHash":"662e003c382eefd3f562db7a93779ecfe66dfc6f26f5dfa7b32e865c35c92b6e","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"638e874a4c3d59c7b528b1053eca036e98402e97ffe67b53d27518ef52308fa5","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"56b13350bba65fd7","findings":[],"hash":"204ec56fa9143aebcc993cd7865b54b2dbe1591fae407c24d77a5c7e36c66ff7","nodeId":"6200ee3a-40f6-4671-9030-5f58b4d49827","outcome":"completed","summary":"The review is complete. The findings file at the repository root holds an empty findings list and a six-row coverage record, and the working tree has no changes.\n\n**Outcome: no defects.** The token is a 13-line wrapper over an unmodified OpenZeppelin v5.0.2 ERC20 that mints one billion PEPE with 18 decimals to the deployer once. I verified it rather than trusting the specialists:\n\n- **Build and tests.** The project compiles with solc 0.8.26 and all 44 existing tests pass, including the stateful invariant suite.\n- **Dependency integrity.** All five vendored OpenZeppelin files are SHA-256 identical to the upstream v5.0.2 release. The vendored forge-std differs from v1.9.7 only by whitespace. There are no git submodules or symlinks.\n- **Entry points.** The compiled ABI exposes only the nine standard ERC-20 selectors. Calls to mint, burn, burnFrom, owner, pause, permit and plain ETH transfers all revert. The runtime bytecode contains no DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL or STATICCALL.\n- **Manifest.** Name, symbol, decimals and the supply of 10^27 base units match launch.json, and the constructor takes no arguments.\n\n**Specialist findings.** Both reproduced exactly as described in a scratch Foundry test, and both were dropped as non-defects:\n\n- The flow specialist's note that transferFrom emits only a Transfer event is true, but it is an upstream OpenZeppelin docstring inconsistency. The project README already documents the real behaviour.\n- The permissions specialist's approve replacement race is inherent to the ERC-20 standard, bounded by the allowance the holder already granted, and documented in the README.\n\nNeither warrants a revision, so the findings list is empty. The static analysis lead about a large numeric literal is a style note on the supply constant and has no behavioural effect.","treeHash":null,"usage":{"cachedInputTokens":370047,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":7610,"runtime":"claude","turns":14,"wallClockMs":110514}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"72b617d4b615473a","findings":[],"hash":"52d078c1b1a445d47e06451d9906dd227b17bc1052d94291760607bd68f8752d","nodeId":"36dcfead-3713-4583-908d-f354e2457f7e","outcome":"completed","summary":"Review complete. `.imd-findings.json` is written at the repository root with `{\"findings\": [], \"coverage\": [7 rows]}`; the working tree is otherwise untouched (scratch tests removed, `git status` clean apart from the findings file).\n\n## What I reviewed\n\n`src/Token.sol` is 13 lines: a plain OpenZeppelin v5 `ERC20(\"ID PEPE\",\"PEPE\")` whose constructor mints `1_000_000_000 * 10 ** 18` to `msg.sender`. All arithmetic lives in the inherited `ERC20._update` and `_spendAllowance`, so I traced those directly.\n\nArea: Math Precision, Boundary, Numerical Gap guides (read in full, plus the Senior Auditor's Mindset).\n\n## Result: no defects substantiated\n\nChecked against every failure mode in the three guides:\n\n- **Math Precision** — no division, no rate/scale conversion, no downcast, no shift anywhere in the token or inherited code. The only arithmetic is `+=`/`-=` inside `unchecked` blocks, each preceded by an explicit `fromBalance < value` / `currentAllowance < value` revert. Supply constant `1e27` (`0x33b2e3c9fd0803ce8000000`, confirmed via `cast`) is far below 2^128, so balance sums cannot wrap. The aderyn \"large numeric literal\" lead is cosmetic: the literal is an exact compile-time constant matching the brief.\n- **Boundary** — the enumeration is empty: no external calls, no `payable`/`receive`/`fallback`, no sentinel branches beyond OZ's `address(0)` reverts, no `bytes` decoding.\n- **Numerical Gap** — no seam exists: no formula where precision behaviour changes at an edge, and the conservation invariant is enforced by exact integer add/sub.\n\n## Verification\n\n- Project suite: 29 unit tests + 1 invariant (128 runs × 64 depth, `fail_on_revert`) — all pass.\n- My scratch probes (8 tests, now removed): 1 wei, full supply, supply+1, `type(uint256).max` amounts; self-transfer conservation; infinite-allowance sentinel (`max` untouched, `max-1` decremented); allowance consumed exactly to 0 then +1 reverts; allowance > balance leaves allowance intact on revert; fuzzed three-way split conserving supply; no mint/burn selectors. All pass.\n\n## Coverage record\n\nAll three listed entry points are `holds`, plus four invariant/guide-enumeration rows. Nothing marked `unreached`.","treeHash":null,"usage":{"cachedInputTokens":551835,"inputTokens":297,"model":"claude-fable-5-1","outputTokens":8155,"runtime":"claude","turns":15,"wallClockMs":131847}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"98b4506bef931d13","findings":[],"hash":"59f755d0a839c5b7e567fd1fbf8840cb6fb32fd87de90757272273a2c1bd0fa5","nodeId":"155e3168-e052-42ae-af58-5b9ed9c81c5e","outcome":"completed","summary":"I found no defects in the economics area for ID PEPE (PEPE), so `.imd-findings.json` has an empty findings list and a coverage row for each of the three entry points. I changed no files in the repository.\n\n**What the code is.** `src/Token.sol` is a plain OpenZeppelin ERC-20 whose constructor mints 10^27 base units (one billion with 18 decimals) to `msg.sender`. The OpenZeppelin files it imports are identical, byte for byte, to upstream v5.0.2. The token has no fee, burn, hook, owner, mint or burn function, pause, or `receive`/`fallback`.\n\n**Economic Security guide**\n- **Token misbehaviour:** none. A transfer has no side effects, so what the recipient's balance goes up by always equals the amount sent. That includes the pattern the pool manager uses to settle, which reads the balance before and after.\n- **Sentinel addresses:** transfers to the zero address and approvals of the zero spender revert, as intended.\n- **Value extraction:** no fee formula, oracle or price path exists in the token to exploit.\n- **ERC-20 compliance:** it is unmodified OpenZeppelin and complies.\n- **Native-currency sends:** sending ETH to the contract reverts.\n\n**Invariant guide**\n- **Supply:** the sum of all balances equals the total supply, which stays at 10^27 forever, because minting is only reachable from the constructor.\n- **Allowances:** a finite allowance goes down by exactly the amount spent; the maximum value counts as unlimited and is never reduced.\n- **Edge cases:** zero-amount transfers, self-transfers and self-`transferFrom` neither create nor destroy value, and a failed call changes nothing.\n\n**Flow Gap guide.** Every launch leg arrives whole: the 10% swarm share, the pool seed for any `poolBps` from 1 to 9000, the remainder, distributor claims, and trades through the pool manager. Nothing in the token runs mid-transfer that could leave a flow short or half-finished.\n\n**Checks run.** On a clean offline build, the existing suite passed 30 of 30, including its 128-run, depth-64 invariant test. I added 4 throwaway tests, which also passed:\n- fuzzing the launch split;\n- fuzzing that the received amount equals the amount sent;\n- fuzzing that self-transfers are neutral;\n- confirming that calls to `mint`, `burn`, `burnFrom`, `owner`, `pause`, `permit` and `increaseAllowance`, and plain ETH sends, all revert.\n\nI deleted those tests afterwards.\n\n**Static-analysis leads**\n- **Aderyn's \"large numeric literal\" at `src/Token.sol:11`:** this is a style note only. `1_000_000_000 * 10 ** 18` evaluates to exactly the stated supply, so I didn't report it.\n- **Slither:** reported nothing.\n- **Approve race:** the known ERC-20 race when changing an allowance is standard behaviour, and the README already documents it.\n\n**Not covered.** The network's protected launch test needs the factory, Uniswap v4 and environment settings, none of which are in this repository, so I didn't run it. My checks model those flows at the token level only. No launch manifest exists yet, so there was none to review.\n\nThe repository has no tracked changes. The only new paths are the required `.imd-findings.json` and the build output in `out/` and `cache/`, which git ignores.","treeHash":null,"usage":{"cachedInputTokens":345387,"inputTokens":16,"model":"claude-opus-5-5","outputTokens":5973,"runtime":"claude","turns":8,"wallClockMs":64789}},{"artifacts":[],"attempt":1,"bundleHash":"9e19ec6bb6493b6b04402270a5d6d11a4aeddb4d339a2da42417cb2af86017f6","device":"2fd706f443118bf0","findings":[],"hash":"662e003c382eefd3f562db7a93779ecfe66dfc6f26f5dfa7b32e865c35c92b6e","nodeId":"dce37adb-a3fb-4a4e-b602-01b75f5179ff","outcome":"completed","summary":"Added 14 boundary, failure-path, and fuzz tests. Strengthened invariants with independent balance and allowance accounting across 16,384 randomized handler calls.\n\n`forge build` and `forge test` pass offline: 44 passed, zero failures.\n\nOnly `test/` changed. No confirmed implementation defects found.","treeHash":"7ad26c002cdd06741fd255af06ac7561e51982c3","usage":{"cachedInputTokens":1039232,"inputTokens":91930,"model":"gpt-6-astra","outputTokens":10254,"runtime":"codex","turns":5,"wallClockMs":273176}},{"artifacts":[],"attempt":1,"bundleHash":"52eafd1539eed8225f7c9e8895e4320d9838eedd7006f1ec7b9b8d6b485a25f8","device":"11df27658f46aa9d","findings":[],"hash":"becb6e5a96df7f9f7886f036336fb03b07c0ff89df9dcd01ae7a1eb783313666","nodeId":"e694f1eb-79a8-4f86-abdc-ef23492eb208","outcome":"completed","summary":"Implemented [ID PEPE (PEPE)](/var/lib/imd-worker/.identitymd/work/4f107a40-9916-471e-a358-9f6930045d2e/e694f1eb-79a8-4f86-abdc-ef23492eb208/src/Token.sol): 1 billion tokens, 18 decimals, minted once to the deployer.\n\nAdded vendored dependencies, success/failure tests, and deployment documentation.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passed\n- `forge test` passed: 30 tests, including fuzz and invariant checks\n- `forge fmt --check` passed\n\nThe network’s protected launch integration harness remains for independent verification.","treeHash":"43f01c0b579e0c8743def2beda9b02a28fd9115e","usage":{"cachedInputTokens":242688,"inputTokens":50268,"model":"gpt-6-astra","outputTokens":11438,"runtime":"codex","turns":4,"wallClockMs":283507}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2a9662a76cb5f51d","findings":[{"citation":"resolved","description":"Area: Asymmetry / Trust Gap (owner intent vs spender power). Token inherits OpenZeppelin v5.0.2 ERC20 unchanged. approve(spender, value) writes the allowance with `=` (ERC20.sol:291 `_allowances[owner][spender] = value;`) while transferFrom consumes it with `-=` semantics (ERC20.sol:312). OpenZeppelin v5 removed increaseAllowance/decreaseAllowance and the token adds no permit or atomic-adjust path, so a holder has no way to lower a live non-zero allowance atomically. The spender is already trusted up to the first amount, the harm is bounded by old+new allowance, and no privileged party is involved, so this is an informational note rather than a defect: it is inherent to the ERC-20 standard and the README (lines 42-45) already tells integrators to revoke to zero first. No code change is required; recorded so the judge sees the approve/transferFrom asymmetry was examined. All other access-control, trust-gap and asymmetry checks hold: there is no owner, role, modifier, initializer, proxy, receive/fallback, mint/burn entry point, external call, or DELEGATECALL/CALLCODE/SELFDESTRUCT in the runtime, and the deployer has no power over any holder.","line":8,"path":"src/Token.sol","reproduction":"State: HOLDER has 1000 PEPE and has called approve(SPENDER, 100e18). HOLDER now wants to lower the allowance and sends approve(SPENDER, 50e18). SPENDER sees it in the mempool and front-runs: (1) vm.prank(SPENDER); transferFrom(HOLDER, SPENDER, 100e18) succeeds; (2) HOLDER's approve(SPENDER, 50e18) is mined and sets the allowance to 50e18 regardless of what was just spent; (3) vm.prank(SPENDER); transferFrom(HOLDER, SPENDER, 50e18) succeeds. Actual: SPENDER holds 150e18, more than either approval alone. Expected by the holder: at most 100e18 (or 50e18). Verified in test/scratch/AccessReview.t.sol::test_approveReplacementRaceLetsSpenderTakeBothAmounts, which passes on this code.","severity":"info","snippet":"contract Token is ERC20 {","title":"approve() replaces the allowance outright, so a spender can front-run a reduction and spend both the old and the new amount (standard ERC-20 property, already documented in README)"}],"hash":"c4329af1416a2466464d23b58b341b6907ad42d915f61fb5bce2136dce49df6a","nodeId":"6db3b2b9-d2d4-45cc-a481-d7d12224677c","outcome":"completed","summary":"The findings file is in place and is excluded from the tree by the repository's own `.git/info/exclude`, so no tracked file changed. The review is complete.\n\n**Result: no defects found in the assigned area.** `src/Token.sol` is a bare OpenZeppelin v5.0.2 ERC20 whose constructor mints the full supply to its immediate caller. The Access Control, Trust Gap and Asymmetry checks all hold. I recorded one informational note and nine coverage rows in `.imd-findings.json`.\n\nWhat I verified, and how:\n\n- **Permission model.** The compiled ABI exposes only the nine ERC-20 functions, two events and six ERC-6093 errors. There is no owner, role, modifier, initializer, proxy, permit, multicall, burn or mint selector, and no receive or fallback. Unknown selectors and native value revert.\n- **Entry points.** `approve`, `transfer` and `transferFrom` each bind only the caller's own balance or allowance. The deployer or factory cannot pull from a holder without an allowance. A failed `transferFrom` rolls back the allowance write. Only the spending (owner, spender) pair is decremented. Zero-address sender and receiver are rejected on every path, so the mint and burn branches of `_update` are unreachable from outside.\n- **Runtime.** An opcode scan of the deployed bytecode found no CALL, STATICCALL, DELEGATECALL, CALLCODE, CREATE, CREATE2 or SELFDESTRUCT. Transfers make no external calls.\n- **Launch flow.** Factory to distributor to claimant, and factory to pool to trader and back, move exact amounts and leave supply at exactly 1e27.\n- **Dependency integrity.** The vendored OpenZeppelin files are byte-identical to the upstream v5.0.2 tarball, whose hash matches the one recorded in `lib/README.md`.\n- **Trust-gap seams.** With no privileged actor, no fee or price formula and no settable parameter, none of the four seams has any surface in this token.\n\nThe one informational note is the standard ERC-20 approve-replacement race: a spender can front-run a reduction and spend both the old and new allowance. It is inherent to the standard, the README already documents the mitigation, and it needs no code change. I included it only so the judge can see the approve/transferFrom asymmetry was examined.\n\nStatic-analysis leads: Slither reported nothing. Aderyn's \"large numeric literal\" at line 11 is a constant expression equal to 1e27, confirmed by tests, and is stylistic only.\n\nAll checks ran locally with Foundry. The existing 30 tests pass, and my ten scratch tests under `test/scratch/` pass. Slither and Mythril were not run here. The protected launch harness needs the network's factory and Uniswap v4 contracts, which are not in this tree, so the actual pool seed and swap remain the verifier's check.","treeHash":null,"usage":{"cachedInputTokens":831538,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":19640,"runtime":"claude","turns":37,"wallClockMs":261691}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2a5d68f89de314cb","findings":[{"citation":"resolved","description":"Periphery check of the base contract Token inherits. The vendored file is byte-identical to upstream OpenZeppelin v5.0.2 (verified by diff against the tagged release), so this is an upstream documentation inconsistency, not a tampered dependency: the contract-level comment (lines 29-32) and the transferFrom docstring (lines 141-142) both say an Approval event is emitted on transferFrom, but _spendAllowance calls _approve(owner, spender, currentAllowance - value, false) (line 312) and _approve only emits when emitEvent is true (lines 292-294). The project README correctly states that delegated spending emits Transfer only. Impact is limited to integrators or indexers who read the vendored source comments and expect to reconstruct allowances from Approval events; they will miss every allowance decrement caused by transferFrom. No funds, supply or launch flow are affected. No code change to Token.sol is needed; the author may want to note the discrepancy in lib/README.md or keep relying on the project README's description.","line":141,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: fresh Token; holder H = deployer with 1e27 PEPE. Calls: (1) H calls approve(S, 10) -> Approval(H, S, 10) emitted. (2) vm.recordLogs(); S calls transferFrom(H, B, 4). Expected per the docstring at ERC20.sol:141: an Approval(H, S, 6) event. Actual: vm.getRecordedLogs() returns exactly one log, topic0 = keccak256(\"Transfer(address,address,uint256)\"); allowance(H, S) == 6 with no Approval event. Verified locally with a Foundry test (5 passing probes in test/scratch, not kept).","severity":"info","snippet":"     * Emits an {Approval} event indicating the updated allowance. This is not\n     * required by the EIP. See the note at the beginning of {ERC20}.","title":"Vendored ERC20 base docstring promises an Approval event on transferFrom that the code does not emit"}],"hash":"e3bf086208f13aec725af4bf491a04bc5064a5970bcfb3e3d51b2d03e357a114","nodeId":"09ac33fa-ee46-46fd-a2e5-084fd239b3a5","outcome":"completed","summary":"The review is complete. The findings file is written and validated, and the scratch tests were removed.\n\n**Result: no defects in the token.** `src/Token.sol` is a 13-line fixed-supply OpenZeppelin v5.0.2 ERC-20 with no owner, no hooks and no extra entry points. I recorded one info-level note and eight coverage rows in `.imd-findings.json`.\n\n**What I checked, by guide**\n\n- **Execution Trace.** Traced constructor, `transfer`, `approve` and `transferFrom` through the inherited `_update`, `_approve` and `_spendAllowance` paths. Zero-address sentinels revert, amounts move exactly, the allowance decrement is atomic with the balance check, and infinite allowance is never decremented. A scratch probe confirmed a sync/settle style PoolManager flow credits exactly what was sent, and that ETH, unknown selectors and `permit`, `burn` or `increaseAllowance` all revert.\n- **Periphery.** Diffed every vendored OpenZeppelin file and its LICENSE against the upstream v5.0.2 tag. All are byte-identical and tracked as plain files, not submodules. forge-std is test-only.\n- **First Principles.** Supply constant is 10^27 and fits uint256. Name, symbol and decimals match the brief. The constructor mints once to `msg.sender`, so the factory receives everything under CREATE2. The disassembled runtime exposes only the nine standard selectors and contains no CALL, CREATE, DELEGATECALL, CALLCODE or SELFDESTRUCT opcodes. No path can grow supply or move a holder's balance without their allowance.\n\n**The one note (info).** The vendored base contract's docstring at `ERC20.sol:141` says `transferFrom` emits an Approval event, but the code passes `emitEvent = false`, so only Transfer is emitted. This is an upstream OpenZeppelin documentation inconsistency, not a tampered dependency, and the project README already describes the real behaviour. It affects only indexers that reconstruct allowances from events.\n\n**Static analysis leads.** Slither reported nothing. Aderyn's \"large numeric literal\" at line 11 is a style note with no behavioural effect, so it was not promoted.\n\n**Not reachable here.** The protected launch harness needs Uniswap v4 core and the network's factory, which are not in this tree, so I modelled the pool flow with a mock rather than running the real PoolManager. The existing 30 project tests all pass.","treeHash":null,"usage":{"cachedInputTokens":671515,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14619,"runtime":"claude","turns":27,"wallClockMs":259258}},{"artifacts":[],"attempt":1,"bundleHash":"946579bdcd8d1e55373fc5c8069eac19e80f5ea68df9165d78d43093153e3390","device":"69bbcd9de2fdd6d0","findings":[],"hash":"f0a4100714b4621c4be33e13ca93fc4d36296f9a795e4d60e9c3850ff05066e1","nodeId":"8cc69df8-c949-4399-afd4-8f4fb8a76731","outcome":"completed","summary":"Created [launch.json](/root/.identitymd/work/4f107a40-9916-471e-a358-9f6930045d2e/8cc69df8-c949-4399-afd4-8f4fb8a76731/launch.json) with the exact supply, economics, paired currency, and empty constructor arguments.\n\nValidation passed against the supplied schema and compiled ABI. `forge build` succeeded; all 30 local tests passed. Only `launch.json` is changed outside scratch.","treeHash":"ea1774aac1e6ed2a88f8906ad94bbe6145f19b3b","usage":{"cachedInputTokens":169344,"inputTokens":37275,"model":"gpt-6-astra","outputTokens":2858,"runtime":"codex","turns":3,"wallClockMs":103678}}],"verification":[{"checks":[{"durationMs":1437,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.32s\nCompiler run successful!\n","passed":true},{"durationMs":5509,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 14 tests for test/Token.boundaries.t.sol:TokenBoundaryTest\n[PASS] testFuzz_ApprovalIsIdempotentAndDoesNotAffectOtherApprovals(uint256,uint256) (runs: 1000, μ: 254680, ~: 255839)\n[PASS] testFuzz_DirectAndDelegatedTransfersAgree(uint256,uint256,bool,bool) (runs: 1000, μ: 322052, ~: 302277)\nLogs:\n  Bound result 4000000000000000000\n  Bound result 6\n\n[PASS] testFuzz_FailedSpendPreservesFiniteApproval(uint256,uint256,uint256) (runs: 1000, μ: 198643, ~: 198965)\nLogs:\n  Bound result 34299739679346839823450\n  Bound result 180500857087662709599930347310450802256288839430628718184658092034072\n  Bound result 115792089056815338335908275408757560542819182444521810354690889727815227670392\n\n[PASS] testFuzz_SplitTransfersEqualSingleTransfer(uint256,uint256) (runs: 1000, μ: 201793, ~: 203173)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 497\n\n[PASS] test_ApprovalIsScopedToBothOwnerAndSpender() (gas: 266927)\n[PASS] test_ContractRecipientNeedsNoCallback() (gas: 289245)\n[PASS] test_FailedSpendCanBeRetriedAfterFundingWithoutRenewingApproval() (gas: 236617)\n[PASS] test_InfiniteAllowanceCanBeReducedAndRevokedAfterUse() (gas: 342281)\n[PASS] test_LargestFiniteAllowanceIsNotInfinite() (gas: 189002)\n[PASS] test_MaximumTransferCannotOverflowBalances() (gas: 148932)\n[PASS] test_OneBaseUnitRoundTrip() (gas: 138410)\n[PASS] test_SelfApprovalAndSelfSpendConsumeFiniteAllowance() (gas: 138366)\n[PASS] test_SpentApprovalDoesNotReturnWhenTokensAreRefunded() (gas: 193726)\n[PASS] test_ZeroDelegatedTransferStillRejectsZeroRecipient() (gas: 72495)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 53.17ms (208.40ms CPU time)\n\nRan 29 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_DelegatedTransferConservesBalancesAndAllowance(uint256,uint256) (runs: 256, μ: 155673, ~: 157902)\nLogs:\n  Bound result 359735245621958139520647504\n  Bound result 67875615343700319980511650\n\n[PASS] testFuzz_RevertTransferAboveBalance(uint256) (runs: 256, μ: 64687, ~: 64407)\nLogs:\n  Bound result 5017059439162006392868371833\n\n[PASS] testFuzz_TransfersConserveSupply(uint256,uint256) (runs: 256, μ: 180510, ~: 182744)\nLogs:\n  Bound result 359735245621958139520647504\n  Bound result 67875615343700319980511650\n\n[PASS] test_ApproveEmitsEventAndReplacesAllowance() (gas: 114495)\n[PASS] test_ConstructorEmitsMintTransfer() (gas: 5541)\n[PASS] test_Create2FactoryDeploymentAndExactLaunchTransfers() (gas: 624739)\n[PASS] test_DeployerCannotSpendHolderFundsWithoutApproval() (gas: 102580)\n[PASS] test_DeploymentAllocatesToImmediateCaller() (gas: 26289)\n[PASS] test_MaximumAllowanceRemainsUnchanged() (gas: 132446)\n[PASS] test_MetadataAndInitialAllocation() (gas: 84566)\n[PASS] test_RevertApproveFromZeroAddress() (gas: 30725)\n[PASS] test_RevertApproveZeroSpender() (gas: 37618)\n[PASS] test_RevertTransferFromAboveAllowance() (gas: 108556)\n[PASS] test_RevertTransferFromAboveBalanceRestoresAllowance() (gas: 114363)\n[PASS] test_RevertTransferFromByUnapprovedSpender() (gas: 98170)\n[PASS] test_RevertTransferFromEmptyAccount() (gas: 50665)\n[PASS] test_RevertTransferFromToZeroRestoresAllowance() (gas: 111521)\n[PASS] test_RevertTransferFromZeroSender() (gas: 30786)\n[PASS] test_RevertTransferToZeroEvenForZeroAmount() (gas: 71904)\n[PASS] test_RevokedAllowanceCannotBeSpent() (gas: 125882)\n[PASS] test_RuntimeContainsNoForbiddenOpcodes() (gas: 789865)\n[PASS] test_SelfTransferFromStillConsumesAllowance() (gas: 105094)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51540)\n[PASS] test_TransferEmitsEventAndDeliversExactAmount() (gas: 88980)\n[PASS] test_TransferEntireSupply() (gas: 81652)\n[PASS] test_TransferFromEmitsEventAndConsumesAllowance() (gas: 217960)\n[PASS] test_UnsupportedPrivilegedCallsRevertForDeployerAndStranger() (gas: 879263)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 66526)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 67589)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 53.16ms (128.38ms CPU time)\n\nRan 1 test for test/Token.invariant.t.sol:TokenInvariantTest\n[PASS]\nTokenInvariantTest invariants:\n[PASS] invariant_EveryBalanceAndAllowanceMatchesRequestedActions\n[PASS] invariant_SupplyAndBalancesAreConserved\n TokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+-----------------------+-------+---------+----------╮\n| Contract     | Selector              | Calls | Reverts | Discards |\n+===================================================================+\n| TokenHandler | approve               | 1677  | 0       | 0        |\n|--------------+-----------------------+-------+---------+----------|\n| TokenHandler | approveAndSpend       | 1593  | 0       | 0        |\n|--------------+-----------------------+-------+---------+----------|\n| TokenHandler | move                  | 1607  | 0       | 0        |\n|--------------+-----------------------+-------+---------+----------|\n| TokenHandler | revokeAndAttemptSpend | 1675  | 0       | 0        |\n|--------------+-----------------------+-------+---------+----------|\n| TokenHandler | roundTrip             | 1618  | 0       | 0        |\n|--------------+-----------------------+-------+---------+----------|\n| TokenHandler | spend                 | 1675  | 0       | 0        |\n|--------------+-----------------------+-------+---------+----------|\n| TokenHandler | spendAboveAllowance   | 1620  | 0       | 0        |\n|--------------+-----------------------+-------+---------+----------|\n| TokenHandler | spendAboveBalance     | 1644  | 0       | 0        |\n|--------------+-----------------------+-------+---------+----------|\n| TokenHandler | spendToZero           | 1610  | 0       | 0        |\n|--------------+-----------------------+-------+---------+----------|\n| TokenHandler | transferAboveBalance  | 1665  | 0       | 0        |\n╰--------------+-----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 9\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639945\n  Bound result 659918\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129640175\n  Bound result 6000000000000000000\n  Bound result 95\n  Bound result 339875902573184305189135306951305054067399218615523194053309346540583\n  Bound result 0\n  Bound result 242\n  Bound result 3974\n  Bound result 505116250778035594318166607\n  Bound result 0\n  Bound result 0\n  Bound result 4097\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129648131\n  Bound result 4099\n  Bound result 499\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639449\n  Bound result 6249\n  Bound result 4098\n  Bound result 1\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129636551\n  Bound result 2827\n  Bound result 242\n  Bound result 21\n  Bound result 246\n  Bound result 4000000000000000000\n  Bound result 2073\n  Bound result 4098\n  Bound result 4127757306\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129645034\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639933\n  Bound result 257\n  Bound result 11\n  Bound result 10169124289456539680\n  Bound result 0\n  Bound result 6380\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129647894\n  Bound result 6250\n  Bound result 1184377348421660740115973\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129665238\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.43s (5.43s CPU time)\n\nRan 3 test suites in 5.43s (5.53s CPU time): 44 tests passed, 0 failed, 0 skipped (44 total tests)\n","passed":true},{"durationMs":33,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Token.approve(address,uint256)\",\"Token.transfer(address,uint256)\",\"Token.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":109,\"foundry.toml\":20,\"remappings.txt\":2,\"src/Token.sol\":13,\"test/Token.boundaries.t.sol\":237,\"test/Token.invariant.t.sol\":236,\"test/Token.t.sol\":355},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"662e003c382eefd3f562db7a93779ecfe66dfc6f26f5dfa7b32e865c35c92b6e","verifiedTreeHash":"7ad26c002cdd06741fd255af06ac7561e51982c3","verifierVersion":"0.1.0+f8d984f2"},{"checks":[{"durationMs":1209,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.07s\nCompiler run successful!\n","passed":true},{"durationMs":742,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 29 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_DelegatedTransferConservesBalancesAndAllowance(uint256,uint256) (runs: 256, μ: 155912, ~: 157878)\nLogs:\n  Bound result 1007\n  Bound result 728\n\n[PASS] testFuzz_RevertTransferAboveBalance(uint256) (runs: 256, μ: 64721, ~: 65049)\nLogs:\n  Bound result 685865257976995500175105959671071417400935245110365040922137569\n\n[PASS] testFuzz_TransfersConserveSupply(uint256,uint256) (runs: 256, μ: 180849, ~: 182740)\nLogs:\n  Bound result 9983069430368836396060937\n  Bound result 5784783811565212724051307\n\n[PASS] test_ApproveEmitsEventAndReplacesAllowance() (gas: 114495)\n[PASS] test_ConstructorEmitsMintTransfer() (gas: 5541)\n[PASS] test_Create2FactoryDeploymentAndExactLaunchTransfers() (gas: 624739)\n[PASS] test_DeployerCannotSpendHolderFundsWithoutApproval() (gas: 102580)\n[PASS] test_DeploymentAllocatesToImmediateCaller() (gas: 26289)\n[PASS] test_MaximumAllowanceRemainsUnchanged() (gas: 132446)\n[PASS] test_MetadataAndInitialAllocation() (gas: 84566)\n[PASS] test_RevertApproveFromZeroAddress() (gas: 30725)\n[PASS] test_RevertApproveZeroSpender() (gas: 37618)\n[PASS] test_RevertTransferFromAboveAllowance() (gas: 108556)\n[PASS] test_RevertTransferFromAboveBalanceRestoresAllowance() (gas: 114363)\n[PASS] test_RevertTransferFromByUnapprovedSpender() (gas: 98170)\n[PASS] test_RevertTransferFromEmptyAccount() (gas: 50665)\n[PASS] test_RevertTransferFromToZeroRestoresAllowance() (gas: 111521)\n[PASS] test_RevertTransferFromZeroSender() (gas: 30786)\n[PASS] test_RevertTransferToZeroEvenForZeroAmount() (gas: 71904)\n[PASS] test_RevokedAllowanceCannotBeSpent() (gas: 125882)\n[PASS] test_RuntimeContainsNoForbiddenOpcodes() (gas: 789865)\n[PASS] test_SelfTransferFromStillConsumesAllowance() (gas: 105094)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51540)\n[PASS] test_TransferEmitsEventAndDeliversExactAmount() (gas: 88980)\n[PASS] test_TransferEntireSupply() (gas: 81652)\n[PASS] test_TransferFromEmitsEventAndConsumesAllowance() (gas: 217960)\n[PASS] test_UnsupportedPrivilegedCallsRevertForDeployerAndStranger() (gas: 879263)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 66526)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 67589)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 13.15ms (40.57ms CPU time)\n\nRan 1 test for test/Token.invariant.t.sol:TokenInvariantTest\n[PASS] invariant_SupplyAndBalancesAreConserved() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| TokenHandler | approve  | 2772  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| TokenHandler | move     | 2704  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| TokenHandler | spend    | 2716  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 560\n  Bound result 36\n  Bound result 0\n  Bound result 400\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 7\n  Bound result 1\n  Bound result 8\n  Bound result 5\n  Bound result 3\n  Bound result 0\n  Bound result 2\n  Bound result 6\n  Bound result 0\n  Bound result 120\n  Bound result 0\n  Bound result 359\n  Bound result 0\n  Bound result 2\n  Bound result 73\n  Bound result 96\n  Bound result 0\n  Bound result 5\n  Bound result 31\n  Bound result 7\n  Bound result 0\n  Bound result 74\n  Bound result 4\n  Bound result 36\n  Bound result 84\n  Bound result 13\n  Bound result 191\n  Bound result 0\n  Bound result 0\n  Bound result 124\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 46\n  Bound result 79\n  Bound result 8\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 647.67ms (646.14ms CPU time)\n\nRan 2 test suites in 648.99ms (660.82ms CPU time): 30 tests passed, 0 failed, 0 skipped (30 total tests)\n","passed":true},{"durationMs":48,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Token.approve(address,uint256)\",\"Token.transfer(address,uint256)\",\"Token.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":109,\"foundry.toml\":20,\"remappings.txt\":2,\"src/Token.sol\":13,\"test/Token.invariant.t.sol\":77,\"test/Token.t.sol\":355},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":782,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":288,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/Token.sol:11: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"becb6e5a96df7f9f7886f036336fb03b07c0ff89df9dcd01ae7a1eb783313666","verifiedTreeHash":"43f01c0b579e0c8743def2beda9b02a28fd9115e","verifierVersion":"0.1.0+f8d984f2"},{"checks":[{"durationMs":1037,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 943.09ms\nCompiler run successful!\n","passed":true},{"durationMs":650,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 29 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_DelegatedTransferConservesBalancesAndAllowance(uint256,uint256) (runs: 256, μ: 156141, ~: 157878)\nLogs:\n  Bound result 5\n  Bound result 2\n\n[PASS] testFuzz_RevertTransferAboveBalance(uint256) (runs: 256, μ: 64764, ~: 65049)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129640428\n\n[PASS] testFuzz_TransfersConserveSupply(uint256,uint256) (runs: 256, μ: 181115, ~: 182740)\nLogs:\n  Bound result 5\n  Bound result 2\n\n[PASS] test_ApproveEmitsEventAndReplacesAllowance() (gas: 114495)\n[PASS] test_ConstructorEmitsMintTransfer() (gas: 5541)\n[PASS] test_Create2FactoryDeploymentAndExactLaunchTransfers() (gas: 624739)\n[PASS] test_DeployerCannotSpendHolderFundsWithoutApproval() (gas: 102580)\n[PASS] test_DeploymentAllocatesToImmediateCaller() (gas: 26289)\n[PASS] test_MaximumAllowanceRemainsUnchanged() (gas: 132446)\n[PASS] test_MetadataAndInitialAllocation() (gas: 84566)\n[PASS] test_RevertApproveFromZeroAddress() (gas: 30725)\n[PASS] test_RevertApproveZeroSpender() (gas: 37618)\n[PASS] test_RevertTransferFromAboveAllowance() (gas: 108556)\n[PASS] test_RevertTransferFromAboveBalanceRestoresAllowance() (gas: 114363)\n[PASS] test_RevertTransferFromByUnapprovedSpender() (gas: 98170)\n[PASS] test_RevertTransferFromEmptyAccount() (gas: 50665)\n[PASS] test_RevertTransferFromToZeroRestoresAllowance() (gas: 111521)\n[PASS] test_RevertTransferFromZeroSender() (gas: 30786)\n[PASS] test_RevertTransferToZeroEvenForZeroAmount() (gas: 71904)\n[PASS] test_RevokedAllowanceCannotBeSpent() (gas: 125882)\n[PASS] test_RuntimeContainsNoForbiddenOpcodes() (gas: 789865)\n[PASS] test_SelfTransferFromStillConsumesAllowance() (gas: 105094)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51540)\n[PASS] test_TransferEmitsEventAndDeliversExactAmount() (gas: 88980)\n[PASS] test_TransferEntireSupply() (gas: 81652)\n[PASS] test_TransferFromEmitsEventAndConsumesAllowance() (gas: 217960)\n[PASS] test_UnsupportedPrivilegedCallsRevertForDeployerAndStranger() (gas: 879263)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 66526)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 67589)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 13.02ms (37.16ms CPU time)\n\nRan 1 test for test/Token.invariant.t.sol:TokenInvariantTest\n[PASS] invariant_SupplyAndBalancesAreConserved() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| TokenHandler | approve  | 2686  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| TokenHandler | move     | 2765  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| TokenHandler | spend    | 2741  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 728733514752528984068841859\n  Bound result 1635\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 275\n  Bound result 176718965453224556643757744\n  Bound result 0\n  Bound result 2\n  Bound result 568\n  Bound result 0\n  Bound result 5146\n  Bound result 0\n  Bound result 5183\n  Bound result 3237\n  Bound result 0\n  Bound result 1843\n  Bound result 2208\n  Bound result 0\n  Bound result 2777\n  Bound result 8\n  Bound result 8048407\n  Bound result 405\n  Bound result 0\n  Bound result 94547519794246459287396852\n  Bound result 53\n  Bound result 95\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 157198258\n  Bound result 8020749\n  Bound result 255\n  Bound result 0\n  Bound result 2723\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 566.67ms (565.48ms CPU time)\n\nRan 2 test suites in 567.76ms (579.69ms CPU time): 30 tests passed, 0 failed, 0 skipped (30 total tests)\n","passed":true},{"durationMs":30,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Token.approve(address,uint256)\",\"Token.transfer(address,uint256)\",\"Token.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":109,\"foundry.toml\":20,\"launch.json\":20,\"remappings.txt\":2,\"src/Token.sol\":13,\"test/Token.invariant.t.sol\":77,\"test/Token.t.sol\":355},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f0a4100714b4621c4be33e13ca93fc4d36296f9a795e4d60e9c3850ff05066e1","verifiedTreeHash":"ea1774aac1e6ed2a88f8906ad94bbe6145f19b3b","verifierVersion":"0.1.0+f8d984f2"}]}