{"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":"fc399111-8e3d-4a59-b04f-7a5e8360eb56","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"ec0b463d51c409a4e504a15c0abeb2eb390a8485b37a4253ba9577a7aa93d8a6","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"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":"d42c9d975412f9931a1ca2f85784f3c50ce8652bb5c0031fbc96811a2612022b","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"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":"90d9cf2e988c38beef8f840b52863a01b267dd0d0f4cc1e61eb271b914099871","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":"411b9f98e409095d5957de25823f7b7d75c53c0774673fe1e6dcb8e478dd3c3a","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"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":"185a7d264e64d5d07a5a772b686675c6df309dfc07a34ff884646d29da661717","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"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":"8c9e2d3500a51b4c3726b763bb266504f113ca9f4315417dfc09b5beab45978b","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6e3e328aa196f6965a2821b098b101e9ff09eef55cdaafaec1d6ea18007b96f6","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6e3e328aa196f6965a2821b098b101e9ff09eef55cdaafaec1d6ea18007b96f6","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"bba3d56a4d759a781e4b1a7cd853751a9f98e300312184e3ee7bba7ed7c9959b","dependsOn":["build_contract_project","write_foundry_tests"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"f265c37413e1ed6c0b8d33ec870f35ea680da8e3a2ff4f6a3dde3633f929c1af","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"[SIMD-LAUNCH]\nA custom token: Hood Test (HOODT).\nToken name: Hood Test\nToken symbol: HOODT\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nMinting after launch: none, the supply is fixed forever.\nTransfer rules: plain ERC-20 transfers with no fee, tax or limit.\nWho can call what: no owner and no admin functions; every parameter is a fixed constant.\n\nBuild requirements (mandatory):\n- Context: an ordinary, legitimate token launch on Robinhood Chain. The coin's name, story and theme are branding only; nothing here is real-world harm or offensive security work.\n- A complete Foundry project at the repository root: foundry.toml with solc 0.8.26, evm_version cancun, optimizer on and bytecode_hash = \"none\", so the build is reproducible and verifiable: deployed contracts live in src/ and every import resolves to a committed file.\n- Token contract: HOODTToken. No selfdestruct and no delegatecall anywhere. No proxies, no owner, no upgradeability.\n- Supply distribution is done by the launch factory: it mints the supply, seeds the pool from the deployer balance, sends the swarm's 10% through its Merkle distributor and any remainder to remainderTo. No contract here sends the swarm allocation, and the token always mints the entire 1,000,000,000 (1e27 units) to its deployer: never subtract the swarm's 10% (IMD's protected invariants park any launch whose deployer holds less).\n- Chain: Robinhood Chain (set by the order, not a launch.json field). Swaps happen in Uniswap v4, so the pool's tokens move to and from the PoolManager 0x8366a39cc670b4001a1121b8f6a443a643e40951.\n- launch.json top-level keys, exactly: kind (\"custom_token\"), token {contract, name, symbol, decimals, constructorArgs, totalSupply}, contracts ([] if none), pool, economics, notes (one string). No chainId or other keys.\n- launch.json pool: pairedCurrency 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, fee 12500, tickSpacing 60, initialPrice \"125270724187523965593206900\" (paired-currency minor units per HOODT minor unit with HOODT as currency0, provenance only; the deployer derives the real opening price from the economics using the deployed currency order). launch.json also carries the economics block below.\n- launch.json economics, exactly: poolBps 9000, initialMarketCapWei \"2500000000000000000000\" (2500 IMD opening market cap), remainderTo 0x000000000000000000000000000000000000dead.","parentJobId":null,"planHash":"a4db3d1cd75ad925c9be0ebcdcb2b7831f5522d2c961720829559cd4f2b22611","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"fc399111-8e3d-4a59-b04f-7a5e8360eb56","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1160-hood-test"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51486","feedbackHash":"62403a2469574c0d62e97f98553c383f42f0b6c575d003529e42ea8ba0c7e6c5","nodeKey":"audit_economics","submissionHash":"ec0b463d51c409a4e504a15c0abeb2eb390a8485b37a4253ba9577a7aa93d8a6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51877","feedbackHash":"522d67b08e96ce76af2602d47eaaf187a5cdc1aa37955553ba778aed611ae71f","nodeKey":"audit_flow","submissionHash":"d42c9d975412f9931a1ca2f85784f3c50ce8652bb5c0031fbc96811a2612022b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51508","feedbackHash":"28fe1f1f0b681d60745085cbcb3f6a11bee0f3d8a5f24c1718b4e1dd79c9ddcd","nodeKey":"audit_judge","submissionHash":"90d9cf2e988c38beef8f840b52863a01b267dd0d0f4cc1e61eb271b914099871","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52127","feedbackHash":"f2748e9d0663730257a9b45634d475d5f5880656134f28db9bcf03def6c03ab5","nodeKey":"audit_math","submissionHash":"411b9f98e409095d5957de25823f7b7d75c53c0774673fe1e6dcb8e478dd3c3a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51873","feedbackHash":"4daf4d63899d3bb16c2c7d2f0370ee0ac8ce02974c263432ca3949ff2e0e2a78","nodeKey":"audit_permissions","submissionHash":"185a7d264e64d5d07a5a772b686675c6df309dfc07a34ff884646d29da661717","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51026","feedbackHash":"2b8b7a0ad78721081d2bebf182a560a256fe29046d2f1b11f1b04b7a75fe56de","nodeKey":"build_contract_project","submissionHash":"8c9e2d3500a51b4c3726b763bb266504f113ca9f4315417dfc09b5beab45978b","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51450","feedbackHash":"97876f5e6e2eaca4774d267afbfa4987dfd6b3ade40b4e012b728f7ec1c842a1","nodeKey":"manifest","submissionHash":"bba3d56a4d759a781e4b1a7cd853751a9f98e300312184e3ee7bba7ed7c9959b","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51023","feedbackHash":"32f9433c3199f5afc1aa87419e427a7f95b8625ece6cae28feae57108df6f5f0","nodeKey":"write_foundry_tests","submissionHash":"f265c37413e1ed6c0b8d33ec870f35ea680da8e3a2ff4f6a3dde3633f929c1af","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"f1e4155d68763f4c1c797a638d2610ed09c245c92fc139503b1af2530b2b4cf3","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"42a6bb6aa496cd6b","findings":[{"citation":"resolved","description":"Asymmetry guide, branch-symmetry diff: _transfer rejects the zero address as `to` (and _approve rejects it as `spender`) but never checks `from`. `from` is caller-controlled only through transferFrom. allowance[address(0)][anyone] and balanceOf[address(0)] are both permanently 0 (nothing can ever be sent to the zero address), so the only path that survives both guards is amount == 0: the allowance check `0 < 0` is false, the balance check `0 < 0` is false, no storage changes, and the function emits Transfer(address(0), to, 0) and returns true. Transfer events from the zero address are the ERC-20 convention for a mint, so any unprivileged caller can make explorers and indexers record an apparent zero-value mint to any address at any time. OpenZeppelin's ERC20 rejects this with ERC20InvalidSender(address(0)). No balance, allowance or supply changes; totalSupply() is a constant; nothing in the launch flows (factory, distributor, PoolManager) is affected. Reported because it is the one asymmetry in the contract's validation and is reproducible; it is not a loss of funds or a broken guarantee. Minimal fix that preserves the design: add `if (from == address(0)) revert ZeroAddress();` at the top of _transfer, mirroring the `to` check.","line":76,"path":"src/HOODTToken.sol","reproduction":"State: fresh HOODTToken deployed by `factory`. Call, from any address A (no allowance, no balance): `token.transferFrom(address(0), A, 0)`. Expected (mirroring the `to == address(0)` guard and OZ behaviour): revert ZeroAddress(). Actual: returns true and emits Transfer(from=0x0000000000000000000000000000000000000000, to=A, value=0); balanceOf(A) stays 0, totalSupply() stays 1e27. With any amount > 0 the call reverts with InsufficientAllowance(A, 0, amount) before reaching _transfer, so the event is the whole effect. Verified with a Foundry test using vm.expectEmit(Transfer(address(0), A, 0)) around the call, which passed on this code.","severity":"info","snippet":"        if (to == address(0)) revert ZeroAddress();\n        uint256 fromBalance = balanceOf[from];\n        if (fromBalance < amount) revert InsufficientBalance(from, fromBalance, amount);","title":"transferFrom accepts address(0) as `from` for zero amounts, letting anyone emit a Transfer(0x0, to, 0) event"}],"hash":"185a7d264e64d5d07a5a772b686675c6df309dfc07a34ff884646d29da661717","nodeId":"260079be-37a0-48f3-a69a-71e68de0d892","outcome":"completed","summary":"The review is complete. The findings file is written and validated, the snippet matches the tree at lines 76 to 78, and the scratch test directory is removed, so the working tree has only the findings file added.\n\n**Outcome.** HOODTToken holds against the Access Control, Trust Gap and Asymmetry guides. No defect of medium or higher severity exists in the token, and no proof test was needed. One info-level asymmetry is reported with a reproduction.\n\n**What I checked**\n\n- **Access control.** The contract has no roles, modifiers, initializer, fallback, receive, proxy or admin function. The only state-changing entry points are approve, transfer and transferFrom, all unrestricted by ERC-20 design. Unknown selectors and empty calldata revert. A scan of the deployed runtime, skipping push data the way the protected floor does, found no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- **Asymmetry.** transfer and transferFrom share one internal path. The allowance decrement happens once, the infinite sentinel is excluded, self-transfer conserves balance, and the unchecked block is sound because every balance is bounded by the constant supply. The one gap is that the zero address is rejected as recipient and as spender but not as sender.\n- **Trust gap.** No caller-class branches, fees, exemptions or settable recipients exist, so no actor can be treated differently from another. The constructor mints the full supply to the deployer and totalSupply is a pure constant. The existing launch-pool tests with a local Uniswap v4 PoolManager pass for seed, buy, sell and claims.\n- **Manifest.** launch.json carries exactly the required keys, an empty constructorArgs matching the no-argument constructor, the exact 1e27 supply, lowercase addresses and the job's economics verbatim.\n\n**The finding.** Any address can call transferFrom with the zero address as sender and amount zero. Both guards pass because the zero address has no balance and no allowance, so the call returns true and emits a zero-value Transfer event from the zero address, which indexers read as a mint. Nothing moves and supply is unchanged. OpenZeppelin rejects this case, and the mirror check on the sender is a one-line fix that preserves the design.\n\n**Coverage.** All three listed entry points have rows, plus four invariant rows. The build and the 65 existing tests pass. Fork runs against live Robinhood Chain state remain owed to the deployer, since no network was available.","treeHash":null,"usage":{"cachedInputTokens":348599,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":10716,"runtime":"claude","turns":15,"wallClockMs":193236}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fd5402086dce252e","findings":[{"citation":"resolved","description":"The sentinel-address guard in _transfer only rejects the zero address as the recipient. The sender side is unguarded, so transferFrom(address(0), to, 0) passes the allowance check (allowance[0][caller] == 0, and 0 < 0 is false), passes the balance check (balanceOf[0] == 0, and 0 < 0 is false), and emits Transfer(address(0), to, 0). A Transfer whose from is the zero address is the shape ERC-20 indexers and explorers read as a mint, so anyone can make the token's event log show zero-value mints to any address at will. No units are created: a nonzero amount from the zero sender reverts with InsufficientAllowance(caller, 0, amount) because nothing can ever set allowance[address(0)][x], and totalSupply is a constant. OpenZeppelin's _transfer rejects this path with ERC20InvalidSender(address(0)). Impact is cosmetic (log noise, possible confusion in off-chain mint accounting that counts events rather than values); it does not touch the supply, any balance, or any launch flow. Minimal fix that preserves the agreed design: add `if (from == address(0)) revert ZeroAddress();` at the top of _transfer.","line":76,"path":"src/HOODTToken.sol","reproduction":"State: fresh HOODTToken deployed by D. Call from any account B: token.transferFrom(address(0), A, 0). Actual: returns true and emits Transfer(from=0x0000000000000000000000000000000000000000, to=A, value=0); totalSupply stays 1e27 and balanceOf(A) stays 0. Expected (OpenZeppelin semantics, and what the contract already does for the recipient side): revert ZeroAddress(). Checked in test/scratch/MathBoundary.t.sol test_transferFromZeroSenderEmitsPhantomMintEvent (passes on the code as is, confirming the behaviour). Nonzero amount: token.transferFrom(address(0), A, 1) reverts InsufficientAllowance(B, 0, 1), so no units can be created.","severity":"info","snippet":"        if (to == address(0)) revert ZeroAddress();","title":"transferFrom accepts from == address(0) with amount 0 and emits a mint-shaped Transfer(0x0, to, 0) event"}],"hash":"411b9f98e409095d5957de25823f7b7d75c53c0774673fe1e6dcb8e478dd3c3a","nodeId":"3df99ed3-08ac-46af-9dfa-344e551d0a41","outcome":"completed","summary":"The review is complete. The findings file is valid JSON, the quoted snippet matches line 76 of the source exactly, and the scratch tests under `test/scratch/` confirm every claim.\n\n**Outcome:** the math in HOODTToken holds. The token has no division, no cast, no scale conversion and no fee formula, so the Math Precision, Boundary and Numerical Gap checklists reduce to the supply constant, the two unchecked operations, the allowance sentinel and the manifest price. All of them check out:\n\n- **Supply constant** is exactly 1e27 and equals the manifest's totalSupply string. The aderyn large-literal lead is not a defect.\n- **Unchecked arithmetic** in `_transfer` and `transferFrom` is guarded by a strict `<` check immediately before each subtraction, and the add is bounded by the fixed sum of balances. Full-supply cycles, self-transfers and self-`transferFrom` at the top of the range were exercised.\n- **Infinite allowance sentinel** behaves correctly on both sides of the boundary. The value max minus one is decremented normally, and a failed balance check consumes no allowance.\n- **Manifest price** is the exact integer floor of the sqrt price derived from a 2500 IMD cap over 1e27 units. It sits well inside Uniswap v4's tick and sqrt-price bounds, and the 90% pool share fits int128 deltas.\n\n**One finding, severity info:** `transferFrom(address(0), anyone, 0)` succeeds and emits a Transfer from the zero address with value zero, which indexers read as a mint. No units are created, since a nonzero amount reverts on the allowance check and the supply is a constant. The suggested fix is a one-line sender guard in `_transfer`, mirroring the existing recipient guard. It carries no proof file because it is not high or critical.\n\n**Coverage record:** all three ABI entry points have rows (approve holds, transfer holds, transferFrom carries finding 1), plus rows for the balance-sum invariant, the supply constant, the manifest price derivation and the protected-floor flows.\n\nNothing in the assigned area was left unreached. Fork runs against live Robinhood Chain state were not possible here and remain owed to the deployer stage.","treeHash":null,"usage":{"cachedInputTokens":621934,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12170,"runtime":"claude","turns":19,"wallClockMs":191633}},{"artifacts":[],"attempt":1,"bundleHash":"9ce1971f7cfaa553f88902fdfc7b1185ee5fe9d8839a62587c2b013017c414e5","device":"56b13350bba65fd7","findings":[],"hash":"8c9e2d3500a51b4c3726b763bb266504f113ca9f4315417dfc09b5beab45978b","nodeId":"8198ef8f-2196-4054-ac9b-339b70801a90","outcome":"completed","summary":"Done. The HOODT launch project is built, tested, formatted and committed on main.\n\n**What was delivered**\n\n- `src/HOODTToken.sol`: a self-contained fixed-supply ERC-20 named Hood Test (HOODT, 18 decimals). The constructor mints the full 1e27 units to the deployer and calls no other contract. There is no owner, no admin function, no mint, no pause or blacklist, no fee on transfer, no proxy, no delegatecall and no selfdestruct. The transfer-to-zero and zero-spender paths revert with custom errors, and an infinite allowance is not decremented.\n- `foundry.toml`: solc 0.8.26, evm_version cancun, optimizer on, bytecode_hash none, cbor_metadata false, ffi off. The built runtime ends in a JUMP opcode with no metadata trailer.\n- `launch.json`: exactly the six required top-level keys, with the pool, economics and initialPrice values the brief specified, and an empty contracts list.\n- `test/HOODTToken.t.sol`: 16 smoke tests covering deploy, metadata, supply, constructor mint to the deployer, exact fee-free transfers, failure paths for balance, allowance and zero addresses, the absence of mint and admin selectors, and a bytecode scan for forbidden opcodes. No fuzz or invariant suites, as the brief directed.\n- `README.md`: parameters, how the factory distributes the supply, build steps, and the operational responsibilities and assumptions.\n- `lib/forge-std` v1.9.7 vendored from the release tarball as ordinary files, with a remappings file. No nested .git and no submodule.\n\n**Verification**\n\n- forge build, forge test and forge fmt --check all pass with the pinned compiler.\n- A scratch test in test/scratch mirrors the protected harness's CREATE2-from-factory deploy, the swarm-share flows and the privileged-call list. All three pass.\n\n**Owed to later steps**\n\n- The protected test's pool seed and swap paths depend on the harness's own v4-core and LaunchLiquidity sources, which are not in this repository, so they were not run here. The token's exact transfers give no reason for them to fail.\n- The full fuzz and invariant suite is the next agent's work.","treeHash":"8530c87c459a130f756ba4fd7c2d77741123eb4d","usage":{"cachedInputTokens":1205694,"inputTokens":674,"model":"claude-fable-5-1","outputTokens":15144,"runtime":"claude","turns":22,"wallClockMs":231476}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3516474d8a268bd8","findings":[{"citation":"resolved","description":"Merged from four specialist reports (audit_permissions, audit_flow, audit_economics, audit_math), all the same root cause. `_transfer` (src/HOODTToken.sol:75-85) rejects the zero address only as `to`; `from` is never checked. `from` is caller-controlled through transferFrom (line 63). allowance[address(0)][caller] is permanently 0 because nothing can ever call approve from the zero address, so the allowance check at line 66 (`current < amount`) is false only when amount == 0; balanceOf[address(0)] is permanently 0 because every transfer to the zero address reverts, so the balance check at line 78 is false only for amount == 0. In that one case nothing is written and the function emits Transfer(address(0), to, 0) at line 84 and returns true. A Transfer whose `from` is the zero address is the shape explorers and indexers classify as a mint, and the NatSpec at line 15 and the README both promise that the only such event is the single constructor mint. Any unprivileged caller can therefore stamp the log with unlimited fake zero-value mints to any address. No balance, allowance or supply changes (totalSupply() is a constant and a nonzero amount from the zero sender reverts with InsufficientAllowance), and no launch flow (factory to distributor, seed through the PoolManager, remainder, claims, swaps) is affected, so the impact is event hygiene and off-chain accounting that counts mint events: low. OpenZeppelin v5 rejects this path with ERC20InvalidSender(address(0)). Minimal fix that preserves the requested design: add `if (from == address(0)) revert ZeroAddress();` at the top of _transfer, mirroring the existing `to` guard. The related zero-value transferFrom from a non-zero holder with no allowance also succeeds; that is what EIP-20 prescribes and OpenZeppelin behaves the same, so it is not reported.","line":76,"path":"src/HOODTToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {HOODTToken} from \"src/HOODTToken.sol\";\n\n/// @notice transferFrom(address(0), to, 0) must revert like every other transfer that names the\n/// zero address. Today it succeeds and emits Transfer(0x0, to, 0), the shape indexers read as a\n/// mint, from any caller with no allowance. Fails on the current code; passes once `_transfer`\n/// rejects a zero `from`.\ncontract ZeroSenderTransferFromTest is Test {\n    HOODTToken token;\n    address deployer = makeAddr(\"deployer\");\n    address attacker = makeAddr(\"attacker\");\n\n    function setUp() public {\n        vm.prank(deployer);\n        token = new HOODTToken();\n    }\n\n    function test_transferFromZeroSenderReverts() public {\n        assertEq(token.allowance(address(0), attacker), 0, \"no allowance was ever granted by the zero address\");\n        vm.prank(attacker);\n        vm.expectRevert();\n        token.transferFrom(address(0), attacker, 0);\n    }\n}","reproduction":"State: fresh HOODTToken deployed by `factory` (vm.prank(factory); new HOODTToken()). Caller: any address `attacker` with no balance and no allowance. Call: vm.prank(attacker); token.transferFrom(address(0), attacker, 0). Expected: revert ZeroAddress(), consistent with transfer(address(0), x) reverting and with the NatSpec claim that the only Transfer from the zero address is the constructor mint. Actual: returns true and emits Transfer(from=0x0000000000000000000000000000000000000000, to=attacker, value=0); balanceOf(attacker) stays 0, allowance(address(0), attacker) stays 0, totalSupply() stays 1e27. Control: vm.prank(attacker); token.transferFrom(address(0), attacker, 1) reverts InsufficientAllowance(attacker, 0, 1), so no units can be created. Verified: the attached proof (the audit_flow specialist's test, copied to test/scratch/ZeroSenderProof.t.sol) fails on this code with 'next call did not revert as expected' under `forge test --match-path test/scratch/ZeroSenderProof.t.sol`; a second scratch test with vm.expectEmit(Transfer(address(0), bob, 0)) around the call passed, confirming the event is emitted.","severity":"low","snippet":"        if (to == address(0)) revert ZeroAddress();","title":"transferFrom accepts address(0) as `from` for a zero amount, so anyone can emit a mint-shaped Transfer(0x0, to, 0) event with no allowance"}],"hash":"90d9cf2e988c38beef8f840b52863a01b267dd0d0f4cc1e61eb271b914099871","nodeId":"44bb1576-0e91-4b98-b493-e377daaf7f91","outcome":"completed","summary":"The review is complete. The findings file is written and validated, and the scratch tests are removed so the tree is unchanged apart from the findings file.\n\n**Outcome: one low-severity finding, no blocking defects.** The HOODT token is a 92-line self-contained ERC-20 with a fixed 1e27 supply minted to the deployer, no owner, no admin, no hooks, and no delegatecall or selfdestruct. The existing suite of 65 tests passes, including the invariant suite and the pool-flow tests.\n\n**Specialist findings.** All four specialists reported the same root cause, which I merged into one finding at low severity:\n\n- `_transfer` guards only the recipient against the zero address, never the sender. Because the zero address can never hold a balance or grant an allowance, the only path through is a zero amount, so `transferFrom(address(0), to, 0)` from any caller succeeds and emits a mint-shaped `Transfer(0x0, to, 0)` event. Nothing moves and the supply is unchanged. I reproduced it two ways: the audit_flow specialist's proof fails on this code as stated, and a scratch test with `vm.expectEmit` confirmed the event. I kept that proof on the finding. The fix is a one-line zero-sender check mirroring the recipient guard.\n\n**My own pass found nothing further.** I traced approve, transfer, transferFrom and the constructor, and confirmed with scratch tests that self-transfers, infinite-allowance self-transferFrom, exact allowance decrements, owner-needs-allowance, and ether rejection all behave as intended. The unchecked addition cannot overflow since the sum of balances is the fixed supply. The manifest has exactly the required keys, an empty constructorArgs that matches the no-argument constructor, the correct totalSupply, lowercase addresses, and an initialPrice equal to sqrt(2500 IMD / 1e9 HOODT) in Q96. The vendored forge-std and v4-core are tracked as ordinary files with no submodules. The aderyn large-literal note is correct code and not a defect.\n\n**Coverage.** All three listed entry points are answered: approve and transfer hold, transferFrom carries finding 1. I also recorded rows for the constructor, the supply-conservation invariant, the opcode and ether-rejection invariant, and the manifest.","treeHash":null,"usage":{"cachedInputTokens":461168,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":9707,"runtime":"claude","turns":16,"wallClockMs":167621}},{"artifacts":[],"attempt":2,"bundleHash":"c54d8764828aa31b99b23c3ede1abe25b53880acbfdeb377ed6bbd325d2c4d22","device":"f2101c240e0b52a9","findings":[],"hash":"bba3d56a4d759a781e4b1a7cd853751a9f98e300312184e3ee7bba7ed7c9959b","nodeId":"5707c935-ef87-4ba8-9a32-b9db98b6eaec","outcome":"completed","summary":"launch.json is rewritten and verified. The working tree now carries a real change to that one file, which is what the previous attempt lacked.\n\n**What the manifest contains**\n\n- Top-level keys are exactly kind, token, contracts, pool, economics and notes, with no chainId or extras.\n- The token block names the contract HOODTToken, name \"Hood Test\", symbol \"HOODT\", decimals 18, empty constructorArgs and a totalSupply of 1e27 as a decimal string. The source mints the constant TOTAL_SUPPLY to msg.sender once and the compiled ABI has no constructor inputs.\n- contracts is an empty list, since the accepted tree deploys nothing besides the token.\n- pool carries the IMD pair address in lowercase, fee 12500, tickSpacing 60 and the brief's provenance initialPrice.\n- economics is the requester's object byte for byte.\n- notes is one string of 1401 characters. It describes only HOODTToken, its fixed supply and plain transfers, says the swarm share is the factory's and not written in the manifest, and marks initialPrice as provenance only.\n\n**Checks run**\n\n- A scratch script asserted key sets, key order, types, lowercase addresses, every value, the verbatim economics object, the notes length and the ABI's empty constructor.\n- forge build compiled cleanly with solc 0.8.26 and no metadata hash.\n- forge test passed all 65 tests across 5 suites, including the local Uniswap v4 seed and swap suite that mirrors the protected floor.\n- git status shows launch.json as the only modified file.\n\nThe protected invariant suite needs live factory and pool-manager environment values at admission, so it could not be run here. The local launch-pool suite covers the same flows against a vendored PoolManager.","treeHash":"6279307e3e727f12379eaa3c37445ce314610f10","usage":{"cachedInputTokens":196652,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3938,"runtime":"claude","turns":7,"wallClockMs":83039}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"76e5f9ed417094cc","findings":[],"hash":"cc60112b8673b06ae848bb2431981407e574004146576090ae1a0b0d1b729339","nodeId":"5707c935-ef87-4ba8-9a32-b9db98b6eaec","outcome":"failed","summary":"the task produced no changes; the agent's last message was: The launch.json at the repository root is complete and correct for this launch, so I left it as it stands. No other file was touched.\n\n**What the manifest contains and how it was verified**\n\n- Top-level keys are exactly kind, token, contracts, pool, economics and notes, in that order, with no chainId or extras.\n- The token block names the contract HOODTToken, name \"Hood Test\", symbol \"HOODT\", decimals 18, empty constructorArgs and a totalSupply of 1e27 as a decimal string. The compiled ABI confirms the constructor takes no inputs, and the source mints the constant TOTAL_SUPPLY to msg.sender once.\n- contracts is an empty list. The accepted tree deploys nothing besides the token.\n- pool carries the IMD pair address in lowercase, fee 12500, tickSpacing 60 and the brief's provenance initialPrice.\n- economics is byte-for-byte the requester's object: poolBps 9000, initialMarketCapWei 2500 IMD, remainderTo the dead address.\n- notes is one string of 609 characters describing only the token that is present. It states that the swarm share is the factory's, that initialPrice is provenance only, and that the token has no owner, mint, fee, proxy, delegatecall or selfdestruct.\n\n**Checks run**\n\n- A script asserted every key set, key order, type, lowercase address, value and notes length against the brief.\n- forge build compiled cleanly with solc 0.8.26, bytecode_hash none and no CBOR metadata.\n- forge test passed all 65 tests across 5 suites, including the pool seeding and swap suite that mirrors the protected floor.\n- git status shows a clean working tree, so the only deliverable in scope is the existing manifest.\n\nNothing is outstanding on this task. The protected invariant test runs against live factory and pool-manager env values at admission, which this offline run cannot reproduce, but the local launch-pool suite covers the same flows.","treeHash":null,"usage":{"cachedInputTokens":213151,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3648,"runtime":"claude","turns":9,"wallClockMs":73527}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f494611affb5524c","findings":[{"citation":"resolved","description":"_transfer only rejects a zero `to`; it never rejects a zero `from`. transferFrom(address(0), to, amount) reaches it from any caller: allowance[address(0)][msg.sender] is 0, and the check `current < amount` at line 66 is false for amount == 0, so no allowance is consumed; balanceOf[address(0)] is 0 and `fromBalance < amount` at line 78 is false for amount == 0; the function then writes nothing and emits Transfer(address(0), to, 0) at line 84 and returns true. The NatSpec at line 15 says the only Transfer from the zero address is the single constructor mint, and the README says the same; explorers and indexers classify a Transfer whose `from` is 0x0 as a mint. No units move and the supply is unchanged, so the impact is limited to event spoofing: an unprivileged caller can stamp the token's log with arbitrarily many fake mints to any address (for example to make a wallet look like it received a mint, or to pollute supply-tracking that counts mint events). A zero-value transferFrom from any non-zero holder without allowance also succeeds and emits Transfer(holder, to, 0); that part is what EIP-20 prescribes (zero-value transfers fire the event) and OpenZeppelin behaves the same, so it is not reported as a defect. Minimal fix that preserves the requested behaviour: add `if (from == address(0)) revert ZeroAddress();` at the top of _transfer (OpenZeppelin v5 reverts with ERC20InvalidSender here). Checked with the execution-trace guide (sentinel bypass: address(0) takes a path that skips the validation the normal path has) and first principles (the assumption 'from is a real account' is never enforced).","line":76,"path":"src/HOODTToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {HOODTToken} from \"src/HOODTToken.sol\";\n\n/// @notice transferFrom(address(0), to, 0) must revert like every other transfer that names the\n/// zero address. Today it succeeds and emits Transfer(0x0, to, 0), the shape indexers read as a\n/// mint, from any caller with no allowance. Fails on the current code; passes once `_transfer`\n/// rejects a zero `from`.\ncontract ZeroSenderTransferFromTest is Test {\n    HOODTToken token;\n    address deployer = makeAddr(\"deployer\");\n    address attacker = makeAddr(\"attacker\");\n\n    function setUp() public {\n        vm.prank(deployer);\n        token = new HOODTToken();\n    }\n\n    function test_transferFromZeroSenderReverts() public {\n        assertEq(token.allowance(address(0), attacker), 0, \"no allowance was ever granted by the zero address\");\n        vm.prank(attacker);\n        vm.expectRevert();\n        token.transferFrom(address(0), attacker, 0);\n    }\n}","reproduction":"State: fresh HOODTToken deployed by any address; attacker = any EOA with no tokens and no allowance. Call, from attacker: token.transferFrom(address(0), attacker, 0). Expected: revert (a transfer naming the zero address, consistent with transfer(address(0), x) reverting with ZeroAddress() and with the single-mint claim in the NatSpec). Actual: returns true and emits Transfer(from=0x0000000000000000000000000000000000000000, to=attacker, value=0); allowance(address(0), attacker) stays 0; balances unchanged. Repeating the call emits one such event per call. Verified with test/scratch/ZeroSenderTransferFrom.t.sol: `forge test --match-path test/scratch/ZeroSenderTransferFrom.t.sol` fails on the current code with 'next call did not revert as expected'.","severity":"low","snippet":"        if (to == address(0)) revert ZeroAddress();","title":"transferFrom accepts address(0) as `from`: anyone can emit a mint-shaped Transfer(0x0, to, 0) event with no allowance"}],"hash":"d42c9d975412f9931a1ca2f85784f3c50ce8652bb5c0031fbc96811a2612022b","nodeId":"6cc07b66-5eaa-4d57-8c5b-a77f8fe4973c","outcome":"completed","summary":"The review is complete. No tracked file changed, and the findings file is in place at the repository root.\n\n**Outcome: one low-severity finding, no critical, high or medium defects.** HOODTToken is a 92-line self-contained ERC-20 and it does what the brief asks. Across the Execution Trace, Periphery and First Principles guides, I traced all three state-changing entry points plus the constructor, scanned the compiled runtime myself, verified the vendored Uniswap v4 core against upstream, and checked the manifest mechanically.\n\n**The finding (low):** `transferFrom` never rejects `address(0)` as the sender. The only zero-address check in `_transfer` is on `to`, so any caller can run `transferFrom(address(0), anyone, 0)`: allowance 0 is not below amount 0, balance 0 is not below amount 0, and the call returns true while emitting `Transfer(0x0, anyone, 0)`. That is the event shape explorers classify as a mint, and the NatSpec and README both say the constructor emits the only such event. No units move and the supply is unchanged, so the impact is event spoofing only. The reproduction and a one-test proof are in the findings file. I confirmed the proof fails on the current code and passes against a patched copy that adds a zero-sender check at the top of `_transfer`.\n\n**What holds, with evidence:**\n- `transfer` and `approve` behave exactly as a plain ERC-20 should. Self-transfer is exact because the add re-reads storage, the unchecked add cannot overflow since the sum of balances is pinned at 1e27, and a failed `transferFrom` consumes no allowance.\n- The compiled runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT, and the artifact confirms optimizer on, cancun, bytecode hash none and no CBOR metadata.\n- The vendored v4-core under test/vendor differs from upstream commit 46c6834 only by reformatting and the documented `Owned` import path, so the pool tests run against the real PoolManager settlement logic.\n- launch.json has exactly the required keys, lowercase addresses, string uint256 values, and an initialPrice equal to the value I derived independently from the economics.\n- The existing 65 tests pass. The one gap is that no test asserts a zero-address sender reverts, which is how the finding slipped past the ghost-ledger invariant.\n\n**Not verified:** the README's claim that Robinhood Chain is chain id 4663 could not be checked offline and the chain is set by the order rather than the manifest, so I did not treat it as a defect. Live-state fork runs against the real PoolManager and IMD token remain owed to the deployer's pipeline.","treeHash":null,"usage":{"cachedInputTokens":998575,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":19697,"runtime":"claude","turns":29,"wallClockMs":298720}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0e78515c4d95885a","findings":[{"citation":"resolved","description":"_transfer rejects the zero address only as the recipient. transferFrom(address(0), to, 0) from any caller passes the allowance check (allowance[0][caller] is 0 and 0 < 0 is false) and the balance check (balanceOf[0] is 0 and 0 < 0 is false), then emits Transfer(address(0), to, 0). No balance, allowance or supply changes: a non-zero amount from the zero address reverts with InsufficientAllowance, so this cannot mint or move value. The only effect is a spurious zero-value Transfer from the zero address, the shape indexers and explorers treat as a mint. OpenZeppelin v5 rejects a zero sender in _transfer (ERC20InvalidSender); this token does not. Economic impact: none. It is reported as information only so the author can decide whether to add `if (from == address(0)) revert ZeroAddress();` in _transfer for event hygiene; no change is needed for the launch flows or for the protected invariants.","line":76,"path":"src/HOODTToken.sol","reproduction":"Deploy HOODTToken. From any address, e.g. 0xBEEF, call transferFrom(address(0), 0xB0B, 0). Expected (OZ-style): revert with a zero-sender error. Actual: returns true and emits Transfer(0x0000000000000000000000000000000000000000, 0xB0B, 0); totalSupply() stays 1e27 and balanceOf(0xB0B) stays 0. Calling transferFrom(address(0), 0xB0B, 1) from 0xBEEF reverts with InsufficientAllowance(0xBEEF, 0, 1), so nothing beyond the zero-value event is reachable.","severity":"info","snippet":"        if (to == address(0)) revert ZeroAddress();\n        uint256 fromBalance = balanceOf[from];\n        if (fromBalance < amount) revert InsufficientBalance(from, fromBalance, amount);","title":"transferFrom accepts the zero address as sender, so anyone can emit a mint-shaped Transfer(0x0, to, 0) event"}],"hash":"ec0b463d51c409a4e504a15c0abeb2eb390a8485b37a4253ba9577a7aa93d8a6","nodeId":"813f010a-72ab-48d1-aad7-e3a70de9076c","outcome":"completed","summary":"The review is complete and the findings file is written at the repository root. The working tree has no other changes.\n\n**Outcome: no economic defects.** HOODTToken is a self-contained, fixed-supply ERC-20 with no external dependencies, no admin surface and no fee, so nearly every failure mode in the Economic Security, Invariant and Flow Gap guides has no code path to attach to. I traced each one against the source and confirmed the clean paths with tests rather than by reading alone.\n\n**What I checked and how**\n\n- **Economic Security.** No oracles, callbacks or external calls exist. Transfers move exactly the stated amount, return true, and revert atomically on overspend. The real vendored Uniswap v4 PoolManager seeds, buys and sells through sync, settle and take with exact balance deltas. Sentinel paths: a transfer to the zero address and an approval of the zero spender both revert.\n- **Invariant.** Sum of balances equals the constant total supply after any sequence. The unchecked arithmetic is bounded by the fixed supply, self-transfers conserve, the infinite allowance is never decremented, and an allowance one below max decrements correctly. The existing invariant suite ran 64 runs of 4096 calls with no violation.\n- **Flow Gap.** The factory, distributor, pool manager and remainder flows all arrive whole. The constructor mints the full 1e27 units to its deployer and never subtracts the swarm's share, so the protected invariants test's supply checks pass.\n- **Manifest.** The launch.json keys, empty constructor args, total supply, pool and economics all match the order. The initial sqrt price equals the one derived from a 2500 IMD cap over the supply, which I recomputed in a scratch test.\n- **Static analysis lead.** The aderyn large-literal note is the compile-time supply constant and is not a defect.\n\n**One informational item reported.** Any caller can invoke `transferFrom` with the zero address as sender and a zero amount. Nothing moves and supply is unchanged, but the call emits a zero-value Transfer from the zero address, the shape indexers read as a mint. A non-zero amount on that path reverts, so there is no economic impact. I reported it at info severity with the exact call so the author can add a zero-sender check if they want cleaner events.\n\n**Coverage record.** All three listed entry points have rows: approve and transfer hold, transferFrom carries the info finding. Six further rows cover the supply invariants, the launch flows, the manifest and the static-analysis lead. Nothing in the assigned area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":1180903,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":13022,"runtime":"claude","turns":24,"wallClockMs":203745}},{"artifacts":[],"attempt":1,"bundleHash":"b85c317fbf1025b4c3e28ef38de5f51746ece286a3f88c1f2b4d306e77b4b5fc","device":"ca080fd306399669","findings":[],"hash":"f265c37413e1ed6c0b8d33ec870f35ea680da8e3a2ff4f6a3dde3633f929c1af","nodeId":"a38c1453-f85b-47bb-8052-77989048a3f7","outcome":"completed","summary":"The suite is complete and verified: 65 tests pass under `forge test`, all new files sit under `test/`, and nothing else in the tree changed.\n\n**What I added**\n\n- `test/HOODTToken.fuzz.t.sol` (22 tests): property tests at the edges with Foundry's default fuzz runs. Any deployer gets the whole supply, transfers move exactly the amount and conserve units, over-balance and over-allowance paths revert with the exact custom error and move nothing, a failed `transferFrom` does not consume allowance, approvals overwrite rather than add, the infinite allowance survives any spend, allowances are isolated per spender, zero-address paths revert, every unknown selector reverts, ether is rejected, and the metadata decodes through the plain ERC-20 ABI.\n- `test/HOODTToken.invariant.t.sol`: a handler with six actors and a ghost ledger of balances and allowances, calling the happy paths and the failure paths (with `expectRevert`) in random order. Invariants: every balance equals the ledger, the sum of balances is exactly 1e27 and `totalSupply` never moves, every allowance equals the ledger, and the code hash and constants are unchanged. Run counts are set inline at 64 runs by 64 depth, so no long campaign.\n- `test/HOODTLaunchPool.t.sol` (13 tests, run twice): the launch as the factory performs it against a real Uniswap v4 `PoolManager` built in place at its Robinhood Chain address, with an IMD stand-in at the IMD address. It derives the opening sqrt price from the 2,500 IMD economics, checks that `launch.json`'s `initialPrice` matches it, seeds 90% single-sided, forwards the swarm 10% and the remainder to 0xdead, and asserts every flow moves exactly what it says. A trader then buys and sells through the pool with the 1.25% fee: deltas equal token movements to the unit, the fee shows up in fee growth and in the seeder's collected fees, an exact-output buy delivers exactly the amount, fuzzed round trips of any size conserve supply, and selling more than held or buying without IMD reverts inside `unlock` and leaves the pool untouched. The suite is abstract and runs once with HOODT as currency0 and once as currency1, since the real order is unknown until deployment.\n- `test/vendor/`: Uniswap v4-core `src` (commit 46c6834) and solmate's `Owned.sol`, committed as ordinary files with their licences and a README. One import in `ProtocolFees.sol` was changed to a relative path because `remappings.txt` is out of scope. No submodules.\n\n**Mutation check.** A scratch copy of the token with a 1% transfer tax failed the seed settlement, the claim path, the exact-swap tests and all four invariants, so the suite does catch the class of defect the launch floor refuses.\n\n**Defects.** None found. The token is a plain fixed-supply ERC-20 with no admin surface, so no `.imd-findings.json` was written. One behaviour is documented rather than flagged: `transferFrom` on one's own balance needs an allowance, which matches OpenZeppelin.\n\n**Still owed.** No fork run against live Robinhood Chain state was possible here; the pool integration is covered by the in-place v4 PoolManager and the IMD stand-in.","treeHash":"32e241a62cee9ac40f01c620c30d99b0b53d38b2","usage":{"cachedInputTokens":2419743,"inputTokens":738,"model":"claude-fable-5-1","outputTokens":56188,"runtime":"claude","turns":35,"wallClockMs":863719}}],"verification":[{"checks":[{"durationMs":699,"exitCode":0,"name":"build","output":"Compiling 21 files with Solc 0.8.26\nSolc 0.8.26 finished in 608.85ms\nCompiler run successful!\n","passed":true},{"durationMs":74,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 16 tests for test/HOODTToken.t.sol:HOODTTokenTest\n[PASS] test_approveAndTransferFrom() (gas: 171253)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32483)\n[PASS] test_constructorMakesNoExternalCalls() (gas: 10863)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 33124)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 122828)\n[PASS] test_metadata() (gas: 26535)\n[PASS] test_noMintOrAdminSelectorsExist() (gas: 221499)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1654408)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 19377)\n[PASS] test_transferFromRevertsWhenAllowanceExceeded() (gas: 87681)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 47497)\n[PASS] test_transferMovesExactAmountWithNoFee() (gas: 169550)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 67321)\n[PASS] test_transferRevertsToZeroAddress() (gas: 32526)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43602)\n[PASS] test_transferWholeBalanceAndZeroAmount() (gas: 122790)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 3.21ms (4.74ms CPU time)\n\nRan 1 test suite in 3.83ms (3.21ms CPU time): 16 tests passed, 0 failed, 0 skipped (16 total tests)\n","passed":true},{"durationMs":36,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"HOODTToken.approve(address,uint256)\",\"HOODTToken.transfer(address,uint256)\",\"HOODTToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"README.md\":90,\"foundry.toml\":15,\"launch.json\":24,\"remappings.txt\":1,\"src/HOODTToken.sol\":92,\"test/HOODTToken.t.sol\":193},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":285,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":225,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/HOODTToken.sol:32: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8c9e2d3500a51b4c3726b763bb266504f113ca9f4315417dfc09b5beab45978b","verifiedTreeHash":"8530c87c459a130f756ba4fd7c2d77741123eb4d","verifierVersion":"0.1.0+c4d32abc"},{"checks":[{"durationMs":2383,"exitCode":0,"name":"build","output":"Compiling 71 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.27s\nCompiler run successful!\n","passed":true},{"durationMs":1973,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 13 tests for test/HOODTLaunchPool.t.sol:HOODTLaunchPoolHoodtIsCurrency0Test\n[PASS] testFuzz_exactOutputBuyDeliversExactlyTheAmount(uint256) (runs: 256, μ: 825200, ~: 824948)\nLogs:\n  Bound result 44089019551883591497814688\n\n[PASS] testFuzz_roundTripOfAnySizeIsExactAndConservesSupply(uint256) (runs: 256, μ: 1034982, ~: 1039961)\nLogs:\n  Bound result 1249999999999000056388\n\n[PASS] testFuzz_swarmClaimsExhaustTheDistributorExactly(uint8,uint256) (runs: 256, μ: 862058, ~: 555376)\nLogs:\n  Bound result 7\n  Bound result 503052\n\n[PASS] test_buyWithoutPairTokenRevertsAndMovesNoHoodt() (gas: 707868)\n[PASS] test_constructorMintsTheWholeSupplyToTheFactory() (gas: 31530)\n[PASS] test_launchFlowsMoveExactlyWhatTheySay() (gas: 639533)\n[PASS] test_manifestInitialPriceMatchesTheEconomics() (gas: 27115)\n[PASS] test_nobodyCanMoveThePoolManagersHoodtDirectly() (gas: 610427)\n[PASS] test_seedBeyondTheFactoryBalanceReverts() (gas: 357844)\n[PASS] test_seederCollectsExactlyTheAccruedFees() (gas: 1186830)\n[PASS] test_sellingMoreThanHeldRevertsWithTheTokenErrorAndChangesNothing() (gas: 944684)\n[PASS] test_traderBuysThroughThePoolManagerPayingTheFee() (gas: 872600)\n[PASS] test_traderSellsBackThroughThePoolManagerPayingTheFeeAgain() (gas: 1029298)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 62.96ms (173.52ms CPU time)\n\nRan 16 tests for test/HOODTToken.t.sol:HOODTTokenTest\n[PASS] test_approveAndTransferFrom() (gas: 171253)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32483)\n[PASS] test_constructorMakesNoExternalCalls() (gas: 10863)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 33124)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 122828)\n[PASS] test_metadata() (gas: 26535)\n[PASS] test_noMintOrAdminSelectorsExist() (gas: 221499)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1654408)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 19377)\n[PASS] test_transferFromRevertsWhenAllowanceExceeded() (gas: 87681)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 47497)\n[PASS] test_transferMovesExactAmountWithNoFee() (gas: 169550)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 67321)\n[PASS] test_transferRevertsToZeroAddress() (gas: 32526)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43602)\n[PASS] test_transferWholeBalanceAndZeroAmount() (gas: 122790)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 63.69ms (5.72ms CPU time)\n\nRan 13 tests for test/HOODTLaunchPool.t.sol:HOODTLaunchPoolHoodtIsCurrency1Test\n[PASS] testFuzz_exactOutputBuyDeliversExactlyTheAmount(uint256) (runs: 256, μ: 829197, ~: 828913)\nLogs:\n  Bound result 10913837721188003854588881\n\n[PASS] testFuzz_roundTripOfAnySizeIsExactAndConservesSupply(uint256) (runs: 256, μ: 1039600, ~: 1033902)\nLogs:\n  Bound result 309793192096043270003\n\n[PASS] testFuzz_swarmClaimsExhaustTheDistributorExactly(uint8,uint256) (runs: 256, μ: 890208, ~: 555718)\nLogs:\n  Bound result 7\n  Bound result 503052\n\n[PASS] test_buyWithoutPairTokenRevertsAndMovesNoHoodt() (gas: 678560)\n[PASS] test_constructorMintsTheWholeSupplyToTheFactory() (gas: 31530)\n[PASS] test_launchFlowsMoveExactlyWhatTheySay() (gas: 644117)\n[PASS] test_manifestInitialPriceMatchesTheEconomics() (gas: 27115)\n[PASS] test_nobodyCanMoveThePoolManagersHoodtDirectly() (gas: 615004)\n[PASS] test_seedBeyondTheFactoryBalanceReverts() (gas: 362554)\n[PASS] test_seederCollectsExactlyTheAccruedFees() (gas: 1192104)\n[PASS] test_sellingMoreThanHeldRevertsWithTheTokenErrorAndChangesNothing() (gas: 983013)\n[PASS] test_traderBuysThroughThePoolManagerPayingTheFee() (gas: 878204)\n[PASS] test_traderSellsBackThroughThePoolManagerPayingTheFeeAgain() (gas: 1034615)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 80.10ms (153.90ms CPU time)\n\nRan 22 tests for test/HOODTToken.fuzz.t.sol:HOODTTokenFuzzTest\n[PASS] testFuzz_allowanceMayExceedBalanceButCannotBeSpentBeyondIt(uint256,uint256) (runs: 256, μ: 174034, ~: 174292)\nLogs:\n  Bound result 347048881963190170154405478\n  Bound result 29229972018441829754931579635610844278359\n\n[PASS] testFuzz_allowancesAreIsolatedPerSpender(uint256,uint256) (runs: 256, μ: 175953, ~: 176174)\nLogs:\n  Bound result 347048881963190170154405478\n  Bound result 85228379133233753628007535\n\n[PASS] testFuzz_anyDeployerReceivesTheWholeSupply(address) (runs: 256, μ: 33965, ~: 33965)\n[PASS] testFuzz_anyoneMayApproveAnyone(address,address,uint256) (runs: 256, μ: 104565, ~: 106312)\n[PASS] testFuzz_approveSetsNotAdds(uint256,uint256) (runs: 256, μ: 128460, ~: 128507)\n[PASS] testFuzz_approveZeroSpenderRevertsForAnyAmount(uint256) (runs: 256, μ: 39933, ~: 39896)\n[PASS] testFuzz_emptyHolderCanOnlySendZero(address) (runs: 256, μ: 71280, ~: 71280)\n[PASS] testFuzz_infiniteAllowanceSurvivesAnySpend(uint256,uint256) (runs: 256, μ: 181045, ~: 181330)\nLogs:\n  Bound result 102429317005526731437884215\n  Bound result 503052\n\n[PASS] testFuzz_repeatedAndChainedTransfersConserveSupply(uint256,uint256) (runs: 256, μ: 253771, ~: 255046)\nLogs:\n  Bound result 102429317005526731437884215\n  Bound result 503052\n\n[PASS] testFuzz_selfTransferChangesNothing(uint256) (runs: 256, μ: 47282, ~: 46995)\nLogs:\n  Bound result 7989\n\n[PASS] testFuzz_transferFromBeyondAllowanceRevertsEvenWithBalance(uint256,uint256) (runs: 256, μ: 115204, ~: 115456)\nLogs:\n  Bound result 347048881963190170154405478\n  Bound result 29229972018441829754931579635610844278359\n\n[PASS] testFuzz_transferFromSpendsExactlyTheAmountOfAllowance(uint256,uint256) (runs: 256, μ: 172741, ~: 174327)\nLogs:\n  Bound result 11726270787841986471189760998347048881963190170154405478\n  Bound result 829754931579606380872259918\n\n[PASS] testFuzz_transferFromToZeroAddressReverts(uint256) (runs: 256, μ: 88986, ~: 88699)\nLogs:\n  Bound result 7989\n\n[PASS] testFuzz_transferMovesExactlyTheAmount(address,uint256) (runs: 256, μ: 125480, ~: 125636)\nLogs:\n  Bound result 920\n\n[PASS] testFuzz_transferOfMoreThanTheBalanceRevertsAndMovesNothing(uint256,uint256) (runs: 256, μ: 119338, ~: 119601)\nLogs:\n  Bound result 347048881963190170154405478\n  Bound result 29229972018441829754931579635610844278359\n\n[PASS] testFuzz_transferToZeroAddressAlwaysReverts(uint256) (runs: 256, μ: 55705, ~: 55418)\nLogs:\n  Bound result 7989\n\n[PASS] testFuzz_unknownSelectorsRevert(bytes4,bytes32,bytes32) (runs: 256, μ: 50400, ~: 50603)\n[PASS] test_emptyCalldataAndPlainEtherAreRejected() (gas: 94466)\n[PASS] test_metadataDecodesThroughTheStandardAbi() (gas: 37035)\n[PASS] test_runtimeFitsEip170() (gas: 7924)\n[PASS] test_transferFromOfOwnBalanceNeedsAnAllowance() (gas: 38468)\n[PASS] test_twoDeploymentsDoNotShareState() (gas: 61235)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 80.17ms (789.35ms CPU time)\n\nRan 1 test for test/HOODTToken.invariant.t.sol:HOODTTokenInvariantTest\n[PASS]\nHOODTTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchTheLedger\n[PASS] invariant_balancesMatchTheLedger\n[PASS] invariant_codeAndConstantsAreImmutable\n[PASS] invariant_sumOfBalancesIsTheFixedSupply\n HOODTTokenInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭--------------+------------------------------+-------+---------+----------╮\n| Contract     | Selector                     | Calls | Reverts | Discards |\n+==========================================================================+\n| HOODTHandler | adminAttempt                 | 492   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | approve                      | 453   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | approveZeroSpender           | 449   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transfer                     | 433   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transferFrom                 | 464   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transferFromTooMuchAllowance | 441   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transferFromTooMuchBalance   | 457   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transferToZero               | 461   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transferTooMuch              | 446   | 0       | 0        |\n╰--------------+------------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 12\n  Bound result 524288\n  Bound result 0\n  Bound result 3188125633950676715989639144913565085428084968\n  Bound result 7906\n  Bound result 0\n  Bound result 60\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 9206\n  Bound result 0\n  Bound result 1488\n  Bound result 0\n  Bound result 12500\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10000000000000000\n  Bound result 0\n  Bound result 109978158632069291\n  Bound result 12\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 793\n  Bound result 6799\n  Bound result 57624965989330334\n  Bound result 9\n  Bound result 0\n  Bound result 4712\n  Bound result 6162\n  Bound result 3552\n  Bound result 4863\n  Bound result 8120\n  Bound result 0\n  Bound result 1\n  Bound result 2400206598322656\n  Bound result 1064470260\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.89s (1.89s CPU time)\n\nRan 5 test suites in 1.89s (2.17s CPU time): 65 tests passed, 0 failed, 0 skipped (65 total tests)\n","passed":true},{"durationMs":47,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"HOODTToken.approve(address,uint256)\",\"HOODTToken.transfer(address,uint256)\",\"HOODTToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"README.md\":90,\"foundry.toml\":15,\"launch.json\":24,\"remappings.txt\":1,\"src/HOODTToken.sol\":92,\"test/HOODTLaunchPool.t.sol\":546,\"test/HOODTToken.fuzz.t.sol\":310,\"test/HOODTToken.invariant.t.sol\":224,\"test/HOODTToken.t.sol\":193,\"test/vendor/README.md\":12,\"test/vendor/solmate/src/auth/Owned.sol\":44,\"test/vendor/v4-core/licenses/BUSL_LICENSE\":63,\"test/vendor/v4-core/licenses/MIT_LICENSE\":7,\"test/vendor/v4-core/src/ERC6909.sol\":90,\"test/vendor/v4-core/src/ERC6909Claims.sol\":23,\"test/vendor/v4-core/src/Extsload.sol\":64,\"test/vendor/v4-core/src/Exttload.sol\":40,\"test/vendor/v4-core/src/NoDelegateCall.sol\":33,\"test/vendor/v4-core/src/PoolManager.sol\":394,\"test/vendor/v4-core/src/ProtocolFees.sol\":71,\"test/vendor/v4-core/src/interfaces/IExtsload.sol\":21,\"test/vendor/v4-core/src/interfaces/IExttload.sol\":15,\"test/vendor/v4-core/src/interfaces/IHooks.sol\":152,\"test/vendor/v4-core/src/interfaces/IPoolManager.sol\":217,\"test/vendor/v4-core/src/interfaces/IProtocolFees.sol\":52,\"test/vendor/v4-core/src/interfaces/callback/IUnlockCallback.sol\":10,\"test/vendor/v4-core/src/interfaces/external/IERC20Minimal.sol\":48,\"test/vendor/v4-core/src/interfaces/external/IERC6909Claims.sol\":66,\"test/vendor/v4-core/src/libraries/BitMath.sol\":49,\"test/vendor/v4-core/src/libraries/CurrencyDelta.sol\":42,\"test/vendor/v4-core/src/libraries/CurrencyReserves.sol\":39,\"test/vendor/v4-core/src/libraries/CustomRevert.sol\":120,\"test/vendor/v4-core/src/libraries/FixedPoint128.sol\":8,\"test/vendor/v4-core/src/libraries/FixedPoint96.sol\":10,\"test/vendor/v4-core/src/libraries/FullMath.sol\":117,\"test/vendor/v4-core/src/libraries/Hooks.sol\":344,\"test/vendor/v4-core/src/libraries/LPFeeLibrary.sol\":79,\"test/vendor/v4-core/src/libraries/LiquidityMath.sol\":20,\"test/vendor/v4-core/src/libraries/Lock.sol\":28,\"test/vendor/v4-core/src/libraries/NonzeroDeltaCount.sol\":35,\"test/vendor/v4-core/src/libraries/ParseBytes.sol\":29,\"test/vendor/v4-core/src/libraries/Pool.sol\":620,\"test/vendor/v4-core/src/libraries/Position.sol\":103,\"test/vendor/v4-core/src/libraries/ProtocolFeeLibrary.sol\":47,\"test/vendor/v4-core/src/libraries/SafeCast.sol\":60,\"test/vendor/v4-core/src/libraries/SqrtPriceMath.sol\":292,\"test/vendor/v4-core/src/libraries/StateLibrary.sol\":345,\"test/vendor/v4-core/src/libraries/SwapMath.sol\":108,\"test/vendor/v4-core/src/libraries/TickBitmap.sol\":121,\"test/vendor/v4-core/src/libraries/TickMath.sol\":238,\"test/vendor/v4-core/src/libraries/TransientStateLibrary.sol\":48,\"test/vendor/v4-core/src/libraries/UnsafeMath.sol\":29,\"test/vendor/v4-core/src/types/BalanceDelta.sol\":72,\"test/vendor/v4-core/src/types/BeforeSwapDelta.sol\":38,\"test/vendor/v4-core/src/types/Currency.sol\":118,\"test/vendor/v4-core/src/types/PoolId.sol\":17,\"test/vendor/v4-core/src/types/PoolKey.sol\":22,\"test/vendor/v4-core/src/types/PoolOperation.sol\":26,\"test/vendor/v4-core/src/types/Slot0.sol\":95},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"bba3d56a4d759a781e4b1a7cd853751a9f98e300312184e3ee7bba7ed7c9959b","verifiedTreeHash":"6279307e3e727f12379eaa3c37445ce314610f10","verifierVersion":"0.1.0+c4d32abc"},{"checks":[{"durationMs":2304,"exitCode":0,"name":"build","output":"Compiling 71 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.20s\nCompiler run successful!\n","passed":true},{"durationMs":1966,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 13 tests for test/HOODTLaunchPool.t.sol:HOODTLaunchPoolHoodtIsCurrency0Test\n[PASS] testFuzz_exactOutputBuyDeliversExactlyTheAmount(uint256) (runs: 256, μ: 825220, ~: 824962)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_roundTripOfAnySizeIsExactAndConservesSupply(uint256) (runs: 256, μ: 1034470, ~: 1029188)\nLogs:\n  Bound result 12134743568087742603\n\n[PASS] testFuzz_swarmClaimsExhaustTheDistributorExactly(uint8,uint256) (runs: 256, μ: 901873, ~: 682599)\nLogs:\n  Bound result 39\n  Bound result 2316380115552391793616301\n\n[PASS] test_buyWithoutPairTokenRevertsAndMovesNoHoodt() (gas: 707868)\n[PASS] test_constructorMintsTheWholeSupplyToTheFactory() (gas: 31530)\n[PASS] test_launchFlowsMoveExactlyWhatTheySay() (gas: 639533)\n[PASS] test_manifestInitialPriceMatchesTheEconomics() (gas: 27115)\n[PASS] test_nobodyCanMoveThePoolManagersHoodtDirectly() (gas: 610427)\n[PASS] test_seedBeyondTheFactoryBalanceReverts() (gas: 357844)\n[PASS] test_seederCollectsExactlyTheAccruedFees() (gas: 1186830)\n[PASS] test_sellingMoreThanHeldRevertsWithTheTokenErrorAndChangesNothing() (gas: 944684)\n[PASS] test_traderBuysThroughThePoolManagerPayingTheFee() (gas: 872600)\n[PASS] test_traderSellsBackThroughThePoolManagerPayingTheFeeAgain() (gas: 1029298)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 66.46ms (176.93ms CPU time)\n\nRan 16 tests for test/HOODTToken.t.sol:HOODTTokenTest\n[PASS] test_approveAndTransferFrom() (gas: 171253)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32483)\n[PASS] test_constructorMakesNoExternalCalls() (gas: 10863)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 33124)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 122828)\n[PASS] test_metadata() (gas: 26535)\n[PASS] test_noMintOrAdminSelectorsExist() (gas: 221499)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1654408)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 19377)\n[PASS] test_transferFromRevertsWhenAllowanceExceeded() (gas: 87681)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 47497)\n[PASS] test_transferMovesExactAmountWithNoFee() (gas: 169550)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 67321)\n[PASS] test_transferRevertsToZeroAddress() (gas: 32526)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43602)\n[PASS] test_transferWholeBalanceAndZeroAmount() (gas: 122790)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 66.45ms (6.97ms CPU time)\n\nRan 13 tests for test/HOODTLaunchPool.t.sol:HOODTLaunchPoolHoodtIsCurrency1Test\n[PASS] testFuzz_exactOutputBuyDeliversExactlyTheAmount(uint256) (runs: 256, μ: 829222, ~: 828995)\nLogs:\n  Bound result 71839189765637445926830436\n\n[PASS] testFuzz_roundTripOfAnySizeIsExactAndConservesSupply(uint256) (runs: 256, μ: 1039241, ~: 1033875)\nLogs:\n  Bound result 601558367008063029714\n\n[PASS] testFuzz_swarmClaimsExhaustTheDistributorExactly(uint8,uint256) (runs: 256, μ: 919301, ~: 682599)\nLogs:\n  Bound result 1\n  Bound result 1272\n\n[PASS] test_buyWithoutPairTokenRevertsAndMovesNoHoodt() (gas: 678560)\n[PASS] test_constructorMintsTheWholeSupplyToTheFactory() (gas: 31530)\n[PASS] test_launchFlowsMoveExactlyWhatTheySay() (gas: 644117)\n[PASS] test_manifestInitialPriceMatchesTheEconomics() (gas: 27115)\n[PASS] test_nobodyCanMoveThePoolManagersHoodtDirectly() (gas: 615004)\n[PASS] test_seedBeyondTheFactoryBalanceReverts() (gas: 362554)\n[PASS] test_seederCollectsExactlyTheAccruedFees() (gas: 1192104)\n[PASS] test_sellingMoreThanHeldRevertsWithTheTokenErrorAndChangesNothing() (gas: 983013)\n[PASS] test_traderBuysThroughThePoolManagerPayingTheFee() (gas: 878204)\n[PASS] test_traderSellsBackThroughThePoolManagerPayingTheFeeAgain() (gas: 1034615)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 67.47ms (147.14ms CPU time)\n\nRan 22 tests for test/HOODTToken.fuzz.t.sol:HOODTTokenFuzzTest\n[PASS] testFuzz_allowanceMayExceedBalanceButCannotBeSpentBeyondIt(uint256,uint256) (runs: 256, μ: 174035, ~: 174321)\nLogs:\n  Bound result 839259478708\n  Bound result 1105391554171502541278165164411176083510938434989139576330394650488598202\n\n[PASS] testFuzz_allowancesAreIsolatedPerSpender(uint256,uint256) (runs: 256, μ: 176104, ~: 176186)\nLogs:\n  Bound result 839259478708\n  Bound result 560742896014\n\n[PASS] testFuzz_anyDeployerReceivesTheWholeSupply(address) (runs: 256, μ: 33965, ~: 33965)\n[PASS] testFuzz_anyoneMayApproveAnyone(address,address,uint256) (runs: 256, μ: 105899, ~: 106360)\n[PASS] testFuzz_approveSetsNotAdds(uint256,uint256) (runs: 256, μ: 128469, ~: 128477)\n[PASS] testFuzz_approveZeroSpenderRevertsForAnyAmount(uint256) (runs: 256, μ: 39926, ~: 39890)\n[PASS] testFuzz_emptyHolderCanOnlySendZero(address) (runs: 256, μ: 71280, ~: 71280)\n[PASS] testFuzz_infiniteAllowanceSurvivesAnySpend(uint256,uint256) (runs: 256, μ: 181096, ~: 181342)\nLogs:\n  Bound result 839259478708\n  Bound result 632540573607948695857588085\n\n[PASS] testFuzz_repeatedAndChainedTransfersConserveSupply(uint256,uint256) (runs: 256, μ: 254622, ~: 255046)\nLogs:\n  Bound result 839259478708\n  Bound result 764300183935\n\n[PASS] testFuzz_selfTransferChangesNothing(uint256) (runs: 256, μ: 47276, ~: 46983)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_transferFromBeyondAllowanceRevertsEvenWithBalance(uint256,uint256) (runs: 256, μ: 115216, ~: 115491)\nLogs:\n  Bound result 617719610753887360997076056\n  Bound result 10615239529192194052441599197835125963728803468650101162544081119090782453\n\n[PASS] testFuzz_transferFromSpendsExactlyTheAmountOfAllowance(uint256,uint256) (runs: 256, μ: 173727, ~: 174345)\nLogs:\n  Bound result 262656204860617719610753887360997076056\n  Bound result 208501975324194684554173037\n\n[PASS] testFuzz_transferFromToZeroAddressReverts(uint256) (runs: 256, μ: 88980, ~: 88687)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_transferMovesExactlyTheAmount(address,uint256) (runs: 256, μ: 125611, ~: 126146)\nLogs:\n  Bound result 23980164655843020134789852\n\n[PASS] testFuzz_transferOfMoreThanTheBalanceRevertsAndMovesNothing(uint256,uint256) (runs: 256, μ: 119350, ~: 119636)\nLogs:\n  Bound result 839259478708\n  Bound result 1105391554171502541278165164411176083510938434989139576330394650488598202\n\n[PASS] testFuzz_transferToZeroAddressAlwaysReverts(uint256) (runs: 256, μ: 55699, ~: 55406)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_unknownSelectorsRevert(bytes4,bytes32,bytes32) (runs: 256, μ: 50365, ~: 50603)\n[PASS] test_emptyCalldataAndPlainEtherAreRejected() (gas: 94466)\n[PASS] test_metadataDecodesThroughTheStandardAbi() (gas: 37035)\n[PASS] test_runtimeFitsEip170() (gas: 7924)\n[PASS] test_transferFromOfOwnBalanceNeedsAnAllowance() (gas: 38468)\n[PASS] test_twoDeploymentsDoNotShareState() (gas: 61235)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 67.52ms (795.01ms CPU time)\n\nRan 1 test for test/HOODTToken.invariant.t.sol:HOODTTokenInvariantTest\n[PASS]\nHOODTTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchTheLedger\n[PASS] invariant_balancesMatchTheLedger\n[PASS] invariant_codeAndConstantsAreImmutable\n[PASS] invariant_sumOfBalancesIsTheFixedSupply\n HOODTTokenInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭--------------+------------------------------+-------+---------+----------╮\n| Contract     | Selector                     | Calls | Reverts | Discards |\n+==========================================================================+\n| HOODTHandler | adminAttempt                 | 428   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | approve                      | 433   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | approveZeroSpender           | 440   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transfer                     | 454   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transferFrom                 | 479   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transferFromTooMuchAllowance | 469   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transferFromTooMuchBalance   | 491   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transferToZero               | 458   | 0       | 0        |\n|--------------+------------------------------+-------+---------+----------|\n| HOODTHandler | transferTooMuch              | 444   | 0       | 0        |\n╰--------------+------------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 9507\n  Bound result 0\n  Bound result 0\n  Bound result 2617\n  Bound result 234\n  Bound result 1064470260\n  Bound result 0\n  Bound result 0\n  Bound result 5216\n  Bound result 1\n  Bound result 0\n  Bound result 7449\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3762\n  Bound result 340146287995602323631171512101879684304\n  Bound result 0\n  Bound result 2033\n  Bound result 64\n  Bound result 960000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 3433\n  Bound result 0\n  Bound result 0\n  Bound result 8576\n  Bound result 434\n  Bound result 0\n  Bound result 340214320654664324051920982716015181260\n  Bound result 498\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.89s (1.89s CPU time)\n\nRan 5 test suites in 1.89s (2.16s CPU time): 65 tests passed, 0 failed, 0 skipped (65 total tests)\n","passed":true},{"durationMs":41,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"HOODTToken.approve(address,uint256)\",\"HOODTToken.transfer(address,uint256)\",\"HOODTToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"README.md\":90,\"foundry.toml\":15,\"launch.json\":24,\"remappings.txt\":1,\"src/HOODTToken.sol\":92,\"test/HOODTLaunchPool.t.sol\":546,\"test/HOODTToken.fuzz.t.sol\":310,\"test/HOODTToken.invariant.t.sol\":224,\"test/HOODTToken.t.sol\":193,\"test/vendor/README.md\":12,\"test/vendor/solmate/src/auth/Owned.sol\":44,\"test/vendor/v4-core/licenses/BUSL_LICENSE\":63,\"test/vendor/v4-core/licenses/MIT_LICENSE\":7,\"test/vendor/v4-core/src/ERC6909.sol\":90,\"test/vendor/v4-core/src/ERC6909Claims.sol\":23,\"test/vendor/v4-core/src/Extsload.sol\":64,\"test/vendor/v4-core/src/Exttload.sol\":40,\"test/vendor/v4-core/src/NoDelegateCall.sol\":33,\"test/vendor/v4-core/src/PoolManager.sol\":394,\"test/vendor/v4-core/src/ProtocolFees.sol\":71,\"test/vendor/v4-core/src/interfaces/IExtsload.sol\":21,\"test/vendor/v4-core/src/interfaces/IExttload.sol\":15,\"test/vendor/v4-core/src/interfaces/IHooks.sol\":152,\"test/vendor/v4-core/src/interfaces/IPoolManager.sol\":217,\"test/vendor/v4-core/src/interfaces/IProtocolFees.sol\":52,\"test/vendor/v4-core/src/interfaces/callback/IUnlockCallback.sol\":10,\"test/vendor/v4-core/src/interfaces/external/IERC20Minimal.sol\":48,\"test/vendor/v4-core/src/interfaces/external/IERC6909Claims.sol\":66,\"test/vendor/v4-core/src/libraries/BitMath.sol\":49,\"test/vendor/v4-core/src/libraries/CurrencyDelta.sol\":42,\"test/vendor/v4-core/src/libraries/CurrencyReserves.sol\":39,\"test/vendor/v4-core/src/libraries/CustomRevert.sol\":120,\"test/vendor/v4-core/src/libraries/FixedPoint128.sol\":8,\"test/vendor/v4-core/src/libraries/FixedPoint96.sol\":10,\"test/vendor/v4-core/src/libraries/FullMath.sol\":117,\"test/vendor/v4-core/src/libraries/Hooks.sol\":344,\"test/vendor/v4-core/src/libraries/LPFeeLibrary.sol\":79,\"test/vendor/v4-core/src/libraries/LiquidityMath.sol\":20,\"test/vendor/v4-core/src/libraries/Lock.sol\":28,\"test/vendor/v4-core/src/libraries/NonzeroDeltaCount.sol\":35,\"test/vendor/v4-core/src/libraries/ParseBytes.sol\":29,\"test/vendor/v4-core/src/libraries/Pool.sol\":620,\"test/vendor/v4-core/src/libraries/Position.sol\":103,\"test/vendor/v4-core/src/libraries/ProtocolFeeLibrary.sol\":47,\"test/vendor/v4-core/src/libraries/SafeCast.sol\":60,\"test/vendor/v4-core/src/libraries/SqrtPriceMath.sol\":292,\"test/vendor/v4-core/src/libraries/StateLibrary.sol\":345,\"test/vendor/v4-core/src/libraries/SwapMath.sol\":108,\"test/vendor/v4-core/src/libraries/TickBitmap.sol\":121,\"test/vendor/v4-core/src/libraries/TickMath.sol\":238,\"test/vendor/v4-core/src/libraries/TransientStateLibrary.sol\":48,\"test/vendor/v4-core/src/libraries/UnsafeMath.sol\":29,\"test/vendor/v4-core/src/types/BalanceDelta.sol\":72,\"test/vendor/v4-core/src/types/BeforeSwapDelta.sol\":38,\"test/vendor/v4-core/src/types/Currency.sol\":118,\"test/vendor/v4-core/src/types/PoolId.sol\":17,\"test/vendor/v4-core/src/types/PoolKey.sol\":22,\"test/vendor/v4-core/src/types/PoolOperation.sol\":26,\"test/vendor/v4-core/src/types/Slot0.sol\":95},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f265c37413e1ed6c0b8d33ec870f35ea680da8e3a2ff4f6a3dde3633f929c1af","verifiedTreeHash":"32e241a62cee9ac40f01c620c30d99b0b53d38b2","verifierVersion":"0.1.0+c4d32abc"}]}