{"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":"65d67934-37c9-40b3-8c8d-48924fb176f9","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"4519be2c406c3c61aedd6db9ebc348022e7835031e611cb842768cfe7714e6d9","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":"28810fa6e60680b596d354a1b507e28c8da107f72e68a87b5ae649f28ea99c8b","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":"1c2ae8cc18c7fdcb8e343494535daa6d9a7391ab66dd63693c262f4976c0e686","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":"473505dad4cf6e50178cc8df9f4931eb19f3509daff1506a6542dd0759131cfb","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":"2d9dec7fd9f3214951aaa89998867375233ab4818fe0a7c8b3e15a9ce8f08947","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":"a95faa7c928490497a87e057a8be4e0b23e52f949e8ae61c9c38790a830ec6d0","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":"144a3b4985e6f04c5060c0195e1c982e6e959f69d5c713321b8b3ded688f958a","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"b557b682c248513a0601bbb9a09cddc70e404cf539755080c215aa760d92c166","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":"65d67934-37c9-40b3-8c8d-48924fb176f9","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2481-mutually-assured-destruction"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52679","feedbackHash":"6122c814bf1c6c25fecd16b7c28f6e61eeb40c261085765e19d3635d1406e311","nodeKey":"audit_economics","submissionHash":"4519be2c406c3c61aedd6db9ebc348022e7835031e611cb842768cfe7714e6d9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51188","feedbackHash":"e9417a116135ca39eaa19afe673966a39936969b6bf54e22362119683a15eed0","nodeKey":"audit_flow","submissionHash":"28810fa6e60680b596d354a1b507e28c8da107f72e68a87b5ae649f28ea99c8b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51200","feedbackHash":"d53ee59ea5eeb16bcdf01cb63f52afe9fad83bf8d0780f4ff2731ba43623b43d","nodeKey":"audit_judge","submissionHash":"1c2ae8cc18c7fdcb8e343494535daa6d9a7391ab66dd63693c262f4976c0e686","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51451","feedbackHash":"14e87e03e70686b9a955f9b4095bfea19c88a7c3484044f437de1020d48883fb","nodeKey":"audit_math","submissionHash":"473505dad4cf6e50178cc8df9f4931eb19f3509daff1506a6542dd0759131cfb","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52608","feedbackHash":"5f5feae25c5ca9b47ee78d0f408296d2b6e4f93ef21022435033c9d2cf58cf10","nodeKey":"audit_permissions","submissionHash":"2d9dec7fd9f3214951aaa89998867375233ab4818fe0a7c8b3e15a9ce8f08947","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51886","feedbackHash":"a16e9bc8ba87876f7d3e4615931917dbeae91cfdceb99ca429801b53c1d2adb7","nodeKey":"build_contract_project","submissionHash":"a95faa7c928490497a87e057a8be4e0b23e52f949e8ae61c9c38790a830ec6d0","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52469","feedbackHash":"5d25df43160a9d03c8448bd2a1742027871b63a6bf9bb082eb87c340b14ca654","nodeKey":"manifest","submissionHash":"144a3b4985e6f04c5060c0195e1c982e6e959f69d5c713321b8b3ded688f958a","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51428","feedbackHash":"e37bfde2865a56d978280c943c525f2c47c7e1caf4f2ebfe46bebf28293e7923","nodeKey":"write_foundry_tests","submissionHash":"b557b682c248513a0601bbb9a09cddc70e404cf539755080c215aa760d92c166","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"21ee0cc903034418c7e317cbb0a5d80e9cfda88ab9ce2a3492bb48e006793d44","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"35290a92d4f286396b78b82c8cfcd1fb4403bbb70282441d2247e4f2159871c9","device":"8a0937587f04a986","findings":[],"hash":"144a3b4985e6f04c5060c0195e1c982e6e959f69d5c713321b8b3ded688f958a","nodeId":"c9a2b99a-5608-44be-b862-ebef4789219d","outcome":"completed","summary":"Created [launch.json](/home/agent/.identitymd/work/65d67934-37c9-40b3-8c8d-48924fb176f9/c9a2b99a-5608-44be-b862-ebef4789219d/launch.json) matching `MADToken`, its constructor and supply, and the exact pool and economics values.\n\nValidation passed: manifest checks, `forge build`, and all 28 tests using the specified fuzz seed. Only `launch.json` is changed for submission.","treeHash":"2e52cf83ee58fa7adbfa8b4978d077e6a362b7ec","usage":{"cachedInputTokens":199168,"inputTokens":42018,"model":"gpt-6-astra","outputTokens":2423,"runtime":"codex","turns":3,"wallClockMs":60856}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2468e053049c5c80","findings":[],"hash":"1c2ae8cc18c7fdcb8e343494535daa6d9a7391ab66dd63693c262f4976c0e686","nodeId":"fba59f3d-e58b-42e2-8288-bf4221fc0c39","outcome":"completed","summary":"I found no defects that should block this launch, so `.imd-findings.json` has an empty findings list. It also has a coverage row for each of the three entry points, all marked `holds`.\n\n**What I checked**\n- **The token itself:** `src/MADToken.sol` is a plain OpenZeppelin ERC-20 with a constructor that takes no arguments. Its only `_mint` call is in the constructor. It has no owner, no mint, pause or burnFrom function, no fee and no external calls.\n- **The library underneath:** I compared the vendored OpenZeppelin v5.4.0 files the token compiles against (ERC20, IERC20, IERC20Metadata, Context, IERC6093) with the upstream v5.4.0 tag. All five are identical, so `approve`, `transfer` and `transferFrom` behave exactly as standard OpenZeppelin.\n- **Build and tests:** The project builds, and all 45 of its tests pass, including the invariant runs.\n- **Deployment:** The token deploys well under the size limits (2,187 bytes deployed, 3,373 bytes of creation code). `launch.json` gives an empty argument list, which matches the constructor, and states a supply of 1e27 (one billion tokens with 18 decimals).\n- **My own scratch test:** It deployed the token with CREATE2 from a stand-in factory, the way the launch does. The factory received exactly 1e27, and decimals, name and symbol match the brief. The same scan the protected floor test runs found no DELEGATECALL, CALLCODE or SELFDESTRUCT. Edge cases behave as expected: transfers to the zero address revert, unlimited allowances aren't reduced, and a holder can transfer to themselves.\n\nThe protected floor test needs pool and factory files that aren't in this repo, so I couldn't run it. My scratch test repeats its token-only checks; it doesn't cover the pool seed or the swaps.\n\n**The specialists' two notes (both from the math specialist)**\nBoth reproduce, and I dropped both as findings:\n- **Tokens sent to the token's own address are stuck for good.** Confirmed: nothing can move them. That is normal ERC-20 behaviour, and adding a rescue function would add the privileged role the brief rules out.\n- **Lowering an allowance can be front-run.** Confirmed: the spender ended up with 150e18 after the allowance went from 100e18 to 50e18. That is how standard ERC-20 `approve` works, not a defect in this token.\n\nNeither is a defect in MADToken, and any finding I keep holds up the launch until it is resolved. I recorded both in the coverage list with the reasons. The other specialists reported nothing, and there were no duplicates to merge.\n\n**Static analysis:** The one line, a \"large numeric literal\" at line 27, is just the supply constant `1_000_000_000 * 10 ** 18`. It's correct.\n\nThe only file this left behind is `.imd-findings.json`. I deleted the scratch test and the build output (`out/`, `cache/`).","treeHash":null,"usage":{"cachedInputTokens":561008,"inputTokens":20,"model":"claude-opus-5-5","outputTokens":7013,"runtime":"claude","turns":10,"wallClockMs":101305}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0b0761c9b10fe0bb","findings":[],"hash":"28810fa6e60680b596d354a1b507e28c8da107f72e68a87b5ae649f28ea99c8b","nodeId":"eaaa925e-e97c-4393-9977-0cd9b52754bb","outcome":"completed","summary":"The review is complete. No defects were found in the assigned area, and the findings file is written with an empty findings list and a full coverage record.\n\n**What I reviewed.** The token is a 40-line contract inheriting OpenZeppelin v5.4.0 ERC20 unmodified, with a constructor that mints the fixed supply to the caller and a pure decimals override. I applied the Execution Trace, Periphery and First Principles guides against it, plus the Senior Auditor's Mindset and the validation gates.\n\n**What held, with evidence:**\n- **Execution traces** of approve, transfer and transferFrom: every sentinel (address zero as sender, receiver, spender), the infinite allowance path, the max-minus-one decrement, self-transfer, zero value, and the revert that rolls back a partial allowance decrement when the receiver is zero. I confirmed each with a scratch Foundry test that passed on the current code.\n- **Periphery:** the five vendored OpenZeppelin files the token depends on are byte-identical to the tagged v5.4.0 release. The Context base returns plain msg.sender, so there is no forwarder or caller-spoofing path. The deploy script only wraps `new MADToken()`.\n- **First principles:** the supply literal evaluates to exactly the manifest's one billion with 18 decimals. The supply is minted to the direct caller, not the transaction origin, which I checked through an intermediary deployer. The compiled ABI has exactly the three state-changing functions the verifier listed, so no mint, burn, owner or freeze surface exists.\n- **Bytecode:** no reachable CALL, STATICCALL, DELEGATECALL, CALLCODE, CREATE, CREATE2 or SELFDESTRUCT, and no payable entry.\n- **Static analysis leads:** slither reported nothing. The aderyn large-numeric-literal line is the supply constant and evaluates correctly, so it is not a defect.\n\n**Coverage record.** Ten rows, all `holds`: the three listed entry points, the constructor, decimals, and invariant rows for fixed supply, no external calls, vendored base contracts, the deploy script, and exact launch flows.\n\n**Checks run.** `forge build`, `forge test` with the verifier's fuzz seed, and `forge fmt --check` all pass. The scratch tests were removed afterwards, and the tree is unchanged apart from the ignored findings file.\n\n**Not reported on purpose.** The standard ERC-20 approve front-running race is a design property of every plain ERC-20 and is documented in the README, so it is noted in the coverage record rather than filed as a defect.","treeHash":null,"usage":{"cachedInputTokens":694769,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":11984,"runtime":"claude","turns":19,"wallClockMs":178504}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3c9b660ee1938912","findings":[],"hash":"2d9dec7fd9f3214951aaa89998867375233ab4818fe0a7c8b3e15a9ce8f08947","nodeId":"bf1a57f4-e89b-4232-aa92-7af64173c33c","outcome":"completed","summary":"I found no defects in the permissions review of `MADToken` (Mutually Assured Destruction, MAD). The report in `.imd-findings.json` has an empty findings list and a coverage row for each of the three entry points; all three hold. I changed no other files, and all 28 existing tests pass.\n\n**Why there is nothing to report:**\n- **Access control:** `src/MADToken.sol` has no owner, admin, role or modifier. There is no pause, blacklist, freeze, seize, mint, burn or upgrade path. The only privileged act is the constructor minting the full 1,000,000,000 × 10^18 to `msg.sender`, which at launch is the factory. After deployment no address holds any special power.\n- **Trust gap:** the token takes no constructor arguments and calls no other contract. Its behaviour therefore can't depend on any address someone else sets, and nothing can be initialized later by whoever gets there first. I checked the vendored OpenZeppelin 5.4.0 `ERC20` and `Context` against the standard code, and they are unchanged. In particular `_msgSender()` is plain `msg.sender`.\n- **Asymmetry:** `_update` is not overridden, so every transfer moves exactly the amount asked for. No sender or receiver is treated differently, so the launch transfers (factory to distributor, seeding the pool, the remainder to the requester, and trades through the pool) all arrive exact.\n- **Each entry point:**\n  - `approve`: rejects a zero owner or zero spender, then sets the allowance.\n  - `transfer`: rejects a zero sender or zero receiver, and checks the balance.\n  - `transferFrom`: limits the spender to the allowance the holder gave. An allowance of the maximum value is never reduced, which is standard OpenZeppelin behaviour.\n\nBesides the three entry-point rows, the coverage record holds three checked invariants:\n- no privileged role exists after deployment;\n- the supply is fixed and goes only to the deployer;\n- the launch transfers arrive exact.\n\n**What I didn't report:**\n- The aderyn \"Large Numeric Literal\" note at `src/MADToken.sol:27` is a style remark. The value it flags is correct (1e27).\n- The known ERC-20 `approve` race, where a spender can use an old allowance before a change lands, is standard behaviour the brief doesn't ask to change, so it isn't a defect here.\n\n**Limits:** this is a static review of the token alone, plus the existing tests. I didn't write extra tests, because nothing turned up that would need one. The project has no other contracts.","treeHash":null,"usage":{"cachedInputTokens":230236,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":3052,"runtime":"claude","turns":7,"wallClockMs":38975}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9812c5faf226f7c7","findings":[],"hash":"4519be2c406c3c61aedd6db9ebc348022e7835031e611cb842768cfe7714e6d9","nodeId":"d74f2578-01f7-4a8f-bfa3-c2a071df9b43","outcome":"completed","summary":"The review is complete and the findings file is written. The MAD token passed every check in my area with no defects.\n\n**Outcome:** `.imd-findings.json` holds zero findings and ten coverage rows, one per listed entry point plus the invariants and flows I checked. No tracked file was changed. My scratch test was removed and the build artefacts are gitignored.\n\n**What I checked, against the Economic Security, Invariant and Flow Gap guides:**\n\n- **Supply and minting.** The constant equals 10^27, which matches the manifest string in the README and the specified 1,000,000,000 tokens at 18 decimals. The mint happens once in the constructor to msg.sender, and the compiled ABI exposes no mint, burn, owner, pause or upgrade function. The only state-changing entries are approve, transfer and transferFrom.\n- **Conservation invariant.** A Foundry invariant run of about 128,000 handler calls over the three entry points, among six actors including the token address itself, kept the sum of balances equal to the total supply throughout. Round trips at 1 wei, supply minus one and the full supply returned exactly.\n- **Launch flows.** The 10 percent swarm share, the 80 percent pool share pulled by a pool-manager stand-in through an allowance, and the 10 percent remainder all arrived whole, leaving the factory at zero and the allowance fully consumed. The token makes no external calls and has no receive or fallback, so no callback seam exists for the PoolManager or distributor to hit.\n- **Dependencies.** The vendored OpenZeppelin tree is byte-identical to the official v5.4.0 release, and vendored forge-std matches v1.9.7, so the transfer logic is the audited implementation rather than a modified copy.\n- **Existing suite.** All 28 project tests pass, including with the verifier's fuzz seed, and the bytecode scan for forbidden opcodes passes.\n\n**Not reported as defects, by design:** the ERC-20 approve overwrite race and the unrecoverability of tokens sent to the contract's own address. Both are standard ERC-20 behaviour, both are documented in the README, and a rescue path would require an owner the design intentionally excludes.\n\n**Outside my reach:** the pool parameters in the README (chain 1, FWA pairing, fee, tick spacing, opening cap) could not be checked against a network.json, since none is supplied. The token has no knowledge of them, so they do not affect its correctness.","treeHash":null,"usage":{"cachedInputTokens":884337,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":19295,"runtime":"claude","turns":36,"wallClockMs":306862}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"79373c79d1351eba","findings":[{"citation":"resolved","description":"The contract inherits the unmodified OpenZeppelin ERC20 and adds no rescue function. ERC20._update only refuses address(0) as receiver, so address(token) is a valid destination; nothing in the contract ever calls transfer on its own balance, so any MAD sent there is locked permanently. This is a boundary note, not a defect: the design brief asks for a token with no privileged role, and adding a rescue path would add exactly such a role. Reported so the judge can record it as an accepted trust property rather than an unanswered question. No fix is recommended.","line":16,"path":"src/MADToken.sol","reproduction":"Deploy MADToken from `deployer`. Call token.transfer(address(token), 1e18) from deployer. Expected under the design: the transfer succeeds. Actual: it succeeds, balanceOf(address(token)) == 1e18, and no selector exists that can move it (e.g. a call to rescue(address,uint256) reverts). Verified in a scratch Foundry test (test_transferToTokenContractIsStuck).","severity":"info","snippet":"contract MADToken is ERC20 {","title":"Tokens transferred to the token contract's own address are irrecoverable (inherent to the minimal design)"},{"citation":"resolved","description":"approve overwrites the allowance rather than adjusting it, and OpenZeppelin v5 no longer ships increaseAllowance/decreaseAllowance. If a holder lowers an allowance while the spender front-runs with transferFrom, the spender ends up with old + new. This is the well-known ERC-20 standard property, present in every unmodified OZ v5 token; it is not a defect in MADToken and the mitigation (approve 0 first, or permit-style flows) is the holder's. Recorded as a trust note only.","line":122,"path":"lib/openzeppelin/contracts/token/ERC20/ERC20.sol","reproduction":"deployer: approve(bob, 100e18). bob (before the owner's re-approval is mined): transferFrom(deployer, bob, 100e18). deployer: approve(bob, 50e18). bob: transferFrom(deployer, bob, 50e18). Expected by a naive holder: bob can spend at most 100e18. Actual: bob holds 150e18. Verified in a scratch Foundry test (test_approveRaceDoubleSpend).","severity":"info","snippet":"        _approve(owner, spender, value);","title":"Standard ERC-20 approve race: a spender can spend the old and the new allowance across a re-approval (inherent to ERC-20)"}],"hash":"473505dad4cf6e50178cc8df9f4931eb19f3509daff1506a6542dd0759131cfb","nodeId":"53665ed5-2456-460b-82c4-f74767fc1464","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. No math defects found.\n\n**What I reviewed.** The token in `src/MADToken.sol` is an unmodified OpenZeppelin 5.4.0 ERC-20 with a fixed supply minted once in the constructor. It has no formulas, divisions, rate conversions, external calls, payable paths or bytes decoding, so the Math Precision, Boundary and Numerical Gap guides mostly reduce to the arithmetic inside OpenZeppelin's balance and allowance updates.\n\n**What I verified concretely.** I ran the existing 28-test suite (all pass) and a scratch Foundry test of 12 boundary cases, then removed the scratch file:\n\n- The supply constant evaluates exactly to 1e27, with the exponent cast to uint256 so no narrow-type exponentiation. The aderyn large-literal lead is benign.\n- Transfer and transferFrom guard every unchecked subtraction with a prior balance or allowance check. Self-transfer of the whole balance, zero amounts, uint256 max amounts and the zero-address receiver all behave correctly.\n- The infinite-allowance sentinel is not decremented, max-1 is, and the balance check still applies under an infinite allowance.\n- The launch split of 10 percent, 80 percent and the remainder is exact in integer arithmetic, and the supply fits a Uniswap v4 int128 delta.\n- Sum of balances equals total supply under fuzzing, and no mint, burn or transfer-to-zero path exists after construction.\n\n**What I reported.** Two info-level notes only, each with a reproduction, both inherent ERC-20 properties rather than defects: tokens sent to the token's own address are locked, and the standard approve race lets a front-running spender spend an old and a new allowance. Neither warrants a fix under the no-privileged-role design.\n\n**Coverage.** All three listed entry points are marked `holds`, plus six invariant rows covering the constructor arithmetic, decimals, launch-split exactness, supply conservation, and the absence of any boundary or numerical-seam surface. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":615263,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":11507,"runtime":"claude","turns":15,"wallClockMs":171129}},{"artifacts":[],"attempt":1,"bundleHash":"79093a4204d4f62a14440351df316903e961739cbcec0a0ecbb760407cb5d55e","device":"dd3018ab6b18e7bc","findings":[],"hash":"a95faa7c928490497a87e057a8be4e0b23e52f949e8ae61c9c38790a830ec6d0","nodeId":"b86659a9-2d86-4a6f-863b-495f9c0346a3","outcome":"completed","summary":"The MAD token project is complete, verified and committed on `main`.\n\n**What was built**\n\n- `src/MADToken.sol`: contract `MADToken`, a fixed-supply ERC-20 on the unmodified OpenZeppelin v5.4.0 `ERC20`. Name \"Mutually Assured Destruction\", symbol \"MAD\", 18 decimals, 1,000,000,000 tokens minted once to `msg.sender` in a no-argument constructor. No owner, mint, pause, blacklist, freeze, seize, burn or fee surface, no external calls, no `delegatecall` or `selfdestruct`, so every launch flow moves exactly what it says and the supply can never grow.\n- `foundry.toml` at the repository root pins `solc = \"0.8.26\"`, `bytecode_hash = \"none\"`, optimizer on, no ffi or filesystem permissions. The built bytecode carries no metadata trailer.\n- `test/MADToken.t.sol` has 28 tests: metadata and supply, constructor mint event, CREATE2 deployment from a factory stand-in with the 10/80/10 payout arriving whole, success paths for transfer, approve and transferFrom, failure paths with the exact OpenZeppelin custom errors, a probe of every mint/admin/freeze signature from both a stranger and the deployer, ETH rejection, an EIP-170 size and forbidden-opcode scan, and three fuzz tests.\n- `script/DeployMADToken.s.sol` exposes a `deploy()` function with no environment reads. It is a rehearsal aid only. The launch factory deploys the token itself.\n- `README.md` documents assumptions, the manifest parameters, the empty \"After launch\" section, operational responsibilities and security notes.\n- `lib/forge-std` (v1.9.7) and `lib/openzeppelin` (v5.4.0, `contracts/` only) are vendored as plain files. All 373 library entries are mode 100644, so there is no submodule.\n\n**Check results**\n\n| Check | Result |\n| --- | --- |\n| `forge build` (clean rebuild) | success |\n| `forge test` with the verifier's fuzz seed | 28 passed, 0 failed |\n| `forge fmt --check` | clean |\n\n**One thing to know**\n\nThe sandbox bind-mounted `lib/openzeppelin-contracts/.gitmodules` read-only during vendoring, so that one stray file could not be deleted. It is excluded from the commit via `.gitignore`, is not a submodule, and nothing references it. The real OpenZeppelin sources live in `lib/openzeppelin`.\n\nNo requester input was needed. The token has no configurable values, so nothing is left as a placeholder.","treeHash":"ac27a0c5860bc5e6ad72b3bcd6040f31f3bb3f0e","usage":{"cachedInputTokens":853590,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":21939,"runtime":"claude","turns":24,"wallClockMs":362700}},{"artifacts":[],"attempt":1,"bundleHash":"a8307a9db0c735392a582212813152fc19178ac9498a0361051a4e39763d130f","device":"bc1e515ca5c78ac4","findings":[],"hash":"b557b682c248513a0601bbb9a09cddc70e404cf539755080c215aa760d92c166","nodeId":"641d761c-47da-4da3-b5d9-ac1c6543270b","outcome":"completed","summary":"I added an invariant suite and an edge-case suite for the MAD token. All 45 tests pass with the verifier's fuzz seed, `forge build` is clean, and both new files are formatted.\n\n**What I found in the token:** `src/MADToken.sol` is OpenZeppelin v5's standard ERC-20 with no changes. It adds only constants, `decimals()`, and a constructor that mints the 1,000,000,000 × 10¹⁸ supply to the deployer once. I found no defects, so I did not write `.imd-findings.json`. The README matches the code.\n\n**`test/MADToken.invariant.t.sol` (new):** a test contract that calls the token in random order, with five accounts including the deployer. It does five things: transfers, transfers to the zero address, approvals (including zero and the maximum), spending an allowance, and calls to admin functions that don't exist (mint, burn, burnFrom, pause, blacklist, transferOwnership, seize, freeze). Amounts lean towards the edges: zero, the whole balance, one more than the balance, and very large values.\n\nIt keeps its own record of what each balance and allowance should be, worked out from the ERC-20 rules rather than by reading the token. For every call that should fail, it checks the exact error. The checks below run after every step, at 256 runs × 64 calls, and none of the 16,384 calls reverted unexpectedly:\n- Total supply never changes.\n- The five accounts' balances add up to the total supply, and nothing reaches the zero address.\n- Every balance and allowance matches the expected record.\n- Every call succeeded or failed exactly as the rules say, and every transfer moved exactly its amount.\n- No balance ever exceeds the supply.\n- Each run made at least one real change, so the checks never pass on an empty run.\n\n**`test/MADToken.edge.t.sol` (new):** 16 tests of failure paths and edge cases the existing suite didn't cover:\n- the constructor emits exactly one event, a mint for the whole supply;\n- an owner calling `transferFrom` on their own tokens still needs an allowance to themselves;\n- `transferFrom` to the zero address fails and does not use up the allowance;\n- `approve` from the zero address fails;\n- a zero-amount `transferFrom` succeeds with no allowance;\n- an allowance of the maximum minus one goes down when spent, and an unlimited allowance still can't move more than the balance;\n- transferring the maximum `uint256` fails;\n- an allowance reset to zero blocks spending;\n- calls the token doesn't recognise, or with no data, fail.\n\nThe rest are fuzz tests at 1,000 runs each. They cover self-transfers, transfers there and back, `transferFrom` against both the allowance and balance limits (a failed call changes nothing), and `approve` setting the exact value.\n\nOne of my own expectations was wrong, not the token. A `transferFrom` from the zero address fails with `ERC20InvalidApprover`, not `ERC20InvalidSender`. That's because OpenZeppelin v5 checks the allowance first, and that check rejects the zero owner. The test now asserts the real behaviour, with a comment explaining why.\n\nI left the existing `test/MADToken.t.sol` (28 tests) unchanged. I didn't touch anything outside `test/`, and I haven't committed the two new files.","treeHash":"6c87b9a9edcca976575baf16ae4be27e3adc570a","usage":{"cachedInputTokens":376265,"inputTokens":18,"model":"claude-opus-5-5","outputTokens":12487,"runtime":"claude","turns":10,"wallClockMs":157999}}],"verification":[{"checks":[{"durationMs":1058,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 972.53ms\nCompiler run successful!\n","passed":true},{"durationMs":111,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 28 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_RevertWhen_TransferExceedsBalance(uint256,uint256) (runs: 256, μ: 99962, ~: 100319)\nLogs:\n  Bound result 60000000000000000000\n  Bound result 999999940000000000000000010\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 119987, ~: 120809)\nLogs:\n  Bound result 1751\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 129043, ~: 158263)\nLogs:\n  Bound result 61454286797\n  Bound result 724678595690069864854204309\n\n[PASS] test_RevertWhen_ApproveZeroAddressSpender() (gas: 32948)\n[PASS] test_RevertWhen_DeployerTransfersMoreThanSupply() (gas: 38149)\n[PASS] test_RevertWhen_SendingEther() (gas: 71238)\n[PASS] test_RevertWhen_TransferExceedsBalance() (gas: 37821)\n[PASS] test_RevertWhen_TransferFromExceedsAllowance() (gas: 87975)\n[PASS] test_RevertWhen_TransferFromExceedsOwnerBalance() (gas: 93637)\n[PASS] test_RevertWhen_TransferFromWithoutAllowance() (gas: 40360)\n[PASS] test_RevertWhen_TransferToZeroAddress() (gas: 32965)\n[PASS] test_approveAndTransferFrom() (gas: 239660)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 95606)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8129)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 23355)\n[PASS] test_deployScriptFunctionMintsToCaller() (gas: 1535841)\n[PASS] test_eachDeploymentMintsToItsOwnDeployer() (gas: 45096)\n[PASS] test_factoryDeploymentHoldsWholeSupplyAndPaysOutExactly() (gas: 1117078)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 135987)\n[PASS] test_metadata() (gas: 80450)\n[PASS] test_noCallIncreasesSupplyOrGrantsTokens() (gas: 1198460)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 457470)\n[PASS] test_runtimeIsWithinEip170AndHasNoForbiddenOpcodes() (gas: 3141198)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 27507)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 95986)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43895)\n[PASS] test_transferWholeBalance() (gas: 78424)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47834)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 25.56ms (81.11ms CPU time)\n\nRan 1 test suite in 27.58ms (25.56ms CPU time): 28 tests passed, 0 failed, 0 skipped (28 total tests)\n","passed":true},{"durationMs":43,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":146,\"foundry.toml\":25,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployMADToken.s.sol\":27,\"src/MADToken.sol\":40,\"test/MADToken.t.sol\":387},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"144a3b4985e6f04c5060c0195e1c982e6e959f69d5c713321b8b3ded688f958a","verifiedTreeHash":"2e52cf83ee58fa7adbfa8b4978d077e6a362b7ec","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.24s\nCompiler run successful!\n","passed":true},{"durationMs":130,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 28 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_RevertWhen_TransferExceedsBalance(uint256,uint256) (runs: 256, μ: 99962, ~: 100319)\nLogs:\n  Bound result 60000000000000000000\n  Bound result 999999940000000000000000010\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 119987, ~: 120809)\nLogs:\n  Bound result 8486441433905\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 129043, ~: 158263)\nLogs:\n  Bound result 60000000000000000000\n  Bound result 10\n\n[PASS] test_RevertWhen_ApproveZeroAddressSpender() (gas: 32948)\n[PASS] test_RevertWhen_DeployerTransfersMoreThanSupply() (gas: 38149)\n[PASS] test_RevertWhen_SendingEther() (gas: 71238)\n[PASS] test_RevertWhen_TransferExceedsBalance() (gas: 37821)\n[PASS] test_RevertWhen_TransferFromExceedsAllowance() (gas: 87975)\n[PASS] test_RevertWhen_TransferFromExceedsOwnerBalance() (gas: 93637)\n[PASS] test_RevertWhen_TransferFromWithoutAllowance() (gas: 40360)\n[PASS] test_RevertWhen_TransferToZeroAddress() (gas: 32965)\n[PASS] test_approveAndTransferFrom() (gas: 239660)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 95606)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8129)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 23355)\n[PASS] test_deployScriptFunctionMintsToCaller() (gas: 1535841)\n[PASS] test_eachDeploymentMintsToItsOwnDeployer() (gas: 45096)\n[PASS] test_factoryDeploymentHoldsWholeSupplyAndPaysOutExactly() (gas: 1117078)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 135987)\n[PASS] test_metadata() (gas: 80450)\n[PASS] test_noCallIncreasesSupplyOrGrantsTokens() (gas: 1198460)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 457470)\n[PASS] test_runtimeIsWithinEip170AndHasNoForbiddenOpcodes() (gas: 3141198)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 27507)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 95986)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43895)\n[PASS] test_transferWholeBalance() (gas: 78424)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47834)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 12.92ms (53.45ms CPU time)\n\nRan 1 test suite in 14.98ms (12.92ms CPU time): 28 tests passed, 0 failed, 0 skipped (28 total tests)\n","passed":true},{"durationMs":68,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":146,\"foundry.toml\":25,\"remappings.txt\":2,\"script/DeployMADToken.s.sol\":27,\"src/MADToken.sol\":40,\"test/MADToken.t.sol\":387},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1188,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":412,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/MADToken.sol:27: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a95faa7c928490497a87e057a8be4e0b23e52f949e8ae61c9c38790a830ec6d0","verifiedTreeHash":"ac27a0c5860bc5e6ad72b3bcd6040f31f3bb3f0e","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":1892,"exitCode":0,"name":"build","output":"Compiling 30 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.75s\nCompiler run successful!\n","passed":true},{"durationMs":10706,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 28 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_RevertWhen_TransferExceedsBalance(uint256,uint256) (runs: 256, μ: 99726, ~: 100319)\nLogs:\n  Bound result 61454286797\n  Bound result 831564928691077736871967744\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 119996, ~: 120809)\nLogs:\n  Bound result 261899210394686604792025858\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 130854, ~: 158275)\nLogs:\n  Bound result 684831254781382325029624772\n  Bound result 10\n\n[PASS] test_RevertWhen_ApproveZeroAddressSpender() (gas: 32948)\n[PASS] test_RevertWhen_DeployerTransfersMoreThanSupply() (gas: 38149)\n[PASS] test_RevertWhen_SendingEther() (gas: 71238)\n[PASS] test_RevertWhen_TransferExceedsBalance() (gas: 37821)\n[PASS] test_RevertWhen_TransferFromExceedsAllowance() (gas: 87975)\n[PASS] test_RevertWhen_TransferFromExceedsOwnerBalance() (gas: 93637)\n[PASS] test_RevertWhen_TransferFromWithoutAllowance() (gas: 40360)\n[PASS] test_RevertWhen_TransferToZeroAddress() (gas: 32965)\n[PASS] test_approveAndTransferFrom() (gas: 239660)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 95606)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8129)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 23355)\n[PASS] test_deployScriptFunctionMintsToCaller() (gas: 1535841)\n[PASS] test_eachDeploymentMintsToItsOwnDeployer() (gas: 45096)\n[PASS] test_factoryDeploymentHoldsWholeSupplyAndPaysOutExactly() (gas: 1117078)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 135987)\n[PASS] test_metadata() (gas: 80450)\n[PASS] test_noCallIncreasesSupplyOrGrantsTokens() (gas: 1198460)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 457470)\n[PASS] test_runtimeIsWithinEip170AndHasNoForbiddenOpcodes() (gas: 3141198)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 27507)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 95986)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43895)\n[PASS] test_transferWholeBalance() (gas: 78424)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47834)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 33.75ms (118.76ms CPU time)\n\nRan 16 tests for test/MADToken.edge.t.sol:MADTokenEdgeTest\n[PASS] testFuzz_approveSetsExactValue(address,uint256) (runs: 1000, μ: 69086, ~: 69399)\nLogs:\n  Bound result 3858947846\n\n[PASS] testFuzz_selfTransferIsNoOp(uint256,uint256) (runs: 1000, μ: 115931, ~: 116319)\nLogs:\n  Bound result 20625231717960103\n  Bound result 9146942026482064\n\n[PASS] testFuzz_transferFromCheckedAgainstBothLimits(uint256,uint256,uint256) (runs: 1000, μ: 182335, ~: 175238)\nLogs:\n  Bound result 0\n  Bound result 8\n  Bound result 583026215312313099964224462\n\n[PASS] testFuzz_transferRoundTripRestoresBalances(uint256) (runs: 1000, μ: 117162, ~: 117133)\nLogs:\n  Bound result 2\n\n[PASS] test_RevertWhen_ApproveFromZeroAddress() (gas: 33041)\n[PASS] test_RevertWhen_OwnerUsesTransferFromWithoutSelfAllowance() (gas: 45454)\n[PASS] test_RevertWhen_TransferFromToZeroAddress() (gas: 96452)\n[PASS] test_RevertWhen_TransferFromZeroAddressOwner() (gas: 37829)\n[PASS] test_RevertWhen_TransferMaxUint() (gas: 38153)\n[PASS] test_RevertWhen_UnknownSelectorOrCalldata() (gas: 51090)\n[PASS] test_allowanceOneBelowMaxIsDecremented() (gas: 126695)\n[PASS] test_infiniteAllowanceStillBoundedByBalance() (gas: 88620)\n[PASS] test_onlyOneMintEverHappened() (gas: 11695)\n[PASS] test_ownerTransferFromWithSelfAllowance() (gas: 137131)\n[PASS] test_revokeAllowanceBlocksFurtherSpend() (gas: 113536)\n[PASS] test_zeroAmountTransferFromWithNoAllowanceSucceeds() (gas: 68218)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 33.92ms (131.55ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS]\nMADTokenInvariantTest invariants:\n[PASS] invariant_actorBalancesSumToSupply\n[PASS] invariant_allowancesMatchLedger\n[PASS] invariant_balancesMatchLedger\n[PASS] invariant_everyCallBehavedAsSpecified\n[PASS] invariant_noBalanceExceedsSupply\n[PASS] invariant_totalSupplyNeverChanges\n MADTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| MADHandler | approve        | 3310  | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| MADHandler | privilegedCall | 3392  | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| MADHandler | transfer       | 3239  | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| MADHandler | transferFrom   | 3240  | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| MADHandler | transferToZero | 3203  | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 28\n  Bound result 23\n  Bound result 950335463870165937481377091\n  Bound result 21\n  Bound result 0\n  Bound result 33\n  Bound result 7989362466\n  Bound result 31\n  Bound result 1565983641229238041866081791\n  Bound result 942346686701026866694027977\n  Bound result 13\n  Bound result 519183746944391587697282290\n  Bound result 16\n  Bound result 233143873991986698315093479\n  Bound result 0\n  Bound result 6717341\n  Bound result 1062096743069842517338184605\n  Bound result 14\n  Bound result 192787045959619851274956457\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.56s (10.56s CPU time)\n\nRan 3 test suites in 10.57s (10.63s CPU time): 45 tests passed, 0 failed, 0 skipped (45 total tests)\n","passed":true},{"durationMs":41,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":146,\"foundry.toml\":25,\"remappings.txt\":2,\"script/DeployMADToken.s.sol\":27,\"src/MADToken.sol\":40,\"test/MADToken.edge.t.sol\":190,\"test/MADToken.invariant.t.sol\":277,\"test/MADToken.t.sol\":387},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b557b682c248513a0601bbb9a09cddc70e404cf539755080c215aa760d92c166","verifiedTreeHash":"6c87b9a9edcca976575baf16ae4be27e3adc570a","verifierVersion":"0.1.0+ead9012e"}]}