{"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":"ee8cdcd3-5a56-453c-8ff8-c513d7cea364","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"132bf6a26db7015e769cee7e08af9ba6050107208a9398200ceb0ea19241082f","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":"7f080334c7d107cf7920749ea65bde6011938959f00dc0c600bad7ce961ca45b","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":"4b5df146ee8a579681911e1f6201d571abf74381f829f1d98afc49a270fbb208","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"e56e924c212561984aa12e52b79d06b41d06cbeaa68cf910b416840bf42970b0","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":"493b6dd0d6b2b88036f5552dd8eee73752e1ad9b24ac55fcc081bef05850af96","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":"5a09dcf1f8d49761a0143f10274632aad664533d04fd71178bde221933319db0","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"e05cb5c4a644973eab223b726bdb03da153cbe0e47266a6ca3336444ed606abe","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"6ac4f2e750b877ee2c063f327451ea2acac22b8951cc7053cd6351660714f1d1","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Mutually Assured Destruction (MAD).\nToken name: Mutually Assured Destruction\nToken symbol: MAD\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"249a595c156ad1bb32d9ce94b16d0fc934d9bb4faf06c0449cbaa62f13f4425d","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"ee8cdcd3-5a56-453c-8ff8-c513d7cea364","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2470-mutually-assured-destruction"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51877","feedbackHash":"f5fad24c0b51e9e7d86a754b056b4537766ac41173f8dc0dc24fdc1cd3b4e1dd","nodeKey":"audit_economics","submissionHash":"132bf6a26db7015e769cee7e08af9ba6050107208a9398200ceb0ea19241082f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51874","feedbackHash":"3f6f2ef09995ce37b8b7061ad9ed8c6d076eeadf5697173bec462be6bd1c58c2","nodeKey":"audit_flow","submissionHash":"7f080334c7d107cf7920749ea65bde6011938959f00dc0c600bad7ce961ca45b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51419","feedbackHash":"96aca24ea76f90b82ba8c1cbef97965cb209f351634a87f7b208975f95e5e19b","nodeKey":"audit_judge","submissionHash":"4b5df146ee8a579681911e1f6201d571abf74381f829f1d98afc49a270fbb208","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51875","feedbackHash":"f7bfdd7c674c931afa30679ba72abbb8a34b00f493047f16cfa9d4141ec5881c","nodeKey":"audit_math","submissionHash":"e56e924c212561984aa12e52b79d06b41d06cbeaa68cf910b416840bf42970b0","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51876","feedbackHash":"10608079a1548603f7aa6911c45daaf6f5e316ff9adf800e7e34e09eead4460b","nodeKey":"audit_permissions","submissionHash":"493b6dd0d6b2b88036f5552dd8eee73752e1ad9b24ac55fcc081bef05850af96","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51732","feedbackHash":"cf34d2707976042d6a2074c6f0bc80be2a7435ad418525ddd2590315d4efcfa9","nodeKey":"build_contract_project","submissionHash":"5a09dcf1f8d49761a0143f10274632aad664533d04fd71178bde221933319db0","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51026","feedbackHash":"2c09f8f6c8e2041a965c64ac90a704b774ac0922af2363035b00c0b7348cc222","nodeKey":"manifest","submissionHash":"e05cb5c4a644973eab223b726bdb03da153cbe0e47266a6ca3336444ed606abe","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52616","feedbackHash":"730d32a4240bf1320a460d5f7ecbf2000912e5b0e825ebb20468bcc1ae2c07cf","nodeKey":"write_foundry_tests","submissionHash":"6ac4f2e750b877ee2c063f327451ea2acac22b8951cc7053cd6351660714f1d1","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"76b09dc603b6d60795f4bdc74657071fbfa011e2a0fbdfbcc1c71bea89714c87","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f494611affb5524c","findings":[{"citation":"resolved","description":"Not a defect in this code: MADToken inherits the unmodified OpenZeppelin v5.1.0 ERC20 (verified byte-identical to upstream v5.1.0 for all five vendored files). `approve` overwrites the allowance rather than adjusting it, so a holder who lowers a non-zero allowance can be front-run by the spender, who spends the old allowance and then the new one. This is the behaviour the ERC-20 standard specifies; OpenZeppelin v5 removed increaseAllowance/decreaseAllowance on purpose, the brief asks for a plain fixed-supply token with no transfer customisation, and README.md lines 94-96 already tell applications to revoke to zero and wait before setting a new value. It is recorded here so the judge sees it was considered under the Economic Security guide ('legitimate features turned against the protocol') and so it is not re-raised as a defect. No fix is proposed; adding allowance-adjust helpers would change the agreed design (plain ERC-20) and would still not remove the race for callers that use approve. Severity info: the only loser is a holder who changes their own live allowance without zeroing it first, and the amount is bounded by the two allowances they themselves granted.","line":127,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: trader holds 1000 MAD. 1) trader.approve(spender, 100). 2) spender.transferFrom(trader, spender, 100) (mempool front-run). 3) trader.approve(spender, 50) intending to reduce the earlier allowance. 4) spender.transferFrom(trader, spender, 50). Expected by a naive holder: spender can take at most 100 in total. Actual: spender holds 150 (balanceOf(spender) == 150). Reproduced in test/scratch/EconFlow.t.sol::test_allowanceReplacementRace. Revoking to 0 and waiting for inclusion before approving 50 bounds the loss to the first allowance only, as README prescribes.","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":"Standard ERC-20 allowance replacement race (inherent to the specification, accepted by design, documented in README)"}],"hash":"132bf6a26db7015e769cee7e08af9ba6050107208a9398200ceb0ea19241082f","nodeId":"bc8d6118-04e7-42be-9657-d78ebd6ddc6c","outcome":"completed","summary":"The review is complete and the findings file is written. No defects were found in the assigned area.\n\n**Result: clean under the Economic Security, Invariant and Flow Gap guides.** The token at `src/MADToken.sol` is a fixed-supply ERC-20 that inherits OpenZeppelin v5.1.0 with no overrides. I diffed all five vendored OpenZeppelin files against upstream v5.1.0 and they are byte-identical. The project suite passes with the README seed.\n\n**What I checked, with evidence:**\n- The supply literal equals exactly 10^27 base units, matching the brief and the manifest example. It fits in int128, so a Uniswap v4 balance delta cannot overflow on the 75% seed.\n- Sum of balances equals total supply permanently. The constructor mint is the only writer of total supply, and the compiled ABI exposes only the ten ERC-20 functions plus the supply constant. The project's stateful invariant run and my scratch tests confirm conservation.\n- The launch flows arrive whole. My scratch test deploys through a CREATE2 factory, pushes the 10%/75%/15% shares, claims from the distributor, and trades both ways through a v4-style sync/settle probe. The settled delta equals the sent amount for every holder across 1,024 fuzz runs.\n- There are no external calls, callbacks, payable paths, or call-family opcodes in the bytecode, so none of the dependency-failure or periphery seams in the guides have anything to act on.\n- Transfer and transferFrom revert cleanly on zero recipient, insufficient balance and insufficient allowance, restoring allowance on failure. The deployer and factory cannot debit a holder without approval.\n- The aderyn large-numeric-literal lead was checked and dismissed. Slither reported nothing.\n\n**Findings file contents.** One `info` entry records the standard ERC-20 allowance replacement race with a concrete reproduction, marked explicitly as inherent to the specification, accepted by the design, and already documented in the README. It proposes no fix. Eight coverage rows cover all three entry points as `holds` plus five invariants and flows I verified.\n\nScratch tests live under `test/scratch/EconFlow.t.sol`, which the repository ignores and which is not submitted. No tracked file was modified.","treeHash":null,"usage":{"cachedInputTokens":728476,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14892,"runtime":"claude","turns":30,"wallClockMs":223355}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d03fc84904b54d9e","findings":[],"hash":"493b6dd0d6b2b88036f5552dd8eee73752e1ad9b24ac55fcc081bef05850af96","nodeId":"aa11b029-eb02-463f-894e-35c188e5def5","outcome":"completed","summary":"The review is complete. The findings file is written and the scratch probe passes on all ten checks.\n\n**Result: no defects found in the Access Control, Trust Gap or Asymmetry areas.** The file `.imd-findings.json` holds an empty findings list and seven coverage rows, one for each of the three listed entry points plus four invariants.\n\n**What I verified**\n\n- **Access control.** The token has no roles at all. The ABI's only state-changing functions are approve, transfer and transferFrom. There is no receive, fallback, initializer, owner, minter, pauser, blocklist or upgrade path. Empty calldata, unknown selectors and any ETH value all revert. The deployer or factory has exactly the same rights as any holder, and a transferFrom from the factory against a holder with no allowance reverts.\n- **Trust gap.** The entire implementation is vendored OpenZeppelin. All five vendored files hash identically to upstream v5.1.0, so no modified library hides a backdoor. The supply slot has no writer after construction because mint and burn are never exposed. Reachable runtime code contains no DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL, STATICCALL or CREATE. The constructor takes no arguments and credits msg.sender, which under CREATE2 is the factory and never the origin or the factory's caller.\n- **Asymmetry.** Storage-write tracing shows transfer writes exactly two balance slots, transferFrom with a finite allowance writes one allowance slot plus two balances, and an unlimited allowance writes only balances. A revert on any path restores allowance. A transferFrom with from set to the zero address reverts for both zero and positive value, so no mint can be reached through the allowance path. A zero-value transferFrom without allowance succeeds and moves nothing, which is standard ERC-20 behavior.\n\n**Leads I checked and dropped**\n\n- The aderyn \"large numeric literal\" line resolves to exactly 10^27, matching the manifest supply.\n- The ERC-20 approval replacement race is reproducible but inherent to the standard, documented in the README, and not a defect of the requested design.\n\n**Not run here**\n\nThe protected Uniswap v4 harness could not be executed because v4-core is not vendored in this tree. Since the token has no transfer override, the launch flows cannot arrive short, and the existing launch-flow unit test plus my probe confirm supply conservation.","treeHash":null,"usage":{"cachedInputTokens":625729,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12385,"runtime":"claude","turns":24,"wallClockMs":171512}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fea57d3e9d0ca7bf","findings":[{"citation":"resolved","description":"Merged from audit_economics (its only finding); audit_flow, audit_math, audit_permissions and write_foundry_tests reported nothing. MADToken inherits the unmodified OpenZeppelin v5.1.0 ERC20. I re-verified this myself: the v5.1.0 archive downloaded from codeload.github.com has SHA-256 8a3b08cfc756437ba3343901565b18182adb42ec1e621960240a19da5d738686, matching DEPENDENCIES.md, and all six vendored files (Context.sol, draft-IERC6093.sol, ERC20.sol, IERC20.sol, IERC20Metadata.sol, LICENSE) are byte-identical to upstream (cmp). approve overwrites the allowance instead of adjusting it, so a holder lowering a non-zero allowance can be front-run by the spender, who spends the old allowance and then the new one. This is exactly what the ERC-20 standard specifies; OpenZeppelin v5 removed increaseAllowance/decreaseAllowance deliberately; the brief asks for a plain fixed-supply token; README.md lines 94-96 already instruct applications to revoke to zero and wait before setting a new value. The only party exposed is a holder who replaces their own live allowance without zeroing first, and the loss is bounded by the two allowances they themselves granted. No fix is proposed: adding allowance-adjust helpers would change the agreed plain-ERC20 design and would not remove the race for callers that use approve. Recorded so it is not re-raised as a defect.","line":127,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"Reproduced in test/scratch/Judge.t.sol::test_allowanceReplacementRace (scratch, not kept): deploy MADToken; token.transfer(trader, 1000). 1) vm.prank(trader); token.approve(spender, 100). 2) vm.prank(spender); token.transferFrom(trader, spender, 100) (the mempool front-run). 3) vm.prank(trader); token.approve(spender, 50), intending to lower the allowance. 4) vm.prank(spender); token.transferFrom(trader, spender, 50). Expected by a naive holder: spender receives at most 100 in total. Actual: balanceOf(spender) == 150, balanceOf(trader) == 850; the test passes with these assertions. Revoking to 0 before step 3 bounds the loss to the first 100, as README prescribes.","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":"Standard ERC-20 allowance replacement race in approve (inherent to the specification, accepted by design, documented in README; not a defect, opens no revision)"}],"hash":"4b5df146ee8a579681911e1f6201d571abf74381f829f1d98afc49a270fbb208","nodeId":"67a72532-c93d-4b50-8994-877889079006","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. The working tree is otherwise untouched.\n\n**Outcome.** The MAD token has no defects. It is a parameterless, fixed-supply OpenZeppelin v5.1.0 ERC-20 with no owner, hooks, fees or admin surface, and it is deployable under the factory model.\n\n**What I verified**\n- **Vendored library is genuine.** I downloaded the OpenZeppelin v5.1.0 archive and confirmed its checksum matches DEPENDENCIES.md. All six vendored files are byte-identical to upstream.\n- **Build and suite pass.** The project builds under Solidity 0.8.26 and all 55 tests pass with the README's fuzz seed, including the two invariant suites.\n- **Entry points traced.** I wrote a scratch test exercising approve, transfer and transferFrom on their success and revert paths, plus CREATE2 deployment through a factory stub that credits the factory with the whole supply. All passed as expected. The scratch directory is removed.\n- **Deployment limits.** Creation code is 2,657 bytes and runtime 1,752 bytes, far under the protocol limits. No delegatecall, callcode or selfdestruct exists in source. The manifest's empty constructorArgs and totalSupply match the contract.\n- **Static leads.** Slither reported nothing. The aderyn large-numeric-literal note on the supply constant is a style remark only. The literal evaluates to the correct 10^27.\n\n**Specialist findings.** Four areas and the test writer reported one finding in total, from audit_economics: the standard ERC-20 allowance overwrite race in approve, rated info. I reproduced it and kept it at info as a documented, by-design note that opens no revision. The README already instructs applications to revoke to zero first. Nothing was found to merge or drop beyond that.\n\n**Coverage.** All three listed entry points are marked holds, with four additional invariant rows covering the constructor mint, supply immutability and privileged calls, deployability, and the manifest.","treeHash":null,"usage":{"cachedInputTokens":533964,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":8191,"runtime":"claude","turns":11,"wallClockMs":166236}},{"artifacts":[],"attempt":1,"bundleHash":"99cbf938eb16dcd9f702534ec352cb291f02f588bb8a5d7ca0d21a62c896874f","device":"75474cc326e8a817","findings":[],"hash":"5a09dcf1f8d49761a0143f10274632aad664533d04fd71178bde221933319db0","nodeId":"3d84a50d-afae-4d33-b45e-2c14dabe6ade","outcome":"completed","summary":"Implemented [MADToken.sol](/root/nft7/.identitymd/work/ee8cdcd3-5a56-453c-8ff8-c513d7cea364/3d84a50d-afae-4d33-b45e-2c14dabe6ade/src/MADToken.sol): 1 billion MAD, 18 decimals, minted once to the deployer.\n\nDependencies are vendored. Assumptions, deployment parameters, and operational responsibilities are documented.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passes.\n- All 33 tests pass with the supplied fuzz seed.\n- `forge fmt --check` passes.\n- Compiled bytecode passes the prohibited-opcode check.","treeHash":"eab0c5856c642167fc9229129b4f6bf274dd76ba","usage":{"cachedInputTokens":320640,"inputTokens":42996,"model":"gpt-6-astra","outputTokens":13120,"runtime":"codex","turns":5,"wallClockMs":367736}},{"artifacts":[],"attempt":1,"bundleHash":"ad24900031708f369c9de9ee752b388eedb106003430491bdb2d8b6a4604b028","device":"a7979f925df7a720","findings":[],"hash":"6ac4f2e750b877ee2c063f327451ea2acac22b8951cc7053cd6351660714f1d1","nodeId":"53bf973c-d03c-4078-8e5c-5d3c9faf14f3","outcome":"completed","summary":"I added 22 tests in two new files under `test/` and found no defects in the token, so there is no `.imd-findings.json`. The full suite passes with the verifier's fuzz seed: 55 tests (the 33 that were already there plus my 22), 0 failed. `forge build` succeeds too. The new files aren't committed yet.\n\n`src/MADToken.sol` is a plain OpenZeppelin v5.1 ERC-20. Its constructor mints 1,000,000,000 × 10¹⁸ to whoever deploys it, and it has no owner, mint, burn, pause or fee code.\n\n**`test/MADToken.edge.t.sol`** (21 tests), mostly failure paths:\n- **Calls that must fail:**\n  - sending ETH to the token, calling a function it doesn't have, or attaching ETH to `transfer`/`approve`;\n  - the zero address trying to send or approve;\n  - `transferFrom` with the zero address as the source, for zero and non-zero amounts;\n  - an owner moving their own tokens through `transferFrom` without an allowance;\n  - a spender trying to go past their allowance over several calls.\n- **Edge cases:** an allowance of the maximum minus 1 still counts down; an unlimited allowance emits no `Approval` event when spent; contracts can hold and send tokens like wallets; tokens sent to the token's own address stay stuck there, because nothing can take them out.\n- **Fixed facts:** the supply is exactly 10²⁷. The deployed code is within the 24,576-byte limit and contains no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- **Launch in one transaction:** a helper contract deploys the token and splits it into the 10% swarm share, a fuzzed pool share and the remainder, all in one call. Each share must arrive whole, and the distributor's claim must arrive whole too.\n- **Fuzzed properties:** `transfer` succeeds exactly when the amount is within the balance. `transferFrom` succeeds exactly when the amount is within both the allowance and the balance, and changes nothing when it fails. The other three cover approvals, round-trips and split transfers.\n\n**`test/MADToken.ledger.invariant.t.sol`** (invariant suite, 256 runs × 100 calls): a handler drives five holders through random valid transfers, approvals and `transferFrom` calls. It also mixes in calls that must revert: overdrawing a balance, overspending an allowance, sending to or approving the zero address, and an outsider trying `transferFrom` or `mint`. Running separate tallies of balances and allowances, the invariants check that:\n- every balance and allowance matches the tally exactly;\n- each balance equals what came in minus what went out;\n- the balances add up to the full supply and the total supply never changes;\n- the outsider and the zero address never hold tokens or allowances.\n\nOne expectation I wrote was wrong and I corrected it. `transferFrom(address(0), x, 0)` reverts with `ERC20InvalidApprover`, not `ERC20InvalidSender`, because OpenZeppelin v5.1 checks the allowance before the sender. The call is still refused, which is the property under test.","treeHash":"7052a7a0f18764ce7a7aea0729037f979fa56c70","usage":{"cachedInputTokens":389447,"inputTokens":18,"model":"claude-opus-5-5","outputTokens":14353,"runtime":"claude","turns":11,"wallClockMs":177542}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fb26479062458645","findings":[],"hash":"7f080334c7d107cf7920749ea65bde6011938959f00dc0c600bad7ce961ca45b","nodeId":"1c90a7e2-3651-455f-9ced-335bac6817a1","outcome":"completed","summary":"The review is complete. The findings file holds an empty findings list with ten coverage rows, all `holds`, and the scratch test directory is removed. The working tree is clean apart from the required `.imd-findings.json`.\n\n**Result: no defects found.** The token in `src/MADToken.sol` is an unmodified OpenZeppelin v5.1.0 ERC20 with one constructor mint and nothing else, and every check in my three guides came back clean.\n\n**What I verified for the three entry points:**\n- `transfer` and `transferFrom` reach a single atomic `_update` with no external calls, no partial writes and no reachable callback. Max allowance is never decremented, max-minus-one is, and a revert inside the transfer restores the allowance.\n- `approve` only writes the caller's own allowance slot and rejects a zero spender. The standard ERC-20 approve race is inherent to the requested design and already documented in the README, so it is not reported as a defect.\n- The constructor mints exactly 10^27 base units to the immediate creator, not the transaction origin, which I confirmed through a nested-constructor test. This dismisses the aderyn large-literal lead.\n\n**Periphery and first principles:**\n- I downloaded the OpenZeppelin v5.1.0 tarball, matched its checksum to DEPENDENCIES.md, and compared each vendored file byte for byte. All six are identical to upstream.\n- An opcode scan of the compiled runtime found no reachable DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL or CREATE, and there is no receive or fallback. The metadata tail is the version only, consistent with the pinned build settings.\n- Supply cannot grow after launch since the ABI exposes no mint, and no privileged role exists that could move or freeze a holder. Launch flows move exactly what they say because nothing overrides the transfer path.\n\n**What I did not run:** the protected Uniswap v4 harness, which needs the v4-core dependency and launch environment variables not present here. The project's own launch-flow test covers the transfer side of that flow, and the existing 33 tests plus my eight scratch probes all pass.","treeHash":null,"usage":{"cachedInputTokens":578595,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":12331,"runtime":"claude","turns":27,"wallClockMs":174395}},{"artifacts":[],"attempt":1,"bundleHash":"9b388ef103649b1cc8bfd1c628a0dbdf4d509f438cdb087637412cfefea29869","device":"56b13350bba65fd7","findings":[],"hash":"e05cb5c4a644973eab223b726bdb03da153cbe0e47266a6ca3336444ed606abe","nodeId":"49a8c0bf-e684-4c91-9fab-6d36bc2c99dd","outcome":"completed","summary":"Nothing left to fetch. The manifest validates and the tree is clean apart from `launch.json`.\n\n- **Written:** `launch.json` only, `kind: \"custom_token\"`, token `MADToken` with empty `constructorArgs` (the constructor is `constructor() ERC20(\"Mutually Assured Destruction\", \"MAD\")` and mints `1_000_000_000 * 10 ** 18` to `msg.sender`), `totalSupply` of `\"1000000000000000000000000000\"`, 18 decimals.\n- **Contracts:** `contracts` is an empty list. `src/MADToken.sol` is the whole accepted tree, so there is no application contract to name.\n- **Pool and economics:** FWA at `0xa0df17b5ac76ababa36e1450e2cbcd18a620c845`, fee 12500, tick spacing 60, provenance price `79228162514264337593543950336`; the economics object copied byte-for-byte from the brief. The swarm's 1000 bps is not written anywhere.\n- **Checks run:** `forge build` succeeds, `forge test` with the pinned fuzz seed passes 33 tests including the invariant, and a scratch validator confirmed the key set, types, lowercase address, name pattern, notes length (1580 characters) and supply arithmetic against 10^27.\n- **Nothing else changed:** `git status` shows `launch.json` as the only untracked file; `forge fmt --check` is clean.\n\nOne judgment call worth flagging: I left `contracts` empty rather than inventing a placeholder contract, since the criterion is that every named contract matches the accepted implementation and no application contract exists in it.","treeHash":"697bcbd59e0150a177b00ba12b9dc1b4d165d359","usage":{"cachedInputTokens":245966,"inputTokens":24,"model":"claude-fable-5-1","outputTokens":6161,"runtime":"claude","turns":14,"wallClockMs":68603}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"672c29f92850efe0","findings":[],"hash":"e56e924c212561984aa12e52b79d06b41d06cbeaa68cf910b416840bf42970b0","nodeId":"99634562-5a69-43d2-8945-aa5ce6251e51","outcome":"completed","summary":"The review is complete with no defects found. The working tree is clean apart from ignored build output and the findings file.\n\n**Outcome:** `.imd-findings.json` holds an empty findings list and eight coverage rows, all `holds`. I reported no findings because nothing in the Math Precision, Boundary or Numerical Gap guides applies to a defect in this code.\n\n**What the token is:** `src/MADToken.sol` is a 17-line contract that inherits the vendored OpenZeppelin v5.1.0 ERC20 unchanged and mints a constant supply to the deployer in its constructor. It has no overrides, no owner, no fees, no external calls, no receive or fallback.\n\n**What I verified:**\n- **Supply constant.** The literal evaluates to exactly 10^27, matching the brief and the manifest's minor units. The single mint cannot overflow. The aderyn \"large numeric literal\" lead is style only.\n- **Transfer and transferFrom thresholds.** Balance equal to value passes, one more reverts, including the maximum uint256. Allowance equal to value passes to zero, one less reverts. Max minus one is a finite allowance and is decremented, max is the untouched infinite sentinel. The unchecked subtractions and additions are bounded by the total supply.\n- **Boundary cases.** Zero-value transfers, self-transfers, self-approvals, transfers from the zero address, and ETH sent to the contract all behave as OpenZeppelin documents and roll back cleanly on revert.\n- **Launch arithmetic.** The 10/75/15 percent split of 10^27 divides exactly with no remainder, and every transfer delivers the full amount, so the launch flows arrive whole.\n- **Dependency integrity.** All five vendored OpenZeppelin files hash identically to the upstream v5.1.0 tag.\n- **Bytecode.** The compiled runtime contains no CALL-family or SELFDESTRUCT opcodes. The ABI exposes exactly the three listed entry points plus views.\n\nThe project's own 33 tests, including the fuzz and stateful invariant suites, pass. My scratch probe test exercised the extra edges above and has been removed. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":578880,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":11174,"runtime":"claude","turns":22,"wallClockMs":148092}}],"verification":[{"checks":[{"durationMs":1859,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.70s\nCompiler run successful!\n","passed":true},{"durationMs":1216,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_create2DeploymentCreditsFactory(bytes32) (runs: 1024, μ: 231970, ~: 232075)\n[PASS] testFuzz_insufficientAllowanceAlwaysReverts(uint256,uint256) (runs: 1024, μ: 121523, ~: 123172)\nLogs:\n  Bound result 3159173245388668\n  Bound result 471167370452556\n\n[PASS] testFuzz_insufficientBalanceAlwaysReverts(uint256) (runs: 1024, μ: 58858, ~: 59179)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639953\n\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 1024, μ: 148751, ~: 148583)\nLogs:\n  Bound result 64059230183857\n\n[PASS] testFuzz_transferFromAccountsForEveryUnit(uint256,uint256) (runs: 1024, μ: 164253, ~: 165134)\nLogs:\n  Bound result 33700124488803151601\n  Bound result 4264934166355341469916542228906767703167006632136170494755\n\n[PASS] testFuzz_transferToZeroReverts(uint256) (runs: 1024, μ: 47821, ~: 47769)\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 163839)\n[PASS] test_approvalMayExceedCurrentBalance() (gas: 80613)\n[PASS] test_approvalsAreScopedToOwnerAndSpender() (gas: 173817)\n[PASS] test_approveReturnsTrueAndEmitsEvent() (gas: 76238)\n[PASS] test_approveZeroSpenderReverts() (gas: 37662)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9655)\n[PASS] test_deployerCannotSpendHolderBalanceWithoutApproval() (gas: 94975)\n[PASS] test_directDeploymentCreditsImmediateDeployer() (gas: 32736)\n[PASS] test_emptyAccountCannotTransferPositiveAmount() (gas: 37840)\n[PASS] test_factoryDistributionClaimsAndTradingTransfersArriveWhole() (gas: 566558)\n[PASS] test_metadataAndEntireInitialSupply() (gas: 107643)\n[PASS] test_noMintBurnAdminOrUpgradeEntryPoints() (gas: 854735)\n[PASS] test_selfTransferPreservesBalance() (gas: 51409)\n[PASS] test_transferBeyondBalanceRevertsWithoutChanges() (gas: 65226)\n[PASS] test_transferEntireBalance() (gas: 151367)\n[PASS] test_transferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 172610)\n[PASS] test_transferFromExhaustedAllowanceCannotBeReused() (gas: 161420)\n[PASS] test_transferFromInfiniteAllowanceIsNotReduced() (gas: 204254)\n[PASS] test_transferFromInsufficientAllowanceRevertsWithoutChanges() (gas: 115686)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 126109)\n[PASS] test_transferFromSelfConsumesAllowanceWithoutChangingBalance() (gas: 103159)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 78693)\n[PASS] test_transferFromZeroRecipientRestoresAllowance() (gas: 114133)\n[PASS] test_transferReturnsTrueAndEmitsEvent() (gas: 93482)\n[PASS] test_transferToContractRequiresNoReceiverCallback() (gas: 227039)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73366)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 54.51ms (332.66ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS] invariant_supplyAndAllBalancesAreConserved() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2694  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2742  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2756  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 14\n  Bound result 0\n  Bound result 0\n  Bound result 401585914421307690218070797\n  Bound result 0\n  Bound result 0\n  Bound result 804448731\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 40000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3858947846\n  Bound result 237682743009\n  Bound result 1\n  Bound result 8\n  Bound result 3032843839\n  Bound result 129837115860406780029868773\n  Bound result 0\n  Bound result 555207244053091616299738891\n  Bound result 865446872505163032547904327\n  Bound result 5192\n  Bound result 9\n  Bound result 477821125\n  Bound result 982180759589902672682444280\n  Bound result 121883334311852688630\n  Bound result 74\n  Bound result 4\n  Bound result 163042596\n  Bound result 60000000000000000000\n  Bound result 0\n  Bound result 332342274\n  Bound result 13\n  Bound result 80160830\n  Bound result 14\n  Bound result 255\n  Bound result 227\n  Bound result 11\n  Bound result 79892291318045410\n  Bound result 100\n  Bound result 238936786\n  Bound result 11\n  Bound result 1000000000000000000000000000\n  Bound result 567\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.07s (1.07s CPU time)\n\nRan 2 test suites in 1.07s (1.13s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":64,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"LICENSE\":21,\"README.md\":103,\"foundry.toml\":21,\"remappings.txt\":2,\"src/MADToken.sol\":17,\"test/MADToken.invariant.t.sol\":90,\"test/MADToken.t.sol\":399},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":832,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":421,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/MADToken.sol:11: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5a09dcf1f8d49761a0143f10274632aad664533d04fd71178bde221933319db0","verifiedTreeHash":"eab0c5856c642167fc9229129b4f6bf274dd76ba","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":2784,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.62s\nCompiler run successful!\n","passed":true},{"durationMs":18491,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_create2DeploymentCreditsFactory(bytes32) (runs: 1024, μ: 231979, ~: 232075)\n[PASS] testFuzz_insufficientAllowanceAlwaysReverts(uint256,uint256) (runs: 1024, μ: 121900, ~: 123172)\nLogs:\n  Bound result 21339\n  Bound result 9650\n\n[PASS] testFuzz_insufficientBalanceAlwaysReverts(uint256) (runs: 1024, μ: 58855, ~: 59179)\nLogs:\n  Bound result 3289667728764116545263488961688416203401301770674163886080687907811448\n\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 1024, μ: 148596, ~: 148583)\nLogs:\n  Bound result 72874747810440390341662\n\n[PASS] testFuzz_transferFromAccountsForEveryUnit(uint256,uint256) (runs: 1024, μ: 164381, ~: 165146)\nLogs:\n  Bound result 21339\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129628247\n\n[PASS] testFuzz_transferToZeroReverts(uint256) (runs: 1024, μ: 47819, ~: 47769)\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 163839)\n[PASS] test_approvalMayExceedCurrentBalance() (gas: 80613)\n[PASS] test_approvalsAreScopedToOwnerAndSpender() (gas: 173817)\n[PASS] test_approveReturnsTrueAndEmitsEvent() (gas: 76238)\n[PASS] test_approveZeroSpenderReverts() (gas: 37662)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9655)\n[PASS] test_deployerCannotSpendHolderBalanceWithoutApproval() (gas: 94975)\n[PASS] test_directDeploymentCreditsImmediateDeployer() (gas: 32736)\n[PASS] test_emptyAccountCannotTransferPositiveAmount() (gas: 37840)\n[PASS] test_factoryDistributionClaimsAndTradingTransfersArriveWhole() (gas: 566558)\n[PASS] test_metadataAndEntireInitialSupply() (gas: 107643)\n[PASS] test_noMintBurnAdminOrUpgradeEntryPoints() (gas: 854735)\n[PASS] test_selfTransferPreservesBalance() (gas: 51409)\n[PASS] test_transferBeyondBalanceRevertsWithoutChanges() (gas: 65226)\n[PASS] test_transferEntireBalance() (gas: 151367)\n[PASS] test_transferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 172610)\n[PASS] test_transferFromExhaustedAllowanceCannotBeReused() (gas: 161420)\n[PASS] test_transferFromInfiniteAllowanceIsNotReduced() (gas: 204254)\n[PASS] test_transferFromInsufficientAllowanceRevertsWithoutChanges() (gas: 115686)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 126109)\n[PASS] test_transferFromSelfConsumesAllowanceWithoutChangingBalance() (gas: 103159)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 78693)\n[PASS] test_transferFromZeroRecipientRestoresAllowance() (gas: 114133)\n[PASS] test_transferReturnsTrueAndEmitsEvent() (gas: 93482)\n[PASS] test_transferToContractRequiresNoReceiverCallback() (gas: 227039)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73366)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 95.35ms (494.51ms CPU time)\n\nRan 21 tests for test/MADToken.edge.t.sol:MADTokenEdgeTest\n[PASS] testFuzz_approveSetsExactValueAndTouchesNothingElse(address,address,uint256) (runs: 1024, μ: 103355, ~: 103752)\n[PASS] testFuzz_oneCallLaunchMovesEveryShareWhole(bytes32,uint256) (runs: 1024, μ: 646505, ~: 647365)\nLogs:\n  Bound result 2040\n\n[PASS] testFuzz_roundTripTransferRestoresBalances(uint256) (runs: 1024, μ: 176563, ~: 176910)\nLogs:\n  Bound result 64059230183857\n\n[PASS] testFuzz_splitTransfersEqualOneTransfer(uint256,uint256) (runs: 1024, μ: 117937, ~: 117896)\nLogs:\n  Bound result 319446282251218573143121767\n  Bound result 615250017544471\n\n[PASS] testFuzz_transferFromSucceedsIffWithinAllowanceAndBalance(uint256,uint256,uint256) (runs: 1000, μ: 197327, ~: 193054)\nLogs:\n  Bound result 10000\n\n[PASS] testFuzz_transferSucceedsIffAmountWithinBalance(uint256,uint256,address) (runs: 1000, μ: 141985, ~: 133726)\nLogs:\n  Bound result 864804013969264336303034258\n\n[PASS] test_allowanceOneBelowMaxIsFinite() (gas: 123981)\n[PASS] test_contractHolderTransfersAndApprovesLikeAnEOA() (gas: 468057)\n[PASS] test_holderCanSendToTokenAddressButNobodyCanRetrieveIt() (gas: 104061)\n[PASS] test_ownerNeedsAllowanceToTransferFromItself() (gas: 42661)\n[PASS] test_plainEtherTransferIsRejected() (gas: 40082)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2474049)\n[PASS] test_spenderCannotDrainMoreThanAllowanceAcrossCalls() (gas: 232057)\n[PASS] test_supplyIsExactlyOneBillionWholeTokens() (gas: 42408)\n[PASS] test_transferFromZeroAddressWithAmountFailsOnAllowance() (gas: 38083)\n[PASS] test_transferFromZeroAddressWithZeroAmountStillReverts() (gas: 37836)\n[PASS] test_unknownSelectorIsRejected() (gas: 53991)\n[PASS] test_unlimitedApprovalEmitsOnlyOnApprove() (gas: 119722)\n[PASS] test_valueOnNonPayableFunctionsIsRejected() (gas: 87805)\n[PASS] test_zeroAddressCannotApprove() (gas: 40372)\n[PASS] test_zeroAddressCannotSend() (gas: 33143)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 95.44ms (524.27ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS] invariant_supplyAndAllBalancesAreConserved() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2694  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2742  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2756  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 15\n  Bound result 0\n  Bound result 0\n  Bound result 401585914421307690218070797\n  Bound result 0\n  Bound result 0\n  Bound result 804448731\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 3096\n  Bound result 0\n  Bound result 1306\n  Bound result 177362149\n  Bound result 2846\n  Bound result 38781734\n  Bound result 237682743009\n  Bound result 0\n  Bound result 20000000000000000000\n  Bound result 28237333\n  Bound result 129837115860406780029868773\n  Bound result 0\n  Bound result 0\n  Bound result 865446872505163032547904327\n  Bound result 5193\n  Bound result 60\n  Bound result 132\n  Bound result 982180759589902672682444280\n  Bound result 121883334311852688630\n  Bound result 407\n  Bound result 0\n  Bound result 10\n  Bound result 999999999999999999999999999\n  Bound result 67\n  Bound result 142243080\n  Bound result 9\n  Bound result 67413458\n  Bound result 11\n  Bound result 243\n  Bound result 229\n  Bound result 230029919272\n  Bound result 79892291318045410\n  Bound result 9000\n  Bound result 804006\n  Bound result 40000000000000000000\n  Bound result 255\n  Bound result 4398\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.06s (1.06s CPU time)\n\nRan 1 test for test/MADToken.ledger.invariant.t.sol:MADTokenLedgerInvariantTest\n[PASS]\nMADTokenLedgerInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_balancesMatchModelAndSumToSupply\n MADTokenLedgerInvariantTest invariants (runs: 256, calls: 25600, reverts: 0)\n\n╭---------------+--------------+-------+---------+----------╮\n| Contract      | Selector     | Calls | Reverts | Discards |\n+===========================================================+\n| LedgerHandler | approve      | 3190  | 0       | 0        |\n|---------------+--------------+-------+---------+----------|\n| LedgerHandler | overdraw     | 3253  | 0       | 0        |\n|---------------+--------------+-------+---------+----------|\n| LedgerHandler | overspend    | 3237  | 0       | 0        |\n|---------------+--------------+-------+---------+----------|\n| LedgerHandler | stranger     | 3220  | 0       | 0        |\n|---------------+--------------+-------+---------+----------|\n| LedgerHandler | transfer     | 6323  | 0       | 0        |\n|---------------+--------------+-------+---------+----------|\n| LedgerHandler | transferFrom | 3169  | 0       | 0        |\n|---------------+--------------+-------+---------+----------|\n| LedgerHandler | zeroAddress  | 3208  | 0       | 0        |\n╰---------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 1325305642694274701298007589419255150\n  Bound result 1\n  Bound result 23966233960427615365460401276903635939823532231247917858962275972245\n  Bound result 0\n  Bound result 1082\n  Bound result 0\n  Bound result 2024\n  Bound result 3\n  Bound result 0\n  Bound result 4976\n  Bound result 1719639408\n  Bound result 0\n  Bound result 763600052\n  Bound result 200000000000000000000\n  Bound result 186001\n  Bound result 6985\n  Bound result 10\n  Bound result 635\n  Bound result 18\n  Bound result 0\n  Bound result 7242\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 6504\n  Bound result 0\n  Bound result 0\n  Bound result 8826\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 977598085313724206093186087\n  Bound result 243\n  Bound result 709\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 999999999999999999\n  Bound result 10978372508128036726529\n  Bound result 2\n  Bound result 1\n  Bound result 3735928559\n  Bound result 5139\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 2110234841\n  Bound result 3604\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 6147\n  Bound result 2212\n  Bound result 0\n  Bound result 936243771799760360\n  Bound result 9213\n  Bound result 0\n  Bound result 364\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1723\n  Bound result 0\n  Bound result 4288775752\n  Bound result 5011\n  Bound result 0\n  Bound result 125813996375599159817140963330240011258305308995329\n  Bound result 771061955264828544\n  Bound result 2\n  Bound result 60000000000000000000\n  Bound result 7487\n  Bound result 621\n  Bound result 0\n  Bound result 200000000000000000000\n  Bound result 643865547\n  Bound result 243\n  Bound result 7\n  Bound result 0\n  Bound result 0\n  Bound result 42000000000000000000\n  Bound result 9000\n  Bound result 88630121454\n  Bound result 7575\n  Bound result 193623586707074897765910424125435\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 18.33s (18.32s CPU time)\n\nRan 4 test suites in 18.33s (19.58s CPU time): 55 tests passed, 0 failed, 0 skipped (55 total tests)\n","passed":true},{"durationMs":77,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"LICENSE\":21,\"README.md\":103,\"foundry.toml\":21,\"remappings.txt\":2,\"src/MADToken.sol\":17,\"test/MADToken.edge.t.sol\":305,\"test/MADToken.invariant.t.sol\":90,\"test/MADToken.ledger.invariant.t.sol\":203,\"test/MADToken.t.sol\":399},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6ac4f2e750b877ee2c063f327451ea2acac22b8951cc7053cd6351660714f1d1","verifiedTreeHash":"7052a7a0f18764ce7a7aea0729037f979fa56c70","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":1902,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.71s\nCompiler run successful!\n","passed":true},{"durationMs":1204,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_create2DeploymentCreditsFactory(bytes32) (runs: 1024, μ: 231970, ~: 232075)\n[PASS] testFuzz_insufficientAllowanceAlwaysReverts(uint256,uint256) (runs: 1024, μ: 121523, ~: 123172)\nLogs:\n  Bound result 615250017544471\n  Bound result 605206849944857\n\n[PASS] testFuzz_insufficientBalanceAlwaysReverts(uint256) (runs: 1024, μ: 58858, ~: 59179)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129657109\n\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 1024, μ: 148751, ~: 148583)\nLogs:\n  Bound result 758454878622672387128267582\n\n[PASS] testFuzz_transferFromAccountsForEveryUnit(uint256,uint256) (runs: 1024, μ: 164253, ~: 165134)\nLogs:\n  Bound result 387557837631066893589430359\n  Bound result 1428428346330234159789186783791586917921226249317397433325319\n\n[PASS] testFuzz_transferToZeroReverts(uint256) (runs: 1024, μ: 47821, ~: 47769)\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 163839)\n[PASS] test_approvalMayExceedCurrentBalance() (gas: 80613)\n[PASS] test_approvalsAreScopedToOwnerAndSpender() (gas: 173817)\n[PASS] test_approveReturnsTrueAndEmitsEvent() (gas: 76238)\n[PASS] test_approveZeroSpenderReverts() (gas: 37662)\n[PASS] test_constructorEmitsExactlyOneMint() (gas: 9655)\n[PASS] test_deployerCannotSpendHolderBalanceWithoutApproval() (gas: 94975)\n[PASS] test_directDeploymentCreditsImmediateDeployer() (gas: 32736)\n[PASS] test_emptyAccountCannotTransferPositiveAmount() (gas: 37840)\n[PASS] test_factoryDistributionClaimsAndTradingTransfersArriveWhole() (gas: 566558)\n[PASS] test_metadataAndEntireInitialSupply() (gas: 107643)\n[PASS] test_noMintBurnAdminOrUpgradeEntryPoints() (gas: 854735)\n[PASS] test_selfTransferPreservesBalance() (gas: 51409)\n[PASS] test_transferBeyondBalanceRevertsWithoutChanges() (gas: 65226)\n[PASS] test_transferEntireBalance() (gas: 151367)\n[PASS] test_transferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 172610)\n[PASS] test_transferFromExhaustedAllowanceCannotBeReused() (gas: 161420)\n[PASS] test_transferFromInfiniteAllowanceIsNotReduced() (gas: 204254)\n[PASS] test_transferFromInsufficientAllowanceRevertsWithoutChanges() (gas: 115686)\n[PASS] test_transferFromInsufficientBalanceRestoresAllowance() (gas: 126109)\n[PASS] test_transferFromSelfConsumesAllowanceWithoutChangingBalance() (gas: 103159)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 78693)\n[PASS] test_transferFromZeroRecipientRestoresAllowance() (gas: 114133)\n[PASS] test_transferReturnsTrueAndEmitsEvent() (gas: 93482)\n[PASS] test_transferToContractRequiresNoReceiverCallback() (gas: 227039)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73366)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 91.76ms (485.03ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS] invariant_supplyAndAllBalancesAreConserved() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2694  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2742  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2756  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 14\n  Bound result 0\n  Bound result 0\n  Bound result 401585914421307690218070797\n  Bound result 0\n  Bound result 0\n  Bound result 804448731\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 40000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3858947846\n  Bound result 237682743009\n  Bound result 1\n  Bound result 8\n  Bound result 3032843839\n  Bound result 129837115860406780029868773\n  Bound result 0\n  Bound result 555207244053091616299738891\n  Bound result 865446872505163032547904327\n  Bound result 5192\n  Bound result 9\n  Bound result 477821125\n  Bound result 982180759589902672682444280\n  Bound result 121883334311852688630\n  Bound result 74\n  Bound result 4\n  Bound result 163042596\n  Bound result 60000000000000000000\n  Bound result 0\n  Bound result 332342274\n  Bound result 13\n  Bound result 80160830\n  Bound result 14\n  Bound result 255\n  Bound result 227\n  Bound result 11\n  Bound result 79892291318045410\n  Bound result 100\n  Bound result 238936786\n  Bound result 11\n  Bound result 1000000000000000000000000000\n  Bound result 567\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.07s (1.04s CPU time)\n\nRan 2 test suites in 1.08s (1.16s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":70,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"LICENSE\":21,\"README.md\":103,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/MADToken.sol\":17,\"test/MADToken.invariant.t.sol\":90,\"test/MADToken.t.sol\":399},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e05cb5c4a644973eab223b726bdb03da153cbe0e47266a6ca3336444ed606abe","verifiedTreeHash":"697bcbd59e0150a177b00ba12b9dc1b4d165d359","verifierVersion":"0.1.0+ead9012e"}]}