{"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":"f923318d-56cd-433e-bd8f-66cd14bcfa5e","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"c726d819c862b300e9a2f43a91907ea521fba1dde43add0fe7f23bc5575041d9","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":"00942c44aadf0b37542c493ce1359516e0afa6d356f9f841a9d8903ad3d2430d","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":"729fa0553fa365a70e96ae41a026330997eb82e006177b4fe28d3da66a56d1c6","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":"4fd97494640a0e48510971613e932f46e576cd798d2f8bddf9bb356d058dcc0a","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":"995c776518567c0d4f08539a3ba09b0c8ddf3a1507db427da6547d57a0f25fca","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":"548b96cf7085304e87abdcb085eb3d02bef2ef830ee20d0c9e6aaac4b030bc7d","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":"2af81933da88e9cb2efee77065dc8972648dc5e3b482ab496ebd529a57a2f102","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"8075827eb3a3188631a0a056c9b21f20cfddb4761137c24be989a5ea6ef070db","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":"f923318d-56cd-433e-bd8f-66cd14bcfa5e","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2432-mutually-assured-destruction"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52681","feedbackHash":"97f0d7f4fb9b9692bcc994c3f4be4d37d440170cd0333223d84d4510ddd8b2b5","nodeKey":"audit_economics","submissionHash":"c726d819c862b300e9a2f43a91907ea521fba1dde43add0fe7f23bc5575041d9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51485","feedbackHash":"9532a317e3787bd08c27c2fac8e24be4873b504104c5a57b04193637e2570d26","nodeKey":"audit_flow","submissionHash":"00942c44aadf0b37542c493ce1359516e0afa6d356f9f841a9d8903ad3d2430d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52600","feedbackHash":"06d4a07ac9626493edf4601f177717a87710f399ee8431ccbc39085aeeb1aa37","nodeKey":"audit_judge","submissionHash":"729fa0553fa365a70e96ae41a026330997eb82e006177b4fe28d3da66a56d1c6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51428","feedbackHash":"2c7dfd6b0c5ec5f4dc7bbd19d1e2e3af465138eae0f7f1d7e90266acfd367314","nodeKey":"audit_math","submissionHash":"4fd97494640a0e48510971613e932f46e576cd798d2f8bddf9bb356d058dcc0a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52396","feedbackHash":"044b35b3589fd40de605b3d1811fd0614916a342135c0efeddab4b34369c21e6","nodeKey":"audit_permissions","submissionHash":"995c776518567c0d4f08539a3ba09b0c8ddf3a1507db427da6547d57a0f25fca","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51523","feedbackHash":"857ebd6fe3309fd4c147049005d620a2ffdaf43f434f00b65c343ebc68549a86","nodeKey":"build_contract_project","submissionHash":"548b96cf7085304e87abdcb085eb3d02bef2ef830ee20d0c9e6aaac4b030bc7d","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52189","feedbackHash":"aafe89775b992b4424a3260a50d30f5d18e84757a8a2fe494e30c826814bcddf","nodeKey":"manifest","submissionHash":"2af81933da88e9cb2efee77065dc8972648dc5e3b482ab496ebd529a57a2f102","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51423","feedbackHash":"68a6a600127d5cd7bae22882eb7cd6e967fb502297e2e0bbc46fc477d31a5cbf","nodeKey":"write_foundry_tests","submissionHash":"8075827eb3a3188631a0a056c9b21f20cfddb4761137c24be989a5ea6ef070db","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"7a4b2f36d4dd5640eeacc63a7ae6fdd57b0bdffc796d9a51cbe43f4b17df6ecc","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"234a4a00ca903cb9","findings":[],"hash":"00942c44aadf0b37542c493ce1359516e0afa6d356f9f841a9d8903ad3d2430d","nodeId":"e1cb661f-c6d1-4ba0-92e4-4a3945b418cd","outcome":"completed","summary":"I found no defects in `MADToken` within the area I was assigned (control flow, using the Execution Trace, Periphery and First Principles guides), so `.imd-findings.json` has an empty findings list. I ran no tests or Foundry proofs, because nothing turned up that needed one.\n\n**Why it comes back clean:** `src/MADToken.sol` is OpenZeppelin's standard ERC20 with nothing changed. It adds one constant, `INITIAL_SUPPLY = 1_000_000_000 * 10**18`, and a constructor that mints that amount once to `msg.sender`, which is the factory. It has:\n- no overrides of the transfer logic;\n- no fees, burns or blacklists;\n- no owner, pause or admin functions;\n- no external calls or callbacks, so no reentrancy path;\n- no way to mint more after deployment.\n\n**Launch flows:** Because transfers move the exact amount, the factory's transfer to the distributor, the pool seed, claims and swaps through the PoolManager all arrive whole. That matches what the protected tests check: supply, decimals, the swarm share, a seed and a swap each way, and no admin powers.\n\n**Static analysis:** Slither reported nothing. Aderyn's only lead, a \"large numeric literal\" at line 12, is just that supply constant and is correct (10^27).\n\n**Coverage rows written:**\n\n| Entry point | Verdict | Reason |\n|---|---|---|\n| `MADToken.approve(address,uint256)` | holds | Standard approve: rejects a zero spender, sets the allowance, nothing else runs |\n| `MADToken.transfer(address,uint256)` | holds | Standard transfer: the full amount arrives, no fee, burn or blocking |\n| `MADToken.transferFrom(address,address,uint256)` | holds | Spends the allowance, then transfers; reverts if the allowance is too small; an unlimited approval is left as is |\n| Invariant: total supply is fixed at 1e27 | holds | The only mint is in the constructor, and nothing can mint or burn afterwards |\n\nNo repository files were changed; `git status` is clean apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":129949,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":1656,"runtime":"claude","turns":4,"wallClockMs":20554}},{"artifacts":[],"attempt":1,"bundleHash":"68c85ac985a0cf610bd1cbb2e3583babf28c639ee17f2ac220019924d1190968","device":"fe5e46fb044c6af1","findings":[],"hash":"2af81933da88e9cb2efee77065dc8972648dc5e3b482ab496ebd529a57a2f102","nodeId":"52667e52-a75d-4654-ba1e-ec81ebba6ef6","outcome":"completed","summary":"Done. I wrote `launch.json` for the MAD custom token launch and verified it against the accepted tree.\n\n**What the manifest contains**\n\n- **Token:** contract `MADToken`, name \"Mutually Assured Destruction\", symbol MAD, 18 decimals, empty constructorArgs. The accepted constructor takes no parameters and mints the INITIAL_SUPPLY constant once to msg.sender.\n- **totalSupply:** the decimal string for one billion tokens in minor units, which matches the constant in the source exactly.\n- **Contracts:** an empty list. The accepted tree has only the token, with no application contracts.\n- **Pool and economics:** copied verbatim from the launch reference, with the FWA pair address, fee 12500, tick spacing 60, the one-to-one initialPrice, and the requester's economics object.\n- **Notes:** about 1,200 characters describing the token's behavior and the launch flows. No swarm share or stand-in values are written.\n\n**Checks run**\n\n- The file parses as JSON with only the six schema keys and no extras.\n- The supply string equals 10^27, the value the constructor mints.\n- `forge build` succeeds and `forge test` with the verifier's fuzz seed passes all 31 tests.\n- Git status shows launch.json as the only change. No config, lib, or test files were touched.","treeHash":"a5ee7e9c58c6a26db87b7c86a4a02e07c7d78c40","usage":{"cachedInputTokens":183194,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3091,"runtime":"claude","turns":10,"wallClockMs":60059}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bc1e515ca5c78ac4","findings":[],"hash":"4fd97494640a0e48510971613e932f46e576cd798d2f8bddf9bb356d058dcc0a","nodeId":"e31bf42f-8289-4aba-89ee-9d157c213e52","outcome":"completed","summary":"I found no math defects in MADToken. `.imd-findings.json` has an empty findings list and a coverage row for each of the three entry points, plus one for the fixed-supply rule; all four rows are `holds`. I didn't change any other file.\n\n**What I reviewed.** `src/MADToken.sol` is OpenZeppelin v5's standard ERC-20 with nothing overridden. The only extras are the fixed-supply constant `INITIAL_SUPPLY = 1_000_000_000 * 10 ** 18` and a single mint to the deployer in the constructor. So the math to check is the constant and OpenZeppelin's balance and allowance arithmetic, which I read in the bundled library under `lib/`.\n\n**Precision and the supply figure:**\n- The constant comes out to exactly 1e27, the 1,000,000,000 tokens with 18 decimals that the task specifies, and it fits easily in a uint256.\n- There are no fees, ratios or rounding anywhere, so every transfer delivers exactly what it says.\n- The 10% swarm share is exactly 1e26, so nothing is lost to division.\n- The static-analysis \"large numeric literal\" warning only points at that constant, which is correct. It's not a defect.\n\n**Boundaries:**\n- **`transfer` / `transferFrom`:** the balance is checked before the subtraction, so sending your whole balance works and one unit more reverts. Sending 0 also works.\n- **Allowances:** the allowance is checked the same way before it is reduced, and an unlimited allowance (the maximum value) is never reduced.\n- **`approve`:** stores the exact amount with no arithmetic, and a zero address as owner or spender is rejected.\n\n**Gaps between figures:**\n- OpenZeppelin skips overflow checks when crediting the recipient, which is safe only if the total supply can't grow. Here `_mint` is called only in the constructor, and the token has no other mint function, burn or admin role, so the total stays at 1e27 forever.\n- No balance can ever exceed that total, so the credit can't overflow.\n\n**Not covered:**\n- The other specialty guides (access control, reentrancy and so on) are outside my area. The token has no state-changing code of its own beyond what's described above.\n- No launch.json exists yet to compare the supply against.\n\nThe project's existing test suite passes (31 tests, 0 failures). I wrote no proof tests because there was no high or critical finding that needed one.","treeHash":null,"usage":{"cachedInputTokens":136727,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":2009,"runtime":"claude","turns":5,"wallClockMs":33698}},{"artifacts":[],"attempt":1,"bundleHash":"45a81c80a4673b95d23261a85484c123c933f34aac5d08e3f76193ef2ae44ac4","device":"ca720d6a84c31fdd","findings":[],"hash":"548b96cf7085304e87abdcb085eb3d02bef2ef830ee20d0c9e6aaac4b030bc7d","nodeId":"beadd1f4-b351-4e9d-9806-d8168c743acc","outcome":"completed","summary":"Implemented [MADToken.sol](/home/imd-worker/.identitymd/work/f923318d-56cd-433e-bd8f-66cd14bcfa5e/beadd1f4-b351-4e9d-9806-d8168c743acc/src/MADToken.sol): exact name/symbol, 18 decimals, and one billion tokens minted once to the deployer.\n\nDependencies are vendored for offline builds. Assumptions, deployment parameters, and operational responsibilities are documented.\n\nValidation passed with Solidity 0.8.26:\n\n- `forge build`\n- `forge test`: 31 tests passed using the supplied fuzz seed, including 8,192 invariant actions\n- `forge fmt --check`","treeHash":"c8487afdd8e981749bff0a23c9073f4ea5abd3fd","usage":{"cachedInputTokens":324480,"inputTokens":59387,"model":"gpt-6-astra","outputTokens":14149,"runtime":"codex","turns":4,"wallClockMs":291428}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa4b91aed45c94fa","findings":[{"citation":"resolved","description":"DEPENDENCIES.md line 5 instructs the reader to verify the vendored snapshot with `sha256sum -c lib/SHA256SUMS`, and line 23 states that forge-std `src/` is included unmodified from v1.9.7. On the committed tree (HEAD 47f212f, git status clean) that check fails for seven forge-std files: lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol and interfaces/IMulticall3.sol. I confirmed that the hashes recorded in lib/SHA256SUMS are the genuine upstream v1.9.7 hashes (upstream Vm.sol fetched from the v1.9.7 tag hashes to 9068805b...2cb1, equal to the SHA256SUMS entry) and that the committed files differ from upstream only by whitespace (with all whitespace stripped, upstream and tree Vm.sol are byte-identical), consistent with `forge fmt` having been run over lib/. All five vendored OpenZeppelin v5.4.0 files, which are the only code the production token imports, are byte-identical to upstream and pass the check. forge-std is test-only, so there is no effect on MADToken's behaviour, bytecode or the launch; the defect is that the repository's own integrity claim and verification instruction are false as shipped, so a reviewer or deployer following the documented step gets a failure and cannot tell this benign reformatting apart from real tampering of a test dependency. This merges the audit_permissions [low] and audit_economics [info] findings, which share this one root cause. Note: the audit_economics claim that lib/SHA256SUMS is listed in .gitignore does not reproduce on this tree (.gitignore holds only /out/, /cache/, /broadcast/, /test/scratch/). Fix: restore the seven files to their upstream v1.9.7 bytes so the recorded hashes hold, or, if lib/ may not be touched, correct DEPENDENCIES.md to say forge-std src/ is reformatted and the recorded hashes are of the upstream files.","line":23,"path":"DEPENDENCIES.md","reproduction":"From the repository root on the committed tree run `sha256sum -c lib/SHA256SUMS`. Expected (per DEPENDENCIES.md lines 5 and 23): every line reports OK, exit status 0. Actual: 7 lines report FAILED (lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol), `sha256sum: WARNING: 7 computed checksums did NOT match`, exit status 1. Cross-check: `curl -sSL -o /tmp/Vm.sol https://raw.githubusercontent.com/foundry-rs/forge-std/v1.9.7/src/Vm.sol; sha256sum /tmp/Vm.sol lib/forge-std/src/Vm.sol` gives 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1 (upstream, equal to the SHA256SUMS line) versus a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15 (tree); `cmp <(tr -d ' \\n\\t\\r' < /tmp/Vm.sol) <(tr -d ' \\n\\t\\r' < lib/forge-std/src/Vm.sol)` reports no difference.","severity":"low","snippet":"- Included: unmodified `src/` and the two upstream license files.","title":"DEPENDENCIES.md provenance claim is false: seven vendored forge-std files fail the documented sha256sum check (whitespace-only reformatting, test-only code)"}],"hash":"729fa0553fa365a70e96ae41a026330997eb82e006177b4fe28d3da66a56d1c6","nodeId":"4a7429d0-4915-4fba-92d8-541ffed7ef27","outcome":"completed","summary":"Review complete. The findings file is written and no repository files were changed.\n\n**Outcome:** MADToken is a plain fixed-supply OpenZeppelin ERC-20 and I found no code defect. One specialist finding survives, merged from two reports, at low severity.\n\n**What I verified**\n- The token source is 17 lines: a zero-argument constructor minting exactly 10^27 units to the caller, with no owner, mint, burn, pause, upgrade, fallback or receive in the compiled ABI.\n- All five vendored OpenZeppelin files are byte-identical to upstream v5.4.0, fetched and compared directly.\n- All 47 project tests pass with the documented fuzz seed. My own scratch test over approve, transfer and transferFrom passed and was deleted afterwards.\n- Creation and runtime bytecode are far under the size limits, and no delegatecall, callcode or selfdestruct appears in the token or its dependencies.\n- The manifest matches the code: zero constructor arguments, supply equal to the mint, decimals 18, lowercase addresses, schema keys only.\n\n**Kept finding (low):** The documented provenance check in DEPENDENCIES.md fails. Seven forge-std files differ from the recorded v1.9.7 hashes. I confirmed the recorded hashes are the genuine upstream ones and the tree files differ only by whitespace, so it is a formatter pass over test-only code with no effect on the token. The audit_permissions and audit_economics reports share this root cause and are merged into one entry. The audit_economics claim that the hash file is gitignored did not reproduce and was dropped.\n\n**Coverage:** all three entry points answered as holds, plus rows for the constructor, manifest, deployability and dependency provenance. No proof test was attached since nothing reaches high severity.","treeHash":null,"usage":{"cachedInputTokens":443807,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":7868,"runtime":"claude","turns":10,"wallClockMs":135252}},{"artifacts":[],"attempt":1,"bundleHash":"519430e564c658ed1b6537055ee3598049552c1c45be51a410fd89af663e0741","device":"56e50117311155be","findings":[],"hash":"8075827eb3a3188631a0a056c9b21f20cfddb4761137c24be989a5ea6ef070db","nodeId":"7d72fe97-8bd1-4b8c-b708-910f8361a577","outcome":"completed","summary":"I added two test files and found no defects in the token. The full suite passes with the verifier's fuzz seed: 47 tests in 5 suites. `forge build` is clean.\n\nThe token is OpenZeppelin v5.4.0's standard ERC-20, unchanged, with one constructor mint of 10^27 (1,000,000,000 × 10^18) to the deployer. It has no owner, mint, burn, pause or other admin functions, and transfers take no fee. So there was nothing to put in `.imd-findings.json` and I didn't create it. The three test files already there are untouched.\n\n**`test/MADTokenAdversarialInvariant.t.sol`**: an invariant suite set to 256 runs of 100 calls (25,600 calls in total). Five holders start with uneven balances, and a sixth address that nobody ever funds or approves tries to spend.\n- **Valid calls:** transfer, sending a whole balance, approve (including unlimited), and `transferFrom`.\n- **Invalid calls, mixed in at random:**\n  - sending more than the balance\n  - sending to the zero address\n  - approving the zero address\n  - `transferFrom` above the allowance\n  - `transferFrom` above the balance while within the allowance\n  - `transferFrom` to the zero address\n  - pulling tokens with no approval\n\n  Each invalid call must revert with its exact error and leave every balance, allowance and the supply unchanged.\n- **Invariants checked after every call:**\n  - the supply stays fixed and all of it stays with the five holders\n  - the zero address, the token and the unapproved address hold nothing\n  - balances and allowances match a separate ledger the test keeps itself\n  - no invalid call ever succeeded or changed state\n\n**`test/MADTokenProperties.t.sol`**: fuzz tests with fixed edge cases alongside, mostly at 1,000 runs each.\n- **Fuzzed properties:**\n  - sending tokens and back restores the original state\n  - two transfers equal one transfer of their sum\n  - sending to yourself changes nothing\n  - repeating or replacing an approval behaves as expected\n  - an unlimited allowance never goes down\n  - an empty account can't send any positive amount\n  - a stranger can't pull from the deployer\n  - when a transfer exceeds both the allowance and the balance, the allowance error is the one reported\n- **Fixed edge cases:**\n  - an allowance one below the maximum does go down\n  - one wei moves exactly\n  - the zero address can't send, approve or be spent from\n- **Launch path:** deploying and distributing in one call, as a launch factory does in one transaction, and the whole launch reverting if it tries to hand out more than the supply.\n\nOne fuzz test failed on the first run. The cause was my test, not the token: it sends the same amount twice, so the inputs have to fit in half the supply. I fixed the input range and it now passes.\n\nI didn't commit anything; both new files are in the working tree, untracked.","treeHash":"ab95e7e096f0dd3680a83afb545a42daf972ee44","usage":{"cachedInputTokens":403490,"inputTokens":18,"model":"claude-opus-5-5","outputTokens":14617,"runtime":"claude","turns":12,"wallClockMs":236873}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a11137177fc72d8b","findings":[{"citation":"resolved","description":"DEPENDENCIES.md line 5 tells the reader to verify the vendored snapshot with `sha256sum -c lib/SHA256SUMS`, and line 23 states the forge-std `src/` tree is unmodified v1.9.7. In the committed tree (commit 2b4177e) that check fails for seven files: lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol and interfaces/IMulticall3.sol. The hashes recorded in lib/SHA256SUMS are the genuine upstream v1.9.7 hashes (I fetched the upstream files and they match the SUMS line for line), so it is the files in the tree that were altered, not the manifest of hashes. The alteration is formatting only: with all whitespace stripped every one of the seven files is byte-identical to upstream, consistent with a formatter having been run over lib/. No production code is affected: all OpenZeppelin files pass the check, the token imports only OpenZeppelin, and forge-std is test-only. The defect is that the repository's own integrity claim and verification instruction are false as shipped, so a reviewer or deployer following the documented step gets a failure and cannot distinguish this benign reformatting from a real tampering of a test dependency. Outside my assigned area (Access Control, Trust Gap, Asymmetry), reported because it is reproducible and contradicts the deliverable's documentation. Fix: either restore the seven files to their upstream bytes (so the recorded hashes hold) or, if lib/ may not be touched, correct DEPENDENCIES.md to state that forge-std src/ is reformatted and that the recorded hashes are of the upstream files, not of the tree.","line":23,"path":"DEPENDENCIES.md","reproduction":"From the repository root run: sha256sum -c lib/SHA256SUMS. Expected (per DEPENDENCIES.md lines 5 and 23): every line reports OK. Actual: 29 OK and 7 FAILED (StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol), exit status 1. Confirmation that the tree, not the hash list, drifted: sha256sum of upstream https://raw.githubusercontent.com/foundry-rs/forge-std/v1.9.7/src/Vm.sol is 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1, which equals the lib/SHA256SUMS entry, while the tree's lib/forge-std/src/Vm.sol hashes to a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15. `cmp <(tr -d ' \\n\\t\\r' < upstream/Vm.sol) <(tr -d ' \\n\\t\\r' < lib/forge-std/src/Vm.sol)` reports identical, i.e. whitespace-only differences.","severity":"low","snippet":"- Included: unmodified `src/` and the two upstream license files.","title":"Documented provenance check fails: seven vendored forge-std files differ from the recorded v1.9.7 hashes"}],"hash":"995c776518567c0d4f08539a3ba09b0c8ddf3a1507db427da6547d57a0f25fca","nodeId":"113af82e-57da-445f-a35d-0038d002e5a6","outcome":"completed","summary":"The review is complete and the findings file is written. No tracked files were changed, and the scratch tests were removed.\n\n**Result:** the MAD token holds in my area. It is the unmodified OpenZeppelin v5.4.0 ERC20 with one constructor mint of 10^27 units to the caller, no owner, no roles, no initializer, no fallback, and no forbidden opcodes. All three listed entry points were traced and marked `holds`.\n\n**What I checked:**\n- Access control: the compiled ABI exposes only `approve`, `transfer` and `transferFrom` as mutating functions. Twenty-four privileged selectors called from the deployer all revert. The CREATE2 fixture confirms the factory, not its caller, receives the whole supply.\n- Asymmetry: both transfer paths share the same internal update. The spend path differs only by the documented skipped Approval event and the untouched max-uint allowance. Burn is unreachable.\n- Trust gap: no fee, tax, parameter, or settable recipient exists, so no actor class is treated differently and launch flows move exact amounts.\n- Verification: the project's 31 tests, the format check, my reachable-opcode scan and a selector probe all pass. OpenZeppelin file hashes verify.\n\n**One finding, low severity:** the documented integrity check `sha256sum -c lib/SHA256SUMS` fails on seven forge-std files. The recorded hashes match upstream v1.9.7, so the tree drifted, not the hash list. With whitespace stripped the files are byte-identical to upstream, so this is formatting only and affects test code alone. It is reported because the dependency notes claim an unmodified tree and the verification step they prescribe fails as shipped.\n\n**Not reported:** the standard ERC-20 approve-replacement race, which is inherent to the interface and already documented in the README. The coverage record carries ten rows, three for the entry points and seven for invariants.","treeHash":null,"usage":{"cachedInputTokens":765927,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":15812,"runtime":"claude","turns":33,"wallClockMs":241215}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1a7606be97f168d4","findings":[{"citation":"resolved","description":"DEPENDENCIES.md line 5 tells a reviewer to verify the vendored snapshot with `sha256sum -c lib/SHA256SUMS`, and line 23 states forge-std `src/` is unmodified v1.9.7. Running the documented check on the committed tree (git status clean, HEAD 2b4177e) fails for seven forge-std files: StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol. I downloaded the upstream v1.9.7 tarball (its SHA-256 matches the one recorded in DEPENDENCIES.md) and diffed: the recorded hashes in lib/SHA256SUMS equal the upstream files, and the committed files differ from upstream only by `forge fmt` line re-wrapping (e.g. multi-line function headers joined to one line). No semantic change; the OpenZeppelin files (the only production dependency) all pass. This is test-only tooling and not an economic or security defect of MADToken; it is reported so the author can either restore the pristine files or regenerate SHA256SUMS, since the documented provenance check currently fails and the 'unmodified' statement is inaccurate. (lib/SHA256SUMS is also listed in .gitignore while being tracked.)","line":23,"path":"DEPENDENCIES.md","reproduction":"From the repository root on the committed tree: `sha256sum -c lib/SHA256SUMS`. Expected (per DEPENDENCIES.md): all OK. Actual: 'sha256sum: WARNING: 7 computed checksums did NOT match' for lib/forge-std/src/{StdAssertions,StdJson,StdToml,Vm,console}.sol and lib/forge-std/src/interfaces/{IERC7540,IMulticall3}.sol. Cross-check: `curl -sL https://codeload.github.com/foundry-rs/forge-std/tar.gz/refs/tags/v1.9.7 | tar xz` then `sha256sum forge-std-1.9.7/src/Vm.sol` gives 9068805b...2cb1, equal to the lib/SHA256SUMS entry, while `diff forge-std-1.9.7/src/Vm.sol lib/forge-std/src/Vm.sol` shows only whitespace/line-wrapping differences.","severity":"info","snippet":"- Included: unmodified `src/` and the two upstream license files.","title":"DEPENDENCIES.md provenance claim for forge-std does not hold: 7 vendored files fail lib/SHA256SUMS (forge fmt re-wrapping only, no semantic change)"}],"hash":"c726d819c862b300e9a2f43a91907ea521fba1dde43add0fe7f23bc5575041d9","nodeId":"49b779f5-5cb3-42b5-921c-07d5e1d02ee3","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. The working tree is clean apart from that output file.\n\n**Outcome: no economic defect in the token.** `MADToken` is the unmodified OpenZeppelin v5.4.0 ERC20 (the OZ files pass their recorded checksums) with one constructor mint of 10^27 units to `msg.sender`. I checked it against the Economic Security, Invariant and Flow Gap guides and against the protected launch harness, and every failure mode they list is structurally absent.\n\nWhat I verified, with a scratch Foundry test mirroring the protected harness plus the project's own 31 passing tests:\n\n- **Supply and minting.** Total supply equals exactly 1,000,000,000 × 10^18, minted once to the deploying factory. Mint is internal and unreachable after construction. Twenty-two common mint, admin, pause, freeze, blacklist and burnFrom selectors revert from both a stranger and the factory, and supply never changes.\n- **Launch flows are exact.** The 10% distributor leg, 80% pool leg, 10% remainder, a claim, and a buy and sell through transfer and transferFrom each move precisely the stated amount. No fee, burn, hook, exemption list or callback exists to short any leg.\n- **Invariants.** Sum of balances equals total supply; allowances consume exactly, max-uint allowance is not decremented; failed transfers roll back atomically. The project's stateful invariant run (128 runs × 64 depth, zero reverts) agrees.\n- **Privileged hand and bytecode.** No owner, roles, receive or fallback. The factory cannot move a holder's balance without allowance. The runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT and is under the EIP-170 limit.\n\nThe aderyn \"large numeric literal\" lead is the constant `1_000_000_000 * 10 ** 18`, which evaluates to 10^27 and is confirmed at runtime. Not a defect.\n\n**One info-level finding reported.** DEPENDENCIES.md says forge-std is unmodified and tells reviewers to run `sha256sum -c lib/SHA256SUMS`, but that check fails for seven forge-std files. I downloaded upstream v1.9.7 and diffed: the recorded hashes match upstream, and the committed files differ only by `forge fmt` line re-wrapping. It is test-only tooling with no semantic change and no bearing on the token's economics, so the author only needs to restore the pristine files or regenerate the checksum list.\n\n**Coverage.** All three entry points (approve, transfer, transferFrom) are recorded as holds, with three invariant rows also holding. The manifest row is unreached because no launch.json exists yet; when written it needs empty constructorArgs, decimals 18 and totalSupply of 1000000000000000000000000000.","treeHash":null,"usage":{"cachedInputTokens":783570,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":15391,"runtime":"claude","turns":21,"wallClockMs":225231}}],"verification":[{"checks":[{"durationMs":2802,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.65s\nCompiler run successful!\n","passed":true},{"durationMs":4286,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/MADTokenLaunch.t.sol:MADTokenLaunchTest\n[PASS] test_Create2FactoryReceivesEntireSupplyInsteadOfItsCaller() (gas: 236704)\n[PASS] test_LaunchDistributionClaimsAndTradingTransfersAreExact() (gas: 588195)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.02ms (1.69ms CPU time)\n\nRan 28 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_RevertWhenAllowanceIsInsufficient(uint256,uint256) (runs: 256, μ: 127616, ~: 128209)\nLogs:\n  Bound result 56361601627656\n  Bound result 224397066731017382637017947\n\n[PASS] testFuzz_RevertWhenTransferExceedsBalance(uint256) (runs: 256, μ: 71837, ~: 72153)\nLogs:\n  Bound result 10759280468103238718190201617981077\n\n[PASS] testFuzz_TransferFromConsumesOnlyApprovedAmount(uint256,uint256) (runs: 256, μ: 169988, ~: 171655)\nLogs:\n  Bound result 8\n  Bound result 5\n\n[PASS] testFuzz_TransferPreservesSupplyAndBalances(address,uint256) (runs: 256, μ: 99688, ~: 99941)\nLogs:\n  Bound result 420769809853103338844039156\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 174727)\n[PASS] test_ApprovalDoesNotAuthorizeAnotherSpender() (gas: 95334)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveBalance() (gas: 93599)\n[PASS] test_ConstructorEmitsOneMintForEntireSupply() (gas: 12235)\n[PASS] test_DeployerCannotSpendHolderTokensWithoutApproval() (gas: 155191)\n[PASS] test_EntireBalanceCanBeTransferred() (gas: 141423)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 131669)\n[PASS] test_MetadataAndEntireSupply() (gas: 111825)\n[PASS] test_NoMintBurnAdminOrUpgradeEntryPoints() (gas: 1303630)\n[PASS] test_RejectsNativeEther() (gas: 39479)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 32861)\n[PASS] test_RevertWhenEmptyAccountTransfers() (gas: 37929)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 57667)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 120531)\n[PASS] test_RevertWhenTransferFromExceedsBalanceRestoresAllowance() (gas: 126156)\n[PASS] test_RevertWhenTransferFromToZeroRestoresAllowance() (gas: 108588)\n[PASS] test_RevertWhenTransferToZeroIncludingZeroAmount() (gas: 76925)\n[PASS] test_SelfTransferPreservesBalanceAndSupply() (gas: 54142)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 96196)\n[PASS] test_TransferFromDeliversExactAmountAndConsumesAllowance() (gas: 240914)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 110170)\n[PASS] test_TransferToContractNeedsNoReceiverCallback() (gas: 174263)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73332)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 63873)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 20.04ms (67.64ms CPU time)\n\nRan 1 test for test/MADTokenInvariant.t.sol:MADTokenInvariantTest\n[PASS] invariant_SupplyBalancesAndAllowancesMatchModel() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+--------------+-------+---------+----------╮\n| Contract        | Selector     | Calls | Reverts | Discards |\n+=============================================================+\n| MADTokenHandler | approve      | 2755  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| MADTokenHandler | transfer     | 2705  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| MADTokenHandler | transferFrom | 2732  | 0       | 0        |\n╰-----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 139543333598603747942728870\n  Bound result 295\n  Bound result 0\n  Bound result 4772\n  Bound result 0\n  Bound result 0\n  Bound result 486127199832817077990242809\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 255\n  Bound result 0\n  Bound result 366719259508589658061851983\n  Bound result 2091\n  Bound result 0\n  Bound result 11\n  Bound result 202814922927242713513481472\n  Bound result 0\n  Bound result 410\n  Bound result 11\n  Bound result 0\n  Bound result 10\n  Bound result 5938\n  Bound result 509\n  Bound result 3\n  Bound result 3\n  Bound result 2248\n  Bound result 0\n  Bound result 158\n  Bound result 123456000000000000000000\n  Bound result 656\n  Bound result 11\n  Bound result 3853196192403174\n  Bound result 1\n  Bound result 3\n  Bound result 24576\n  Bound result 7125644758291579730\n  Bound result 12772098214386812009231380\n  Bound result 1294\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.14s (4.14s CPU time)\n\nRan 3 test suites in 4.14s (4.16s CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":76,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":27,\"README.md\":110,\"foundry.toml\":20,\"launch.json\":24,\"remappings.txt\":2,\"src/MADToken.sol\":17,\"test/MADToken.t.sol\":350,\"test/MADTokenInvariant.t.sol\":94,\"test/MADTokenLaunch.t.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2af81933da88e9cb2efee77065dc8972648dc5e3b482ab496ebd529a57a2f102","verifiedTreeHash":"a5ee7e9c58c6a26db87b7c86a4a02e07c7d78c40","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":1169,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.10s\nCompiler run successful!\n","passed":true},{"durationMs":2340,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/MADTokenLaunch.t.sol:MADTokenLaunchTest\n[PASS] test_Create2FactoryReceivesEntireSupplyInsteadOfItsCaller() (gas: 236704)\n[PASS] test_LaunchDistributionClaimsAndTradingTransfersAreExact() (gas: 588195)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.10ms (864.43µs CPU time)\n\nRan 28 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_RevertWhenAllowanceIsInsufficient(uint256,uint256) (runs: 256, μ: 127616, ~: 128209)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 999999999000000000000019181\n\n[PASS] testFuzz_RevertWhenTransferExceedsBalance(uint256) (runs: 256, μ: 71837, ~: 72153)\nLogs:\n  Bound result 838276976678212053545112180854163745924444649325691545520904\n\n[PASS] testFuzz_TransferFromConsumesOnlyApprovedAmount(uint256,uint256) (runs: 256, μ: 169988, ~: 171655)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] testFuzz_TransferPreservesSupplyAndBalances(address,uint256) (runs: 256, μ: 99688, ~: 99941)\nLogs:\n  Bound result 3363712691\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 174727)\n[PASS] test_ApprovalDoesNotAuthorizeAnotherSpender() (gas: 95334)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveBalance() (gas: 93599)\n[PASS] test_ConstructorEmitsOneMintForEntireSupply() (gas: 12235)\n[PASS] test_DeployerCannotSpendHolderTokensWithoutApproval() (gas: 155191)\n[PASS] test_EntireBalanceCanBeTransferred() (gas: 141423)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 131669)\n[PASS] test_MetadataAndEntireSupply() (gas: 111825)\n[PASS] test_NoMintBurnAdminOrUpgradeEntryPoints() (gas: 1303630)\n[PASS] test_RejectsNativeEther() (gas: 39479)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 32861)\n[PASS] test_RevertWhenEmptyAccountTransfers() (gas: 37929)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 57667)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 120531)\n[PASS] test_RevertWhenTransferFromExceedsBalanceRestoresAllowance() (gas: 126156)\n[PASS] test_RevertWhenTransferFromToZeroRestoresAllowance() (gas: 108588)\n[PASS] test_RevertWhenTransferToZeroIncludingZeroAmount() (gas: 76925)\n[PASS] test_SelfTransferPreservesBalanceAndSupply() (gas: 54142)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 96196)\n[PASS] test_TransferFromDeliversExactAmountAndConsumesAllowance() (gas: 240914)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 110170)\n[PASS] test_TransferToContractNeedsNoReceiverCallback() (gas: 174263)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73332)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 63873)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 9.39ms (35.56ms CPU time)\n\nRan 1 test for test/MADTokenInvariant.t.sol:MADTokenInvariantTest\n[PASS] invariant_SupplyBalancesAndAllowancesMatchModel() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+--------------+-------+---------+----------╮\n| Contract        | Selector     | Calls | Reverts | Discards |\n+=============================================================+\n| MADTokenHandler | approve      | 2755  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| MADTokenHandler | transfer     | 2705  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| MADTokenHandler | transferFrom | 2732  | 0       | 0        |\n╰-----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 139543333598603747942728870\n  Bound result 295\n  Bound result 0\n  Bound result 4772\n  Bound result 0\n  Bound result 0\n  Bound result 486127199832817077990242809\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 255\n  Bound result 0\n  Bound result 366719259508589658061851983\n  Bound result 2091\n  Bound result 0\n  Bound result 11\n  Bound result 202814922927242713513481472\n  Bound result 0\n  Bound result 410\n  Bound result 11\n  Bound result 0\n  Bound result 10\n  Bound result 5938\n  Bound result 509\n  Bound result 3\n  Bound result 3\n  Bound result 2248\n  Bound result 0\n  Bound result 158\n  Bound result 123456000000000000000000\n  Bound result 656\n  Bound result 11\n  Bound result 3853196192403174\n  Bound result 1\n  Bound result 3\n  Bound result 24576\n  Bound result 7125644758291579730\n  Bound result 12772098214386812009231380\n  Bound result 1294\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.26s (2.26s CPU time)\n\nRan 3 test suites in 2.26s (2.27s CPU time): 31 tests passed, 0 failed, 0 skipped (31 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\":4,\"DEPENDENCIES.md\":27,\"README.md\":110,\"foundry.toml\":20,\"remappings.txt\":2,\"src/MADToken.sol\":17,\"test/MADToken.t.sol\":350,\"test/MADTokenInvariant.t.sol\":94,\"test/MADTokenLaunch.t.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":415,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":212,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/MADToken.sol:12: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"548b96cf7085304e87abdcb085eb3d02bef2ef830ee20d0c9e6aaac4b030bc7d","verifiedTreeHash":"c8487afdd8e981749bff0a23c9073f4ea5abd3fd","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":4139,"exitCode":0,"name":"build","output":"Compiling 30 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.98s\nCompiler run successful!\n","passed":true},{"durationMs":32952,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/MADTokenLaunch.t.sol:MADTokenLaunchTest\n[PASS] test_Create2FactoryReceivesEntireSupplyInsteadOfItsCaller() (gas: 236704)\n[PASS] test_LaunchDistributionClaimsAndTradingTransfersAreExact() (gas: 588195)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.87ms (1.54ms CPU time)\n\nRan 28 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_RevertWhenAllowanceIsInsufficient(uint256,uint256) (runs: 256, μ: 127546, ~: 128211)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 999999999000000000000019181\n\n[PASS] testFuzz_RevertWhenTransferExceedsBalance(uint256) (runs: 256, μ: 71821, ~: 72153)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007917331687123\n\n[PASS] testFuzz_TransferFromConsumesOnlyApprovedAmount(uint256,uint256) (runs: 256, μ: 169481, ~: 171655)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 19181\n\n[PASS] testFuzz_TransferPreservesSupplyAndBalances(address,uint256) (runs: 256, μ: 99815, ~: 99953)\nLogs:\n  Bound result 30000000000000000000\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 174727)\n[PASS] test_ApprovalDoesNotAuthorizeAnotherSpender() (gas: 95334)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveBalance() (gas: 93599)\n[PASS] test_ConstructorEmitsOneMintForEntireSupply() (gas: 12235)\n[PASS] test_DeployerCannotSpendHolderTokensWithoutApproval() (gas: 155191)\n[PASS] test_EntireBalanceCanBeTransferred() (gas: 141423)\n[PASS] test_InfiniteAllowanceIsNotDecremented() (gas: 131669)\n[PASS] test_MetadataAndEntireSupply() (gas: 111825)\n[PASS] test_NoMintBurnAdminOrUpgradeEntryPoints() (gas: 1303630)\n[PASS] test_RejectsNativeEther() (gas: 39479)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 32861)\n[PASS] test_RevertWhenEmptyAccountTransfers() (gas: 37929)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 57667)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 120531)\n[PASS] test_RevertWhenTransferFromExceedsBalanceRestoresAllowance() (gas: 126156)\n[PASS] test_RevertWhenTransferFromToZeroRestoresAllowance() (gas: 108588)\n[PASS] test_RevertWhenTransferToZeroIncludingZeroAmount() (gas: 76925)\n[PASS] test_SelfTransferPreservesBalanceAndSupply() (gas: 54142)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 96196)\n[PASS] test_TransferFromDeliversExactAmountAndConsumesAllowance() (gas: 240914)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 110170)\n[PASS] test_TransferToContractNeedsNoReceiverCallback() (gas: 174263)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73332)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 63873)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 159.01ms (450.30ms CPU time)\n\nRan 15 tests for test/MADTokenProperties.t.sol:MADTokenPropertiesTest\n[PASS] testFuzz_AllowanceIsCheckedBeforeBalance(uint256,uint256,uint256) (runs: 1000, μ: 172048, ~: 173375)\nLogs:\n  Bound result 29850650126644399\n  Bound result 1000000000000000002\n\n[PASS] testFuzz_ApproveIsIdempotentAndOverwrites(uint256,uint256,uint256) (runs: 1000, μ: 149585, ~: 149717)\n[PASS] testFuzz_DeployAndDistributeInOneCall(uint256,uint256) (runs: 500, μ: 408609, ~: 410172)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 0\n\n[PASS] testFuzz_EmptyAccountCannotSendAnyPositiveAmount(uint256,uint256) (runs: 1000, μ: 51166, ~: 51127)\nLogs:\n  Bound result 51328333066675893755478126\n\n[PASS] testFuzz_SelfTransferIsANoOp(uint256) (runs: 1000, μ: 57794, ~: 57530)\nLogs:\n  Bound result 788541586804224482101271458\n\n[PASS] testFuzz_SplitTransfersEqualOneTransfer(uint256,uint256,uint256) (runs: 1000, μ: 206765, ~: 206882)\nLogs:\n  Bound result 1\n  Bound result 3163982752\n\n[PASS] testFuzz_StrangerCannotPullFromDeployer(uint256,uint256) (runs: 1000, μ: 62112, ~: 62072)\nLogs:\n  Bound result 51328333066675893755478126\n\n[PASS] testFuzz_TransferRoundTripRestoresState(uint256,uint256) (runs: 1000, μ: 128749, ~: 128858)\nLogs:\n  Bound result 124169031527037040392949214\n\n[PASS] testFuzz_UnlimitedAllowanceNeverDecreases(uint256,uint256,uint256) (runs: 1000, μ: 183004, ~: 183133)\nLogs:\n  Bound result 417586201836107122572000819\n  Bound result 543420063678468492838789425\n\n[PASS] test_AllowanceOneBelowMaxIsDecremented() (gas: 125574)\n[PASS] test_DistributingMoreThanSupplyInOneCallRevertsWholeLaunch() (gas: 337623)\n[PASS] test_EachDeploymentIsIndependentAndMintsOnce() (gas: 42575)\n[PASS] test_OneWeiMovesExactly() (gas: 82340)\n[PASS] test_SpendingFromZeroAddressReverts() (gas: 62452)\n[PASS] test_ZeroAddressCannotTransferOrApprove() (gas: 64824)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 159.45ms (1.36s CPU time)\n\nRan 1 test for test/MADTokenInvariant.t.sol:MADTokenInvariantTest\n[PASS] invariant_SupplyBalancesAndAllowancesMatchModel() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+--------------+-------+---------+----------╮\n| Contract        | Selector     | Calls | Reverts | Discards |\n+=============================================================+\n| MADTokenHandler | approve      | 2755  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| MADTokenHandler | transfer     | 2705  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| MADTokenHandler | transferFrom | 2732  | 0       | 0        |\n╰-----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 139543333598603747942728870\n  Bound result 295\n  Bound result 6\n  Bound result 4781\n  Bound result 0\n  Bound result 0\n  Bound result 486127199832817075948059469\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 293\n  Bound result 0\n  Bound result 366719165297237758395762709\n  Bound result 4194\n  Bound result 0\n  Bound result 4\n  Bound result 4806\n  Bound result 0\n  Bound result 5526\n  Bound result 16\n  Bound result 0\n  Bound result 18\n  Bound result 5938\n  Bound result 3041954474\n  Bound result 5267\n  Bound result 9\n  Bound result 3\n  Bound result 11\n  Bound result 0\n  Bound result 1000000000000000001\n  Bound result 656\n  Bound result 1\n  Bound result 3853196192403174\n  Bound result 8\n  Bound result 3\n  Bound result 74012602453254234735919701\n  Bound result 0\n  Bound result 266561667413230875593269866\n  Bound result 0\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.81s (4.80s CPU time)\n\nRan 1 test for test/MADTokenAdversarialInvariant.t.sol:MADTokenAdversarialInvariantTest\n[PASS]\nMADTokenAdversarialInvariantTest invariants:\n[PASS] invariant_BalancesAndAllowancesMatchModel\n[PASS] invariant_RejectedCallsRevertExactlyAndChangeNothing\n[PASS] invariant_SupplyIsFixedAndFullyHeldByActors\n MADTokenAdversarialInvariantTest invariants (runs: 256, calls: 25600, reverts: 0)\n\n╭-----------------------+-------------------------------+-------+---------+----------╮\n| Contract              | Selector                      | Calls | Reverts | Discards |\n+====================================================================================+\n| MADAdversarialHandler | approve                       | 2351  | 0       | 0        |\n|-----------------------+-------------------------------+-------+---------+----------|\n| MADAdversarialHandler | approveZeroSpender            | 2332  | 0       | 0        |\n|-----------------------+-------------------------------+-------+---------+----------|\n| MADAdversarialHandler | outsiderSpendsWithoutApproval | 2378  | 0       | 0        |\n|-----------------------+-------------------------------+-------+---------+----------|\n| MADAdversarialHandler | transfer                      | 2340  | 0       | 0        |\n|-----------------------+-------------------------------+-------+---------+----------|\n| MADAdversarialHandler | transferFrom                  | 2354  | 0       | 0        |\n|-----------------------+-------------------------------+-------+---------+----------|\n| MADAdversarialHandler | transferFromBeyondAllowance   | 2239  | 0       | 0        |\n|-----------------------+-------------------------------+-------+---------+----------|\n| MADAdversarialHandler | transferFromBeyondBalance     | 2259  | 0       | 0        |\n|-----------------------+-------------------------------+-------+---------+----------|\n| MADAdversarialHandler | transferFromToZeroAddress     | 2373  | 0       | 0        |\n|-----------------------+-------------------------------+-------+---------+----------|\n| MADAdversarialHandler | transferMoreThanBalance       | 2306  | 0       | 0        |\n|-----------------------+-------------------------------+-------+---------+----------|\n| MADAdversarialHandler | transferToZeroAddress         | 2396  | 0       | 0        |\n|-----------------------+-------------------------------+-------+---------+----------|\n| MADAdversarialHandler | transferWholeBalance          | 2272  | 0       | 0        |\n╰-----------------------+-------------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1957\n  Bound result 1089\n  Bound result 763600051\n  Bound result 1138\n  Bound result 115792089237316195423570985008687907853269984665640501539457584007913129648040\n  Bound result 1903694785843236693685998428466475645521\n  Bound result 0\n  Bound result 0\n  Bound result 1773\n  Bound result 50\n  Bound result 62500000000000000000000001\n  Bound result 0\n  Bound result 123456000000000000000000\n  Bound result 0\n  Bound result 211801473\n  Bound result 8\n  Bound result 2237179190606539636632613554896502349814515513604929233923950617085635\n  Bound result 122\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639933\n  Bound result 16\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640439039457584007913893239978\n  Bound result 7207\n  Bound result 3855\n  Bound result 0\n  Bound result 1313373042\n  Bound result 0\n  Bound result 0\n  Bound result 203840\n  Bound result 0\n  Bound result 235\n  Bound result 123000000000000000000\n  Bound result 100000000000000000000\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129641367\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n  Bound result 24576\n  Bound result 249999999999999999999988582\n  Bound result 750000000000000000000011434\n  Bound result 1000000000000000001\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129651369\n  Bound result 8745\n  Bound result 6011003\n  Bound result 0\n  Bound result 7201\n  Bound result 0\n  Bound result 0\n  Bound result 4723\n  Bound result 9\n  Bound result 0\n  Bound result 2\n  Bound result 14\n  Bound result 0\n  Bound result 812\n  Bound result 877\n  Bound result 1000000000000000001\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 32.76s (32.76s CPU time)\n\nRan 5 test suites in 32.77s (37.90s CPU time): 47 tests passed, 0 failed, 0 skipped (47 total tests)\n","passed":true},{"durationMs":75,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":27,\"README.md\":110,\"foundry.toml\":20,\"remappings.txt\":2,\"src/MADToken.sol\":17,\"test/MADToken.t.sol\":350,\"test/MADTokenAdversarialInvariant.t.sol\":272,\"test/MADTokenInvariant.t.sol\":94,\"test/MADTokenLaunch.t.sol\":78,\"test/MADTokenProperties.t.sol\":223},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8075827eb3a3188631a0a056c9b21f20cfddb4761137c24be989a5ea6ef070db","verifiedTreeHash":"ab95e7e096f0dd3680a83afb545a42daf972ee44","verifierVersion":"0.1.0+560ab6a2"}]}