{"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":"594a2866-0408-49b3-9f01-4cd8f6308ad9","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"3a33866a7eca6ce34f4ae16fec250a3cbca1520a5a63a88eac2dae1b60e2662c","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":"50129219b529ad6dfc05832b2a4e031d24fa2cd597a40f9c8c6eb6bd14bdb011","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":"dbbb103ed70adcf3820c8451febf1d15110e816c53ee3d35c710cd425c4f65a9","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":"54548c5d0fff35c548a157a171c0626cffd4ee7359c7189cdc97a3401e6bfcba","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":"5b39612e9b118381bb3f0622b8fb091e4a156662b36dc0aa71debbde255b4f90","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":"982724b7be2727fc974ae06ba023c2d04fc94dcd9dcf6bc1b5abaf0dff0ef7b1","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":"3f9de785dbcfa92471c9a5625353d282cfdd65560a7ec345516634b68cc50e52","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"25b8031a19406e1531f2897adf252bba640b324bee19e90e62725898c822ab3f","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":"9f9fe8b7783001d85eae53c8f0cdc46bbbdcee3c2fe40b247c6575eca2ae6465","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"594a2866-0408-49b3-9f01-4cd8f6308ad9","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2473-mutually-assured-destruction"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52179","feedbackHash":"e6880b12898ea09f0b9273066bf4e514dcf73aadd2fbbd480749d948ad6eec30","nodeKey":"audit_economics","submissionHash":"3a33866a7eca6ce34f4ae16fec250a3cbca1520a5a63a88eac2dae1b60e2662c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52603","feedbackHash":"83279d7cb789ba0beb72e770eeb4f32ceffe1e33bffbae663e0596847161c4cf","nodeKey":"audit_flow","submissionHash":"50129219b529ad6dfc05832b2a4e031d24fa2cd597a40f9c8c6eb6bd14bdb011","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51352","feedbackHash":"bf11b1af3ce2e16ae76f526f7ccf96f199e4afc732fcd68dec0fad6362a482a0","nodeKey":"audit_judge","submissionHash":"dbbb103ed70adcf3820c8451febf1d15110e816c53ee3d35c710cd425c4f65a9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51482","feedbackHash":"6de3985bf2848a97276f2d1b0770128bb206eb7514aa6423cf8381ed0f384e69","nodeKey":"audit_math","submissionHash":"54548c5d0fff35c548a157a171c0626cffd4ee7359c7189cdc97a3401e6bfcba","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51340","feedbackHash":"407aed06359a5ed7cfb54c3983fe6b7b796150e668a012017e8d71766da2c851","nodeKey":"audit_permissions","submissionHash":"5b39612e9b118381bb3f0622b8fb091e4a156662b36dc0aa71debbde255b4f90","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51881","feedbackHash":"c8d9ac1242f66e696b76315244aacf2e2e90143b7a75022c82906ac888769f91","nodeKey":"build_contract_project","submissionHash":"982724b7be2727fc974ae06ba023c2d04fc94dcd9dcf6bc1b5abaf0dff0ef7b1","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51883","feedbackHash":"b46e8c2632be8f26a166ba2a828645931a9595cd73fafe2b1b68caf5a6658763","nodeKey":"manifest","submissionHash":"3f9de785dbcfa92471c9a5625353d282cfdd65560a7ec345516634b68cc50e52","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52287","feedbackHash":"5c0807f4cb3602a10a50609a22faae2dc1ae77ba6d88e7593bf46bdaf189f87f","nodeKey":"write_foundry_tests","submissionHash":"25b8031a19406e1531f2897adf252bba640b324bee19e90e62725898c822ab3f","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"4ae0d46a804be7fda730c906c722aa73287355e8c2c97698708e3c40365768d7","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"d513f451bffad4e7c3d974377959896d03b35e8a5015dda072cebc4397008ce6","device":"99c6d0bcc495ad61","findings":[],"hash":"25b8031a19406e1531f2897adf252bba640b324bee19e90e62725898c822ab3f","nodeId":"f077aaf7-6fca-4068-9290-10bcec9ee4b6","outcome":"completed","summary":"I added two test files, `test/MADToken.invariant.t.sol` and `test/MADToken.edge.t.sol`. The existing `test/MADToken.t.sol` is unchanged. `forge build` and `forge test` pass with the verifier's fuzz seed: 54 tests in 3 suites, none failing or skipped.\n\n**What the token is:** a plain OpenZeppelin v5.1.0 ERC20. Its name is \"Mutually Assured Destruction\", its symbol is \"MAD\", and it has 18 decimals. The constructor mints 1,000,000,000 MAD once to the deployer. There is no owner, no admin function, no fee and no further minting.\n\n**Invariant suite** (`MADHandler` driving 5 actors; 256 runs × 64 calls, set inline in the test file):\n- The handler makes the normal calls: transfer, approve (finite or unlimited) and transferFrom, with amounts bounded to what is actually held and allowed.\n- It also makes calls that must fail: spending more than the balance or the allowance, sending to the zero address, approving the zero address as spender, and calling functions that don't exist. Each must revert with the exact OpenZeppelin error and change nothing. Every handler call is required to succeed (`fail-on-revert = true`).\n- After every call sequence, these hold:\n  - the supply never changes;\n  - the actors' balances add up to the total supply;\n  - balances and allowances match an independent model kept by the test;\n  - no spender pulls more than it was ever approved for (unless it was given an unlimited allowance);\n  - name, symbol and decimals never change, and the contract holds no ETH.\n- All 16,384 calls ran with 0 reverts, and every handler function was hit about 1,400–3,000 times.\n\n**Edge and failure-path tests:**\n- **Launch split:** deploying the token and paying out the 10% / 80% / 10% split in a single transaction leaves exact balances.\n- **Deployment:** the constructor emits exactly one Transfer event, and two deployments are independent.\n- **Transfers:** one wei, `type(uint256).max`, a transfer of 0 to the zero address (still reverts), sending to yourself more than you hold, and sending to the token contract (the tokens are not burned). A failed transfer leaves all state unchanged.\n- **Approvals:**\n  - approving again replaces the old amount rather than adding to it, and approving 0 revokes;\n  - an approval larger than the balance still can't overdraw, and the failed attempt doesn't use up the allowance;\n  - an allowance of max − 1 still goes down when spent;\n  - spending your own tokens through transferFrom still needs an allowance;\n  - transferFrom to the zero address, or from the zero address, reverts;\n  - allowances are per spender and one-directional;\n  - transferFrom emits no Approval event.\n- **Fuzz tests** (1,000 runs each): a stranger can't pull tokens without an allowance; approve sets the exact amount; transferFrom keeps the supply constant and lowers the allowance; spending more than the balance reverts even with an unlimited allowance; random calldata to non-existent functions reverts.\n\n**Findings:** none. I found no defect in `src/MADToken.sol`, so I didn't write `.imd-findings.json`. I haven't committed anything.","treeHash":"836d385eba336ed3ff1a57a344da319487ae0e33","usage":{"cachedInputTokens":296602,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":14184,"runtime":"claude","turns":7,"wallClockMs":154184}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"02f22d6f13810ca8","findings":[],"hash":"3a33866a7eca6ce34f4ae16fec250a3cbca1520a5a63a88eac2dae1b60e2662c","nodeId":"135cf562-8c31-4545-88a8-8ed87b4e5bdf","outcome":"completed","summary":"The review is complete. The findings file at `.imd-findings.json` reports no defects and ten coverage rows, and the working tree is otherwise untouched.\n\n**Result: no economic, invariant or flow-gap defect found in the MAD token.**\n\nWhat I checked, in the assigned area:\n\n- **Economic Security.** The token has no external dependency, oracle, callback, fee, rebase, pause or blocklist. Approving the max value and pulling the whole supply in one transferFrom succeeds. Zero-address paths revert. There is no price-dependent operation or capped shared accounting to drain.\n- **Invariants.** A stateful fuzz run over six actors with random transfer, approve and transferFrom calls never changed the supply from 1e27 and never broke the sum-of-balances equality. The only mint is in the constructor. The compiled ABI exposes no mint, burn, owner, receive or fallback, and an opcode walk of the runtime found no CALL, DELEGATECALL, CREATE or SELFDESTRUCT.\n- **Flow Gap.** I replayed the launch flows with a factory-like CREATE2 deployer, a distributor, a claimant, a pool-manager stand-in that measures balance deltas the way Uniswap v4 settle does, and a trader. Every flow delivered exactly the requested amount, so the swarm share, the seed and buys and sells cannot arrive short.\n- **Vendored library.** All five OpenZeppelin files under lib are byte-identical to upstream v5.1.0, so the inherited ERC-20 logic is the audited original.\n- **Static-analysis lead.** The aderyn large-literal note on line 24 evaluates to exactly 1,000,000,000 with 18 decimals, confirmed by the project's tests. Not a defect.\n\nEach of the three listed entry points, approve, transfer and transferFrom, has a `holds` row. The project's own 27 tests pass with the verifier's fuzz seed. The standard ERC-20 approve race is recorded in the approve row as an inherent design property, not a finding. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":598985,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":13160,"runtime":"claude","turns":25,"wallClockMs":197339}},{"artifacts":[],"attempt":1,"bundleHash":"607c5626b444ec7f8f5d58271c75b51a072153d5824c2ca4a71d27486b61b104","device":"707624586655cf74","findings":[],"hash":"3f9de785dbcfa92471c9a5625353d282cfdd65560a7ec345516634b68cc50e52","nodeId":"3bb6951b-8293-4f8d-9cdf-8b344a1d3811","outcome":"completed","summary":"Done. I wrote `launch.json` for the Mutually Assured Destruction (MAD) launch and verified it against the accepted tree.\n\n**What the manifest says**\n\n- Kind is `custom_token`. The token contract is MADToken, with name \"Mutually Assured Destruction\", symbol MAD, and 18 decimals.\n- The constructor takes no arguments, so constructorArgs is an empty list. The compiled ABI confirms the constructor has no inputs.\n- totalSupply is one billion tokens in minor units, matching the TOTAL_SUPPLY constant the constructor mints to msg.sender.\n- The contracts list is empty. The accepted tree contains only the token, so there are no application contracts to name.\n- pool and economics are copied exactly from the launch reference: IMD as the paired currency, fee 12500, tick spacing 60, the one-to-one initialPrice, and the requester's economics object verbatim.\n- Notes describe the token's plain ERC-20 behaviour, the absence of owner or privileged calls, and why no launch placeholders are needed. They are well under the 4000 character limit.\n\n**Verification**\n\n- `forge build` compiled cleanly with solc 0.8.26.\n- `forge test` with the verifier's fuzz seed passed all 27 tests.\n- The manifest parses as JSON with only the six schema keys.\n- `git status` shows launch.json as the only new or changed file.","treeHash":"49ed889659e36d0c46685b5e47c1e1afe91a8d2f","usage":{"cachedInputTokens":188827,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3159,"runtime":"claude","turns":11,"wallClockMs":69123}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7e64d4917fa814e6","findings":[],"hash":"50129219b529ad6dfc05832b2a4e031d24fa2cd597a40f9c8c6eb6bd14bdb011","nodeId":"09a93758-6cd5-4228-a2b3-ad862df2693b","outcome":"completed","summary":"Review complete. No defects found, and the findings file is written with an empty list and full coverage.\n\n**What I checked, in my area (Execution Trace, Periphery, First Principles)**\n\n- **Execution trace of all three entry points.** The token is OpenZeppelin v5.1.0 `ERC20` with nothing overridden. I traced transfer, approve and transferFrom through the balance, allowance and zero-address guards, including zero value, self-transfer, whole balance, one wei over balance, infinite allowance, and allowance residuals. Every path moves exactly the requested amount or reverts. Supply never changes after the constructor.\n- **Periphery.** The vendored OpenZeppelin subset is byte-identical to upstream v5.1.0, confirmed by diffing the five files against the tagged release. The Context base returns plain `msg.sender`, so there is no forwarder path.\n- **First principles.** The supply constant evaluates to exactly the manifest figure of 1e27 minor units. The aderyn \"large numeric literal\" lead is a compile-time constant and not a defect. The compiled ABI exposes only approve, transfer and transferFrom as state-changing functions, no receive or fallback, no mint, burn, owner or initializer. The project's reachable-opcode test for DELEGATECALL, CALLCODE and SELFDESTRUCT passes.\n- **Launch flows.** A scratch test deployed the token via CREATE2 from a factory-like contract, moved the swarm share to a distributor, claimed it, and spent via a contract spender. All balances matched and supply was unchanged. The scratch file was removed afterwards.\n\n**Not reached.** The seed and swap through a real Uniswap v4 PoolManager were not run locally because v4-core is not vendored. The token has no transfer hook, so no caller can be treated differently, and the coverage row says so.\n\n**Output.** The file `.imd-findings.json` holds zero findings and seven coverage rows, one per listed entry point plus the constructor, periphery, runtime and launch-flow invariants. The working tree is otherwise unchanged.","treeHash":null,"usage":{"cachedInputTokens":529767,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":9459,"runtime":"claude","turns":25,"wallClockMs":132302}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dedd4428da8fa41e","findings":[],"hash":"54548c5d0fff35c548a157a171c0626cffd4ee7359c7189cdc97a3401e6bfcba","nodeId":"17f18fb2-1a7e-4b1d-aeb7-bde3bb017391","outcome":"completed","summary":"I found no math defects in `MADToken`, and I've written an empty findings list with full coverage to `.imd-findings.json`. I checked this by reading the code; I wrote no Foundry tests and changed no project files.\n\n`src/MADToken.sol` is a plain OpenZeppelin ERC20. Its constructor mints `TOTAL_SUPPLY = 1_000_000_000 * 10 ** 18` (exactly 1e27) to the deployer once. There is no fee, burn, tax or custom arithmetic, so the precision, boundary and numerical-gap guides apply only to OpenZeppelin's own logic.\n\nCoverage, all marked `holds`:\n- **`transfer`:** subtracting from the sender's balance is checked and reverts if the balance is too low. The unchecked addition to the receiver can't overflow, because no balance can exceed the fixed supply of 1e27, far below 2^256.\n- **`transferFrom`:** the allowance is checked before the unchecked subtraction. A maximum (`type(uint256).max`) allowance is never reduced, which is the intended \"unlimited\" behaviour. The balance math is the same as `transfer`.\n- **`approve`:** it does no arithmetic.\n- **Fixed supply:** total supply stays at 1e27 forever, since the constructor is the only place tokens are minted and nothing can mint or burn after that.\n\nThe only static-analysis lead was aderyn's \"large numeric literal\" at line 24. That's cosmetic: the value is computed exactly, so I left it out.","treeHash":null,"usage":{"cachedInputTokens":95504,"inputTokens":6,"model":"claude-opus-5-5","outputTokens":1093,"runtime":"claude","turns":3,"wallClockMs":14990}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3b260b68e9ad6a37","findings":[{"citation":"resolved","description":"MADToken inherits OpenZeppelin v5.1.0 ERC20 unchanged (vendored files hash-identical to upstream). Its approve(spender,value) overwrites the allowance rather than adjusting it, and OZ v5 deliberately ships no increaseAllowance/decreaseAllowance. A spender who observes a holder's pending approve() that lowers their allowance can spend the old allowance first and then the new one. This is the well-known ERC-20 approve race, inherent to the standard and to every plain ERC-20; it is recorded here as a trust assumption for holders who grant allowances (asymmetry between approve, which sets, and _spendAllowance, which subtracts), not as a defect requiring a change. No fix is recommended: adding increase/decrease helpers would change the agreed design and the launch flows (factory, PoolManager, distributor) use direct transfer, not allowances. Holders should set an allowance to 0 before setting a new non-zero value, or approve exact amounts.","line":13,"path":"src/MADToken.sol","reproduction":"State: alice holds 150e18 MAD. 1) alice.approve(bob, 100e18). 2) alice broadcasts approve(bob, 50e18) intending to reduce. 3) bob front-runs with transferFrom(alice, bob, 100e18) -> succeeds, allowance 0. 4) alice's approve(bob, 50e18) lands -> allowance 50e18. 5) bob.transferFrom(alice, bob, 50e18) -> succeeds. Actual: bob received 150e18; alice intended bob to be able to take at most 50e18 after the reduction. Verified in a scratch Foundry test (test_approveReductionRace) against this tree: passes, i.e. the sequence executes exactly as described.","severity":"info","snippet":"contract MADToken is ERC20 {","title":"Inherited ERC-20 approve is set-not-delta: a spender can front-run an allowance reduction (standard ERC-20 property, not a code defect)"}],"hash":"5b39612e9b118381bb3f0622b8fb091e4a156662b36dc0aa71debbde255b4f90","nodeId":"13aef4e3-9e42-497d-9fb2-ab066a0ecb9f","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root. The working tree is otherwise unchanged (the findings file is gitignored, and my scratch test was removed).\n\n**Result: no defects in the Access Control, Trust Gap or Asymmetry area.** The token is a 30-line wrapper over an unmodified OpenZeppelin v5.1.0 `ERC20` that mints 1e27 units to `msg.sender` in its constructor and adds nothing else.\n\nWhat I verified, with evidence:\n\n- **Permission model is empty by construction.** The compiled ABI has exactly three non-view functions: `approve`, `transfer`, `transferFrom`. There is no owner, role, initializer, proxy, mint, burn, pause, blocklist or rescue path. A fuzz over arbitrary selectors from arbitrary callers never changed supply or any balance.\n- **Deployer has no power over holders.** The factory, which receives the whole supply, cannot `transferFrom` a holder without an allowance and cannot write another account's allowance row.\n- **Paired entry points are symmetric.** `transfer` and `transferFrom` move identical amounts through the same `_update`; supply is conserved under 2000-run fuzzing.\n- **Vendored library is genuine.** All five vendored OpenZeppelin files hash byte-for-byte to the upstream v5.1.0 tag I fetched from GitHub. No assembly, delegatecall, selfdestruct or external calls exist in the source or the library.\n- **Build and tests pass.** 27 of 27 project tests pass under the verifier's fuzz seed, and my 5 scratch tests passed before I deleted them.\n\nOne info-level note is recorded: the inherited ERC-20 `approve` is set-not-delta, so a spender can front-run an allowance reduction and spend old plus new. This is the standard ERC-20 approve race, a holder trust assumption rather than a code defect, and I recommend no change since adding increase/decrease helpers would alter the agreed design.\n\nThe coverage record answers all three listed entry points as `holds`, plus six invariant rows covering the constructor, admin surface, opcode safety, library integrity, the deploy script and the Trust Gap seams. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":840311,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":14022,"runtime":"claude","turns":25,"wallClockMs":271088}},{"artifacts":[],"attempt":1,"bundleHash":"ed149d326b322f934f99165ba2ac4a5daac06f3a4164cf1cf42c72795d5c0ec3","device":"1a7ecd03bd365366","findings":[],"hash":"982724b7be2727fc974ae06ba023c2d04fc94dcd9dcf6bc1b5abaf0dff0ef7b1","nodeId":"c4220ad0-e823-467c-971b-02861f7d670b","outcome":"completed","summary":"The deliverable is complete and verified. Nothing further is needed from the requester.\n\n**What was built**\n\n- `src/MADToken.sol`: a fixed-supply ERC-20 on OpenZeppelin v5.1.0. Name \"Mutually Assured Destruction\", symbol MAD, 18 decimals, 1,000,000,000 tokens minted once to the constructor caller. The contract takes no constructor arguments, has no owner, no mint path, no pause or blocklist, and no transfer fee, so every launch flow moves exactly what it says.\n- `test/MADToken.t.sol`: 27 tests covering metadata, supply landing on the deployer (including when a contract deploys it, as the factory will), transfer and allowance success paths, revert paths with exact custom errors, absence of 22 admin selectors, ETH refusal, the same reachable-opcode walk the protected floor runs, and four fuzz tests on supply conservation and allowance bounds.\n- `script/DeployMADToken.s.sol`: a reviewable helper whose `deploy()` function the tests call directly. Launch deployment itself is IMD's.\n- `README.md`: assumptions, manifest values, operational responsibilities, security notes, and an \"After launch\" section stating there is nothing to configure.\n- `foundry.toml` pins solc 0.8.26 with `bytecode_hash = \"none\"`, metadata disabled, ffi off, no fs permissions. Dependencies are vendored as plain files under `lib/` with no git directories or submodules: forge-std v1.9.7 and the five OpenZeppelin files the token needs.\n\n**Verification**\n\n| Check | Result |\n|-------|--------|\n| `forge build --offline` | clean, 28 files |\n| `forge test --offline` with the verifier's fuzz seed | 27 passed, 0 failed |\n| `forge fmt --check` | clean |\n| Runtime bytecode tail | ends in code, no CBOR metadata |\n| ABI surface | standard ERC-20 plus four public constants only |\n\n**Notes**\n\n- The `??` entries git shows for dotfiles such as `.gitmodules` and `.bashrc` are pre-existing device nodes in the workspace, not files I created.\n- Slither and Mythril are not on this machine and did not run.\n- I did not commit, since `.git/` is off limits. All deliverables are in the working tree under `src/`, `test/`, `script/`, `lib/`, `foundry.toml`, `remappings.txt`, `README.md` and `.gitignore`.","treeHash":"8691669056d0bdfbd34549f30ca674314c635a58","usage":{"cachedInputTokens":504442,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":15842,"runtime":"claude","turns":18,"wallClockMs":214754}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8f08088e7a7f557f","findings":[{"citation":"resolved","description":"MADToken inherits OpenZeppelin Contracts v5.1.0 ERC20 unchanged (the vendored ERC20.sol, IERC20.sol, IERC20Metadata.sol, Context.sol and draft-IERC6093.sol carry the v5.1.0/v5.0.1 headers and match upstream line for line). approve(spender, value) overwrites the stored allowance; _spendAllowance subtracts from it. A spender who sees a holder's pending approve() that lowers an allowance can spend the old allowance first and then the new one. This is the well-known ERC-20 approve race, inherent to the standard and present in every plain ERC-20; OZ v5 deliberately ships no increaseAllowance/decreaseAllowance. It is recorded as a trust assumption for holders who grant allowances, not as a defect: the launch flows (factory to distributor, seed through the PoolManager, claims, buys and sells) use direct transfer and are unaffected, and no fix is recommended since the requester asked for a plain fixed-supply token. Holders who want to lower a live allowance should set it to 0 first, or approve exact amounts. Merged from audit_permissions (the only specialist finding); audit_flow, audit_economics, audit_math and the independent test writer reported nothing, and nothing else reproduced in my own pass.","line":13,"path":"src/MADToken.sol","reproduction":"State: fresh MADToken deployed by this test; deployer transfers 150e18 MAD to alice; bob holds 0. Steps: (1) vm.prank(alice); token.approve(bob, 100e18) -> allowance(alice,bob) == 100e18. (2) alice intends to reduce to 50e18 and broadcasts approve(bob, 50e18). (3) bob front-runs: vm.prank(bob); token.transferFrom(alice, bob, 100e18) -> succeeds, allowance(alice,bob) == 0, balanceOf(bob) == 100e18. (4) alice's approve(bob, 50e18) lands -> allowance(alice,bob) == 50e18. (5) vm.prank(bob); token.transferFrom(alice, bob, 50e18) -> succeeds. Expected by alice: bob can take at most 50e18 after the reduction. Actual: balanceOf(bob) == 150e18, balanceOf(alice) == 0. Verified in a scratch Foundry test (test_approveReductionRace) against this tree: every call in the sequence succeeds and the final balances are exactly as stated.","severity":"info","snippet":"contract MADToken is ERC20 {","title":"Inherited ERC-20 approve sets rather than adjusts the allowance, so a spender can front-run a reduction (standard ERC-20 property, trust assumption, no change required)"}],"hash":"dbbb103ed70adcf3820c8451febf1d15110e816c53ee3d35c710cd425c4f65a9","nodeId":"60acb787-c068-4a6a-ac93-773f9161211d","outcome":"completed","summary":"Review complete. The findings file is written and the tree holds no other change.\n\n**Outcome:** no defect in MADToken. The token is an unchanged OpenZeppelin v5.1.0 ERC20 with one constructor mint of 1e27 units to msg.sender, no owner, no fee, no mint path, no receive or fallback, and no DELEGATECALL or SELFDESTRUCT in the runtime. The vendored library files match upstream line for line, and the project's own 54 unit, fuzz and invariant tests pass.\n\n**The one specialist finding** was reproduced and kept at info severity. The audit_permissions reviewer reported the standard ERC-20 approve race, where a spender front-runs an allowance reduction. I reran the exact sequence in a scratch test and bob ends with all 150e18 tokens as described. It is a property of the standard, not a code defect, so it is recorded as a trust assumption with no fix recommended. The other three specialists and the independent tester reported nothing, so there was nothing to merge.\n\n**My own pass** found nothing further. I checked the deployment model against the factory's rules: the constructor takes no arguments, matching the manifest's empty constructorArgs, and the creation and runtime code sizes are well under the limits. The manifest's keys, lowercase addresses, supply and decimals all agree with the code. The aderyn lint on the large numeric literal is style only. The value evaluates exactly to the manifest supply.\n\n**Coverage** answers all three entry points, plus three invariant rows covering fixed supply, deployability and the static-analysis lead.","treeHash":null,"usage":{"cachedInputTokens":739665,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":9602,"runtime":"claude","turns":19,"wallClockMs":168881}}],"verification":[{"checks":[{"durationMs":1913,"exitCode":0,"name":"build","output":"Compiling 30 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.82s\nCompiler run successful!\n","passed":true},{"durationMs":13925,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 27 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_chainedTransfersConserveSupply(uint256,uint256) (runs: 256, μ: 174722, ~: 177132)\nLogs:\n  Bound result 77279033225416120098479701\n  Bound result 602264885\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99564, ~: 99822)\nLogs:\n  Bound result 77279033225416120098479701\n  Bound result 115792089237316195423570985008687907853269984665640486760424358591793633425119\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 97865, ~: 97955)\nLogs:\n  Bound result 134331529116345028972745369\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 125957, ~: 102995)\nLogs:\n  Bound result 77279033225416120098479701\n  Bound result 602264885\n\n[PASS] test_approveAndTransferFrom() (gas: 171876)\n[PASS] test_approveZeroSpenderReverts() (gas: 32949)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8102)\n[PASS] test_deployScriptFunctionDeploysTheSameToken() (gas: 1543316)\n[PASS] test_deployerHasNoSpecialPowerOverHolders() (gas: 98229)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 123403)\n[PASS] test_metadata() (gas: 80739)\n[PASS] test_noAdminFunctionsExist() (gas: 1226422)\n[PASS] test_plainEtherIsRefused() (gas: 39403)\n[PASS] test_runtimeHasNoDelegatecallOrSelfdestruct() (gas: 3060867)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 29407)\n[PASS] test_supplyMintedToConstructorCallerWhenDeployedByAContract() (gas: 140985)\n[PASS] test_transferFromOverAllowanceReverts() (gas: 87968)\n[PASS] test_transferFromOverBalanceRevertsEvenWithAllowance() (gas: 93623)\n[PASS] test_transferFromWithoutAllowanceReverts() (gas: 40486)\n[PASS] test_transferMovesExactAmount() (gas: 96019)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 37929)\n[PASS] test_transferRevertsOneWeiOverBalance() (gas: 38120)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43946)\n[PASS] test_transferToZeroAddressReverts() (gas: 32964)\n[PASS] test_transferWholeBalance() (gas: 78450)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47854)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 33928)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 35.12ms (145.65ms CPU time)\n\nRan 26 tests for test/MADToken.edge.t.sol:MADTokenEdgeTest\n[PASS] testFuzz_approveSetsExactAllowance(address,uint256) (runs: 1000, μ: 63718, ~: 64142)\n[PASS] testFuzz_strangerCannotPullWithoutAllowance(address,uint256) (runs: 1000, μ: 51869, ~: 51691)\nLogs:\n  Bound result 1000000000000000000000000000\n\n[PASS] testFuzz_transferFromAboveBalanceRevertsWithInfiniteAllowance(uint256,uint256) (runs: 1000, μ: 157534, ~: 158308)\nLogs:\n  Bound result 3858947844\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007909270693221\n\n[PASS] testFuzz_transferFromConservesAndDecrements(uint256,uint256,uint256) (runs: 1000, μ: 210011, ~: 211135)\nLogs:\n  Bound result 859\n  Bound result 254\n  Bound result 243\n\n[PASS] testFuzz_unknownCalldataReverts(bytes,address) (runs: 1000, μ: 50812, ~: 50550)\n[PASS] test_allowanceIsDirectional() (gas: 65234)\n[PASS] test_allowanceIsPerSpender() (gas: 110447)\n[PASS] test_allowanceSpentExactlyToZero() (gas: 159192)\n[PASS] test_approveMoreThanBalanceIsAllowedButCannotOverdraw() (gas: 114638)\n[PASS] test_approveOverwritesRatherThanAdds() (gas: 95582)\n[PASS] test_approveZeroRevokes() (gas: 113542)\n[PASS] test_constructorEmitsExactlyOneEvent() (gas: 11123)\n[PASS] test_failedTransferLeavesStateUntouched() (gas: 121286)\n[PASS] test_launchSplitInOneTransactionArrivesExactly() (gas: 241626)\n[PASS] test_maxMinusOneAllowanceIsDecremented() (gas: 126922)\n[PASS] test_selfSpendStillNeedsAllowance() (gas: 38440)\n[PASS] test_selfTransferOverBalanceReverts() (gas: 97698)\n[PASS] test_transferFromDoesNotEmitApproval() (gas: 123335)\n[PASS] test_transferFromToZeroRevertsAndKeepsAllowance() (gas: 108640)\n[PASS] test_transferFromZeroAddressOwnerReverts() (gas: 38130)\n[PASS] test_transferMaxUintReverts() (gas: 38169)\n[PASS] test_transferOneWei() (gas: 83174)\n[PASS] test_transferToTokenContractIsJustABalance() (gas: 78586)\n[PASS] test_transferZeroEmitsEvent() (gas: 43777)\n[PASS] test_transferZeroToZeroAddressStillReverts() (gas: 32888)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 63241)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 40.09ms (179.36ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS]\nMADTokenInvariantTest invariants:\n[PASS] invariant_actorBalancesSumToSupply\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_balancesMatchModel\n[PASS] invariant_metadataIsFixed\n[PASS] invariant_spendersNeverPullMoreThanApproved\n[PASS] invariant_supplyNeverChanges\n MADTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭------------+---------------------------+-------+---------+----------╮\n| Contract   | Selector                  | Calls | Reverts | Discards |\n+=====================================================================+\n| MADHandler | approve                   | 1452  | 0       | 0        |\n|------------+---------------------------+-------+---------+----------|\n| MADHandler | approveZeroSpender        | 1520  | 0       | 0        |\n|------------+---------------------------+-------+---------+----------|\n| MADHandler | callUnknownSelector       | 1538  | 0       | 0        |\n|------------+---------------------------+-------+---------+----------|\n| MADHandler | transfer                  | 2973  | 0       | 0        |\n|------------+---------------------------+-------+---------+----------|\n| MADHandler | transferFrom              | 1461  | 0       | 0        |\n|------------+---------------------------+-------+---------+----------|\n| MADHandler | transferFromOverAllowance | 1479  | 0       | 0        |\n|------------+---------------------------+-------+---------+----------|\n| MADHandler | transferFromOverBalance   | 1471  | 0       | 0        |\n|------------+---------------------------+-------+---------+----------|\n| MADHandler | transferFromToZero        | 1433  | 0       | 0        |\n|------------+---------------------------+-------+---------+----------|\n| MADHandler | transferOverBalance       | 1483  | 0       | 0        |\n|------------+---------------------------+-------+---------+----------|\n| MADHandler | transferToZero            | 1574  | 0       | 0        |\n╰------------+---------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 0\n  Bound result 10527\n  Bound result 1458607888842295426736778209018057885200955354669\n  Bound result 0\n  Bound result 4228666474\n  Bound result 2136\n  Bound result 5031332007421030066\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 3142\n  Bound result 500000000000000000000\n  Bound result 613\n  Bound result 0\n  Bound result 0\n  Bound result 96\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 18446744073709551616\n  Bound result 0\n  Bound result 20379778263590262\n  Bound result 9392\n  Bound result 0\n  Bound result 1000000000000000000000000000\n  Bound result 1\n  Bound result 0\n  Bound result 2661054722032999880211668449110253679810831967745454187095534633714352\n  Bound result 2\n  Bound result 0\n  Bound result 710\n  Bound result 0\n  Bound result 1535066460\n  Bound result 9366\n  Bound result 0\n  Bound result 0\n  Bound result 91\n  Bound result 11\n  Bound result 7925\n  Bound result 1110\n  Bound result 0\n  Bound result 1602\n  Bound result 0\n  Bound result 100\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.81s (13.80s CPU time)\n\nRan 3 test suites in 13.81s (13.88s CPU time): 54 tests passed, 0 failed, 0 skipped (54 total tests)\n","passed":true},{"durationMs":60,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"README.md\":106,\"foundry.toml\":22,\"remappings.txt\":2,\"script/DeployMADToken.s.sol\":21,\"src/MADToken.sol\":30,\"test/MADToken.edge.t.sol\":300,\"test/MADToken.invariant.t.sol\":305,\"test/MADToken.t.sol\":329},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"25b8031a19406e1531f2897adf252bba640b324bee19e90e62725898c822ab3f","verifiedTreeHash":"836d385eba336ed3ff1a57a344da319487ae0e33","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":1337,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.22s\nCompiler run successful!\n","passed":true},{"durationMs":710,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 27 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_chainedTransfersConserveSupply(uint256,uint256) (runs: 256, μ: 174534, ~: 177132)\nLogs:\n  Bound result 77279033225416120098479701\n  Bound result 602264885\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99551, ~: 99818)\nLogs:\n  Bound result 77279033225416120098479701\n  Bound result 115792089237316195423570985008687907853269984665640486760424358591793633425119\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 97859, ~: 97955)\nLogs:\n  Bound result 838505973816062721969332307\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 126519, ~: 103013)\nLogs:\n  Bound result 3261178609502759935\n  Bound result 0\n\n[PASS] test_approveAndTransferFrom() (gas: 171876)\n[PASS] test_approveZeroSpenderReverts() (gas: 32949)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8102)\n[PASS] test_deployScriptFunctionDeploysTheSameToken() (gas: 1543316)\n[PASS] test_deployerHasNoSpecialPowerOverHolders() (gas: 98229)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 123403)\n[PASS] test_metadata() (gas: 80739)\n[PASS] test_noAdminFunctionsExist() (gas: 1226422)\n[PASS] test_plainEtherIsRefused() (gas: 39403)\n[PASS] test_runtimeHasNoDelegatecallOrSelfdestruct() (gas: 3060867)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 29407)\n[PASS] test_supplyMintedToConstructorCallerWhenDeployedByAContract() (gas: 140985)\n[PASS] test_transferFromOverAllowanceReverts() (gas: 87968)\n[PASS] test_transferFromOverBalanceRevertsEvenWithAllowance() (gas: 93623)\n[PASS] test_transferFromWithoutAllowanceReverts() (gas: 40486)\n[PASS] test_transferMovesExactAmount() (gas: 96019)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 37929)\n[PASS] test_transferRevertsOneWeiOverBalance() (gas: 38120)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43946)\n[PASS] test_transferToZeroAddressReverts() (gas: 32964)\n[PASS] test_transferWholeBalance() (gas: 78450)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47854)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 33928)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 25.97ms (99.96ms CPU time)\n\nRan 1 test suite in 35.14ms (25.97ms CPU time): 27 tests passed, 0 failed, 0 skipped (27 total tests)\n","passed":true},{"durationMs":90,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"README.md\":106,\"foundry.toml\":22,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployMADToken.s.sol\":21,\"src/MADToken.sol\":30,\"test/MADToken.t.sol\":329},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3f9de785dbcfa92471c9a5625353d282cfdd65560a7ec345516634b68cc50e52","verifiedTreeHash":"49ed889659e36d0c46685b5e47c1e1afe91a8d2f","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":1233,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.14s\nCompiler run successful!\n","passed":true},{"durationMs":129,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 27 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_chainedTransfersConserveSupply(uint256,uint256) (runs: 256, μ: 174534, ~: 177132)\nLogs:\n  Bound result 3261178609502759935\n  Bound result 0\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99551, ~: 99818)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665640564039452584007913129639935\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 97859, ~: 97955)\nLogs:\n  Bound result 838505973816062721969332307\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 126519, ~: 103013)\nLogs:\n  Bound result 808\n  Bound result 641\n\n[PASS] test_approveAndTransferFrom() (gas: 171876)\n[PASS] test_approveZeroSpenderReverts() (gas: 32949)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8102)\n[PASS] test_deployScriptFunctionDeploysTheSameToken() (gas: 1543316)\n[PASS] test_deployerHasNoSpecialPowerOverHolders() (gas: 98229)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 123403)\n[PASS] test_metadata() (gas: 80739)\n[PASS] test_noAdminFunctionsExist() (gas: 1226422)\n[PASS] test_plainEtherIsRefused() (gas: 39403)\n[PASS] test_runtimeHasNoDelegatecallOrSelfdestruct() (gas: 3060867)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 29407)\n[PASS] test_supplyMintedToConstructorCallerWhenDeployedByAContract() (gas: 140985)\n[PASS] test_transferFromOverAllowanceReverts() (gas: 87968)\n[PASS] test_transferFromOverBalanceRevertsEvenWithAllowance() (gas: 93623)\n[PASS] test_transferFromWithoutAllowanceReverts() (gas: 40486)\n[PASS] test_transferMovesExactAmount() (gas: 96019)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 37929)\n[PASS] test_transferRevertsOneWeiOverBalance() (gas: 38120)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43946)\n[PASS] test_transferToZeroAddressReverts() (gas: 32964)\n[PASS] test_transferWholeBalance() (gas: 78450)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47854)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 33928)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 21.55ms (103.58ms CPU time)\n\nRan 1 test suite in 22.24ms (21.55ms CPU time): 27 tests passed, 0 failed, 0 skipped (27 total tests)\n","passed":true},{"durationMs":42,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"README.md\":106,\"foundry.toml\":22,\"remappings.txt\":2,\"script/DeployMADToken.s.sol\":21,\"src/MADToken.sol\":30,\"test/MADToken.t.sol\":329},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1373,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":581,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/MADToken.sol:24: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"982724b7be2727fc974ae06ba023c2d04fc94dcd9dcf6bc1b5abaf0dff0ef7b1","verifiedTreeHash":"8691669056d0bdfbd34549f30ca674314c635a58","verifierVersion":"0.1.0+ead9012e"}]}