{"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":"6c05194f-48ff-45c6-a97a-62705fad1a3e","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"bacf1ffa4bfcd8de4c14b9c9ea72111da1e4813b9e7f806f46fe8808610ef5fe","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":"a3e26c37a868ea7e464e3fb5dcfa3ba93442cc10a9a6ed722d08bb7930457807","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":"45e568c32f297630cf7e27e94e02409d83e29a6901be0eef0f5fc1e8d73ba55b","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":"3316ff1c3c07d3aafecdaaefc2e293c946f424041c39af26f4fc211c9d044f9d","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":"c6f1135a0d40bb9d5deecb921088f18bff89e5b3cfc0a8ad931dd4ce845e4a5a","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":"d7d028808624b406662ed55bf9e05ce20433c593441560292de208370381d6a9","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":"8a0c424db937fb7b06b539f34c3d45d870595fd75cf69efffbdeb8f072dd6919","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"d351ec8163736370f44416c4cafdd81d1f1d1864ef364efbd679f2e4a5bf2d7d","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":"b119d343bb494eef3250fdd5fac5deed4d20ca11e8ad8f039df9a8f3c35b9617","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"6c05194f-48ff-45c6-a97a-62705fad1a3e","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2487-mutually-assured-destruction"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51558","feedbackHash":"98b01f95d622dbed3f6ae79fd993de30aca006983272aabd7cecb48fadb8c1fa","nodeKey":"audit_economics","submissionHash":"bacf1ffa4bfcd8de4c14b9c9ea72111da1e4813b9e7f806f46fe8808610ef5fe","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53927","feedbackHash":"87548b924518fd6e36fdcce1fba47789aea024e4250073d584ea53f2186cdc4d","nodeKey":"audit_flow","submissionHash":"a3e26c37a868ea7e464e3fb5dcfa3ba93442cc10a9a6ed722d08bb7930457807","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50966","feedbackHash":"5b6e50d0e39fde23e01bc0f15d84fb9120da5b8c2c95f5d781ecb786767554c6","nodeKey":"audit_judge","submissionHash":"45e568c32f297630cf7e27e94e02409d83e29a6901be0eef0f5fc1e8d73ba55b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51430","feedbackHash":"6e844d534287b833aaa6d29d8725a39d79b20f9ebe96a4a65e9307a829655064","nodeKey":"audit_math","submissionHash":"3316ff1c3c07d3aafecdaaefc2e293c946f424041c39af26f4fc211c9d044f9d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52017","feedbackHash":"251f48416d056f975ce20cfe47c692bf59b3b2934ca98cf181c3d0145f1ef48f","nodeKey":"audit_permissions","submissionHash":"c6f1135a0d40bb9d5deecb921088f18bff89e5b3cfc0a8ad931dd4ce845e4a5a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52471","feedbackHash":"d19a31f691f67df014a2009686defa014a6ed8c549b245d4f4ccac4cdd895ff3","nodeKey":"build_contract_project","submissionHash":"d7d028808624b406662ed55bf9e05ce20433c593441560292de208370381d6a9","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52568","feedbackHash":"0d5b3c73b36bf0a0d03fd65941ee67574d116954b3cc08e0477855b8f0fb97bb","nodeKey":"manifest","submissionHash":"8a0c424db937fb7b06b539f34c3d45d870595fd75cf69efffbdeb8f072dd6919","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52216","feedbackHash":"dfbede63d7470729b2ab27c443a9c6da420a6b31d2e2fc7aee6002f8a92335c1","nodeKey":"write_foundry_tests","submissionHash":"d351ec8163736370f44416c4cafdd81d1f1d1864ef364efbd679f2e4a5bf2d7d","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"e03ad4a1c9cb042a51ff971a1eb2f9f0cdaa910decd90070cf26dd9f14f58286","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2a5d68f89de314cb","findings":[{"citation":"resolved","description":"Outside the math area, reported because it breaks the provenance check the README asks a reviewer to run. lib/README.md states the vendored sources are unmodified and that lib/SHA256SUMS records each delivered file, and the root README points reviewers at it. Running the checksum file against the tree fails for 23 of its 36 entries, including the one file whose bytes reach the deployed contract: lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol (recorded 2d874da1..., actual 4a1db79b...) and interfaces/draft-IERC6093.sol. I downloaded the OpenZeppelin v5.0.2 archive named in lib/README.md (its SHA-256 18c7b7e9... matches the README) and diffed every vendored OpenZeppelin file: the only differences are `forge fmt` line reflows (the `_approve(address,address,uint256,bool)` signature in ERC20.sol and the `ERC1155InsufficientBalance` error declaration in draft-IERC6093.sol). No semantic change; transfer, allowance and supply arithmetic are upstream's, and with bytecode_hash = \"none\" the reflow does not change runtime bytecode. The forge-std v1.9.7 files (test-only) also differ from the archive, again consistent with reformatting. So the token is not compromised, but the shipped integrity record cannot be used to verify that: a reviewer who follows the README gets 23 failures and has to repeat the upstream diff. Fix: regenerate lib/SHA256SUMS from the tree as delivered (or restore the unformatted upstream bytes and exclude lib/ from forge fmt), and reword lib/README.md to say the files are reformatted copies of the named archive, since the current sentence is not true as written.","line":4,"path":"lib/README.md","reproduction":"From the repository root run `sha256sum -c lib/SHA256SUMS`. Expected per lib/README.md: every line reports OK. Actual: 13 OK, 23 FAILED, including `lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol: FAILED` and `lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol: FAILED`. `sha256sum lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol` prints 4a1db79b7b76a41b1d228242ad369c24fb293be6a62cd00b7e286333e965df59 while the SUMS file records 2d874da1c1478ed22a2d30dcf1a6ec0d09a13f897ca680d55fb49fbcc0e0c5b1. Then `diff <(tar -xOzf v5.0.2.tar.gz openzeppelin-contracts-5.0.2/contracts/token/ERC20/ERC20.sol) lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol` shows only the four-line reflow of the `_approve` signature at line 284.","severity":"low","snippet":"Upstream sources are unmodified. `SHA256SUMS` records each delivered dependency file.","title":"lib/SHA256SUMS does not match the delivered dependency files; provenance claim 'Upstream sources are unmodified' is false byte-for-byte"}],"hash":"3316ff1c3c07d3aafecdaaefc2e293c946f424041c39af26f4fc211c9d044f9d","nodeId":"ebf5c465-f50b-4a5e-9d16-37c1189c4341","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. The tree is otherwise untouched.\n\n**Outcome:** the token's arithmetic is sound. Every Math Precision, Boundary and Numerical Gap check I could apply to this code holds, and I found one low-severity provenance defect outside the math area.\n\n**What was checked**\n\n- `MADToken` is a plain OpenZeppelin v5.0.2 ERC-20 with one constant and one mint in the constructor. The supply literal folds to exactly 10^27 and cannot overflow, which closes the aderyn large-literal lead.\n- All three entry points were traced through the vendored `_update`, `_spendAllowance` and `_approve`. The unchecked subtractions are guarded by prior comparisons, the unchecked additions are bounded by the fixed supply, and self-transfer reads the balance once so it is unchanged.\n- A scratch Foundry suite of 12 tests exercised the edges: max-uint amounts, whole-supply round trips, zero amounts to and from empty accounts, unlimited versus max-minus-one allowances, allowance larger than balance, spender equal to owner, and ETH sent with or without calldata. All passed, and the scratch directory was removed afterwards.\n- Launch arithmetic: the supply divides by 10,000 exactly, so the 10/80/10 split has no truncation. Both currencies have 18 decimals, and the derived sqrt price and seed liquidity for the 2,000,000 FWA cap sit well inside Uniswap v4's bounds. The deployer's own liquidity code was not available, so that row is marked as reasoning only.\n- The token has no external calls, no payable path, no bytes decoding and no division, so the Boundary and Numerical Gap seams have nothing to attach to.\n\n**The one finding (low):** `lib/SHA256SUMS` fails for 23 of its 36 entries, including the vendored `ERC20.sol`, while `lib/README.md` says the sources are unmodified. I downloaded the v5.0.2 archive the README names, confirmed its hash, and diffed every OpenZeppelin file. The only differences are `forge fmt` line reflows, so the deployed logic is upstream's. The fix is to regenerate the checksum file from the delivered tree and reword the provenance note.\n\n**Coverage:** all three ABI entry points are recorded as `holds`, plus five invariant rows. Nothing in the assigned area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":819996,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":14673,"runtime":"claude","turns":19,"wallClockMs":229017}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"759c614fdc84ff66","findings":[{"citation":"resolved","description":"Merged from audit_economics, audit_flow, audit_math and audit_permissions (same root cause). lib/README.md line 4 claims the vendored OpenZeppelin v5.0.2 and forge-std v1.9.7 sources are unmodified and that lib/SHA256SUMS records each delivered file; README.md line 59 points reviewers to it. SHA256SUMS holds the byte-exact upstream hashes, but 23 delivered files were re-wrapped by forge fmt (line_length = 100) after the hashes were taken, so the check fails, including for lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol, the only dependency whose code reaches MADToken's bytecode. I confirmed the content is semantically upstream: the downloaded v5.0.2 archive hashes to 18c7b7e9...925a (as lib/README.md records) and all five vendored OpenZeppelin .sol files are identical to it after stripping whitespace; the only diffs are the _approve(address,address,uint256,bool) signature at ERC20.sol:284 split over four lines and the ERC1155InsufficientBalance error at draft-IERC6093.sol:121 split over three. No runtime, economic or access-control effect: MADToken's approve/transfer/transferFrom are upstream ERC20. The defect is only that the integrity record the project tells reviewers to rely on cannot verify the tree, so a semantic edit would be indistinguishable from this formatting noise by checksum alone. Fix: regenerate lib/SHA256SUMS from the delivered files and reword the claim to 'reformatted copies of the named upstream archives', or restore the 23 files to upstream bytes (default forge fmt --check does not cover lib/).","line":4,"path":"lib/README.md","reproduction":"From the repository root run `sha256sum -c lib/SHA256SUMS`. Expected per lib/README.md:4: every line OK. Actual: 13 OK, 23 FAILED, ending `sha256sum: WARNING: 23 computed checksums did NOT match`; failures include lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol and lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol plus 21 forge-std files (Vm.sol, console.sol, safeconsole.sol, StdStorage.sol, ...). `diff <(tar -xOzf v5.0.2.tar.gz openzeppelin-contracts-5.0.2/contracts/token/ERC20/ERC20.sol) lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol` shows only the line-284 reflow.","severity":"low","snippet":"Upstream sources are unmodified. `SHA256SUMS` records each delivered dependency file.","title":"lib/SHA256SUMS fails on 23 of 36 delivered dependency files, so the documented 'unmodified upstream' provenance check is false as shipped"}],"hash":"45e568c32f297630cf7e27e94e02409d83e29a6901be0eef0f5fc1e8d73ba55b","nodeId":"acf2b613-5eef-4046-98de-272116220685","outcome":"completed","summary":"The review is finished. I kept one finding, a low-severity mismatch in the dependency checksum record, and it doesn't affect how the token behaves. I changed no repository files; my results are in `.imd-findings.json`.\n\n**The kept finding.** All four specialists reported the same root cause, so I merged it into one finding. `lib/README.md:4` says the vendored dependency files are unmodified and that `lib/SHA256SUMS` records each one. That isn't true as shipped.\n- **Reproduction:** running `sha256sum -c lib/SHA256SUMS` gives 13 OK and 23 FAILED. The failures include the OpenZeppelin `ERC20.sol` that `MADToken` inherits from.\n- **Cause:** I downloaded the upstream OpenZeppelin v5.0.2 archive, and its hash matches the one the README records. All five vendored OpenZeppelin files match upstream once whitespace is ignored. The only differences are two lines the code formatter re-wrapped (`ERC20.sol:284` and `draft-IERC6093.sol:121`).\n- **Impact:** the token code is the upstream code, so nothing it does changes. The problem is that the published integrity check can't confirm that, so anyone relying on it has to redo the upstream comparison by hand.\n- **Severity:** low, so no proof test was needed.\n- **Possible fixes:** regenerate `SHA256SUMS` and reword the README's claim, or restore the 23 files to their exact upstream bytes. Either fix means editing files under `lib/`. This task's rules don't allow submissions to touch `lib/`; if the same restriction applies to the author, this finding can't be fixed without that permission.\n\n**Coverage.** I marked all three entry points (`approve`, `transfer`, `transferFrom`) as `holds`. I also added a row for the fixed-supply rule:\n- `src/MADToken.sol` is a plain OpenZeppelin ERC-20 with no overrides, no owner, no mint after the constructor and no transfer fee. The launch transfers (factory to distributor, distributor to claimant, pool seeding and swaps) therefore move exact amounts.\n- The constructor mints 1e27 base units (1,000,000,000 MAD with 18 decimals) to `msg.sender`. That matches `launch.json`'s `totalSupply`, and its empty `constructorArgs` matches the no-argument constructor. The manifest uses only schema keys, and the deployed contract is far below the size limits.\n- `forge test` passed all 48 tests. I could not run the protected launch tests, because they need the service's own harness.\n\n**Dropped.** I dropped the static-analysis note about a \"large numeric literal\" at `src/MADToken.sol:10`. It's the supply constant `1_000_000_000 * 10 ** 18`, which is correct.","treeHash":null,"usage":{"cachedInputTokens":269449,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":5033,"runtime":"claude","turns":6,"wallClockMs":77382}},{"artifacts":[],"attempt":1,"bundleHash":"0d65fa6c8bc78ece044cb801759cfa2764f3216ff83422d6f032c4f1f38e6a5d","device":"629adec6a25d9241","findings":[],"hash":"8a0c424db937fb7b06b539f34c3d45d870595fd75cf69efffbdeb8f072dd6919","nodeId":"de566f16-68f4-4bec-8937-fee4a5cc93bf","outcome":"completed","summary":"Created `launch.json` matching `MADToken`, its exact supply, empty constructor arguments, and the required pool and economics. Only the manifest changed; local JSON checks passed.\n\nBoth `forge build` and `forge test` were attempted with the supplied seed but failed because Solidity 0.8.26 returned “Permission denied.”","treeHash":"42bea67573162217eece4d784f64b05e232eec28","usage":{"cachedInputTokens":177024,"inputTokens":24608,"model":"gpt-6-astra","outputTokens":2407,"runtime":"codex","turns":4,"wallClockMs":71584}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a8006a8757108cd3","findings":[{"citation":"resolved","description":"Periphery finding. The token inherits everything it does from the vendored OpenZeppelin ERC20.sol, so the provenance record for lib/ is the only evidence a reviewer or the verifier has that the base contract is the audited upstream v5.0.2. lib/README.md line 4 states that upstream sources are unmodified and that SHA256SUMS records each delivered file, and README.md line 59 points readers to it. Neither statement holds for the tree as delivered. lib/SHA256SUMS contains the hashes of the byte-exact upstream files (I fetched OpenZeppelin v5.0.2 and forge-std v1.9.7 from GitHub and every recorded hash matches the upstream file), but 23 of the 36 delivered files were re-wrapped by a formatter with the project's 100-column line_length (for example lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol line 284, where upstream's one-line `function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {` is split over four lines, and draft-IERC6093.sol line 121). I confirmed that all 23 differ from upstream only in whitespace (identical after stripping all whitespace), so the ERC-20 semantics the token relies on are upstream's and there is no behavioral defect. The defect is that the documented integrity check fails, which forces anyone who relies on it either to trust the README or to repeat the upstream diff I did; it also means a real semantic edit to ERC20.sol would be indistinguishable from this formatting noise by the checksum alone. Default `forge fmt --check` does not cover lib/, so restoring the byte-exact upstream files does not break the documented `forge fmt --check` step (verified in a scratch copy). Fix: restore the 23 files to their upstream bytes so the existing SHA256SUMS verifies, or, if the reformatted copies are wanted, regenerate SHA256SUMS from the delivered files and reword lib/README.md to say the files are reformatted copies of the upstream revision.","line":4,"path":"lib/README.md","reproduction":"From the repository root run `sha256sum -c lib/SHA256SUMS`. Expected per lib/README.md line 4: every line reports OK. Actual: 13 OK and 23 FAILED (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol, lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol, lib/forge-std/src/Vm.sol, StdJson.sol, StdChains.sol, StdCheats.sol, StdStyle.sol, StdConstants.sol, console.sol, StdUtils.sol, StdStorage.sol, StdAssertions.sol, StdToml.sol, safeconsole.sol, StdMath.sol, StdInvariant.sol, interfaces/IERC7575.sol, IMulticall3.sol, IERC4626.sol, IERC6909.sol, IERC7540.sol, IERC1155.sol, IERC721.sol), with the message `sha256sum: WARNING: 23 computed checksums did NOT match`. Delivered ERC20.sol hashes to 4a1db79b7b76a41b1d228242ad369c24fb293be6a62cd00b7e286333e965df59 while SHA256SUMS line 8 records 2d874da1c1478ed22a2d30dcf1a6ec0d09a13f897ca680d55fb49fbcc0e0c5b1, which is the hash of the upstream v5.0.2 file. `diff <(curl -s https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v5.0.2/contracts/token/ERC20/ERC20.sol) lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol` shows only the line 284 wrap; the same holds, whitespace-only, for all 23 files.","severity":"low","snippet":"Upstream sources are unmodified. `SHA256SUMS` records each delivered dependency file.","title":"lib/SHA256SUMS does not verify the delivered dependency files: 23 of 36 checksums fail because the vendored sources were reformatted after the hashes were recorded"}],"hash":"a3e26c37a868ea7e464e3fb5dcfa3ba93442cc10a9a6ed722d08bb7930457807","nodeId":"c9d0dcd5-0f66-4d6c-b144-b75aeb791c9f","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` with one low finding and eight coverage rows, and no tracked file was changed.\n\n**Outcome.** The MAD token is a 16-line OpenZeppelin v5.0.2 ERC-20 with no overrides, no admin surface, and a constructor that mints exactly one billion tokens with 18 decimals to the deployer. All three state-changing entry points (approve, transfer, transferFrom) hold under the Execution Trace, Periphery and First Principles checks. The one defect is in dependency provenance, not in token behavior.\n\n**Finding 1, low.** The checksums in lib/SHA256SUMS do not verify the delivered files. Running `sha256sum -c lib/SHA256SUMS` from the root fails 23 of 36 entries, while lib/README.md line 4 claims the upstream sources are unmodified and recorded. I fetched OpenZeppelin v5.0.2 and forge-std v1.9.7 from GitHub: every recorded hash matches the upstream file byte for byte, and every one of the 23 delivered files differs from upstream only in whitespace, because a formatter re-wrapped long lines at 100 columns. So the inherited ERC-20 semantics are genuinely upstream's, but the documented integrity check is broken and cannot distinguish this formatting noise from a real edit. The fix is to restore the byte-exact upstream files, which I verified does not break the documented `forge fmt --check` step since it ignores lib by default, or to regenerate the checksums and reword the claim.\n\n**What I verified as holding:**\n- approve, transfer, transferFrom traced through the vendored base: zero-address guards, overdraft and over-allowance reverts before any write, atomic rollback of the allowance decrement, infinite allowance untouched, exact amounts for the factory, distributor and pool manager flows with no exemptions needed.\n- Constructor mints the brief's supply to msg.sender; name, symbol and decimals match.\n- No mint, burn, pause, blacklist, owner, receive or fallback in the compiled ABI. I re-ran the protected test's opcode-reachability scan over the compiled runtime and found no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- The project's 34 unit and fuzz tests and 3 invariants pass under the documented seed.\n\n**Not reached.** Nothing in my area. The protected launch harness itself (pool seeding and swaps through a real PoolManager) needs the network's deployment values and was not run locally; the token has no transfer hooks, so there is no mechanism by which it could tax those flows.","treeHash":null,"usage":{"cachedInputTokens":834215,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":15406,"runtime":"claude","turns":31,"wallClockMs":272068}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"323aec17bfc8d652","findings":[{"citation":"resolved","description":"lib/README.md states the vendored OpenZeppelin v5.0.2 and forge-std v1.9.7 sources are unmodified and that lib/SHA256SUMS records each delivered file. The recorded hashes are the upstream hashes (for example lib/SHA256SUMS line 8 records 2d874da1...c5b1 for ERC20.sol, which is the upstream v5.0.2 hash), but the files in the tree were reformatted by `forge fmt` after the sums were taken, so the recorded verification fails for 23 of the 36 listed files, including lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol (actual sha256 4a1db79b...df59) and lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol. I compared every vendored file against the upstream v5.0.2 and v1.9.7 archives (archive hashes match those in lib/README.md) with all whitespace stripped: all 36 are identical modulo whitespace and line wrapping, so the ERC-20 the token inherits is semantically the upstream implementation, the compiled bytecode is unaffected (bytecode_hash = none, no metadata), and no economic, invariant or flow behaviour of MADToken changes. The defect is that the provenance check the project tells reviewers and the launch operator to rely on is false as shipped: a verifier or operator who runs the documented check sees FAILED for the ERC-20 core and cannot distinguish a cosmetic reformat from a malicious edit without redoing the upstream comparison. Minimal fix (author's choice of scope): either regenerate lib/SHA256SUMS from the tree as delivered, or restore the byte-exact upstream files and exclude lib/ from formatting via `[fmt] ignore` in foundry.toml so `forge fmt --check` and the sums both hold. Outside the assigned economics area; reported because provenance of the inherited transfer/allowance code is the only external dependency the token's economics rest on.","line":4,"path":"lib/README.md","reproduction":"From the repository root run `sha256sum -c lib/SHA256SUMS`. Expected (per lib/README.md): every line OK. Actual: 13 OK, 23 FAILED, with `sha256sum: WARNING: 23 computed checksums did NOT match`; among the failures are lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol (recorded 2d874da1c1478ed22a2d30dcf1a6ec0d09a13f897ca680d55fb49fbcc0e0c5b1, actual 4a1db79b7b76a41b1d228242ad369c24fb293be6a62cd00b7e286333e965df59) and lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol (recorded 4aea8724..., actual 94e5638b...). `diff <(curl -s https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v5.0.2/contracts/token/ERC20/ERC20.sol) lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol` shows only the `_approve(address,address,uint256,bool)` signature at line 284 re-wrapped onto four lines; no token or semantic change.","severity":"low","snippet":"Upstream sources are unmodified. `SHA256SUMS` records each delivered dependency file.","title":"Vendored dependency provenance record does not match the delivered tree: lib/SHA256SUMS fails on 23 of 36 files"}],"hash":"bacf1ffa4bfcd8de4c14b9c9ea72111da1e4813b9e7f806f46fe8808610ef5fe","nodeId":"9da9d0da-d8b0-4357-825c-5ea89c17f462","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. No source files were changed, and `git status` shows a clean tree apart from the findings file, which is ignored.\n\n**Outcome.** The MAD token has no economic, invariant or flow defect. It is a 16-line contract inheriting the OpenZeppelin v5.0.2 ERC-20 unchanged, with one constructor mint of 10^27 units to `msg.sender` and no other entry point. One low-severity provenance finding is reported.\n\n**What I checked in the assigned area**\n- Economic Security: no external dependency, oracle or callback. No fee, burn, rebase, pause or blacklist, so the swarm share, pool seed and trader swaps move exactly what they say. Transfers to the zero address and approvals of the zero spender revert. The paired FWA token on Ethereum mainnet has code, symbol FWA and 18 decimals, matching the README.\n- Invariant: total supply is fixed at deployment and the sum of balances equals it. The ABI has only ten functions and no receive or fallback, so there is no mint, burn, owner or freeze path. The project's 35 tests, including fuzz and stateful invariants, pass.\n- Flow Gap: the constructor takes no arguments and mints to the deploying factory. The runtime bytecode has no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT. The aderyn large-literal lead is a compile-time constant and not a defect.\n\n**Finding reported (low).** The vendored library checksum record is stale. Running `sha256sum -c lib/SHA256SUMS` from the repo root fails on 23 of 36 files, including the ERC-20 core, while `lib/README.md` says the sources are unmodified. I compared every file against the upstream v5.0.2 and v1.9.7 archives and they are identical apart from `forge fmt` whitespace, so behaviour and bytecode are unaffected. The fix is to regenerate the sums or exclude `lib/` from formatting and restore the byte-exact files.\n\n**Coverage.** All three entry points are marked `holds`, plus rows for the supply invariant, constructor mint, launch flows, privileged-call absence, bytecode scan, paired currency and the provenance finding. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":721914,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":15707,"runtime":"claude","turns":28,"wallClockMs":218731}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9df7d5d52e83c572","findings":[{"citation":"resolved","description":"Trust Gap / dependency provenance. The README states the checksum file records each delivered dependency file, but running the checksum file against the tree fails for 23 entries, including lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol, the file MADToken inherits every entry point from, and lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol. A reviewer who relies on SHA256SUMS to confirm the inherited ERC-20 is the audited upstream code gets a failure and must re-verify by hand. I did that re-verification: the upstream v5.0.2 archive downloaded from the URL in lib/README.md has the SHA-256 the README records (18c7b7e9...925a), and the five vendored OpenZeppelin .sol files differ from it only by forge-fmt line wrapping (ERC20.sol: the four-argument _approve signature split over three lines; draft-IERC6093.sol: ERC1155InsufficientBalance split over three lines); IERC20.sol, IERC20Metadata.sol and Context.sol are byte-identical. Token semantics are therefore the audited upstream ones and no access-control, asymmetry or trust-gap defect follows from this. The defect is that the integrity record the project ships is stale relative to the formatted files, so it neither proves nor is proven by the tree. Fix: regenerate lib/SHA256SUMS from the files as delivered (or vendor the unformatted upstream files and exclude lib/ from forge fmt), and reword the README sentence so it does not claim byte-identity with upstream when files were reformatted.","line":4,"path":"lib/README.md","reproduction":"From the repository root run `sha256sum -c lib/SHA256SUMS`. Expected per lib/README.md line 4: every line reports OK. Actual: 23 lines report FAILED and the tool prints `WARNING: 23 computed checksums did NOT match`, among them lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol and lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol. Independent check that the content is still upstream: download https://codeload.github.com/OpenZeppelin/openzeppelin-contracts/tar.gz/refs/tags/v5.0.2 (sha256 18c7b7e949b9a82dcd8cd394426c9c2636dfc263aa2317d4749dbfa0c7b3925a, matching lib/README.md) and `diff` each of the five vendored .sol files against the archive; the only differences are whitespace/line wrapping in ERC20.sol and draft-IERC6093.sol.","severity":"info","snippet":"Upstream sources are unmodified. `SHA256SUMS` records each delivered dependency file.","title":"lib/SHA256SUMS does not match 23 of the 36 delivered dependency files, so the vendored-dependency integrity record the README points to cannot be used to verify the tree"}],"hash":"c6f1135a0d40bb9d5deecb921088f18bff89e5b3cfc0a8ad931dd4ce845e4a5a","nodeId":"2b42f58b-df11-47f3-bead-23767229d610","outcome":"completed","summary":"The review is complete and the findings file is written. No source changes were made.\n\n**Result: no access-control, trust-gap or asymmetry defect in the token.** `src/MADToken.sol` is a 16-line contract inheriting the vendored OpenZeppelin v5.0.2 ERC-20 with no overrides, no roles and no extra entry points. The compiled ABI confirms the only state-changing functions are approve, transfer and transferFrom. The constructor mints the whole supply to msg.sender, which is the factory under the launch flow, and the two supply-changing branches of the inherited update function are unreachable afterwards.\n\nWhat I checked against the three guides:\n\n- **Access Control.** Permission map is empty: no owner, minter, pauser, initializer, receive, fallback or hook. Internal mint and burn helpers have no external caller. The deployer holds no bypass over other holders' balances or allowances.\n- **Asymmetry.** The approve and transferFrom pair write the same allowance slot under the same key. The transfer and transferFrom pair funnel through one validation path. There are no admin, force or batch variants to diverge.\n- **Trust Gap.** No privileged actor, settable parameter, fee recipient or exemption list exists, so none of the four seams has an actor. The only trust assumption is that the factory, as an ordinary holder, performs the launch split, and that lives outside this code.\n\nThe project's 35 tests pass with the pinned fuzz seed, and the formatter check is clean.\n\n**One info-level finding was recorded.** The checksum file under lib fails for 23 of its 36 entries, including the ERC-20 file the token inherits, while the README claims it records each delivered file. I downloaded the upstream v5.0.2 archive, confirmed its hash matches the README, and diffed every vendored file: the only differences are line wrapping from the formatter, so semantics are the audited upstream code. The finding asks the author to regenerate the checksums or vendor unformatted files.\n\nThe coverage record has nine rows: the three listed entry points, the constructor and role handout, the fixed-supply invariant, the paired-function asymmetry check, the trust-gap seams, the dependency provenance finding, and the standard ERC-20 approve race, which I noted as a known property rather than a defect.","treeHash":null,"usage":{"cachedInputTokens":1206396,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":11349,"runtime":"claude","turns":18,"wallClockMs":195976}},{"artifacts":[],"attempt":1,"bundleHash":"0128467550695be3d9cfeb76dea6d09ac45b7ef57fbfee4f88ba813d9be80892","device":"47f3603854a893a3","findings":[],"hash":"d351ec8163736370f44416c4cafdd81d1f1d1864ef364efbd679f2e4a5bf2d7d","nodeId":"336d5ee5-eca6-430e-af7f-fa51573ae9ab","outcome":"completed","summary":"I found no defects in `MADToken`, so I didn't write `.imd-findings.json`. The token is a plain OpenZeppelin ERC20: name \"Mutually Assured Destruction\", symbol MAD, 18 decimals, 1,000,000,000 tokens minted once to the deployer. It has no owner, no mint, burn or pause, no permit, and no code that could hand over control to another contract.\n\n**Result:** `forge test` passes all 48 tests across 4 suites with the verifier's fuzz seed, run in the foreground. The 36 earlier tests (`test/MADToken.t.sol`, `test/MADToken.invariant.t.sol`) are unchanged. My three new files are not committed.\n\n**What I added (only under `test/`):**\n- **`test/helpers/MADOpenHandler.sol` and `test/MADToken.openworld.invariant.t.sol`**: random-sequence invariant tests that start with the whole supply in one \"factory\" account. The fuzzer then spreads it to addresses it picks, up to 24 holders, which can include the token's own address. The handler also makes calls that should fail and checks the exact error and that nothing changed:\n  - sending to the zero address, or more than the balance (up to the largest possible amount);\n  - spending more than the allowance, or within the allowance but beyond the balance;\n  - calling any function that isn't part of ERC-20, from any holder.\n  \n  After every call it checks that:\n  - total supply never changes and the holders' balances add up to all of it;\n  - every balance and every allowance matches the model;\n  - the zero address holds nothing and the token holds no ETH.\n  \n  Runs are set in the file to 256 × 64 (16,384 calls), with no unexpected reverts. A scratch check confirmed the handler really adds new holders, so these invariants aren't passing vacuously.\n- **`test/MADToken.launch.t.sol`** (12 tests):\n  - **Launch:** a helper deploys the token and makes the swarm, pool and remainder transfers in a single call, like the factory's one transaction; each arrives exact and the distributor's claims pay out whole. Deploying twice with the same salt reverts.\n  - **Floor checks:** the reachable bytecode has no DELEGATECALL, CALLCODE or SELFDESTRUCT. The deployer can't use any of the 17 privileged calls the launch floor tries, or move a holder's tokens with `transferFrom`, and the holder can still transfer afterwards.\n  - **Edge cases:** `increaseAllowance`, `decreaseAllowance`, `permit`, `nonces` and `DOMAIN_SEPARATOR` all revert. An allowance one below the maximum still goes down when spent. Spending exactly the balance works and one more wei fails. Allowances are separate for each spender. Tokens sent to the token's own address are stuck, since there is no rescue function.\n  - **Fuzz:** `approve` always replaces the old allowance, outsiders can't spend without approval, and chains of transfers conserve the supply.","treeHash":"1f31c9f2dddb22bad3ecddd9988b5fa134ef1602","usage":{"cachedInputTokens":689559,"inputTokens":24,"model":"claude-opus-5-5","outputTokens":13927,"runtime":"claude","turns":12,"wallClockMs":177703}},{"artifacts":[],"attempt":1,"bundleHash":"9571925d67f01e50145ced386d2925ae9ce0b9aad2db0ee45039d62b74294ecf","device":"cf6f08a25e988161","findings":[],"hash":"d7d028808624b406662ed55bf9e05ce20433c593441560292de208370381d6a9","nodeId":"79c2b339-85e5-4fa0-a686-28fd9c9d5a88","outcome":"completed","summary":"Implemented [MADToken.sol](/home/agent116/.identitymd/work/6c05194f-48ff-45c6-a97a-62705fad1a3e/79c2b339-85e5-4fa0-a686-28fd9c9d5a88/src/MADToken.sol): 1 billion MAD, 18 decimals, minted once to the deployer, with no administrative powers.\n\nDependencies are vendored, and deployment assumptions and responsibilities are documented in README.md.\n\nPassed:\n- `forge build`\n- `forge test` with the supplied seed: 34 unit/fuzz tests and three invariant properties across 8,192 calls\n- `forge fmt --check`\n\nFull launch integration remains with the network’s protected harness.","treeHash":"643fe1269d37284316e256cd99d851cd418dea39","usage":{"cachedInputTokens":441984,"inputTokens":63033,"model":"gpt-6-astra","outputTokens":15966,"runtime":"codex","turns":5,"wallClockMs":368263}}],"verification":[{"checks":[{"durationMs":1724,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.59s\nCompiler run successful!\n","passed":true},{"durationMs":2507,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 34 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_OverAllowanceRevertsWithoutChangingState(uint256,uint256) (runs: 512, μ: 133117, ~: 133789)\nLogs:\n  Bound result 303772815340486753380841541\n  Bound result 154597350365294873841690622\n\n[PASS] testFuzz_OverdrawRevertsWithoutChangingState(uint256,uint256) (runs: 512, μ: 137332, ~: 137757)\nLogs:\n  Bound result 829913072128684615543619849\n  Bound result 277386120\n\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 512, μ: 55166, ~: 54891)\nLogs:\n  Bound result 558562387162053984506464914\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 92954, ~: 93242)\nLogs:\n  Bound result 37205320749283257911\n\n[PASS] testFuzz_TransferFromRespectsAllowance(uint256,uint256) (runs: 512, μ: 163947, ~: 165154)\nLogs:\n  Bound result 19429\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129620521\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 167514)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveTokens() (gas: 88776)\n[PASS] test_ConstructorEmitsMint() (gas: 5601)\n[PASS] test_ContractRecipientNeedsNoCallback() (gas: 171690)\n[PASS] test_EmptyAccountCanApproveButSpenderCannotSpend() (gas: 113988)\n[PASS] test_FactoryDeploymentMintsOnlyToFactory() (gas: 311251)\n[PASS] test_LaunchDistributionClaimAndPoolTransfersAreExact() (gas: 648479)\n[PASS] test_MetadataAndWholeSupply() (gas: 107664)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1295643)\n[PASS] test_RejectsNativeCurrencyAndUnknownCalls() (gas: 64710)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 30409)\n[PASS] test_RevertWhenDeployerSpendsHolderBalanceWithoutApproval() (gas: 94933)\n[PASS] test_RevertWhenDifferentSpenderUsesApproval() (gas: 105124)\n[PASS] test_RevertWhenHolderUsesTransferFromWithoutSelfApproval() (gas: 42628)\n[PASS] test_RevertWhenTransferAmountIsMaxUint() (gas: 42427)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 120104)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 115764)\n[PASS] test_RevertWhenTransferFromExceedsBalanceRestoresAllowance() (gas: 178487)\n[PASS] test_RevertWhenTransferFromToZeroRestoresAllowance() (gas: 114156)\n[PASS] test_RevertWhenTransferToZeroEvenForZeroAmount() (gas: 71969)\n[PASS] test_RevertWhenZeroTransferFromHasInvalidEndpoint() (gas: 62869)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51442)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 93572)\n[PASS] test_TransferFromSpendsExactAllowanceAndEmitsTransfer() (gas: 244349)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 113644)\n[PASS] test_UnlimitedAllowanceRemainsUnchanged() (gas: 214788)\n[PASS] test_WholeSupplyCanMoveAndReturn() (gas: 149189)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73476)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81545)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 48.45ms (229.55ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS]\nMADTokenInvariantTest invariants:\n[PASS] invariant_AllowancesMatchApprovalsAndSpending\n[PASS] invariant_BalancesMatchAuthorizedTransfers\n[PASS] invariant_SupplyIsFixedAndBalancesConserveIt\n MADTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+--------------------+-------+---------+----------╮\n| Contract   | Selector           | Calls | Reverts | Discards |\n+==============================================================+\n| MADHandler | approve            | 1605  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | overdraw           | 1680  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | transfer           | 1715  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | transferFrom       | 1595  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | transferFromToZero | 1597  | 0       | 0        |\n╰------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 143919652996822716150290916\n  Bound result 3460\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 393919652996822716150290916\n  Bound result 250000000000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 153532802501861000691699423\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 8\n  Bound result 1599\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 6\n  Bound result 3\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.39s (2.38s CPU time)\n\nRan 2 test suites in 2.40s (2.44s CPU time): 35 tests passed, 0 failed, 0 skipped (35 total tests)\n","passed":true},{"durationMs":50,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":128,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/MADToken.sol\":16,\"test/MADToken.invariant.t.sol\":63,\"test/MADToken.t.sol\":470,\"test/helpers/MADHandler.sol\":92,\"test/helpers/TokenFactory.sol\":22},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8a0c424db937fb7b06b539f34c3d45d870595fd75cf69efffbdeb8f072dd6919","verifiedTreeHash":"42bea67573162217eece4d784f64b05e232eec28","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":2068,"exitCode":0,"name":"build","output":"Compiling 32 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.96s\nCompiler run successful!\n","passed":true},{"durationMs":5813,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 12 tests for test/MADToken.launch.t.sol:MADTokenLaunchTest\n[PASS] testFuzz_ApproveOverwritesRegardlessOfHistory(uint256,uint256,uint256) (runs: 512, μ: 159689, ~: 161039)\nLogs:\n  Bound result 7\n  Bound result 1\n\n[PASS] testFuzz_ThirdPartyCannotSpendWithoutApproval(address,uint256) (runs: 512, μ: 98795, ~: 98611)\nLogs:\n  Bound result 471587803\n\n[PASS] testFuzz_TransferChainConserves(uint256,uint256,uint256) (runs: 512, μ: 262879, ~: 269021)\nLogs:\n  Bound result 7\n  Bound result 6\n  Bound result 1\n\n[PASS] test_AllowanceOneBelowMaxIsFiniteAndDecrements() (gas: 123869)\n[PASS] test_ApprovalSurvivesAndIsIndependentPerSpender() (gas: 193317)\n[PASS] test_DeployerCannotMoveFreezeOrMint() (gas: 1224169)\n[PASS] test_NoPermitOrAllowanceShortcuts() (gas: 135088)\n[PASS] test_OneTransactionLaunchFlowsAreExact() (gas: 765976)\n[PASS] test_RuntimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2444121)\n[PASS] test_SameSaltCannotRedeploy() (gas: 674350)\n[PASS] test_SpendingExactBalanceThenOneMoreWeiFails() (gas: 201095)\n[PASS] test_TokenAddressCanHoldTokensButCannotSpendThem() (gas: 108557)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 27.14ms (83.60ms CPU time)\n\nRan 34 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_OverAllowanceRevertsWithoutChangingState(uint256,uint256) (runs: 512, μ: 133120, ~: 133789)\nLogs:\n  Bound result 6251029410616319227885065\n  Bound result 919314631718133816098086267\n\n[PASS] testFuzz_OverdrawRevertsWithoutChangingState(uint256,uint256) (runs: 512, μ: 137431, ~: 137761)\nLogs:\n  Bound result 20\n  Bound result 2252497342\n\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 512, μ: 55173, ~: 54891)\nLogs:\n  Bound result 903811910094221122346700471\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 92948, ~: 93242)\nLogs:\n  Bound result 265038176815406606380045856\n\n[PASS] testFuzz_TransferFromRespectsAllowance(uint256,uint256) (runs: 512, μ: 164396, ~: 165194)\nLogs:\n  Bound result 352113\n  Bound result 23361760768825539614652740042491659508252488\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 167514)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveTokens() (gas: 88776)\n[PASS] test_ConstructorEmitsMint() (gas: 5601)\n[PASS] test_ContractRecipientNeedsNoCallback() (gas: 171690)\n[PASS] test_EmptyAccountCanApproveButSpenderCannotSpend() (gas: 113988)\n[PASS] test_FactoryDeploymentMintsOnlyToFactory() (gas: 311251)\n[PASS] test_LaunchDistributionClaimAndPoolTransfersAreExact() (gas: 648479)\n[PASS] test_MetadataAndWholeSupply() (gas: 107664)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1295643)\n[PASS] test_RejectsNativeCurrencyAndUnknownCalls() (gas: 64710)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 30409)\n[PASS] test_RevertWhenDeployerSpendsHolderBalanceWithoutApproval() (gas: 94933)\n[PASS] test_RevertWhenDifferentSpenderUsesApproval() (gas: 105124)\n[PASS] test_RevertWhenHolderUsesTransferFromWithoutSelfApproval() (gas: 42628)\n[PASS] test_RevertWhenTransferAmountIsMaxUint() (gas: 42427)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 120104)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 115764)\n[PASS] test_RevertWhenTransferFromExceedsBalanceRestoresAllowance() (gas: 178487)\n[PASS] test_RevertWhenTransferFromToZeroRestoresAllowance() (gas: 114156)\n[PASS] test_RevertWhenTransferToZeroEvenForZeroAmount() (gas: 71969)\n[PASS] test_RevertWhenZeroTransferFromHasInvalidEndpoint() (gas: 62869)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51442)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 93572)\n[PASS] test_TransferFromSpendsExactAllowanceAndEmitsTransfer() (gas: 244349)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 113644)\n[PASS] test_UnlimitedAllowanceRemainsUnchanged() (gas: 214788)\n[PASS] test_WholeSupplyCanMoveAndReturn() (gas: 149189)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73476)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81545)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 27.37ms (128.41ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS]\nMADTokenInvariantTest invariants:\n[PASS] invariant_AllowancesMatchApprovalsAndSpending\n[PASS] invariant_BalancesMatchAuthorizedTransfers\n[PASS] invariant_SupplyIsFixedAndBalancesConserveIt\n MADTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+--------------------+-------+---------+----------╮\n| Contract   | Selector           | Calls | Reverts | Discards |\n+==============================================================+\n| MADHandler | approve            | 1605  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | overdraw           | 1680  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | transfer           | 1715  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | transferFrom       | 1595  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | transferFromToZero | 1597  | 0       | 0        |\n╰------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 143919652996822716150290916\n  Bound result 3462\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 3551301040025239\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6566\n  Bound result 0\n  Bound result 0\n  Bound result 6090\n  Bound result 0\n  Bound result 234136566412009831144357200\n  Bound result 12\n  Bound result 244\n  Bound result 296\n  Bound result 1865\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1942\n  Bound result 2427\n  Bound result 0\n  Bound result 0\n  Bound result 33\n  Bound result 0\n  Bound result 0\n  Bound result 250000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.41s (2.40s CPU time)\n\nRan 1 test for test/MADToken.openworld.invariant.t.sol:MADTokenOpenWorldInvariantTest\n[PASS]\nMADTokenOpenWorldInvariantTest invariants:\n[PASS] invariant_EveryBalanceAndAllowanceMatchesTheModel\n[PASS] invariant_SupplyNeverChangesAndHoldersOwnAllOfIt\n[PASS] invariant_TokenHoldsNoEther\n MADTokenOpenWorldInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------+--------------------+-------+---------+----------╮\n| Contract       | Selector           | Calls | Reverts | Discards |\n+==================================================================+\n| MADOpenHandler | approve            | 2399  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| MADOpenHandler | overdraw           | 2294  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| MADOpenHandler | overspend          | 2312  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| MADOpenHandler | spend              | 2346  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| MADOpenHandler | spendBeyondBalance | 2320  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| MADOpenHandler | transferTo         | 2420  | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| MADOpenHandler | unknownCall        | 2293  | 0       | 0        |\n╰----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 725\n  Bound result 0\n  Bound result 5000000000000000000\n  Bound result 1884\n  Bound result 1381\n  Bound result 20853370048457364708\n  Bound result 3486\n  Bound result 183590204678081246458\n  Bound result 2361\n  Bound result 181\n  Bound result 992\n  Bound result 3951\n  Bound result 1000000000000000000000000000\n  Bound result 1572\n  Bound result 5266\n  Bound result 6006\n  Bound result 1550\n  Bound result 3\n  Bound result 9055\n  Bound result 1054016786160810783909\n  Bound result 819\n  Bound result 999999999999999999999999997\n  Bound result 0\n  Bound result 9000000000000000000\n  Bound result 0\n  Bound result 217\n  Bound result 5000000000000000000\n  Bound result 0\n  Bound result 4638\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639937\n  Bound result 3\n  Bound result 0\n  Bound result 920938463463374607431768211455\n  Bound result 3\n  Bound result 6865\n  Bound result 1341272808427364517304298730338624680399816593095233464948633442793558\n  Bound result 20\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 8591\n  Bound result 5116\n  Bound result 254\n  Bound result 1000000000000000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.72s (5.71s CPU time)\n\nRan 4 test suites in 5.72s (8.18s CPU time): 48 tests passed, 0 failed, 0 skipped (48 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,\"README.md\":128,\"foundry.toml\":21,\"remappings.txt\":2,\"src/MADToken.sol\":16,\"test/MADToken.invariant.t.sol\":63,\"test/MADToken.launch.t.sol\":251,\"test/MADToken.openworld.invariant.t.sol\":55,\"test/MADToken.t.sol\":470,\"test/helpers/MADHandler.sol\":92,\"test/helpers/MADOpenHandler.sol\":172,\"test/helpers/TokenFactory.sol\":22},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d351ec8163736370f44416c4cafdd81d1f1d1864ef364efbd679f2e4a5bf2d7d","verifiedTreeHash":"1f31c9f2dddb22bad3ecddd9988b5fa134ef1602","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":1213,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.13s\nCompiler run successful!\n","passed":true},{"durationMs":2085,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 34 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_OverAllowanceRevertsWithoutChangingState(uint256,uint256) (runs: 512, μ: 133117, ~: 133789)\nLogs:\n  Bound result 303772815340486753380841541\n  Bound result 154597350365294873841690622\n\n[PASS] testFuzz_OverdrawRevertsWithoutChangingState(uint256,uint256) (runs: 512, μ: 137332, ~: 137757)\nLogs:\n  Bound result 6251029410616319227885065\n  Bound result 55964002597914314983841885028201538160565523937457614122089147278094622\n\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 512, μ: 55166, ~: 54891)\nLogs:\n  Bound result 903811910094221122346700471\n\n[PASS] testFuzz_TransferConservesSupply(address,uint256) (runs: 512, μ: 92954, ~: 93242)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_TransferFromRespectsAllowance(uint256,uint256) (runs: 512, μ: 163947, ~: 165154)\nLogs:\n  Bound result 566416818594591713459251043\n  Bound result 115792089237316195423570985008687907853269984665639997622638989416199670389007\n\n[PASS] test_ApprovalCanBeReplacedAndRevoked() (gas: 167514)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveTokens() (gas: 88776)\n[PASS] test_ConstructorEmitsMint() (gas: 5601)\n[PASS] test_ContractRecipientNeedsNoCallback() (gas: 171690)\n[PASS] test_EmptyAccountCanApproveButSpenderCannotSpend() (gas: 113988)\n[PASS] test_FactoryDeploymentMintsOnlyToFactory() (gas: 311251)\n[PASS] test_LaunchDistributionClaimAndPoolTransfersAreExact() (gas: 648479)\n[PASS] test_MetadataAndWholeSupply() (gas: 107664)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1295643)\n[PASS] test_RejectsNativeCurrencyAndUnknownCalls() (gas: 64710)\n[PASS] test_RevertWhenApprovingZeroSpender() (gas: 30409)\n[PASS] test_RevertWhenDeployerSpendsHolderBalanceWithoutApproval() (gas: 94933)\n[PASS] test_RevertWhenDifferentSpenderUsesApproval() (gas: 105124)\n[PASS] test_RevertWhenHolderUsesTransferFromWithoutSelfApproval() (gas: 42628)\n[PASS] test_RevertWhenTransferAmountIsMaxUint() (gas: 42427)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 120104)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 115764)\n[PASS] test_RevertWhenTransferFromExceedsBalanceRestoresAllowance() (gas: 178487)\n[PASS] test_RevertWhenTransferFromToZeroRestoresAllowance() (gas: 114156)\n[PASS] test_RevertWhenTransferToZeroEvenForZeroAmount() (gas: 71969)\n[PASS] test_RevertWhenZeroTransferFromHasInvalidEndpoint() (gas: 62869)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51442)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 93572)\n[PASS] test_TransferFromSpendsExactAllowanceAndEmitsTransfer() (gas: 244349)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 113644)\n[PASS] test_UnlimitedAllowanceRemainsUnchanged() (gas: 214788)\n[PASS] test_WholeSupplyCanMoveAndReturn() (gas: 149189)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73476)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81545)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 17.97ms (95.39ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS]\nMADTokenInvariantTest invariants:\n[PASS] invariant_AllowancesMatchApprovalsAndSpending\n[PASS] invariant_BalancesMatchAuthorizedTransfers\n[PASS] invariant_SupplyIsFixedAndBalancesConserveIt\n MADTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+--------------------+-------+---------+----------╮\n| Contract   | Selector           | Calls | Reverts | Discards |\n+==============================================================+\n| MADHandler | approve            | 1605  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | overdraw           | 1680  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | transfer           | 1715  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | transferFrom       | 1595  | 0       | 0        |\n|------------+--------------------+-------+---------+----------|\n| MADHandler | transferFromToZero | 1597  | 0       | 0        |\n╰------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 143919652996822716150290916\n  Bound result 3460\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 393919652996822716150290916\n  Bound result 250000000000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 153532802501861000691699423\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 8\n  Bound result 1599\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 6\n  Bound result 3\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.00s (2.00s CPU time)\n\nRan 2 test suites in 2.00s (2.02s CPU time): 35 tests passed, 0 failed, 0 skipped (35 total tests)\n","passed":true},{"durationMs":42,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MADToken.approve(address,uint256)\",\"MADToken.transfer(address,uint256)\",\"MADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":128,\"foundry.toml\":21,\"remappings.txt\":2,\"src/MADToken.sol\":16,\"test/MADToken.invariant.t.sol\":63,\"test/MADToken.t.sol\":470,\"test/helpers/MADHandler.sol\":92,\"test/helpers/TokenFactory.sol\":22},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":660,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":340,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/MADToken.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d7d028808624b406662ed55bf9e05ce20433c593441560292de208370381d6a9","verifiedTreeHash":"643fe1269d37284316e256cd99d851cd418dea39","verifierVersion":"0.1.0+ead9012e"}]}