{"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":"2e3a1908-79f7-4956-8c25-33cc0381fd3f","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"072a7c2e2d5356883c4e0f41d818dbdb764dc564617db01fea034fc9e5148ba9","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":"2c50824da2ee12a1c7e85e977b26152c38c8f594219dc88f0b376e7dc7262155","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":"6c42d87fc425dded9d4250a62054bf4cd855e397cabc7eec7bae0f4b705da882","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":"f573d43a42a2473f38187938f0af3470e11a8b38d049fb9c95b5092c4a0c65ab","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":"fe0379b53159d54d7fbeb0ee6cab4d5c4b8a9c49f691e177703c51b461c5f629","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":"be9233a721d4bdca77190d28a485033fd373caeda1b60db212dc6195c8f252ec","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":"80fdf8ed7ba0289c50e9846fdf5980f639e1757a43cdc73fad549fbf2fa49d87","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"06641fadaecb29069708441b0b1f5f9982c8a7e642a2d5f0bdce201a19242715","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: MoneyCanBuy.fun (YOLO).\nToken name: MoneyCanBuy.fun\nToken symbol: YOLO\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"2c2fd67ee3391e9c2794be8408153d5f5532a9a8dabed992229553f55d9b7a3e","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"2e3a1908-79f7-4956-8c25-33cc0381fd3f","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2325-moneycanbuy-fun"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52254","feedbackHash":"dc0ed4dae092033bfa419e58b4c5294fd03a891d5213b6fb864dc27e72cc2956","nodeKey":"audit_economics","submissionHash":"072a7c2e2d5356883c4e0f41d818dbdb764dc564617db01fea034fc9e5148ba9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51169","feedbackHash":"e74dfb958b3e4d04e19201a886c94803b70b8fa9d4e9c76bc71f9629c4604b18","nodeKey":"audit_flow","submissionHash":"2c50824da2ee12a1c7e85e977b26152c38c8f594219dc88f0b376e7dc7262155","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52679","feedbackHash":"480f57687fde99163c6f05d9f2cd458457a7d3faea5d138b48ac970e02d6f283","nodeKey":"audit_judge","submissionHash":"6c42d87fc425dded9d4250a62054bf4cd855e397cabc7eec7bae0f4b705da882","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51025","feedbackHash":"a0f9b3aab53f6fd5fc6c85921e7131e23e2a9ec0989199e0ff7298a1cda22a18","nodeKey":"audit_math","submissionHash":"f573d43a42a2473f38187938f0af3470e11a8b38d049fb9c95b5092c4a0c65ab","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51530","feedbackHash":"09970350fe4f4748611343126ae08bb2aacda23c5b86a1b4b683597a60d564d3","nodeKey":"audit_permissions","submissionHash":"fe0379b53159d54d7fbeb0ee6cab4d5c4b8a9c49f691e177703c51b461c5f629","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51098","feedbackHash":"d1e45e4caa704500698e852e2be772e70ede8639f45dbe50832aa65bdfc785d2","nodeKey":"build_contract_project","submissionHash":"be9233a721d4bdca77190d28a485033fd373caeda1b60db212dc6195c8f252ec","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51741","feedbackHash":"e1369cb8846519086d18d18787d8e5cca426b8b56c4054793c3d30c686066cef","nodeKey":"manifest","submissionHash":"80fdf8ed7ba0289c50e9846fdf5980f639e1757a43cdc73fad549fbf2fa49d87","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51200","feedbackHash":"c1b70f7bef328f60aedc61c8c21c7df44c3e761c2e39c4c9dd2def87aeb22f5b","nodeKey":"write_foundry_tests","submissionHash":"06641fadaecb29069708441b0b1f5f9982c8a7e642a2d5f0bdce201a19242715","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"c9f7e2dce4a196834407da2df9a641544d6a0aa2e5e17ad0b771cc9b9f239698","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"12e4d920f40bf951f4e4e91f39fc4ae012e326611c8bfac4c9dd60cf5d9a844e","device":"2468e053049c5c80","findings":[],"hash":"06641fadaecb29069708441b0b1f5f9982c8a7e642a2d5f0bdce201a19242715","nodeId":"739a1d08-095a-4a97-94b4-2e98e3ab3c00","outcome":"completed","summary":"Added 22 edge-case and fuzz tests covering failed transfers, allowance rollback, revocation, and caller authorization. Expanded invariants to verify balances, allowances, fixed supply, and holder transferability.\n\n`forge build` and `forge test` pass offline with the required seed: 56 reported tests, including 32,768 invariant calls.\n\nOnly `test/` changed. No implementation defects found.","treeHash":"be186dee524a2d3821d1b45bfe25aac9d49ae8df","usage":{"cachedInputTokens":677248,"inputTokens":94367,"model":"gpt-6-astra","outputTokens":12626,"runtime":"codex","turns":4,"wallClockMs":313841}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"584bd638e7e022f0","findings":[],"hash":"072a7c2e2d5356883c4e0f41d818dbdb764dc564617db01fea034fc9e5148ba9","nodeId":"f9b1223a-bdce-48f0-bddd-a128cdba777f","outcome":"completed","summary":"The review is complete and the findings file is written. No source file was changed.\n\n**Outcome:** no defects found in the Economic Security, Invariant or Flow Gap areas. `.imd-findings.json` holds an empty findings list and nine coverage rows, one for each of the three listed entry points plus six invariants and economic flows I checked.\n\n**What I verified**\n\n- The token is a stock OpenZeppelin v5.0.2 ERC-20 with one constructor mint of exactly the brief's supply to the deployer. All five vendored library files are byte-identical to the upstream v5.0.2 archive.\n- Launch flows arrive whole. A scratch Foundry test modelled the 10/80/10 split, a PoolManager-style pull through transferFrom, claim and trade round-trips, and a 9-holder conservation fuzz. All passed, and the repository's own 34 tests pass too.\n- No supply growth path exists. The ABI exposes only the standard ERC-20 functions and the supply constant, there is no receive or fallback, and mint-style calls from the factory address revert.\n- No privileged power exists to move or freeze a holder. The factory has ordinary holder rights only.\n- The compiled runtime and creation code contain no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- The aderyn large-literal lead on line 10 is the correct 1e27 supply, not a defect.\n\n**Not covered:** no launch.json exists in the tree yet, so no manifest was checked. The protected floor tests that need the network's launch contracts and Uniswap v4 harness were read, not executed.","treeHash":null,"usage":{"cachedInputTokens":967985,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":13217,"runtime":"claude","turns":22,"wallClockMs":193316}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"87804e27e9c9f85a","findings":[],"hash":"2c50824da2ee12a1c7e85e977b26152c38c8f594219dc88f0b376e7dc7262155","nodeId":"af7f08ec-5ad7-4490-9382-e53ceac19fbd","outcome":"completed","summary":"The review is complete. The findings file is valid JSON and no tracked file was changed.\n\n**Result: no defects found.** The token is a four-line wrapper around the unmodified OpenZeppelin v5.0.2 ERC-20, and every path reachable through the three listed entry points behaves as the brief requires.\n\nWhat I verified, against the Execution Trace, Periphery and First Principles guides:\n\n- **Execution trace of each entry point.** `approve` writes only the allowance and rejects a zero spender. `transfer` rejects a zero receiver and an insufficient balance before any write, and moves the exact amount. `transferFrom` spends allowance first, but any later revert rolls that write back, so no partial state survives. The unlimited allowance does not decrease, which is the standard and documented semantics.\n- **Constructor and supply.** The constant is exactly 10^27 minor units, minted once to the deploying factory, with no constructor arguments and no payable path. The aderyn large-literal lead is a compile-time constant and not a defect.\n- **Privileged surface.** The compiled ABI exposes only the ERC-20 functions plus the supply constant. There is no mint, burn, pause, blocklist, owner, initializer or upgrade entry, so supply cannot grow and no one can move or freeze a holder.\n- **Periphery.** The five vendored OpenZeppelin files hash byte-for-byte to the upstream v5.0.2 tag. A reachable-block walk of the runtime finds no DELEGATECALL, CALLCODE or SELFDESTRUCT, and the code makes no external call, so the launch seed, swaps and distributor claims cannot be reentered or taxed.\n- **Checks run.** The project builds with solc 0.8.26 and all 34 tests pass with the seed named in the README.\n\nCoverage in `.imd-findings.json` has eight rows: the three listed entry points plus five invariants, all marked `holds`. The one thing not reviewable yet is `launch.json`, which does not exist in the tree because the manifest step has not run. The README's stated manifest values agree with the compiled token.","treeHash":null,"usage":{"cachedInputTokens":622439,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":8544,"runtime":"claude","turns":16,"wallClockMs":185687}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9812c5faf226f7c7","findings":[{"citation":"resolved","description":"Merged from the permissions specialist (the other four areas reported nothing). The token inherits OpenZeppelin v5.0.2 ERC20 unchanged; the vendored files were compared byte for byte against the upstream v5.0.2 archive (SHA-256 18c7b7e9...3925a, matching DEPENDENCIES.md). In ERC20._spendAllowance (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:305-315) an allowance of 0 is not less than a value of 0, so no revert occurs and _transfer emits Transfer(from, to, 0). An unprivileged caller can therefore have the contract log an outgoing zero-value transfer from any holder without that holder's approval. Balances, allowances and supply are unchanged; the only effect is off-chain (explorer/wallet address-poisoning display). This is the behaviour EIP-20 requires and the README documents zero-value transfers as supported. It is recorded as a trust note for the requester; no code change is recommended and it does not block the launch. Every nonzero value without allowance reverts with ERC20InsufficientAllowance.","line":9,"path":"src/MoneyCanBuyToken.sol","reproduction":"State: a Probe contract deploys MoneyCanBuyToken via CREATE2 (so it holds the 1e27 supply) and transfers 100 to holder 0x401D; allowance(0x401D, 0xBEEF) == 0. Call: vm.prank(0xBEEF); token.transferFrom(0x401D, 0xBEEF, 0). Actual: returns true and emits Transfer(0x401D, 0xBEEF, 0); balanceOf(0x401D) stays 100; allowance stays 0. Expected under EIP-20: identical. Control: vm.prank(0xBEEF); token.transferFrom(0x401D, 0xBEEF, 1) reverts. Verified with test/scratch/Judge.t.sol::test_zeroValueTransferFromWithoutAllowance (passes on this code, confirming the behaviour).","severity":"info","snippet":"contract MoneyCanBuyToken is ERC20 {","title":"Zero-value transferFrom needs no allowance, so anyone can make the token emit Transfer(holder, caller, 0)"}],"hash":"6c42d87fc425dded9d4250a62054bf4cd855e397cabc7eec7bae0f4b705da882","nodeId":"16f36709-99ba-4941-b3a4-c71dd5200714","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. The repository tree is unchanged apart from the findings file and my scratch test, both of which are ignored by git.\n\n**Outcome: no defects found.** The token is a bare OpenZeppelin v5.0.2 ERC-20 whose only custom code is a parameterless constructor minting the fixed supply to the deployer.\n\nWhat I verified:\n- **Vendored library integrity.** I downloaded the upstream v5.0.2 archive, confirmed its SHA-256 matches DEPENDENCIES.md, and compared all five vendored Solidity files byte for byte. All identical.\n- **Specialist findings.** Four areas reported nothing. The permissions specialist's single info note reproduces exactly as stated. A zero-value transferFrom with zero allowance succeeds and emits a Transfer event, because the allowance check is \"less than\" rather than \"less than or equal\". This is required by EIP-20 and documented in the README. I kept it as an info trust note with no change recommended. Nothing else to merge.\n- **Launch floor checks I could run locally.** A CREATE2 probe deploy leaves the probe holding the whole supply, the 10% distributor flow and onward claim arrive whole, supply stays fixed, the factory cannot pull from a holder without allowance, the reachable-opcode walk finds no DELEGATECALL, CALLCODE or SELFDESTRUCT, and both runtime and initcode are far below the size limits. The project's own 56 tests and my 5 scratch tests all pass.\n- **Manifest.** Constructor args are empty to match the parameterless constructor. Name, symbol, decimals, total supply and contract name all agree with the source. The pool and economics blocks match the launch's reference values.\n- **Static analysis.** Slither reported nothing. Aderyn's large-numeric-literal lead is the constant `1_000_000_000 * 10 ** 18`, which equals the manifest supply and is not a defect.\n\nThe coverage record answers all three entry points plus three invariant rows. The pool seed and swap tests from the protected floor need the network's Uniswap v4 harness, which is not vendored here, so I did not execute them. Since the token has no transfer logic beyond the unmodified library, nothing in those flows can differ from an ordinary transfer.","treeHash":null,"usage":{"cachedInputTokens":486286,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":8250,"runtime":"claude","turns":10,"wallClockMs":167595}},{"artifacts":[],"attempt":1,"bundleHash":"51b34f2f5211c4acd89e0fd38795ec62862f44e4c9fabbfa8f50be34df983d6c","device":"523a0aade61e8902","findings":[],"hash":"80fdf8ed7ba0289c50e9846fdf5980f639e1757a43cdc73fad549fbf2fa49d87","nodeId":"bf1d4bf4-f554-4fd4-bb1b-3a3bda3a7e23","outcome":"completed","summary":"Created `launch.json` matching `MoneyCanBuyToken`, its exact supply, empty constructor arguments, and the required pool and economics values. No application contracts are listed.\n\n`forge build` and `forge test` passed with the supplied fuzz seed: 34 tests, zero failures. Only `launch.json` changed outside scratch.","treeHash":"e2b123e291c4f23841d987a204e7a661ba6d6c7e","usage":{"cachedInputTokens":403840,"inputTokens":25897,"model":"gpt-6-astra","outputTokens":2559,"runtime":"codex","turns":4,"wallClockMs":105603}},{"artifacts":[],"attempt":1,"bundleHash":"59cddd48ec1fe444bdd46fed4d32248f526e796a3ae7029a5a59e4ba08792885","device":"e04b1c0f30c2612f","findings":[],"hash":"be9233a721d4bdca77190d28a485033fd373caeda1b60db212dc6195c8f252ec","nodeId":"7ead07f0-92c3-42a4-978a-48aa874842d4","outcome":"completed","summary":"Implemented MoneyCanBuy.fun (YOLO): 1 billion tokens, 18 decimals, minted once to the deployer.\n\nOffline build, all 34 reported tests, formatting, and Slither checks pass, including the required fuzz seed. No High or Medium findings.\n\nVendored dependencies, deployment documentation, and validation details are included in `README.md`, `DEPENDENCIES.md`, and `REVIEW.md`.","treeHash":"50c7a8c809b8367562c3c148f971c70a34df2fa3","usage":{"cachedInputTokens":1567360,"inputTokens":68114,"model":"gpt-6-astra","outputTokens":19987,"runtime":"codex","turns":7,"wallClockMs":552774}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b273d407784470b4","findings":[],"hash":"f573d43a42a2473f38187938f0af3470e11a8b38d049fb9c95b5092c4a0c65ab","nodeId":"3b6c2886-d398-40f8-a9bc-43d98e65b402","outcome":"completed","summary":"The review is complete. Findings are written to `.imd-findings.json` with an empty findings list and a full coverage record. No source files were changed, and the scratch tests were removed. The working tree shows only the untracked findings file.\n\n**Result: no defects in the Math Precision, Boundary or Numerical Gap areas.**\n\nThe token is a 15-line fixed-supply ERC-20 inheriting the vendored OpenZeppelin ERC20. I confirmed by SHA-256 against the upstream v5.0.2 tag that all three vendored files are byte-identical, so the arithmetic surface is exactly the audited library plus one constant.\n\nWhat I checked, each against a concrete input in a Foundry scratch test (16 tests, all passing):\n\n- **Supply constant.** The expression at `src/MoneyCanBuyToken.sol:10` is a compile-time checked constant and evaluates to exactly 10^27. This closes the aderyn large-literal lead as a non-defect. Decimals return 18 and the contract identifier is 16 characters.\n- **Transfer boundaries.** Zero, 1 wei, full balance, balance plus one, and max uint all behave as intended. A self-transfer of the whole balance keeps it unchanged. Transfer to the zero address reverts even at zero amount.\n- **Allowance boundaries.** An exact-amount spend reaches zero and the next 1-wei spend reverts. An allowance one short reverts and is left intact. Max-uint allowance persists while max-minus-one decreases. A balance failure inside transferFrom rolls the allowance change back. A zero sender reverts before any state change.\n- **Conservation invariant.** The sum of balances equals the fixed supply under a 1000-run fuzz, and the 10/80/10 launch split is exact with no remainder (100M, 800M, 100M tokens).\n- **Payable and external boundaries.** There is no receive, fallback, payable function, external call, division, cast, or sentinel branch in the token, so the Numerical Gap seams have nothing to combine.\n\nCoverage rows are given for all three listed entry points plus the constructor and two invariants, every one marked `holds`. Nothing in my area was left unreached. The protected admission tests that need the network's Uniswap v4 harness were read but not run here, as they cannot build in this repository.","treeHash":null,"usage":{"cachedInputTokens":672451,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":11355,"runtime":"claude","turns":23,"wallClockMs":196082}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5ded77c3c883b7b0","findings":[{"citation":"resolved","description":"Trust-asymmetry note, not a defect to fix. The token inherits OpenZeppelin v5.0.2 ERC20 unchanged. In ERC20._spendAllowance (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:305-315) an allowance of 0 is sufficient for a value of 0, and _transfer then emits Transfer(from, to, 0). Consequently an unprivileged address can cause the contract to emit a Transfer event naming any holder as sender without that holder's approval. Balances and allowances are unchanged, so there is no on-chain loss. The only effect is off-chain: explorers and wallets that list events by sender can show spoofed outgoing transfers (the known address-poisoning pattern). This is exactly what EIP-20 requires (zero-value transfers must be treated as normal transfers and fire the event), and the README already documents zero-value transfers as supported. No change is recommended; it is recorded so the requester and the judge know the behaviour is present and intentional.","line":9,"path":"src/MoneyCanBuyToken.sol","reproduction":"State: factory deploys MoneyCanBuyToken and transfers 100 to holder 0x401D; allowance(0x401D, 0xBEEF) == 0. Call: vm.prank(0xBEEF); token.transferFrom(0x401D, 0xBEEF, 0). Actual: returns true and emits Transfer(0x401D, 0xBEEF, 0); balanceOf(0x401D) stays 100, allowance stays 0. Expected under EIP-20: the same. Verified with test/scratch/AccessReview.t.sol::test_zeroValueTransferFromEmitsEventWithoutAllowance (passes on this code).","severity":"info","snippet":"contract MoneyCanBuyToken is ERC20 {","title":"Zero-value transferFrom needs no allowance, so any caller can make the token emit Transfer(victim, attacker, 0)"}],"hash":"fe0379b53159d54d7fbeb0ee6cab4d5c4b8a9c49f691e177703c51b461c5f629","nodeId":"aa67fa9e-e35b-41b1-9c68-55e776a7fa3e","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. The working tree is clean apart from the gitignored findings file and scratch test.\n\n**Result: no defects found in the assigned area.** The token is a 15-line fixed-supply ERC-20 with no roles, so the Access Control, Trust Gap and Asymmetry guides have almost no surface to bite on. I verified that rather than assuming it:\n\n- **Access control.** The compiled ABI exposes only `approve`, `transfer`, `transferFrom`, the views, and the supply constant. There is no owner, mint, burn, pause, blocklist, initializer, upgrade, `receive` or `fallback`. Unknown selectors and ETH revert for both the deployer and a stranger. The deployer (the factory under `launchCustom`) has ordinary holder rights only. Supply is minted once, to `msg.sender`, with no other path to `_mint` or `_burn`.\n- **Asymmetry.** `transfer` and `transferFrom` reach the same `_transfer`. The only extra write in `transferFrom` is the allowance decrement, which rolls back when the balance check reverts. Confirmed with a scratch test.\n- **Trust gap.** No setters, fees, pricing or recipient parameters exist, so none of the cross-lens seams are reachable. Launch economics live in the factory and manifest, outside this tree.\n- **Dependency integrity.** I downloaded the upstream OpenZeppelin v5.0.2 archive. Its hash matches DEPENDENCIES.md and all six vendored files are byte-identical. The runtime bytecode has no reachable CALL, DELEGATECALL, CALLCODE, CREATE or SELFDESTRUCT.\n\n**One info-level note recorded.** Zero-value `transferFrom` needs no allowance, so anyone can make the token emit `Transfer(victim, attacker, 0)`. That is EIP-20-mandated behaviour and moves nothing on-chain. I logged it with a reproduction so the judge sees it was considered, and recommended no change.\n\n**Coverage.** All three listed entry points have rows (two `holds`, one `finding` pointing at the info note), plus rows for the constructor, the absent admin surface, the opcode scan, dependency integrity and the trust-gap seams. The only `unreached` row is launch.json, which does not exist yet because the manifest step has not run.\n\nThe project's own suite passed (34 tests) and the aderyn large-literal lead is a style note on the supply constant, not a defect. The protected Uniswap v4 admission tests could not run locally since v4-core is not vendored; that is the network's later step.","treeHash":null,"usage":{"cachedInputTokens":824113,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":12307,"runtime":"claude","turns":21,"wallClockMs":222200}}],"verification":[{"checks":[{"durationMs":1449,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.37s\nCompiler run successful!\n","passed":true},{"durationMs":10883,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 22 tests for test/MoneyCanBuyToken.edges.t.sol:MoneyCanBuyTokenEdgesTest\n[PASS] testFuzz_cumulativeSpendCannotExceedApproval(uint256,uint256) (runs: 1000, μ: 279340, ~: 282154)\nLogs:\n  Bound result 765403291608812975913904671\n  Bound result 193626117260819606227048532\n\n[PASS] testFuzz_delegatedBalanceFailurePreservesAllowance(uint256,uint256,uint256) (runs: 1000, μ: 198317, ~: 198905)\nLogs:\n  Bound result 2893\n  Bound result 3252\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129638230\n\n[PASS] testFuzz_invalidReceiverPreservesAllowance(uint256,uint256) (runs: 1000, μ: 129516, ~: 129838)\nLogs:\n  Bound result 18\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639925\n\n[PASS] testFuzz_roundTripPreservesBalancesAndApprovals(uint256,uint256,uint256,uint256) (runs: 1000, μ: 358292, ~: 359813)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 45356700751106453526310\n\n[PASS] testFuzz_splitDelegatedTransfersMatchSingleSpend(uint256,uint256,bool) (runs: 1000, μ: 346324, ~: 346817)\nLogs:\n  Bound result 560738190915762119946871489\n  Bound result 520208\n\n[PASS] test_approvedSpenderCannotDelegateAnotherOwnersAllowance() (gas: 177664)\n[PASS] test_contractApprovalBelongsToContractNotTransactionOrigin() (gas: 436482)\n[PASS] test_contractSpenderCannotUseTransactionOriginsApproval() (gas: 479419)\n[PASS] test_contractTransferCannotSpendTransactionOriginsBalance() (gas: 471931)\n[PASS] test_delegatedSelfTransferCannotBypassBalanceCheck() (gas: 176766)\n[PASS] test_directTransferDoesNotConsumeOrCancelAllowance() (gas: 289216)\n[PASS] test_maximumMinusOneAllowanceIsFinite() (gas: 140552)\n[PASS] test_oneBaseUnitCanMakeARoundTripWithoutDust() (gas: 207303)\n[PASS] test_refillingBalanceDoesNotRestoreSpentAllowance() (gas: 283036)\n[PASS] test_replacingUnlimitedApprovalWithFiniteAmountLimitsSpender() (gas: 206315)\n[PASS] test_revokeUnlimitedApprovalPreservesHolderControl() (gas: 306644)\n[PASS] test_selfTransferStillChecksAvailableBalance() (gas: 88357)\n[PASS] test_spenderCanReceiveTheEntireSupplyWithExactApproval() (gas: 143410)\n[PASS] test_unlimitedAllowanceDoesNotPermitOverspendingBalance() (gas: 122036)\n[PASS] test_zeroApprovalStillRejectsZeroSpender() (gas: 105577)\n[PASS] test_zeroDelegatedTransferPreservesFiniteAndInfiniteApprovals() (gas: 224911)\n[PASS] test_zeroDelegatedTransferStillRejectsZeroReceiver() (gas: 253952)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 81.68ms (383.72ms CPU time)\n\nRan 33 tests for test/MoneyCanBuyToken.t.sol:MoneyCanBuyTokenTest\n[PASS] testFuzz_allowanceOverdrawReverts(uint256,uint256) (runs: 1000, μ: 115683, ~: 116317)\nLogs:\n  Bound result 3715544889742859816\n  Bound result 286298767906290888540913028\n\n[PASS] testFuzz_approveAcceptsFullUintRange(uint256) (runs: 1000, μ: 70977, ~: 71285)\n[PASS] testFuzz_finiteAllowanceSpend(uint256,uint256) (runs: 1000, μ: 155669, ~: 157984)\nLogs:\n  Bound result 3955629598765403291608812971958275073\n  Bound result 532434621717377614726671195\n\n[PASS] testFuzz_selfTransferCannotCreateTokens(uint256) (runs: 1000, μ: 55111, ~: 54851)\nLogs:\n  Bound result 264\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 1000, μ: 54331, ~: 54665)\nLogs:\n  Bound result 2524141577194190254426441016140\n\n[PASS] testFuzz_transferConservesBalances(address,uint256) (runs: 1000, μ: 92723, ~: 93142)\nLogs:\n  Bound result 9340290581623910919293516\n\n[PASS] test_approvalEmitsEventOverwritesAndRevokes() (gas: 170870)\n[PASS] test_approvalIsIsolatedByOwnerAndSpender() (gas: 159849)\n[PASS] test_approveZeroSpenderReverts() (gas: 37596)\n[PASS] test_constructorEmitsMintEvent() (gas: 11495)\n[PASS] test_create2DeploymentReceivesFullSupply() (gas: 317919)\n[PASS] test_deployerHasNoAllowancePrivilege() (gas: 92018)\n[PASS] test_emptyHolderCannotTransferOneUnit() (gas: 40196)\n[PASS] test_exactAllowanceCanOnlyBeSpentOnce() (gas: 152075)\n[PASS] test_factoryReceivesSupplyInsteadOfFactoryCaller() (gas: 322993)\n[PASS] test_infiniteAllowanceIsNotDecreased() (gas: 182250)\n[PASS] test_insufficientBalanceRollsBackAllowance() (gas: 103851)\n[PASS] test_launchAllocationClaimsAndHolderTransfersArriveWhole() (gas: 1003217)\n[PASS] test_metadataAndEntireSupply() (gas: 92866)\n[PASS] test_noMintBurnAdminOrUpgradeEntrypoints() (gas: 915783)\n[PASS] test_selfTransferFromStillConsumesFiniteAllowance() (gas: 100625)\n[PASS] test_selfTransferPreservesBalance() (gas: 51443)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 88925)\n[PASS] test_transferEntireSupply() (gas: 71351)\n[PASS] test_transferFromByHolderStillRequiresAllowance() (gas: 141160)\n[PASS] test_transferFromDecrementsAllowanceAndEmitsTransfer() (gas: 142521)\n[PASS] test_transferFromZeroReceiverRollsBackAllowance() (gas: 101200)\n[PASS] test_transferFromZeroSenderReverts() (gas: 33008)\n[PASS] test_transferMaximumUintRevertsWithoutOverflow() (gas: 40165)\n[PASS] test_transferToContractDoesNotInvokeRecipient() (gas: 169347)\n[PASS] test_transferToZeroRevertsIncludingZeroAmount() (gas: 71992)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 66461)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 67601)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 81.74ms (464.16ms CPU time)\n\nRan 1 test for test/MoneyCanBuyToken.invariant.t.sol:MoneyCanBuyTokenInvariantTest\n[PASS]\nMoneyCanBuyTokenInvariantTest invariants:\n[PASS] invariant_allAllowancesMatchModel\n[PASS] invariant_supplyAndEveryBalanceMatchModel\n MoneyCanBuyTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭--------------+--------------------------+-------+---------+----------╮\n| Contract     | Selector                 | Calls | Reverts | Discards |\n+======================================================================+\n| TokenHandler | approve                  | 3258  | 0       | 0        |\n|--------------+--------------------------+-------+---------+----------|\n| TokenHandler | approveAndSpend          | 3231  | 0       | 0        |\n|--------------+--------------------------+-------+---------+----------|\n| TokenHandler | approveZeroSpender       | 3237  | 0       | 0        |\n|--------------+--------------------------+-------+---------+----------|\n| TokenHandler | overspend                | 3219  | 0       | 0        |\n|--------------+--------------------------+-------+---------+----------|\n| TokenHandler | revokeAndAttemptSpend    | 3267  | 0       | 0        |\n|--------------+--------------------------+-------+---------+----------|\n| TokenHandler | transfer                 | 3285  | 0       | 0        |\n|--------------+--------------------------+-------+---------+----------|\n| TokenHandler | transferFrom             | 3424  | 0       | 0        |\n|--------------+--------------------------+-------+---------+----------|\n| TokenHandler | transferFromAboveBalance | 3286  | 0       | 0        |\n|--------------+--------------------------+-------+---------+----------|\n| TokenHandler | transferFromToZero       | 3273  | 0       | 0        |\n|--------------+--------------------------+-------+---------+----------|\n| TokenHandler | transferToZero           | 3288  | 0       | 0        |\n╰--------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 999999999999999999999999999\n  Bound result 73235024830291061562211131\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 11378554977474031391902\n  Bound result 15\n  Bound result 2104\n  Bound result 0\n  Bound result 1688\n  Bound result 40\n  Bound result 571110770934670895474842104\n  Bound result 811\n  Bound result 0\n  Bound result 2681190048234186951\n  Bound result 0\n  Bound result 40\n  Bound result 11381236167522265578852\n  Bound result 0\n  Bound result 49672965085348770267792892\n  Bound result 0\n  Bound result 4162\n  Bound result 6\n  Bound result 2681190048234184931\n  Bound result 18\n  Bound result 8054\n  Bound result 5\n  Bound result 2681190048234189098\n  Bound result 3456\n  Bound result 4002\n  Bound result 2\n  Bound result 49152\n  Bound result 98843174323953203\n  Bound result 5122\n  Bound result 1\n  Bound result 2681190048234192232\n  Bound result 0\n  Bound result 1000000000000000000000000001\n  Bound result 196\n  Bound result 14\n  Bound result 1915\n  Bound result 1703\n  Bound result 9681\n  Bound result 50\n  Bound result 3157\n  Bound result 3245\n  Bound result 15\n  Bound result 6\n  Bound result 5361\n  Bound result 7346\n  Bound result 684\n  Bound result 8382\n  Bound result 5410\n  Bound result 5412\n  Bound result 2706\n  Bound result 15\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.80s (10.80s CPU time)\n\nRan 3 test suites in 10.80s (10.96s CPU time): 56 tests passed, 0 failed, 0 skipped (56 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MoneyCanBuyToken.approve(address,uint256)\",\"MoneyCanBuyToken.transfer(address,uint256)\",\"MoneyCanBuyToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":23,\"README.md\":111,\"REVIEW.md\":72,\"foundry.toml\":28,\"src/MoneyCanBuyToken.sol\":15,\"test/MoneyCanBuyToken.edges.t.sol\":420,\"test/MoneyCanBuyToken.invariant.t.sol\":247,\"test/MoneyCanBuyToken.t.sol\":377,\"test/helpers/LaunchHarness.sol\":28},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"06641fadaecb29069708441b0b1f5f9982c8a7e642a2d5f0bdce201a19242715","verifiedTreeHash":"be186dee524a2d3821d1b45bfe25aac9d49ae8df","verifierVersion":"0.1.0+a26ee00d"},{"checks":[{"durationMs":1091,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.02s\nCompiler run successful!\n","passed":true},{"durationMs":10820,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 33 tests for test/MoneyCanBuyToken.t.sol:MoneyCanBuyTokenTest\n[PASS] testFuzz_allowanceOverdrawReverts(uint256,uint256) (runs: 1000, μ: 115809, ~: 116317)\nLogs:\n  Bound result 1912729476\n  Bound result 30\n\n[PASS] testFuzz_approveAcceptsFullUintRange(uint256) (runs: 1000, μ: 70935, ~: 71273)\n[PASS] testFuzz_finiteAllowanceSpend(uint256,uint256) (runs: 1000, μ: 155924, ~: 157984)\nLogs:\n  Bound result 3715544889742859816\n  Bound result 448061199172310778\n\n[PASS] testFuzz_selfTransferCannotCreateTokens(uint256) (runs: 1000, μ: 55106, ~: 54839)\nLogs:\n  Bound result 58717578845564879054\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 1000, μ: 54332, ~: 54665)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039458069296916537495396\n\n[PASS] testFuzz_transferConservesBalances(address,uint256) (runs: 1000, μ: 92789, ~: 93142)\nLogs:\n  Bound result 974845475525466563434949755\n\n[PASS] test_approvalEmitsEventOverwritesAndRevokes() (gas: 170870)\n[PASS] test_approvalIsIsolatedByOwnerAndSpender() (gas: 159849)\n[PASS] test_approveZeroSpenderReverts() (gas: 37596)\n[PASS] test_constructorEmitsMintEvent() (gas: 11495)\n[PASS] test_create2DeploymentReceivesFullSupply() (gas: 317919)\n[PASS] test_deployerHasNoAllowancePrivilege() (gas: 92018)\n[PASS] test_emptyHolderCannotTransferOneUnit() (gas: 40196)\n[PASS] test_exactAllowanceCanOnlyBeSpentOnce() (gas: 152075)\n[PASS] test_factoryReceivesSupplyInsteadOfFactoryCaller() (gas: 322993)\n[PASS] test_infiniteAllowanceIsNotDecreased() (gas: 182250)\n[PASS] test_insufficientBalanceRollsBackAllowance() (gas: 103851)\n[PASS] test_launchAllocationClaimsAndHolderTransfersArriveWhole() (gas: 1003217)\n[PASS] test_metadataAndEntireSupply() (gas: 92866)\n[PASS] test_noMintBurnAdminOrUpgradeEntrypoints() (gas: 915783)\n[PASS] test_selfTransferFromStillConsumesFiniteAllowance() (gas: 100625)\n[PASS] test_selfTransferPreservesBalance() (gas: 51443)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 88925)\n[PASS] test_transferEntireSupply() (gas: 71351)\n[PASS] test_transferFromByHolderStillRequiresAllowance() (gas: 141160)\n[PASS] test_transferFromDecrementsAllowanceAndEmitsTransfer() (gas: 142521)\n[PASS] test_transferFromZeroReceiverRollsBackAllowance() (gas: 101200)\n[PASS] test_transferFromZeroSenderReverts() (gas: 33008)\n[PASS] test_transferMaximumUintRevertsWithoutOverflow() (gas: 40165)\n[PASS] test_transferToContractDoesNotInvokeRecipient() (gas: 169347)\n[PASS] test_transferToZeroRevertsIncludingZeroAmount() (gas: 71992)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 66461)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 67601)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 31.62ms (189.00ms CPU time)\n\nRan 1 test for test/MoneyCanBuyToken.invariant.t.sol:MoneyCanBuyTokenInvariantTest\n[PASS]\nMoneyCanBuyTokenInvariantTest invariants:\n[PASS] invariant_allAllowancesMatchModel\n[PASS] invariant_supplyAndEveryBalanceMatchModel\n MoneyCanBuyTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭--------------+-----------------+-------+---------+----------╮\n| Contract     | Selector        | Calls | Reverts | Discards |\n+=============================================================+\n| TokenHandler | approve         | 5450  | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| TokenHandler | approveAndSpend | 5430  | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| TokenHandler | overspend       | 5424  | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| TokenHandler | transfer        | 5552  | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| TokenHandler | transferFrom    | 5379  | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| TokenHandler | transferToZero  | 5533  | 0       | 0        |\n╰--------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 357\n  Bound result 330\n  Bound result 0\n  Bound result 2827\n  Bound result 733080096739252879996190019\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 50\n  Bound result 0\n  Bound result 0\n  Bound result 3395723175\n  Bound result 7070\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1597\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 410\n  Bound result 1081\n  Bound result 0\n  Bound result 0\n  Bound result 17\n  Bound result 171215045116296518649217273\n  Bound result 50\n  Bound result 1052\n  Bound result 0\n  Bound result 6224\n  Bound result 10\n  Bound result 16\n  Bound result 8\n  Bound result 511\n  Bound result 4096\n  Bound result 4127\n  Bound result 727799078548167063709497099\n  Bound result 2600\n  Bound result 2630\n  Bound result 238\n  Bound result 263\n  Bound result 561\n  Bound result 1036\n  Bound result 386\n  Bound result 20\n  Bound result 6\n  Bound result 5\n  Bound result 100\n  Bound result 13\n  Bound result 350\n  Bound result 5831\n  Bound result 15\n  Bound result 803\n  Bound result 260\n  Bound result 999999999999999999999996793\n  Bound result 828475225234771725516238000\n  Bound result 327\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 483891671546547959133698906\n  Bound result 112400\n  Bound result 2091\n  Bound result 7848\n  Bound result 12\n  Bound result 0\n  Bound result 9\n  Bound result 87\n  Bound result 0\n  Bound result 2287400824\n  Bound result 999999999999999999999996332\n  Bound result 0\n  Bound result 6537\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.74s (10.74s CPU time)\n\nRan 2 test suites in 10.74s (10.77s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":37,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MoneyCanBuyToken.approve(address,uint256)\",\"MoneyCanBuyToken.transfer(address,uint256)\",\"MoneyCanBuyToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":23,\"README.md\":111,\"REVIEW.md\":72,\"foundry.toml\":28,\"launch.json\":24,\"src/MoneyCanBuyToken.sol\":15,\"test/MoneyCanBuyToken.invariant.t.sol\":164,\"test/MoneyCanBuyToken.t.sol\":377,\"test/helpers/LaunchHarness.sol\":28},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"80fdf8ed7ba0289c50e9846fdf5980f639e1757a43cdc73fad549fbf2fa49d87","verifiedTreeHash":"e2b123e291c4f23841d987a204e7a661ba6d6c7e","verifierVersion":"0.1.0+a26ee00d"},{"checks":[{"durationMs":2207,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.07s\nCompiler run successful!\n","passed":true},{"durationMs":17670,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 33 tests for test/MoneyCanBuyToken.t.sol:MoneyCanBuyTokenTest\n[PASS] testFuzz_allowanceOverdrawReverts(uint256,uint256) (runs: 1000, μ: 115809, ~: 116317)\nLogs:\n  Bound result 999999999999999999999999999\n  Bound result 1\n\n[PASS] testFuzz_approveAcceptsFullUintRange(uint256) (runs: 1000, μ: 70935, ~: 71273)\n[PASS] testFuzz_finiteAllowanceSpend(uint256,uint256) (runs: 1000, μ: 155924, ~: 157984)\nLogs:\n  Bound result 1595\n  Bound result 680\n\n[PASS] testFuzz_selfTransferCannotCreateTokens(uint256) (runs: 1000, μ: 55106, ~: 54839)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 1000, μ: 54332, ~: 54665)\nLogs:\n  Bound result 2524141577194190254426441016140\n\n[PASS] testFuzz_transferConservesBalances(address,uint256) (runs: 1000, μ: 92789, ~: 93142)\nLogs:\n  Bound result 299627448574910884836652390\n\n[PASS] test_approvalEmitsEventOverwritesAndRevokes() (gas: 170870)\n[PASS] test_approvalIsIsolatedByOwnerAndSpender() (gas: 159849)\n[PASS] test_approveZeroSpenderReverts() (gas: 37596)\n[PASS] test_constructorEmitsMintEvent() (gas: 11495)\n[PASS] test_create2DeploymentReceivesFullSupply() (gas: 317919)\n[PASS] test_deployerHasNoAllowancePrivilege() (gas: 92018)\n[PASS] test_emptyHolderCannotTransferOneUnit() (gas: 40196)\n[PASS] test_exactAllowanceCanOnlyBeSpentOnce() (gas: 152075)\n[PASS] test_factoryReceivesSupplyInsteadOfFactoryCaller() (gas: 322993)\n[PASS] test_infiniteAllowanceIsNotDecreased() (gas: 182250)\n[PASS] test_insufficientBalanceRollsBackAllowance() (gas: 103851)\n[PASS] test_launchAllocationClaimsAndHolderTransfersArriveWhole() (gas: 1003217)\n[PASS] test_metadataAndEntireSupply() (gas: 92866)\n[PASS] test_noMintBurnAdminOrUpgradeEntrypoints() (gas: 915783)\n[PASS] test_selfTransferFromStillConsumesFiniteAllowance() (gas: 100625)\n[PASS] test_selfTransferPreservesBalance() (gas: 51443)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 88925)\n[PASS] test_transferEntireSupply() (gas: 71351)\n[PASS] test_transferFromByHolderStillRequiresAllowance() (gas: 141160)\n[PASS] test_transferFromDecrementsAllowanceAndEmitsTransfer() (gas: 142521)\n[PASS] test_transferFromZeroReceiverRollsBackAllowance() (gas: 101200)\n[PASS] test_transferFromZeroSenderReverts() (gas: 33008)\n[PASS] test_transferMaximumUintRevertsWithoutOverflow() (gas: 40165)\n[PASS] test_transferToContractDoesNotInvokeRecipient() (gas: 169347)\n[PASS] test_transferToZeroRevertsIncludingZeroAmount() (gas: 71992)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 66461)\n[PASS] test_zeroTransferFromNeedsNoAllowance() (gas: 67601)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 52.47ms (304.41ms CPU time)\n\nRan 1 test for test/MoneyCanBuyToken.invariant.t.sol:MoneyCanBuyTokenInvariantTest\n[PASS]\nMoneyCanBuyTokenInvariantTest invariants:\n[PASS] invariant_allAllowancesMatchModel\n[PASS] invariant_supplyAndEveryBalanceMatchModel\n MoneyCanBuyTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭--------------+-----------------+-------+---------+----------╮\n| Contract     | Selector        | Calls | Reverts | Discards |\n+=============================================================+\n| TokenHandler | approve         | 5450  | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| TokenHandler | approveAndSpend | 5430  | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| TokenHandler | overspend       | 5424  | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| TokenHandler | transfer        | 5552  | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| TokenHandler | transferFrom    | 5379  | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| TokenHandler | transferToZero  | 5533  | 0       | 0        |\n╰--------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 357\n  Bound result 330\n  Bound result 0\n  Bound result 2827\n  Bound result 733080096739252879996190019\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 50\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 7071\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1621\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 937\n  Bound result 1083\n  Bound result 6195\n  Bound result 0\n  Bound result 17\n  Bound result 2552851541\n  Bound result 50\n  Bound result 972\n  Bound result 713\n  Bound result 6247\n  Bound result 10\n  Bound result 16\n  Bound result 8\n  Bound result 796\n  Bound result 4096\n  Bound result 587\n  Bound result 727799078548167063709497099\n  Bound result 2730\n  Bound result 1473\n  Bound result 245\n  Bound result 2446\n  Bound result 1602\n  Bound result 3952\n  Bound result 762\n  Bound result 20\n  Bound result 6\n  Bound result 50\n  Bound result 2102\n  Bound result 13\n  Bound result 345\n  Bound result 69\n  Bound result 3143\n  Bound result 2666\n  Bound result 1474\n  Bound result 999999999999999999999986924\n  Bound result 1026\n  Bound result 327\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 446\n  Bound result 0\n  Bound result 49241222124976932158\n  Bound result 112400\n  Bound result 0\n  Bound result 57\n  Bound result 12\n  Bound result 5965\n  Bound result 9\n  Bound result 2232\n  Bound result 12\n  Bound result 520\n  Bound result 1372\n  Bound result 560\n  Bound result 1537\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 17.54s (17.54s CPU time)\n\nRan 2 test suites in 17.54s (17.59s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":51,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MoneyCanBuyToken.approve(address,uint256)\",\"MoneyCanBuyToken.transfer(address,uint256)\",\"MoneyCanBuyToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":23,\"README.md\":111,\"REVIEW.md\":72,\"foundry.toml\":28,\"src/MoneyCanBuyToken.sol\":15,\"test/MoneyCanBuyToken.invariant.t.sol\":164,\"test/MoneyCanBuyToken.t.sol\":377,\"test/helpers/LaunchHarness.sol\":28},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":726,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":319,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/MoneyCanBuyToken.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"be9233a721d4bdca77190d28a485033fd373caeda1b60db212dc6195c8f252ec","verifiedTreeHash":"50c7a8c809b8367562c3c148f971c70a34df2fa3","verifierVersion":"0.1.0+a26ee00d"}]}