{"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":"50985911-ad81-47e1-bc43-d2c31c8ccea3","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"c1809ee3247a2ea468d703d268e2e5173f13563c6ffcb62885172359b2418192","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":"6b6a6c723270eab407ab5c77b84ffe36136cf1a73d4019542ac2e384d3ab3cac","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":"cd5ea99866dc785873da86f3d201ac9161642474a759148c5b5cd9865e8bd1c5","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":"0ee8dd2ea009f9b4af733312160a97c2c80bfa3d8853c800f063b564f9ffd226","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":"22c9d6b15175f9c02849dcc9dcea5ddc802770f2f237c6a6f6d98a038ee9b0b7","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":"090f34fc74c78994228bb97b00506c0faac494e1e32d38343add0895c29aa272","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":"7f985e5001113bae4d6a25ebfad27b1ebd17ad3166f5c167368a6fff2395a60a","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"e186145cfa8930812c7487ebacddf20bd6ba2311a89f352b5ed7f4f8dcb87f12","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: EARLY TEST (EARLY).\nToken name: EARLY TEST\nToken symbol: EARLY\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: https://t.me/EARLYCATODAY connect to this telegram","parentJobId":null,"planHash":"55413642fc2740b73841927bf542c3bafe3e8229d11c05104077764c1ada9a1f","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"50985911-ad81-47e1-bc43-d2c31c8ccea3","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2117-early-test"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50939","feedbackHash":"936616598ae9e5f80f82bacfe6ca7155b9c9122c44ca45d9e3f226c0f69d78ed","nodeKey":"audit_economics","submissionHash":"c1809ee3247a2ea468d703d268e2e5173f13563c6ffcb62885172359b2418192","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52240","feedbackHash":"99c7b6e0411b691042ac3cc4aadf3135c997fec98188118d32d39d470d6f4f86","nodeKey":"audit_flow","submissionHash":"6b6a6c723270eab407ab5c77b84ffe36136cf1a73d4019542ac2e384d3ab3cac","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52193","feedbackHash":"b63cadcb5af43918a1394b0b23374371432fe5be934f8a28bc5bcf7f1bef3937","nodeKey":"audit_judge","submissionHash":"cd5ea99866dc785873da86f3d201ac9161642474a759148c5b5cd9865e8bd1c5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52289","feedbackHash":"43dd9f0ab633051c530fc6f4f8c6f90c45a1114d995f2288a70648e684fa2a16","nodeKey":"audit_math","submissionHash":"0ee8dd2ea009f9b4af733312160a97c2c80bfa3d8853c800f063b564f9ffd226","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52254","feedbackHash":"f43fa39556134effdad5252e8fe859e136fdef4bd1a793a9144fde28338e4b50","nodeKey":"audit_permissions","submissionHash":"22c9d6b15175f9c02849dcc9dcea5ddc802770f2f237c6a6f6d98a038ee9b0b7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51518","feedbackHash":"156093c1ca4c041843fd9e7e1f0a9bb87122033118800d3c4f187a4dfbec69b9","nodeKey":"build_contract_project","submissionHash":"090f34fc74c78994228bb97b00506c0faac494e1e32d38343add0895c29aa272","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51311","feedbackHash":"ef973df2ecb5f6c1aa2f828b86e6645e40de85028bc00adce53eba68e0e246e3","nodeKey":"manifest","submissionHash":"7f985e5001113bae4d6a25ebfad27b1ebd17ad3166f5c167368a6fff2395a60a","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52371","feedbackHash":"4814bef4cb1f0aeafc1c90a20208ecb493dde7ae4d2c5c6ea52999718ed0533a","nodeKey":"write_foundry_tests","submissionHash":"e186145cfa8930812c7487ebacddf20bd6ba2311a89f352b5ed7f4f8dcb87f12","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"ec31c3d8269cb7f58a1c72c31344d56a688d9b29a4c371509c1a47296a37db79","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"73741f549bbb56ba1108783648400f22b5e857a1875ff7c28a95f71e18c6d614","device":"12fbd676b2122512","findings":[],"hash":"090f34fc74c78994228bb97b00506c0faac494e1e32d38343add0895c29aa272","nodeId":"854db1f3-a533-45a4-970c-bd13d46a5055","outcome":"completed","summary":"Implemented EARLY TEST (EARLY) with 1,000,000,000 tokens, 18 decimals, minted once to the deployer. The Telegram URL is exposed as a public community link.\n\nDependencies are vendored, and deployment assumptions and responsibilities are documented.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passed.\n- `forge test` passed: 30 tests using the required fuzz seed.\n- `forge fmt --check` passed.\n\nThe network’s protected launch integration remains a separate verification step.","treeHash":"120f1a719a4895323b8751fba4ac00b83c833ea8","usage":{"cachedInputTokens":553600,"inputTokens":65038,"model":"gpt-6-astra","outputTokens":16032,"runtime":"codex","turns":5,"wallClockMs":351994}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ee9fbaf2480d1034","findings":[{"citation":"resolved","description":"README.md (line 68) lists `sha256sum --check dependencies.sha256` as one of the project's four build-and-check steps, and DEPENDENCIES.md (line 3) states that all vendored files are unmodified from the pinned forge-std v1.9.7 archive. In the committed tree (git status clean at 9181aec) seven forge-std files have different content from the hashes recorded for them, so the project's own integrity check fails. The files are test-only (lib/forge-std/src/StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol); the OpenZeppelin ERC20 sources that the production token compiles against all match their recorded hashes, so this does not change EarlyToken's bytecode or behavior. It is a documentation/reproducibility defect: a reader following the README cannot confirm the test harness is the pinned release, and the DEPENDENCIES.md claim is false for these files. Outside the Math area; reported because it is concrete and reproducible.","line":24,"path":"dependencies.sha256","reproduction":"From the repository root run `sha256sum --check dependencies.sha256`. Expected (per README.md line 68 and DEPENDENCIES.md line 3): every line reports OK. Actual: `lib/forge-std/src/Vm.sol: FAILED` (recorded 9068805b…2cb1, actual a1b1c829…2a15), `lib/forge-std/src/StdAssertions.sol: FAILED` (recorded d4c89eec…9780, actual 3fbf4a02…7384), `lib/forge-std/src/console.sol: FAILED` (recorded 896c5a5a…f178, actual a2e632dc…79e9), plus StdJson.sol, StdToml.sol, interfaces/IERC7540.sol and interfaces/IMulticall3.sol, and the summary `WARNING: 7 computed checksums did NOT match`. Fix: either re-vendor the seven files from the v1.9.7 archive or regenerate dependencies.sha256 and correct DEPENDENCIES.md to name the forge-std revision actually vendored.","severity":"low","snippet":"9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1  lib/forge-std/src/Vm.sol","title":"Documented dependency-integrity check fails: 7 vendored forge-std files do not match dependencies.sha256"}],"hash":"0ee8dd2ea009f9b4af733312160a97c2c80bfa3d8853c800f063b564f9ffd226","nodeId":"db9c0557-9935-4298-b35d-e4c0fd49dd8d","outcome":"completed","summary":"The review is complete and the findings file is written. The tree has no changes other than the excluded findings file.\n\n**Outcome.** The math audit of EarlyToken found no arithmetic, boundary or numerical-gap defect. One low-severity finding outside my area is recorded, and all three entry points are marked `holds` in the coverage record.\n\n**What I covered.** The token is a 20-line wrapper over the vendored OpenZeppelin v5.2.0 ERC20, whose files all match their recorded checksums. I walked the three guides against every operation that touches a number:\n\n- **Math Precision.** The only custom arithmetic is the constant one billion times ten to the eighteenth, a compile-time literal far below the uint256 limit. There is no division, rate, fixed-point scale, narrowing cast or decimal conversion anywhere, so the aderyn \"large numeric literal\" lead is cosmetic. The unchecked subtractions and additions inside the inherited update path are bounded by a prior balance check and by a total supply that never grows.\n- **Boundary.** The contract makes no external calls, has no receive or fallback, decodes no bytes, and has no sentinel branches beyond OpenZeppelin's zero-address rejections. Plain ETH sends and value-bearing calls revert.\n- **Numerical Gap.** With no truncating operation, no seam exists. Zero-value transfers run the normal path, and the infinite-allowance skip leaves the max value unchanged by design.\n\nI confirmed these with a scratch Foundry test exercising the edges: exact-balance and balance-plus-one transfers, max-uint from an empty account, allowance exactly equal to the amount, one below infinite, infinite, and a fuzzed three-party sum-of-balances invariant. Every case behaved as specified, and the launch splits of ten, eighty-eight and two percent of the supply divide with zero remainder. The scratch file was removed afterward.\n\n**The one finding.** The README lists a checksum step as part of the build check, and DEPENDENCIES.md states the vendored files are unmodified. Running that step fails for seven forge-std test-library files whose content differs from the hashes recorded in dependencies.sha256. This does not affect the production bytecode, since the OpenZeppelin sources match. It is a reproducibility and documentation defect, reported as low with the exact recorded and actual hashes.\n\n**Not reached.** Nothing within the assigned area was left unexamined. Uniswap v4 seeding and price derivation happen in the deployer and the protected harness, not in this token, and were not reviewed beyond confirming that the token adds no fee that could short those flows.","treeHash":null,"usage":{"cachedInputTokens":929718,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":16363,"runtime":"claude","turns":31,"wallClockMs":267359}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"584bd638e7e022f0","findings":[{"citation":"resolved","description":"DEPENDENCIES.md (line 3) states the vendored files are unmodified from the pinned release archives, and both DEPENDENCIES.md (line 21) and README.md (line 68, in the 'Build and check' block) tell the operator to confirm this with `sha256sum --check dependencies.sha256`. On the tree as committed that command fails for seven files under lib/forge-std/src (StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol). I fetched the same seven files from the upstream forge-std v1.9.7 tag: their SHA-256 values equal the ones recorded in dependencies.sha256 exactly, so the hash file is correct and the vendored files are what diverged. The divergence is whitespace only (multi-line function signatures collapsed to one line, a formatter pass); with all spaces, tabs and newlines stripped every one of the seven files is identical to upstream. Impact: the release-reproducibility claim in the project's own docs is false as shipped, the documented check step cannot be used by the deployer or a later reviewer to confirm provenance, and anyone who regenerates dependencies.sha256 from the tree would silently bless a non-pristine copy. The affected library is forge-std, which is test-only; the production contract and the vendored OpenZeppelin v5.2.0 files all verify (the vendored ERC20.sol is byte-identical to upstream v5.2.0, SHA-256 prefix c322867b0b30f6d5), so there is no effect on deployed bytecode. This is outside my assigned area (Access Control, Trust Gap, Asymmetry) and is reported because it is concrete and reproducible. Fix: either restore the seven files from the v1.9.7 archive so the recorded hashes match, or if the reformatting is intentional, regenerate dependencies.sha256 and reword DEPENDENCIES.md line 3 to say the files were reformatted; lib/ is a path reviewers may not touch, so this is for the author.","line":3,"path":"DEPENDENCIES.md","reproduction":"State: the repository at commit 9181aec, clean working tree (git diff HEAD is empty; the 36 lib files are tracked). Input: from the repository root run `sha256sum --check dependencies.sha256` exactly as README.md line 68 and DEPENDENCIES.md line 21 instruct. Expected per DEPENDENCIES.md line 3: every line reports OK and the command exits 0. Actual: `lib/forge-std/src/StdAssertions.sol: FAILED`, `lib/forge-std/src/StdJson.sol: FAILED`, `lib/forge-std/src/StdToml.sol: FAILED`, `lib/forge-std/src/Vm.sol: FAILED`, `lib/forge-std/src/console.sol: FAILED`, `lib/forge-std/src/interfaces/IERC7540.sol: FAILED`, `lib/forge-std/src/interfaces/IMulticall3.sol: FAILED`, `sha256sum: WARNING: 7 computed checksums did NOT match`, exit status 1. Cross-check: `curl -fsSL https://raw.githubusercontent.com/foundry-rs/forge-std/v1.9.7/src/Vm.sol | sha256sum` gives 9068805b59ac1d0e..., which equals the entry recorded for lib/forge-std/src/Vm.sol in dependencies.sha256, while `sha256sum lib/forge-std/src/Vm.sol` gives a1b1c82924aecf0f...; `diff` between the two shows 72 lines of pure line-wrapping changes (e.g. upstream's four-line `function getDeployment(string calldata contractName, uint64 chainId)\\n external\\n view\\n returns (address deployedAddress);` is one line in the vendored copy), and `tr -d ' \\t\\n\\r' < file | sha256sum` is identical for upstream and vendored for all seven files.","severity":"low","snippet":"All dependency source needed by the build and tests is included as ordinary files. No package download, submodule, install step, or external library linking is required. Files are unmodified from the pinned release archives.","title":"Documented dependency integrity check fails: seven vendored forge-std files are reformatted copies, not the unmodified v1.9.7 files their recorded hashes describe"}],"hash":"22c9d6b15175f9c02849dcc9dcea5ddc802770f2f237c6a6f6d98a038ee9b0b7","nodeId":"0c2a366a-d221-467f-8dbe-757687e877e1","outcome":"completed","summary":"The review is complete and the findings file is in place and validated.\n\n**Result:** the EARLY token's permission surface is clean. One low-severity defect, outside my assigned area, is recorded in `.imd-findings.json` with ten coverage rows.\n\n**What I checked**\n\n- `EarlyToken` is a plain OpenZeppelin v5.2.0 ERC20 whose constructor mints exactly one billion tokens to its caller. It has no owner, roles, initializer, hooks, overrides, proxy, or fee logic.\n- The vendored ERC20 file is byte-identical to upstream v5.2.0, so approve, transfer and transferFrom run canonical code. Each was traced through its guards, state writes and revert paths and holds.\n- Access Control, Trust Gap and Asymmetry checklists all come up empty. There is no privileged actor, no paired function with divergent accounting, no second writer of any storage slot, and no seam between authorization and economics.\n- The launch flows deliver exact amounts because nothing overrides transfer. The project's 30 tests pass on the pinned compiler, including the stateful invariant runs. The static-analysis lead about the large literal is exactly the manifest supply and is not a defect.\n\n**The one finding (low)**\n\nThe repository instructs operators to verify vendored dependencies with `sha256sum --check dependencies.sha256`, and DEPENDENCIES.md claims the files are unmodified. That command fails for seven forge-std files. The recorded hashes match upstream v1.9.7 exactly, so the vendored copies are what diverged. The difference is whitespace only, a formatter pass, so the test library is semantically intact and deployed bytecode is unaffected. The author should restore the pristine files or regenerate the hash file and correct the claim.\n\n**Not reached:** the protected launch harness requires environment variables and Uniswap v4 libraries not present in this tree, so I could not execute it. Its token-level assertions are all satisfied by plain ERC-20 semantics, which the local launch test exercises.","treeHash":null,"usage":{"cachedInputTokens":664208,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":13759,"runtime":"claude","turns":21,"wallClockMs":188887}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b0001bc8a5c908cd","findings":[],"hash":"6b6a6c723270eab407ab5c77b84ffe36136cf1a73d4019542ac2e384d3ab3cac","nodeId":"6078cd87-595a-4931-b39f-8856805484c8","outcome":"completed","summary":"I found no defects, so `.imd-findings.json` has an empty findings list. Its coverage record marks all three entry points as `holds`, along with three extra rows for the supply invariant, the bytecode and decimals rules, and the constructor.\n\n**What I checked**\n- **The contract:** `src/EarlyToken.sol` is OpenZeppelin v5.2.0's standard ERC20 with nothing changed. It adds two constants (`INITIAL_SUPPLY` and `TELEGRAM_URL`), and its constructor mints 1e27 base units once to whoever deploys it. It has no other functions, no owner or admin roles, no fees or burns, no assembly and no external calls.\n- **Execution trace:**\n  - `transfer` and `transferFrom` move exactly the amount asked. They revert on an insufficient balance or allowance, or a zero address.\n  - An unlimited allowance is not reduced when spent.\n  - `approve` has no callbacks, so nothing can re-enter the contract.\n  - The only way to mint runs in the constructor, so supply can never grow after deployment.\n- **Periphery:** The launch flows (factory to distributor, to the PoolManager and to the remainder address, then claims and swaps) need no exemptions because nothing is taken from a transfer. No privileged call can move or freeze anyone's balance. There is no DELEGATECALL, CALLCODE or SELFDESTRUCT, and `decimals()` returns 18.\n- **First principles:** Total supply equals the sum of balances and is fixed. The one ERC-20 quirk left, where changing an existing allowance can be front-run, is built into the standard and isn't a defect here.\n\n**Dependencies and tests**\n- The vendored OpenZeppelin files match `dependencies.sha256`.\n- Seven forge-std files fail that hash check. I compared them with the upstream v1.9.7 archive (whose hash matches `DEPENDENCIES.md`), and the only differences are whitespace from reformatting. forge-std is used only by tests, but the hash file is now out of date.\n- All 30 project tests pass (`forge test`).\n\n**Static analysis:** The one aderyn line, a large number literal at `src/EarlyToken.sol:12`, is the intended `1_000_000_000 * 10 ** 18` and isn't a defect.\n\n**Note for the manifest step:** the constructor takes no arguments, so `token.constructorArgs` must be `[]` and `token.totalSupply` must be `\"1000000000000000000000000000\"`.\n\n**Not run:** I didn't run the protected launch tests. They import contracts this tree doesn't contain (`LaunchLiquidity`, `PoolInitializationGuard`, `HookFlags`) and v4-core, so they can't build here. A clean review is not proof that no defects exist.","treeHash":null,"usage":{"cachedInputTokens":250292,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":4021,"runtime":"claude","turns":7,"wallClockMs":62656}},{"artifacts":[],"attempt":1,"bundleHash":"af52f4d3c565e6fc27c064245b782e5bce5bbf7a86bbad64500366122b9e3177","device":"273e2f46918e7b5e","findings":[],"hash":"7f985e5001113bae4d6a25ebfad27b1ebd17ad3166f5c167368a6fff2395a60a","nodeId":"6b52fd90-0824-4904-a20e-bf1c3ae54ce4","outcome":"completed","summary":"Created [launch.json](/home/imd-worker/.identitymd/work/50985911-ad81-47e1-bc43-d2c31c8ccea3/6b52fd90-0824-4904-a20e-bf1c3ae54ce4/launch.json) matching `EarlyToken`, its exact supply and constructor, and the required pool and economics.\n\nManifest and compiled ABI checks passed. `forge build` succeeded; all 30 local tests passed with the supplied fuzz seed. Only `launch.json` is changed for submission.","treeHash":"2b31fc5cbe4078178cbbd08c4faed1987e9b60a1","usage":{"cachedInputTokens":199424,"inputTokens":35375,"model":"gpt-6-astra","outputTokens":2628,"runtime":"codex","turns":3,"wallClockMs":69839}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"72b617d4b615473a","findings":[],"hash":"c1809ee3247a2ea468d703d268e2e5173f13563c6ffcb62885172359b2418192","nodeId":"c3bd42ba-e063-4d6d-8c96-4943a35e686f","outcome":"completed","summary":"I found no defects in the economics area for EarlyToken, so `.imd-findings.json` has an empty findings list plus a coverage record. The file is valid JSON, and `git status` shows no changes to tracked files.\n\n**What the code is:** `src/EarlyToken.sol` is an OpenZeppelin v5.2 `ERC20` with no overrides. Its constructor mints `1_000_000_000 * 10**18` to `msg.sender` (the factory at launch) and it has one constant, `TELEGRAM_URL`. The vendored OpenZeppelin files match their pinned hashes in `dependencies.sha256`, so the library hasn't been modified.\n\n**What I checked, guide by guide:**\n- **Economic Security:**\n  - There are no fees, taxes, rebasing, blacklist, pause, owner, oracle, hook or callback.\n  - Nobody can mint or burn after deployment.\n  - There's no DELEGATECALL or SELFDESTRUCT.\n  - The Telegram link is a stored string and has no effect on chain.\n  - With none of these, there's nothing to extract or freeze.\n- **Invariant:**\n  - Total supply stays at 1e27 forever: the only mint is in the constructor.\n  - The sum of all balances always equals total supply: every transfer debits and credits the same amount.\n  - Allowances drop by exactly the amount moved (an unlimited allowance isn't reduced).\n  - `decimals` is 18, matching the brief.\n  - The existing invariant suite passes (128 runs, 8,192 calls, no reverts), as do the other 29 tests.\n- **Flow Gap:** the factory → distributor, factory → PoolManager pool seed, and trader buy/sell paths all move exactly the amount stated, because no transfer is altered. Nothing in a launch flow can arrive short.\n\n**Coverage:** all three entry points (`approve`, `transfer`, `transferFrom`) are marked `holds`. I added four more rows for the invariants and economic checks above.\n\n**What I didn't report, and why:**\n- The aderyn \"large numeric literal\" warning is just how the supply is written, not a defect.\n- Two standard ERC-20 traits apply to every plain ERC-20, not to this code: an allowance change can be front-run, and tokens sent to the token contract itself stay there.\n- Since there are no findings, I wrote no Foundry proof tests.\n- I didn't run the protected floor tests. They import harness files (`floor/OwnerChecks.sol`, `v4-core`, `LaunchLiquidity`) that aren't in this tree.\n\nA clean review doesn't prove the code has no defects. It means none could be reproduced within this area.","treeHash":null,"usage":{"cachedInputTokens":388107,"inputTokens":16,"model":"claude-opus-5-5","outputTokens":4212,"runtime":"claude","turns":8,"wallClockMs":73709}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5d667e4b0751bcb5","findings":[{"citation":"resolved","description":"DEPENDENCIES.md line 3 states every vendored file is unmodified from the pinned release archives, and both DEPENDENCIES.md line 21 and README.md line 68 (the 'Build and check' block) tell the operator to confirm that with `sha256sum --check dependencies.sha256`. On the committed tree (clean, HEAD e282a9d) that command fails for seven files under lib/forge-std/src: StdAssertions.sol, StdJson.sol, StdToml.sol, Vm.sol, console.sol, interfaces/IERC7540.sol, interfaces/IMulticall3.sol. I fetched the same seven files from the upstream forge-std v1.9.7 tag: their SHA-256 values equal the entries recorded in dependencies.sha256 exactly, so the hash file is correct and the vendored copies are what diverged. With all whitespace stripped every vendored file is identical to upstream, so the divergence is a formatter pass (multi-line signatures collapsed to one line), not a behavioural change. Merged from the audit_math and audit_permissions reports, which describe the same root cause. Impact: the project's own documented provenance step cannot pass, the DEPENDENCIES.md claim is false as shipped, and anyone who regenerates dependencies.sha256 from the tree would bless a non-pristine copy. The affected library is test-only; the production contract EarlyToken compiles against the vendored OpenZeppelin v5.2.0 files, all of which verify (ERC20.sol SHA-256 c322867b0b30f6d5... matches upstream v5.2.0 byte for byte), so deployed bytecode is unaffected and the test suite still builds and passes (45 tests). Fix for the author (lib/ is not a reviewer-writable path): restore the seven files from the v1.9.7 archive so the recorded hashes match, or if the reformatting is intentional, regenerate dependencies.sha256 and reword DEPENDENCIES.md line 3 to say the forge-std files were reformatted.","line":3,"path":"DEPENDENCIES.md","reproduction":"State: the repository at HEAD e282a9d with a clean working tree. Input: from the repository root run `sha256sum --check dependencies.sha256`, exactly as README.md line 68 and DEPENDENCIES.md line 21 instruct. Expected per DEPENDENCIES.md line 3: every line reports OK and the command exits 0. Actual: `lib/forge-std/src/StdAssertions.sol: FAILED`, `lib/forge-std/src/StdJson.sol: FAILED`, `lib/forge-std/src/StdToml.sol: FAILED`, `lib/forge-std/src/Vm.sol: FAILED`, `lib/forge-std/src/console.sol: FAILED`, `lib/forge-std/src/interfaces/IERC7540.sol: FAILED`, `lib/forge-std/src/interfaces/IMulticall3.sol: FAILED`, `sha256sum: WARNING: 7 computed checksums did NOT match`, exit status 1. Cross-check: `curl -fsSL https://raw.githubusercontent.com/foundry-rs/forge-std/v1.9.7/src/Vm.sol | sha256sum` gives 9068805b59ac1d0e..., equal to the entry recorded for lib/forge-std/src/Vm.sol, while `sha256sum lib/forge-std/src/Vm.sol` gives a1b1c82924aecf0f...; the same holds for the other six (recorded d4c89eec…, 896c5a5a…, 0211b47e…, de3fb35a…, c6a7854c…, 6620d9c5… against local 3fbf4a02…, a2e632dc…, 61bbf9b3…, 187d2f0c…, 3ae3eec9…, 1b63ca78…). `tr -d ' \\t\\n\\r' < file | sha256sum` is identical for upstream and vendored on all seven.","severity":"low","snippet":"All dependency source needed by the build and tests is included as ordinary files. No package download, submodule, install step, or external library linking is required. Files are unmodified from the pinned release archives.","title":"Documented dependency-integrity check fails: seven vendored forge-std files are reformatted copies, not the unmodified v1.9.7 files their recorded hashes describe"}],"hash":"cd5ea99866dc785873da86f3d201ac9161642474a759148c5b5cd9865e8bd1c5","nodeId":"c4b14495-74d2-42db-ada9-8182f7141dd4","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` with one finding and a six-row coverage record.\n\n**Outcome:** the token is clean. `EarlyToken` is an unmodified OpenZeppelin v5.2.0 ERC20 with a no-argument constructor that mints the full supply once to the deployer. It exposes no mint, burn, owner, pause or blocklist entry points. The build, the 45-test suite with the assigned fuzz seed, and `forge fmt --check` all pass. Creation and runtime code are well under the size limits, and the manifest's name, symbol, decimals, supply and empty constructor arguments match the contract.\n\n**Specialist findings:** both reports describe the same defect, so I merged them into one low finding and reproduced it myself.\n\n- **Dependency integrity check fails.** DEPENDENCIES.md claims all vendored files are unmodified, and the README lists `sha256sum --check dependencies.sha256` as a build step. On the committed tree that command fails for seven forge-std files. I fetched the seven from the upstream v1.9.7 tag: their hashes match the recorded entries exactly, and with whitespace stripped they match the vendored copies, so the vendored files were reformatted. The library is test-only and the vendored OpenZeppelin ERC20 is byte-identical to upstream, so deployed bytecode is unaffected. Fix is the author's, since `lib/` is not reviewer-writable.\n\n**Leads dropped:** the aderyn large-numeric-literal note is style only, since the literal already uses separators and an exponent.\n\n**Coverage:** all three entry points (approve, transfer, transferFrom) hold, plus rows for the supply invariant, CREATE2 deployability, and the lib integrity finding.","treeHash":null,"usage":{"cachedInputTokens":273786,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":6165,"runtime":"claude","turns":6,"wallClockMs":107164}},{"artifacts":[],"attempt":1,"bundleHash":"c1123663f90028686d2f6d7f6f7cbb437bc44216f858bd156d9df2e7a6789c67","device":"c69899cad79c228f","findings":[],"hash":"e186145cfa8930812c7487ebacddf20bd6ba2311a89f352b5ed7f4f8dcb87f12","nodeId":"71cfaa8a-6c90-43bc-98a3-87ee6a4be3f7","outcome":"completed","summary":"Added 15 tests covering boundary values, authorization, and failure recovery. Expanded invariants to 32,768 randomized calls.\n\n`forge build` and `forge test` pass with the supplied seed: **45 passed, 0 failed**.\n\nOnly `test/` changed. No implementation defects found.","treeHash":"5a1561259f11523d83d148fcb936bc6026fcb568","usage":{"cachedInputTokens":581632,"inputTokens":71375,"model":"gpt-6-astra","outputTokens":11447,"runtime":"codex","turns":5,"wallClockMs":261163}}],"verification":[{"checks":[{"durationMs":2629,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.48s\nCompiler run successful!\n","passed":true},{"durationMs":3617,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/EarlyToken.launch.t.sol:EarlyTokenLaunchTest\n[PASS] test_launchDistributionClaimAndPoolTransfersArriveWhole() (gas: 729011)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.14ms (907.96µs CPU time)\n\nRan 28 tests for test/EarlyToken.t.sol:EarlyTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 93209, ~: 93854)\nLogs:\n  Bound result 495768385809018351442788420\n\n[PASS] testFuzz_transferFromTracksRemainingAllowance(uint256,uint256) (runs: 512, μ: 163143, ~: 164979)\nLogs:\n  Bound result 231371178152801403039037570\n  Bound result 157291094827213903825611039\n\n[PASS] testFuzz_transferOverBalanceReverts(uint256) (runs: 512, μ: 69151, ~: 69501)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913130296455\n\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 183389)\n[PASS] test_approveEmitsEventWithoutMovingBalances() (gas: 88820)\n[PASS] test_approveRejectsZeroSpender() (gas: 37616)\n[PASS] test_constructorMintsOnceAndEmitsOneTransfer() (gas: 34789)\n[PASS] test_create2MintsToFactoryAndNotItsCaller() (gas: 224639)\n[PASS] test_deployerCannotSpendHolderTokensWithoutApproval() (gas: 158181)\n[PASS] test_infiniteAllowanceIsNotConsumed() (gas: 204262)\n[PASS] test_metadataAndInitialSupply() (gas: 116965)\n[PASS] test_noMintBurnOrAdministrativeEntrypoints() (gas: 960232)\n[PASS] test_plainEtherTransferReverts() (gas: 42640)\n[PASS] test_runtimeFitsDeploymentLimitAndHasNoForbiddenOpcodes() (gas: 1060952)\n[PASS] test_selfTransferPreservesBalance() (gas: 51476)\n[PASS] test_selfTransferStillRequiresBalance() (gas: 35952)\n[PASS] test_transferDeliversExactAmountAndEmitsEvent() (gas: 91615)\n[PASS] test_transferEntireBalance() (gas: 75809)\n[PASS] test_transferFromDeliversExactAmountAndConsumesAllowance() (gas: 242185)\n[PASS] test_transferFromRejectsInsufficientAllowanceWithoutChangingState() (gas: 115848)\n[PASS] test_transferFromRejectsInsufficientBalanceAndRestoresAllowance() (gas: 126308)\n[PASS] test_transferFromRejectsZeroRecipientAndRestoresAllowance() (gas: 114279)\n[PASS] test_transferFromRejectsZeroSenderEvenForZeroAmount() (gas: 42349)\n[PASS] test_transferFromSelfConsumesAllowanceWithoutChangingBalance() (gas: 105376)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 81515)\n[PASS] test_transferRejectsInsufficientBalance() (gas: 57535)\n[PASS] test_transferRejectsZeroRecipientIncludingZeroAmount() (gas: 72015)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73433)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 31.98ms (80.59ms CPU time)\n\nRan 1 test for test/EarlyToken.invariant.t.sol:EarlyTokenInvariantTest\n[PASS]\nEarlyTokenInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchIndependentLedger\n[PASS] invariant_supplyIsFixedAndAllTokensAreAccountedFor\n EarlyTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2784  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2697  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2711  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 50000000000000000000\n  Bound result 0\n  Bound result 24576\n  Bound result 1809\n  Bound result 0\n  Bound result 0\n  Bound result 127\n  Bound result 0\n  Bound result 8\n  Bound result 20000000000000000000000000\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 6072\n  Bound result 47178599607183030885309\n  Bound result 0\n  Bound result 0\n  Bound result 30000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.47s (3.47s CPU time)\n\nRan 3 test suites in 3.48s (3.51s CPU time): 30 tests passed, 0 failed, 0 skipped (30 total tests)\n","passed":true},{"durationMs":81,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"EarlyToken.approve(address,uint256)\",\"EarlyToken.transfer(address,uint256)\",\"EarlyToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":21,\"README.md\":145,\"SECURITY.md\":30,\"dependencies.sha256\":36,\"foundry.toml\":19,\"remappings.txt\":3,\"src/EarlyToken.sol\":21,\"test/EarlyToken.invariant.t.sol\":124,\"test/EarlyToken.launch.t.sol\":55,\"test/EarlyToken.t.sol\":345},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":803,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":318,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/EarlyToken.sol:12: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"090f34fc74c78994228bb97b00506c0faac494e1e32d38343add0895c29aa272","verifiedTreeHash":"120f1a719a4895323b8751fba4ac00b83c833ea8","verifierVersion":"0.1.0+c3fba9eb"},{"checks":[{"durationMs":1340,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.25s\nCompiler run successful!\n","passed":true},{"durationMs":2058,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/EarlyToken.launch.t.sol:EarlyTokenLaunchTest\n[PASS] test_launchDistributionClaimAndPoolTransfersArriveWhole() (gas: 729011)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 804.02µs (643.06µs CPU time)\n\nRan 28 tests for test/EarlyToken.t.sol:EarlyTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 93209, ~: 93854)\nLogs:\n  Bound result 9109005372223631029\n\n[PASS] testFuzz_transferFromTracksRemainingAllowance(uint256,uint256) (runs: 512, μ: 163143, ~: 164979)\nLogs:\n  Bound result 10000\n  Bound result 12\n\n[PASS] testFuzz_transferOverBalanceReverts(uint256) (runs: 512, μ: 69151, ~: 69501)\nLogs:\n  Bound result 290887570946964995879258259101309\n\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 183389)\n[PASS] test_approveEmitsEventWithoutMovingBalances() (gas: 88820)\n[PASS] test_approveRejectsZeroSpender() (gas: 37616)\n[PASS] test_constructorMintsOnceAndEmitsOneTransfer() (gas: 34789)\n[PASS] test_create2MintsToFactoryAndNotItsCaller() (gas: 224639)\n[PASS] test_deployerCannotSpendHolderTokensWithoutApproval() (gas: 158181)\n[PASS] test_infiniteAllowanceIsNotConsumed() (gas: 204262)\n[PASS] test_metadataAndInitialSupply() (gas: 116965)\n[PASS] test_noMintBurnOrAdministrativeEntrypoints() (gas: 960232)\n[PASS] test_plainEtherTransferReverts() (gas: 42640)\n[PASS] test_runtimeFitsDeploymentLimitAndHasNoForbiddenOpcodes() (gas: 1060952)\n[PASS] test_selfTransferPreservesBalance() (gas: 51476)\n[PASS] test_selfTransferStillRequiresBalance() (gas: 35952)\n[PASS] test_transferDeliversExactAmountAndEmitsEvent() (gas: 91615)\n[PASS] test_transferEntireBalance() (gas: 75809)\n[PASS] test_transferFromDeliversExactAmountAndConsumesAllowance() (gas: 242185)\n[PASS] test_transferFromRejectsInsufficientAllowanceWithoutChangingState() (gas: 115848)\n[PASS] test_transferFromRejectsInsufficientBalanceAndRestoresAllowance() (gas: 126308)\n[PASS] test_transferFromRejectsZeroRecipientAndRestoresAllowance() (gas: 114279)\n[PASS] test_transferFromRejectsZeroSenderEvenForZeroAmount() (gas: 42349)\n[PASS] test_transferFromSelfConsumesAllowanceWithoutChangingBalance() (gas: 105376)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 81515)\n[PASS] test_transferRejectsInsufficientBalance() (gas: 57535)\n[PASS] test_transferRejectsZeroRecipientIncludingZeroAmount() (gas: 72015)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73433)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 19.83ms (48.30ms CPU time)\n\nRan 1 test for test/EarlyToken.invariant.t.sol:EarlyTokenInvariantTest\n[PASS]\nEarlyTokenInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchIndependentLedger\n[PASS] invariant_supplyIsFixedAndAllTokensAreAccountedFor\n EarlyTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2784  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2697  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2711  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 50000000000000000000\n  Bound result 0\n  Bound result 24576\n  Bound result 1809\n  Bound result 0\n  Bound result 0\n  Bound result 127\n  Bound result 0\n  Bound result 8\n  Bound result 20000000000000000000000000\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 6072\n  Bound result 47178599607183030885309\n  Bound result 0\n  Bound result 0\n  Bound result 30000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.97s (1.96s CPU time)\n\nRan 3 test suites in 1.97s (1.99s CPU time): 30 tests passed, 0 failed, 0 skipped (30 total tests)\n","passed":true},{"durationMs":49,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"EarlyToken.approve(address,uint256)\",\"EarlyToken.transfer(address,uint256)\",\"EarlyToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":21,\"README.md\":145,\"SECURITY.md\":30,\"dependencies.sha256\":36,\"foundry.toml\":19,\"launch.json\":24,\"remappings.txt\":3,\"src/EarlyToken.sol\":21,\"test/EarlyToken.invariant.t.sol\":124,\"test/EarlyToken.launch.t.sol\":55,\"test/EarlyToken.t.sol\":345},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7f985e5001113bae4d6a25ebfad27b1ebd17ad3166f5c167368a6fff2395a60a","verifiedTreeHash":"2b31fc5cbe4078178cbbd08c4faed1987e9b60a1","verifierVersion":"0.1.0+c3fba9eb"},{"checks":[{"durationMs":1483,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.40s\nCompiler run successful!\n","passed":true},{"durationMs":7710,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/EarlyToken.launch.t.sol:EarlyTokenLaunchTest\n[PASS] test_launchDistributionClaimAndPoolTransfersArriveWhole() (gas: 729011)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 788.41µs (674.15µs CPU time)\n\nRan 15 tests for test/EarlyToken.boundaries.t.sol:EarlyTokenBoundariesTest\n[PASS] testFuzz_approvalsAreIsolatedByBothOwnerAndSpender(uint256,uint256,uint256,uint256) (runs: 1000, μ: 564999, ~: 566580)\nLogs:\n  Bound result 5102489168565110627928\n\n[PASS] testFuzz_delegationUsesCallerNotTransactionOrigin(uint256) (runs: 1000, μ: 419247, ~: 419040)\nLogs:\n  Bound result 611480216473039484385896176\n\n[PASS] testFuzz_finiteApprovalsAboveSupplyStillDecrease(uint256,uint256) (runs: 1000, μ: 327703, ~: 329525)\nLogs:\n  Bound result 2620630358252413355029621151116281226551355\n  Bound result 397963704475258701235085912\n\n[PASS] testFuzz_insufficientAllowanceIsAtomicAndCanBeRetried(uint256,uint256) (runs: 1000, μ: 385176, ~: 385402)\nLogs:\n  Bound result 707436482105193215899529560\n  Bound result 984743160254628200669135441\n\n[PASS] testFuzz_insufficientBalanceRestoresApprovalAndCanBeRetried(uint256,uint256,bool) (runs: 1000, μ: 448496, ~: 448834)\nLogs:\n  Bound result 505\n  Bound result 16964\n\n[PASS] testFuzz_selfTransferFromPreservesBalanceButConsumesFiniteApproval(uint256,uint256,uint256,bool) (runs: 1000, μ: 251153, ~: 251911)\nLogs:\n  Bound result 12175\n  Bound result 4724\n\n[PASS] testFuzz_transferRoundTripRestoresEveryBalance(uint256) (runs: 1000, μ: 423136, ~: 423613)\nLogs:\n  Bound result 11163\n\n[PASS] testFuzz_zeroRecipientRestoresApprovalAndCanBeRetried(uint256,uint256,bool) (runs: 1000, μ: 354251, ~: 351056)\nLogs:\n  Bound result 505\n  Bound result 266\n\n[PASS] test_infiniteApprovalCanBeReducedThenRevokedAfterSpending() (gas: 548209)\n[PASS] test_largestFiniteApprovalIsConsumed() (gas: 322454)\n[PASS] test_maximumTransferCannotWrapBalancesOrUseInfiniteApprovalToMint() (gas: 309917)\n[PASS] test_roundTripAtZeroOneWeiAndSupplyEdges() (gas: 1643294)\n[PASS] test_transferFromByHolderStillNeedsSelfApproval() (gas: 538258)\n[PASS] test_zeroRecipientRejectsZeroAmountWithFiniteAndInfiniteApproval() (gas: 625901)\n[PASS] test_zeroSpenderRejectsZeroAndMaximumApprovalWithoutTouchingOtherApprovals() (gas: 214970)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 155.85ms (1.24s CPU time)\n\nRan 28 tests for test/EarlyToken.t.sol:EarlyTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 512, μ: 90681, ~: 91087)\nLogs:\n  Bound result 932528617846512132312701128\n\n[PASS] testFuzz_transferFromTracksRemainingAllowance(uint256,uint256) (runs: 512, μ: 163411, ~: 164979)\nLogs:\n  Bound result 928429152450001757078911655\n  Bound result 499337562701912678030592302\n\n[PASS] testFuzz_transferOverBalanceReverts(uint256) (runs: 512, μ: 69145, ~: 69501)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129739289\n\n[PASS] test_approvalCanBeReplacedAndRevoked() (gas: 183389)\n[PASS] test_approveEmitsEventWithoutMovingBalances() (gas: 88820)\n[PASS] test_approveRejectsZeroSpender() (gas: 37616)\n[PASS] test_constructorMintsOnceAndEmitsOneTransfer() (gas: 34789)\n[PASS] test_create2MintsToFactoryAndNotItsCaller() (gas: 224639)\n[PASS] test_deployerCannotSpendHolderTokensWithoutApproval() (gas: 158181)\n[PASS] test_infiniteAllowanceIsNotConsumed() (gas: 204262)\n[PASS] test_metadataAndInitialSupply() (gas: 116965)\n[PASS] test_noMintBurnOrAdministrativeEntrypoints() (gas: 960232)\n[PASS] test_plainEtherTransferReverts() (gas: 42640)\n[PASS] test_runtimeFitsDeploymentLimitAndHasNoForbiddenOpcodes() (gas: 1060952)\n[PASS] test_selfTransferPreservesBalance() (gas: 51476)\n[PASS] test_selfTransferStillRequiresBalance() (gas: 35952)\n[PASS] test_transferDeliversExactAmountAndEmitsEvent() (gas: 91615)\n[PASS] test_transferEntireBalance() (gas: 75809)\n[PASS] test_transferFromDeliversExactAmountAndConsumesAllowance() (gas: 242185)\n[PASS] test_transferFromRejectsInsufficientAllowanceWithoutChangingState() (gas: 115848)\n[PASS] test_transferFromRejectsInsufficientBalanceAndRestoresAllowance() (gas: 126308)\n[PASS] test_transferFromRejectsZeroRecipientAndRestoresAllowance() (gas: 114279)\n[PASS] test_transferFromRejectsZeroSenderEvenForZeroAmount() (gas: 42349)\n[PASS] test_transferFromSelfConsumesAllowanceWithoutChangingBalance() (gas: 105376)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 81515)\n[PASS] test_transferRejectsInsufficientBalance() (gas: 57535)\n[PASS] test_transferRejectsZeroRecipientIncludingZeroAmount() (gas: 72015)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73433)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 155.81ms (82.59ms CPU time)\n\nRan 1 test for test/EarlyToken.invariant.t.sol:EarlyTokenInvariantTest\n[PASS]\nEarlyTokenInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchIndependentLedger\n[PASS] invariant_supplyIsFixedAndAllTokensAreAccountedFor\n EarlyTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭--------------+---------------------+-------+---------+----------╮\n| Contract     | Selector            | Calls | Reverts | Discards |\n+=================================================================+\n| TokenHandler | approve             | 5536  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| TokenHandler | rejectZeroRecipient | 5469  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| TokenHandler | rejectZeroSpender   | 5472  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| TokenHandler | revoke              | 5529  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| TokenHandler | transfer            | 5342  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| TokenHandler | transferFrom        | 5420  | 0       | 0        |\n╰--------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 133\n  Bound result 0\n  Bound result 0\n  Bound result 1057\n  Bound result 3\n  Bound result 316975947602479202958758722\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 229480240150599219222540584\n  Bound result 6444795695979924687892344428133748739871\n  Bound result 0\n  Bound result 157198258\n  Bound result 0\n  Bound result 631\n  Bound result 15\n  Bound result 10000000000000000000\n  Bound result 28142141643098\n  Bound result 1464\n  Bound result 0\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639932\n  Bound result 50000000000000000000\n  Bound result 8643\n  Bound result 54514664799356603798777865893589787831092618470\n  Bound result 115792089237316195423570985008687907853269984665639793519697734578990210537435\n  Bound result 200\n  Bound result 0\n  Bound result 1612\n  Bound result 133610301229689878810858763\n  Bound result 1271197747919301795\n  Bound result 0\n  Bound result 3796888831\n  Bound result 255\n  Bound result 0\n  Bound result 30000000000000000000\n  Bound result 162378778868217399579220293\n  Bound result 18\n  Bound result 6\n  Bound result 18\n  Bound result 160058331676384975697255209\n  Bound result 10000000000000000001\n  Bound result 0\n  Bound result 1732\n  Bound result 115792089237316195423570985008687907853269984665639793519697734578990210542885\n  Bound result 0\n  Bound result 412\n  Bound result 1354\n  Bound result 0\n  Bound result 7\n  Bound result 20000000000000000000000000\n  Bound result 1644\n  Bound result 0\n  Bound result 5753\n  Bound result 374\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129638591\n  Bound result 229480240150571077080897547\n  Bound result 307609200\n  Bound result 2283\n  Bound result 2868\n  Bound result 757\n  Bound result 16\n  Bound result 8247\n  Bound result 2415813297117527577993961\n  Bound result 356\n  Bound result 1220\n  Bound result 209\n  Bound result 879999877000000000000000000\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.62s (7.62s CPU time)\n\nRan 4 test suites in 7.62s (7.94s CPU time): 45 tests passed, 0 failed, 0 skipped (45 total tests)\n","passed":true},{"durationMs":35,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"EarlyToken.approve(address,uint256)\",\"EarlyToken.transfer(address,uint256)\",\"EarlyToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":21,\"README.md\":145,\"SECURITY.md\":30,\"dependencies.sha256\":36,\"foundry.toml\":19,\"remappings.txt\":3,\"src/EarlyToken.sol\":21,\"test/EarlyToken.boundaries.t.sol\":286,\"test/EarlyToken.invariant.t.sol\":176,\"test/EarlyToken.launch.t.sol\":55,\"test/EarlyToken.t.sol\":345},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e186145cfa8930812c7487ebacddf20bd6ba2311a89f352b5ed7f4f8dcb87f12","verifiedTreeHash":"5a1561259f11523d83d148fcb936bc6026fcb568","verifierVersion":"0.1.0+c3fba9eb"}]}