{"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":"3efe528b-e506-4b7d-bc98-502507d42006","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"a9a52bb01c84ca59646255acdd52bfbd7d6ed9c226106f7a345e67a8bdd7e3c6","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":"115a1e0f895b305463fbe9ee25ac47ff84a912d55ed96156be62f008d6cd3b14","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":"11e3aab654f7831004f1d19b5a3438ec3e641f402918947ce82aa0fed86a2ac5","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":"f9c1b0fb7489d3addb57ff3046684ce770cd91e0dad398429712870419a6944a","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":"913a1f640949b53ff9db44af37f99aee06bf910245f21d9f865b99a698171ab6","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":"07932a8f5ed5112eb8fe8d254c55f3533a161c1ab408e761eaab5c3d3a934911","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"b28867ebd8ff78fe88b75e33c216f5020e52bc99f011308976006f8e54ce396b","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"6bfbde173c33ce04a1088f65d78c77e37332e00026527aa44aba2e865b009008","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: VerdictIMD (VERDICT).\nToken name: VerdictIMD\nToken symbol: VERDICT\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"752afef6d00b35884ebf2f2d0dc181d251abd0f0fc11ba3a2551ea738689e7fc","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"3efe528b-e506-4b7d-bc98-502507d42006","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1865-verdictimd"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51473","feedbackHash":"251071b0a813714484fb8dadabaca4ce52a3b4002442d6e1c5b171115ee62b14","nodeKey":"audit_economics","submissionHash":"a9a52bb01c84ca59646255acdd52bfbd7d6ed9c226106f7a345e67a8bdd7e3c6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52641","feedbackHash":"1ec743cc155047d5f64cec83343af362eb379f446fce303e332cb49e454a144a","nodeKey":"audit_flow","submissionHash":"115a1e0f895b305463fbe9ee25ac47ff84a912d55ed96156be62f008d6cd3b14","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51083","feedbackHash":"2a9c2c345b5cf2446172e23197c2980741a6b432deffb3650d7d00eb0276c5b6","nodeKey":"audit_judge","submissionHash":"11e3aab654f7831004f1d19b5a3438ec3e641f402918947ce82aa0fed86a2ac5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51143","feedbackHash":"18545d3a18d59a9065e365c570d6c9edd632d8754f6c38976c57d813424a77f4","nodeKey":"audit_math","submissionHash":"f9c1b0fb7489d3addb57ff3046684ce770cd91e0dad398429712870419a6944a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51101","feedbackHash":"6cbc3d7333fcbcef8ba9c94223c998b4f87d89eef7991e395a62417c4a7881c3","nodeKey":"audit_permissions","submissionHash":"913a1f640949b53ff9db44af37f99aee06bf910245f21d9f865b99a698171ab6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"54155","feedbackHash":"07f930d4ca2371c971c893ccda056b14354e4f23a567c5461b736967786b7da4","nodeKey":"build_contract_project","submissionHash":"07932a8f5ed5112eb8fe8d254c55f3533a161c1ab408e761eaab5c3d3a934911","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51729","feedbackHash":"12e1ec7bea9deea9b135a88f9e441d009a849c3a8054545713f05696e2d8752a","nodeKey":"manifest","submissionHash":"b28867ebd8ff78fe88b75e33c216f5020e52bc99f011308976006f8e54ce396b","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51533","feedbackHash":"f9a1d20ff4417a6e044374d4e10a4586f5a67dc042e49fc9343f7785be854323","nodeKey":"write_foundry_tests","submissionHash":"6bfbde173c33ce04a1088f65d78c77e37332e00026527aa44aba2e865b009008","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"4db16d9b8e3b70772a910e9940a33c05883d24b4f3bb30c634f63001735b885c","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"7831d6f4ad4b4c74af7874cb2d44fc3db08fe9dbf9c66d95abba06c4ba93d2a0","device":"bdc98b31e28b4d8d","findings":[],"hash":"07932a8f5ed5112eb8fe8d254c55f3533a161c1ab408e761eaab5c3d3a934911","nodeId":"d469869d-d57e-4ee8-969d-957545ff7fde","outcome":"completed","summary":"Implemented VerdictIMD (VERDICT): 1 billion tokens, 18 decimals, minted once entirely to the deployer. No owner or later minting.\n\n- Dependencies vendored for offline builds.\n- Deployment and operational responsibilities documented.\n- `forge build`, `forge test` (33 passing), and `forge fmt --check` pass using the supplied fuzz seed.\n\nFull protected launch integration remains for the verifier’s external harness.","treeHash":"6ce61a3ce0b7c37b0df6e33f884ad3a151c431b5","usage":{"cachedInputTokens":325504,"inputTokens":47304,"model":"gpt-6-astra","outputTokens":14281,"runtime":"codex","turns":4,"wallClockMs":442786}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"803eeae3d8b63de3","findings":[],"hash":"115a1e0f895b305463fbe9ee25ac47ff84a912d55ed96156be62f008d6cd3b14","nodeId":"c6999b1a-0f0e-4f77-a5e6-534a0567402e","outcome":"completed","summary":"The review is complete. No defects found. The findings file is written with an empty findings list and eight coverage rows, and no tracked file was changed.\n\n**What was reviewed.** The token at `src/VerdictIMD.sol` is a 17-line contract that inherits the vendored OpenZeppelin v5.0.2 ERC-20 and mints 10^27 units to the constructor caller. I applied the Execution Trace, Periphery and First Principles guides from the Pashov reference, after the Senior Auditor's Mindset section.\n\n**Entry points.** All three listed entry points hold:\n\n- **transfer** goes through the unmodified OpenZeppelin path. The zero-recipient check, balance check and unchecked arithmetic are sound, self-transfers net to zero, and there are no fees, hooks or external calls.\n- **approve** writes only the caller's own allowance row and rejects a zero spender. The standard approve ordering race is inherent to ERC-20 and already documented in the README.\n- **transferFrom** spends the allowance before moving tokens, leaves infinite allowances untouched, and every failure path reverts atomically so the allowance write is rolled back.\n\n**Periphery.** I read the vendored base contract and Context in full. They match upstream text, and file hashes match dependencies.json. The network filter denied fetching upstream from GitHub, so a byte-for-byte diff against the pinned commit was not possible. That is recorded in the coverage row.\n\n**First principles.** Supply is exactly one billion with 18 decimals, minted once to msg.sender, which is the factory under CREATE2 deployment. The compiled ABI exposes no mint, burn, owner, pause, blacklist, payable, receive or fallback surface. An independent opcode walk of the runtime found no CALL, DELEGATECALL, CREATE, STATICCALL or SELFDESTRUCT, and the metadata trailer carries only the compiler version.\n\n**Checks run.** Build succeeded, all 33 tests passed including the 128-run invariant suite, and forge fmt reported no changes. The single aderyn lead is a large-literal style note on the supply constant, which is the brief's value.","treeHash":null,"usage":{"cachedInputTokens":691633,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":10385,"runtime":"claude","turns":25,"wallClockMs":187389}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc7103e773ea194a","findings":[{"citation":"resolved","description":"README.md ('Dependencies') states forge-std v1.9.7 is vendored 'unmodified' and that dependencies.json records the SHA-256 of each vendored file. Recomputing the hashes shows 7 forge-std files under lib/forge-std/src do not match the recorded values: StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol. I fetched upstream commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 and confirmed the recorded hashes are the pristine upstream hashes; with all whitespace stripped every vendored file is identical to upstream, so the only change is line re-wrapping by `forge fmt` under this repo's [fmt] line_length = 120. All six OpenZeppelin v5.0.2 files match both the recorded hashes and upstream exactly. Impact: provenance documentation only. forge-std is test-only; the token's creation and runtime bytecode do not depend on it, and no security impact exists. Fix (author's choice): re-vendor the pristine forge-std files (and keep lib/ out of forge fmt), or recompute the 7 hashes as vendored and drop the word 'unmodified' for forge-std in README.md. Reported by audit_permissions; reproduced here.","line":26,"path":"dependencies.json","reproduction":"From the repository root: python3 -I -c \"import json,hashlib; d=json.load(open('dependencies.json')); [print(p,'MISMATCH') for e in d for p,h in e['sha256'].items() if hashlib.sha256(open(e['path']+'/'+p,'rb').read()).hexdigest()!=h]\". Expected (README.md: 'unmodified', hashes 'of each vendored file'): no output. Actual: 7 lines, src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol. Confirmation: curl of each file at upstream commit 77041d2c... hashes to the recorded value; `tr -d ' \\t\\n\\r' < upstream | sha256sum` equals the same for the vendored copy for all 7 files (whitespace-only difference).","severity":"info","snippet":"      \"src/StdAssertions.sol\": \"d4c89eec70d267dec6188461fbc74d3dc8c47e518d176a23417533a232ed9780\",","title":"dependencies.json SHA-256 records do not match 7 vendored forge-std files (whitespace-only reformat by forge fmt)"},{"citation":"resolved","description":"VerdictIMD inherits OpenZeppelin v5.0.2 ERC20 unchanged; approve(spender, value) overwrites _allowances[owner][spender] regardless of what the spender has already consumed, and OZ v5 ships no increaseAllowance/decreaseAllowance. A holder who lowers a nonzero allowance can have both the old and the new amount spent if the spender's transferFrom lands first. This is inherent to ERC-20, is already documented in README.md ('Launch and operational responsibilities') with the standard mitigation (revoke to zero, confirm, then re-approve), and matches the agreed design of a plain fixed-supply ERC-20 with exactly three state-changing entry points. It is not a defect of this implementation and does not warrant a change; recorded so the trust assumption is explicit. Reported by audit_economics; reproduced here.","line":10,"path":"src/VerdictIMD.sol","reproduction":"State: Alice holds 150e18 VERDICT. 1) Alice: approve(Bob, 100e18). 2) Bob: transferFrom(Alice, Bob, 100e18) succeeds (allowance 100e18 -> 0). 3) Alice's later approve(Bob, 50e18) is mined (allowance 50e18). 4) Bob: transferFrom(Alice, Bob, 50e18) succeeds. Expected by Alice: Bob takes at most 100e18 (first approval) or 50e18 (reduction). Actual: balanceOf(Bob) == 150e18, balanceOf(Alice) == 0; totalSupply unchanged. Verified with a Foundry test in test/scratch (not kept): new VerdictIMD(), transfer(alice,150e18), prank(alice) approve(bob,100e18), prank(bob) transferFrom(alice,bob,100e18), prank(alice) approve(bob,50e18), prank(bob) transferFrom(alice,bob,50e18); assertEq(balanceOf(bob),150e18) passes.","severity":"info","snippet":"contract VerdictIMD is ERC20 {","title":"Inherited ERC-20 approve() replaces the allowance; lowering a nonzero allowance has the standard ordering race (documented, no change required)"}],"hash":"11e3aab654f7831004f1d19b5a3438ec3e641f402918947ce82aa0fed86a2ac5","nodeId":"b8f94e5a-886d-4b2d-8dd2-5600f01bfd32","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json`, no repository file was changed, and the scratch test directory was removed.\n\n**Verdict on the token:** `src/VerdictIMD.sol` is a plain OpenZeppelin v5.0.2 ERC20 with a no-argument constructor that mints exactly the manifest supply to msg.sender. I found no defect in it. All six vendored OpenZeppelin files hash-match the upstream commit. The compiled runtime contains no DELEGATECALL, CALLCODE, SELFDESTRUCT or CALL, and is far under the size limits. The project suite passed in full, including the 256-run invariants. The manifest uses only schema keys, matches the constructor and supply, and its pool and economics match the assignment's values.\n\n**Specialist findings, after reproduction:**\n- **Kept, info:** dependencies.json records upstream hashes for 7 forge-std files that were re-wrapped by forge fmt. I recomputed the hashes, fetched the upstream commit, and confirmed the files are identical once whitespace is stripped. Test-only, no bytecode impact, but the README's \"unmodified\" claim does not hold for forge-std.\n- **Kept, info:** the inherited approve replaces the allowance, so lowering a nonzero allowance has the standard ERC-20 ordering race. Reproduced with a Foundry test. It is documented in the README and is not a defect requiring a change.\n- audit_math, audit_flow and the test writer reported nothing, and nothing in my own pass contradicts that.\n\n**Coverage:** all three entry points answered as holds, plus five invariant rows covering constructor supply and recipient, forbidden opcodes and size, launch-flow exactness, dependency provenance, and launch.json. No proofs were attached since nothing reached high or critical.","treeHash":null,"usage":{"cachedInputTokens":423624,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":9093,"runtime":"claude","turns":13,"wallClockMs":143191}},{"artifacts":[],"attempt":1,"bundleHash":"3605391476e7896b605d2a64dd866f16c12c523e2413bc2faabbe73bffd8b085","device":"9eee291846dcb046","findings":[],"hash":"6bfbde173c33ce04a1088f65d78c77e37332e00026527aa44aba2e865b009008","nodeId":"44a8caf5-c1aa-4851-a4f3-55bc044e69b5","outcome":"completed","summary":"Added nine boundary/fuzz tests and expanded stateful invariants to cover rejected transfers and approval failures.\n\nValidation passed: `forge build` and seeded `forge test`—42 tests, including 256 random sequences with 16,384 handler calls.\n\nOnly `test/` changed. No defects found.","treeHash":"db7609de2bce0d425b041244da36efa552c5b6fb","usage":{"cachedInputTokens":410112,"inputTokens":48179,"model":"gpt-6.1-sol","outputTokens":4931,"runtime":"codex","turns":4,"wallClockMs":120158}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b1d937213bbfd9cf","findings":[{"citation":"resolved","description":"README.md:119 states the vendored Forge Standard Library is 'v1.9.7, unmodified src/' and that dependencies.json records 'the SHA-256 of each vendored file'. Recomputing the hashes shows 7 of the forge-std files in lib/forge-std/src do not match the recorded values: StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol and interfaces/IMulticall3.sol. The recorded hashes are correct for upstream commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 (fetched and verified); the vendored copies were reformatted afterwards by `forge fmt` under this repository's `[fmt] line_length = 120` setting (the tree is `forge fmt --check` clean, and the pristine upstream Vm.sol is not). Stripping all whitespace, every vendored file is byte-identical to upstream, so the change is purely cosmetic and has no effect on the token, its runtime bytecode, or test semantics. All six OpenZeppelin v5.0.2 files match their recorded hashes exactly. Impact: a reviewer or the verifier who checks provenance by recomputing the recorded hashes gets 7 mismatches and cannot confirm the 'unmodified' claim without a whitespace-insensitive comparison. No security impact; the token in src/VerdictIMD.sol does not depend on forge-std. Fix: either re-vendor the pristine upstream files and exclude lib/ from `forge fmt` (e.g. `[fmt] ignore = [\"lib/**\"]` is a config change the author must make, not this reviewer), or recompute and record the hashes of the files as vendored and drop the word 'unmodified' from README.md.","line":39,"path":"dependencies.json","reproduction":"From the repository root run: `python3 -I -c \"import json,hashlib; d=json.load(open('dependencies.json')); [print(p, 'MISMATCH') for e in d for p,h in e['sha256'].items() if hashlib.sha256(open(e['path']+'/'+p,'rb').read()).hexdigest()!=h]\"`. Expected (per README.md:119 and the manifest's purpose): no output. Actual: 7 lines, all under lib/forge-std/src/ (StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol). Confirm the nature of the change with `curl -sSL https://raw.githubusercontent.com/foundry-rs/forge-std/77041d2ce690e692d6e03cc812b57d1ddaa4d505/src/Vm.sol | sha256sum` (prints the recorded 9068805b... value) and `diff -w <(curl -sSL .../src/Vm.sol) lib/forge-std/src/Vm.sol` (prints nothing: whitespace-only difference).","severity":"info","snippet":"      \"src/Vm.sol\": \"9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1\",","title":"dependencies.json SHA-256 records do not match 7 vendored forge-std files (reformatted by forge fmt, whitespace-only)"}],"hash":"913a1f640949b53ff9db44af37f99aee06bf910245f21d9f865b99a698171ab6","nodeId":"0a2ed5eb-62f6-48b4-ad0c-86f6f2dd7fa9","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written and validated.\n\n**Result: no defect in the assigned area.** VerdictIMD is a 17-line contract that inherits unmodified OpenZeppelin v5.0.2 ERC20 and mints 1e27 units once to the constructor's msg.sender. There is no owner, minter, pauser, blacklist, initializer, fallback or receive, and the runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT. The compiled ABI exposes exactly the three listed entry points as state changers.\n\n**What I checked against the three guides**\n\n- **Access Control.** Permission map is empty: every write is keyed on msg.sender or an allowance the owner set. No storage slot has two writers with different guards. No escalation chain, no confused deputy, no proxy.\n- **Trust Gap.** None of the four seams has a surface, since the token holds no economics, setters or recipients. The single trust assumption is that the factory forwards the supply, which is the launch service's job and is exercised by the protected floor tests.\n- **Asymmetry.** transfer and transferFrom share one internal path. approve emits Approval while allowance consumption does not, which is OpenZeppelin v5 design and is documented in the README. Self-transfer and infinite-allowance branches behave as intended.\n\n**Verification run**\n\n- Full suite with the README's fuzz seed: 33 tests pass, including 128 invariant sequences of 64 calls with no reverts.\n- OpenZeppelin vendored files match their recorded SHA-256 hashes exactly.\n- The aderyn large-literal lead is a constant-folded 1e27 asserted by an existing test. Not a defect.\n\n**One info finding recorded.** Seven vendored forge-std files do not match the hashes in dependencies.json, contradicting the README's \"unmodified\" claim. I fetched upstream at the pinned commit and confirmed the recorded hashes are upstream's and the only differences are whitespace from this repository's `forge fmt` setting. No effect on the token or tests. The finding gives the exact command that reproduces the mismatch and suggests the author either re-vendor and exclude lib from fmt, or re-record the hashes.\n\n**Coverage record.** All three entry points are marked holds, with rows added for the constructor, the no-admin invariant, the trust-gap and asymmetry invariants, the static-analysis lead, and the dependency integrity row pointing at the info finding. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":826106,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":13070,"runtime":"claude","turns":19,"wallClockMs":207590}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc34db8e17664ebd","findings":[{"citation":"resolved","description":"VerdictIMD inherits OpenZeppelin v5 ERC20 unchanged. Its approve(spender, value) writes `_allowances[owner][spender] = value` (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:132 and :291) with no relation to what the spender has already consumed, and OZ v5 ships no increaseAllowance/decreaseAllowance or permit. A holder who tries to lower an existing nonzero allowance can therefore have the old and the new amount both spent if the spender's transferFrom lands first. This is the well-known ERC-20 allowance race, inherent to the standard and already stated in README.md ('Launch and operational responsibilities'), with the recommended mitigation (revoke to zero, confirm, then approve the new amount). It is recorded here only because the Economic Security guide asks for every concrete value-loss path to be named with numbers; it is not a defect of this implementation and the agreed design (plain fixed-supply ERC-20, no extra entry points) should not be changed for it. If the requester ever wants an on-chain mitigation, adding increaseAllowance/decreaseAllowance in src/VerdictIMD.sol would be the minimal, behaviour-preserving option, at the cost of two extra entry points and a changed ABI.","line":10,"path":"src/VerdictIMD.sol","reproduction":"State: Alice holds 150e18 VERDICT. 1) Alice: approve(Bob, 100e18). 2) Alice later decides Bob should have only 50e18 in total and submits approve(Bob, 50e18). 3) Bob sees the pending tx and submits transferFrom(Alice, Bob, 100e18) first; it succeeds (allowance 100e18 -> 0). 4) Alice's approve(Bob, 50e18) is mined; allowance is now 50e18. 5) Bob: transferFrom(Alice, Bob, 50e18) succeeds. Expected by Alice: Bob can take at most 100e18 in total (her first approval) or 50e18 (her reduction). Actual: Bob receives 150e18; Alice's balance is 0. Verified with a Foundry test (test/scratch, not kept): balanceOf(Bob) == 150e18, balanceOf(Alice) == 0. Total supply and the sum of balances are unchanged, so no value is created, only moved by a spender the holder had itself approved.","severity":"info","snippet":"contract VerdictIMD is ERC20 {","title":"Inherited ERC-20 approve() replaces the allowance, so lowering a nonzero allowance can be front-run (standard, documented; no change required)"}],"hash":"a9a52bb01c84ca59646255acdd52bfbd7d6ed9c226106f7a345e67a8bdd7e3c6","nodeId":"f8beb00e-fdda-46af-9744-c80b9aac167d","outcome":"completed","summary":"The review is complete and the findings file is written and validated.\n\n**Outcome: no defects in the economics area.** VerdictIMD is an unmodified OpenZeppelin v5 ERC-20 with a single constructor mint of the manifest supply to the deployer. I checked it against the Economic Security, Invariant and Flow Gap guides and found nothing that loses funds, pays the wrong party, or breaks a launch flow.\n\nWhat I verified, with the existing suite plus a scratch Foundry test that I ran and then removed:\n\n- **Conservation.** Total supply is fixed at the constructor's mint and always equals the sum of balances. No burn, mint, pause, freeze, blacklist or recovery entry point exists, and the runtime has no delegatecall or selfdestruct.\n- **Launch flows.** Factory to distributor, distributor to claimant, factory to PoolManager seed, and trader buy and sell all move exactly the requested amount. No tax, exemption list or external call is involved, so the protected floor's exactness checks hold by construction.\n- **Boundaries and sentinels.** Zero address is rejected as sender, receiver, approver and spender. Zero-value and self-transfers preserve balances. Infinite allowance never decreases. Reverts are atomic.\n- **Dependencies.** The contract makes no external calls, so there is nothing an oracle, callback or foreign token can derail.\n\nThe file holds one informational entry, not a defect: the standard ERC-20 allowance-replacement race, which the README already documents. I recorded it with concrete numbers (a spender approved for 100 who front-runs a reduction to 50 can take 150) only because the Economic Security guide asks for every value-loss path to be named. It needs no change to the agreed design.\n\nCoverage rows answer all three listed entry points as holding, plus four invariant rows. One row is marked unreached: there is no launch.json in the tree yet, so the manifest could not be reviewed, though the README's stated split and supply match the code.","treeHash":null,"usage":{"cachedInputTokens":766906,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":12350,"runtime":"claude","turns":18,"wallClockMs":208907}},{"artifacts":[],"attempt":1,"bundleHash":"3203a0644d525aae3458e050254e46e99d553e04c1ec8d246ee0821692673bd5","device":"b312209aac1edeae","findings":[],"hash":"b28867ebd8ff78fe88b75e33c216f5020e52bc99f011308976006f8e54ce396b","nodeId":"ce2e8802-e9a1-43b3-8657-1b1598feac35","outcome":"completed","summary":"Created [launch.json](/root/nft5/.identitymd/work/3efe528b-e506-4b7d-bc98-502507d42006/ce2e8802-e9a1-43b3-8657-1b1598feac35/launch.json) matching the accepted token, constructor, supply, pool and economics.\n\n`forge build` succeeded. `forge test` passed all 33 tests with the supplied fuzz seed. Only `launch.json` is changed for submission.","treeHash":"f67f9b5c5e018d17fe135e2e8387cfa76919f5d1","usage":{"cachedInputTokens":184192,"inputTokens":24976,"model":"gpt-6-astra","outputTokens":2946,"runtime":"codex","turns":3,"wallClockMs":104070}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a4c81f495eb81dd0","findings":[],"hash":"f9c1b0fb7489d3addb57ff3046684ce770cd91e0dad398429712870419a6944a","nodeId":"af7ff8ef-7d25-47a1-81a2-4af568264470","outcome":"completed","summary":"The review is complete. The findings file is in place and the working tree holds nothing but it, which the repository's own exclude list already covers.\n\n**Result: no defects in the math area.** The token at `src/VerdictIMD.sol` is a plain OpenZeppelin v5.0.2 ERC20 whose constructor mints one constant to the deployer. There is no division, no scaling, no narrowing cast, no external call, no payable path and no bytes decoding, so most of the Math Precision, Boundary and Numerical Gap failure modes have no surface here. The ones that do apply were traced and tested with concrete inputs:\n\n- **Supply literal.** The aderyn lead at line 12 evaluates at compile time to exactly 1e27, which matches the README and the manifest form and fits in uint128. Not a defect.\n- **Unchecked arithmetic in the vendored transfer path.** Each unchecked block is preceded by a checked bound, and the vendored library files match the pinned v5.0.2 hashes byte for byte.\n- **Edge inputs.** A scratch Foundry suite exercised 1 wei, zero, full supply, self-transfer of the full supply, max uint amounts, allowance at max and max minus one, zero-amount delegated transfers, burn attempts and ETH sent with and without calldata. All nine tests passed, including a fuzzed three-party conservation check. The scratch file was removed afterwards.\n- **Launch flows.** Nothing deducts on transfer, so the swarm, pool and remainder shares of 1e27 arrive whole.\n\nThe project's own suite of 33 tests also passes on this tree.\n\nCoverage rows were written for all three ABI entry points as `holds`, plus four invariant rows covering the supply constant, supply conservation, the boundary enumeration and the launch flows. Nothing in the assigned area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":691557,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":11738,"runtime":"claude","turns":24,"wallClockMs":185176}}],"verification":[{"checks":[{"durationMs":1158,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.08s\nCompiler run successful!\n","passed":true},{"durationMs":2303,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/VerdictIMD.t.sol:VerdictIMDTest\n[PASS] testFuzz_create2MintsToImmediateDeployer(bytes32) (runs: 1024, μ: 299909, ~: 300014)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 1024, μ: 92901, ~: 93213)\nLogs:\n  Bound result 253843687800147452576157402\n\n[PASS] testFuzz_transferFromAccountsExactly(uint256,uint256) (runs: 1024, μ: 162788, ~: 164852)\nLogs:\n  Bound result 472865\n  Bound result 429154\n\n[PASS] testFuzz_transferFromOverAllowanceIsAtomic(uint256,uint256) (runs: 1024, μ: 123202, ~: 123460)\nLogs:\n  Bound result 241208080949551448324438154\n  Bound result 758791919050448551676034711\n\n[PASS] testFuzz_transferOverBalanceRevertsWithoutChanges(uint256) (runs: 1024, μ: 69138, ~: 69484)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129659092\n\n[PASS] test_approveEmitsAndOnlyChangesCallersAllowance() (gas: 104066)\n[PASS] test_approveReplacesAndRevokesAllowance() (gas: 174386)\n[PASS] test_approveWithoutBalanceIsAllowed() (gas: 78348)\n[PASS] test_approveZeroSpenderReverts() (gas: 54442)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9633)\n[PASS] test_launchAllocationsClaimsAndPoolTransfersAreExact() (gas: 645289)\n[PASS] test_metadataAndInitialSupply() (gas: 107605)\n[PASS] test_noMintBurnOrAdministrativeEntryPoints() (gas: 1111328)\n[PASS] test_plainEtherTransferIsRejected() (gas: 42617)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsSizeLimit() (gas: 786610)\n[PASS] test_transferDoesNotCallRecipient() (gas: 176930)\n[PASS] test_transferEmitsExactAmount() (gas: 93549)\n[PASS] test_transferEntireSupplyAndReturn() (gas: 149168)\n[PASS] test_transferFromByHolderStillNeedsAllowance() (gas: 42640)\n[PASS] test_transferFromEmptyBalanceReverts() (gas: 37909)\n[PASS] test_transferFromExhaustsAllowance() (gas: 161817)\n[PASS] test_transferFromInfiniteAllowanceIsNotReduced() (gas: 139274)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 188800)\n[PASS] test_transferFromSpendsAllowanceAndEmitsTransfer() (gas: 162358)\n[PASS] test_transferFromToSelfSpendsAllowanceWithoutChangingBalance() (gas: 109620)\n[PASS] test_transferFromWrongSpenderReverts() (gas: 117790)\n[PASS] test_transferFromZeroRecipientRestoresAllowance() (gas: 103910)\n[PASS] test_transferFromZeroSourceRevertsEvenForZeroAmount() (gas: 41996)\n[PASS] test_transferToSelfPreservesBalance() (gas: 51420)\n[PASS] test_transferToZeroRevertsEvenForZeroAmount() (gas: 71926)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 63047)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 78793)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 33.07ms (172.17ms CPU time)\n\nRan 1 test for test/VerdictIMD.invariant.t.sol:VerdictIMDInvariantTest\n[PASS]\nVerdictIMDInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchUserActions\n[PASS] invariant_supplyIsFixedAndFullyAccountedFor\n VerdictIMDInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------------+-------+---------+----------╮\n| Contract     | Selector       | Calls | Reverts | Discards |\n+============================================================+\n| TokenHandler | approve        | 1992  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| TokenHandler | rejectOverdraw | 2014  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| TokenHandler | transfer       | 2117  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| TokenHandler | transferFrom   | 2069  | 0       | 0        |\n╰--------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 339869855670361053379131266\n  Bound result 1359\n  Bound result 179\n  Bound result 0\n  Bound result 149\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2794\n  Bound result 11\n  Bound result 2110234842\n  Bound result 5\n  Bound result 7\n  Bound result 12\n  Bound result 350558877544524551061281717\n  Bound result 5127\n  Bound result 25000000000000000000\n  Bound result 3868\n  Bound result 2\n  Bound result 4393\n  Bound result 146109504434819132682917369\n  Bound result 6062\n  Bound result 3792\n  Bound result 238\n  Bound result 3\n  Bound result 789\n  Bound result 111\n  Bound result 3697\n  Bound result 0\n  Bound result 2440\n  Bound result 3233\n  Bound result 543\n  Bound result 2\n  Bound result 10000000000000000000\n  Bound result 13143066881980668879\n  Bound result 18\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.23s (2.23s CPU time)\n\nRan 2 test suites in 2.23s (2.26s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":40,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VerdictIMD.approve(address,uint256)\",\"VerdictIMD.transfer(address,uint256)\",\"VerdictIMD.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":124,\"dependencies.json\":54,\"foundry.toml\":21,\"remappings.txt\":2,\"src/VerdictIMD.sol\":17,\"test/VerdictIMD.invariant.t.sol\":117,\"test/VerdictIMD.t.sol\":398,\"test/helpers/TokenFactory.sol\":22},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":411,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":227,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/VerdictIMD.sol:12: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"07932a8f5ed5112eb8fe8d254c55f3533a161c1ab408e761eaab5c3d3a934911","verifiedTreeHash":"6ce61a3ce0b7c37b0df6e33f884ad3a151c431b5","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":1632,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.55s\nCompiler run successful!\n","passed":true},{"durationMs":4393,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/VerdictIMD.t.sol:VerdictIMDTest\n[PASS] testFuzz_create2MintsToImmediateDeployer(bytes32) (runs: 1024, μ: 299905, ~: 300014)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 1024, μ: 92917, ~: 93213)\nLogs:\n  Bound result 9313720495373280151\n\n[PASS] testFuzz_transferFromAccountsExactly(uint256,uint256) (runs: 1024, μ: 163008, ~: 164852)\nLogs:\n  Bound result 890434763046493400218610097\n  Bound result 8684364908014\n\n[PASS] testFuzz_transferFromOverAllowanceIsAtomic(uint256,uint256) (runs: 1024, μ: 123217, ~: 123460)\nLogs:\n  Bound result 4737913509705143937920\n  Bound result 726662539349750127535392492\n\n[PASS] testFuzz_transferOverBalanceRevertsWithoutChanges(uint256) (runs: 1024, μ: 69132, ~: 69484)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129661768\n\n[PASS] test_approveEmitsAndOnlyChangesCallersAllowance() (gas: 104066)\n[PASS] test_approveReplacesAndRevokesAllowance() (gas: 174386)\n[PASS] test_approveWithoutBalanceIsAllowed() (gas: 78348)\n[PASS] test_approveZeroSpenderReverts() (gas: 54442)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9633)\n[PASS] test_launchAllocationsClaimsAndPoolTransfersAreExact() (gas: 645289)\n[PASS] test_metadataAndInitialSupply() (gas: 107605)\n[PASS] test_noMintBurnOrAdministrativeEntryPoints() (gas: 1111328)\n[PASS] test_plainEtherTransferIsRejected() (gas: 42617)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsSizeLimit() (gas: 786610)\n[PASS] test_transferDoesNotCallRecipient() (gas: 176930)\n[PASS] test_transferEmitsExactAmount() (gas: 93549)\n[PASS] test_transferEntireSupplyAndReturn() (gas: 149168)\n[PASS] test_transferFromByHolderStillNeedsAllowance() (gas: 42640)\n[PASS] test_transferFromEmptyBalanceReverts() (gas: 37909)\n[PASS] test_transferFromExhaustsAllowance() (gas: 161817)\n[PASS] test_transferFromInfiniteAllowanceIsNotReduced() (gas: 139274)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 188800)\n[PASS] test_transferFromSpendsAllowanceAndEmitsTransfer() (gas: 162358)\n[PASS] test_transferFromToSelfSpendsAllowanceWithoutChangingBalance() (gas: 109620)\n[PASS] test_transferFromWrongSpenderReverts() (gas: 117790)\n[PASS] test_transferFromZeroRecipientRestoresAllowance() (gas: 103910)\n[PASS] test_transferFromZeroSourceRevertsEvenForZeroAmount() (gas: 41996)\n[PASS] test_transferToSelfPreservesBalance() (gas: 51420)\n[PASS] test_transferToZeroRevertsEvenForZeroAmount() (gas: 71926)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 63047)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 78793)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 81.91ms (406.21ms CPU time)\n\nRan 9 tests for test/VerdictIMD.boundaries.t.sol:VerdictIMDBoundariesTest\n[PASS] testFuzz_approvalSupportsFullUint256Range(uint256) (runs: 1000, μ: 100803, ~: 101205)\n[PASS] testFuzz_partialBalanceFailurePreservesFiniteAllowance(uint256,uint256) (runs: 1000, μ: 208686, ~: 208964)\nLogs:\n  Bound result 242\n  Bound result 1253\n\n[PASS] testFuzz_splitTransfersEqualSingleTransfer(uint256,uint256) (runs: 1000, μ: 357888, ~: 358767)\nLogs:\n  Bound result 266865231116415407714634\n  Bound result 12\n\n[PASS] testFuzz_twoSpendersHaveIndependentBudgets(uint256,uint256) (runs: 1000, μ: 326378, ~: 326596)\nLogs:\n  Bound result 31218\n  Bound result 318432962273129\n\n[PASS] test_infiniteApprovalCanBeReplacedAndRevokedAfterUse() (gas: 292179)\n[PASS] test_infiniteApprovalStillRejectsZeroRecipientForZeroAndFullSupply() (gas: 154358)\n[PASS] test_maximumFiniteAllowanceIsDecremented() (gas: 152773)\n[PASS] test_maximumTransferRevertsAndPreservesInfiniteApproval() (gas: 133899)\n[PASS] test_oneWeiCanBeTransferredAndSpentWithExactApproval() (gas: 192361)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 82.03ms (254.62ms CPU time)\n\nRan 1 test for test/VerdictIMD.invariant.t.sol:VerdictIMDInvariantTest\n[PASS]\nVerdictIMDInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchUserActions\n[PASS] invariant_supplyIsFixedAndFullyAccountedFor\n VerdictIMDInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+-------------------------+-------+---------+----------╮\n| Contract     | Selector                | Calls | Reverts | Discards |\n+=====================================================================+\n| TokenHandler | approve                 | 2047  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| TokenHandler | rejectDelegatedOverdraw | 2052  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| TokenHandler | rejectOverdraw          | 2018  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| TokenHandler | rejectUnderapproved     | 2014  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| TokenHandler | rejectZeroRecipient     | 2048  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| TokenHandler | rejectZeroSpender       | 2006  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| TokenHandler | transfer                | 2095  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| TokenHandler | transferFrom            | 2104  | 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 420421862221711922344454080\n  Bound result 0\n  Bound result 205935403126272626148032722\n  Bound result 0\n  Bound result 20000000000000000000\n  Bound result 4472\n  Bound result 5796\n  Bound result 7662085604080832133692239969529383683024494190\n  Bound result 17\n  Bound result 0\n  Bound result 1546\n  Bound result 244\n  Bound result 4688379676781090973261080\n  Bound result 46315746530430669631788763\n  Bound result 0\n  Bound result 0\n  Bound result 1057455182895390924001621\n  Bound result 285818675538670598414036\n  Bound result 802263588155711217663377339\n  Bound result 91328252238369608861354\n  Bound result 0\n  Bound result 7683\n  Bound result 81008941\n  Bound result 345\n  Bound result 8982\n  Bound result 896\n  Bound result 308\n  Bound result 17\n  Bound result 133\n  Bound result 15\n  Bound result 1254\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.30s (4.30s CPU time)\n\nRan 3 test suites in 4.31s (4.47s CPU time): 42 tests passed, 0 failed, 0 skipped (42 total tests)\n","passed":true},{"durationMs":46,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VerdictIMD.approve(address,uint256)\",\"VerdictIMD.transfer(address,uint256)\",\"VerdictIMD.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":124,\"dependencies.json\":54,\"foundry.toml\":21,\"remappings.txt\":2,\"src/VerdictIMD.sol\":17,\"test/VerdictIMD.boundaries.t.sol\":175,\"test/VerdictIMD.invariant.t.sol\":177,\"test/VerdictIMD.t.sol\":398,\"test/helpers/TokenFactory.sol\":22},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6bfbde173c33ce04a1088f65d78c77e37332e00026527aa44aba2e865b009008","verifiedTreeHash":"db7609de2bce0d425b041244da36efa552c5b6fb","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":1377,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.29s\nCompiler run successful!\n","passed":true},{"durationMs":2589,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/VerdictIMD.t.sol:VerdictIMDTest\n[PASS] testFuzz_create2MintsToImmediateDeployer(bytes32) (runs: 1024, μ: 299909, ~: 300014)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 1024, μ: 92901, ~: 93213)\nLogs:\n  Bound result 253843687800147452576157402\n\n[PASS] testFuzz_transferFromAccountsExactly(uint256,uint256) (runs: 1024, μ: 162788, ~: 164852)\nLogs:\n  Bound result 832267031199462216561989937\n  Bound result 2651508951034\n\n[PASS] testFuzz_transferFromOverAllowanceIsAtomic(uint256,uint256) (runs: 1024, μ: 123202, ~: 123460)\nLogs:\n  Bound result 748861145093336671908448057\n  Bound result 753416564723180301624300051\n\n[PASS] testFuzz_transferOverBalanceRevertsWithoutChanges(uint256) (runs: 1024, μ: 69138, ~: 69484)\nLogs:\n  Bound result 34989175728933068340752179212049622393\n\n[PASS] test_approveEmitsAndOnlyChangesCallersAllowance() (gas: 104066)\n[PASS] test_approveReplacesAndRevokesAllowance() (gas: 174386)\n[PASS] test_approveWithoutBalanceIsAllowed() (gas: 78348)\n[PASS] test_approveZeroSpenderReverts() (gas: 54442)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9633)\n[PASS] test_launchAllocationsClaimsAndPoolTransfersAreExact() (gas: 645289)\n[PASS] test_metadataAndInitialSupply() (gas: 107605)\n[PASS] test_noMintBurnOrAdministrativeEntryPoints() (gas: 1111328)\n[PASS] test_plainEtherTransferIsRejected() (gas: 42617)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsSizeLimit() (gas: 786610)\n[PASS] test_transferDoesNotCallRecipient() (gas: 176930)\n[PASS] test_transferEmitsExactAmount() (gas: 93549)\n[PASS] test_transferEntireSupplyAndReturn() (gas: 149168)\n[PASS] test_transferFromByHolderStillNeedsAllowance() (gas: 42640)\n[PASS] test_transferFromEmptyBalanceReverts() (gas: 37909)\n[PASS] test_transferFromExhaustsAllowance() (gas: 161817)\n[PASS] test_transferFromInfiniteAllowanceIsNotReduced() (gas: 139274)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 188800)\n[PASS] test_transferFromSpendsAllowanceAndEmitsTransfer() (gas: 162358)\n[PASS] test_transferFromToSelfSpendsAllowanceWithoutChangingBalance() (gas: 109620)\n[PASS] test_transferFromWrongSpenderReverts() (gas: 117790)\n[PASS] test_transferFromZeroRecipientRestoresAllowance() (gas: 103910)\n[PASS] test_transferFromZeroSourceRevertsEvenForZeroAmount() (gas: 41996)\n[PASS] test_transferToSelfPreservesBalance() (gas: 51420)\n[PASS] test_transferToZeroRevertsEvenForZeroAmount() (gas: 71926)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 63047)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 78793)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 34.45ms (177.15ms CPU time)\n\nRan 1 test for test/VerdictIMD.invariant.t.sol:VerdictIMDInvariantTest\n[PASS]\nVerdictIMDInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchUserActions\n[PASS] invariant_supplyIsFixedAndFullyAccountedFor\n VerdictIMDInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------------+-------+---------+----------╮\n| Contract     | Selector       | Calls | Reverts | Discards |\n+============================================================+\n| TokenHandler | approve        | 1992  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| TokenHandler | rejectOverdraw | 2014  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| TokenHandler | transfer       | 2117  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| TokenHandler | transferFrom   | 2069  | 0       | 0        |\n╰--------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 339869855670361053379131266\n  Bound result 1359\n  Bound result 179\n  Bound result 0\n  Bound result 149\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2794\n  Bound result 11\n  Bound result 2110234842\n  Bound result 5\n  Bound result 7\n  Bound result 12\n  Bound result 350558877544524551061281717\n  Bound result 5127\n  Bound result 25000000000000000000\n  Bound result 3868\n  Bound result 2\n  Bound result 4393\n  Bound result 146109504434819132682917369\n  Bound result 6062\n  Bound result 3792\n  Bound result 238\n  Bound result 3\n  Bound result 789\n  Bound result 111\n  Bound result 3697\n  Bound result 0\n  Bound result 2440\n  Bound result 3233\n  Bound result 543\n  Bound result 2\n  Bound result 10000000000000000000\n  Bound result 13143066881980668879\n  Bound result 18\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.49s (2.49s CPU time)\n\nRan 2 test suites in 2.49s (2.53s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VerdictIMD.approve(address,uint256)\",\"VerdictIMD.transfer(address,uint256)\",\"VerdictIMD.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":124,\"dependencies.json\":54,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/VerdictIMD.sol\":17,\"test/VerdictIMD.invariant.t.sol\":117,\"test/VerdictIMD.t.sol\":398,\"test/helpers/TokenFactory.sol\":22},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b28867ebd8ff78fe88b75e33c216f5020e52bc99f011308976006f8e54ce396b","verifiedTreeHash":"f67f9b5c5e018d17fe135e2e8387cfa76919f5d1","verifierVersion":"0.1.0+8fbf00a5"}]}