{"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":"6b406079-5c7f-46fa-b515-95ccc060f354","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"ef2f7310d26cd0f9bdf1b9da34962917e7418aa64bcbd20608cf660d3695ab49","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"daef766c8f281059bdaf54873508c345d339a60fcbf926ccd64e1e943a9b6849","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"26ac14f8421afd3dd8e504f7d20c3120b05cb33838efaa618a22da19d37fd0d5","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","subagents":4,"tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"aa303e834ef356f77988c43cb726fa7f6997a5f2df8460cb1c919d55b70fc0f1","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"c5a3f1f3b3e8f27130b24d2aefa11efc38423cbacddda5739b6be59a728d2ac5","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"5b73cab87e57defd43f76869e91ca5e3771b28fb2e462e902399c00852523952","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"233931f5ac483af6dc0a25d8c88b1683f90b46827d16f49c733982c17172b95a","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"9435c383903fa6ea103dc918fe48130e2d6f255f3e2a1c6ea0a7191ea4419b12","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: 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":"c5f908919f341b2dad872c36c55f174fcf2cf497276811b8ba54f4a1c8d34b62","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"6b406079-5c7f-46fa-b515-95ccc060f354","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2836-mutually-assured-destruction"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51198","feedbackHash":"ec0cbf643a5812257245042c4bfe100f8a86f108d07162568c2a6d82bda15d65","nodeKey":"audit_economics","submissionHash":"ef2f7310d26cd0f9bdf1b9da34962917e7418aa64bcbd20608cf660d3695ab49","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53916","feedbackHash":"47eaafbbb251c94cc09b9ad685b9f99f94f36fc5810b49a69c41e30683aa5136","nodeKey":"audit_flow","submissionHash":"daef766c8f281059bdaf54873508c345d339a60fcbf926ccd64e1e943a9b6849","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51043","feedbackHash":"25ce803ab8a853fda2cb6a22a8a6fcf3461c6e047cbb6992f01c8bd79a71c557","nodeKey":"audit_judge","submissionHash":"26ac14f8421afd3dd8e504f7d20c3120b05cb33838efaa618a22da19d37fd0d5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51024","feedbackHash":"7b660ad3eb8eec82f55a10c1fe97e2681319e91b2210131ca3b33bf9f8ef5aa0","nodeKey":"audit_math","submissionHash":"aa303e834ef356f77988c43cb726fa7f6997a5f2df8460cb1c919d55b70fc0f1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51023","feedbackHash":"d71cdc858755c4eb4a1b5c712c27fef886f4d14326e72a9ece7508ab9de22aec","nodeKey":"audit_permissions","submissionHash":"c5a3f1f3b3e8f27130b24d2aefa11efc38423cbacddda5739b6be59a728d2ac5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51878","feedbackHash":"6cda3f46d2f8c81b59ba54c3bbb8d503ad6a26a27422d3c49c08b47beaf9e7d2","nodeKey":"build_contract_project","submissionHash":"5b73cab87e57defd43f76869e91ca5e3771b28fb2e462e902399c00852523952","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52672","feedbackHash":"5ee2053e7c044af10c9d8fee3473fa6f1c333ca8f0ccbfe072149e9b6609705c","nodeKey":"manifest","submissionHash":"233931f5ac483af6dc0a25d8c88b1683f90b46827d16f49c733982c17172b95a","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51732","feedbackHash":"607c8f5ca55b84bbd915623979971d398d4fa81f138f95b4ad3b9b9bef4c09ea","nodeKey":"write_foundry_tests","submissionHash":"9435c383903fa6ea103dc918fe48130e2d6f255f3e2a1c6ea0a7191ea4419b12","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"7d6f1c9ba2b85420d048a0ddc42b8a5a13f987fd74188c6f0f9bc38f65f9f2f4","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"3b1e7efe32faaee4bb09027c6d24b9ec914bfbf334d671a4e300c4413414f2eb","device":"223fd994d1a35f81","findings":[],"hash":"233931f5ac483af6dc0a25d8c88b1683f90b46827d16f49c733982c17172b95a","nodeId":"f9bd6e4e-7dd8-4701-9e74-a822d7d97d7a","outcome":"completed","summary":"I wrote `launch.json` for the MAD launch, and it is the only file I changed. I left it uncommitted.\n\nWhat's in the manifest, based on the accepted code in `src/MADToken.sol`:\n\n- **Token:** contract `MADToken`, named \"Mutually Assured Destruction\", symbol `MAD`, 18 decimals. Its constructor takes no arguments, so `constructorArgs` is an empty list. `totalSupply` is `\"1000000000000000000000000000\"`, which is exactly the one billion tokens the constructor mints to the deployer.\n- **Contracts:** an empty list. The accepted code contains only the token.\n- **Pool:** paired with FWA (`0xa0df17b5ac76ababa36e1450e2cbcd18a620c845`), fee 12500, tick spacing 60, and starting price `79228162514264337593543950336` (one to one).\n- **Economics:** copied word for word from the brief.\n- **Notes:** 644 characters (the limit is 4,000) describing the token: a fixed supply, no owner, no fee on transfer, and holders can burn only their own tokens.\n\nNothing here validates the manifest itself. I checked it by reading it against the brief and the schema rules, and confirmed it parses as JSON. `forge build` and `forge test` passed, with 39 of 39 tests using the required fuzz seed. Those are the repo's existing token tests, not the protected check files, which weren't run.","treeHash":"23a2283efdf3dffe1597b6982e12474a70e8e669","usage":{"cachedInputTokens":87414,"inputTokens":10,"model":"claude-opus-5-5","outputTokens":2160,"runtime":"claude","turns":6,"wallClockMs":27332}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2565f234b0a569e9","findings":[{"citation":"resolved","description":"Not a defect; a scope confirmation for the requester, merged from the audit_flow specialist's single finding (the other three specialists and the tester reported nothing). The brief asks for name, symbol and a supply of 1,000,000,000 MAD with 18 decimals minted once to the deployer. The implementation also exposes a holder-only burn (OpenZeppelin _burn on msg.sender only; no burnFrom, no allowance path) and EIP-2612 permit (unmodified OpenZeppelin ERC20Permit v5.4.0; every vendored OpenZeppelin file hashes identically to upstream v5.4.0). Neither gives any party power over another holder's balance, and the launch floor explicitly allows a supply that shrinks. The consequence is that after any burn, totalSupply() is below 1e27, so the manifest's token.totalSupply describes the supply at deployment, which is what the floor checks, not a permanent invariant. The README documents this. If the requester wants a strictly constant supply, burn should be removed; otherwise this is the intended design and can be closed without a code change.","line":47,"path":"src/MADToken.sol","reproduction":"Deploy MADToken from FACTORY (totalSupply() == 1000000000000000000000000000, balanceOf(FACTORY) == 1000000000000000000000000000). FACTORY calls burn(1). Expected under a literal reading of the brief: supply stays 1000000000000000000000000000. Actual: totalSupply() == 999999999999999999999999999 and balanceOf(FACTORY) == 999999999999999999999999999; Transfer(FACTORY, address(0), 1) and Burned(FACTORY, 1) are emitted. A different address calling burn(1) with zero balance reverts with ERC20InsufficientBalance, and a call to burnFrom(address,uint256) returns false (no such selector). Reproduced in a scratch Foundry test on this tree: both assertions held exactly as stated.","severity":"info","snippet":"    function burn(uint256 amount) external {\n        if (amount == 0) revert ZeroBurn();\n        _burn(msg.sender, amount);\n        emit Burned(msg.sender, amount);\n    }","title":"burn() and permit() go beyond the brief's literal specification; totalSupply is a ceiling at deployment, not a constant"}],"hash":"26ac14f8421afd3dd8e504f7d20c3120b05cb33838efaa618a22da19d37fd0d5","nodeId":"0c9148ab-789c-411b-b737-7a55feb4d390","outcome":"completed","summary":"Review complete. The MAD token has no defects; the findings file holds one reproduced info note and a full coverage record.\n\n**What I verified**\n\n- The contract is OpenZeppelin v5.4.0 ERC20 plus ERC20Permit with a five-line holder-only burn. Every vendored OpenZeppelin file it depends on hashes identically to upstream v5.4.0, so the token's behaviour is the library's.\n- The project's own 75 tests pass, including the invariant suite. The formatter check is clean.\n- Constructor takes no arguments and mints exactly 1e27 to msg.sender with no external calls. Runtime and creation code are far below the size limits, and there is no receive, fallback, owner, mint, DELEGATECALL or SELFDESTRUCT path.\n- launch.json matches the contract: name, symbol, decimals, empty constructorArgs and a totalSupply equal to the constructor mint, with schema-valid types and lowercase addresses.\n\n**Specialist findings**\n\nFour specialists and the tester reported one item in total, from audit_flow at info severity. I reproduced it in a scratch test: the factory calling burn(1) lowers totalSupply and its own balance by exactly one, while a stranger's burn reverts and burnFrom does not exist. It is a scope confirmation, not a defect, since the launch floor permits a shrinking supply and the README documents it. I kept it as the single info finding so the requester can confirm burn and permit are wanted. Nothing to merge, nothing dropped.\n\n**Coverage**\n\nAll five entry points are marked holds, with two extra rows for the constructor and the manifest. No proof files were needed because there is no critical or high finding. The scratch test was removed, so the only file written is .imd-findings.json.","treeHash":null,"usage":{"cachedInputTokens":221650,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":7308,"runtime":"claude","turns":15,"wallClockMs":114392}},{"artifacts":[],"attempt":1,"bundleHash":"48d5fa490efead3e9d3ced116bf7bd02112fa727d6e1184490c1e950e931ac25","device":"2a6239e0c1b8c774","findings":[],"hash":"5b73cab87e57defd43f76869e91ca5e3771b28fb2e462e902399c00852523952","nodeId":"8975083e-1c70-49dc-9808-8a6b8cf7c358","outcome":"completed","summary":"The MAD token is implemented, tested, documented, and committed on `main` as `d30bb41`.\n\n**What was built**\n\n- `src/MADToken.sol`: the `MADToken` contract. The constructor mints 1,000,000,000 MAD with 18 decimals to `msg.sender` once, with no constructor arguments and no external calls. It inherits OpenZeppelin's ERC20 and ERC20Permit, and adds a holder-only `burn` that rejects zero. There is no owner, mint, pause, blocklist, `burnFrom`, fee or upgrade path, so the launch flows move exactly what they say and nothing can grow the supply.\n- `test/MADToken.t.sol`: 39 tests, all passing with the verifier's fuzz seed. They cover metadata, the single mint and its events, exact transfers and supply conservation, failure cases for transfer, transferFrom, approve and burn, permit success, expiry, wrong signer and replay, the launch flow from factory to distributor to claimant arriving whole, the floor's list of mint and freeze selectors all reverting, and a bytecode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT. Four fuzz tests check supply, burn and allowance accounting.\n- `foundry.toml` pins solc 0.8.26, sets `bytecode_hash = \"none\"`, disables CBOR metadata and ffi, and grants no filesystem permissions. `remappings.txt` maps forge-std and OpenZeppelin.\n- `lib/forge-std` v1.9.7 and `lib/openzeppelin-contracts` v5.4.0 are vendored as plain files, trimmed to source and licenses, with no git metadata or submodule.\n- `README.md` documents behaviour, assumptions, the manifest values for supply and decimals, and the operational responsibilities after launch. There is nothing to configure post-launch since the token has no owner or settable value.\n\n**Checks run**\n\n```\nforge build --offline     Compiler run successful\nforge test --offline      39 passed, 0 failed\nforge fmt --check         clean\n```\n\n**Not done here**\n\nSlither was not run since the task does not provide it. The design avoids its rejected detectors: no selfdestruct, no library calls, no assembly shifts, no packed encoding of dynamic values, and transferFrom only spends the caller's allowance. The pinned protected tests run in the verifier's own harness with v4-core, which is not part of this repository.","treeHash":"d1709ce2be18b6d8ff2319e4d270ce70553dc513","usage":{"cachedInputTokens":706761,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":20687,"runtime":"claude","turns":25,"wallClockMs":269280}},{"artifacts":[],"attempt":1,"bundleHash":"58036c569fc4670eec8615bf2591aaa09c533cac2e388c286f401eab4bd85a08","device":"75474cc326e8a817","findings":[],"hash":"9435c383903fa6ea103dc918fe48130e2d6f255f3e2a1c6ea0a7191ea4419b12","nodeId":"a4594665-4c91-4d85-ac6d-ef15f990ad5c","outcome":"completed","summary":"Added failure-path, boundary, permit-security, and multi-actor invariant tests, plus coverage notes. All additions are under `test/`.\n\nValidation passed:\n\n- `forge build`\n- `forge test` with the specified seed: **75 passed, 0 failed**\n- Invariants: **32,768 calls**, no unexpected reverts\n- Formatting checks\n\nNo implementation defects were reproduced.","treeHash":"0b75f2cee0520e19a620f96d6932941fa2ece126","usage":{"cachedInputTokens":1448960,"inputTokens":74364,"model":"gpt-6-astra","outputTokens":26436,"runtime":"codex","turns":7,"wallClockMs":718690}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e6de8d4c6cf97551","findings":[],"hash":"aa303e834ef356f77988c43cb726fa7f6997a5f2df8460cb1c919d55b70fc0f1","nodeId":"66ccc863-d046-4d0c-b217-401cef956cd9","outcome":"completed","summary":"The review is complete. The math audit of the MAD token found no defects.\n\n**What I checked.** The token is OpenZeppelin v5.4.0 `ERC20` + `ERC20Permit` plus a twelve-line holder-only `burn`, and nothing else. I ran the Math Precision, Boundary and Numerical Gap passes against every entry point and the inherited code paths they reach:\n\n- **Precision.** The only arithmetic the contract adds is the compile-time constant for the supply, which evaluates to exactly 1e27 minor units. No division, scaling, casts or fixed-point math exist anywhere in the token.\n- **Boundary.** Transfers and burns at zero, whole balance and max uint all revert or succeed exactly as the ERC-20 spec says, with the right error values. Permit accepts a deadline equal to the current timestamp and max uint, rejects high-s malleable signatures, cannot be satisfied for the zero owner, and rolls back its nonce when the spender is zero.\n- **Seams.** Balance conservation held under fuzzing across transfer and burn mixes, including burning the whole supply down to zero. The unchecked subtractions in the inherited update logic are guarded by the preceding balance check.\n- **Library integrity.** The OpenZeppelin tree is vendored as plain files, so I compared all 207 Solidity files against the upstream v5.4.0 release tarball. Every one is byte-identical.\n\n**Static-analysis lead.** The aderyn large-literal warning is the supply constant itself, which is exact. It is not a defect.\n\n**Output.** The findings file at the repository root holds an empty findings list and nine coverage rows: one `holds` row for each of the five entry points, plus rows for the single-mint invariant, decimals agreement, library integrity and the absence of any payable path. The existing test suite passes, and I removed my scratch tests after running them.\n\nOne non-defect worth knowing: `decimals()` returns OpenZeppelin's default 18 rather than reading the contract's own `DECIMALS` constant. Both are 18 today, so there is no failing input, but wiring them together would make the agreement structural rather than coincidental.","treeHash":null,"usage":{"cachedInputTokens":491935,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":13164,"runtime":"claude","turns":23,"wallClockMs":181345}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ca080fd306399669","findings":[],"hash":"c5a3f1f3b3e8f27130b24d2aefa11efc38423cbacddda5739b6be59a728d2ac5","nodeId":"dd664bc8-0c89-45d2-8ca9-26e39c2c7844","outcome":"completed","summary":"The review is complete. The findings file holds zero defects and nine coverage rows, and the working tree is otherwise clean.\n\n**Result: no defects found in the permissions area.** The token is OpenZeppelin ERC20 plus ERC20Permit plus a twelve-line holder-only `burn`, with no owner, role, modifier or settable state.\n\n**What I checked, per guide**\n\n- **Access Control.** The compiled ABI has exactly five state-changing functions and no hidden ones. Storage holds only balances, allowances, supply, name/symbol strings and permit nonces. Every writer of every slot is bound to the caller or to a verified EIP-712 signer, so there is no weaker-guard writer to exploit. The constructor takes no arguments and mints the full supply once to the deployer, with no second mint path.\n- **Trust Gap.** The only trusted actor is the deployer, and after construction it has no power beyond any holder. I verified this with a probe: the deployer gets the same allowance and balance errors as a stranger. I also diffed all 207 vendored OpenZeppelin files against the published v5.4.0 npm release, byte for byte, with no differences, so the inherited code carries nothing hidden.\n- **Asymmetry.** Approve and permit set the same slot under equivalent authority. A third party relaying a permit sets only what the owner signed and gains nothing. Burn reaches only the caller's balance, and an approved spender cannot route a burn through a transfer to the zero address. Transfers from the zero address cannot mint under either a positive or a zero amount.\n\n**Static analysis leads.** Slither reported nothing. Aderyn's large-literal note on line 26 is the supply constant, which evaluates to exactly 1e27 and is not a defect.\n\n**Limits.** The protected launch floor test could not be run here because it depends on v4-core, a LaunchLiquidity source and environment variables absent from this tree. The repository's own suite mirrors its checks and passes, 39 tests including fuzz runs. My scratch probe of seven permission edge cases also passed and was removed afterwards.","treeHash":null,"usage":{"cachedInputTokens":566793,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":13491,"runtime":"claude","turns":25,"wallClockMs":205881}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"505a745a77612e11","findings":[{"citation":"resolved","description":"Not a defect: a scope confirmation for the requester. The brief asks for name, symbol and a supply of 1,000,000,000 with 18 decimals minted once to the deployer, and nothing else. The implementation adds a holder-only burn (OpenZeppelin _burn on msg.sender, no burnFrom, no allowance path) and EIP-2612 permit (unmodified OpenZeppelin ERC20Permit v5.4.0). Both are conventional, neither gives any party power over another holder's balance, and the launch floor explicitly permits a supply that shrinks. But after any burn, totalSupply() is below 1e27, so integrators and the manifest's token.totalSupply (which must equal what the constructor mints, 1000000000000000000000000000) describe the supply at deployment, not an invariant. The README documents this (\"totalSupply only decreases, through burn\"). If the requester wanted a strictly constant supply, burn should be removed; otherwise this is the intended design and can be closed. All three guides in my area (Execution Trace, Periphery, First Principles) were checked and found no failing input on any of the five entry points.","line":47,"path":"src/MADToken.sol","reproduction":"Deploy MADToken from FACTORY (totalSupply() == 1000000000000000000000000000). FACTORY calls burn(1). Expected under a literal reading of the brief: supply stays 1,000,000,000 MAD. Actual: totalSupply() == 999999999999999999999999999 and balanceOf(FACTORY) == 999999999999999999999999999; Transfer(FACTORY, address(0), 1) and Burned(FACTORY, 1) are emitted. Nobody else's balance changes.","severity":"info","snippet":"    function burn(uint256 amount) external {\n        if (amount == 0) revert ZeroBurn();\n        _burn(msg.sender, amount);\n        emit Burned(msg.sender, amount);\n    }","title":"burn() and permit() are additions beyond the brief's literal specification; totalSupply is a ceiling, not a constant"}],"hash":"daef766c8f281059bdaf54873508c345d339a60fcbf926ccd64e1e943a9b6849","nodeId":"f54cbd2a-5b26-4d25-9428-7dc461204377","outcome":"completed","summary":"The review is complete and the findings file is written. The tree is otherwise unchanged (scratch tests removed, no source edits).\n\n**Outcome: no defects found in the control-flow area.** The MAD token is OpenZeppelin v5.4.0 `ERC20` + `ERC20Permit` plus a 5-line holder-only `burn`, with no constructor arguments and no privileged role.\n\nWhat I checked, per the three assigned guides:\n\n- **Execution Trace.** Traced all five entry points from call to final state. Sentinel inputs (zero owner, zero receiver, zero spender, max amounts), signature malleability (high-s), nonce replay, deadline boundary, cross-chain domain separator, approval residuals and infinite allowance all behave as ERC-20 and EIP-2612 specify. Verified with an 8-test scratch suite, all passing, and the project's own 39 tests.\n- **Periphery.** All 19 OpenZeppelin files compiled into the token were compared byte-for-byte against the upstream v5.4.0 tag. All identical, so no vendored modification hides in the base contracts.\n- **First Principles.** The constructor mints exactly 1e27 to `msg.sender` once, reads no chain state and calls nothing. The ABI exposes 18 selectors, none of them mint, owner, pause, freeze, upgrade or burnFrom. Supply can only shrink, which the launch floor explicitly permits.\n\nWritten to `.imd-findings.json`:\n\n- **One informational note**, not a defect. `burn` and `permit` go beyond the brief's literal words, so after any burn `totalSupply` is below 1,000,000,000 MAD. Reproduction given. The requester should confirm this is intended, or drop `burn` for a strictly constant supply.\n- **Eight coverage rows**, all `holds`: the five listed entry points, the constructor mint, the vendored library periphery, and the supply and opcode invariants.\n\nNot covered: no `launch.json` exists yet, so the manifest was not reviewed. When it is written, `constructorArgs` must be empty and `totalSupply` must be `1000000000000000000000000000`.","treeHash":null,"usage":{"cachedInputTokens":549442,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":13282,"runtime":"claude","turns":17,"wallClockMs":201724}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"29ea8835baa3dfe1","findings":[],"hash":"ef2f7310d26cd0f9bdf1b9da34962917e7418aa64bcbd20608cf660d3695ab49","nodeId":"16694c18-1045-461a-9de2-bd2ee517b323","outcome":"completed","summary":"I found no defects in the economics area for `MADToken`. `.imd-findings.json` has an empty findings list and 8 coverage rows: all 5 entry points marked `holds`, plus 3 rows for invariants I checked.\n\n**What the code is:** `src/MADToken.sol` is OpenZeppelin `ERC20` and `ERC20Permit` with nothing changed, plus a 4-line `burn` that only the holder can call. I compared the vendored OpenZeppelin copy in `lib/` against the upstream v5.4.0 release, and the only difference is that the `mocks/` folder is left out. So there are no altered library internals to worry about.\n\n**Checks against the three guides:**\n- **Economic Security:** the token has no transfer fee, rebase, blacklist or pause, and makes no calls to other contracts. So none of the launch transfers can arrive short of what was sent: factory to distributor, distributor to claimant, the pool seed, and swaps. Supply can't grow after deployment. The permit signature format is the standard one (name \"Mutually Assured Destruction\", version \"1\"), it follows the chain ID, and each signature works only once.\n- **Invariant:** I checked that all balances add up to total supply, that supply only goes down after the constructor, and that each burn lowers supply by exactly its amount. A throwaway fuzz test of these covered transfer, approve, transferFrom and burn across four holders. It passed, and I deleted it afterwards.\n- **Flow Gap:** there is no point where an amount is computed before a call and reused after it, no callbacks, and no external calls. Nobody can burn another address's tokens, so the distributor's and the pool's balances can't be destroyed by anyone else.\n\nThe project's own 39 tests all pass. The one static-analysis lead (aderyn, \"large numeric literal\" at line 26) is just the supply constant, which is correct as written (1e27). It isn't a defect.\n\nTwo standard ERC-20 behaviours I deliberately didn't report, because neither is a defect in this code: tokens sent to the token's own address are stuck for good, and someone can get a permit signature in first, so a later contract call that uses that permit fails.\n\nNo repository files were changed. The empty `{\"findings\":[]}` placeholder was replaced by the final report.","treeHash":null,"usage":{"cachedInputTokens":403269,"inputTokens":20,"model":"claude-opus-5-5","outputTokens":7225,"runtime":"claude","turns":13,"wallClockMs":105766}}],"verification":[{"checks":[{"durationMs":1439,"exitCode":0,"name":"build","output":"Compiling 40 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.33s\nCompiler run successful!\n","passed":true},{"durationMs":162,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_burnReducesSupplyByExactlyTheAmount(uint256,uint256) (runs: 256, μ: 144791, ~: 145076)\nLogs:\n  Bound result 48879\n  Bound result 3600\n\n[PASS] testFuzz_transferBeyondBalanceReverts(uint256,uint256) (runs: 256, μ: 93014, ~: 93313)\nLogs:\n  Bound result 64824\n  Bound result 464054595683521979383308163\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 100859, ~: 101135)\nLogs:\n  Bound result 3600\n\n[PASS] testFuzz_transferFromSpendsExactlyTheAllowance(uint256,uint256) (runs: 256, μ: 146950, ~: 147197)\nLogs:\n  Bound result 32\n  Bound result 21\n\n[PASS] test_approveAndTransferFrom() (gas: 216797)\n[PASS] test_approveRevertsForZeroSpender() (gas: 30804)\n[PASS] test_burnByHolderWithNothingReverts() (gas: 32816)\n[PASS] test_burnOnlyTouchesTheCaller() (gas: 160167)\n[PASS] test_burnReducesHolderBalanceAndSupply() (gas: 116229)\n[PASS] test_burnRevertsBeyondBalance() (gas: 101697)\n[PASS] test_burnRevertsOnZero() (gas: 35840)\n[PASS] test_burnWholeBalance() (gas: 107393)\n[PASS] test_constructorEmitsMintEvents() (gas: 7737)\n[PASS] test_constructorMintsToWhoeverDeploys() (gas: 26070)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 40480)\n[PASS] test_hasNoOwner() (gas: 29808)\n[PASS] test_infiniteAllowanceIsNotReduced() (gas: 174054)\n[PASS] test_launchFlowsArriveWhole() (gas: 145587)\n[PASS] test_metadata() (gas: 59036)\n[PASS] test_noBurnFromExists() (gas: 146436)\n[PASS] test_noCallIncreasesSupply() (gas: 687509)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 449811)\n[PASS] test_permitCannotBeReplayed() (gas: 132582)\n[PASS] test_permitRevertsForWrongSigner() (gas: 75492)\n[PASS] test_permitRevertsWhenExpired() (gas: 48436)\n[PASS] test_permitSetsAllowanceAndConsumesNonce() (gas: 109415)\n[PASS] test_permitThenTransferFromMovesTokens() (gas: 210102)\n[PASS] test_rejectsEther() (gas: 36817)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 6067388)\n[PASS] test_supplyIsExactlyOneBillionWithEighteenDecimals() (gas: 26648)\n[PASS] test_transferFromRevertsBeyondAllowance() (gas: 133127)\n[PASS] test_transferFromRevertsBeyondBalanceEvenWithAllowance() (gas: 138748)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 92786)\n[PASS] test_transferMovesExactAmount() (gas: 89406)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 103123)\n[PASS] test_transferRevertsToZeroAddress() (gas: 30857)\n[PASS] test_transferRevertsWhenSenderHoldsNothing() (gas: 33197)\n[PASS] test_transferToSelfKeepsBalance() (gas: 41351)\n[PASS] test_transferZeroAmountSucceeds() (gas: 43316)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 20.74ms (85.99ms CPU time)\n\nRan 1 test suite in 22.32ms (20.74ms CPU time): 39 tests passed, 0 failed, 0 skipped (39 total tests)\n","passed":true},{"durationMs":68,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.burn(uint256)\",\"MADToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":100,\"foundry.toml\":23,\"launch.json\":24,\"remappings.txt\":2,\"src/MADToken.sol\":52,\"test/MADToken.t.sol\":506},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"233931f5ac483af6dc0a25d8c88b1683f90b46827d16f49c733982c17172b95a","verifiedTreeHash":"23a2283efdf3dffe1597b6982e12474a70e8e669","verifierVersion":"0.1.0+a6eb4461"},{"checks":[{"durationMs":1359,"exitCode":0,"name":"build","output":"Compiling 40 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.26s\nCompiler run successful!\n","passed":true},{"durationMs":148,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_burnReducesSupplyByExactlyTheAmount(uint256,uint256) (runs: 256, μ: 144791, ~: 145076)\nLogs:\n  Bound result 48879\n  Bound result 3600\n\n[PASS] testFuzz_transferBeyondBalanceReverts(uint256,uint256) (runs: 256, μ: 93014, ~: 93313)\nLogs:\n  Bound result 377364937256440556793213240\n  Bound result 727355519841067454696551950\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 100859, ~: 101135)\nLogs:\n  Bound result 3600\n\n[PASS] testFuzz_transferFromSpendsExactlyTheAllowance(uint256,uint256) (runs: 256, μ: 146950, ~: 147197)\nLogs:\n  Bound result 377364937256440556793213240\n  Bound result 284470945051224152381472310\n\n[PASS] test_approveAndTransferFrom() (gas: 216797)\n[PASS] test_approveRevertsForZeroSpender() (gas: 30804)\n[PASS] test_burnByHolderWithNothingReverts() (gas: 32816)\n[PASS] test_burnOnlyTouchesTheCaller() (gas: 160167)\n[PASS] test_burnReducesHolderBalanceAndSupply() (gas: 116229)\n[PASS] test_burnRevertsBeyondBalance() (gas: 101697)\n[PASS] test_burnRevertsOnZero() (gas: 35840)\n[PASS] test_burnWholeBalance() (gas: 107393)\n[PASS] test_constructorEmitsMintEvents() (gas: 7737)\n[PASS] test_constructorMintsToWhoeverDeploys() (gas: 26070)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 40480)\n[PASS] test_hasNoOwner() (gas: 29808)\n[PASS] test_infiniteAllowanceIsNotReduced() (gas: 174054)\n[PASS] test_launchFlowsArriveWhole() (gas: 145587)\n[PASS] test_metadata() (gas: 59036)\n[PASS] test_noBurnFromExists() (gas: 146436)\n[PASS] test_noCallIncreasesSupply() (gas: 687509)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 449811)\n[PASS] test_permitCannotBeReplayed() (gas: 132582)\n[PASS] test_permitRevertsForWrongSigner() (gas: 75492)\n[PASS] test_permitRevertsWhenExpired() (gas: 48436)\n[PASS] test_permitSetsAllowanceAndConsumesNonce() (gas: 109415)\n[PASS] test_permitThenTransferFromMovesTokens() (gas: 210102)\n[PASS] test_rejectsEther() (gas: 36817)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 6067388)\n[PASS] test_supplyIsExactlyOneBillionWithEighteenDecimals() (gas: 26648)\n[PASS] test_transferFromRevertsBeyondAllowance() (gas: 133127)\n[PASS] test_transferFromRevertsBeyondBalanceEvenWithAllowance() (gas: 138748)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 92786)\n[PASS] test_transferMovesExactAmount() (gas: 89406)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 103123)\n[PASS] test_transferRevertsToZeroAddress() (gas: 30857)\n[PASS] test_transferRevertsWhenSenderHoldsNothing() (gas: 33197)\n[PASS] test_transferToSelfKeepsBalance() (gas: 41351)\n[PASS] test_transferZeroAmountSucceeds() (gas: 43316)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 19.21ms (108.49ms CPU time)\n\nRan 1 test suite in 20.02ms (19.21ms CPU time): 39 tests passed, 0 failed, 0 skipped (39 total tests)\n","passed":true},{"durationMs":60,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.burn(uint256)\",\"MADToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":100,\"foundry.toml\":23,\"remappings.txt\":2,\"src/MADToken.sol\":52,\"test/MADToken.t.sol\":506},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1657,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":494,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/MADToken.sol:26: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5b73cab87e57defd43f76869e91ca5e3771b28fb2e462e902399c00852523952","verifiedTreeHash":"d1709ce2be18b6d8ff2319e4d270ce70553dc513","verifierVersion":"0.1.0+a6eb4461"},{"checks":[{"durationMs":2881,"exitCode":0,"name":"build","output":"Compiling 43 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.76s\nCompiler run successful!\n","passed":true},{"durationMs":13458,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 17 tests for test/MADToken.properties.t.sol:MADTokenPropertiesTest\n[PASS] testFuzz_approvalIsIdempotentAndCannotAffectOtherSpenders(uint256,uint256) (runs: 1000, μ: 248236, ~: 248484)\n[PASS] testFuzz_failedTransferFromOverAllowancePreservesState(uint256,uint256,uint256) (runs: 1000, μ: 217714, ~: 219130)\nLogs:\n  Bound result 19532\n  Bound result 9815\n  Bound result 19442\n\n[PASS] testFuzz_failedTransferFromOverBalanceRollsBackAllowance(uint256,uint256,bool) (runs: 1000, μ: 219203, ~: 220056)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913130891595\n\n[PASS] testFuzz_failedTransferFromToZeroRestoresAllowance(uint256,uint256) (runs: 1000, μ: 312316, ~: 312468)\nLogs:\n  Bound result 741218422227223392162189345\n  Bound result 1\n\n[PASS] testFuzz_splittingBurnsHasTheSameEffectAsOneBurn(uint256,uint256,uint256) (runs: 1000, μ: 293392, ~: 294383)\nLogs:\n  Bound result 199202165342687776635612768\n  Bound result 72\n  Bound result 42558760545063\n\n[PASS] testFuzz_transferRoundTripRestoresBalances(uint256,uint256) (runs: 1000, μ: 208968, ~: 209893)\nLogs:\n  Bound result 0\n  Bound result 0\n\n[PASS] test_burningDoesNotChangeAllowancesOrLetSpendersUseDestroyedTokens() (gas: 413869)\n[PASS] test_constructorMintsToCallingContractRatherThanTransactionOrigin() (gas: 211670)\n[PASS] test_delegatedSelfTransferConsumesFiniteAllowance() (gas: 213186)\n[PASS] test_entireSupplyRoundTripThenBurnLastWei() (gas: 502570)\n[PASS] test_infiniteApprovalCanBeRevokedAndMaxMinusOneIsFinite() (gas: 357570)\n[PASS] test_maximumAmountCannotTransferOrBurnEvenWithInfiniteAllowance() (gas: 181716)\n[PASS] test_replacingAndRevokingApprovalImmediatelyLimitsSpending() (gas: 334313)\n[PASS] test_selfTransferStillRequiresEnoughBalance() (gas: 105509)\n[PASS] test_transferFromByOwnerRequiresSelfApproval() (gas: 225360)\n[PASS] test_zeroTransferToZeroAddressStillReverts() (gas: 80341)\n[PASS] test_zeroTransfersFromEmptyAccountsEmitEventsWithoutChangingState() (gas: 137664)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 163.47ms (923.65ms CPU time)\n\nRan 17 tests for test/MADToken.permit.t.sol:MADTokenPermitTest\n[PASS] testFuzz_expiredPermitCannotReplaceExistingAllowance(uint256) (runs: 1000, μ: 128996, ~: 129262)\nLogs:\n  Bound result 997914\n\n[PASS] testFuzz_futureNonceCannotSkipAuthorization(uint256) (runs: 1000, μ: 169072, ~: 169071)\nLogs:\n  Bound result 27052930251231761938311188817247140503016405804756067741843465004618528\n\n[PASS] testFuzz_invalidVPreservesNonceAndAllowance(uint8) (runs: 1000, μ: 154504, ~: 154439)\nLogs:\n  Bound result 26\n\n[PASS] testFuzz_permitBindsOwnerSpenderValueAndDeadline(uint256,uint8) (runs: 1000, μ: 207676, ~: 208488)\n[PASS] testFuzz_validPermitAuthorizesExactlyTheSignedAmount(uint256,uint256) (runs: 1000, μ: 298340, ~: 299677)\nLogs:\n  Bound result 4823\n\n[PASS] test_chainChangeInvalidatesOldDomainAndAcceptsNewDomain() (gas: 339688)\n[PASS] test_domainAndIntrospectionMatchTheSpecifiedToken() (gas: 26022)\n[PASS] test_emptySignatureForFundedOwnerPreservesExistingAllowance() (gas: 144063)\n[PASS] test_malleableHighSSignatureIsRejectedWithoutConsumingNonce() (gas: 162328)\n[PASS] test_maximumPermitCanBeSpentRepeatedlyThenRevokedWithZeroPermit() (gas: 420027)\n[PASS] test_nonceIsSharedAcrossSpenders() (gas: 240910)\n[PASS] test_permitAcceptsDeadlineEqualityAndEmitsApproval() (gas: 162927)\n[PASS] test_permitExpiresOneSecondAfterDeadline() (gas: 125711)\n[PASS] test_replayCannotRestoreASpentAndRevokedAllowance() (gas: 269533)\n[PASS] test_signatureCannotBeUsedOnAnotherToken() (gas: 346067)\n[PASS] test_zeroOwnerAndEmptySignatureCannotAuthorizeAnything() (gas: 167118)\n[PASS] test_zeroSpenderRollsBackNonceAfterValidSignatureRecovery() (gas: 314548)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 163.52ms (794.82ms CPU time)\n\nRan 39 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_burnReducesSupplyByExactlyTheAmount(uint256,uint256) (runs: 256, μ: 144877, ~: 145076)\nLogs:\n  Bound result 42\n  Bound result 33\n\n[PASS] testFuzz_transferBeyondBalanceReverts(uint256,uint256) (runs: 256, μ: 93114, ~: 93303)\nLogs:\n  Bound result 42\n  Bound result 48879\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 100961, ~: 101129)\nLogs:\n  Bound result 10000000000000000000\n\n[PASS] testFuzz_transferFromSpendsExactlyTheAllowance(uint256,uint256) (runs: 256, μ: 147017, ~: 147197)\nLogs:\n  Bound result 42\n  Bound result 33\n\n[PASS] test_approveAndTransferFrom() (gas: 216797)\n[PASS] test_approveRevertsForZeroSpender() (gas: 30804)\n[PASS] test_burnByHolderWithNothingReverts() (gas: 32816)\n[PASS] test_burnOnlyTouchesTheCaller() (gas: 160167)\n[PASS] test_burnReducesHolderBalanceAndSupply() (gas: 116229)\n[PASS] test_burnRevertsBeyondBalance() (gas: 101697)\n[PASS] test_burnRevertsOnZero() (gas: 35840)\n[PASS] test_burnWholeBalance() (gas: 107393)\n[PASS] test_constructorEmitsMintEvents() (gas: 7737)\n[PASS] test_constructorMintsToWhoeverDeploys() (gas: 26070)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 40480)\n[PASS] test_hasNoOwner() (gas: 29808)\n[PASS] test_infiniteAllowanceIsNotReduced() (gas: 174054)\n[PASS] test_launchFlowsArriveWhole() (gas: 145587)\n[PASS] test_metadata() (gas: 59036)\n[PASS] test_noBurnFromExists() (gas: 146436)\n[PASS] test_noCallIncreasesSupply() (gas: 687509)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 449811)\n[PASS] test_permitCannotBeReplayed() (gas: 132582)\n[PASS] test_permitRevertsForWrongSigner() (gas: 75492)\n[PASS] test_permitRevertsWhenExpired() (gas: 48436)\n[PASS] test_permitSetsAllowanceAndConsumesNonce() (gas: 109415)\n[PASS] test_permitThenTransferFromMovesTokens() (gas: 210102)\n[PASS] test_rejectsEther() (gas: 36817)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 6067388)\n[PASS] test_supplyIsExactlyOneBillionWithEighteenDecimals() (gas: 26648)\n[PASS] test_transferFromRevertsBeyondAllowance() (gas: 133127)\n[PASS] test_transferFromRevertsBeyondBalanceEvenWithAllowance() (gas: 138748)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 92786)\n[PASS] test_transferMovesExactAmount() (gas: 89406)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 103123)\n[PASS] test_transferRevertsToZeroAddress() (gas: 30857)\n[PASS] test_transferRevertsWhenSenderHoldsNothing() (gas: 33197)\n[PASS] test_transferToSelfKeepsBalance() (gas: 41351)\n[PASS] test_transferZeroAmountSucceeds() (gas: 43316)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 163.60ms (208.70ms CPU time)\n\nRan 2 tests for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS]\nMADTokenInvariantTest invariants:\n[PASS] invariant_allowancesAndNoncesMatchAuthorizations\n[PASS] invariant_balancesMatchAuthorizedActions\n[PASS] invariant_supplyEqualsBalancesAndOnlyBurnsReduceIt\n MADTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-----------------+---------------------------+-------+---------+----------╮\n| Contract        | Selector                  | Calls | Reverts | Discards |\n+==========================================================================+\n| MADTokenHandler | approve                   | 3323  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| MADTokenHandler | burn                      | 3382  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| MADTokenHandler | permit                    | 3271  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| MADTokenHandler | rejectBurnOverBalance     | 3241  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| MADTokenHandler | rejectPermit              | 3241  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| MADTokenHandler | rejectPrivilegedCall      | 3200  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| MADTokenHandler | rejectTransferFrom        | 3207  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| MADTokenHandler | rejectTransferOverBalance | 3256  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| MADTokenHandler | transfer                  | 3316  | 0       | 0        |\n|-----------------+---------------------------+-------+---------+----------|\n| MADTokenHandler | transferFrom              | 3331  | 0       | 0        |\n╰-----------------+---------------------------+-------+---------+----------╯\n\n[PASS] test_handlerExercisesMixedSequenceAndCompleteBurn() (gas: 2790146)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 13.30s (13.30s CPU time)\n\nRan 4 test suites in 13.30s (13.79s CPU time): 75 tests passed, 0 failed, 0 skipped (75 total tests)\n","passed":true},{"durationMs":76,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.burn(uint256)\",\"MADToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":100,\"foundry.toml\":23,\"remappings.txt\":2,\"src/MADToken.sol\":52,\"test/MADToken.invariant.t.sol\":352,\"test/MADToken.permit.t.sol\":342,\"test/MADToken.properties.t.sol\":343,\"test/MADToken.t.sol\":506,\"test/README.md\":56},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9435c383903fa6ea103dc918fe48130e2d6f255f3e2a1c6ea0a7191ea4419b12","verifiedTreeHash":"0b75f2cee0520e19a620f96d6932941fa2ece126","verifierVersion":"0.1.0+a6eb4461"}]}