{"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":"5cc26582-b140-46e8-b424-60a988bcae5b","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"9ea96a83416f7584f272a2fd6b3177894333d39ae8b18e02cc89eba78741c1f9","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":"105069f02ed6308ada8b62b3e0dab49e057aa9d0167fb60be818c10bc50130f3","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":"36da7813682d606cf7655e26aa61ebb5270bbab523bf4e96f73e16c22afde4b6","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":"b969def9d90b650790e690704a6b67cf82e59de3d43e64442702689957330db1","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":"658b7c3ba7f237b4a23d4fbbe129c1202bd131ab12615c6c789a59b9086143ef","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":"b6c48334e5d168b6ea060d42bfd0df9394eeb69ef7d7682c5d1491531a483b99","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":"234fa5d8f3fc9ded7a40693cccdf9068162f2417e21b592fda0aca6b08f0bd11","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"33029bad00dcabc42f4573aedbfc635ef15c7964d1012e49477a75199402f4aa","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":"600ed4cc53b73d049ab116da6e8ac59af1f0960c677a87f30c87c187b4aca3ca","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"5cc26582-b140-46e8-b424-60a988bcae5b","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2468-mutually-assured-destruction"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51145","feedbackHash":"7c7fd3fd88f024ced04f0f14091e8648ff5cedaf361be4479c15090e0cc13e7c","nodeKey":"audit_economics","submissionHash":"9ea96a83416f7584f272a2fd6b3177894333d39ae8b18e02cc89eba78741c1f9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51232","feedbackHash":"a5ed029ac5029565ef8ad0226a9eb13924348a90c95ff5b196c2e7b400baee90","nodeKey":"audit_flow","submissionHash":"105069f02ed6308ada8b62b3e0dab49e057aa9d0167fb60be818c10bc50130f3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51334","feedbackHash":"83e36fddfe61f13bd9953155e04a033e53a51894cf009189d6b00aa262a2c5f4","nodeKey":"audit_judge","submissionHash":"36da7813682d606cf7655e26aa61ebb5270bbab523bf4e96f73e16c22afde4b6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50981","feedbackHash":"9050e2648a85feb1dc5e0cc04b2631ec00526f381eadbf6b679e132c536dd40d","nodeKey":"audit_math","submissionHash":"b969def9d90b650790e690704a6b67cf82e59de3d43e64442702689957330db1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52257","feedbackHash":"b58792cfb58beb8eb8e229a8882a9ee98886d28a3ce1ce0fcdf836fa8e2f0cae","nodeKey":"audit_permissions","submissionHash":"658b7c3ba7f237b4a23d4fbbe129c1202bd131ab12615c6c789a59b9086143ef","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51018","feedbackHash":"e5a5a3de32627c42640afa5d7b893d588eaf07f012be4e3d1096df0a1553db92","nodeKey":"build_contract_project","submissionHash":"b6c48334e5d168b6ea060d42bfd0df9394eeb69ef7d7682c5d1491531a483b99","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51873","feedbackHash":"bc1f84bcc698ae8a0fa8560ea298f4cbc36448e90e6185d3f69c0ae7e0de111c","nodeKey":"manifest","submissionHash":"234fa5d8f3fc9ded7a40693cccdf9068162f2417e21b592fda0aca6b08f0bd11","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52206","feedbackHash":"0128473b885f8a8846a01bbe34d4af134113de98feaeee6d2b46fcd25c2108a2","nodeKey":"write_foundry_tests","submissionHash":"33029bad00dcabc42f4573aedbfc635ef15c7964d1012e49477a75199402f4aa","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"aed906659470ece4413de625b75c839168e230263d4c19b70d0f17aeb2d24dc1","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a18a0c6087e1362f","findings":[],"hash":"105069f02ed6308ada8b62b3e0dab49e057aa9d0167fb60be818c10bc50130f3","nodeId":"65c436e2-65d2-4c2b-aa47-d428721374d4","outcome":"completed","summary":"The review is complete and the findings file is written and valid. No defects were found.\n\n**What I audited.** The Execution Trace, Periphery and First Principles passes were applied to the token's three state-changing entry points, its constructor, and the vendored base it inherits from.\n\n- **Periphery.** All five vendored OpenZeppelin files were diffed byte-for-byte against the upstream v5.4.0 tag and are identical. The base is a plain msg.sender context with no forwarder.\n- **Execution trace.** Each of approve, transfer and transferFrom was traced through the inherited checks, storage writes and revert paths. The allowance is spent before the balance moves, infinite allowance is not decremented, self-transfer nets to zero, and no stale read or partial update exists.\n- **First principles.** The supply constant evaluates to exactly one billion times ten to the eighteenth under the 0.8 literal rules. Minting happens only in the constructor and goes to msg.sender, which I confirmed is the deploying contract under CREATE2, matching the factory flow.\n- **Launch floor.** The compiled ABI exposes no mint, burn, owner, pause, blocklist or upgrade selector, no receive or fallback, and the runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT and no metadata trailer. Every transfer moves the exact amount, so the factory, distributor, seed and swap flows are satisfied by construction.\n\n**Checks I ran.** The project's own 31 tests and formatting check pass. A temporary scratch test covering CREATE2 deployment, self-transferFrom, approve race ordering, transfers to the token address and a supply-conservation fuzz also passed, and was removed afterwards. The two static analysis leads were only a style-level numeric literal note and produced nothing reproducible.\n\n**Output.** The file at the repository root holds an empty findings list and eleven coverage rows. All three listed entry points are marked as holding, along with the constructor, the supply and no-privilege invariants, the vendored library, the bytecode properties, the launch flows and the deploy script. One row is marked unreached: the README's chain id and paired-currency claims are launch data outside the token code and could not be checked without a network file or manifest.\n\nThe working tree contains no stray files.","treeHash":null,"usage":{"cachedInputTokens":556527,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":13533,"runtime":"claude","turns":27,"wallClockMs":198283}},{"artifacts":[],"attempt":1,"bundleHash":"9053c477f2d3eb3b8c6e676f5e08ca251515ffc47cb0e11b664553c90f680546","device":"42a6bb6aa496cd6b","findings":[],"hash":"234fa5d8f3fc9ded7a40693cccdf9068162f2417e21b592fda0aca6b08f0bd11","nodeId":"1f86f3b4-3a1f-4e8b-99ba-c97639efb88f","outcome":"completed","summary":"launch.json is written and verified. Only that file changed.\n\n**What the manifest describes.** The accepted tree holds a single contract, MADToken, with a no-argument constructor that mints the whole supply to msg.sender. So the manifest names the token with `constructorArgs: []`, no application contracts, and the fixed values the launch gives.\n\n- Token: contract MADToken, name Mutually Assured Destruction, symbol MAD, decimals 18, totalSupply 1000000000000000000000000000 (matches the contract's TOTAL_SUPPLY constant).\n- Pool: FWA pair address, fee 12500, tickSpacing 60, initialPrice 79228162514264337593543950336.\n- Economics: copied verbatim from the job.\n- Notes: 1320 characters describing the token's unmodified ERC-20 behaviour and absence of admin powers.\n\n**Checks run.**\n- `forge build` compiled cleanly.\n- `forge test` with the verifier's fuzz seed: 31 tests passed, 0 failed.\n- A local script confirmed the manifest uses only the schema's keys, strings for uint256 and addresses, lowercase addresses, economics in the job's exact form, and the notes within the limit.\n- `git status` shows launch.json as the sole new file. No config, lib, or other paths were touched.","treeHash":"5c922e79ba0cafb89fd9bc0b7bddf4400a6e14dd","usage":{"cachedInputTokens":189715,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3588,"runtime":"claude","turns":10,"wallClockMs":55400}},{"artifacts":[],"attempt":1,"bundleHash":"5a3e7f1e0b9164f6dafb8da5ba5a130fe0b5fefe045f0abb9e2a6b051538da72","device":"cf3b0a0c089b1430","findings":[],"hash":"33029bad00dcabc42f4573aedbfc635ef15c7964d1012e49477a75199402f4aa","nodeId":"83ec6cf7-18a8-448a-a3d0-8c0f79cd8dc2","outcome":"completed","summary":"Added boundary, failure-path, fuzz, and four-actor invariant tests under `test/`.\n\nValidation passed: `forge build` and `forge test` with the required seed—57 checks, including 32,768 randomized handler calls.\n\nNo defects found. No implementation or configuration files changed.","treeHash":"9f7386dd0d6e79b6c15222306c418b7d09096549","usage":{"cachedInputTokens":593152,"inputTokens":45882,"model":"gpt-6-astra","outputTokens":15052,"runtime":"codex","turns":5,"wallClockMs":590339}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"433c37ef2c9c708d","findings":[{"citation":"resolved","description":"MADToken inherits OpenZeppelin Contracts v5.4.0 ERC20 unmodified (the five vendored files it compiles against, ERC20.sol, IERC20.sol, IERC20Metadata.sol, Context.sol and draft-IERC6093.sol, are byte-identical to upstream v5.4.0). approve(spender, value) sets _allowances[owner][spender] outright (ERC20.sol line 120 -> _approve line 273) while transferFrom decrements it via _spendAllowance (ERC20.sol line 294). A holder who replaces a non-zero allowance with a new non-zero value can have the spender pull the old amount before the replacement lands and the new amount after it. This is the ERC-20 standard's known approve/transferFrom race, not a defect introduced by this token: OpenZeppelin v5 deliberately removed increaseAllowance/decreaseAllowance, and the README already states holders are responsible for the allowances they grant. Reported by audit_permissions as info; reproduced here and kept at info as the one asymmetry that exists in this token, for the record. Mitigation is holder-side: set the allowance to 0 and confirm before setting a new amount, or approve only trusted spenders. No change to the contract is required or recommended.","line":13,"path":"src/MADToken.sol","reproduction":"Foundry scratch test (passes on the current code, demonstrating the behaviour): holder = test contract deploys MADToken and holds 1e27. (1) holder: approve(spender, 100e18). (2) vm.prank(spender): transferFrom(holder, spender, 100e18) succeeds, allowance 100e18 -> 0. (3) holder: approve(spender, 50e18) (the intended 'lowering'). (4) vm.prank(spender): transferFrom(holder, spender, 50e18) succeeds. Actual: balanceOf(spender) == 150e18 and allowance(holder, spender) == 0. Holder's expectation: at most 100e18 ever movable under the first approval, or 50e18 under the second. Ran as test/scratch/AllowanceRace.t.sol::test_spenderCanSpendOldAndNewAllowance: PASS (gas: 216460).","severity":"info","snippet":"contract MADToken is ERC20 {","title":"Standard ERC-20 allowance race: approve overwrites, so a spender can consume an old and a replacement allowance (inherited behaviour, holder-side trust assumption, no code change required)"}],"hash":"36da7813682d606cf7655e26aa61ebb5270bbab523bf4e96f73e16c22afde4b6","nodeId":"2095783c-e707-4b84-ba6f-7c905d8ad3a2","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. The tree is otherwise untouched: the scratch directory is removed and git status is clean apart from the findings file, which is gitignored by the harness.\n\n**Outcome: no defects found.** The token is an unmodified OpenZeppelin v5.4.0 ERC-20 with a fixed supply minted once to the deployer, and it matches the manifest exactly.\n\nWhat I verified:\n- **Specialist findings.** Three specialists and the test writer reported nothing. The permissions specialist's one info item, the standard ERC-20 allowance race, reproduced in a scratch test on the current code. I kept it as the single info finding, labelled as inherited standard behaviour and a holder-side trust assumption needing no code change.\n- **Static analysis lead.** The aderyn large-numeric-literal note on line 24 is style only. The literal yields exactly the manifest's supply, so I dropped it as a defect and recorded it in coverage.\n- **Inherited code.** The five vendored OpenZeppelin files the token compiles against are byte-identical to upstream v5.4.0.\n- **Bytecode.** Creation and runtime sizes are far below the limits. An opcode scan found no DELEGATECALL, CALLCODE, SELFDESTRUCT or any CALL-family or CREATE opcodes. The ABI exposes only approve, transfer and transferFrom as state-changing, with no receive or fallback.\n- **Manifest.** Only schema keys, lowercase addresses, string uint256s, no-arg constructor matching an empty constructorArgs list, and totalSupply equal to what the constructor mints.\n- **Tests.** All 57 project tests pass. The protected tests could not run here because they import the verifier's v4-core harness, which this tree does not vendor, so I traced their supply, decimals, flow, admin-call and opcode assertions by hand and each holds.\n\nCoverage answers all three entry points plus five invariant rows. The one finding carries no proof file, since proofs are reserved for critical or high severity.","treeHash":null,"usage":{"cachedInputTokens":718688,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":11295,"runtime":"claude","turns":15,"wallClockMs":208340}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"41f7c1458e1278ad","findings":[],"hash":"38f4dad8fbc6025b5b6d8113799991e56e19ad2872a04704c6e022a201b17e7d","nodeId":"2095783c-e707-4b84-ba6f-7c905d8ad3a2","outcome":"failed","summary":"Failed to authenticate: OAuth session expired and could not be refreshed","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"claude","turns":1,"wallClockMs":2875}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"22c9b760d0a15149","findings":[{"citation":"resolved","description":"Asymmetry guide, pair approve <-> transferFrom (pull). MADToken inherits OpenZeppelin v5.4.0 ERC20 unmodified: approve(spender, value) overwrites _allowances[owner][spender] (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:280) while _spendAllowance decrements it (ERC20.sol:301). Because approve sets rather than adjusts, a holder who lowers an existing allowance can have the spender pull the old amount before the lowering lands and the new amount after it. This is the well-known ERC-20 allowance race, inherent to the standard; OpenZeppelin v5 deliberately removed increaseAllowance/decreaseAllowance, and the README already states that holders are responsible for the allowances they grant. It is recorded here so the judge has the one asymmetry that exists in this token on file, not as a defect the author must fix. Everything else in the Access Control, Trust Gap and Asymmetry guides was checked and holds: there is no role, modifier, owner, initializer, upgrade path, delegatecall, callback, external call or admin variant of any user function; the only writers of _balances are transfer/transferFrom through _update, both gated on msg.sender being the holder or holding an allowance; _totalSupply is written only by the constructor mint (no reachable _burn or _mint); Context._msgSender is plain msg.sender with no forwarder; the compiled ABI exposes exactly approve, transfer and transferFrom as non-view functions and no receive/fallback/payable path.","line":13,"path":"src/MADToken.sol","reproduction":"State: holder deploys MADToken (holds 1e27). Calls: (1) holder: approve(spender, 100e18). (2) holder intends approve(spender, 50e18); spender observes it and first calls transferFrom(holder, spender, 100e18), which succeeds (allowance 100e18 -> 0). (3) holder's approve(spender, 50e18) lands. (4) spender: transferFrom(holder, spender, 50e18) succeeds. Actual: spender received 150e18 and allowance is 0. Expected by the holder: at most 100e18 (or 50e18) ever movable. Verified with a Foundry scratch test (test_spenderCanSpendOldAndNewAllowance, passing on the current code). Mitigation available to holders without any code change: approve(spender, 0) first and confirm it before setting the new amount, or approve only trusted spenders, as the README states.","severity":"info","snippet":"contract MADToken is ERC20 {","title":"Inherited ERC-20 approve/transferFrom ordering lets a spender consume an old and a replacement allowance (standard ERC-20 behaviour, holder-side trust assumption, no code change required)"}],"hash":"658b7c3ba7f237b4a23d4fbbe129c1202bd131ab12615c6c789a59b9086143ef","nodeId":"132c8d18-c448-4a98-86c7-d615e323a756","outcome":"completed","summary":"The review is complete and the findings file is written and validated.\n\n**Outcome:** no defect found in the assigned area. The token is an unmodified OpenZeppelin v5.4.0 ERC-20 with a fixed supply minted once to the deployer. It has no owner, role, modifier, initializer, upgrade path, pause, blocklist, burn, external call or delegatecall, so the Access Control and Trust Gap guides have nothing to attack, and the only Asymmetry item is standard ERC-20 behaviour.\n\n**What I checked**\n\n- Read the token, the deploy script, the README, both repository tests and the two protected judge tests, and read the vendored OpenZeppelin ERC20, Context and interface files line by line to confirm they match upstream v5.4.0.\n- Built the project and ran the full suite. All 31 tests pass. Static analysis had only a cosmetic literal warning, which is the correct one billion constant.\n- Inspected the compiled ABI. The only non-view functions are approve, transfer and transferFrom. There is no receive, fallback or payable path, and unknown selectors and plain ETH revert without state change.\n- Traced each entry point for who can write which storage slot. Balances move only on the holder's own call or under an allowance the holder granted. Total supply is written only by the constructor.\n- Wrote a scratch Foundry test to confirm the one reproducible behaviour worth recording, then removed it.\n\n**Reported in .imd-findings.json**\n\n- One informational item: the inherited ERC-20 approve-then-transferFrom ordering race, where a spender can pull an old allowance before a replacement lands. It is inherent to the standard, the README already documents it as a holder responsibility, and I state plainly that no code change is required.\n- Eight coverage rows: the three listed entry points, four invariants I verified (no privileged actor, fixed supply, constructor hands only tokens to the factory, no DELEGATECALL or SELFDESTRUCT in the runtime), and the trust-gap seams, which are vacuous for a contract with no privileged actor and no pricing formula.\n\nNothing outside the assigned area turned up a severe defect. No repository file was changed beyond the findings file.","treeHash":null,"usage":{"cachedInputTokens":519482,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12129,"runtime":"claude","turns":16,"wallClockMs":168061}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3b9f88f55251764d","findings":[],"hash":"9ea96a83416f7584f272a2fd6b3177894333d39ae8b18e02cc89eba78741c1f9","nodeId":"54aeb34a-433b-499d-821c-94572b2c87d2","outcome":"completed","summary":"The review is complete, and the findings file is written and validated.\n\n**Outcome:** no defects found in the Economic Security, Invariant or Flow Gap areas. The findings file at the repository root holds an empty findings list and eight coverage rows, all marked holds, covering the three entry points plus the invariants and flows I checked.\n\n**What I verified**\n\n- **The token is plain OpenZeppelin ERC20.** All five vendored library files hash byte for byte to upstream v5.4.0, so transfer, approve and transferFrom are the audited implementations with no override.\n- **Supply invariant.** The only mint is in the constructor, to msg.sender, for exactly one billion tokens at 18 decimals. There is no mint, burn, owner, pause, fallback or receive. A CREATE2 deployment from a factory address credits that factory, as the launch requires.\n- **Conservation.** A scratch invariant test ran 128,000 random transfer, approve and transferFrom calls across six actors including the token contract itself. The sum of balances always equalled totalSupply.\n- **Launch flows.** I replayed the 10 percent swarm, 80 percent pool and 10 percent remainder split, then a claim leg and a buy and sell leg. Every transfer delivered the exact stated amount and the supply did not change.\n- **Economic surface.** No external dependency, oracle or ETH path exists. Transfers to the zero address revert. Transfers to the token's own address succeed and are unrecoverable, which the README documents and which is standard ERC-20 behaviour with no privileged recovery to flag as a trust assumption.\n- **Static analysis lead.** The aderyn large-numeric-literal note resolves to a correctly computed constant and is a style remark, not a defect.\n\n**Checks that ran:** forge build, the project's 31 tests, my 4 scratch tests, and forge fmt in check mode. All passed. The scratch tests were deleted afterwards and git status shows a clean tree with only the findings file present.\n\n**Not covered:** nothing in my assigned area was left unreached. The pool parameters, pair currency and chain the README mentions live outside this code and are the manifest step's responsibility.","treeHash":null,"usage":{"cachedInputTokens":489693,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":10500,"runtime":"claude","turns":21,"wallClockMs":167615}},{"artifacts":[],"attempt":1,"bundleHash":"8f3559e99748596630080bc71015722ad69669e2a1afc50751734e389a445ab2","device":"30a6c1a419ef4f9c","findings":[],"hash":"b6c48334e5d168b6ea060d42bfd0df9394eeb69ef7d7682c5d1491531a483b99","nodeId":"eafcc0c8-e07b-47f9-a937-2734bef25f37","outcome":"completed","summary":"Done. The project is committed and verified locally.\n\n**What was built**\n\n- `src/MADToken.sol`: a plain ERC-20 on OpenZeppelin Contracts v5.4.0. Name `Mutually Assured Destruction`, symbol `MAD`, 18 decimals. The constructor mints the whole 1,000,000,000 MAD supply once to `msg.sender` and takes no arguments. There is no owner, mint, burn, pause, blocklist, fee or upgrade path, so the supply can never grow and no privileged hand can touch a holder's balance.\n- `script/DeployMADToken.s.sol`: a reference deploy script whose `deploy()` function is test-callable and reads nothing from the environment.\n- `foundry.toml`: solc pinned to 0.8.26, `bytecode_hash = \"none\"`, metadata off, optimizer on, no ffi or filesystem access.\n- `lib/`: forge-std v1.9.7 and the five OpenZeppelin ERC20 files vendored as ordinary committed files. No submodule.\n- `README.md`: assumptions, manifest values for the launch step, an \"After launch\" section stating nothing needs configuring, and operational responsibilities including the absence of any admin key and that no static analyzers ran.\n\n**Checks run**\n\n| Check | Result |\n|---|---|\n| `forge build` | passes |\n| `forge test` with the verifier's fuzz seed, empty environment | 31 passed, 0 failed |\n| `forge fmt --check` | passes |\n\nTests cover metadata, the one-time mint and its events, exact-amount transfers, chained transfers, allowance spending and the infinite-allowance case, reverts for insufficient balance, missing allowance and zero addresses, a sweep of admin selectors that all revert, the deployer failing to move a holder's balance, and a bytecode scan mirroring the floor's delegatecall and selfdestruct check.\n\n**Not verifiable here**\n\nThe pinned floor tests import v4-core and the launch's `LaunchLiquidity` sources, which are not in this repository, so I could not run them directly. The token satisfies their stated requirements by construction: whole supply at the deployer, no transfer tax, no supply growth, no privileged moves, and no forbidden opcodes.","treeHash":"782110988596430174d2412cbf0b4f1bb1f6d4af","usage":{"cachedInputTokens":513331,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":17538,"runtime":"claude","turns":20,"wallClockMs":304712}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5739ce0d803a43cd","findings":[],"hash":"b969def9d90b650790e690704a6b67cf82e59de3d43e64442702689957330db1","nodeId":"6913ea43-60fe-4a4b-8c35-0c8254b96b71","outcome":"completed","summary":"The review is complete. No defects found in the Math Precision, Boundary or Numerical Gap areas, and the findings file is written with the empty list plus a full coverage record.\n\n**What was checked**\n\n- **Math precision.** The token has no arithmetic of its own beyond the supply constant. `TOTAL_SUPPLY` is a compile-time uint256 constant, and the on-chain supply and the deployer balance equal exactly 1000000000000000000000000000, matching the README and manifest. The only mint is in the constructor, so OpenZeppelin's unchecked balance updates stay sound. No casts, scales, divisions or decimal conversions exist.\n- **Boundary.** The contract makes no external calls, has no payable, receive or fallback, and decodes no bytes. I exercised every sentinel and edge case on the three entry points: zero and max amounts, supply plus one, zero-address sender, receiver and spender, self-transfer, self-transferFrom with and without allowance, allowance of max minus one versus a max spend, and a one-wei round trip. Every case reverts with the exact OpenZeppelin error or moves exactly the stated amount.\n- **Numerical gap.** A forge invariant run over randomized transfer, approve and transferFrom sequences among four actors kept the sum of balances equal to total supply at 1e27 throughout.\n- **Static-analysis lead.** The aderyn \"large numeric literal\" line at src/MADToken.sol:24 is the intended whole-token count, not a defect.\n\n**Output**\n\n- `.imd-findings.json` holds zero findings and eight coverage rows: all three listed entry points marked `holds`, plus rows for the constructor supply constant, `decimals()`, the sum-of-balances invariant, the external-boundary inventory and the static-analysis lead.\n- The scratch test used for verification was deleted afterwards. No repository files were changed.","treeHash":null,"usage":{"cachedInputTokens":562205,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":12559,"runtime":"claude","turns":26,"wallClockMs":221985}}],"verification":[{"checks":[{"durationMs":1310,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.21s\nCompiler run successful!\n","passed":true},{"durationMs":140,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/DeployMADToken.t.sol:DeployMADTokenTest\n[PASS] test_deployMintsSupplyToTheScriptCaller() (gas: 1587106)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 2175783)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 735.55µs (609.22µs CPU time)\n\nRan 29 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99632, ~: 100476)\nLogs:\n  Bound result 118434276329290076728972630\n  Bound result 427315859889\n\n[PASS] testFuzz_transferConservesSupplyAndArrivesWhole(address,uint256) (runs: 256, μ: 120123, ~: 120331)\nLogs:\n  Bound result 1000000000000000000000000000\n\n[PASS] testFuzz_transferFromBeyondAllowanceReverts(uint256,uint256) (runs: 256, μ: 95090, ~: 95695)\nLogs:\n  Bound result 716290622708644176091060090\n  Bound result 716290622708644176091060091\n\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256) (runs: 256, μ: 156700, ~: 159018)\nLogs:\n  Bound result 860349950841883722905502155\n  Bound result 0\n\n[PASS] testFuzz_unknownSelectorsNeverChangeSupply(bytes4,address,uint256) (runs: 256, μ: 51457, ~: 51483)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 68198)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 32972)\n[PASS] test_chainedTransfersArriveWhole() (gas: 205793)\n[PASS] test_constructorEmitsMintTransferAndSupplyMinted() (gas: 9337)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 44091)\n[PASS] test_deployerCannotMoveAHoldersBalance() (gas: 166003)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 123379)\n[PASS] test_metadata() (gas: 58165)\n[PASS] test_noMintBurnOrAdminSelectors() (gas: 367031)\n[PASS] test_plainEtherIsRefused() (gas: 39428)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 3107553)\n[PASS] test_supplyConstantsAgree() (gas: 25429)\n[PASS] test_transferFromRevertsBeyondAllowance() (gas: 87959)\n[PASS] test_transferFromRevertsWhenOwnerBalanceInsufficient() (gas: 93594)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40321)\n[PASS] test_transferFromSpendsAllowance() (gas: 153963)\n[PASS] test_transferMovesExactAmount() (gas: 95984)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37771)\n[PASS] test_transferRevertsWhenBalanceInsufficient() (gas: 92681)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43929)\n[PASS] test_transferToZeroAddressReverts() (gas: 32964)\n[PASS] test_transferWholeBalance() (gas: 78458)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47759)\n[PASS] test_whoeverDeploysReceivesTheSupply() (gas: 29640)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 14.04ms (63.76ms CPU time)\n\nRan 2 test suites in 15.26ms (14.77ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":61,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":108,\"foundry.toml\":26,\"launch.json\":24,\"script/DeployMADToken.s.sol\":28,\"src/MADToken.sol\":44,\"test/DeployMADToken.t.sol\":34,\"test/MADToken.t.sol\":338},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"234fa5d8f3fc9ded7a40693cccdf9068162f2417e21b592fda0aca6b08f0bd11","verifiedTreeHash":"5c922e79ba0cafb89fd9bc0b7bddf4400a6e14dd","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":2422,"exitCode":0,"name":"build","output":"Compiling 31 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.26s\nCompiler run successful!\n","passed":true},{"durationMs":16235,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/DeployMADToken.t.sol:DeployMADTokenTest\n[PASS] test_deployMintsSupplyToTheScriptCaller() (gas: 1587106)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 2175783)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 948.07µs (813.53µs CPU time)\n\nRan 29 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99742, ~: 100488)\nLogs:\n  Bound result 1234000000000000000000\n  Bound result 18\n\n[PASS] testFuzz_transferConservesSupplyAndArrivesWhole(address,uint256) (runs: 256, μ: 120038, ~: 120331)\nLogs:\n  Bound result 1000000000000000000\n\n[PASS] testFuzz_transferFromBeyondAllowanceReverts(uint256,uint256) (runs: 256, μ: 95177, ~: 95688)\nLogs:\n  Bound result 1234000000000000000000\n  Bound result 999998766000000000000000018\n\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256) (runs: 256, μ: 156377, ~: 159018)\nLogs:\n  Bound result 117081004419065839835765643\n  Bound result 427315859889\n\n[PASS] testFuzz_unknownSelectorsNeverChangeSupply(bytes4,address,uint256) (runs: 256, μ: 51458, ~: 51493)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 68198)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 32972)\n[PASS] test_chainedTransfersArriveWhole() (gas: 205793)\n[PASS] test_constructorEmitsMintTransferAndSupplyMinted() (gas: 9337)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 44091)\n[PASS] test_deployerCannotMoveAHoldersBalance() (gas: 166003)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 123379)\n[PASS] test_metadata() (gas: 58165)\n[PASS] test_noMintBurnOrAdminSelectors() (gas: 367031)\n[PASS] test_plainEtherIsRefused() (gas: 39428)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 3107553)\n[PASS] test_supplyConstantsAgree() (gas: 25429)\n[PASS] test_transferFromRevertsBeyondAllowance() (gas: 87959)\n[PASS] test_transferFromRevertsWhenOwnerBalanceInsufficient() (gas: 93594)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40321)\n[PASS] test_transferFromSpendsAllowance() (gas: 153963)\n[PASS] test_transferMovesExactAmount() (gas: 95984)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37771)\n[PASS] test_transferRevertsWhenBalanceInsufficient() (gas: 92681)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43929)\n[PASS] test_transferToZeroAddressReverts() (gas: 32964)\n[PASS] test_transferWholeBalance() (gas: 78458)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47759)\n[PASS] test_whoeverDeploysReceivesTheSupply() (gas: 29640)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 111.71ms (328.12ms CPU time)\n\nRan 24 tests for test/MADTokenEdgeCases.t.sol:MADTokenEdgeCasesTest\n[PASS] testFuzz_approvalReplacesRatherThanAddsAndCanBeRevoked(uint256,uint256) (runs: 1000, μ: 287919, ~: 287979)\n[PASS] testFuzz_exceedingFiniteAllowanceByOneIsAtomic(uint256) (runs: 1000, μ: 171181, ~: 171488)\nLogs:\n  Bound result 12\n\n[PASS] testFuzz_factoryPayoutsAndDistributorClaimsArriveWhole(uint256,uint256) (runs: 1000, μ: 370699, ~: 371946)\nLogs:\n  Bound result 900000000000000000000000000\n  Bound result 243\n\n[PASS] testFuzz_failedTransferFromPreservesAllowanceAndBalances(uint256,uint256,bool) (runs: 1000, μ: 234934, ~: 234836)\nLogs:\n  Bound result 67153916629692398319475259\n  Bound result 115792089237316195423570985008687907853269984665640496888474679868624544775309\n\n[PASS] testFuzz_invalidReceiverRollsBackAllowanceSpending(uint256,bool) (runs: 1000, μ: 170897, ~: 170188)\nLogs:\n  Bound result 63392018899030617429510603\n\n[PASS] testFuzz_partialSpendingThenReplacementUsesOnlyNewAllowance(uint256,uint256,uint256) (runs: 1000, μ: 313122, ~: 312894)\nLogs:\n  Bound result 641111653247273134760056873\n  Bound result 1486053437228\n  Bound result 0\n\n[PASS] testFuzz_splitTransfersEqualOneTransfer(uint256,uint256) (runs: 1000, μ: 332299, ~: 332624)\nLogs:\n  Bound result 9502\n  Bound result 23901\n\n[PASS] testFuzz_transferRoundTripRestoresBalances(uint256) (runs: 1000, μ: 238562, ~: 238576)\nLogs:\n  Bound result 19446\n\n[PASS] test_approvalsAreScopedToBothOwnerAndSpender() (gas: 427281)\n[PASS] test_attachingEtherToTransferRevertsAndRefundsValue() (gas: 108521)\n[PASS] test_directTransferDoesNotSpendOrGrantAllowances() (gas: 222844)\n[PASS] test_finiteAllowanceIsExhaustedAndCannotBeReusedAfterRefill() (gas: 346727)\n[PASS] test_infiniteAllowanceSurvivesRepeatedFullBalanceSpending() (gas: 697337)\n[PASS] test_maximumMinusOneAllowanceIsFinite() (gas: 194889)\n[PASS] test_maximumTransferRevertsWithoutChangingState() (gas: 169991)\n[PASS] test_oneMinorUnitTransfersExactlyAndEmits() (gas: 132597)\n[PASS] test_replacingInfiniteAllowanceWithFiniteThenRevokingTakesEffect() (gas: 304210)\n[PASS] test_selfTransferStillRequiresEnoughBalance() (gas: 102432)\n[PASS] test_selfTransfersAtZeroOneAndFullSupplyPreserveBalanceAndAllowance() (gas: 407247)\n[PASS] test_spenderCanBeRecipient() (gas: 192231)\n[PASS] test_transferFromByOwnerStillNeedsSelfAllowance() (gas: 294007)\n[PASS] test_transferFromToOwnerConsumesAllowanceWithoutCreatingTokens() (gas: 170588)\n[PASS] test_zeroAmountDoesNotPermitZeroRecipientOrSpender() (gas: 167410)\n[PASS] test_zeroTransferFromWithoutAllowanceEmitsAndDoesNotChangeState() (gas: 253646)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 111.83ms (882.11ms CPU time)\n\nRan 2 tests for test/MADTokenInvariant.t.sol:MADTokenInvariantTest\n[PASS]\nMADTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchLatestApprovalAndSuccessfulSpending\n[PASS] invariant_balancesMatchOnlyAuthorizedTransfers\n[PASS] invariant_fixedSupplyEqualsAllHolderBalances\n MADTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-----------------+------------------------+-------+---------+----------╮\n| Contract        | Selector               | Calls | Reverts | Discards |\n+=======================================================================+\n| MADTokenHandler | approve                | 2673  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | approveInfinite        | 2756  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | rejectOverdraw         | 2678  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | rejectOverspend        | 2648  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | rejectPrivilegedCall   | 2849  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | rejectUnapprovedCaller | 2621  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | rejectZeroRecipient    | 2712  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | revoke                 | 2755  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | selfTransfer           | 2830  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | transfer               | 2774  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | transferAll            | 2772  | 0       | 0        |\n|-----------------+------------------------+-------+---------+----------|\n| MADTokenHandler | transferFrom           | 2700  | 0       | 0        |\n╰-----------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129639985\n  Bound result 115792089237316195423570985008687907853269984665640314039462669257468459626243\n  Bound result 79638427512855105465802520\n  Bound result 158684023233624508549406375294169000993\n  Bound result 1234000000000000000000\n  Bound result 763600052\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129639953\n  Bound result 135\n  Bound result 2111\n  Bound result 6363\n  Bound result 115792089237316195423570985008687907853269984665640064039482584007913129639935\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129647015\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129645287\n  Bound result 14\n  Bound result 18300628155616865821013493611814415109596558098895971511493067251493082820644\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639943\n  Bound result 10000000000000000001\n  Bound result 0\n  Bound result 4\n  Bound result 47930794765549873114890385742930\n  Bound result 587721043953843659077582847\n  Bound result 115792089237316195423570985008687907853269984665640314039467584007913129639935\n  Bound result 11238985341528\n  Bound result 5564\n  Bound result 1719639409\n  Bound result 100000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639946\n  Bound result 6\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129638917\n  Bound result 1873893290336\n  Bound result 100000000000000000000000000\n  Bound result 750000000000000000000000004\n  Bound result 1079638427512855105465808883\n  Bound result 10000000000000000001\n  Bound result 7175\n  Bound result 638212884\n  Bound result 507\n  Bound result 981467815739004354767711152\n  Bound result 61\n  Bound result 1234000000000000000000\n  Bound result 1581846316\n  Bound result 8621\n  Bound result 0\n  Bound result 28\n  Bound result 0\n  Bound result 179436586557262\n  Bound result 100\n  Bound result 1000000000\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129623511\n  Bound result 114300371049425681715845245605599801746591068586964432319253225550596030917316\n  Bound result 33374332209640067901964150887968569230306842771824944867435205539\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129643365\n\n[PASS] test_handlerSequenceExercisesEveryActionAndMovesValue() (gas: 2088088)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 15.99s (15.99s CPU time)\n\nRan 4 test suites in 16.00s (16.21s CPU time): 57 tests passed, 0 failed, 0 skipped (57 total tests)\n","passed":true},{"durationMs":559,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":108,\"foundry.toml\":26,\"script/DeployMADToken.s.sol\":28,\"src/MADToken.sol\":44,\"test/DeployMADToken.t.sol\":34,\"test/MADToken.t.sol\":338,\"test/MADTokenEdgeCases.t.sol\":375,\"test/MADTokenInvariant.t.sol\":296},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"33029bad00dcabc42f4573aedbfc635ef15c7964d1012e49477a75199402f4aa","verifiedTreeHash":"9f7386dd0d6e79b6c15222306c418b7d09096549","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":1610,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.41s\nCompiler run successful!\n","passed":true},{"durationMs":159,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/DeployMADToken.t.sol:DeployMADTokenTest\n[PASS] test_deployMintsSupplyToTheScriptCaller() (gas: 1587106)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 2175783)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.96ms (1.32ms CPU time)\n\nRan 29 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99632, ~: 100476)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 18\n\n[PASS] testFuzz_transferConservesSupplyAndArrivesWhole(address,uint256) (runs: 256, μ: 120123, ~: 120331)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_transferFromBeyondAllowanceReverts(uint256,uint256) (runs: 256, μ: 95090, ~: 95695)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 999999999000000000000000018\n\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256) (runs: 256, μ: 156700, ~: 159018)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 18\n\n[PASS] testFuzz_unknownSelectorsNeverChangeSupply(bytes4,address,uint256) (runs: 256, μ: 51457, ~: 51483)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 68198)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 32972)\n[PASS] test_chainedTransfersArriveWhole() (gas: 205793)\n[PASS] test_constructorEmitsMintTransferAndSupplyMinted() (gas: 9337)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 44091)\n[PASS] test_deployerCannotMoveAHoldersBalance() (gas: 166003)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 123379)\n[PASS] test_metadata() (gas: 58165)\n[PASS] test_noMintBurnOrAdminSelectors() (gas: 367031)\n[PASS] test_plainEtherIsRefused() (gas: 39428)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 3107553)\n[PASS] test_supplyConstantsAgree() (gas: 25429)\n[PASS] test_transferFromRevertsBeyondAllowance() (gas: 87959)\n[PASS] test_transferFromRevertsWhenOwnerBalanceInsufficient() (gas: 93594)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40321)\n[PASS] test_transferFromSpendsAllowance() (gas: 153963)\n[PASS] test_transferMovesExactAmount() (gas: 95984)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37771)\n[PASS] test_transferRevertsWhenBalanceInsufficient() (gas: 92681)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43929)\n[PASS] test_transferToZeroAddressReverts() (gas: 32964)\n[PASS] test_transferWholeBalance() (gas: 78458)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47759)\n[PASS] test_whoeverDeploysReceivesTheSupply() (gas: 29640)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 17.93ms (74.77ms CPU time)\n\nRan 2 test suites in 19.48ms (20.88ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":73,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":108,\"foundry.toml\":26,\"script/DeployMADToken.s.sol\":28,\"src/MADToken.sol\":44,\"test/DeployMADToken.t.sol\":34,\"test/MADToken.t.sol\":338},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2158,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":1840,"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":"b6c48334e5d168b6ea060d42bfd0df9394eeb69ef7d7682c5d1491531a483b99","verifiedTreeHash":"782110988596430174d2412cbf0b4f1bb1f6d4af","verifierVersion":"0.1.0+ead9012e"}]}