{"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":"38ea18be-1ad5-4c62-a696-b7a9e137742c","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"e02e3f0879a2b8435bfa8b50db4a40665a419f21461b2684c694a5bf8f1064b2","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":"efe65463971e2f260de9d352623f46f90a89d78c9e64bd56c60a91bb1b7c24bc","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":"5d79d0c59e871be58d585bf86b3972138b35685389feae790168740652c8c3ad","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":"33702f7b2ee46ecdd37a9d807fe0891e9e8ced5b9c43dd1581ebffdcfdf26f7f","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":"e68a18592502b5c403848e513dba564fbaf04b6bd74258212baf94d7a2fba8cf","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":"808d3f8b7a146d74b89e5a1daa56f1f5824dabdf3c848aebe9467b69b449e665","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":"76211a1231ba018e4768091ea012723c4ff6617ba024507e6f8b4f604badf725","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"860768cc2eb6754bb034b0d535347eb64411c6c2832d7ee8cae264a6b7a2c106","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: ForeverCultFund (FOREVER).\nToken name: ForeverCultFund\nToken symbol: FOREVER\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"bb3dd1fc69b2933d1845f83a11112b9f4c0578c1a795a49d19f6df8a1416d8d5","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"38ea18be-1ad5-4c62-a696-b7a9e137742c","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2112-forevercultfund"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52149","feedbackHash":"35a7f8a7ba2d33deaf8f2d825c12a1f5ea27624d334b574c8bd8723005ed2a81","nodeKey":"audit_economics","submissionHash":"e02e3f0879a2b8435bfa8b50db4a40665a419f21461b2684c694a5bf8f1064b2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52665","feedbackHash":"afa68495bdf58d7d93582a5f6783734965b2e9973d488cb282f81983eea94c68","nodeKey":"audit_flow","submissionHash":"efe65463971e2f260de9d352623f46f90a89d78c9e64bd56c60a91bb1b7c24bc","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51041","feedbackHash":"a05821382625a969ad10ea16b39290780b16978521be6f67a718eee649c08424","nodeKey":"audit_judge","submissionHash":"5d79d0c59e871be58d585bf86b3972138b35685389feae790168740652c8c3ad","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51317","feedbackHash":"afba184b83e30c166704511abd1754f263fed52513c7c2bf887f2456b013068c","nodeKey":"audit_math","submissionHash":"33702f7b2ee46ecdd37a9d807fe0891e9e8ced5b9c43dd1581ebffdcfdf26f7f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51473","feedbackHash":"7ad8e57f8ab140c8af1b78b17b2f5d67db71ad832749bac46476a1bc68d3aaff","nodeKey":"audit_permissions","submissionHash":"e68a18592502b5c403848e513dba564fbaf04b6bd74258212baf94d7a2fba8cf","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51075","feedbackHash":"be57b9327be7ee7f704b06caca40c9b17615d9d21f74373fe4650e4219d4c4ea","nodeKey":"build_contract_project","submissionHash":"808d3f8b7a146d74b89e5a1daa56f1f5824dabdf3c848aebe9467b69b449e665","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51296","feedbackHash":"b0c0682d23263985dee5feaa1ced696e2275bb7425d56e326e5858afff60bd74","nodeKey":"manifest","submissionHash":"76211a1231ba018e4768091ea012723c4ff6617ba024507e6f8b4f604badf725","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51454","feedbackHash":"0086b720eba8cf65f74bef5d4afa1702831c3a67d23105b3879e6b44f967b7d3","nodeKey":"write_foundry_tests","submissionHash":"860768cc2eb6754bb034b0d535347eb64411c6c2832d7ee8cae264a6b7a2c106","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"a5c5f79192e6e71e633c57bf8bf148ae361ac19c17fefc6d72080aa1c696cb74","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0476c44a80aa9574","findings":[],"hash":"33702f7b2ee46ecdd37a9d807fe0891e9e8ced5b9c43dd1581ebffdcfdf26f7f","nodeId":"fb734154-e0a4-4203-a5de-58a230e32d0c","outcome":"completed","summary":"The review is complete and the findings file is written. No defects found in the assigned area.\n\n**What was audited.** The token at `src/ForeverCultFund.sol` is a 16-line contract: it inherits OpenZeppelin ERC20 and mints a constant supply to the deployer in the constructor. There is no custom arithmetic, no division, no downcast, no scale conversion, no fee, and no owner. I confirmed the five vendored OpenZeppelin files are byte-identical to upstream v5.1.0, so the only math in scope is the library's `_update` and `_spendAllowance`.\n\n**Math Precision, Boundary and Numerical Gap checks, all holding:**\n- The supply constant evaluates at compile time to exactly 1e27 and matches the brief. It fits in a uint96, so no intermediate can overflow.\n- Transfer of balance plus one, and of max uint256, both revert with the typed insufficient-balance error. Exact-balance transfer leaves zero. Self-transfer of the whole balance does not double it. The unchecked receiver add is bounded by total supply.\n- Infinite allowance is never decremented. An allowance of max minus one is decremented by exactly the value. Allowance one short of the amount reverts. A balance revert after the allowance step rolls the allowance back atomically.\n- Zero-amount transfers and approvals succeed as the standard prescribes. Zero-address sender, receiver and spender all revert. No payable path exists, so ETH sent to the token reverts.\n- A 1000-run fuzz of two-hop transfers preserved the 1e27 sum of balances every time.\n\n**Static analysis lead.** The aderyn \"large numeric literal\" line is a style note on a compile-time constant, not a defect, and was left out of findings.\n\n**Output.** The repository root `.imd-findings.json` holds an empty findings list and seven coverage rows: one `holds` row for each of the three listed entry points, plus rows for the fixed-supply invariant, the unmodified-library invariant, the payable boundary, and the aderyn lead. Scratch tests were run under `test/scratch/` and removed, so the working tree is unchanged apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":475423,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":8872,"runtime":"claude","turns":14,"wallClockMs":198768}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3bed38612db34f32","findings":[{"citation":"resolved","description":"Reproduced the audit_permissions finding. The token inherits OpenZeppelin v5.1.0 ERC20 unchanged (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol is byte-identical to upstream commit 69c8def5f222ff96f2b5beff05dfba996368aa79, verified by fetching the upstream file and cmp). In _spendAllowance the check is `currentAllowance < value`, which is never true for value == 0, so transferFrom(victim, anyone, 0) from a caller with zero allowance returns true and emits Transfer(victim, anyone, 0). No balance, allowance or supply changes; with value 1 and no allowance the call reverts with ERC20InsufficientAllowance. This is standard ERC-20 behavior across the ecosystem and affects only off-chain indexers that treat a zero-value Transfer log as evidence the from-account acted. Recorded as a trust note, not a defect that blocks release. Merged: only one specialist reported it.","line":10,"path":"src/ForeverCultFund.sol","reproduction":"Deploy ForeverCultFund via CREATE2 from a factory contract F (F holds 1e27). From attacker A with allowance(F, A) == 0, call token.transferFrom(F, 0xB0B, 0). Expected under a strict 'spender must hold allowance' reading: revert. Actual: returns true and emits Transfer(F, 0xB0B, 0); balanceOf(F) stays 1e27, balanceOf(0xB0B) stays 0, allowance stays 0. Same call with value 1 reverts. Confirmed with test/scratch/Review.t.sol::test_zeroValueTransferFromWithoutAllowanceEmits (vm.expectEmit on Transfer(F, 0xB0B, 0), passes on this code).","severity":"info","snippet":"contract ForeverCultFund is ERC20 {","title":"Zero-value transferFrom succeeds and emits Transfer(from, to, 0) from any account without allowance (inherited OpenZeppelin v5.1.0 behavior, no fix required)"},{"citation":"resolved","description":"Reproduced the audit_economics finding. All six OpenZeppelin files under lib/openzeppelin-contracts/ match dependencies.lock.json and are byte-identical to upstream commit 69c8def5f222ff96f2b5beff05dfba996368aa79 (fetched and compared with cmp), so the production token's dependency closure is genuine. Seven forge-std files (src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol) do not match the lock file's hashes. Fetching the same seven files from upstream commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 and comparing after stripping all whitespace gives identical digests, so the difference is formatting only (consistent with `forge fmt` at line_length 120 having been run over lib/). forge-std reaches only tests, never the deployed bytecode. Impact: the README statement is false for forge-std and anyone verifying the tree against the lock file gets seven mismatches. Fix: restore the seven files to upstream bytes (and keep lib/ out of `forge fmt`), or re-record their hashes in dependencies.lock.json and reword the README.","line":82,"path":"README.md","reproduction":"From the repository root run: python3 -I -c \"import json,hashlib;d=json.load(open('dependencies.lock.json'));[print(p,hashlib.sha256(open(x['path']+'/'+p,'rb').read()).hexdigest()==h) for x in d for p,h in x['filesSha256'].items()]\". Expected: every line prints True. Actual: lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol and interfaces/IMulticall3.sol print False; all 29 other files print True. For each of the seven, `curl raw.githubusercontent.com/foundry-rs/forge-std/77041d2ce690e692d6e03cc812b57d1ddaa4d505/<path> | tr -d ' \\t\\n\\r' | sha256sum` equals the same command over the local file, while plain cmp reports a difference.","severity":"info","snippet":"Vendored upstream files are unchanged. `dependencies.lock.json` records exact commits, archive URLs and hashes, and SHA-256 hashes for each included file:","title":"Seven vendored forge-std files were whitespace-reformatted; their SHA-256 hashes no longer match dependencies.lock.json or the README's 'unchanged' claim (test-only, no bytecode impact)"}],"hash":"5d79d0c59e871be58d585bf86b3972138b35685389feae790168740652c8c3ad","nodeId":"cb1d20a1-1cb0-410a-945b-e9df8abfe8c9","outcome":"completed","summary":"The review is done and `.imd-findings.json` is written. Nothing was changed in the repository, since both the findings file and `test/scratch/` are untracked by git and ignored.\n\n**Outcome.** The token is a plain, unmodified OpenZeppelin v5.1.0 ERC-20 with a constructor-only mint of the manifest supply to the deployer. No defect above info severity exists. Both specialist findings reproduced and are kept at info; nothing new turned up in my own pass.\n\n**Findings kept, both info:**\n- **Zero-value transferFrom without allowance** succeeds and emits a Transfer log from any account. Standard OpenZeppelin behavior, affects only indexers, no funds or allowances move. Reproduced in `test/scratch/Review.t.sol` with an expectEmit check.\n- **Seven forge-std files are whitespace-reformatted** and no longer match the hashes in the dependency lock file, so the README's \"unchanged\" claim is false for them. I fetched the upstream files and confirmed the difference is whitespace only. OpenZeppelin files are byte-identical to upstream, so the deployed bytecode is unaffected.\n\n**Dropped:** the aderyn large-numeric-literal lead. The literal is a readable, correct supply constant.\n\n**Verification I ran:**\n- Full project suite: 52 tests pass.\n- Scratch test covering CREATE2 deploy from a factory, exact supply and decimals, exact transfer and transferFrom accounting, 22 privileged selectors and ETH all reverting, creation and runtime size limits, and an opcode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT. All five pass.\n- The protected Uniswap v4 harness could not run here because v4-core is not vendored. Its locally checkable parts are covered by the scratch test above.\n\n**Coverage:** all three entry points answered, plus three invariant rows for the constructor-only mint, deployability and the manifest shape.","treeHash":null,"usage":{"cachedInputTokens":586509,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":9582,"runtime":"claude","turns":13,"wallClockMs":152144}},{"artifacts":[],"attempt":2,"bundleHash":"2afbbad5bc5a0a8488968ccbbff7498f261eac7bca5c38c53da402c966942414","device":"e54711bd1fbb0d02","findings":[],"hash":"76211a1231ba018e4768091ea012723c4ff6617ba024507e6f8b4f604badf725","nodeId":"0dfd767f-e110-454c-93e6-0c26f3a42223","outcome":"completed","summary":"Created `launch.json` with the accepted token’s metadata, exact supply, empty constructor arguments, and required pool and economics values.\n\nValidation passed: manifest/ABI checks, `forge build`, and `forge test`—35 tests passed using the supplied fuzz seed. Only `launch.json` is changed for submission.","treeHash":"e92c63917905dce49d751294dc1b3ae91563374e","usage":{"cachedInputTokens":165376,"inputTokens":34929,"model":"gpt-6-astra","outputTokens":2474,"runtime":"codex","turns":3,"wallClockMs":68571}},{"artifacts":[],"attempt":1,"bundleHash":"4c831239dc3c4a60da0a77502c1647bd946be611345fa6adc197aee4daa41ed0","device":"108f8fd3a1992a92","findings":[],"hash":"808d3f8b7a146d74b89e5a1daa56f1f5824dabdf3c848aebe9467b69b449e665","nodeId":"8851b9de-5371-4ba6-a149-1162eacfead3","outcome":"completed","summary":"Implemented ForeverCultFund (FOREVER): 1 billion tokens, 18 decimals, minted once to the deployer, with no subsequent minting or admin controls.\n\nDependencies are vendored, and deployment assumptions and responsibilities are documented in README.md.\n\nPassed `forge build`, `forge test` (35 tests, supplied fuzz seed), and `forge fmt --check`. Full launch integration remains for the network verifier.","treeHash":"36277f318d40076f6ba5ea6830a7ffd4b32dc22e","usage":{"cachedInputTokens":602624,"inputTokens":50232,"model":"gpt-6-astra","outputTokens":15889,"runtime":"codex","turns":5,"wallClockMs":330742}},{"artifacts":[],"attempt":1,"bundleHash":"c1f1d3c2bab9655b346c80706805b6e914126a2dc56d6521180f4565a3da7158","device":"983d7731bb482b1b","findings":[],"hash":"860768cc2eb6754bb034b0d535347eb64411c6c2832d7ee8cae264a6b7a2c106","nodeId":"26192dd8-8e06-4048-b731-c6409c499490","outcome":"completed","summary":"Added 17 unit/fuzz tests and expanded invariants to cover 10 actions, including failure paths and allowance rollback.\n\n`forge build` and `forge test` pass with the required seed: 52 reported tests and 32,768 invariant calls.\n\nNo defects found. All changes are under `test/`.","treeHash":"31385f0e5042e21d24b1f012ec073186999a00e9","usage":{"cachedInputTokens":610048,"inputTokens":76126,"model":"gpt-6-astra","outputTokens":10170,"runtime":"codex","turns":4,"wallClockMs":251469}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"af1843f371022d4a","findings":[{"citation":"resolved","description":"Outside the economics area; reported because it is a verifiable provenance defect. All six OpenZeppelin files under lib/openzeppelin-contracts/ match both the lock file and upstream commit 69c8def5f222ff96f2b5beff05dfba996368aa79 byte for byte, so the production token's dependency closure is genuine. Seven forge-std files (src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol) do NOT match the hashes recorded for them in dependencies.lock.json. The lock-file hashes equal upstream forge-std commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505; the local files differ from upstream only by whitespace (multi-line function signatures collapsed to one line, consistent with `forge fmt` at line_length 120 having been run over lib/). Stripping all whitespace, local and upstream are identical for all seven files, so no semantic change was introduced. forge-std is used only by tests and does not reach the deployed bytecode. Impact: the README statement at line 82 is false for forge-std, and anyone who verifies the tree against dependencies.lock.json gets seven mismatches. Fix: either restore the seven files to the upstream bytes (and exclude lib/ from `forge fmt`), or re-record their hashes in dependencies.lock.json and reword the README.","line":82,"path":"README.md","reproduction":"From the repository root run: python3 -I -c \"import json,hashlib;d=json.load(open('dependencies.lock.json'));[print(p,hashlib.sha256(open(x['path']+'/'+p,'rb').read()).hexdigest()==h) for x in d for p,h in x['filesSha256'].items()]\" . Expected: every line prints True. Actual: lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol and interfaces/IMulticall3.sol print False (local sha256 of src/Vm.sol starts a1b1c82924ae; the lock and upstream value starts 9068805b59ac). Fetching the same seven files from raw.githubusercontent.com/foundry-rs/forge-std/77041d2ce690e692d6e03cc812b57d1ddaa4d505/src/ and comparing after `tr -d ' \\t\\n\\r'` gives identical digests, proving the difference is whitespace only.","severity":"info","snippet":"Vendored upstream files are unchanged. `dependencies.lock.json` records exact commits, archive URLs and hashes, and SHA-256 hashes for each included file:","title":"Seven vendored forge-std files were reformatted; their SHA-256 hashes no longer match dependencies.lock.json or the README's 'unchanged' claim (test-only, no bytecode impact)"}],"hash":"e02e3f0879a2b8435bfa8b50db4a40665a419f21461b2684c694a5bf8f1064b2","nodeId":"d8ebd686-32a2-4920-94df-2136c0aa91b2","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. The git tree is clean apart from the findings file, which is ignored.\n\n**Outcome: no economic defects in the token.** ForeverCultFund is an unmodified OpenZeppelin v5.1.0 ERC-20 with a single constructor mint of 10^27 units to the deployer. The three entry points (approve, transfer, transferFrom) behave exactly as the Economic Security, Invariant and Flow Gap guides require.\n\nWhat I verified:\n- **Supply invariant.** The constructor is the only writer of total supply. No mint, burn, pause, blacklist, seize, or upgrade path exists, and the runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- **Launch flows.** The 10% swarm share, 85% pool seed and 5% remainder divide 10^27 exactly, and every leg (factory to distributor, distributor to claimant, pool manager in and out) moves the exact amount. I confirmed this with the 35 repository tests plus a scratch launch-split test, both passing.\n- **Economic surface.** No external calls, no stored addresses, no receive or fallback, zero address rejected in every role. The factory cannot pull a holder's balance without an allowance.\n- **Dependency provenance.** All six vendored OpenZeppelin files match upstream commit 69c8def and the lock file by SHA-256.\n\nOne info-level finding, outside my area: seven vendored forge-std files were reformatted, so their hashes no longer match `dependencies.lock.json` or the README claim that vendored files are unchanged. The difference is whitespace only and forge-std is test-only, so deployed bytecode is unaffected. The finding includes a one-line reproduction command.\n\nThe coverage record has eight rows: all three entry points hold, plus rows for the supply conservation invariant, exact launch flows, the economic dependency surface, absence of privileged selectors, and a note that tokens sent to the token's own address are stranded by design and documented.","treeHash":null,"usage":{"cachedInputTokens":883161,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":14146,"runtime":"claude","turns":27,"wallClockMs":281966}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc34db8e17664ebd","findings":[{"citation":"resolved","description":"Asymmetry between the paired entry points: transfer() binds the debited account to msg.sender, while the inherited transferFrom() only checks allowance when value > 0 (OpenZeppelin v5.1.0 _spendAllowance skips the check when currentAllowance == max, and when value == 0 the check `currentAllowance < value` is never true). Any caller can therefore call transferFrom(victim, anyone, 0) with zero allowance and the contract emits Transfer(victim, anyone, 0). No balance or allowance changes, so no funds are at risk; the only effect is a spoofed zero-value Transfer log attributed to an account that did not act. This is the unmodified upstream OpenZeppelin behavior (vendored ERC20.sol verified byte-identical to v5.1.0) and is accepted across the ecosystem, so it is recorded as a trust/asymmetry note for indexers and not as a defect that should block release. Access-control conclusion for the whole contract: there are no roles, owners, initializers, receive/fallback, or supply-changing paths after construction; the constructor mints once to msg.sender (the factory under launch), and every state write is guarded by the caller's own balance or an allowance the holder granted.","line":10,"path":"src/ForeverCultFund.sol","reproduction":"Deploy ForeverCultFund from a factory F (F holds 1e27). From attacker A with allowance(F, A) == 0: call token.transferFrom(F, victim, 0). Expected under a strict reading of 'spender must hold allowance': revert. Actual: returns true and emits Transfer(F, victim, 0); balanceOf(F) stays 1e27, balanceOf(victim) stays 0, allowance unchanged. Confirmed by a Foundry test with vm.expectEmit on Transfer(F, victim, 0). With value 1 and no allowance the same call reverts with ERC20InsufficientAllowance(A, 0, 1), so no non-zero movement is possible.","severity":"info","snippet":"contract ForeverCultFund is ERC20 {","title":"Zero-value transferFrom emits a Transfer event from any account without allowance (inherited OpenZeppelin behavior, no fix required)"}],"hash":"e68a18592502b5c403848e513dba564fbaf04b6bd74258212baf94d7a2fba8cf","nodeId":"281de95a-52bd-48b1-b4a5-2ad549ecebe7","outcome":"completed","summary":"The review is complete and the findings file is written. The working tree is otherwise unchanged, and the scratch test directory was removed.\n\n**Result: no defects in the permission model.** The token is a bare OpenZeppelin v5.1.0 ERC-20 with a single constructor mint. I recorded one info-level note and marked all three entry points covered.\n\n**What I checked, against the Access Control, Asymmetry and Trust Gap guides**\n\n- **Permission map.** The compiled ABI has exactly three non-view functions: approve, transfer and transferFrom. There is no owner, role, modifier, initializer, receive or fallback, and no mint, burn, pause, blacklist or upgrade path. The constructor mints the full supply once to the direct caller, confirmed never to be tx.origin by a factory probe.\n- **Inconsistent guards.** Balances are written only through the internal update function, always after a balance check, and the supply-changing branches need a zero-address sender or receiver, which every external path rejects. The factory cannot pull from a holder without an approval.\n- **Hidden code.** All five vendored OpenZeppelin files hash byte-identical to the upstream v5.1.0 commit, so no backdoor is inherited.\n- **Trust gap.** With no privileged actor and no economic formula inside the token, none of the access-times-economics seams exist. The launch allocation is the factory's business, not the token's.\n\n**The one note, recorded as info.** A zero-value transferFrom succeeds with no allowance and emits a Transfer event attributed to any account the caller names. No balance or allowance moves, and this is standard upstream behavior, so it does not warrant a revision. It is in the file so the judge can deduplicate it if another specialist reports it.\n\n**Coverage.** Seven rows are recorded: the three listed entry points, the constructor role handout, the fixed-supply invariant, the no-privileged-hand invariant, and the runtime opcode and fallback surface. Nothing in my area was left unreached. The project's 35 existing tests, including fuzz and invariant suites, pass. The aderyn large-literal lead is a style remark about the supply constant and has no runtime effect.","treeHash":null,"usage":{"cachedInputTokens":679402,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":10186,"runtime":"claude","turns":22,"wallClockMs":177952}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0ef0cddb99617930","findings":[],"hash":"efe65463971e2f260de9d352623f46f90a89d78c9e64bd56c60a91bb1b7c24bc","nodeId":"54f1dba9-783c-4f77-b848-50b4b29a320a","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds an empty findings list with nine coverage rows. No tracked file was changed.\n\n**Result: no defects found in the assigned area.** ForeverCultFund is a fifteen-line contract that inherits OpenZeppelin ERC20 v5.1.0 unchanged and mints one billion tokens with 18 decimals to the deployer in its constructor. It adds no transfer logic, no owner, no fallback, and no external calls.\n\nWhat I checked against the Execution Trace, Periphery and First Principles guides:\n\n- **Execution flow of all three entry points.** Each of approve, transfer and transferFrom runs in a single frame with no external call, so there is no stale read, partial update, or reentrancy surface. Zero-address sender, receiver and spender revert. Self-transfer nets to no balance change. Insufficient balance or allowance reverts the whole transaction, so the allowance consumed in transferFrom never survives a failed transfer.\n- **Periphery.** The five vendored OpenZeppelin files match the SHA-256 hashes in the lock file and are byte-identical to the upstream commit fetched from GitHub. The token overrides nothing, so the base behaviour is exactly upstream's.\n- **First principles.** The constructor is nonpayable with zero ABI inputs, mints exactly 1e27 base units matching the launch supply string, and under CREATE2 the full supply lands on the factory rather than its caller. Supply cannot grow afterwards because mint and burn are internal and the ABI exposes only the standard ERC-20 surface plus the supply constant.\n- **Launch flows.** With no fees or exemptions, the swarm share, pool seed, remainder and trader legs from the protected test move exact amounts. The existing suite of 35 unit, fuzz and invariant tests passes on this tree.\n- **Static-analysis lead.** The aderyn large-numeric-literal note on line 12 is a readability remark. The literal evaluates to the correct supply and is not a defect.\n\nTwo things I did not report as findings. The standard ERC-20 approve front-run race exists here as in every ERC-20 and is documented in the README. It is a property of the brief's design, not a bug in this code. The real factory and Uniswap v4 harness are not in this tree, so the actual seed and swap were traced from the protected test's source rather than executed.","treeHash":null,"usage":{"cachedInputTokens":672823,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":11177,"runtime":"claude","turns":20,"wallClockMs":168380}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c21eed2758adfc7d","findings":[],"hash":"f6954475442cd1f1328095c266517b6c6d3247aa09ddc97a73adf72ab0b18d95","nodeId":"0dfd767f-e110-454c-93e6-0c26f3a42223","outcome":"failed","summary":"dependency did not apply: fatal: '/var/lib/imd-worker/.identitymd/work/38ea18be-1ad5-4c62-a696-b7a9e137742c/dep0-4c831239dc3c4a60.bundle' does not appear to be a git repository\nfatal: Could not read from remote repository.\n\nPlease make sure you have the correct access rights\nand the repository exists.\n","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":0,"wallClockMs":1021}}],"verification":[{"checks":[{"durationMs":1124,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.05s\nCompiler run successful!\n","passed":true},{"durationMs":1822,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 34 tests for test/ForeverCultFund.t.sol:ForeverCultFundTest\n[PASS] testAnotherSpenderCannotUseAnApproval() (gas: 95099)\n[PASS] testApprovalDoesNotRequireTokenBalance() (gas: 78593)\n[PASS] testApproveEmitsEventAndReplacesAllowance() (gas: 119333)\n[PASS] testApproveZeroSpenderReverts() (gas: 30366)\n[PASS] testConstructorEmitsMintEvent() (gas: 5623)\n[PASS] testDeployerCannotSpendHolderFundsWithoutApproval() (gas: 95350)\n[PASS] testEOADeployerReceivesEntireSupply() (gas: 20189)\n[PASS] testExactAllowanceCanBeExhausted() (gas: 162101)\n[PASS] testFactoryReceivesSupplyRatherThanCallerOrOrigin() (gas: 309970)\n[PASS] testFuzzDelegatedTransfer(uint256,uint256) (runs: 1000, μ: 160120, ~: 162000)\nLogs:\n  Bound result 9\n\n[PASS] testFuzzDelegatedTransferExceedingAllowanceReverts(uint256) (runs: 1000, μ: 119573, ~: 119892)\nLogs:\n  Bound result 925562722231197952006392902\n\n[PASS] testFuzzTransferAboveBalanceReverts(uint256) (runs: 1000, μ: 58876, ~: 59185)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640489602179815205865136032837\n\n[PASS] testFuzzTransferConservesBalances(uint256) (runs: 1000, μ: 92007, ~: 92315)\nLogs:\n  Bound result 101184145\n\n[PASS] testFuzzTransferToAnyNonzeroRecipient(address,uint256) (runs: 1000, μ: 93142, ~: 93189)\nLogs:\n  Bound result 306432383865623365678363702\n\n[PASS] testInfiniteAllowanceIsNotDecremented() (gas: 129361)\n[PASS] testInsufficientAllowanceRevertsWithoutChangingState() (gas: 116160)\n[PASS] testInsufficientBalanceRevertsWithoutChangingState() (gas: 120455)\n[PASS] testLaunchDistributionClaimsAndPoolTransfersArriveWhole() (gas: 646592)\n[PASS] testMetadataAndInitialSupply() (gas: 107457)\n[PASS] testNoMintBurnOrAdministrativeEntrypoints() (gas: 755496)\n[PASS] testPlainEtherTransferReverts() (gas: 45300)\n[PASS] testRevertedTransferFromRestoresSpentAllowance() (gas: 126572)\n[PASS] testRevokedAllowanceCannotBeSpent() (gas: 130695)\n[PASS] testRuntimeHasNoForbiddenOpcodes() (gas: 786653)\n[PASS] testSelfTransferPreservesBalance() (gas: 51454)\n[PASS] testTransferEmitsEventAndMovesExactAmount() (gas: 93528)\n[PASS] testTransferEntireSupply() (gas: 75786)\n[PASS] testTransferFromSpendsAllowanceAndEmitsTransfer() (gas: 160501)\n[PASS] testTransferFromToSelfConsumesAllowanceButPreservesBalance() (gas: 107907)\n[PASS] testTransferFromToZeroRestoresAllowance() (gas: 104142)\n[PASS] testTransferFromZeroSenderReverts() (gas: 35320)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 71926)\n[PASS] testZeroTransferFromEmptyAccountEmitsEvent() (gas: 73442)\n[PASS] testZeroTransferFromNeedsNoAllowance() (gas: 78717)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 30.39ms (156.19ms CPU time)\n\nRan 1 test for test/ForeverCultFund.invariant.t.sol:ForeverCultFundInvariantTest\n[PASS]\nForeverCultFundInvariantTest invariants:\n[PASS] invariantAllowancesMatchModel\n[PASS] invariantSupplyAndBalancesMatchModel\n ForeverCultFundInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+----------------------+-------+---------+----------╮\n| Contract       | Selector             | Calls | Reverts | Discards |\n+====================================================================+\n| ForeverHandler | approve              | 1979  | 0       | 0        |\n|----------------+----------------------+-------+---------+----------|\n| ForeverHandler | transfer             | 2129  | 0       | 0        |\n|----------------+----------------------+-------+---------+----------|\n| ForeverHandler | transferAboveBalance | 2052  | 0       | 0        |\n|----------------+----------------------+-------+---------+----------|\n| ForeverHandler | transferFrom         | 2032  | 0       | 0        |\n╰----------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 77963288731089492916535357\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5339\n  Bound result 5793\n  Bound result 5563\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 861\n  Bound result 0\n  Bound result 0\n  Bound result 623\n  Bound result 4\n  Bound result 5463\n  Bound result 6\n  Bound result 0\n  Bound result 5507\n  Bound result 914\n  Bound result 0\n  Bound result 6706\n  Bound result 663\n  Bound result 1\n  Bound result 37907535125254025883054613\n  Bound result 95\n  Bound result 127\n  Bound result 55314759954632368674510706\n  Bound result 85103162918911574871164779\n  Bound result 8500\n  Bound result 0\n  Bound result 3\n  Bound result 100\n  Bound result 10000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.74s (1.74s CPU time)\n\nRan 2 test suites in 1.74s (1.77s CPU time): 35 tests passed, 0 failed, 0 skipped (35 total tests)\n","passed":true},{"durationMs":39,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ForeverCultFund.approve(address,uint256)\",\"ForeverCultFund.transfer(address,uint256)\",\"ForeverCultFund.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"LICENSE\":21,\"README.md\":85,\"dependencies.lock.json\":58,\"foundry.toml\":22,\"launch.json\":24,\"remappings.txt\":2,\"src/ForeverCultFund.sol\":17,\"test/ForeverCultFund.invariant.t.sol\":113,\"test/ForeverCultFund.t.sol\":399},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"76211a1231ba018e4768091ea012723c4ff6617ba024507e6f8b4f604badf725","verifiedTreeHash":"e92c63917905dce49d751294dc1b3ae91563374e","verifierVersion":"0.1.0+c3fba9eb"},{"checks":[{"durationMs":1188,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.11s\nCompiler run successful!\n","passed":true},{"durationMs":2032,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 34 tests for test/ForeverCultFund.t.sol:ForeverCultFundTest\n[PASS] testAnotherSpenderCannotUseAnApproval() (gas: 95099)\n[PASS] testApprovalDoesNotRequireTokenBalance() (gas: 78593)\n[PASS] testApproveEmitsEventAndReplacesAllowance() (gas: 119333)\n[PASS] testApproveZeroSpenderReverts() (gas: 30366)\n[PASS] testConstructorEmitsMintEvent() (gas: 5623)\n[PASS] testDeployerCannotSpendHolderFundsWithoutApproval() (gas: 95350)\n[PASS] testEOADeployerReceivesEntireSupply() (gas: 20189)\n[PASS] testExactAllowanceCanBeExhausted() (gas: 162101)\n[PASS] testFactoryReceivesSupplyRatherThanCallerOrOrigin() (gas: 309970)\n[PASS] testFuzzDelegatedTransfer(uint256,uint256) (runs: 1000, μ: 160120, ~: 162000)\nLogs:\n  Bound result 85797\n\n[PASS] testFuzzDelegatedTransferExceedingAllowanceReverts(uint256) (runs: 1000, μ: 119573, ~: 119892)\nLogs:\n  Bound result 925562722231197952006392902\n\n[PASS] testFuzzTransferAboveBalanceReverts(uint256) (runs: 1000, μ: 58876, ~: 59185)\nLogs:\n  Bound result 16882703168207762949552551553676805909960\n\n[PASS] testFuzzTransferConservesBalances(uint256) (runs: 1000, μ: 92007, ~: 92315)\nLogs:\n  Bound result 925562722231197952006392902\n\n[PASS] testFuzzTransferToAnyNonzeroRecipient(address,uint256) (runs: 1000, μ: 93142, ~: 93189)\nLogs:\n  Bound result 8\n\n[PASS] testInfiniteAllowanceIsNotDecremented() (gas: 129361)\n[PASS] testInsufficientAllowanceRevertsWithoutChangingState() (gas: 116160)\n[PASS] testInsufficientBalanceRevertsWithoutChangingState() (gas: 120455)\n[PASS] testLaunchDistributionClaimsAndPoolTransfersArriveWhole() (gas: 646592)\n[PASS] testMetadataAndInitialSupply() (gas: 107457)\n[PASS] testNoMintBurnOrAdministrativeEntrypoints() (gas: 755496)\n[PASS] testPlainEtherTransferReverts() (gas: 45300)\n[PASS] testRevertedTransferFromRestoresSpentAllowance() (gas: 126572)\n[PASS] testRevokedAllowanceCannotBeSpent() (gas: 130695)\n[PASS] testRuntimeHasNoForbiddenOpcodes() (gas: 786653)\n[PASS] testSelfTransferPreservesBalance() (gas: 51454)\n[PASS] testTransferEmitsEventAndMovesExactAmount() (gas: 93528)\n[PASS] testTransferEntireSupply() (gas: 75786)\n[PASS] testTransferFromSpendsAllowanceAndEmitsTransfer() (gas: 160501)\n[PASS] testTransferFromToSelfConsumesAllowanceButPreservesBalance() (gas: 107907)\n[PASS] testTransferFromToZeroRestoresAllowance() (gas: 104142)\n[PASS] testTransferFromZeroSenderReverts() (gas: 35320)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 71926)\n[PASS] testZeroTransferFromEmptyAccountEmitsEvent() (gas: 73442)\n[PASS] testZeroTransferFromNeedsNoAllowance() (gas: 78717)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 30.95ms (168.47ms CPU time)\n\nRan 1 test for test/ForeverCultFund.invariant.t.sol:ForeverCultFundInvariantTest\n[PASS]\nForeverCultFundInvariantTest invariants:\n[PASS] invariantAllowancesMatchModel\n[PASS] invariantSupplyAndBalancesMatchModel\n ForeverCultFundInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+----------------------+-------+---------+----------╮\n| Contract       | Selector             | Calls | Reverts | Discards |\n+====================================================================+\n| ForeverHandler | approve              | 1979  | 0       | 0        |\n|----------------+----------------------+-------+---------+----------|\n| ForeverHandler | transfer             | 2129  | 0       | 0        |\n|----------------+----------------------+-------+---------+----------|\n| ForeverHandler | transferAboveBalance | 2052  | 0       | 0        |\n|----------------+----------------------+-------+---------+----------|\n| ForeverHandler | transferFrom         | 2032  | 0       | 0        |\n╰----------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 77963288731089492916535357\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5339\n  Bound result 5793\n  Bound result 5563\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 861\n  Bound result 0\n  Bound result 0\n  Bound result 623\n  Bound result 4\n  Bound result 5463\n  Bound result 6\n  Bound result 0\n  Bound result 5507\n  Bound result 914\n  Bound result 0\n  Bound result 6706\n  Bound result 663\n  Bound result 1\n  Bound result 37907535125254025883054613\n  Bound result 95\n  Bound result 127\n  Bound result 55314759954632368674510706\n  Bound result 85103162918911574871164779\n  Bound result 8500\n  Bound result 0\n  Bound result 3\n  Bound result 100\n  Bound result 10000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.95s (1.94s CPU time)\n\nRan 2 test suites in 1.95s (1.98s CPU time): 35 tests passed, 0 failed, 0 skipped (35 total tests)\n","passed":true},{"durationMs":34,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ForeverCultFund.approve(address,uint256)\",\"ForeverCultFund.transfer(address,uint256)\",\"ForeverCultFund.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"LICENSE\":21,\"README.md\":85,\"dependencies.lock.json\":58,\"foundry.toml\":22,\"remappings.txt\":2,\"src/ForeverCultFund.sol\":17,\"test/ForeverCultFund.invariant.t.sol\":113,\"test/ForeverCultFund.t.sol\":399},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":578,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":320,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/ForeverCultFund.sol:12: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"808d3f8b7a146d74b89e5a1daa56f1f5824dabdf3c848aebe9467b69b449e665","verifiedTreeHash":"36277f318d40076f6ba5ea6830a7ffd4b32dc22e","verifierVersion":"0.1.0+c3fba9eb"},{"checks":[{"durationMs":1427,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.32s\nCompiler run successful!\n","passed":true},{"durationMs":6428,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 17 tests for test/ForeverCultFund.properties.t.sol:ForeverCultFundPropertiesTest\n[PASS] testApprovalCannotBeUsedForAnotherOwner() (gas: 297691)\n[PASS] testDelegatedSelfTransferStillRequiresSufficientBalance() (gas: 233515)\n[PASS] testFuzzApprovalAppliesToFutureReceipts(uint256) (runs: 1000, μ: 387504, ~: 387336)\nLogs:\n  Bound result 193494386118\n\n[PASS] testFuzzDelegatedSelfTransferOnlyConsumesAllowance(uint256,uint256,uint256) (runs: 1000, μ: 243649, ~: 244637)\nLogs:\n  Bound result 7718538556182113607124240\n  Bound result 98675859938824938\n\n[PASS] testFuzzFailedDelegatedTransferCanBeRetried(uint256,uint256,bool) (runs: 1000, μ: 393282, ~: 391450)\nLogs:\n  Bound result 489049542458506348191174626\n  Bound result 115792089237316195423570985008687907853269984665640074989924995566699249146160\n\n[PASS] testFuzzReplacementAfterPartialSpendIsExact(uint256,uint256,uint256) (runs: 1000, μ: 456751, ~: 455959)\nLogs:\n  Bound result 1725540768\n  Bound result 12\n\n[PASS] testFuzzRevocationBlocksPreviouslyApprovedSpender(uint256,uint256) (runs: 1000, μ: 268077, ~: 269589)\nLogs:\n  Bound result 5252\n  Bound result 242\n\n[PASS] testFuzzRoundTripRestoresBalancesAndLeavesAllowancesAlone(uint256,uint256) (runs: 1000, μ: 381879, ~: 382748)\nLogs:\n  Bound result 419612168800226984084171242\n\n[PASS] testInfiniteAllowanceCanBeReducedThenRevoked() (gas: 390886)\n[PASS] testLargestFiniteAllowanceIsConsumed() (gas: 206310)\n[PASS] testMaximumDelegatedTransferCannotBypassBalanceCheck() (gas: 177398)\n[PASS] testMaximumTransferCannotOverflowBalances() (gas: 113329)\n[PASS] testOwnerUsingTransferFromNeedsSelfApproval() (gas: 309114)\n[PASS] testReceivingTokensDoesNotInheritSendersApprovals() (gas: 297218)\n[PASS] testSelfTransferStillRequiresSufficientBalance() (gas: 166475)\n[PASS] testZeroDelegatedTransferEmitsEventWithoutApproval() (gas: 137630)\n[PASS] testZeroSpenderRejectedForZeroAndMaximumApprovals() (gas: 206108)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 126.25ms (736.75ms CPU time)\n\nRan 34 tests for test/ForeverCultFund.t.sol:ForeverCultFundTest\n[PASS] testAnotherSpenderCannotUseAnApproval() (gas: 95099)\n[PASS] testApprovalDoesNotRequireTokenBalance() (gas: 78593)\n[PASS] testApproveEmitsEventAndReplacesAllowance() (gas: 119333)\n[PASS] testApproveZeroSpenderReverts() (gas: 30366)\n[PASS] testConstructorEmitsMintEvent() (gas: 5623)\n[PASS] testDeployerCannotSpendHolderFundsWithoutApproval() (gas: 95350)\n[PASS] testEOADeployerReceivesEntireSupply() (gas: 20189)\n[PASS] testExactAllowanceCanBeExhausted() (gas: 162101)\n[PASS] testFactoryReceivesSupplyRatherThanCallerOrOrigin() (gas: 309970)\n[PASS] testFuzzDelegatedTransfer(uint256,uint256) (runs: 1000, μ: 159984, ~: 162000)\nLogs:\n  Bound result 242\n\n[PASS] testFuzzDelegatedTransferExceedingAllowanceReverts(uint256) (runs: 1000, μ: 119565, ~: 119892)\nLogs:\n  Bound result 925562722231197952006392902\n\n[PASS] testFuzzTransferAboveBalanceReverts(uint256) (runs: 1000, μ: 58863, ~: 59185)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913230824080\n\n[PASS] testFuzzTransferConservesBalances(uint256) (runs: 1000, μ: 92011, ~: 92339)\nLogs:\n  Bound result 925562722231197952006392902\n\n[PASS] testFuzzTransferToAnyNonzeroRecipient(address,uint256) (runs: 1000, μ: 93595, ~: 93620)\nLogs:\n  Bound result 1\n  Bound result 11394\n\n[PASS] testInfiniteAllowanceIsNotDecremented() (gas: 129361)\n[PASS] testInsufficientAllowanceRevertsWithoutChangingState() (gas: 116160)\n[PASS] testInsufficientBalanceRevertsWithoutChangingState() (gas: 120455)\n[PASS] testLaunchDistributionClaimsAndPoolTransfersArriveWhole() (gas: 646592)\n[PASS] testMetadataAndInitialSupply() (gas: 107457)\n[PASS] testNoMintBurnOrAdministrativeEntrypoints() (gas: 755496)\n[PASS] testPlainEtherTransferReverts() (gas: 45300)\n[PASS] testRevertedTransferFromRestoresSpentAllowance() (gas: 126572)\n[PASS] testRevokedAllowanceCannotBeSpent() (gas: 130695)\n[PASS] testRuntimeHasNoForbiddenOpcodes() (gas: 786653)\n[PASS] testSelfTransferPreservesBalance() (gas: 51454)\n[PASS] testTransferEmitsEventAndMovesExactAmount() (gas: 93528)\n[PASS] testTransferEntireSupply() (gas: 75786)\n[PASS] testTransferFromSpendsAllowanceAndEmitsTransfer() (gas: 160501)\n[PASS] testTransferFromToSelfConsumesAllowanceButPreservesBalance() (gas: 107907)\n[PASS] testTransferFromToZeroRestoresAllowance() (gas: 104142)\n[PASS] testTransferFromZeroSenderReverts() (gas: 35320)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 71926)\n[PASS] testZeroTransferFromEmptyAccountEmitsEvent() (gas: 73442)\n[PASS] testZeroTransferFromNeedsNoAllowance() (gas: 78717)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 126.39ms (620.45ms CPU time)\n\nRan 1 test for test/ForeverCultFund.invariant.t.sol:ForeverCultFundInvariantTest\n[PASS]\nForeverCultFundInvariantTest invariants:\n[PASS] invariantAllowancesMatchModel\n[PASS] invariantSupplyAndBalancesMatchModel\n ForeverCultFundInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------+----------------------------+-------+---------+----------╮\n| Contract       | Selector                   | Calls | Reverts | Discards |\n+==========================================================================+\n| ForeverHandler | approve                    | 3357  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| ForeverHandler | approveBoundary            | 3316  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| ForeverHandler | transfer                   | 3263  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| ForeverHandler | transferAboveBalance       | 3320  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| ForeverHandler | transferEntireBalance      | 3190  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| ForeverHandler | transferFrom               | 3205  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| ForeverHandler | transferFromAboveAllowance | 3324  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| ForeverHandler | transferFromAboveBalance   | 3298  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| ForeverHandler | transferFromToZero         | 3259  | 0       | 0        |\n|----------------+----------------------------+-------+---------+----------|\n| ForeverHandler | transferToZero             | 3236  | 0       | 0        |\n╰----------------+----------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 8888\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 26634260229813215910740868\n  Bound result 85005684179972384819098443106711940744\n  Bound result 2746072090\n  Bound result 879\n  Bound result 18\n  Bound result 6344\n  Bound result 773435945\n  Bound result 0\n  Bound result 3041954473\n  Bound result 5784\n  Bound result 4208\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 300\n  Bound result 0\n  Bound result 17\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129646285\n  Bound result 0\n  Bound result 4446\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 3563\n  Bound result 7073\n  Bound result 10\n  Bound result 115792089237316195423570985008687907853269984665640314039457584007913129649615\n  Bound result 1000\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129636499\n  Bound result 1179\n  Bound result 228806377547031862935449883\n  Bound result 2216\n  Bound result 1167\n  Bound result 3496\n  Bound result 337\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129635200\n  Bound result 387407194004483042826559234\n  Bound result 0\n  Bound result 2233625730\n  Bound result 1740\n  Bound result 2956\n  Bound result 957625571\n  Bound result 13\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665639814039457584007914129639948\n  Bound result 0\n  Bound result 0\n  Bound result 627\n  Bound result 581\n  Bound result 54607\n  Bound result 96\n  Bound result 43408\n  Bound result 6\n  Bound result 9094\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 36\n  Bound result 8\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.33s (6.33s CPU time)\n\nRan 3 test suites in 6.33s (6.58s CPU time): 52 tests passed, 0 failed, 0 skipped (52 total tests)\n","passed":true},{"durationMs":46,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ForeverCultFund.approve(address,uint256)\",\"ForeverCultFund.transfer(address,uint256)\",\"ForeverCultFund.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"LICENSE\":21,\"README.md\":85,\"dependencies.lock.json\":58,\"foundry.toml\":22,\"remappings.txt\":2,\"src/ForeverCultFund.sol\":17,\"test/ForeverCultFund.invariant.t.sol\":202,\"test/ForeverCultFund.properties.t.sol\":283,\"test/ForeverCultFund.t.sol\":400},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"860768cc2eb6754bb034b0d535347eb64411c6c2832d7ee8cae264a6b7a2c106","verifiedTreeHash":"31385f0e5042e21d24b1f012ec073186999a00e9","verifierVersion":"0.1.0+c3fba9eb"}]}