{"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":"14d9abdf-5714-4dd8-953c-1eb4cb13f1c6","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"4ac4a7d4adfbd626d12c3b98c49aec16eafd6b1830e2ec591708db1a22f6b25c","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":"4863b22b0e8e678939923f1142a8d0dd147d614fd3dd82be234c7548a31bfef3","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":"611cd4ebd1fed2825bf6e4bd5593d7f0f7b27e0c703bb82a587d770944dd8a43","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":"9bd069d25b4072e1a61cf480c4f818ca74edf7b66facecbcd4c1dcb9d829d63e","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":"9200fd9c38e2329d0560cc2294872522718f6312e8c54bd01e38f0b0f5119807","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":"08715e3c9a0ce4c3bbf19dc88fba452604ce7100c821f254cc2ea023092c5989","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":"230e582a91558fc543857bf960695a431223287587dca7a73c60e879d88f9faa","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"0e4d0d2cc3c3ed8f4dd6bb508f90167256b2e330c86808d013d8384da65eb577","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":"ee107357dbdfbb579adcf201db904bc4325cf016ea22da5121f843c62e920b7f","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"14d9abdf-5714-4dd8-953c-1eb4cb13f1c6","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2443-mutually-assured-destruction"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52590","feedbackHash":"bbb29873b8ffed67a566f6f22503fe98e58ab6f139f93a2e1cbc2df238ee7b9d","nodeKey":"audit_economics","submissionHash":"4ac4a7d4adfbd626d12c3b98c49aec16eafd6b1830e2ec591708db1a22f6b25c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51481","feedbackHash":"529f18ae33c1dde6a43a37b35de28b6cacccad210e89acb86787c136f97ce702","nodeKey":"audit_flow","submissionHash":"4863b22b0e8e678939923f1142a8d0dd147d614fd3dd82be234c7548a31bfef3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52337","feedbackHash":"62f7939e34908d26b5069b334ec12870cc1e7253d17a7134cf63ddae6b3a3f5b","nodeKey":"audit_judge","submissionHash":"611cd4ebd1fed2825bf6e4bd5593d7f0f7b27e0c703bb82a587d770944dd8a43","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53924","feedbackHash":"a6be22ecdd59ab93239f2246388c72b337220c6c6fffdca12f696f1859c7f35f","nodeKey":"audit_math","submissionHash":"9bd069d25b4072e1a61cf480c4f818ca74edf7b66facecbcd4c1dcb9d829d63e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52158","feedbackHash":"a129aef964d4ce70e55ae45bc8039f95b30252c3dee88017d8178378fdd8dc2e","nodeKey":"audit_permissions","submissionHash":"9200fd9c38e2329d0560cc2294872522718f6312e8c54bd01e38f0b0f5119807","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51426","feedbackHash":"8666948220f2dbbd3ff84df4098df970bd94fabd9fb26f7f5aa79b083ab83457","nodeKey":"build_contract_project","submissionHash":"08715e3c9a0ce4c3bbf19dc88fba452604ce7100c821f254cc2ea023092c5989","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51440","feedbackHash":"8c75560d0d209bcccf7bd628fa3d215baf38721d3cbc2efececa388dff60fa83","nodeKey":"manifest","submissionHash":"230e582a91558fc543857bf960695a431223287587dca7a73c60e879d88f9faa","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51193","feedbackHash":"5a458d92ef60804190fa286dce14ac126bc93807bff661b12371589097dced4b","nodeKey":"write_foundry_tests","submissionHash":"0e4d0d2cc3c3ed8f4dd6bb508f90167256b2e330c86808d013d8384da65eb577","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"755dd2df63cd4d223fa8e4454fb00c8e9b22bf6497fa6b3271e8a6cfd5b5d91e","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"707a31b2273cd0a9cade0a3e0e696ebd89ea9330f75c5156b182f3dac4f6b87c","device":"6d41a24119881b34","findings":[],"hash":"08715e3c9a0ce4c3bbf19dc88fba452604ce7100c821f254cc2ea023092c5989","nodeId":"739dd6f7-be6d-4734-b39f-4c1446c614bc","outcome":"completed","summary":"Implemented MAD with 1 billion tokens, 18 decimals, minted once to the deployer. Standard ERC-20 behavior, with no administrative powers.\n\nDependencies are vendored; deployment assumptions and operational responsibilities are documented in `README.md`.\n\nPassed: `forge build`, `forge fmt --check`, and all 33 tests using the requested fuzz seed.","treeHash":"03841a45839fe8b2f2031315709c2045ff7aee4c","usage":{"cachedInputTokens":442112,"inputTokens":48688,"model":"gpt-6-astra","outputTokens":16131,"runtime":"codex","turns":5,"wallClockMs":406625}},{"artifacts":[],"attempt":1,"bundleHash":"d0459fe2ff2e8805df38dd15e62a5cf8ca6b126adee94080de0c97d1dafbf780","device":"fedfd42dfee2f4e6","findings":[],"hash":"0e4d0d2cc3c3ed8f4dd6bb508f90167256b2e330c86808d013d8384da65eb577","nodeId":"565b2b29-b2bb-4349-9978-edc492125ae9","outcome":"completed","summary":"I added two test files to the existing suite and found no defects in `src/MADToken.sol`. `forge build` and `forge test` with the verifier's seed both pass: 49 tests, none failing. My changes are only under `test/`.\n\n**`test/MADToken.ledger.invariant.t.sol`** checks every call against a separate record of what each balance and allowance should be:\n- It runs `transfer`, `approve` and `transferFrom` in random order across several holders. Inputs are allowed to exceed balances and allowances, hit the exact limit or one over it, use the maximum value, or target the zero address.\n- Each call's result is checked against that record. A call expected to succeed must return `true`. A call expected to fail must revert with the exact error OpenZeppelin defines (insufficient allowance, then invalid receiver, then insufficient balance, in that order).\n- After every call, these must hold: every balance and allowance matches the record, the balances add up to exactly 10²⁷, the total supply never changes, the zero address is never approved as a spender, and nothing the token contract itself holds can be authorised away.\n- Over 256 sequences of 64 calls there were no unexpected reverts. A throwaway probe confirmed every sequence included both successful and rejected calls, so the invariants are actually exercised.\n\n**`test/MADToken.edge.t.sol`** adds 15 unit and fuzz tests:\n- **Fixed values:** the supply is exactly 10²⁷, and any deployer address receives the whole supply.\n- **Opcode scan:** the deployed code contains no `DELEGATECALL`, `CALLCODE` or `SELFDESTRUCT`. It covers all of the code except the compiler's metadata at the end.\n- **Recipients and approvals:** transfers to any non-zero recipient arrive exactly, and `approve` stores any value unchanged.\n- **Allowances:**\n  - Spending an allowance in two parts leaves the same result as spending it in one.\n  - An allowance one below the maximum is still reduced when spent.\n  - An exhausted allowance cannot be spent again.\n  - A maximum allowance still can't take more than the holder's balance.\n  - An owner needs an approval to use `transferFrom` on their own tokens.\n  - A `transferFrom` from any caller without an allowance reverts.\n- **Events and unknown calls:** spending an allowance does not emit an `Approval` event, and unknown function calls revert.\n\n**Findings:** none, so I did not write `.imd-findings.json`. One behaviour worth knowing, which is standard ERC-20 and was already documented in the README: tokens sent to the token contract's own address can never be moved again. A test now pins this down.\n\nThe protected launch tests in `.imd/reads/` can't run here because the Uniswap v4 code they import isn't in this repository; they belong to the later launch checks.","treeHash":"8a29c388a4074469882833bf0b0420d7e6a0f9a9","usage":{"cachedInputTokens":464574,"inputTokens":18,"model":"claude-opus-5-5","outputTokens":12675,"runtime":"claude","turns":12,"wallClockMs":141383}},{"artifacts":[],"attempt":1,"bundleHash":"45794e8d5890fd1ce0247b273cb0b7c2631a80c1eab8916fcb7c759c3322ab9c","device":"78362912813d42a5","findings":[],"hash":"230e582a91558fc543857bf960695a431223287587dca7a73c60e879d88f9faa","nodeId":"294aa839-079b-4bb9-a231-f21a96d0a877","outcome":"completed","summary":"Created [launch.json](/home/imd-worker/.identitymd/work/14d9abdf-5714-4dd8-953c-1eb4cb13f1c6/294aa839-079b-4bb9-a231-f21a96d0a877/launch.json) matching `MADToken`, its exact supply, empty constructor arguments, and the required pool and economics.\n\n`forge build` succeeded. All 33 tests passed with the supplied fuzz seed. Only `launch.json` is changed for submission.","treeHash":"5f60154e735c8f9607bd25ac3ae9b5ed186402cd","usage":{"cachedInputTokens":184960,"inputTokens":24068,"model":"gpt-6-astra","outputTokens":2667,"runtime":"codex","turns":3,"wallClockMs":69580}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3f91b58cf7cd2d45","findings":[{"citation":"resolved","description":"Periphery pass. The provenance note for the vendored test library states the files are unchanged upstream sources. Downloading the referenced archive (SHA-256 45157353ab49eab01d294565866731e599b32401757229689ee459aa26b7ee94, which matches the note) and comparing file by file shows seven files differ from the tag: src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol. Every difference is a line reflow (the project's `forge fmt` with line_length 120 was evidently run over lib/); with all whitespace stripped the files hash identically, so there is no semantic change and no effect on what the tests check or on the token's bytecode. The OpenZeppelin vendoring (lib/openzeppelin-contracts, five files plus LICENSE) was checked the same way and is byte-identical to the v5.0.2 archive. The defect is the inaccurate provenance statement: a release or verifier step that checks vendored dependencies byte-for-byte against the stated archive, as the note invites, fails on these seven files. Minimal fix: restore the seven files from the v1.9.7 archive (and exclude lib/ from `forge fmt`), or amend the note to say the files were reformatted and are semantically identical. Production code is unaffected.","line":11,"path":"lib/forge-std/UPSTREAM.md","reproduction":"From the repository root: `curl -sSL -o /tmp/fs.tgz https://codeload.github.com/foundry-rs/forge-std/tar.gz/refs/tags/v1.9.7 && sha256sum /tmp/fs.tgz` prints the SHA-256 in UPSTREAM.md. `tar xzf /tmp/fs.tgz -C /tmp && cmp /tmp/forge-std-1.9.7/src/StdAssertions.sol lib/forge-std/src/StdAssertions.sol` -> expected (per the note): no output, exit 0; actual: `differ: byte 16919, line 480`, exit 1. Same for the other six files listed. `diff /tmp/forge-std-1.9.7/src/StdAssertions.sol lib/forge-std/src/StdAssertions.sol | head` shows only function-signature line reflows; `tr -d '[:space:]' < A | sha256sum` equals the same for B for all seven files.","severity":"low","snippet":"Files are unchanged upstream sources. Only the source files needed by this project and the upstream license(s) are included; no submodule or package installation is required.","title":"forge-std UPSTREAM.md claims unchanged upstream sources, but seven vendored files were reformatted and are not byte-identical to the v1.9.7 tag"},{"citation":"resolved","description":"Execution Trace pass, across-transaction item 'approval residuals'. `approve` overwrites the allowance unconditionally, so a holder who replaces a live non-zero allowance with another non-zero value can be front-run by the spender, who spends the old allowance first and then the new one. This is the behaviour the ERC-20 standard specifies, OpenZeppelin v5.0.2 deliberately provides no increase/decreaseAllowance, and README.md line 73 already tells holders to revoke to zero and wait for confirmation before setting a replacement. It is recorded here as a trust assumption so the judge has the trace; it is not a defect in this implementation and no code change is recommended, since any 'fix' (rejecting non-zero to non-zero approvals, as USDT does) deviates from the standard and breaks routers and permit-less integrations.","line":132,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: holder H has 1000 MAD. Tx1: H calls approve(S, 100). Tx2 (H intends to lower it): H submits approve(S, 50). S sees Tx2 in the mempool and lands transferFrom(H, S, 100) before it; allowance goes 100 -> 0, S holds 100. Tx2 then executes and sets allowance to 50; S calls transferFrom(H, S, 50). Result: S has moved 150 MAD; H intended at most 100 then 50 as a replacement, i.e. 50 at most after Tx2. Expected by the holder: 50 total spendable after the replacement. Actual: 150. Exactly the standard ERC-20 behaviour; mitigated by approve(S, 0) first, as the README states.","severity":"info","snippet":"    function approve(address spender, uint256 value) public virtual returns (bool) {","title":"Standard ERC-20 approve-replacement race: a spender can consume both the old and the new allowance (inherent to the standard, already documented in README)"}],"hash":"4863b22b0e8e678939923f1142a8d0dd147d614fd3dd82be234c7548a31bfef3","nodeId":"5c59a8f9-e666-413f-8831-d7fd93c47d8c","outcome":"completed","summary":"The findings file is valid JSON, both quoted snippets match the tree line for line, and the working tree is clean apart from the findings file and the gitignored scratch test.\n\n**Result: no defects in the token's control flow.** The review found nothing in the Execution Trace, Periphery or First Principles areas that loses funds, breaks a launch flow or lets a privileged party act. The findings file holds one low and one informational item plus eleven coverage rows.\n\n**What was checked**\n\n- **Execution trace.** All three entry points were traced through the OpenZeppelin v5.0.2 internals with concrete inputs: zero address as sender, receiver and spender, zero and max-uint amounts, self-transfers, owner acting as its own spender, infinite allowances, and reverts that must leave allowance and balances untouched. Every path behaves as the standard requires. Transfers make no external call, so there is no callback or reentrancy surface.\n- **Periphery.** Every vendored file was compared against the upstream archives named in the two UPSTREAM.md notes. OpenZeppelin is byte-identical. forge-std has seven files that differ only by whitespace reflow, which I confirmed by hashing with whitespace stripped.\n- **First principles.** Supply is exactly 1e27 minted once to the immediate deployer, which a CREATE2 probe confirms is the factory and not the transaction origin. The compiled ABI exposes only approve, transfer and transferFrom as state-changing functions, no fallback or receive, and the runtime bytecode contains no DELEGATECALL, CALLCODE, SELFDESTRUCT or even CALL on any reachable path. Launch legs move exact amounts since there is no fee, burn or exemption logic.\n- **Checks run.** Build, the seeded project test suite, format check, and nine scratch probes in test/scratch/Probe.t.sol all pass.\n\n**Findings recorded**\n\n1. **Low.** The forge-std provenance note claims unchanged upstream files, but seven files were reformatted. No semantic change and no effect on production code. Fix is to restore the files from the tag or amend the note.\n2. **Info.** The standard ERC-20 approve-replacement race, with a concrete trace. Already documented in the README and inherent to the standard, so no code change is recommended.\n\n**Not reached.** The real Uniswap v4 seed and swap were not executed locally because v4-core is not vendored and lib/ may not be modified. The token's pool interaction is plain transfer and transferFrom, so I marked that row as holding by trace, and the protected suite covers it downstream.","treeHash":null,"usage":{"cachedInputTokens":864544,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":19617,"runtime":"claude","turns":31,"wallClockMs":284120}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"99e4819277ea59fc","findings":[{"citation":"resolved","description":"MADToken inherits OpenZeppelin v5.0.2 ERC20 unchanged and adds no allowance-adjusting extension (no increaseAllowance/decreaseAllowance, no ERC-2612 permit). approve() overwrites the allowance slot in ERC20._approve (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:291 `_allowances[owner][spender] = value;`), so an owner who lowers a non-zero allowance to a new non-zero value can be front-run: the spender uses the old allowance first, then the replacement. This is the well-known ERC-20 approve race and is a property of the standard interface the brief asked for, not a logic defect in this code. The README (line 73) already documents it and tells integrators to revoke to zero first. Reported at info only so the judge has the record from the Economic Security pass ('legitimate features turned against the protocol'); no code change is required for the brief as stated. If the requester wants in-token mitigation, the minimal additive option is an ERC-2612 permit or increase/decreaseAllowance helpers, which would change the ABI and should be a deliberate scope decision.","line":8,"path":"src/MADToken.sol","reproduction":"State: alice holds 1000e18 MAD, alice.approve(bob, 100e18). Alice then broadcasts approve(bob, 50e18) intending to reduce exposure to 50e18. Sequence: (1) bob front-runs with transferFrom(alice, bob, 100e18) -> succeeds, allowance 0; (2) alice's approve(bob, 50e18) mines -> allowance 50e18; (3) bob transferFrom(alice, bob, 50e18) -> succeeds. Expected by alice: bob can move at most 100e18 (old) or 50e18 (new). Actual: bob moved 150e18. Verified locally in test/scratch/EconomicsScratch.t.sol::test_ApproveRaceSpendsOldPlusNew. Mitigation path available to alice today: approve(bob, 0), wait for inclusion, then approve(bob, 50e18).","severity":"info","snippet":"contract MADToken is ERC20 {","title":"Standard ERC-20 approve race: replacing a live allowance lets the spender consume old plus new amount (inherent to the standard, already documented in README)"}],"hash":"4ac4a7d4adfbd626d12c3b98c49aec16eafd6b1830e2ec591708db1a22f6b25c","nodeId":"7db0ef93-149b-4f48-b826-d21268f34fb1","outcome":"completed","summary":"The review is complete and the report is written to `.imd-findings.json`.\n\n**Outcome:** no economic, invariant or flow-gap defect found in the MAD token. The contract is an unmodified OpenZeppelin v5.0.2 ERC20 with a single constructor mint of 10^27 units to the deployer, and nothing in it can tax, block, grow or freeze a balance.\n\n**What I checked, from the Economic Security, Invariant and Flow Gap guides**\n\n- Every vendored OpenZeppelin file was diffed byte for byte against upstream v5.0.2 on GitHub. All five are identical, so the library is not a hidden defect source.\n- The compiled ABI holds only the constructor, the three listed state-changing functions and seven views. No mint, burn, owner, pause or initializer selector exists.\n- Supply conservation: the only writer of balances and total supply is the inherited update routine, and mint is reachable only from the constructor. The project's invariant suite and my scratch fuzz both preserve every unit.\n- Launch flows: the 10/85/5 split and the swarm's 2/8 sub-split each divide 10^27 with zero dust, and factory, distributor, pool and trader legs all arrive whole. No exemption list is needed because no path takes a fee.\n- Allowance paths: finite allowances decrement exactly, unlimited ones stay untouched, a zero-address sender fails the allowance check so there is no mint path, and self-transfers preserve balances.\n- External dependencies, oracles, callbacks, sentinel addresses and shared caps: none exist in the token, so nothing can be broken, starved or sandwiched.\n\n**One info-level note** is recorded: the standard ERC-20 approve overwrite race, reproduced with a concrete sequence where a spender holding a 100 allowance front-runs a reduction to 50 and moves 150. It is inherent to the interface the brief asked for and the README already documents it, so no change is required. I flagged it only so the judge has the record.\n\n**Coverage record:** all three entry points are answered, approve as `finding` with the info reference and transfer and transferFrom as `holds`, plus five invariant rows. A scratch test file under `test/scratch/` verified the claims and all six of its checks pass. The project's own 33 tests also pass.","treeHash":null,"usage":{"cachedInputTokens":1083186,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":13360,"runtime":"claude","turns":29,"wallClockMs":228722}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"da7ed792c3bf5b80","findings":[],"hash":"611cd4ebd1fed2825bf6e4bd5593d7f0f7b27e0c703bb82a587d770944dd8a43","nodeId":"45f7b5ee-b38d-438a-bda2-ddc659418afe","outcome":"completed","summary":"I found no defects, so `.imd-findings.json` has an empty findings list. Its coverage record marks all three entry points, plus the supply invariant, as `holds`.\n\n**The code.** `src/MADToken.sol` is a plain OpenZeppelin v5.0.2 ERC20 with nothing overridden. The constructor mints `1_000_000_000 * 10 ** 18` once to `msg.sender` (the factory during launch). There is no owner, no further minting, no burn, no fee, no hook, no pause, and no DELEGATECALL or SELFDESTRUCT.\n\n**Entry points:**\n- **`transfer`**: rejects the zero address as sender or receiver, reverts if the balance is too low, and moves exactly the amount asked. So the factory's transfers to the distributor, the pool manager and the remainder address arrive in full.\n- **`transferFrom`**: checks and reduces the allowance (an unlimited allowance stays unlimited), then does the same exact transfer. A failure reverts the whole call.\n- **`approve`**: rejects the zero address as owner or spender, overwrites the allowance and emits `Approval`.\n\n**Manifest.** `launch.json` matches the code: 18 decimals, total supply `1000000000000000000000000000`, no constructor arguments (the constructor takes none), no application contracts, and only schema fields.\n\n**Specialist findings:**\n- **Approve front-running race** (audit_flow and audit_economics): these are the same root cause, so I merged them, then dropped the result. A spender spending the old allowance before a replacement lands is how the ERC-20 standard works, not a defect in this code, and the README already tells holders to revoke to zero first.\n- **forge-std provenance note** (low): dropped. It concerns `lib/`, which is outside this review and which submissions may not touch, and the specialist themselves showed the differences are whitespace only, with no effect on the token's bytecode or the tests.\n- **aderyn's \"large numeric literal\"**: style only, not a defect.\n\n**Checks:**\n- The project's own suite passes: 49 of 49 tests, invariant runs included.\n- The supplied protected launch tests did not run here, so they don't count as passed. They import `LaunchLiquidity.sol`, `PoolInitializationGuard.sol`, `HookFlags.sol` and v4-core, none of which this tree has, so they don't compile. I removed the scratch copies afterwards and changed no other files.","treeHash":null,"usage":{"cachedInputTokens":75510,"inputTokens":129079,"model":"claude-opus-5-5","outputTokens":2928,"runtime":"claude","turns":6,"wallClockMs":93701}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4dd67dae195771b6","findings":[],"hash":"9200fd9c38e2329d0560cc2294872522718f6312e8c54bd01e38f0b0f5119807","nodeId":"3e602a00-5f1d-4006-93c3-69eeef41406f","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree is clean apart from the gitignored scratch test.\n\n**Result: no defects found** in the Access Control, Trust Gap and Asymmetry areas. The findings file at `.imd-findings.json` holds an empty findings list and eight coverage rows, all `holds`.\n\n**What the token is.** `src/MADToken.sol` is sixteen lines: it inherits the vendored OpenZeppelin ERC20 and its constructor mints one billion tokens with 18 decimals to msg.sender. The compiled ABI contains only the standard ERC-20 functions, events and ERC-6093 errors, plus the supply constant getter.\n\n**What I verified.**\n- The permission model has no roles, modifiers, owner storage, initializer, proxy or admin setters. Balances are written only through the OpenZeppelin update path, allowances only by their owner or by a spender decrementing their own grant.\n- The deployer holds no power after construction. Twenty-two common privileged selectors revert whether called by the deployer or a stranger, and the deployer cannot pull from a holder without allowance.\n- The transfer and transferFrom paths share one internal transfer, so no caller class is treated differently. A fuzz test confirmed symmetric delivery and correct allowance accounting, including the unlimited-allowance case.\n- The five vendored OpenZeppelin files are byte-identical to the upstream v5.0.2 release archive, whose hash matches the one recorded in the repository.\n- Runtime and creation bytecode contain no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT, and the contract rejects ETH.\n- The project's own 33 tests pass with the pinned fuzz seed, and my six scratch tests pass.\n\n**Not covered.** The protected launch floor's real Uniswap v4 seed and swap could not be run locally because it needs the launch environment variables and v4 sources. The token has no fee or exemption logic, so those flows depend only on the exact-transfer behavior verified above. The approve front-running race is standard ERC-20 behavior, documented in the README, and is not reported as a defect.","treeHash":null,"usage":{"cachedInputTokens":688293,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":12359,"runtime":"claude","turns":28,"wallClockMs":225420}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a7ac9f7a7687c25e","findings":[],"hash":"9bd069d25b4072e1a61cf480c4f818ca74edf7b66facecbcd4c1dcb9d829d63e","nodeId":"cbe8a8bd-0e52-4990-911d-d4d1af5f4d23","outcome":"completed","summary":"The review is complete. No math defects were found, and the findings file holds an empty list with a full coverage record.\n\n**What was reviewed.** The token is a 16-line wrapper over OpenZeppelin ERC20 v5.0.2 with a single constructor mint of 10^27 units. All arithmetic lives in the vendored library. I compared the five vendored files byte-for-byte against the upstream v5.0.2 tag, and all are identical.\n\n**What was checked in the assigned area.** Each check was run as a Foundry test under `test/scratch/`, alongside the existing 33-test suite, and everything passed.\n\n- **Math Precision.** The supply constant folds at compile time to exactly 1e27 with no overflow. It fits uint96 and int128, so Uniswap v4 deltas and vote-style packing cannot truncate it. The 10/85/5 percent launch split in basis points divides 1e27 exactly with zero dust and no intermediate overflow. The aderyn large-literal lead is style only.\n- **Boundary.** Transfers of max uint and balance plus one revert cleanly with the balance error. Full-balance self-transfer preserves the balance. An allowance of max minus one is finite and decremented, while max is infinite. A zero-value transferFrom from the zero address reverts before reaching the mint path. The token has no external calls, no payable paths, no sentinel branches and no bytes decoding.\n- **Numerical Gap.** Supply conservation held across 1024 fuzzed holder and allowance splits. The derived opening price from the 2e24 FWA cap sits inside Uniswap v4 sqrtPrice and tick bounds in either currency order.\n\n**Coverage record.** All three listed entry points are marked `holds`, plus seven invariant rows covering the constant, downcast fit, launch split, price bounds, library provenance, the constructor mint and the Boundary guide's empty applicability.\n\nNothing in the area was left unreached. No repository file outside `.imd-findings.json` and `test/scratch/` was touched.","treeHash":null,"usage":{"cachedInputTokens":797861,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":13461,"runtime":"claude","turns":26,"wallClockMs":277848}}],"verification":[{"checks":[{"durationMs":1230,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.16s\nCompiler run successful!\n","passed":true},{"durationMs":1794,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] testFuzz_PoolTokenLegsTransferExactlyInBothDirections(uint256) (runs: 1024, μ: 277546, ~: 277092)\nLogs:\n  Bound result 20775\n\n[PASS] test_Create2DeploymentMintsEntireSupplyToFactory() (gas: 44864)\n[PASS] test_LaunchDistributionAndClaimsArriveWhole() (gas: 248604)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 35.03ms (34.80ms CPU time)\n\nRan 29 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_RevertTransferAboveAllowance(uint256,uint256) (runs: 1024, μ: 122879, ~: 123378)\nLogs:\n  Bound result 333979085935934238102881934\n  Bound result 37505124274695161\n\n[PASS] testFuzz_RevertTransferAboveBalance(uint256,uint256) (runs: 1024, μ: 126991, ~: 127083)\nLogs:\n  Bound result 37739167397051837744057140\n  Bound result 37505124274695161\n\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 1024, μ: 150715, ~: 150565)\nLogs:\n  Bound result 824510294019609139213567333\n\n[PASS] testFuzz_TransferFromRespectsBalanceAndAllowance(uint256,uint256) (runs: 1024, μ: 163149, ~: 164876)\nLogs:\n  Bound result 7806101384846672707\n  Bound result 452383868889\n\n[PASS] test_AllowancesAreIsolatedByOwnerAndSpender() (gas: 204052)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveFunds() (gas: 88809)\n[PASS] test_ApproveReplacesAndRevokesAllowance() (gas: 163858)\n[PASS] test_ConstructorMintsOnceToImmediateDeployerAndEmitsTransfer() (gas: 40702)\n[PASS] test_InfiniteApprovalIsNotConsumed() (gas: 128965)\n[PASS] test_MetadataAndInitialSupply() (gas: 94768)\n[PASS] test_NoMintBurnOwnershipPauseSeizureOrUpgradeEntrypoints() (gas: 886653)\n[PASS] test_RejectsNativeCurrency() (gas: 36877)\n[PASS] test_RevertApproveZeroSpender() (gas: 37618)\n[PASS] test_RevertInsufficientBalance() (gas: 57416)\n[PASS] test_RevertTransferFromAboveAllowanceLeavesStateUnchanged() (gas: 115665)\n[PASS] test_RevertTransferFromAboveBalanceRestoresAllowance() (gas: 126141)\n[PASS] test_RevertTransferFromToZeroRestoresAllowance() (gas: 114079)\n[PASS] test_RevertTransferFromWithoutAllowanceIncludingDeployer() (gas: 139866)\n[PASS] test_RevertTransferFromZeroCannotMint() (gas: 57406)\n[PASS] test_RevertTransferMaxUintWithoutOverflow() (gas: 55000)\n[PASS] test_RevertTransferToZeroAddressIncludingZeroAmount() (gas: 71904)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51540)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 91539)\n[PASS] test_TransferEntireSupplyAndOneSmallestUnit() (gas: 143614)\n[PASS] test_TransferFromDeliversExactAmountAndConsumesAllowance() (gas: 242035)\n[PASS] test_TransferFromToSelfConsumesFiniteAllowanceWithoutMovingBalance() (gas: 107554)\n[PASS] test_TransferToContractDoesNotInvokeRecipient() (gas: 172120)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73432)\n[PASS] test_ZeroTransferFromWithoutAllowanceSucceeds() (gas: 63926)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 38.32ms (146.81ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS]\nMADTokenInvariantTest invariants:\n[PASS] invariant_AllTokensRemainAccountedFor\n[PASS] invariant_SupplyAndMetadataStayFixed\n MADTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| MADTokenHandler | approve          | 4223  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| MADTokenHandler | delegatedMove    | 3970  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| MADTokenHandler | move             | 4026  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| MADTokenHandler | unauthorizedMove | 4165  | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 100\n  Bound result 0\n  Bound result 25\n  Bound result 0\n  Bound result 0\n  Bound result 152\n  Bound result 3466\n  Bound result 60000000000000000000\n  Bound result 8435\n  Bound result 11\n  Bound result 931\n  Bound result 2\n  Bound result 2799\n  Bound result 100\n  Bound result 55\n  Bound result 22\n  Bound result 64\n  Bound result 40\n  Bound result 10000\n  Bound result 3\n  Bound result 11\n  Bound result 7993\n  Bound result 730\n  Bound result 23\n  Bound result 8493\n  Bound result 10000\n  Bound result 102\n  Bound result 25\n  Bound result 74849734493786729267585837\n  Bound result 6\n  Bound result 99999999999991500001\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.72s (1.72s CPU time)\n\nRan 3 test suites in 1.72s (1.79s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":38,"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,\"LICENSE\":21,\"README.md\":85,\"foundry.toml\":23,\"remappings.txt\":2,\"src/MADToken.sol\":16,\"test/LaunchCompatibility.t.sol\":79,\"test/MADToken.invariant.t.sol\":127,\"test/MADToken.t.sol\":345},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":419,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":312,"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":"08715e3c9a0ce4c3bbf19dc88fba452604ce7100c821f254cc2ea023092c5989","verifiedTreeHash":"03841a45839fe8b2f2031315709c2045ff7aee4c","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":1658,"exitCode":0,"name":"build","output":"Compiling 30 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.58s\nCompiler run successful!\n","passed":true},{"durationMs":5265,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 29 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_RevertTransferAboveAllowance(uint256,uint256) (runs: 1024, μ: 122932, ~: 123390)\nLogs:\n  Bound result 333979085935934238102881934\n  Bound result 37505124274695161\n\n[PASS] testFuzz_RevertTransferAboveBalance(uint256,uint256) (runs: 1024, μ: 127006, ~: 127095)\nLogs:\n  Bound result 830503255852343016517786001\n  Bound result 24767267331223\n\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 1024, μ: 150537, ~: 150541)\nLogs:\n  Bound result 4\n\n[PASS] testFuzz_TransferFromRespectsBalanceAndAllowance(uint256,uint256) (runs: 1024, μ: 163342, ~: 164876)\nLogs:\n  Bound result 12615\n  Bound result 11829\n\n[PASS] test_AllowancesAreIsolatedByOwnerAndSpender() (gas: 204052)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveFunds() (gas: 88809)\n[PASS] test_ApproveReplacesAndRevokesAllowance() (gas: 163858)\n[PASS] test_ConstructorMintsOnceToImmediateDeployerAndEmitsTransfer() (gas: 40702)\n[PASS] test_InfiniteApprovalIsNotConsumed() (gas: 128965)\n[PASS] test_MetadataAndInitialSupply() (gas: 94768)\n[PASS] test_NoMintBurnOwnershipPauseSeizureOrUpgradeEntrypoints() (gas: 886653)\n[PASS] test_RejectsNativeCurrency() (gas: 36877)\n[PASS] test_RevertApproveZeroSpender() (gas: 37618)\n[PASS] test_RevertInsufficientBalance() (gas: 57416)\n[PASS] test_RevertTransferFromAboveAllowanceLeavesStateUnchanged() (gas: 115665)\n[PASS] test_RevertTransferFromAboveBalanceRestoresAllowance() (gas: 126141)\n[PASS] test_RevertTransferFromToZeroRestoresAllowance() (gas: 114079)\n[PASS] test_RevertTransferFromWithoutAllowanceIncludingDeployer() (gas: 139866)\n[PASS] test_RevertTransferFromZeroCannotMint() (gas: 57406)\n[PASS] test_RevertTransferMaxUintWithoutOverflow() (gas: 55000)\n[PASS] test_RevertTransferToZeroAddressIncludingZeroAmount() (gas: 71904)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51540)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 91539)\n[PASS] test_TransferEntireSupplyAndOneSmallestUnit() (gas: 143614)\n[PASS] test_TransferFromDeliversExactAmountAndConsumesAllowance() (gas: 242035)\n[PASS] test_TransferFromToSelfConsumesFiniteAllowanceWithoutMovingBalance() (gas: 107554)\n[PASS] test_TransferToContractDoesNotInvokeRecipient() (gas: 172120)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73432)\n[PASS] test_ZeroTransferFromWithoutAllowanceSucceeds() (gas: 63926)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 43.95ms (174.44ms CPU time)\n\nRan 3 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] testFuzz_PoolTokenLegsTransferExactlyInBothDirections(uint256) (runs: 1024, μ: 277459, ~: 277092)\nLogs:\n  Bound result 20775\n\n[PASS] test_Create2DeploymentMintsEntireSupplyToFactory() (gas: 44864)\n[PASS] test_LaunchDistributionAndClaimsArriveWhole() (gas: 248604)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 44.02ms (43.63ms CPU time)\n\nRan 15 tests for test/MADToken.edge.t.sol:MADTokenEdgeTest\n[PASS] testFuzz_ApproveStoresAnyValueVerbatim(address,uint256,uint256) (runs: 1000, μ: 109527, ~: 109455)\n[PASS] testFuzz_ConstructorMintsWholeSupplyToAnyDeployer(address) (runs: 1000, μ: 18160, ~: 18160)\n[PASS] testFuzz_RevertTransferFromAnyCallerWithoutAllowance(address,uint256) (runs: 1000, μ: 47595, ~: 47714)\nLogs:\n  Bound result 507086295940883396506239795\n\n[PASS] testFuzz_SplitSpendEqualsSingleSpend(uint256,uint256,uint256) (runs: 1000, μ: 197163, ~: 199516)\nLogs:\n  Bound result 10046\n  Bound result 1996\n  Bound result 1949\n\n[PASS] testFuzz_TransferToAnyNonzeroRecipientIsExact(address,uint256) (runs: 1000, μ: 98191, ~: 98586)\nLogs:\n  Bound result 10191\n\n[PASS] test_AllowanceOneBelowMaxIsConsumed() (gas: 123936)\n[PASS] test_EachDeploymentIsIndependent() (gas: 109582)\n[PASS] test_RevertSecondSpendOfExhaustedAllowance() (gas: 146200)\n[PASS] test_RevertSpendingAboveBalanceDespiteInfiniteAllowance() (gas: 162739)\n[PASS] test_RevertUnknownSelectorAndCalldata() (gas: 56891)\n[PASS] test_RuntimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1268945)\n[PASS] test_SelfApprovalStillRequiredForOwnTransferFrom() (gas: 156207)\n[PASS] test_SupplyIsExactlyTenToTheTwentySeven() (gas: 21730)\n[PASS] test_TokensSentToTokenContractAreStuck() (gas: 100613)\n[PASS] test_TransferFromDoesNotEmitApproval() (gas: 127035)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 44.04ms (219.43ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS]\nMADTokenInvariantTest invariants:\n[PASS] invariant_AllTokensRemainAccountedFor\n[PASS] invariant_SupplyAndMetadataStayFixed\n MADTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| MADTokenHandler | approve          | 4223  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| MADTokenHandler | delegatedMove    | 3970  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| MADTokenHandler | move             | 4026  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| MADTokenHandler | unauthorizedMove | 4165  | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 40\n  Bound result 123000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 40\n  Bound result 0\n  Bound result 0\n  Bound result 3465\n  Bound result 25\n  Bound result 0\n  Bound result 60\n  Bound result 930\n  Bound result 6\n  Bound result 235\n  Bound result 123000000000000000000\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 60000000000000000000\n  Bound result 500\n  Bound result 0\n  Bound result 60\n  Bound result 7874\n  Bound result 935\n  Bound result 50\n  Bound result 5155\n  Bound result 500\n  Bound result 0\n  Bound result 100\n  Bound result 191238715803098897226593751\n  Bound result 1795\n  Bound result 0\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.72s (1.72s CPU time)\n\nRan 1 test for test/MADToken.ledger.invariant.t.sol:MADLedgerInvariantTest\n[PASS]\nMADLedgerInvariantTest invariants:\n[PASS] invariant_AllowancesMatchLedger\n[PASS] invariant_BalancesMatchLedger\n MADLedgerInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------+--------------+-------+---------+----------╮\n| Contract         | Selector     | Calls | Reverts | Discards |\n+==============================================================+\n| MADLedgerHandler | approve      | 5501  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| MADLedgerHandler | transfer     | 5445  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| MADLedgerHandler | transferFrom | 5438  | 0       | 0        |\n╰------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 927\n  Bound result 10000\n  Bound result 410068508579434098815231035\n  Bound result 100000000000000000000000000\n  Bound result 6\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.18s (5.18s CPU time)\n\nRan 5 test suites in 5.18s (7.04s CPU time): 49 tests passed, 0 failed, 0 skipped (49 total tests)\n","passed":true},{"durationMs":32,"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,\"LICENSE\":21,\"README.md\":85,\"foundry.toml\":23,\"remappings.txt\":2,\"src/MADToken.sol\":16,\"test/LaunchCompatibility.t.sol\":79,\"test/MADToken.edge.t.sol\":172,\"test/MADToken.invariant.t.sol\":127,\"test/MADToken.ledger.invariant.t.sol\":184,\"test/MADToken.t.sol\":345},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"0e4d0d2cc3c3ed8f4dd6bb508f90167256b2e330c86808d013d8384da65eb577","verifiedTreeHash":"8a29c388a4074469882833bf0b0420d7e6a0f9a9","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":1296,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.22s\nCompiler run successful!\n","passed":true},{"durationMs":1757,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 29 tests for test/MADToken.t.sol:MADTokenTest\n[PASS] testFuzz_RevertTransferAboveAllowance(uint256,uint256) (runs: 1024, μ: 122879, ~: 123378)\nLogs:\n  Bound result 333979085935934238102881934\n  Bound result 37505124274695161\n\n[PASS] testFuzz_RevertTransferAboveBalance(uint256,uint256) (runs: 1024, μ: 126991, ~: 127083)\nLogs:\n  Bound result 830503255852343016517786001\n  Bound result 24767267331223\n\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 1024, μ: 150715, ~: 150565)\nLogs:\n  Bound result 76521892176713153\n\n[PASS] testFuzz_TransferFromRespectsBalanceAndAllowance(uint256,uint256) (runs: 1024, μ: 163149, ~: 164876)\nLogs:\n  Bound result 24570\n  Bound result 17334\n\n[PASS] test_AllowancesAreIsolatedByOwnerAndSpender() (gas: 204052)\n[PASS] test_ApproveEmitsEventAndDoesNotMoveFunds() (gas: 88809)\n[PASS] test_ApproveReplacesAndRevokesAllowance() (gas: 163858)\n[PASS] test_ConstructorMintsOnceToImmediateDeployerAndEmitsTransfer() (gas: 40702)\n[PASS] test_InfiniteApprovalIsNotConsumed() (gas: 128965)\n[PASS] test_MetadataAndInitialSupply() (gas: 94768)\n[PASS] test_NoMintBurnOwnershipPauseSeizureOrUpgradeEntrypoints() (gas: 886653)\n[PASS] test_RejectsNativeCurrency() (gas: 36877)\n[PASS] test_RevertApproveZeroSpender() (gas: 37618)\n[PASS] test_RevertInsufficientBalance() (gas: 57416)\n[PASS] test_RevertTransferFromAboveAllowanceLeavesStateUnchanged() (gas: 115665)\n[PASS] test_RevertTransferFromAboveBalanceRestoresAllowance() (gas: 126141)\n[PASS] test_RevertTransferFromToZeroRestoresAllowance() (gas: 114079)\n[PASS] test_RevertTransferFromWithoutAllowanceIncludingDeployer() (gas: 139866)\n[PASS] test_RevertTransferFromZeroCannotMint() (gas: 57406)\n[PASS] test_RevertTransferMaxUintWithoutOverflow() (gas: 55000)\n[PASS] test_RevertTransferToZeroAddressIncludingZeroAmount() (gas: 71904)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51540)\n[PASS] test_TransferDeliversExactAmountAndEmitsEvent() (gas: 91539)\n[PASS] test_TransferEntireSupplyAndOneSmallestUnit() (gas: 143614)\n[PASS] test_TransferFromDeliversExactAmountAndConsumesAllowance() (gas: 242035)\n[PASS] test_TransferFromToSelfConsumesFiniteAllowanceWithoutMovingBalance() (gas: 107554)\n[PASS] test_TransferToContractDoesNotInvokeRecipient() (gas: 172120)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73432)\n[PASS] test_ZeroTransferFromWithoutAllowanceSucceeds() (gas: 63926)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 35.58ms (141.13ms CPU time)\n\nRan 3 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] testFuzz_PoolTokenLegsTransferExactlyInBothDirections(uint256) (runs: 1024, μ: 277546, ~: 277092)\nLogs:\n  Bound result 224\n\n[PASS] test_Create2DeploymentMintsEntireSupplyToFactory() (gas: 44864)\n[PASS] test_LaunchDistributionAndClaimsArriveWhole() (gas: 248604)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 35.59ms (35.42ms CPU time)\n\nRan 1 test for test/MADToken.invariant.t.sol:MADTokenInvariantTest\n[PASS]\nMADTokenInvariantTest invariants:\n[PASS] invariant_AllTokensRemainAccountedFor\n[PASS] invariant_SupplyAndMetadataStayFixed\n MADTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| MADTokenHandler | approve          | 4223  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| MADTokenHandler | delegatedMove    | 3970  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| MADTokenHandler | move             | 4026  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| MADTokenHandler | unauthorizedMove | 4165  | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 100\n  Bound result 0\n  Bound result 25\n  Bound result 0\n  Bound result 0\n  Bound result 152\n  Bound result 3466\n  Bound result 60000000000000000000\n  Bound result 8435\n  Bound result 11\n  Bound result 931\n  Bound result 2\n  Bound result 2799\n  Bound result 100\n  Bound result 55\n  Bound result 22\n  Bound result 64\n  Bound result 40\n  Bound result 10000\n  Bound result 3\n  Bound result 11\n  Bound result 7993\n  Bound result 730\n  Bound result 23\n  Bound result 8493\n  Bound result 10000\n  Bound result 102\n  Bound result 25\n  Bound result 74849734493786729267585837\n  Bound result 6\n  Bound result 99999999999991500001\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.67s (1.66s CPU time)\n\nRan 3 test suites in 1.67s (1.74s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":62,"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,\"LICENSE\":21,\"README.md\":85,\"foundry.toml\":23,\"launch.json\":24,\"remappings.txt\":2,\"src/MADToken.sol\":16,\"test/LaunchCompatibility.t.sol\":79,\"test/MADToken.invariant.t.sol\":127,\"test/MADToken.t.sol\":345},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"230e582a91558fc543857bf960695a431223287587dca7a73c60e879d88f9faa","verifiedTreeHash":"5f60154e735c8f9607bd25ac3ae9b5ed186402cd","verifierVersion":"0.1.0+560ab6a2"}]}