{"assessments":[],"deployments":[{"attestationHash":"2448f50cb264c9cadfef67dddd900155e4f4876639dd2c101ce3dc704d28ccc2","chainId":1,"contracts":[{"address":"0xa0f41e2ae3d8208d516e7f3fe4e745bfddffb336","blockNumber":26283694,"name":"IDEADToken","role":"token","txHash":"0xf98d5930f292a3fbb9c1e6f67875731159491044fca349a172de588527872027"},{"address":"0xfdd6705c3f2ab6bb6ecf6512cfbd6306c926c31f","blockNumber":26283694,"name":"MerkleDistributor","role":"distributor","txHash":"0xf98d5930f292a3fbb9c1e6f67875731159491044fca349a172de588527872027"},{"address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","blockNumber":26283694,"name":"PoolInitializationGuard","role":"hook","txHash":"0xf98d5930f292a3fbb9c1e6f67875731159491044fca349a172de588527872027"}],"id":"a18d1fa7-5245-4daa-954d-18b199394222","manifestHash":"bb2a294c03b5048fc898ee227adc6c91f9ae220f84f5b65e7e03f8c4551d50ec","status":"live"}],"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":"e6019a9d-e59a-4255-9d73-db538f906058","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"77859b9f54a0b8e0ddc5c0aa869964fc5795acbf83398989f86f73672c862114","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"c78fe38bf9a0507158c4809a84e492bf0e2b75eddfa73121e718d41adea291d4","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"ac797819adddec33ca5497d550c2b4bb0c0573829bcab634e931645e37508c39","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","subagents":4,"tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"d11c3e16d21a385d456084878479a314d301cefcf4ae43bbf981fbc334e04f61","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"d7116fec08905de76cf1d618a73f5adde8508b930367317f111636cbeef0b88e","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"9e95ef0f5279f8a5ad83d5041d65d4ec8254bb943a5890a5c23988e069f1a7cf","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"816fe39c7efd64504a19175b0f4dd9186d61069f37a22684c90358a18c60bddc","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"816fe39c7efd64504a19175b0f4dd9186d61069f37a22684c90358a18c60bddc","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"15f17b19fc805da98f61d31641930b245b5268a647b3b126e51590d1589bd29a","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"09c291fba6a37eba9f3c6d7f8780589c6cc6d6a9fabe6d526ebdcea44ccb1807","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: InkDead (IDEAD).\nToken name: InkDead\nToken symbol: IDEAD\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"a7b41928398c4d14cc07366312c4896f43fd980ba3f6089d173925a6f525aa92","previousHash":"002bff8d80000431f4d4c7afc98eb8014b72481d5d61cb4fa63e897071872204","projectId":"e6019a9d-e59a-4255-9d73-db538f906058","publication":{"commit":"e07f98219cc3115c201e9fbd6a1b12e0c4427edd","deliveredAt":"2026-10-27T11:17:14.156Z","repoUrl":"https://github.com/identity-md-launches/launch-2612-inkdead"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"2fd52d4158e82526aa58a724162b32178ea9416870ccb22d427001383478d2fb","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"47b01d88dde0fbb15d43de8c2282f670284f581698eb4f24ec52f8f55118e22c","device":"b8fd8054ea57c5d8","findings":[],"hash":"09c291fba6a37eba9f3c6d7f8780589c6cc6d6a9fabe6d526ebdcea44ccb1807","nodeId":"2db61eb1-60ec-497d-828a-e6a05c507967","outcome":"completed","summary":"I added an invariant suite and an edge-case suite for the InkDead (IDEAD) token. `forge build` and `forge test` pass with the verifier's seed: 57 tests across 3 suites, none failing. I found no defects in `src/IDEADToken.sol`, so I didn't write a `.imd-findings.json`.\n\n**What I added (only under `test/`):**\n\n- **`test/IDEADToken.invariant.t.sol`** runs 256 random sequences of 64 calls each (16,384 calls in total), set in the test file itself. A handler contract drives the token from five accounts, one of them the deployer, and keeps its own record of what every balance and allowance should be.\n  - **Calls it makes:** normal transfers, approvals and spends via `transferFrom`, with amounts pulled towards 0, 1, the limit and one below the limit. It also tries every failure path: sending more than the balance, sending to the zero address, approving the zero address, spending more than the allowance, spending more than the balance while the allowance covers it, and calling mint/burn/pause/blacklist-style functions. Each failure must revert with its exact error.\n  - **Checks after every call:** the total supply never changes; the five balances always add up to the full supply; every balance and allowance matches the handler's record; and the zero address, the token, the handler and the test contract hold nothing.\n- **`test/IDEADToken.edges.t.sol`** has 27 tests, including fuzz tests at 1,000 runs. They cover gaps in the earlier suite:\n  - the zero address as the caller of `transfer`, `approve` and `transferFrom`;\n  - when both the allowance and the balance are short, the allowance error is the one reported;\n  - an owner pulling its own tokens with `transferFrom` still needs an allowance to itself;\n  - an allowance one below \"unlimited\" does go down when spent;\n  - an unlimited allowance still can't move more than the balance;\n  - `transferFrom` emits one `Transfer` event and no `Approval`;\n  - the constructor emits exactly one event (the mint);\n  - unknown functions, `burn` and empty calls are rejected;\n  - a reverted call changes no balance or allowance.\n- **`test/utils/TestBase.sol`:** I only added to it, with no changes to what was there. It now has the two cheatcodes for recording events, two more `assertEq` versions, and a `bound` helper, so fuzz inputs are kept in range instead of throwing runs away. The project still vendors no libraries.\n\n**Checking the invariant tests aren't empty:** in a throwaway copy, I made the handler's record skip one allowance update. All five invariants then failed, and so did the handler's own revert checks, so the suite does catch a mismatch.\n\nThe three files are not committed; they're in the working tree.","treeHash":"dd322929bd63ba2aa26e05ab4effc88883f58542","usage":{"cachedInputTokens":653430,"inputTokens":30,"model":"claude-opus-5-5","outputTokens":19433,"runtime":"claude","turns":17,"wallClockMs":229232}},{"artifacts":[],"attempt":1,"bundleHash":"d05b9dd1f92c9482b14619b133c757503bdcef1d06aa182b02df634db51790ee","device":"b0b4e7bbc84f9d80","findings":[],"hash":"15f17b19fc805da98f61d31641930b245b5268a647b3b126e51590d1589bd29a","nodeId":"f8fe8b19-bd33-4ff7-830a-a0551abecd20","outcome":"completed","summary":"I wrote launch.json for the InkDead launch, and it is the only file changed.\n\n**What the manifest says**\n\n- Kind is custom_token. The token is IDEADToken, name InkDead, symbol IDEAD, 18 decimals, with an empty constructorArgs list because the accepted constructor takes no parameters.\n- totalSupply is the exact amount the constructor mints to msg.sender, one billion tokens in minor units, computed with node rather than typed.\n- contracts is empty. The accepted tree has only the token and no application contracts.\n- pool and economics are copied exactly from the launch reference: IMD as the paired currency, fee 12500, tick spacing 60, the one-to-one initialPrice as provenance, and the requester's economics object verbatim.\n- notes describe only what exists in the tree: no owner, no mint path, no fee or burn on transfer, so every launch flow moves exactly the stated amount and the token needs no factory or pool manager argument.\n\n**Checks run**\n\n- `forge build` compiles cleanly with the pinned solc 0.8.26.\n- `forge test` with the verifier's fuzz seed passes all 29 tests.\n- A node script confirmed the schema keys, the 32-character name limit, lowercase addresses, string uint256 values, the verbatim economics, and that notes are under 4000 characters.\n- `git status` shows launch.json as the only new or changed file.","treeHash":"d19ae7771b60f5beff1bcfeb2ed18155a6fbfd39","usage":{"cachedInputTokens":143871,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3367,"runtime":"claude","turns":9,"wallClockMs":47890}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"74a99f640688d37b","findings":[],"hash":"77859b9f54a0b8e0ddc5c0aa869964fc5795acbf83398989f86f73672c862114","nodeId":"56bdb239-10de-48b5-a89f-e0f476515da7","outcome":"completed","summary":"Review complete. The findings file is written with zero defects and a full coverage record.\n\n**Outcome:** `.imd-findings.json` holds an empty findings list and 8 coverage rows, all `holds`, covering the three listed entry points plus the invariants and launch flows I checked. I found no defect in the economics of this token.\n\n**What I checked, per guide:**\n- **Economic Security.** No fee, tax, rebase, pause, blacklist or callback, so no flow can arrive short and nothing can be extracted. Transfers return true, zero-address receivers and spenders revert, infinite allowance is never decremented, and a reverted transferFrom spends nothing. The approve overwrite race is the ERC-20 standard's own behaviour, not a defect.\n- **Invariant.** Sum of balances equals the constant supply of 1e27 after every step. The constructor is the only balance creator, nothing burns or mints, and the unchecked addition cannot overflow because the sum is bounded. A 2000-run fuzz of random 12-step transfer, approve and transferFrom sequences among four actors confirmed this, along with exact balance and allowance deltas on every success and the right reason on every revert.\n- **Flow Gap.** I built Uniswap v4-core outside the repository and ran the launch against a real PoolManager: deploy from a factory stand-in, 10% to the distributor, initialize at the 4299-cap price, single-sided seed via sync, transfer and settle, remainder forwarded, then a 0.01 ETH buy and a full sell. The seed took 7.70e26 tokens, within the 80% share, the buy delivered exactly the swap delta, the sell returned all tokens with ETH back, and balances summed to the supply throughout. I also replicated the floor's reachable-opcode scan over the compiled runtime, which is clean.\n\n**Static analysis lead.** The aderyn large-numeric-literal note at `src/IDEADToken.sol:27` is style only. The literal evaluates to exactly 1e27 and matches the manifest supply.\n\n**Not reached.** Nothing in the assigned area. I did not run the protected floor test itself, since its helper contracts are not supplied, but my harness exercised the same seed and swap path against the real PoolManager.\n\n**Working tree.** Only `.imd-findings.json` was added. Scratch tests live in the gitignored `test/scratch/` directory and the v4 harness is in /tmp.","treeHash":null,"usage":{"cachedInputTokens":1027663,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":26700,"runtime":"claude","turns":35,"wallClockMs":356287}},{"artifacts":[],"attempt":1,"bundleHash":"306bc3675fd8af676507f1bfe56042b7286478283aff2d1c15163d56db1312c4","device":"3baa2091028c32c1","findings":[],"hash":"9e95ef0f5279f8a5ad83d5041d65d4ec8254bb943a5890a5c23988e069f1a7cf","nodeId":"7b880c62-5e81-4b16-96ae-4f65aa48e14c","outcome":"completed","summary":"The InkDead (IDEAD) token project is written, but I could not run forge build, forge test, or forge fmt in this session. Every shell command failed before starting with a sandbox error (`apply-seccomp: write /proc/self/setgroups ... Permission denied`), so the verification is desk-checked only, and nothing is committed to git.\n\n**What was delivered**\n\n- `foundry.toml` at the repository root. It pins solc 0.8.26, evm_version cancun, optimizer at 200 runs, `bytecode_hash = \"none\"`, ffi off, no fs permissions, and no compiler path.\n- `src/IDEADToken.sol`, the contract named `IDEADToken` with name InkDead, symbol IDEAD, 18 decimals, and a supply of one billion tokens minted once to `msg.sender` in the constructor. It is a plain ERC-20 with ERC-6093 custom errors, no owner, no mint, no burn, no pause, no blacklist, no fees, no external calls, and no constructor arguments.\n- `src/interfaces/IERC20.sol`, the standard interface with metadata.\n- `test/utils/TestBase.sol`, a minimal cheatcode interface and assertion helpers, so the project vendors no library at all. The sandbox failure also blocked downloading forge-std, and this layout means the offline verifier needs nothing outside the tree.\n- `test/IDEADToken.t.sol` with 27 tests. They cover metadata, the one-time mint and its event, transfer and transferFrom success paths with events, every revert path, unlimited allowance behaviour, the launch floor's lists of mint and admin selectors from both a stranger and the deployer, a holder staying able to move its balance, ether rejection, and five fuzz tests on supply conservation and allowance bounds. Inputs are bounded in the tests so they pass for any seed, and nothing reads the environment.\n- `README.md` documenting the manifest values, launch economics as given, assumptions, operational responsibilities, the empty \"After launch\" section, and the security checklist items applied.\n\n**Not verified**\n\n- forge build, forge test and forge fmt --check were never executed. I read the code back and checked it by hand against solc 0.8.26 rules and the pinned protected tests, but a compile or test failure is possible.\n- No git commit was made, because git could not run either. The working tree holds all the files.\n\n**Recommended next step** is to run the three commands once a working shell is available, with the verifier's fuzz seed:\n\n```\nforge build && forge test && forge fmt --check\nFOUNDRY_FUZZ_SEED=0x8acbbce6192ca122c804723a0450a01a793bdf7248fad1d22fb15cc6dd9425e6 forge test\n```","treeHash":"6afab222eddd00313c1c24f322c51d74667cc71b","usage":{"cachedInputTokens":527062,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":30163,"runtime":"claude","turns":24,"wallClockMs":369962}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d192c3efd847050a","findings":[{"citation":"resolved","description":"The README (commit 2fd0f5b) was written before the manifest step added launch.json (commit 658b243). The statement is now false: launch.json exists at the repository root and carries the same values. The manifest itself is consistent with the code (contract IDEADToken, constructorArgs [] for a parameterless constructor, totalSupply 1000000000000000000000000000 equal to TOTAL_SUPPLY, decimals 18, only schema keys, lowercase addresses, notes 1369 characters), so this is a documentation inconsistency only, with no effect on deployment or behaviour. Fix: drop or reword the sentence at README.md:46-47 to say the manifest step wrote launch.json from these values.","line":46,"path":"README.md","reproduction":"Run `git ls-files launch.json` in the repository root: expected per README.md:46-47 is no file; actual is `launch.json` present, with token.contract \"IDEADToken\", token.constructorArgs [] and token.totalSupply \"1000000000000000000000000000\". `git log --oneline -- launch.json README.md` shows README.md in 2fd0f5b and launch.json added later in 658b243.","severity":"info","snippet":"These are the values the launch's manifest step needs. They are listed here and are **not** written\nto a `launch.json` in this repository, as the launch process requires.","title":"README states the launch parameters are not written to a launch.json in the repository, but launch.json is present in the tree"}],"hash":"ac797819adddec33ca5497d550c2b4bb0c0573829bcab634e931645e37508c39","nodeId":"c622db72-4292-418b-b0f2-d87a493da858","outcome":"completed","summary":"The review is complete. The findings file is valid JSON, the snippet matches the README lines, and the tree is clean apart from the gitignored scratch test.\n\n**Outcome: the IDEAD token has no code defect.** All four specialists reported nothing, and I reproduced nothing against the code either. The only reproducible issue is a stale README sentence, filed at info severity.\n\n**What I checked myself**\n\n- The three entry points `approve`, `transfer` and `transferFrom` in `src/IDEADToken.sol`. Each has zero-address guards, a balance or allowance check before its unchecked arithmetic, and no other state write. The unchecked receiver add cannot wrap because balances always sum to the constant supply.\n- The constructor mints the full supply to the caller with no arguments and no external call. A scratch test deployed it through CREATE2 from a factory contract and confirmed the factory holds the whole supply.\n- The reachable runtime bytecode contains no DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL or STATICCALL. Creation code and runtime are far below the protocol size limits.\n- The manifest in `launch.json` uses only schema keys, has an empty constructor argument list matching the parameterless constructor, and states a supply equal to the constant minted. Decimals and the contract name also match.\n- The aderyn lead about the large numeric literal evaluates to exactly one billion tokens at 18 decimals. It is a style note, not a defect.\n- The project's own 57 tests pass, including a 256-run invariant suite with an independent ledger.\n\n**The one finding (info)**\n\nREADME lines 46 and 47 say the launch parameters are not written to a `launch.json` in the repository. That file now exists at the root, added by a later commit than the README. The manifest content is correct, so the fix is only to reword the sentence.\n\n**Coverage record**\n\nAll three listed entry points are marked `holds`, with four additional rows for the constructor, the fixed-supply invariant, the manifest check and the static-analysis lead. No proofs were attached since nothing reaches high or critical severity.","treeHash":null,"usage":{"cachedInputTokens":468591,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":9288,"runtime":"claude","turns":21,"wallClockMs":181106}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a0f4c3f900dedd4a","findings":[],"hash":"c78fe38bf9a0507158c4809a84e492bf0e2b75eddfa73121e718d41adea291d4","nodeId":"5050ccee-dff3-413d-a096-a4e26e5d9e62","outcome":"completed","summary":"The control-flow review of the IDEAD token found no defects. The findings file holds an empty list and seven coverage rows, all `holds`.\n\n**What was reviewed.** The Execution Trace, Periphery and First Principles passes were run by hand over `src/IDEADToken.sol`, its interface, the project tests, and the protected launch floor. The contract has three state-changing entry points and no privileged role, external call, fallback or receive. Every failure path is a check before any storage write, and the two balance writes sit in one unchecked block that cannot revert between them, so no partial state is reachable. The only sentinel is the unlimited allowance, and it still passes through every transfer check. A zero-address sender cannot slip through at value zero because no allowance can ever exist for it. Self-transfer of the whole balance leaves it unchanged. Supply is a compile-time constant minted once to the factory under CREATE2 with no constructor arguments, so the launch flows move exactly what they state.\n\n**Evidence gathered.**\n- The project's 29 tests pass under solc 0.8.26.\n- A scratch probe of eight extra cases passed, including a reachable-opcode scan of the runtime for DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL, STATICCALL and CREATE, ether rejection on every calldata shape, and a fuzzed conservation check across transfer and transferFrom interleavings. The scratch directory was removed afterwards.\n- The two static-analysis leads were checked. Slither reported nothing, and the aderyn large-literal note is a compile-time constant equal to the manifest supply, not a defect.\n\n**Not reported on purpose.** The standard ERC-20 approve race is inherent to the requested plain token, matches OpenZeppelin v5, and is documented in the README. It is a design property, not a defect in this code.\n\n**Coverage.** All three listed entry points are marked `holds` with reasons, plus rows for the supply invariant, the launch-flow exactness, the opcode and ether checks, and the interface file. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":515270,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12505,"runtime":"claude","turns":29,"wallClockMs":200032}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d4b53d656a3fbe07","findings":[],"hash":"d11c3e16d21a385d456084878479a314d301cefcf4ae43bbf981fbc334e04f61","nodeId":"f655d144-3a57-468b-9d49-f1a39392c304","outcome":"completed","summary":"The findings file is in place and the harness excludes it from git on purpose, so the tree is otherwise untouched. The review is complete.\n\n**Result: no defects found in the math, boundary or numerical-gap area.** The findings file holds an empty list and seven coverage rows, all `holds`.\n\nWhat I checked, against the token in `src/IDEADToken.sol`:\n\n- **Math Precision.** The contract contains no division, no runtime multiplication, no narrowing cast and no decimals conversion. The only arithmetic is two unchecked blocks. The subtraction in the transfer path is guarded by the balance comparison on the line before it. The subtraction in the allowance path is guarded the same way. The addition to the receiver cannot overflow because the sum of balances is the constant supply and nothing mints. The supply constant is exactly 1e27 and matches the manifest figure. The aderyn large-literal lead is a style note with no wrong value behind it.\n- **Boundary.** There are no external calls, no payable, receive or fallback, and no bytes decoding. The only sentinel branches are the zero-address guards, and I walked both sides of each. Calling transferFrom with a zero sender is rejected by the allowance guard for positive value and by the sender guard for zero value.\n- **Numerical Gap.** The invariant that balances sum to the supply has no rounding anywhere to drift it. I confirmed it with a 256-run random-walk fuzz across four accounts. The max-allowance sentinel is an exact-equality check, so max minus one is finite and decrements. An infinite allowance above the holder's balance still reverts on the balance guard. Self-transfer through both transfer and transferFrom leaves the balance unchanged.\n\nI ran the project's 29 tests, which pass, and eleven scratch edge-case tests of my own, which also pass. The scratch tests were removed afterwards as the task allows. Two standard ERC-20 properties are worth the author knowing but are not defects: the approve front-running race exists as in every plain ERC-20, and tokens sent to the token's own address are accepted with no recovery path, which the README already states as intended.","treeHash":null,"usage":{"cachedInputTokens":428522,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":10499,"runtime":"claude","turns":21,"wallClockMs":161979}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"13603a08ada71730","findings":[],"hash":"d7116fec08905de76cf1d618a73f5adde8508b930367317f111636cbeef0b88e","nodeId":"605bbb3c-0289-45c8-9904-3ea9d0648dbd","outcome":"completed","summary":"I found no defects in the permissions area of `src/IDEADToken.sol`. I wrote the result to `.imd-findings.json`: an empty findings list and a `holds` coverage row for each of the three entry points, plus two rows for supply and access invariants I checked. The project's existing 29 tests pass. I changed no other files.\n\n**Access Control**\n- The contract has no owner, minter, pause, blacklist, upgrade or admin storage, and no function that uses any.\n- The constructor takes no arguments. It only puts the 1,000,000,000 × 10^18 supply in `msg.sender`'s balance (the factory's at launch), so nobody holds a role once deployment ends.\n- Nothing can mint or burn, and `totalSupply()` returns a fixed constant.\n\n**Trust Gap**\n- Only the holder can move their balance, and a spender can move it only through an allowance the holder granted. `transferFrom` checks the caller's allowance and reduces it before moving anything; the maximum value counts as unlimited, as in OpenZeppelin.\n- The factory has no special power over other holders.\n- There is no fee, so tokens sent to the distributor and the PoolManager arrive in full, and the token needs no exemption arguments.\n\n**Asymmetry**\n- `approve`, `transfer` and `transferFrom` reject the zero address the same way.\n- A transfer to yourself keeps the balance correct, because the receiver's balance is re-read after the sender's is reduced. One existing test (`test_transfer_toSelfKeepsBalance`) covers this.\n- Approving a zero amount and transferring a zero amount behave consistently.\n\n**Other notes**\n- Changing an allowance from one non-zero value to another lets a watching spender use both amounts. Every standard ERC-20 has this property, so I didn't report it.\n- Static analysis flagged one \"large numeric literal\" at line 27. That is the supply constant, written `1_000_000_000 * 10 ** uint256(DECIMALS)` as intended, so it isn't a defect.\n\nI covered all three guides for my area and reached every entry point. There is no `launch.json` in the tree yet, so I could not review a manifest.","treeHash":null,"usage":{"cachedInputTokens":117640,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":2071,"runtime":"claude","turns":4,"wallClockMs":25083}}],"verification":[{"checks":[{"durationMs":781,"exitCode":0,"name":"build","output":"Compiling 6 files with Solc 0.8.26\nSolc 0.8.26 finished in 712.70ms\nCompiler run successful!\n","passed":true},{"durationMs":6209,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 29 tests for test/IDEADToken.t.sol:IDEADTokenTest\n[PASS] testFuzz_chainOfTransfersConservesSupply(uint256,uint256,uint256) (runs: 256, μ: 213353, ~: 217476)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 80881, ~: 81451)\n[PASS] testFuzz_transferFromRevertsAboveAllowance(uint256,uint256) (runs: 256, μ: 83090, ~: 83573)\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256) (runs: 256, μ: 141601, ~: 143918)\n[PASS] testFuzz_transferRevertsAboveBalance(uint256) (runs: 256, μ: 35948, ~: 35952)\n[PASS] test_approve_overwritesPreviousAllowance() (gas: 87351)\n[PASS] test_approve_revertsForZeroSpender() (gas: 30696)\n[PASS] test_approve_setsAllowanceAndEmits() (gas: 59890)\n[PASS] test_constructorEmitsMintTransfer() (gas: 181342)\n[PASS] test_constructorMintsToWhoeverDeploys() (gas: 10310)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 29113)\n[PASS] test_metadata() (gas: 18725)\n[PASS] test_noCallIncreasesSupply() (gas: 644282)\n[PASS] test_noCallMovesOrFreezesAHolder() (gas: 419962)\n[PASS] test_noEtherAccepted() (gas: 32865)\n[PASS] test_transferFrom_deployerCannotPullFromHolderWithoutAllowance() (gas: 92448)\n[PASS] test_transferFrom_infiniteAllowanceIsNotDecremented() (gas: 169863)\n[PASS] test_transferFrom_revertsAboveAllowance() (gas: 139086)\n[PASS] test_transferFrom_revertsToZeroAddress() (gas: 85893)\n[PASS] test_transferFrom_revertsWhenAllowanceExceedsBalance() (gas: 140167)\n[PASS] test_transferFrom_revertsWithoutAllowance() (gas: 87820)\n[PASS] test_transferFrom_spendsAllowance() (gas: 200823)\n[PASS] test_transfer_fullBalance() (gas: 69659)\n[PASS] test_transfer_movesBalanceAndEmits() (gas: 82771)\n[PASS] test_transfer_revertsFromEmptyAccount() (gas: 33214)\n[PASS] test_transfer_revertsOnInsufficientBalance() (gas: 87420)\n[PASS] test_transfer_revertsToZeroAddress() (gas: 32862)\n[PASS] test_transfer_toSelfKeepsBalance() (gas: 92088)\n[PASS] test_transfer_zeroAmountSucceeds() (gas: 39822)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 39.16ms (181.07ms CPU time)\n\nRan 27 tests for test/IDEADToken.edges.t.sol:IDEADTokenEdgesTest\n[PASS] testFuzz_allowanceDecrementsExactly(uint256,uint256) (runs: 1000, μ: 124917, ~: 126935)\n[PASS] testFuzz_approveSetsAnyValue(address,address,uint256) (runs: 1000, μ: 58276, ~: 58654)\n[PASS] testFuzz_failedTransferLeavesStateUntouched(uint256,uint256) (runs: 1000, μ: 109667, ~: 109824)\n[PASS] testFuzz_infiniteAllowanceNeverDecrements(uint256,uint256) (runs: 1000, μ: 180051, ~: 181603)\n[PASS] testFuzz_transferFromAboveAllowanceKeepsAllowance(uint256,uint256) (runs: 1000, μ: 97897, ~: 98093)\n[PASS] testFuzz_transferToSelfIsNoop(uint256) (runs: 1000, μ: 40891, ~: 40604)\n[PASS] test_allowanceJustBelowMaxIsDecremented() (gas: 118550)\n[PASS] test_allowanceSpentExactlyToZeroThenReverts() (gas: 191904)\n[PASS] test_allowancesAreIsolatedPerOwnerAndSpender() (gas: 73466)\n[PASS] test_approveMaxEmitsApproval() (gas: 56811)\n[PASS] test_approveZeroRevokes() (gas: 159746)\n[PASS] test_balanceOfZeroAddressIsZero() (gas: 7868)\n[PASS] test_constructorEmitsExactlyOneLog() (gas: 183045)\n[PASS] test_infiniteAllowanceStillBoundByBalance() (gas: 141789)\n[PASS] test_supplyExactMinorUnits() (gas: 24700)\n[PASS] test_transferFromBothShortReportsAllowanceFirst() (gas: 134767)\n[PASS] test_transferFromEmitsOnlyTransfer() (gas: 170407)\n[PASS] test_transferFromOwnBalanceNeedsSelfAllowance() (gas: 199818)\n[PASS] test_transferFromToZeroAddressWithInfiniteAllowanceReverts() (gas: 87292)\n[PASS] test_transferFromZeroAddressNonZeroAmountRevertsOnAllowance() (gas: 33532)\n[PASS] test_transferFromZeroAddressRevertsAsInvalidSender() (gas: 33667)\n[PASS] test_transferFromZeroAmountWithoutAllowanceSucceeds() (gas: 43121)\n[PASS] test_transferZeroAmountToZeroAddressStillReverts() (gas: 32896)\n[PASS] test_unknownSelectorAndEmptyCalldataRevert() (gas: 71298)\n[PASS] test_zeroAddressCallerCannotApprove() (gas: 30708)\n[PASS] test_zeroAddressCallerCannotTransfer() (gas: 30706)\n[PASS] test_zeroTransferEmitsTransfer() (gas: 38873)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 39.25ms (215.41ms CPU time)\n\nRan 1 test for test/IDEADToken.invariant.t.sol:IDEADTokenInvariantTest\n[PASS]\nIDEADTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchLedger\n[PASS] invariant_balancesMatchLedger\n[PASS] invariant_balancesSumToSupply\n[PASS] invariant_nothingLeaksOutsideActors\n[PASS] invariant_totalSupplyIsFixed\n IDEADTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+----------------------------+-------+---------+----------╮\n| Contract     | Selector                   | Calls | Reverts | Discards |\n+========================================================================+\n| IDEADHandler | approve                    | 1794  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| IDEADHandler | approveZeroSpender         | 1729  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| IDEADHandler | privilegedCall             | 1893  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| IDEADHandler | transfer                   | 1855  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| IDEADHandler | transferAboveBalance       | 1813  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| IDEADHandler | transferFrom               | 1830  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| IDEADHandler | transferFromAboveAllowance | 1830  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| IDEADHandler | transferFromAboveBalance   | 1795  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| IDEADHandler | transferToZero             | 1845  | 0       | 0        |\n╰--------------+----------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.11s (6.11s CPU time)\n\nRan 3 test suites in 6.12s (6.19s CPU time): 57 tests passed, 0 failed, 0 skipped (57 total tests)\n","passed":true},{"durationMs":31,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IDEADToken.approve(address,uint256)\",\"IDEADToken.transfer(address,uint256)\",\"IDEADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":150,\"foundry.toml\":22,\"src/IDEADToken.sol\":152,\"src/interfaces/IERC20.sol\":32,\"test/IDEADToken.edges.t.sol\":316,\"test/IDEADToken.invariant.t.sol\":305,\"test/IDEADToken.t.sol\":373,\"test/utils/TestBase.sol\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"09c291fba6a37eba9f3c6d7f8780589c6cc6d6a9fabe6d526ebdcea44ccb1807","verifiedTreeHash":"dd322929bd63ba2aa26e05ab4effc88883f58542","verifierVersion":"0.1.0+260efc41"},{"checks":[{"durationMs":345,"exitCode":0,"name":"build","output":"Compiling 4 files with Solc 0.8.26\nSolc 0.8.26 finished in 292.67ms\nCompiler run successful!\n","passed":true},{"durationMs":78,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 29 tests for test/IDEADToken.t.sol:IDEADTokenTest\n[PASS] testFuzz_chainOfTransfersConservesSupply(uint256,uint256,uint256) (runs: 256, μ: 212448, ~: 217476)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 80882, ~: 81451)\n[PASS] testFuzz_transferFromRevertsAboveAllowance(uint256,uint256) (runs: 256, μ: 82858, ~: 83573)\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256) (runs: 256, μ: 141801, ~: 143918)\n[PASS] testFuzz_transferRevertsAboveBalance(uint256) (runs: 256, μ: 35948, ~: 35952)\n[PASS] test_approve_overwritesPreviousAllowance() (gas: 87351)\n[PASS] test_approve_revertsForZeroSpender() (gas: 30696)\n[PASS] test_approve_setsAllowanceAndEmits() (gas: 59890)\n[PASS] test_constructorEmitsMintTransfer() (gas: 181342)\n[PASS] test_constructorMintsToWhoeverDeploys() (gas: 10310)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 29113)\n[PASS] test_metadata() (gas: 18725)\n[PASS] test_noCallIncreasesSupply() (gas: 644282)\n[PASS] test_noCallMovesOrFreezesAHolder() (gas: 419962)\n[PASS] test_noEtherAccepted() (gas: 32865)\n[PASS] test_transferFrom_deployerCannotPullFromHolderWithoutAllowance() (gas: 92448)\n[PASS] test_transferFrom_infiniteAllowanceIsNotDecremented() (gas: 169863)\n[PASS] test_transferFrom_revertsAboveAllowance() (gas: 139086)\n[PASS] test_transferFrom_revertsToZeroAddress() (gas: 85893)\n[PASS] test_transferFrom_revertsWhenAllowanceExceedsBalance() (gas: 140167)\n[PASS] test_transferFrom_revertsWithoutAllowance() (gas: 87820)\n[PASS] test_transferFrom_spendsAllowance() (gas: 200823)\n[PASS] test_transfer_fullBalance() (gas: 69659)\n[PASS] test_transfer_movesBalanceAndEmits() (gas: 82771)\n[PASS] test_transfer_revertsFromEmptyAccount() (gas: 33214)\n[PASS] test_transfer_revertsOnInsufficientBalance() (gas: 87420)\n[PASS] test_transfer_revertsToZeroAddress() (gas: 32862)\n[PASS] test_transfer_toSelfKeepsBalance() (gas: 92088)\n[PASS] test_transfer_zeroAmountSucceeds() (gas: 39822)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 13.65ms (76.56ms CPU time)\n\nRan 1 test suite in 14.42ms (13.65ms CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true},{"durationMs":28,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IDEADToken.approve(address,uint256)\",\"IDEADToken.transfer(address,uint256)\",\"IDEADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":150,\"foundry.toml\":22,\"launch.json\":24,\"src/IDEADToken.sol\":152,\"src/interfaces/IERC20.sol\":32,\"test/IDEADToken.t.sol\":373,\"test/utils/TestBase.sol\":47},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"15f17b19fc805da98f61d31641930b245b5268a647b3b126e51590d1589bd29a","verifiedTreeHash":"d19ae7771b60f5beff1bcfeb2ed18155a6fbfd39","verifierVersion":"0.1.0+260efc41"},{"checks":[{"durationMs":372,"exitCode":0,"name":"build","output":"Compiling 4 files with Solc 0.8.26\nSolc 0.8.26 finished in 296.29ms\nCompiler run successful!\n","passed":true},{"durationMs":96,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 29 tests for test/IDEADToken.t.sol:IDEADTokenTest\n[PASS] testFuzz_chainOfTransfersConservesSupply(uint256,uint256,uint256) (runs: 256, μ: 212448, ~: 217476)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 80882, ~: 81451)\n[PASS] testFuzz_transferFromRevertsAboveAllowance(uint256,uint256) (runs: 256, μ: 82858, ~: 83573)\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256) (runs: 256, μ: 141801, ~: 143918)\n[PASS] testFuzz_transferRevertsAboveBalance(uint256) (runs: 256, μ: 35948, ~: 35952)\n[PASS] test_approve_overwritesPreviousAllowance() (gas: 87351)\n[PASS] test_approve_revertsForZeroSpender() (gas: 30696)\n[PASS] test_approve_setsAllowanceAndEmits() (gas: 59890)\n[PASS] test_constructorEmitsMintTransfer() (gas: 181342)\n[PASS] test_constructorMintsToWhoeverDeploys() (gas: 10310)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 29113)\n[PASS] test_metadata() (gas: 18725)\n[PASS] test_noCallIncreasesSupply() (gas: 644282)\n[PASS] test_noCallMovesOrFreezesAHolder() (gas: 419962)\n[PASS] test_noEtherAccepted() (gas: 32865)\n[PASS] test_transferFrom_deployerCannotPullFromHolderWithoutAllowance() (gas: 92448)\n[PASS] test_transferFrom_infiniteAllowanceIsNotDecremented() (gas: 169863)\n[PASS] test_transferFrom_revertsAboveAllowance() (gas: 139086)\n[PASS] test_transferFrom_revertsToZeroAddress() (gas: 85893)\n[PASS] test_transferFrom_revertsWhenAllowanceExceedsBalance() (gas: 140167)\n[PASS] test_transferFrom_revertsWithoutAllowance() (gas: 87820)\n[PASS] test_transferFrom_spendsAllowance() (gas: 200823)\n[PASS] test_transfer_fullBalance() (gas: 69659)\n[PASS] test_transfer_movesBalanceAndEmits() (gas: 82771)\n[PASS] test_transfer_revertsFromEmptyAccount() (gas: 33214)\n[PASS] test_transfer_revertsOnInsufficientBalance() (gas: 87420)\n[PASS] test_transfer_revertsToZeroAddress() (gas: 32862)\n[PASS] test_transfer_toSelfKeepsBalance() (gas: 92088)\n[PASS] test_transfer_zeroAmountSucceeds() (gas: 39822)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 12.57ms (43.88ms CPU time)\n\nRan 1 test suite in 13.29ms (12.57ms CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true},{"durationMs":27,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IDEADToken.approve(address,uint256)\",\"IDEADToken.transfer(address,uint256)\",\"IDEADToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":150,\"foundry.toml\":22,\"src/IDEADToken.sol\":152,\"src/interfaces/IERC20.sol\":32,\"test/IDEADToken.t.sol\":373,\"test/utils/TestBase.sol\":47},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":584,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":368,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/IDEADToken.sol:27: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9e95ef0f5279f8a5ad83d5041d65d4ec8254bb943a5890a5c23988e069f1a7cf","verifiedTreeHash":"6afab222eddd00313c1c24f322c51d74667cc71b","verifierVersion":"0.1.0+260efc41"}]}