{"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":"523107a1-5023-4cf4-a243-b97fe4ca5782","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"21d6920db490385531591d77b966c072fb23a32b4eebd2dc049cb85eab72bc2c","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":"d80a4f1aa43605d3095d7f3ebd00d42d74b97dd6624efc7e400262e51331ee58","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":"c277d7bd7990ba2585ca7f5da3b7391b059b30713a662a78589d6861e2d0a900","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"a3d8b77f85e9d438a066efe128690935baf8f9a4ece56fcc1ad6a0aa0169ec1a","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":"ff551ef0e77b53373414797120a064ab9f93d8616264ba297c604e50ca4ef2d7","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":"22dc101a45b61719990e42a3defd950776f88e78602e228bc16b1fbfe30ddb5e","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"e08fa0a4ab8ea27bff4a8dabe730e012ac9ed4229a4b6e29422cac50c9e8bb36","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"6c14cf7ba39214acbb68079d6c185e51c45e7281e7ddbf0b980f95f1343059a6","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Infinite Money Dopamine (IMD).\nToken name: Infinite Money Dopamine\nToken symbol: IMD\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"2c8e1e5c0e7cb4477d3e4e7529abb9ffe4f6f11c8db7ca144963f88db943be0d","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"523107a1-5023-4cf4-a243-b97fe4ca5782","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-751-infinite-money-dopamine"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51020","feedbackHash":"1ac0ac016f4767f235a3f8f5d079d0c2ce26caab2922dd2c46e4fe8bb12c3813","nodeKey":"audit_economics","submissionHash":"21d6920db490385531591d77b966c072fb23a32b4eebd2dc049cb85eab72bc2c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50969","feedbackHash":"1ac3bf79245e7f40b23d650e44f9d3297bdfedb3511f3347eb58435553ad78be","nodeKey":"audit_flow","submissionHash":"d80a4f1aa43605d3095d7f3ebd00d42d74b97dd6624efc7e400262e51331ee58","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50952","feedbackHash":"2e8804969e5b903190da8435fe5f88da68c5650ee5f32379ca119b9688034f14","nodeKey":"audit_judge","submissionHash":"c277d7bd7990ba2585ca7f5da3b7391b059b30713a662a78589d6861e2d0a900","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51025","feedbackHash":"9544f6bcdc52b2655965de9f896c1a56f092ddc058b71b5d99e09751d5228b7e","nodeKey":"audit_math","submissionHash":"a3d8b77f85e9d438a066efe128690935baf8f9a4ece56fcc1ad6a0aa0169ec1a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51022","feedbackHash":"66922b9e85e19ba98189730be8b972cab3c00bc351af77f1f6b3372d42fdae08","nodeKey":"audit_permissions","submissionHash":"ff551ef0e77b53373414797120a064ab9f93d8616264ba297c604e50ca4ef2d7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52177","feedbackHash":"5a6242ef08034d3179e5793a49d4c48e9e28add2ad52df91f0dc3911d8889acb","nodeKey":"build_contract_project","submissionHash":"22dc101a45b61719990e42a3defd950776f88e78602e228bc16b1fbfe30ddb5e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51188","feedbackHash":"d4d64d463f1f27752e5f786a1dd9966220ca43e521a331ea11d5c3cdd27bb650","nodeKey":"manifest","submissionHash":"e08fa0a4ab8ea27bff4a8dabe730e012ac9ed4229a4b6e29422cac50c9e8bb36","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51030","feedbackHash":"b8a444fcc12e0e3971257c1fe94b1d2ea449765ded4dc45bd896dd9ff6f45ed0","nodeKey":"write_foundry_tests","submissionHash":"6c14cf7ba39214acbb68079d6c185e51c45e7281e7ddbf0b980f95f1343059a6","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"1d510a7ec47afb999ba0930eefc77ef7d169b27deea8a81ee93decf8eea4c598","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a31e321b410aaa02","findings":[],"hash":"21d6920db490385531591d77b966c072fb23a32b4eebd2dc049cb85eab72bc2c","nodeId":"f6a462f0-8ce0-421b-b178-fd68418ffc7b","outcome":"completed","summary":"I found no defects in the economics of IMD. I wrote `.imd-findings.json` with an empty findings list and a coverage record that answers all three entry points.\n\n**What I covered: the Economic Security, Invariant and Flow Gap guides**\n- **Source:** `src/IMD.sol` is a plain OpenZeppelin ERC-20. Its only custom code is the constant `INITIAL_SUPPLY = 1_000_000_000 * 10 ** 18` and a constructor that mints that amount once to `msg.sender`. The vendored OpenZeppelin files are from v5.1.0, and I checked each one against the upstream tag: all five are byte-identical.\n- **Supply invariant:** the only mint is in the constructor. The compiled contract has no other functions that change state, so it has no owner, mint, burn, upgrade or initializer function, and decimals are 18. The supply of 10^27 matches the brief and goes to the factory, which deploys the token through CREATE2.\n- **Flow gap:** transfers charge no fee, burn nothing, rebase nothing, exempt no address and make no outside calls. Every launch flow arrives with exactly the amount sent: the swarm's 10% to the distributor, each claim, the pool seed through the PoolManager, and trader buys and sells. 10^27 is below 2^128, so the size of the supply cannot overflow the pool's liquidity maths.\n- **Economic security:** nothing lets a privileged caller pause, blacklist, freeze, seize or `burnFrom` a holder. `transferFrom` needs a real allowance, uses it up exactly, and reverts with no partial change when the balance or allowance is short. The runtime code has no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- **Static analysis lead:** aderyn flagged a large number written out at `src/IMD.sol:10`. That is a style note only; the value is correct.\n\n| Entry point | Verdict |\n|---|---|\n| `IMD.approve(address,uint256)` | holds |\n| `IMD.transfer(address,uint256)` | holds |\n| `IMD.transferFrom(address,address,uint256)` | holds |\n\n**Checks run:** `forge test` passes all 27 tests, including the stateful invariant runs (128 runs × 64 calls). I did not run the protected launch harness: it needs the network's launch environment and some source files this repository doesn't contain, such as `LaunchLiquidity` and `v4-core`. I worked through the seed and swap paths by hand against its code instead, so that part is reasoned, not executed.\n\n**Outside my area:** there is no `launch.json` yet, so I couldn't check the pool settings or the economics block. Also, this token shares the name \"IMD\" with the network's pair token. That is the requester's choice rather than a code defect, but anyone writing the manifest should make sure `pool.pairedCurrency` is not confused with this token's own address.\n\nNo tracked files changed.","treeHash":null,"usage":{"cachedInputTokens":226940,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":3998,"runtime":"claude","turns":7,"wallClockMs":54375}},{"artifacts":[],"attempt":1,"bundleHash":"da7e88bda282ea45ed039476f94bd88b2de1781e7d9ce32c96d95dcc7da8de0e","device":"2d5f86a85eed40fa","findings":[],"hash":"22dc101a45b61719990e42a3defd950776f88e78602e228bc16b1fbfe30ddb5e","nodeId":"b6417fe0-595f-47cc-b8db-8d3156e180b3","outcome":"completed","summary":"Implemented Infinite Money Dopamine (IMD): 18 decimals, exactly 1,000,000,000 tokens minted once to the deployer, with no administrative powers.\n\nAdded vendored dependencies, success/failure tests, fuzz tests, stateful invariants, and deployment/operations documentation in `README.md`.\n\nVerified with Solidity 0.8.26:\n\n- `forge build`\n- `forge test`\n- `forge fmt --check`\n- Clean offline build and parallel tests\n\nAll local checks pass. The protected network integration harness remains for the independent verifier.","treeHash":"12325070305010d1b953ae3d96eb9be999820665","usage":{"cachedInputTokens":409856,"inputTokens":54449,"model":"gpt-6-astra","outputTokens":13497,"runtime":"codex","turns":5,"wallClockMs":346163}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"02c6a88ea85b2673","findings":[],"hash":"2895e98274a2da2084a5c0d644d84dd42ba44ef1136b7ecccfe1fa5fe9431412","nodeId":"c2c27c13-5838-4e50-9522-a832913887d9","outcome":"failed","summary":"runtime reported <synthetic>, not the required premium model claude-fable-5-1","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":"<synthetic>","outputTokens":0,"runtime":"claude","turns":1,"wallClockMs":1989}},{"artifacts":[],"attempt":1,"bundleHash":"571dbabb57836a172b7b4ed79caffeb65e6d24c1756c809fe6dab056d9ea1709","device":"06486f6fefb50394","findings":[],"hash":"6c14cf7ba39214acbb68079d6c185e51c45e7281e7ddbf0b980f95f1343059a6","nodeId":"d40e4e26-c2d1-4397-a807-3bcf600eb891","outcome":"completed","summary":"Added 13 boundary, failure-path, and fuzz tests. Extended invariants to mix successful and rejected calls across four actors.\n\nOffline `forge build` and `forge test` pass: 40 tests, including 32,768 invariant calls.\n\nOnly `test/` changed. No defects found.","treeHash":"c6fc30b67750b7f0aaff2b9e619df3f8ae5f09ea","usage":{"cachedInputTokens":686592,"inputTokens":87669,"model":"gpt-6-astra","outputTokens":9182,"runtime":"codex","turns":4,"wallClockMs":262410}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b273d407784470b4","findings":[{"citation":"resolved","description":"IMD (src/IMD.sol:8, `contract IMD is ERC20 {`) inherits OpenZeppelin v5.1.0 ERC20 unchanged (all five vendored files are byte-identical to the upstream v5.1.0 tag; verified by download and cmp). OZ v5 deliberately removed increaseAllowance/decreaseAllowance, so the only allowance primitive is the absolute-set approve(). This is the well-known ERC-20 allowance race defined by the standard itself, not a bug in this token, and it requires a spender the owner already chose to trust. No revision is required; the requester asked for a plain fixed-supply ERC-20 and this is how every such token behaves. Recorded so the judge has the boundary case on file and so the requester can document it (or add ERC-2612 permit / an increase-decrease helper later as a design choice, not a fix). Everything else in the Math Precision, Boundary and Numerical Gap guides was checked and holds: the constant 1_000_000_000 * 10 ** 18 is exactly 10^27 (28 digits, computed with node, far below 2^256, compile-time constant so no runtime overflow), equals 1e9 * 10**decimals() with decimals()==18, is minted once to msg.sender (the CREATE2 factory) in the constructor and nowhere else; there is no division, cast, fixed-point conversion, external call, payable path, receive/fallback, bytes decoding or sentinel branch in src/IMD.sol; OZ _update's unchecked arithmetic is bounded by totalSupply which is fixed at 10^27; sum(balances)==totalSupply holds exactly across 1-wei transfers (no rounding anywhere); boundary probes at amount 0, exact balance, balance+1, type(uint256).max, allowance exactly equal, max-1 (finite, decremented) and max (infinite, untouched), self-transfer and self-transferFrom, and transferFrom(from=address(0)) all behave as the standard specifies and revert with the exact (have, needed) values.","line":127,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: owner O holds >= 150 IMD, spender S has allowance 100. Sequence: (1) O broadcasts approve(S, 50) intending to lower the allowance. (2) S observes it and first executes transferFrom(O, S, 100): O's balance -100, allowance -> 0. (3) O's approve(S, 50) mines: allowance -> 50. (4) S executes transferFrom(O, S, 50). Expected by O: S can spend at most 50 in total after the reduction. Actual: S has received 150 and both transferFroms returned true. Verified in a Foundry scratch test on this tree (approve 100 -> transferFrom 100 -> approve 50 -> transferFrom 50 -> balanceOf(S)==150). Identical in every OZ-based ERC-20; the standard prescribes this behaviour.","severity":"info","snippet":"    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }","title":"approve() sets the allowance absolutely, so an owner lowering an allowance can be front-run and spend old + new (inherent ERC-20 semantics, not an implementation defect)"}],"hash":"a3d8b77f85e9d438a066efe128690935baf8f9a4ece56fcc1ad6a0aa0169ec1a","nodeId":"e7c43ff7-7c2a-4126-a5ad-c54ac8038dfd","outcome":"completed","summary":"Done. `git status` is clean apart from the (untracked, intended) `.imd-findings.json`; the scratch directory is removed and the JSON parses: 1 finding, 7 coverage rows.\n\n## Summary\n\n**Area: Math Precision, Boundary, Numerical Gap — for `src/IMD.sol`**\n\nThe contract is a 16-line fixed-supply token over OpenZeppelin v5.1.0 `ERC20`. What I verified:\n\n- **Supply constant** `1_000_000_000 * 10 ** 18` is exactly `10^27` (28 digits, computed with node, far below 2^256; compile-time constant so no runtime overflow). It equals `1e9 * 10**decimals()` with `decimals() == 18`, and is minted once to `msg.sender` (the CREATE2 factory) in the constructor and nowhere else.\n- **No math surface of its own**: no division, cast, fixed-point conversion, external call, payable path, `receive`/`fallback`, bytes decoding or sentinel branch in `IMD.sol`. OZ `_update`'s `unchecked` blocks are bounded by a `totalSupply` that is fixed forever at 10^27.\n- **Vendored OZ integrity**: all five files under `lib/openzeppelin-contracts/contracts` are byte-identical to the upstream `v5.1.0` tag (downloaded and `cmp`'d) — the one place a hidden arithmetic change could have lived.\n- **Boundary probes** (9 scratch tests, all passing as the standard specifies): amount 0, exact balance, balance+1, `type(uint256).max`; allowance exactly equal, `max-1` (finite, decremented), `max` (infinite, untouched); self-`transfer` and self-`transferFrom`; `transferFrom(from = address(0), …)` cannot reach `_update`'s mint branch; `sum(balances) == totalSupply` exact across 200 one-wei transfers (no rounding anywhere, so no precision×invariant drift).\n\n**Findings:** none that are defects. One `info` row records the inherent ERC-20 approve race (owner approves 100 → spender takes 100 → owner approves 50 → spender takes 50 = 150), reproduced on this tree and explicitly marked as standard semantics requiring no revision — it's there so the judge has the boundary case on file.\n\n**Coverage:** `approve` → finding 1 (info), `transfer` → holds, `transferFrom` → holds, plus four invariant rows (supply constant, single mint / no admin entry points, OZ unmodified, no payable/external surface).\n\nStatic-analysis lead (aderyn `large-numeric-literal` at line 10) checked: the literal evaluates exactly to 10^27 and is not a defect.","treeHash":null,"usage":{"cachedInputTokens":755297,"inputTokens":362,"model":"claude-fable-5-1","outputTokens":15362,"runtime":"claude","turns":20,"wallClockMs":248466}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ce6eaff570c608ab","findings":[{"citation":"resolved","description":"IMD (src/IMD.sol:8, `contract IMD is ERC20 {`) inherits OpenZeppelin v5.1.0 ERC20 unchanged and adds no allowance helper (OZ v5 has no increaseAllowance/decreaseAllowance), so approve() is the only allowance primitive and it overwrites the stored value. An owner who reduces an existing allowance can be front-run by the already-trusted spender, who spends the old allowance first and the new one afterwards. This is the allowance race defined by ERC-20 itself and is identical in every OZ-based token; it requires a spender the owner has already chosen to trust and cannot be triggered by a stranger. Reported by audit_math only; no other specialist raised it, so there is nothing to merge. Reproduced on this tree in a Foundry scratch test. No revision is required: the requester asked for a plain fixed-supply ERC-20 and this behaviour is the standard's. If the requester wants to remove the race it is a design choice (ERC-2612 permit or a safeIncrease/Decrease helper), not a fix.","line":127,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: factory deploys IMD, transfers 150 wei-units to owner O; S has no allowance. Steps: (1) O calls approve(S, 100). (2) S calls transferFrom(O, S, 100): returns true, balanceOf(O)=50, allowance(O,S)=0. (3) O calls approve(S, 50) intending to lower the allowance to 50 total. (4) S calls transferFrom(O, S, 50): returns true. Expected by O: S can receive at most 100 or at most 50, never both. Actual: balanceOf(S)=150, balanceOf(O)=0, both transferFrom calls returned true. Run on this tree as test_allowanceRace (approve 100 -> transferFrom 100 -> approve 50 -> transferFrom 50 -> assertEq(balanceOf(S),150)): passes, confirming the behaviour.","severity":"info","snippet":"    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }","title":"approve() sets the allowance absolutely, so lowering an allowance can be front-run and the spender spends old + new (standard ERC-20 semantics, not an implementation defect)"}],"hash":"c277d7bd7990ba2585ca7f5da3b7391b059b30713a662a78589d6861e2d0a900","nodeId":"d888f7a1-317a-46b0-8089-2a7bc1722dc1","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree is otherwise untouched.\n\n**Outcome.** The IMD token has no defects that require a revision. It is a 16-line contract inheriting OpenZeppelin v5.1.0 ERC20 unchanged, with no owner, mint, burn, pause, blacklist, receive, fallback or delegatecall surface. The constructor mints exactly 1e27 units to msg.sender once, matching the manifest's supply, decimals and empty constructor argument list.\n\n**Specialist findings judged.**\n- The single audit_math finding, the ERC-20 approve race, reproduced on this tree in a scratch Foundry test. I kept it at info severity. It is the standard's own semantics, needs a spender the owner already trusts, and opens no revision. No other specialist reported it, so there was nothing to merge.\n- The other three specialists and the independent tester reported nothing, and my own pass against the Pashov, x-ray, Trail of Bits entry-point and ethskills checklists found nothing they missed.\n\n**What I verified myself.**\n- All three entry points traced through the vendored OZ code and probed at the boundaries: zero value, exact balance, balance plus one, self-transfer, zero addresses, finite and infinite allowance, over-balance spend. Every path reverts with the expected typed error or moves the exact amount.\n- Common admin selectors called from the factory address all revert, and an ETH send reverts, so supply cannot grow and no holder can be frozen.\n- The vendored library is plain tracked files, not a submodule. The existing 40-test suite and my 6 scratch tests all pass.\n\n**Coverage record.** All three listed entry points answered `holds`, plus two invariant rows for the constructor supply and the launch flows. The scratch test directory was removed after the run.","treeHash":null,"usage":{"cachedInputTokens":395106,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":6489,"runtime":"claude","turns":9,"wallClockMs":113703}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"93ca4a1020037bf1","findings":[],"hash":"d80a4f1aa43605d3095d7f3ebd00d42d74b97dd6624efc7e400262e51331ee58","nodeId":"3500fe06-df52-401b-a40e-1db2d8a8010c","outcome":"completed","summary":"I found no defects in IMD, so `.imd-findings.json` has an empty findings list. It also has a coverage row marked `holds` for each of the three entry points, plus two invariant rows. The JSON parses and no tracked file was changed.\n\n**What I reviewed:**\n- **The token itself:** `src/IMD.sol` adds nothing to the OpenZeppelin ERC‑20 except the name, the symbol and a single mint in the constructor. That mint gives `1_000_000_000 * 10**18` to `msg.sender`, which is the factory at launch. There is no owner, mint or burn function, pause, blacklist, proxy, initializer or external call.\n- **The vendored library:** the OpenZeppelin copy in the commit says it is unmodified v5.1.0, and its `ERC20.sol` behaves that way. Nothing in IMD overrides how transfers are processed, so every transfer moves exactly the amount asked. That means the launch transfers arrive whole: factory to distributor, distributor to claimant, and seeding and swaps through the PoolManager. None of these are taxed or need an exemption.\n- **Entry points:**\n  - `approve` sets the allowance to the new value, rejects a zero spender and emits `Approval`.\n  - `transfer` reverts if the balance is too low or the recipient is the zero address.\n  - `transferFrom` checks the allowance before moving anything; a maximum allowance is never reduced, and any failure undoes the whole call.\n- **Launch rules:** the supply cannot grow after deployment, nothing privileged can move or freeze a holder's balance, and there are no `DELEGATECALL`, `CALLCODE` or `SELFDESTRUCT` paths.\n- **Static analysis:** aderyn's \"large numeric literal\" warning is about the fixed supply constant and is harmless. Slither reported nothing.\n- **Tests:** the existing `forge test` suite passes, 27 of 27 including the invariant run.\n\n**Limits:**\n- There is no `launch.json` in the tree yet, so this review does not cover the manifest fields (supply string, constructor arguments, economics).\n- The supplied launch check (`Token.protected.t.sol`) depends on v4 and launch contracts that aren't in this tree, so I couldn't run it. I compared the token against its assertions by reading the code instead.\n- I didn't write a proof test, since none is needed without a high or critical finding.","treeHash":null,"usage":{"cachedInputTokens":301702,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":3144,"runtime":"claude","turns":7,"wallClockMs":47837}},{"artifacts":[],"attempt":1,"bundleHash":"c0d2db818eca648f23f5bc83fb015fa5d606c51cd8e6e87f4d54192447f5a26e","device":"0b0761c9b10fe0bb","findings":[],"hash":"e08fa0a4ab8ea27bff4a8dabe730e012ac9ed4229a4b6e29422cac50c9e8bb36","nodeId":"f52d893e-a562-4c80-aa6b-53802bda4126","outcome":"completed","summary":"Created [launch.json](/root/.identitymd/work/523107a1-5023-4cf4-a243-b97fe4ca5782/f52d893e-a562-4c80-aa6b-53802bda4126/launch.json) with exact token supply, empty constructor arguments, required economics and pair currency.\n\nValidation passed against the supplied schema and compiled constructor ABI. `forge build` succeeded; `forge test` passed all 27 tests.\n\nOnly `launch.json` is included in the deliverable.","treeHash":"172d6d2ea3bb35e0f6a2a96877d35e3cee8ad93a","usage":{"cachedInputTokens":158720,"inputTokens":66884,"model":"gpt-6-astra","outputTokens":3025,"runtime":"codex","turns":3,"wallClockMs":91033}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"c35be49d2f8f8def","findings":[],"hash":"ff551ef0e77b53373414797120a064ab9f93d8616264ba297c604e50ca4ef2d7","nodeId":"c2c27c13-5838-4e50-9522-a832913887d9","outcome":"completed","summary":"Review complete. The findings file is on disk at `.imd-findings.json` (its exclusion via `.git/info/exclude` is the harness's own rule, alongside `.imd/`); `test/scratch/` is removed, and only ignored build output (`out/`, `cache/`) remains beside it.\n\n## Result: no defects in the assigned area\n\n**Scope covered (Access Control, Trust Gap, Asymmetry):**\n\n- **Permission model** — There is none to break. The compiled ABI exposes exactly `approve`, `transfer`, `transferFrom` plus views; no owner, pauser, minter, initializer, proxy, `receive`/`fallback`. Storage is only `_balances`, `_allowances`, `_totalSupply`, `_name`, `_symbol`. Unknown selectors and plain ETH revert.\n- **Constructor / deployment-time trust** — Mints exactly 1e27 (checked against an independent literal, since the project's own test compares `INITIAL_SUPPLY` against the same expression) once to the immediate `msg.sender`, not `tx.origin` (verified with a deploying contract under a pranked origin). `_totalSupply` is only ever increased inside `_update` with `from == 0`, reachable only from the constructor's `_mint`.\n- **Trust gap: vendored library** — All five OpenZeppelin files diffed byte-identical against the upstream v5.1.0 archive (SHA-256 matches `PROVENANCE.md`). `Context._msgSender()` is plain `msg.sender` — no forwarder backdoor.\n- **Asymmetry** — `transfer` and `transferFrom` funnel into one `_transfer/_update` with identical checks and writes; `transferFrom` only adds the allowance decrement. No caller class (factory, PoolManager, distributor) is treated differently, so launch flows move exactly what they say. The deployer cannot move a holder's balance without allowance; a failed `transferFrom` restores allowance atomically; `from == address(0)` reverts before any transfer.\n- **Runtime opcodes** — No `CALL`, `STATICCALL`, `DELEGATECALL`, `CALLCODE`, `SELFDESTRUCT`, `CREATE`, `CREATE2`. Project suite (27 tests incl. invariants) passes; `forge fmt --check` is clean on project files.\n\n**Static-analysis leads:** Slither reported nothing; aderyn's \"large numeric literal\" at `src/IMD.sol:10` is a compile-time constant that evaluates to the correct 1e27 — not a defect.\n\n**Behaviours noted but not reported as defects** (standard ERC-20, documented in the README): the approve/transferFrom race; zero-value `transferFrom` emitting `Transfer(from,to,0)` without allowance (EIP-20 requires it); tokens sent to the contract itself being unrecoverable.\n\n**One open deployment item, recorded in coverage rather than as a finding:** the runtime uses PUSH0 and MCOPY (`evm_version = \"cancun\"`, a verifier-owned config). No chain table was supplied, so the deployer must confirm the launch chain supports Cancun.\n\nCoverage record: 9 rows — the three listed entry points all `holds`, plus the constructor and five invariant/note rows.","treeHash":null,"usage":{"cachedInputTokens":784508,"inputTokens":296,"model":"claude-fable-5-1","outputTokens":14960,"runtime":"claude","turns":30,"wallClockMs":219539}}],"verification":[{"checks":[{"durationMs":1177,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.05s\nCompiler run successful!\n","passed":true},{"durationMs":2752,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/IMD.t.sol:IMDTest\n[PASS] testFuzz_AllowanceAccounting(uint256,uint256) (runs: 256, μ: 152567, ~: 154988)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_TransferAboveBalanceReverts(uint256) (runs: 256, μ: 64675, ~: 64407)\nLogs:\n  Bound result 33213897944253574933593759259492957611295410849578219839752350591552715751471\n\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 256, μ: 92804, ~: 93118)\nLogs:\n  Bound result 844678729197205835180949886\n\n[PASS] test_ApproveEmitsEventAndCanBeReplacedOrRevoked() (gas: 177732)\n[PASS] test_ConstructorEmitsMintToImmediateDeployer() (gas: 28244)\n[PASS] test_Create2FactoryReceivesEntireSupply() (gas: 271699)\n[PASS] test_DeployerCannotSpendHolderFundsWithoutApproval() (gas: 102468)\n[PASS] test_ExactFactoryDistributionClaimsAndPoolTransfers() (gas: 619056)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 132412)\n[PASS] test_MetadataAndInitialSupply() (gas: 103287)\n[PASS] test_NoMintBurnUpgradeOrHolderControlEntrypoints() (gas: 1980310)\n[PASS] test_RevertWhenAllowanceIsInsufficient() (gas: 108619)\n[PASS] test_RevertWhenApprovedTransferExceedsBalanceRestoresAllowance() (gas: 114403)\n[PASS] test_RevertWhenApprovedTransferGoesToZeroRestoresAllowance() (gas: 111619)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 37618)\n[PASS] test_RevertWhenSendingNativeCurrency() (gas: 36844)\n[PASS] test_RevertWhenTransferringToZeroAddress() (gas: 71925)\n[PASS] test_RuntimeContainsNoForbiddenOpcodes() (gas: 1038878)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51507)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 88928)\n[PASS] test_TransferEntireBalance() (gas: 71331)\n[PASS] test_TransferFromEmitsEventAndConsumesAllowance() (gas: 228228)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 100755)\n[PASS] test_TransferToContractDoesNotCallRecipient() (gas: 173890)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 66426)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 67556)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 10.38ms (38.39ms CPU time)\n\nRan 1 test for test/IMD.invariant.t.sol:IMDInvariantTest\n[PASS]\nIMDInvariantTest invariants:\n[PASS] invariant_AllowancesMatchAuthorizations\n[PASS] invariant_SupplyAndBalancesRemainConserved\n IMDInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+----------+-------+---------+----------╮\n| Contract   | Selector | Calls | Reverts | Discards |\n+====================================================+\n| IMDHandler | approve  | 2752  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| IMDHandler | move     | 2711  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| IMDHandler | spend    | 2729  | 0       | 0        |\n╰------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 244\n  Bound result 100000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 179\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 73\n  Bound result 0\n  Bound result 76\n  Bound result 0\n  Bound result 0\n  Bound result 24\n  Bound result 0\n  Bound result 0\n  Bound result 95\n  Bound result 2581\n  Bound result 0\n  Bound result 2616\n  Bound result 2827\n  Bound result 0\n  Bound result 1150\n  Bound result 0\n  Bound result 24\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1264\n  Bound result 162\n  Bound result 1580\n  Bound result 788\n  Bound result 682321465597297514974204559\n  Bound result 0\n  Bound result 3429\n  Bound result 719206528\n  Bound result 6279\n  Bound result 0\n  Bound result 7000000000000000000\n  Bound result 14945033928870083106\n  Bound result 13\n  Bound result 4720\n  Bound result 4209\n  Bound result 3876\n  Bound result 776\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.65s (2.65s CPU time)\n\nRan 2 test suites in 2.65s (2.66s CPU time): 27 tests passed, 0 failed, 0 skipped (27 total tests)\n","passed":true},{"durationMs":39,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMD.approve(address,uint256)\",\"IMD.transfer(address,uint256)\",\"IMD.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":100,\"foundry.toml\":28,\"src/IMD.sol\":16,\"test/IMD.invariant.t.sol\":99,\"test/IMD.t.sol\":358},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":518,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":293,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/IMD.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"22dc101a45b61719990e42a3defd950776f88e78602e228bc16b1fbfe30ddb5e","verifiedTreeHash":"12325070305010d1b953ae3d96eb9be999820665","verifierVersion":"0.1.0+f8d984f2"},{"checks":[{"durationMs":1816,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.67s\nCompiler run successful!\n","passed":true},{"durationMs":12147,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/IMD.t.sol:IMDTest\n[PASS] testFuzz_AllowanceAccounting(uint256,uint256) (runs: 256, μ: 152707, ~: 154964)\nLogs:\n  Bound result 562\n\n[PASS] testFuzz_TransferAboveBalanceReverts(uint256) (runs: 256, μ: 64721, ~: 65049)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584014371488088392\n\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 256, μ: 92817, ~: 93172)\nLogs:\n  Bound result 98090168215542781934625998\n\n[PASS] test_ApproveEmitsEventAndCanBeReplacedOrRevoked() (gas: 177732)\n[PASS] test_ConstructorEmitsMintToImmediateDeployer() (gas: 28244)\n[PASS] test_Create2FactoryReceivesEntireSupply() (gas: 271699)\n[PASS] test_DeployerCannotSpendHolderFundsWithoutApproval() (gas: 102468)\n[PASS] test_ExactFactoryDistributionClaimsAndPoolTransfers() (gas: 619056)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 132412)\n[PASS] test_MetadataAndInitialSupply() (gas: 103287)\n[PASS] test_NoMintBurnUpgradeOrHolderControlEntrypoints() (gas: 1980310)\n[PASS] test_RevertWhenAllowanceIsInsufficient() (gas: 108619)\n[PASS] test_RevertWhenApprovedTransferExceedsBalanceRestoresAllowance() (gas: 114403)\n[PASS] test_RevertWhenApprovedTransferGoesToZeroRestoresAllowance() (gas: 111619)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 37618)\n[PASS] test_RevertWhenSendingNativeCurrency() (gas: 36844)\n[PASS] test_RevertWhenTransferringToZeroAddress() (gas: 71925)\n[PASS] test_RuntimeContainsNoForbiddenOpcodes() (gas: 1038878)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51507)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 88928)\n[PASS] test_TransferEntireBalance() (gas: 71331)\n[PASS] test_TransferFromEmitsEventAndConsumesAllowance() (gas: 228228)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 100755)\n[PASS] test_TransferToContractDoesNotCallRecipient() (gas: 173890)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 66426)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 67556)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 74.16ms (226.88ms CPU time)\n\nRan 13 tests for test/IMD.adversarial.t.sol:IMDAdversarialTest\n[PASS] testFuzz_FailedApprovedSpendCanBeRetriedAfterFunding(uint256,uint256,bool) (runs: 1000, μ: 331320, ~: 331647)\nLogs:\n  Bound result 279218329573918456894106384\n  Bound result 682213750420653579126229141\n\n[PASS] testFuzz_InsufficientApprovalCannotSpendFundedBalance(uint256,uint256) (runs: 1000, μ: 126369, ~: 126650)\nLogs:\n  Bound result 962729047683217518861198217\n  Bound result 966609241943735423906999930\n\n[PASS] testFuzz_RoundTripPreservesExistingBalancesAndApprovals(uint256,uint256,uint256,uint256) (runs: 1000, μ: 308521, ~: 309901)\nLogs:\n  Bound result 373722990793904527043580290\n  Bound result 441840977357657419915460617\n  Bound result 5358176491860493210550092\n\n[PASS] test_AllowanceIsScopedToBothOwnerAndSpender() (gas: 503126)\n[PASS] test_ExhaustedAllowanceCannotBeSpentTwice() (gas: 183835)\n[PASS] test_InfiniteApprovalCanBeRevokedAndReplacedWithFiniteApproval() (gas: 305911)\n[PASS] test_MaximumFiniteAllowanceIsDecremented() (gas: 140540)\n[PASS] test_MaximumTransferValueRevertsWithoutOverflowOrAllowanceLoss() (gas: 148958)\n[PASS] test_OneSmallestUnitCanBeTransferredAndReturned() (gas: 138346)\n[PASS] test_SelfTransferStillRequiresSufficientBalance() (gas: 204007)\n[PASS] test_TransferringTokensDoesNotTransferTheSendersApproval() (gas: 240583)\n[PASS] test_ZeroTransferFromEmitsEventWithoutConsumingExistingApproval() (gas: 179282)\n[PASS] test_ZeroValueDoesNotPermitAZeroRecipientOrSpender() (gas: 154280)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 74.88ms (222.00ms CPU time)\n\nRan 1 test for test/IMD.invariant.t.sol:IMDInvariantTest\n[PASS]\nIMDInvariantTest invariants:\n[PASS] invariant_AllowancesMatchAuthorizations\n[PASS] invariant_SupplyAndBalancesRemainConserved\n IMDInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭------------+------------------------+-------+---------+----------╮\n| Contract   | Selector               | Calls | Reverts | Discards |\n+==================================================================+\n| IMDHandler | approve                | 3273  | 0       | 0        |\n|------------+------------------------+-------+---------+----------|\n| IMDHandler | approveBoundary        | 3299  | 0       | 0        |\n|------------+------------------------+-------+---------+----------|\n| IMDHandler | move                   | 3241  | 0       | 0        |\n|------------+------------------------+-------+---------+----------|\n| IMDHandler | moveAll                | 3269  | 0       | 0        |\n|------------+------------------------+-------+---------+----------|\n| IMDHandler | rejectApproveZero      | 3335  | 0       | 0        |\n|------------+------------------------+-------+---------+----------|\n| IMDHandler | rejectSpendOverBalance | 3254  | 0       | 0        |\n|------------+------------------------+-------+---------+----------|\n| IMDHandler | rejectSpendToZero      | 3295  | 0       | 0        |\n|------------+------------------------+-------+---------+----------|\n| IMDHandler | rejectTransfer         | 3284  | 0       | 0        |\n|------------+------------------------+-------+---------+----------|\n| IMDHandler | revokeAndRejectSpend   | 3212  | 0       | 0        |\n|------------+------------------------+-------+---------+----------|\n| IMDHandler | spend                  | 3306  | 0       | 0        |\n╰------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129647055\n  Bound result 250000000000000000000000000\n  Bound result 7000000000000000000\n  Bound result 0\n  Bound result 352\n  Bound result 4188\n  Bound result 22569471842244126066\n  Bound result 458866732327\n  Bound result 999999999999999999999999999\n  Bound result 49422300655976383518971161772042036479724517635858811238160587340303074464592\n  Bound result 100000000000000000000\n  Bound result 249999999999999999999999648\n  Bound result 0\n  Bound result 352\n  Bound result 1337677191954703726106055119334039144111\n  Bound result 0\n  Bound result 24301\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 4098\n  Bound result 0\n  Bound result 0\n  Bound result 4097\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 250000100000000000000000352\n  Bound result 0\n  Bound result 0\n  Bound result 3185\n  Bound result 2\n  Bound result 250000100000000000000000352\n  Bound result 0\n  Bound result 0\n  Bound result 1725540769\n  Bound result 7673\n  Bound result 0\n  Bound result 39332511830821525798039799\n  Bound result 0\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 0\n  Bound result 9145\n  Bound result 2030710871056209789151747\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 244\n  Bound result 244\n  Bound result 0\n  Bound result 200\n  Bound result 0\n  Bound result 107477464\n  Bound result 957625570\n  Bound result 0\n  Bound result 244\n  Bound result 7000000000000000000\n  Bound result 51966\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 239\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5141\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.03s (12.03s CPU time)\n\nRan 3 test suites in 12.03s (12.18s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":46,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMD.approve(address,uint256)\",\"IMD.transfer(address,uint256)\",\"IMD.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":100,\"foundry.toml\":28,\"src/IMD.sol\":16,\"test/IMD.adversarial.t.sol\":259,\"test/IMD.invariant.t.sol\":186,\"test/IMD.t.sol\":358},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6c14cf7ba39214acbb68079d6c185e51c45e7281e7ddbf0b980f95f1343059a6","verifiedTreeHash":"c6fc30b67750b7f0aaff2b9e619df3f8ae5f09ea","verifierVersion":"0.1.0+f8d984f2"},{"checks":[{"durationMs":1090,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 988.27ms\nCompiler run successful!\n","passed":true},{"durationMs":2609,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/IMD.t.sol:IMDTest\n[PASS] testFuzz_AllowanceAccounting(uint256,uint256) (runs: 256, μ: 151537, ~: 154699)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_TransferAboveBalanceReverts(uint256) (runs: 256, μ: 64751, ~: 65049)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129661581\n\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 256, μ: 92809, ~: 93148)\nLogs:\n  Bound result 908793294418427695437793948\n\n[PASS] test_ApproveEmitsEventAndCanBeReplacedOrRevoked() (gas: 177732)\n[PASS] test_ConstructorEmitsMintToImmediateDeployer() (gas: 28244)\n[PASS] test_Create2FactoryReceivesEntireSupply() (gas: 271699)\n[PASS] test_DeployerCannotSpendHolderFundsWithoutApproval() (gas: 102468)\n[PASS] test_ExactFactoryDistributionClaimsAndPoolTransfers() (gas: 619056)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 132412)\n[PASS] test_MetadataAndInitialSupply() (gas: 103287)\n[PASS] test_NoMintBurnUpgradeOrHolderControlEntrypoints() (gas: 1980310)\n[PASS] test_RevertWhenAllowanceIsInsufficient() (gas: 108619)\n[PASS] test_RevertWhenApprovedTransferExceedsBalanceRestoresAllowance() (gas: 114403)\n[PASS] test_RevertWhenApprovedTransferGoesToZeroRestoresAllowance() (gas: 111619)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 37618)\n[PASS] test_RevertWhenSendingNativeCurrency() (gas: 36844)\n[PASS] test_RevertWhenTransferringToZeroAddress() (gas: 71925)\n[PASS] test_RuntimeContainsNoForbiddenOpcodes() (gas: 1038878)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51507)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 88928)\n[PASS] test_TransferEntireBalance() (gas: 71331)\n[PASS] test_TransferFromEmitsEventAndConsumesAllowance() (gas: 228228)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 100755)\n[PASS] test_TransferToContractDoesNotCallRecipient() (gas: 173890)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 66426)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 67556)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 7.01ms (30.04ms CPU time)\n\nRan 1 test for test/IMD.invariant.t.sol:IMDInvariantTest\n[PASS]\nIMDInvariantTest invariants:\n[PASS] invariant_AllowancesMatchAuthorizations\n[PASS] invariant_SupplyAndBalancesRemainConserved\n IMDInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+----------+-------+---------+----------╮\n| Contract   | Selector | Calls | Reverts | Discards |\n+====================================================+\n| IMDHandler | approve  | 2736  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| IMDHandler | move     | 2701  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| IMDHandler | spend    | 2755  | 0       | 0        |\n╰------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1757\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 3663\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 95\n  Bound result 93\n  Bound result 127\n  Bound result 0\n  Bound result 0\n  Bound result 5241\n  Bound result 3494\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 242\n  Bound result 656839047682324787\n  Bound result 0\n  Bound result 4099\n  Bound result 1\n  Bound result 309\n  Bound result 0\n  Bound result 4098\n  Bound result 242\n  Bound result 2704107591501933\n  Bound result 0\n  Bound result 359907925177594879709394838\n  Bound result 285736438913646068725066844\n  Bound result 0\n  Bound result 444410147114243431819099947\n  Bound result 206963777458133\n  Bound result 3\n  Bound result 214234541421929320043458225\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.52s (2.52s CPU time)\n\nRan 2 test suites in 2.53s (2.53s CPU time): 27 tests passed, 0 failed, 0 skipped (27 total tests)\n","passed":true},{"durationMs":37,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMD.approve(address,uint256)\",\"IMD.transfer(address,uint256)\",\"IMD.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":100,\"foundry.toml\":28,\"launch.json\":20,\"src/IMD.sol\":16,\"test/IMD.invariant.t.sol\":99,\"test/IMD.t.sol\":358},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e08fa0a4ab8ea27bff4a8dabe730e012ac9ed4229a4b6e29422cac50c9e8bb36","verifiedTreeHash":"172d6d2ea3bb35e0f6a2a96877d35e3cee8ad93a","verifierVersion":"0.1.0+f8d984f2"}]}