{"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":"12c33497-d074-4ba6-ba82-d881a7711414","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"cf25aab12a1c76ad3dfabb35631003392ce1fc019b8f8347083c4d9c96bcb30d","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"141af8553a4e2f3363ae42cb0b2397a98404e727f4741ac1ed2e72c3ff5f00cd","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"2761edca40a25e33004171dae4b15a650c5f92c07784ea1cf80889f6d87c93fc","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","subagents":4,"tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"2d5b0b89e9ae3c6892579a7a201e6a966ece0d97f0ed4d070424edac20fea14c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"d5fcb7555c5d654e96559228ad5ddd2802a9779fb160a5e9fc936369a5daa032","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"60e68ce642a62f413d591cad76203f103abede656e8855122271e72976ffe820","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"05f31c06bbe1618ae38985d2afc501014a806606c41c54ca5aa726590c833af8","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"a8dae02e6deffbe816de40c6f507a97ac7598ba14ff0f9834b27adac62a117d0","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: IMDuel (IMDUEL).\nToken name: IMDuel\nToken symbol: IMDUEL\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"7c82fa0075a4046beaad877835a687b62b6392467f1927d5944aa1f0b2383b3e","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"12c33497-d074-4ba6-ba82-d881a7711414","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2845-imduel"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52614","feedbackHash":"6cf861facb28ea919010a096d2edcdc16ca1d676dffbacf91d965a4a7ffb63a2","nodeKey":"audit_economics","submissionHash":"cf25aab12a1c76ad3dfabb35631003392ce1fc019b8f8347083c4d9c96bcb30d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51188","feedbackHash":"3c2520b9c8308b8b9fac1633f39ab6ad1b7367da74305fe4c08885cfeb22a20c","nodeKey":"audit_flow","submissionHash":"141af8553a4e2f3363ae42cb0b2397a98404e727f4741ac1ed2e72c3ff5f00cd","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52166","feedbackHash":"c9f9d003b1d6eba4150009f732814ac0c42db848e25bbcaeaca9435fc840f813","nodeKey":"audit_judge","submissionHash":"2761edca40a25e33004171dae4b15a650c5f92c07784ea1cf80889f6d87c93fc","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51488","feedbackHash":"5d0a65eb2ec6ed1bc748e3b4d9dc9c9e7c8f495d6d3a7a0d3942526ce22e8621","nodeKey":"audit_math","submissionHash":"2d5b0b89e9ae3c6892579a7a201e6a966ece0d97f0ed4d070424edac20fea14c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52682","feedbackHash":"d5eb9c31b125b8c765111cabf0d2ead5b8847e48feb0305ef5c2e2b2350fd469","nodeKey":"audit_permissions","submissionHash":"d5fcb7555c5d654e96559228ad5ddd2802a9779fb160a5e9fc936369a5daa032","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52366","feedbackHash":"4e30d87f70b49721ada25644b0da156dc4f65d069fd3fd4d047041edb9bc9691","nodeKey":"build_contract_project","submissionHash":"60e68ce642a62f413d591cad76203f103abede656e8855122271e72976ffe820","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51875","feedbackHash":"577410f6f10d946789e9f22251ad1083c4a5a8d2d44b990f6bf98a7346aa6842","nodeKey":"manifest","submissionHash":"05f31c06bbe1618ae38985d2afc501014a806606c41c54ca5aa726590c833af8","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51502","feedbackHash":"9478653473335c27773b195955b3350daf7a97654359e2f9e740e58907bb9feb","nodeKey":"write_foundry_tests","submissionHash":"a8dae02e6deffbe816de40c6f507a97ac7598ba14ff0f9834b27adac62a117d0","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"72fbae2421e417f75a52717eaf13d3fee2c1df414f70d64463776e6aa907c5e1","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"fe8b9f5158e3fa3bb759351773c3987c8d50954dcd713adbcee903e28ba20499","device":"672c29f92850efe0","findings":[],"hash":"05f31c06bbe1618ae38985d2afc501014a806606c41c54ca5aa726590c833af8","nodeId":"1532ea43-7df4-4401-b77b-333a3eb0270d","outcome":"completed","summary":"Done. I wrote launch.json for the IMDuel launch and verified it against the accepted tree.\n\n**What the manifest says**\n\n- Kind is custom_token. The token contract is IMDuelToken with name IMDuel, symbol IMDUEL and 18 decimals.\n- constructorArgs is empty. The accepted constructor takes no parameters, confirmed from the source and the compiled ABI.\n- totalSupply is 1000000000000000000000000000, the constant the constructor mints once to msg.sender.\n- contracts is empty. The accepted tree holds only the token, with no application contracts.\n- pool and economics are copied exactly as the launch gives them: IMD as paired currency, fee 12500, tick spacing 60, the one-to-one provenance price, and the requester's economics object verbatim.\n- notes describe the token's behavior, the absence of fees and privileged paths, and that no application contracts or initialization calls exist. They run well under the 4000 character limit.\n\n**Checks run**\n\n- A script confirmed the manifest's keys match the schema, the supply equals a billion tokens in minor units, and pool and economics match the required values byte for byte.\n- forge build compiled cleanly.\n- forge test with the verifier's fuzz seed passed all 36 tests.\n- git status shows launch.json as the only new or changed file.","treeHash":"3e67d02d4f2b003f6b3cdedeb1570e1779856216","usage":{"cachedInputTokens":142303,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3173,"runtime":"claude","turns":9,"wallClockMs":50803}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0b0761c9b10fe0bb","findings":[],"hash":"141af8553a4e2f3363ae42cb0b2397a98404e727f4741ac1ed2e72c3ff5f00cd","nodeId":"ffe2ebf9-a194-4e23-8fdc-7b5f3be0cb15","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree holds no other changes.\n\n**Result: no defects found in the control-flow area.** The findings list is empty and the coverage record answers all three entry points as `holds`, plus four invariant rows.\n\n**What I checked, per guide**\n\n- **Execution Trace.** Traced `transfer`, `approve` and `transferFrom` from entry to final storage write. Allowance is spent before the balance move, but every later revert path rolls the whole transaction back, so no residual spend survives. Sentinel paths behave correctly: a zero sender reverts even for a zero value, max allowance is never decremented, and max minus one decrements normally. There are no external calls, so no stale reads or reentrancy windows exist.\n- **Periphery.** The token imports nothing. The compiled ABI exposes exactly three nonpayable functions, ten views, two events and six errors. Unknown selectors and ether both revert. The reference deploy script is not used by the launch. A v4-style low-level `transfer` call decodes `true`, and an over-balance call fails loudly rather than silently.\n- **First Principles.** The one invariant that matters, sum of balances equals the constant supply, held under a stateful fuzz with a handler driving random transfers and delegated transfers across tracked actors. The unchecked addition in the balance update cannot overflow because balances sum to one billion tokens. Supply, decimals and the README manifest value all agree.\n\n**Leads I dismissed**\n\n- The plain EIP-20 approve front-running property is reproducible but inherent to the standard, matches OpenZeppelin v5, and is documented in the README. It is recorded in the coverage row, not as a finding.\n- The aderyn large-numeric-literal line is style only.\n\n**Verification run**\n\n| Check | Result |\n| --- | --- |\n| Project tests | 36 passed |\n| Scratch tests, including the stateful invariant | 11 passed |\n| Build warnings | 0 |\n| `forge fmt --check` | clean |\n\nScratch tests were removed after running, so the only file I produced is the findings record at the repository root.","treeHash":null,"usage":{"cachedInputTokens":588411,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14627,"runtime":"claude","turns":24,"wallClockMs":503787}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7f1dec5ffcbde1d8","findings":[{"citation":"resolved","description":"Merged from the permissions specialist (the only specialist finding; math, flow, economics and the independent tester reported none). `_approve` sets the allowance with `=` (line 159) while `_spendAllowance` decrements it (line 168), which is plain EIP-20 and identical to OpenZeppelin v5. A spender who observes the holder lowering a non-zero allowance can spend the old value first and then the new one. This is not a permission bypass: the spender never moves more than the sum of values the holder explicitly approved, `transferFrom` keys only on msg.sender's own allowance (line 131), and README.md lines 41-44 disclose the caveat and the mitigation (set to zero first). Kept at info so the record shows it was checked; no code change is required and increase/decreaseAllowance would be a design choice, not a defect fix. Reproduced in test/scratch/Judge.t.sol::test_approveOverwriteRace (passes on this code, meaning the race is reproducible). All other leads were dropped: aderyn's large-numeric-literal at line 26 is the compile-time constant 1_000_000_000 * 10**18 = 1e27, which equals launch.json token.totalSupply exactly; slither reported nothing.","line":159,"path":"src/IMDuelToken.sol","reproduction":"State: deployer D holds the supply; D.transfer(alice, 200e18). 1) alice: approve(bob, 100e18). 2) alice submits approve(bob, 50e18) to lower it. 3) bob front-runs with transferFrom(alice, bob, 100e18) -> succeeds, allowance(alice,bob) == 0. 4) alice's approve(bob, 50e18) mines -> allowance == 50e18. 5) bob: transferFrom(alice, bob, 50e18) -> succeeds. Expected under alice's intent: bob holds at most 100e18. Actual: balanceOf(bob) == 150e18. Conformant to EIP-20; disclosed in README.md 'Assumptions'.","severity":"info","snippet":"        _allowances[owner][spender] = value;","title":"approve overwrites the allowance: the standard EIP-20 approve front-running race applies (documented trust assumption, no fix required)"}],"hash":"2761edca40a25e33004171dae4b15a650c5f92c07784ea1cf80889f6d87c93fc","nodeId":"1d590c6e-de3a-4b40-af5e-b85637b967f2","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root.\n\n**Outcome:** no defects. The token is a minimal, self-contained ERC-20 and every entry point holds.\n\n**Specialist findings judged**\n\n- The permissions specialist's info note on the approve overwrite race was the only finding across all four areas and the tester. I reproduced it in a scratch Foundry test, where bob ends with 150e18 after alice intended at most 100e18 outstanding. It is plain EIP-20 behaviour, identical to OpenZeppelin v5, and disclosed in the README. Kept at info as a documented trust assumption with no fix required.\n- Aderyn's large-numeric-literal lead was dropped. The literal is the compile-time constant 1e27, which equals the manifest's totalSupply exactly.\n- Slither reported nothing.\n\n**My own pass**\n\n- Traced transfer, approve and transferFrom through their checks, unchecked arithmetic and failure paths, including self-transfer, zero sender and max allowance.\n- Emulated the launch floor: CREATE2 deploy from a factory stub with no constructor arguments mints the whole supply to the factory, decimals and metadata match, flows arrive whole, and 14 privileged selectors all revert without touching a holder.\n- Checked the manifest against the schema rules: only schema keys, contract name within 32 characters, empty constructorArgs matching the constructor, supply and decimals matching, lowercase addresses, notes well under the cap.\n- The full project suite of 64 tests, including invariants, passes.\n\n**Coverage record** answers all three listed entry points plus three invariant rows. The scratch test directory was removed, so no repository files were changed.","treeHash":null,"usage":{"cachedInputTokens":332073,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":8976,"runtime":"claude","turns":17,"wallClockMs":152986}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5835e48821d8827d","findings":[],"hash":"2d5b0b89e9ae3c6892579a7a201e6a966ece0d97f0ed4d070424edac20fea14c","nodeId":"dc2d68a8-5876-426f-a529-c6a6e5323151","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree is otherwise untouched.\n\n**Result: no defects in the math area.** The IMDuel token in `src/IMDuelToken.sol` is a 170-line fixed-supply ERC-20 with no fee, burn, mint, owner or external call. Its only arithmetic is a compile-time supply constant, two guarded unchecked subtractions and one unchecked addition. I checked each against the Math Precision, Boundary and Numerical Gap guides and found nothing that rounds, truncates, overflows or misbehaves at an edge.\n\nWhat I verified, by hand trace and by a scratch Foundry suite that ran green and was then deleted:\n\n- **Supply constant.** The aderyn large-literal lead evaluates to exactly 1e27, matching the manifest string in the README. It is far below any overflow and divisible by 10,000, so the 10/80/10 launch split has no dust.\n- **Unchecked block in `_transfer`.** The subtraction is guarded by the balance check on the line above. The addition cannot overflow because balances are written only by the constructor and by zero-sum moves, so their sum is the constant 1e27. A four-actor fuzz over 2,000 runs held that invariant.\n- **Self-transfer.** The sender's balance is written before the receiver's is read, so transferring to oneself preserves the balance on both the transfer and transferFrom paths.\n- **Allowance edges.** The max-uint sentinel is the only unlimited value. Max minus one is decremented normally. Max-value transfers revert at the balance check before any unchecked arithmetic.\n- **Zero inputs.** Zero-amount calls take the full checked path and still reject a zero receiver. A zero-address sender through transferFrom reverts at the allowance or sender check.\n- **Boundary enumeration.** There are no external calls, no payable functions, no receive or fallback, and no bytes decoding, so the Boundary guide's call-site corner cases have nothing to apply to.\n\nThe existing 36-test suite passes with the verifier's fuzz seed. The coverage record has seven rows: the three listed entry points all hold, plus four invariant rows covering the sum-of-balances invariant, the supply literal, the boundary enumeration and the launch flows. The protected launch harness depends on v4-core and a LaunchLiquidity library that are not in this tree, so the launch flows were traced from the token's side rather than executed.\n\nNothing outside my area stood out as severe. The approve front-running race the README documents is standard ERC-20 behavior and the author has already disclosed it, so I did not report it.","treeHash":null,"usage":{"cachedInputTokens":577020,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":11551,"runtime":"claude","turns":23,"wallClockMs":170005}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"20e8e883cb88740a","findings":[],"hash":"60a20a374bba1ec65c31243d53ee9469e9a1465d3c7324a9679c9ec3e527f9c5","nodeId":"f9e08876-3d8b-4b02-a946-77511b6b078c","outcome":"failed","summary":"API Error: Your account can't receive replies from Claude right now. You can find the next step in the Anthropic Verification Portal: https://portal.anthropic.com/…","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"claude","turns":1,"wallClockMs":1791}},{"artifacts":[],"attempt":1,"bundleHash":"a0360805e55acf66d5b3c33a2f169c5d6cd5403926771f7987e9515ae0cf2a88","device":"1188f01303e45ecd","findings":[],"hash":"60e68ce642a62f413d591cad76203f103abede656e8855122271e72976ffe820","nodeId":"4bf78057-914d-4a74-9e48-68474fa82674","outcome":"completed","summary":"The work is complete and committed. The commit builds, tests and format-checks cleanly from a fresh archive of HEAD with no network and the verifier's fuzz seed.\n\n**What was delivered** (commit `3bbff97` on main):\n\n- `src/IMDuelToken.sol`: a self-contained fixed-supply ERC-20. Name `IMDuel`, symbol `IMDUEL`, 18 decimals. The constructor takes no arguments and mints the whole supply once to `msg.sender`, which is the factory at launch. There is no owner, mint, burn, pause, fee, blocklist, delegatecall or selfdestruct, so the privileged-call and supply-growth checks in the pinned protected test have nothing to reach.\n- `test/IMDuelToken.t.sol` and `test/DeployIMDuelToken.t.sol`: 36 tests covering metadata, the constructor mint, transfer and transferFrom success paths, every revert path with its typed error, infinite allowance handling, caller-only allowance spending, a sweep of admin selectors that must not exist, an opcode walk of the runtime, a simulated launch flow where each share arrives whole, and four fuzz tests.\n- `script/DeployIMDuelToken.s.sol`: a reference deploy script whose `deploy()` is tested directly and which reads no environment variables.\n- `foundry.toml` pins solc 0.8.26, cancun, optimizer on, and `bytecode_hash = \"none\"`. The built runtime trailer carries only the compiler version, no metadata hash.\n- `lib/forge-std/` is forge-std v1.9.7 vendored as plain files. Every tracked entry is mode 100644, so there is no submodule.\n- `README.md` documents assumptions, the fixed launch parameters, the empty \"After launch\" list, operational responsibilities and the security review against the pinned eth-security reference.\n\n**Check results**\n\n| Check | Result |\n| --- | --- |\n| forge build | passes |\n| forge test with the verifier's fuzz seed | 36 passed, 0 failed |\n| forge fmt --check | passes |\n\nSlither and Mythril were not available on this machine, so they did not run. The commit was authored with your email and the required co-author line, passed on the command line rather than written into git config.","treeHash":"b127fe3dce3f9b7cb1063643195d5df97a419aec","usage":{"cachedInputTokens":581708,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":22000,"runtime":"claude","turns":23,"wallClockMs":328858}},{"artifacts":[],"attempt":1,"bundleHash":"9240c39fd7e53da421cf00b15179ad252e906180c72dd763444daff346310d55","device":"68fd8dd6450ac70c","findings":[],"hash":"a8dae02e6deffbe816de40c6f507a97ac7598ba14ff0f9834b27adac62a117d0","nodeId":"2d01ded8-d531-4abd-ac03-4d56525dbb7f","outcome":"completed","summary":"Added 27 regression/fuzz tests and four stateful invariants covering failure paths, allowances, boundary values, and supply conservation.\n\n`forge build` and the full `forge test` suite pass with the required seed. Invariants exercised 32,768 randomized calls. No defects found; all changes are under `test/`.","treeHash":"e767700988ccb7283ad9e4c52af7623d46b5d959","usage":{"cachedInputTokens":1002368,"inputTokens":70856,"model":"gpt-6-astra","outputTokens":16411,"runtime":"codex","turns":6,"wallClockMs":441910}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9506ecec995bdbf9","findings":[],"hash":"cf25aab12a1c76ad3dfabb35631003392ce1fc019b8f8347083c4d9c96bcb30d","nodeId":"5b1fbad0-3ebf-42a5-848f-9e31e5c17ffd","outcome":"completed","summary":"I found no economic defects in `IMDuelToken`. `.imd-findings.json` has an empty findings list and a coverage row for each of the three entry points, plus three rows for the invariants and launch flows I checked. The working tree is unchanged; my temporary tests were deleted.\n\n**Coverage (Economic Security, Invariant and Flow Gap guides):**\n- **`transfer` and `transferFrom` – holds.** There is no fee, burn, tax, reflection or exemption, so the receiver gets exactly the amount sent. A transfer to yourself leaves the balance unchanged, because the second write reads the balance after the first. `transferFrom` spends only the caller's own allowance: unlimited stays unlimited, otherwise it drops by exactly the amount or the call reverts. A failed balance check undoes the whole call, so no allowance is lost.\n- **`approve` – holds.** It refuses the zero address and overwrites the old allowance. It moves no tokens. The usual EIP-20 caveat about changing a non-zero allowance is documented in the README.\n- **Supply – holds.** The total is a fixed 1,000,000,000 × 10¹⁸ (1e27) minted once to the deployer. Nothing can mint or burn, and there is no owner or privileged function.\n- **Launch flows – holds.** Factory to distributor, distributor to claimant, the pool seed, and trader buys and sells all move exactly the stated amount, because the token has no transfer logic to exempt. That is why its constructor takes no launch addresses.\n\n**Tests run:**\n- The project's own suite: 36 of 36 pass.\n- Two temporary stateful fuzz tests I wrote and then deleted:\n  - **Balances:** the sum of all balances always equalled the supply (32,000 calls).\n  - **Allowances:** they always matched a simple model of approve and spend, including transfers to yourself and unlimited allowances (64 runs, 32,000 calls).\n- Both ran against the token compiled on its own. I did not run the launch-floor test with its Uniswap v4 pool, because it needs the launch environment's settings.\n\n**Static analysis:** Slither reported nothing. Aderyn's only note, a \"large numeric literal\" at `src/IMDuelToken.sol:26`, is a style point about the supply constant, not a defect.\n\n**Not covered:** the other nine review areas belong to the other three specialists. No `launch.json` exists yet, so there was no manifest to check.","treeHash":null,"usage":{"cachedInputTokens":260851,"inputTokens":15,"model":"claude-opus-5-5","outputTokens":5274,"runtime":"claude","turns":8,"wallClockMs":149333}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"a0f4c3f900dedd4a","findings":[{"citation":"resolved","description":"Asymmetry pass (approve <-> transferFrom pull pair). `_approve` writes the allowance with `=` while `_spendAllowance` writes it with `-=`, which is the plain EIP-20 model and identical to OpenZeppelin v5. The consequence is the well-known approve front-running race: a spender who sees a holder lowering an allowance can spend the old value first and then the new one. This is not a permission bypass: the spender never moves more than the sum of the values the holder explicitly approved, no third party can spend anyone's allowance (verified: `transferFrom` keys only on `msg.sender`), and the README 'Assumptions' section already discloses the caveat and the mitigation (set to zero first). Reported at info so the judge sees it was checked; no code change is required and adding increase/decreaseAllowance would be a design choice, not a defect fix. Scope note: this is the only behavioural asymmetry found in the permission surface. Access-control pass found no roles, modifiers, initializers, delegatecall, proxies, fallback or receive, and no storage slot with two writers of differing guard strength: `_balances` is written only by the constructor and `_transfer` (both guarded by the caller's own balance), `_allowances` only by the owner (`approve`) and by the spender decrementing its own entry (`_spendAllowance`). Trust-gap pass found no privileged actor and no economic formula inside the token, so no access x economics / access x asymmetry seam exists.","line":159,"path":"src/IMDuelToken.sol","reproduction":"State: factory deploys; factory.transfer(alice, 200e18). 1) alice: approve(bob, 100e18). 2) alice broadcasts approve(bob, 50e18) intending to lower it. 3) bob front-runs with transferFrom(alice, bob, 100e18) -> succeeds, allowance 0. 4) alice's approve(bob, 50e18) mines -> allowance 50e18. 5) bob: transferFrom(alice, bob, 50e18) -> succeeds. Result: bob holds 150e18 although alice never intended more than 100e18 outstanding. Expected under the holder's intent: at most 100e18; actual: 150e18. Verified with a Foundry test (test/scratch/Permissions.t.sol::test_approveOverwriteRace, passes on this code, i.e. the race is reproducible). Behaviour is conformant to EIP-20 and documented in README.md lines 41-44.","severity":"info","snippet":"        _allowances[owner][spender] = value;","title":"approve overwrites the allowance, so the standard EIP-20 approve race applies (documented trust assumption, no fix required)"}],"hash":"d5fcb7555c5d654e96559228ad5ddd2802a9779fb160a5e9fc936369a5daa032","nodeId":"f9e08876-3d8b-4b02-a946-77511b6b078c","outcome":"completed","summary":"The permissions review of IMDuel is complete and recorded in `.imd-findings.json`. The token is clean in my area: no defects that would open a revision.\n\n**What I checked**\n\n- **Access Control.** The contract has no owner, roles, modifiers, initializer, proxy, delegatecall, fallback or receive. The compiled ABI holds exactly `approve`, `transfer`, `transferFrom`, the views and the constructor. Each storage mapping has writers of equal guard strength: balances move only through the caller's own balance check, and an allowance row is written only by its owner (set) or its spender (decrement of its own entry). The constructor mints the full 1e27 supply once to the deployer with no arguments.\n- **Asymmetry.** The approve/pull pair, the transfer/transferFrom pair, the max-allowance branch and the self-transfer case all mirror correctly. The unchecked arithmetic is safe because balances sum to a constant, which I fuzz-verified across chained transfers.\n- **Trust Gap.** There is no privileged actor and no economic formula inside the token, so none of the access × economics or access × asymmetry seams exist.\n- **Launch floor.** No fee or exemption logic, so every launch flow moves exactly what it says. Decimals and contract name conform to the manifest rules.\n\n**Findings file**\n\n- One info-level entry: the standard EIP-20 approve-overwrite race, with a concrete five-step reproduction. It is conformant behaviour, already disclosed in the README, and needs no code change. I recorded it so the judge sees the one behavioural asymmetry in the permission surface was examined.\n- Eight coverage rows: all three listed entry points marked `holds`, plus rows for the constructor, the absence of any privileged surface, supply conservation, the launch flows and the reference deploy script.\n\nBoth static analysis leads were benign: Slither reported nothing, and aderyn's large-numeric-literal note is the supply constant. The scratch test I used for verification passed and has been removed. No repository files were changed.","treeHash":null,"usage":{"cachedInputTokens":612321,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":11869,"runtime":"claude","turns":27,"wallClockMs":187297}}],"verification":[{"checks":[{"durationMs":994,"exitCode":0,"name":"build","output":"Compiling 24 files with Solc 0.8.26\nSolc 0.8.26 finished in 923.87ms\nCompiler run successful!\n","passed":true},{"durationMs":95,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployIMDuelToken.t.sol:DeployIMDuelTokenTest\n[PASS] test_deployMintsSupplyToTheDeployingAccount() (gas: 1193442)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 356.56µs (184.09µs CPU time)\n\nRan 35 tests for test/IMDuelToken.t.sol:IMDuelTokenTest\n[PASS] testFuzz_approve_setsExactValue(address,uint256) (runs: 256, μ: 63639, ~: 64051)\n[PASS] testFuzz_transferFrom_respectsAllowance(uint256,uint256) (runs: 256, μ: 127963, ~: 130716)\nLogs:\n  Bound result 66686032996\n  Bound result 107522220958993475507305598\n\n[PASS] testFuzz_transfer_conservesSupply(address,uint256) (runs: 256, μ: 95853, ~: 96085)\nLogs:\n  Bound result 1313373042\n\n[PASS] testFuzz_transfer_revertsAboveBalance(uint256,uint256) (runs: 256, μ: 99505, ~: 99986)\nLogs:\n  Bound result 11042655914\n  Bound result 87093733021460824896162179\n\n[PASS] test_approve_doesNotNeedBalance() (gas: 65577)\n[PASS] test_approve_overwritesPreviousAllowance() (gas: 95409)\n[PASS] test_approve_revertsForZeroSpender() (gas: 32876)\n[PASS] test_approve_setsAllowanceAndEmits() (gas: 68034)\n[PASS] test_approve_zeroClearsAllowance() (gas: 90581)\n[PASS] test_constants() (gas: 44075)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8074)\n[PASS] test_constructorMintsToWhoeverDeploys_asTheFactoryWill() (gas: 285838)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 42456)\n[PASS] test_deployerHasNoPowerOverHolders() (gas: 165653)\n[PASS] test_launchFlows_arriveWhole() (gas: 483088)\n[PASS] test_metadata() (gas: 26841)\n[PASS] test_noMintOrAdminSelectorExists() (gas: 615812)\n[PASS] test_receiveEtherIsRejected() (gas: 39724)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2643705)\n[PASS] test_transferFrom_byOwnerStillNeedsSelfAllowance() (gas: 38454)\n[PASS] test_transferFrom_exactAllowanceSpendsItToZero() (gas: 121108)\n[PASS] test_transferFrom_infiniteAllowanceIsNotDecremented() (gas: 135701)\n[PASS] test_transferFrom_movesAndDecrementsAllowance() (gas: 168864)\n[PASS] test_transferFrom_revertsToZeroAddress() (gas: 88510)\n[PASS] test_transferFrom_revertsWhenAllowanceInsufficient() (gas: 87980)\n[PASS] test_transferFrom_revertsWhenOwnerBalanceInsufficient() (gas: 155354)\n[PASS] test_transferFrom_revertsWithoutAllowance() (gas: 40531)\n[PASS] test_transferFrom_spendsOnlyTheCallersOwnAllowance() (gas: 94891)\n[PASS] test_transfer_movesExactAmountAndEmits() (gas: 94098)\n[PASS] test_transfer_revertsFromEmptyAccount() (gas: 37846)\n[PASS] test_transfer_revertsToZeroAddress() (gas: 32940)\n[PASS] test_transfer_revertsWhenBalanceInsufficient() (gas: 92346)\n[PASS] test_transfer_toSelfKeepsBalance() (gas: 98273)\n[PASS] test_transfer_wholeBalance() (gas: 78225)\n[PASS] test_transfer_zeroAmountSucceeds() (gas: 47618)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 8.90ms (40.31ms CPU time)\n\nRan 2 test suites in 9.77ms (9.25ms CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":36,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMDuelToken.approve(address,uint256)\",\"IMDuelToken.transfer(address,uint256)\",\"IMDuelToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":148,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":1,\"script/DeployIMDuelToken.s.sol\":25,\"src/IMDuelToken.sol\":171,\"test/DeployIMDuelToken.t.sol\":19,\"test/IMDuelToken.t.sol\":419},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"05f31c06bbe1618ae38985d2afc501014a806606c41c54ca5aa726590c833af8","verifiedTreeHash":"3e67d02d4f2b003f6b3cdedeb1570e1779856216","verifierVersion":"0.1.0+b10502ca"},{"checks":[{"durationMs":1040,"exitCode":0,"name":"build","output":"Compiling 24 files with Solc 0.8.26\nSolc 0.8.26 finished in 962.35ms\nCompiler run successful!\n","passed":true},{"durationMs":101,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployIMDuelToken.t.sol:DeployIMDuelTokenTest\n[PASS] test_deployMintsSupplyToTheDeployingAccount() (gas: 1193442)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 404.69µs (221.31µs CPU time)\n\nRan 35 tests for test/IMDuelToken.t.sol:IMDuelTokenTest\n[PASS] testFuzz_approve_setsExactValue(address,uint256) (runs: 256, μ: 63639, ~: 64051)\n[PASS] testFuzz_transferFrom_respectsAllowance(uint256,uint256) (runs: 256, μ: 127963, ~: 130716)\nLogs:\n  Bound result 66686032996\n  Bound result 107522220958993475507305598\n\n[PASS] testFuzz_transfer_conservesSupply(address,uint256) (runs: 256, μ: 95853, ~: 96085)\nLogs:\n  Bound result 689828887784716946870569978\n\n[PASS] testFuzz_transfer_revertsAboveBalance(uint256,uint256) (runs: 256, μ: 99505, ~: 99986)\nLogs:\n  Bound result 66686032996\n  Bound result 427936810329237525357893628\n\n[PASS] test_approve_doesNotNeedBalance() (gas: 65577)\n[PASS] test_approve_overwritesPreviousAllowance() (gas: 95409)\n[PASS] test_approve_revertsForZeroSpender() (gas: 32876)\n[PASS] test_approve_setsAllowanceAndEmits() (gas: 68034)\n[PASS] test_approve_zeroClearsAllowance() (gas: 90581)\n[PASS] test_constants() (gas: 44075)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8074)\n[PASS] test_constructorMintsToWhoeverDeploys_asTheFactoryWill() (gas: 285838)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 42456)\n[PASS] test_deployerHasNoPowerOverHolders() (gas: 165653)\n[PASS] test_launchFlows_arriveWhole() (gas: 483088)\n[PASS] test_metadata() (gas: 26841)\n[PASS] test_noMintOrAdminSelectorExists() (gas: 615812)\n[PASS] test_receiveEtherIsRejected() (gas: 39724)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2643705)\n[PASS] test_transferFrom_byOwnerStillNeedsSelfAllowance() (gas: 38454)\n[PASS] test_transferFrom_exactAllowanceSpendsItToZero() (gas: 121108)\n[PASS] test_transferFrom_infiniteAllowanceIsNotDecremented() (gas: 135701)\n[PASS] test_transferFrom_movesAndDecrementsAllowance() (gas: 168864)\n[PASS] test_transferFrom_revertsToZeroAddress() (gas: 88510)\n[PASS] test_transferFrom_revertsWhenAllowanceInsufficient() (gas: 87980)\n[PASS] test_transferFrom_revertsWhenOwnerBalanceInsufficient() (gas: 155354)\n[PASS] test_transferFrom_revertsWithoutAllowance() (gas: 40531)\n[PASS] test_transferFrom_spendsOnlyTheCallersOwnAllowance() (gas: 94891)\n[PASS] test_transfer_movesExactAmountAndEmits() (gas: 94098)\n[PASS] test_transfer_revertsFromEmptyAccount() (gas: 37846)\n[PASS] test_transfer_revertsToZeroAddress() (gas: 32940)\n[PASS] test_transfer_revertsWhenBalanceInsufficient() (gas: 92346)\n[PASS] test_transfer_toSelfKeepsBalance() (gas: 98273)\n[PASS] test_transfer_wholeBalance() (gas: 78225)\n[PASS] test_transfer_zeroAmountSucceeds() (gas: 47618)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 9.29ms (41.51ms CPU time)\n\nRan 2 test suites in 10.11ms (9.70ms CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":34,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMDuelToken.approve(address,uint256)\",\"IMDuelToken.transfer(address,uint256)\",\"IMDuelToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":148,\"foundry.toml\":21,\"remappings.txt\":1,\"script/DeployIMDuelToken.s.sol\":25,\"src/IMDuelToken.sol\":171,\"test/DeployIMDuelToken.t.sol\":19,\"test/IMDuelToken.t.sol\":419},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":335,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":196,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/IMDuelToken.sol:26: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"60e68ce642a62f413d591cad76203f103abede656e8855122271e72976ffe820","verifiedTreeHash":"b127fe3dce3f9b7cb1063643195d5df97a419aec","verifierVersion":"0.1.0+b10502ca"},{"checks":[{"durationMs":1478,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.41s\nCompiler run successful!\n","passed":true},{"durationMs":28756,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployIMDuelToken.t.sol:DeployIMDuelTokenTest\n[PASS] test_deployMintsSupplyToTheDeployingAccount() (gas: 1193442)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 322.63µs (167.79µs CPU time)\n\nRan 35 tests for test/IMDuelToken.t.sol:IMDuelTokenTest\n[PASS] testFuzz_approve_setsExactValue(address,uint256) (runs: 256, μ: 63641, ~: 64051)\n[PASS] testFuzz_transferFrom_respectsAllowance(uint256,uint256) (runs: 256, μ: 126701, ~: 101197)\nLogs:\n  Bound result 782584117241123795379803701\n  Bound result 219299362755155603559498643\n\n[PASS] testFuzz_transfer_conservesSupply(address,uint256) (runs: 256, μ: 95817, ~: 96085)\nLogs:\n  Bound result 1313373042\n\n[PASS] testFuzz_transfer_revertsAboveBalance(uint256,uint256) (runs: 256, μ: 99310, ~: 99972)\nLogs:\n  Bound result 709964933898969556991740987\n  Bound result 911796384517859325187310466\n\n[PASS] test_approve_doesNotNeedBalance() (gas: 65577)\n[PASS] test_approve_overwritesPreviousAllowance() (gas: 95409)\n[PASS] test_approve_revertsForZeroSpender() (gas: 32876)\n[PASS] test_approve_setsAllowanceAndEmits() (gas: 68034)\n[PASS] test_approve_zeroClearsAllowance() (gas: 90581)\n[PASS] test_constants() (gas: 44075)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8074)\n[PASS] test_constructorMintsToWhoeverDeploys_asTheFactoryWill() (gas: 285838)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 42456)\n[PASS] test_deployerHasNoPowerOverHolders() (gas: 165653)\n[PASS] test_launchFlows_arriveWhole() (gas: 483088)\n[PASS] test_metadata() (gas: 26841)\n[PASS] test_noMintOrAdminSelectorExists() (gas: 615812)\n[PASS] test_receiveEtherIsRejected() (gas: 39724)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2643705)\n[PASS] test_transferFrom_byOwnerStillNeedsSelfAllowance() (gas: 38454)\n[PASS] test_transferFrom_exactAllowanceSpendsItToZero() (gas: 121108)\n[PASS] test_transferFrom_infiniteAllowanceIsNotDecremented() (gas: 135701)\n[PASS] test_transferFrom_movesAndDecrementsAllowance() (gas: 168864)\n[PASS] test_transferFrom_revertsToZeroAddress() (gas: 88510)\n[PASS] test_transferFrom_revertsWhenAllowanceInsufficient() (gas: 87980)\n[PASS] test_transferFrom_revertsWhenOwnerBalanceInsufficient() (gas: 155354)\n[PASS] test_transferFrom_revertsWithoutAllowance() (gas: 40531)\n[PASS] test_transferFrom_spendsOnlyTheCallersOwnAllowance() (gas: 94891)\n[PASS] test_transfer_movesExactAmountAndEmits() (gas: 94098)\n[PASS] test_transfer_revertsFromEmptyAccount() (gas: 37846)\n[PASS] test_transfer_revertsToZeroAddress() (gas: 32940)\n[PASS] test_transfer_revertsWhenBalanceInsufficient() (gas: 92346)\n[PASS] test_transfer_toSelfKeepsBalance() (gas: 98273)\n[PASS] test_transfer_wholeBalance() (gas: 78225)\n[PASS] test_transfer_zeroAmountSucceeds() (gas: 47618)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 171.97ms (256.48ms CPU time)\n\nRan 27 tests for test/IMDuelToken.Properties.t.sol:IMDuelTokenPropertiesTest\n[PASS] testFuzz_allowanceFailureIsAtomic(uint256,uint256) (runs: 1000, μ: 248349, ~: 248672)\nLogs:\n  Bound result 357036798277637045273986081\n  Bound result 794874066571928715401780779\n\n[PASS] testFuzz_approvalReplacementIsExactAndIsolated(uint256,uint256) (runs: 1000, μ: 336887, ~: 336945)\n[PASS] testFuzz_balanceFailureRestoresAllowanceAndCanBeRetried(uint256,uint256) (runs: 1000, μ: 428317, ~: 428622)\nLogs:\n  Bound result 42902694048995303338104452\n  Bound result 759632332697342199927362115\n\n[PASS] testFuzz_replacingInfiniteApprovalEnforcesTheNewLimit(uint256) (runs: 1000, μ: 210715, ~: 210564)\nLogs:\n  Bound result 111150762082000653947531965\n\n[PASS] testFuzz_selfTransferFromPreservesBalanceButConsumesAuthorization(uint256) (runs: 1000, μ: 181540, ~: 181598)\nLogs:\n  Bound result 1000\n\n[PASS] testFuzz_splitSpendingCannotExceedTheOriginalGrant(uint256,uint256) (runs: 1000, μ: 315846, ~: 317679)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] testFuzz_splitTransferEqualsSingleTransfer(uint256,uint256) (runs: 1000, μ: 282165, ~: 283276)\nLogs:\n  Bound result 32288505569039951540503\n  Bound result 41521701395454717\n\n[PASS] testFuzz_transferRoundTripHasNoFeesOrRounding(uint256,uint8) (runs: 1000, μ: 1328450, ~: 1113239)\nLogs:\n  Bound result 0\n  Bound result 1\n\n[PASS] testFuzz_zeroReceiverFailureRestoresFiniteAllowance(uint256,uint256) (runs: 1000, μ: 339720, ~: 340530)\nLogs:\n  Bound result 357036797985752901722383361\n  Bound result 32316282487335580416474992311060447060927922076046266745\n\n[PASS] test_allowanceCannotBeUsedInReverseDirection() (gas: 176050)\n[PASS] test_approvalFromAnotherOwnerCannotAuthorizeASpend() (gas: 190992)\n[PASS] test_maximumMinusOneAllowanceIsFinite() (gas: 278652)\n[PASS] test_maximumTransferFromWithInfiniteAllowanceStillChecksBalance() (gas: 178687)\n[PASS] test_maximumTransferRevertsWithoutOverflowOrStateChange() (gas: 175357)\n[PASS] test_ownerCanUseTransferFromOnlyAfterSelfApproval() (gas: 194926)\n[PASS] test_revokingInfiniteAllowanceBlocksFurtherSpends() (gas: 277585)\n[PASS] test_selfTransferCannotBypassBalanceCheck() (gas: 110357)\n[PASS] test_spenderMayBeRecipientWithoutReceivingTwice() (gas: 195099)\n[PASS] test_tokensSentToTokenContractRemainPartOfSupply() (gas: 198781)\n[PASS] test_transferFromFullSupplyExhaustsOnlyItsAllowance() (gas: 424345)\n[PASS] test_transferOneWeiAndZeroEmitExactEvents() (gas: 175362)\n[PASS] test_zeroAmountStillRejectsZeroReceiver() (gas: 150360)\n[PASS] test_zeroCallerGuards() (gas: 147291)\n[PASS] test_zeroSpenderRejectedEvenForZeroAndMaximumApproval() (gas: 210365)\n[PASS] test_zeroTransferFromNeedsNeitherBalanceNorAllowanceAndEmits() (gas: 135933)\n[PASS] test_zeroTransferFromPreservesExistingAllowance() (gas: 177397)\n[PASS] test_zeroTransferFromRejectsZeroOwner() (gas: 125356)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 171.97ms (1.44s CPU time)\n\nRan 1 test for test/IMDuelToken.Invariant.t.sol:IMDuelTokenInvariantTest\n[PASS]\nIMDuelTokenInvariantTest invariants:\n[PASS] invariant_eachHolderMatchesItsTransferHistory\n[PASS] invariant_metadataRemainsAsSpecified\n[PASS] invariant_onlyAuthorizedSpendingChangesAllowances\n[PASS] invariant_supplyEqualsSumOfAllReachableBalances\n IMDuelTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭--------------------+-------------------------+-------+---------+----------╮\n| Contract           | Selector                | Calls | Reverts | Discards |\n+===========================================================================+\n| IMDuelTokenHandler | approve                 | 2728  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | approveAndSpend         | 2726  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | rejectDelegatedOverdraw | 2796  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | rejectOverAllowance     | 2638  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | rejectOverdraw          | 2727  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | rejectZeroReceiver      | 2751  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | rejectZeroSpender       | 2712  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | revokeAndRejectSpend    | 2781  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | roundTrip               | 2739  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | selfTransfer            | 2735  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | transfer                | 2749  | 0       | 0        |\n|--------------------+-------------------------+-------+---------+----------|\n| IMDuelTokenHandler | transferFrom            | 2686  | 0       | 0        |\n╰--------------------+-------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 3954\n  Bound result 53\n  Bound result 0\n  Bound result 1\n  Bound result 199999999999999999999999999\n  Bound result 1780\n  Bound result 253\n  Bound result 9459755917207503536849380\n  Bound result 1613\n  Bound result 3174342381549911112\n  Bound result 0\n  Bound result 123\n  Bound result 46567106890747584773984209\n  Bound result 399999999999999999999999998\n  Bound result 4526242594248727780709\n  Bound result 100000000000000000000\n  Bound result 1644\n  Bound result 11778\n  Bound result 4324\n  Bound result 0\n  Bound result 2044\n  Bound result 5593\n  Bound result 243\n  Bound result 53\n  Bound result 8058\n  Bound result 244\n  Bound result 5082\n  Bound result 398993359235965584479687768\n  Bound result 1383\n  Bound result 9634\n  Bound result 404\n  Bound result 10678\n  Bound result 3038\n  Bound result 1129\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 28.67s (28.66s CPU time)\n\nRan 4 test suites in 28.67s (29.01s CPU time): 64 tests passed, 0 failed, 0 skipped (64 total tests)\n","passed":true},{"durationMs":43,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMDuelToken.approve(address,uint256)\",\"IMDuelToken.transfer(address,uint256)\",\"IMDuelToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":148,\"foundry.toml\":21,\"remappings.txt\":1,\"script/DeployIMDuelToken.s.sol\":25,\"src/IMDuelToken.sol\":171,\"test/DeployIMDuelToken.t.sol\":19,\"test/IMDuelToken.Invariant.t.sol\":83,\"test/IMDuelToken.Properties.t.sol\":377,\"test/IMDuelToken.t.sol\":419,\"test/TESTING.md\":54,\"test/handlers/IMDuelTokenHandler.sol\":221},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a8dae02e6deffbe816de40c6f507a97ac7598ba14ff0f9834b27adac62a117d0","verifiedTreeHash":"e767700988ccb7283ad9e4c52af7623d46b5d959","verifierVersion":"0.1.0+b10502ca"}]}