{"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":"29511fc0-63b4-48ab-94fb-77c9dd799e9b","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"5ca82e5b007b96ba60538c8dd5174b2257d771eb6042e177eb4ee0fdcf1a3725","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":"42faec76ec16476351654c5f9a41b19aab21e8d75af831ab0ace5f3d06bfe77d","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":"ddeb76aca6c8b03f25331a0a5a38c5e129269fb350dc8405692ff25fdfbbb816","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"8121a534e6532d297b4ec1047eac874ef9483036c84ffd6683026b24e526666f","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":"9bbdb1923a0560d3071862918cf7f0c6c7555d4705fef6339cde4b60593fa583","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":"07e93b6d7797944e1b2e73dba9a3006ceaa8306d6a7e12bc21585222e59dc513","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"1c5ba2b67b1ad4de1c285a70850654c3ed0b457d43e8de057ca1539a42cb3aa1","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"5fc4d6e2c332c828bd43e6e5ba349810dda8448df308a323a288d72c822c5658","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Daemon (DAEMON).\nToken name: Daemon\nToken symbol: DAEMON\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: A plain community token for the people who keep the IMD daemon running. No fees, no minting after launch, no owner powers, no transfer rules.","parentJobId":null,"planHash":"d8f78a3921c457bc56536b3d6eafffc70e539b51bf1fd24de41044bc11470d44","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"29511fc0-63b4-48ab-94fb-77c9dd799e9b","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-745-daemon"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51515","feedbackHash":"85ef5e909b9fc2724150c776ec6588dd2779a817f90f6718150b63b66e9b74f9","nodeKey":"audit_economics","submissionHash":"5ca82e5b007b96ba60538c8dd5174b2257d771eb6042e177eb4ee0fdcf1a3725","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52022","feedbackHash":"8793ec14f935baeac4b90146e3c7df45b44c6730930157d1372374a79872bc7b","nodeKey":"audit_flow","submissionHash":"42faec76ec16476351654c5f9a41b19aab21e8d75af831ab0ace5f3d06bfe77d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50987","feedbackHash":"7a1014bdcd86f536ea688d905b3b402a2f3befcb25372bb3355c11a32f68aae3","nodeKey":"audit_judge","submissionHash":"ddeb76aca6c8b03f25331a0a5a38c5e129269fb350dc8405692ff25fdfbbb816","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51101","feedbackHash":"6af48d83abbea0edf7818cd2865e144c9290dbbf8918d7e5981d92866b6bcfbb","nodeKey":"audit_math","submissionHash":"8121a534e6532d297b4ec1047eac874ef9483036c84ffd6683026b24e526666f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52019","feedbackHash":"55b573f089f5991ca1a46c11927fe6393d748272f20a21b4752e32b06aafbccc","nodeKey":"audit_permissions","submissionHash":"9bbdb1923a0560d3071862918cf7f0c6c7555d4705fef6339cde4b60593fa583","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52180","feedbackHash":"b68cb207171da8e92e1d2d3abe75e07bd55f9e7ca9dd47add5d92627873d0d8e","nodeKey":"build_contract_project","submissionHash":"07e93b6d7797944e1b2e73dba9a3006ceaa8306d6a7e12bc21585222e59dc513","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51347","feedbackHash":"2b8f926fc5e8854aa87ebd0a5197497355c4f4522c62f4e328c5d1d8a7d326d5","nodeKey":"manifest","submissionHash":"1c5ba2b67b1ad4de1c285a70850654c3ed0b457d43e8de057ca1539a42cb3aa1","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50988","feedbackHash":"5dfa826cec45ca4333685f95449c8c4f4728533e763251d802daad67245f8a07","nodeKey":"write_foundry_tests","submissionHash":"5fc4d6e2c332c828bd43e6e5ba349810dda8448df308a323a288d72c822c5658","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"704359556be38039be4a57fe09a7ab4ac62860eeeb9f1c406c9c88f6a7eb9d55","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"6aad15e0118cbb15c3b4571e3690e8c44224f204b8e978d492a0dcf58d55a5cf","device":"c722c2e9ac9aa084","findings":[],"hash":"07e93b6d7797944e1b2e73dba9a3006ceaa8306d6a7e12bc21585222e59dc513","nodeId":"0b5897c0-8cb5-4cc3-8c98-f03fb701e480","outcome":"completed","summary":"Done. The Daemon (DAEMON) token is implemented, tested, documented, and committed on main as commit 57131b3.\n\n**What was delivered**\n\n- `src/DaemonToken.sol`: a self-contained ERC-20 with name Daemon, symbol DAEMON, 18 decimals, and a constant supply of 1,000,000,000 tokens minted once to the constructor's caller. No owner, no mint, no burn, no pause, no fees, no blocklist, no external calls, no receive or fallback.\n- `test/DaemonToken.t.sol`: 39 tests covering success paths, typed-error failure paths, four fuzz tests for exact transfer and allowance accounting, CREATE2 deployment from a factory-like contract, the deploy script, and mirrors of the launch floor's admin-selector probes and bytecode opcode scan.\n- `script/DeployDaemonToken.s.sol`: a deploy function the tests call directly, with a thin broadcast wrapper that reads no environment variables.\n- `foundry.toml` pins solc 0.8.26, sets `bytecode_hash = \"none\"` and `cbor_metadata = false`, and leaves ffi and filesystem access off.\n- `lib/forge-std`: forge-std v1.9.6 vendored as ordinary files with no git metadata, confirmed by an empty gitlink listing.\n- `README.md` documents assumptions, manifest deployment parameters, operational responsibilities, and a walk through the eth-security checklist.\n\n**Verification results**\n\n| Check | Result |\n|-------|--------|\n| forge build (offline, clean) | passes |\n| forge test (offline) | 39 passed, 0 failed |\n| forge fmt --check | passes |\n| fuzz at 2000 runs | 4 passed |\n\nThe deployed bytecode carries no metadata tail, so the launch's byte comparison will see only code.\n\n**Notes for the reviewer**\n\n- The token takes no constructor arguments and needs no launch-address exemptions, because ordinary transfers already move exactly the stated amount. The manifest's constructorArgs is an empty list.\n- Slither and Mythril were not available in this environment and did not run. Explorer verification after deployment is an open item for the network's deployer.\n- A git author identity was not configured in the workspace, so the commit was made with the account email passed on the command line rather than written to git config.","treeHash":"00ab93eebde223d1b0fb4ff7aaa56071cfdb4758","usage":{"cachedInputTokens":1095439,"inputTokens":610,"model":"claude-fable-5-1","outputTokens":24133,"runtime":"claude","turns":31,"wallClockMs":347830}},{"artifacts":[],"attempt":1,"bundleHash":"e17b004413440c464fd2625f4bcd3c4326fc266b986df7d942572bebfa6ea6b4","device":"af9a875696459139","findings":[],"hash":"1c5ba2b67b1ad4de1c285a70850654c3ed0b457d43e8de057ca1539a42cb3aa1","nodeId":"67957063-e4ba-48cc-9f40-c1a3bdb8707e","outcome":"completed","summary":"`launch.json` is written at the repository root and verified. It is the only new or changed file. I left it uncommitted in the working tree, since the prior submission commit was authored by the harness identity with the job id, which indicates the harness snapshots the tree itself.\n\n**What the manifest says**\n\n| Field | Value |\n|---|---|\n| kind | custom_token |\n| token.contract | DaemonToken, constructorArgs `[]` |\n| token.name / symbol / decimals | Daemon / DAEMON / 18 |\n| token.totalSupply | 1000000000000000000000000000 |\n| contracts | none |\n| pool.pairedCurrency | 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 |\n| pool.fee / tickSpacing | 3000 / 60 |\n| pool.initialPrice | 56022770974786139918731938 |\n| economics | copied verbatim from the job |\n| notes | 2823 characters |\n\n**Judgment calls, all recorded in notes**\n\n- **Fee tier.** The request named no tier, so I used the standard 0.3% tier with its canonical tick spacing. Admission accepts any of the three tiers.\n- **Opening price.** The pair token at that address is live on Ethereum mainnet as Identity.md with 18 decimals, so the cap of 500 IMD over 1e27 minor units gives 5e-7 IMD per DAEMON. The recorded sqrtPriceX96 assumes DAEMON sorts as currency0, which is the likelier CREATE2 outcome. The currency1 equivalent is also given in notes. The field is provenance only.\n- **No placeholders.** The accepted token takes no constructor arguments and its transfers are exact, so no launch address exemptions are needed.\n\n**Verification**\n\n- `forge build` and `forge test` pass with all 39 accepted tests green.\n- A scratch validator in `test/scratch` checked the manifest against the JSON Schema from the task using ajv draft 2020-12, plus every prose refinement: fee tier, canonical tick spacing, exact pair token, economics deep-equal to the job, supply equals one billion times ten to the eighteenth, initialPrice below 2^256 and within Uniswap v4 bounds and equal to the derived value, reserved names, notes length.\n- The compiled ABI of DaemonToken has a zero-arity constructor, matching the empty constructorArgs.\n- A scratch Foundry test fed the manifest's values through env vars, deployed the token via CREATE2 from a factory stand-in, and confirmed the supply is minted to the deployer, decimals and metadata match, and the swarm, pool and remainder legs arrive whole and sum to the supply.\n- `git status` shows only the new launch.json.\n\n**One limitation.** The protocol package holding the real LaunchManifest zod schema is not on the public npm registry, so validation used the schema text embedded in the task rather than the library itself.","treeHash":"f3603adb7ebdaa716c304706c9cf08aaf8dad7c7","usage":{"cachedInputTokens":589872,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":35372,"runtime":"claude","turns":28,"wallClockMs":661238}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f9a9196633a6ffa8","findings":[],"hash":"42faec76ec16476351654c5f9a41b19aab21e8d75af831ab0ace5f3d06bfe77d","nodeId":"fac736dd-2599-456c-afe3-56f93bfbf5a0","outcome":"completed","summary":"The review is complete. No defects were found in the Daemon token, and the findings file records that with full coverage.\n\n**Outcome:** `.imd-findings.json` holds an empty findings list and nine coverage rows. All three verifier entry points are marked `holds`, plus rows for the constructor, supply constancy, the opcode scan, the launch flows, the deploy script, and the one aderyn lead.\n\n**What I checked, by guide:**\n\n- **Execution trace.** Each of `approve`, `transfer` and `transferFrom` was traced from entry to final storage write. Guards run before every write, the `unchecked` block is sound because the balance check precedes it, and a self-transfer re-reads the decremented slot so it cannot double-credit. A revert inside the balance move rolls back the allowance decrement atomically. The infinite-allowance sentinel fires only at exactly max; max minus one decrements normally.\n- **Periphery.** There is none. The token imports nothing, inherits nothing and makes no external calls. An opcode scan of the deployed runtime found no CALL, STATICCALL, CREATE, CREATE2, DELEGATECALL, CALLCODE or SELFDESTRUCT, so no callback or reentrancy surface exists.\n- **First principles.** The compiled method list is exactly the ten ERC-20 functions plus the supply constant. There is no `receive` or `fallback`, so ETH and unknown selectors revert. Storage is two mappings only. The constructor is the sole mint and credits `msg.sender`, which a CREATE2 factory test confirms. Launch flows reduce to exact transfers, so the design's choice to take no `$factory`, `$poolManager` or `$launchNumber` arguments is correct.\n\n**Verification run:** the existing 39-test suite passes, and a scratch probe of 10 tests I wrote under `test/scratch/` also passes. It covers fuzzed self-transfers, three-actor conservation, the sentinel boundary, zero-address paths, fallback absence and the extended opcode scan.\n\n**Not reached:** the Uniswap v4 seed-and-swap harness in the protected test could not be executed here because v4-core is not vendored in this tree. Its only dependency on the token is exact transfer semantics, which were verified directly. The ERC-20 approve race and the aderyn large-literal note are standard behaviour and style respectively, and are not reported as defects.","treeHash":null,"usage":{"cachedInputTokens":615043,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":10073,"runtime":"claude","turns":20,"wallClockMs":143017}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ea89e16822824c6f","findings":[],"hash":"5ca82e5b007b96ba60538c8dd5174b2257d771eb6042e177eb4ee0fdcf1a3725","nodeId":"21a96fa8-4a02-4acf-932d-e8978866d425","outcome":"completed","summary":"The economics review of the Daemon token is complete. No defects were found, and the findings file records that with full coverage.\n\n**Outcome.** `.imd-findings.json` holds an empty findings list plus eight coverage rows, all `holds`: the three ABI entry points, the conservation invariant, the no-growth and no-privilege invariant, the launch-flow exactness, the economic-security checklist, and the one aderyn lead.\n\n**What I checked against the three guides.**\n- Economic Security: the contract has no external dependencies, no held value, no callbacks and no price logic. Sentinel addresses are rejected everywhere, and ERC-20 semantics match OpenZeppelin v5. There is nothing to sandwich, starve, or extract.\n- Invariant: the only balance writers are the constructor mint and the symmetric subtract and add in the internal transfer. The total supply is a pure constant. A stateful fuzz with a ghost ledger ran 64 sequences of 200 random transfer, approve and transferFrom calls, including self-transfers and the max-allowance sentinel, with zero drift.\n- Flow Gap: a replay of the launch flow confirmed that factory to distributor, distributor to seven claimants, factory to pool, pool to trader and back, and factory to remainder all arrive exactly, with no residue left at any hop.\n\n**Static analysis lead.** The aderyn large-numeric-literal note on line 34 folds to exactly the manifest supply at compile time and is style only.\n\n**Limits.** The protected launch test depends on Uniswap v4 code not vendored here, so I simulated the pool manager hops with plain transfers rather than running the real PoolManager. Since the token has no exemptions and no fees, that simulation exercises the same code path. The scratch tests were removed after running, and no tracked file was changed.","treeHash":null,"usage":{"cachedInputTokens":578370,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":11182,"runtime":"claude","turns":23,"wallClockMs":196980}},{"artifacts":[],"attempt":1,"bundleHash":"9e1180a91c4e8aefe638d41fa8e585a146b61b036e154fbb7590c222cf5877ca","device":"fa2b0b9c7ebc1547","findings":[],"hash":"5fc4d6e2c332c828bd43e6e5ba349810dda8448df308a323a288d72c822c5658","nodeId":"9089cb2c-b2d9-4530-b452-db74a3e1feb1","outcome":"completed","summary":"All 73 tests pass across the three suites, and formatting is applied. No defect was found in the implementation, so there is no findings file to write.\n\n**What I added** (two new files under `test/`, the existing suite is untouched):\n\n- `test/DaemonToken.invariant.t.sol`: a six-actor handler with ghost ledgers, run at 256 sequences of depth 64 with fail-on-revert enabled. Handlers cover clamped transfers, full-balance and one-wei transfers, approvals including the unlimited sentinel, clamped and unclamped transferFrom, zero-address receiver and spender, privileged-selector probes from every actor, and ether donations. Unclamped variants catch the revert and assert it is exactly the error the pre-state predicts, and that nothing changed. Invariants: supply constant, sum of balances equals supply, every balance matches the ledger, nobody holds more than it received, allowances match the ledger and the sentinel is never decremented, the zero address holds nothing, no ether, stable metadata, and ledger self-consistency.\n- `test/DaemonToken.edges.t.sol`: 33 tests at 1000 fuzz runs for the paths the base suite missed. The zero address as caller for transfer and approve, which are the two revert paths an ordinary EOA cannot reach. Zero-amount calls through every function, including that zero-amount transferFrom from the zero address fails on the sender check rather than the allowance check. The boundary one below the unlimited sentinel is decremented while the sentinel is not. Round-trip, additivity, order independence, idempotence, self-transfer, and reverted calls leaving no trace. A fan-out to up to 64 holders arriving whole.\n\n**Grounding the harness.** Before trusting the green run I pointed the invariant suite at three mutated copies of the token in scratch: a 1% fee on transfer, an inverted allowance decrement, and a hidden mint function. Each was caught within the first sequence by the conservation, allowance ledger, or privileged-selector checks respectively.\n\n**One correction during the work.** My first version of the zero-address transferFrom test expected the wrong error. The contract's order of checks is correct and the test now pins it.\n\nThe new files are uncommitted in the working tree, as nothing in the task asked for a commit. Nothing outside `test/` was changed, and no dependencies were installed.","treeHash":"6a9b5ea4240adb1a1c7545a6e8fff5d595ea0a92","usage":{"cachedInputTokens":754098,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":27737,"runtime":"claude","turns":28,"wallClockMs":385642}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b1d937213bbfd9cf","findings":[],"hash":"8121a534e6532d297b4ec1047eac874ef9483036c84ffd6683026b24e526666f","nodeId":"a3675033-347f-4c98-897f-74e5910edd98","outcome":"completed","summary":"The review is complete. The findings file holds an empty list and seven coverage rows, and no tracked file was changed.\n\n**Result: no defects in the Math Precision, Boundary, or Numerical Gap area.** The token in `src/DaemonToken.sol` has almost no arithmetic surface. There is no runtime division, multiplication, downcast, or shift. The only arithmetic is three unchecked add and subtract lines, each preceded by the guard that makes it safe.\n\nWhat I checked against each guide:\n\n- **Math Precision.** The supply constant evaluates at compile time to exactly 1e27, divisible by 10^18 and by 10,000, so the swarm and pool basis-point splits in the launch harness are exact. It sits far below the int128 and uint128 limits the Uniswap v4 PoolManager imposes on deltas and liquidity. The aderyn \"large numeric literal\" lead is therefore not a defect. The unchecked subtractions in transfer and allowance spending both follow an explicit less-than check, so they cannot wrap.\n- **Boundary.** There are no external calls, no payable or receive functions, no token-address parameters, and no bytes decoding. The only sentinel branches are the zero-address guards and the max-allowance early return. I walked both sides of each: zero amount to the zero address still reverts, zero amount from the zero address still reverts, and an allowance of max minus one is decremented normally and can never climb to the sentinel.\n- **Numerical Gap.** The one early return, the max-allowance shortcut, skips the allowance decrement but not the balance check, so no invariant is bypassed. A stateful invariant run of 128,000 randomized transfer, approve, and transferFrom calls, including self-transfers and zero amounts, kept the sum of balances at exactly the constant supply with zero reverts.\n\nCoverage rows mark all three ABI entry points as `holds`, plus rows for the conservation invariant, the supply constant, and the two boundary classes that turned out empty. The existing suite of 39 tests passes, and tracked files are formatter-clean. The scratch test lives under `test/scratch/`, which is gitignored and will not be kept.\n\nTwo behaviours are standard ERC-20 and OpenZeppelin v5 parity rather than defects, noted here so the judge does not mistake them for omissions: a zero-amount transferFrom with zero allowance succeeds and emits an event, and an owner spending their own balance through transferFrom still needs an allowance.","treeHash":null,"usage":{"cachedInputTokens":662173,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":11618,"runtime":"claude","turns":19,"wallClockMs":175850}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"be3be4cc237417f9","findings":[{"citation":"resolved","description":"Asymmetry between the two balance-moving entry points, from the Access Control / Asymmetry pass. transfer() binds the debited account to msg.sender (src/DaemonToken.sol:107, `_transfer(msg.sender, to, amount)`). transferFrom() binds it only through `_spendAllowance(from, msg.sender, amount)` (line 122), whose guard is the cited line 158. When amount == 0 the guard evaluates `0 < 0`, which is false, so a caller holding no allowance at all passes it, the unchecked write at line 160 stores 0 - 0, and `_transfer(from, to, 0)` then emits `Transfer(from, to, 0)` (line 145) with the victim as `from`. No balance and no allowance changes, so the launch floor (no privileged hand moves or freezes a holder) is not violated, and the behaviour is exactly what OpenZeppelin v5 ERC20 does, which the README and the NatSpec name as the reference semantics. It is therefore recorded as informational, a trust assumption to document rather than a deviation: the only harm is off-chain. Explorers and wallets list the spoofed event in the victim's token-transfer history, which is the primitive behind address-poisoning scams (the attacker chooses a `to` that looks like one of the victim's real counterparties; the victim later copies it from history and sends real funds there). The guard holds for every non-zero amount, including 1 wei. If the author wants to close it, the minimal change is in `_spendAllowance`: revert when `amount == 0 && current == 0 && owner != spender`. Every ERC-20 MUST is kept (a holder's own zero-value transfer still succeeds and emits; an approved spender's zero-value pull still succeeds), only an unauthorized zero-value pull is rejected. Tradeoff: it diverges from OpenZeppelin v5 parity, which the project currently advertises, so it is a design decision for the requester, not a required fix.","line":158,"path":"src/DaemonToken.sol","reproduction":"State: fresh DaemonToken deployed by D; D calls transfer(VICTIM = 0x7A11CE, 1000e18); allowance(VICTIM, ATTACKER = 0xBAD) == 0 and ATTACKER holds no tokens.\nCall: from ATTACKER, transferFrom(VICTIM, LOOKALIKE = 0x7A11CF, 0).\nExpected if authorization by `from` were required for every pull: revert InsufficientAllowance(0xBAD, 0, 0), no event.\nActual: the call returns true and emits Transfer(0x7A11CE, 0x7A11CF, 0); balanceOf(VICTIM) stays 1000e18, balanceOf(LOOKALIKE) stays 0, allowance(VICTIM, ATTACKER) stays 0.\nControl: the same call with amount 1 reverts InsufficientAllowance(0xBAD, 0, 1), and transferFrom(address(0), ATTACKER, 0) reverts InvalidSender(0x0), so the zero-amount path is the only one that reaches the event without authorization.\nVerified with a scratch Foundry test on this tree: vm.prank(ATTACKER); vm.expectEmit(true,true,true,true); emit Transfer(VICTIM, LOOKALIKE, 0); assertTrue(token.transferFrom(VICTIM, LOOKALIKE, 0)); assertEq(token.allowance(VICTIM, ATTACKER), 0); passes on the current code.","severity":"info","snippet":"        if (current < amount) revert InsufficientAllowance(spender, current, amount);","title":"transferFrom(from, to, 0) succeeds and emits Transfer(from, to, 0) with no allowance from `from` (standard ERC-20 / OpenZeppelin v5 behaviour; address-poisoning primitive)"}],"hash":"9bbdb1923a0560d3071862918cf7f0c6c7555d4705fef6339cde4b60593fa583","nodeId":"a35911c4-ef82-47dc-bab9-b63e18791d1f","outcome":"completed","summary":"Review complete. The findings file is in place at the repository root and no tracked file was changed.\n\n**Outcome.** In the assigned area (Access Control, Trust Gap, Asymmetry) the Daemon token holds. I found no permission bypass, no privileged surface, and no asymmetry that moves or freezes value. I wrote one informational finding, not a defect against the stated design.\n\n**The one finding (info).** A `transferFrom` with amount 0 passes the allowance guard at `src/DaemonToken.sol:158` because `0 < 0` is false. Any caller can therefore emit a `Transfer(victim, anyAddress, 0)` event without the victim's approval. Balances and allowances are untouched, and this is exactly what OpenZeppelin v5 does, which the README names as the reference semantics. It is reported because that event is the primitive behind address-poisoning scams. The minimal change and its tradeoff (loss of OZ parity) are stated so the requester can decide.\n\n**What I verified.**\n- The compiled ABI has exactly three nonpayable functions, no `receive` or `fallback`, and the constructor hands the full supply to `msg.sender` and retains no role.\n- The runtime bytecode contains no CALL, DELEGATECALL, CALLCODE, STATICCALL, CREATE, CREATE2 or SELFDESTRUCT, so there is no reentrancy or confused-deputy surface at all.\n- Scratch probes confirmed the allowance guard holds for every non-zero amount, the zero-address sender is rejected, allowances are scoped to owner and spender, and self-transfers are conserved.\n- A stateful fuzz across five actors ran 128,000 calls with zero reverts and the balance sum always equalled the supply, which justifies the unchecked addition.\n- The existing 39 tests pass. The aderyn lead (large literal) is the constant 1e27 and is asserted by a test. Slither reported nothing.\n\n**Coverage record.** Eight rows: `approve` holds, `transfer` holds, `transferFrom` points to finding 1, plus the constructor, the no-privileged-surface invariant, the no-external-call invariant, the supply-conservation invariant, and the deploy script, all holding.\n\n**Not reached.** The protected launch floor test needs Uniswap v4 sources and environment variables that are not in this repository, so I did not execute it here; the token's exact transfers and standard return values satisfy what it checks by inspection. Slither and Mythril were not available to run locally.\n\n**One documentation nit, not filed.** The README says 22 admin-style selectors were tried from both a stranger and the deployer, but the test tries 12 of them from the deployer only. It is harmless because the contract has no fallback, so every unknown selector reverts from any caller.","treeHash":null,"usage":{"cachedInputTokens":1604882,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":31507,"runtime":"claude","turns":32,"wallClockMs":636898}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"18527ba42d5b89d7","findings":[],"hash":"ddeb76aca6c8b03f25331a0a5a38c5e129269fb350dc8405692ff25fdfbbb816","nodeId":"fb108549-0e86-40fa-a7a7-213f762e8dd4","outcome":"completed","summary":"Wrote [.imd-findings.json](/home/imd/.identitymd/work/29511fc0-63b4-48ab-94fb-77c9dd799e9b/fb108549-0e86-40fa-a7a7-213f762e8dd4/.imd-findings.json): no substantiated defects; all three entry points marked `holds`.\n\nAll 73 Foundry tests passed, including 16,384 invariant calls. Protected integration tests could not run because service dependencies are absent. No source or configuration files changed.","treeHash":null,"usage":{"cachedInputTokens":748032,"inputTokens":100442,"model":"gpt-6-astra","outputTokens":5289,"runtime":"codex","turns":5,"wallClockMs":132390}}],"verification":[{"checks":[{"durationMs":1032,"exitCode":0,"name":"build","output":"Compiling 22 files with Solc 0.8.26\nSolc 0.8.26 finished in 914.08ms\nCompiler run successful!\n","passed":true},{"durationMs":93,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/DaemonToken.t.sol:DaemonTokenTest\n[PASS] testFuzz_approveIsExact(address,uint256) (runs: 256, μ: 63146, ~: 63498)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 92650, ~: 92907)\nLogs:\n  Bound result 2\n  Bound result 125813996375599159817140963330240011258305308995328\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 115005, ~: 115209)\nLogs:\n  Bound result 6119232283883501\n\n[PASS] testFuzz_transferFromAccounting(uint256,uint256,uint256) (runs: 256, μ: 173391, ~: 153766)\nLogs:\n  Bound result 927677\n  Bound result 26732824518552145678\n  Bound result 1000000000000000000000000000\n\n[PASS] test_RevertWhen_approveZeroSpender() (gas: 30400)\n[PASS] test_RevertWhen_sendingEther() (gas: 37236)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 84998)\n[PASS] test_RevertWhen_transferFromEmptyAccount() (gas: 33259)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 132361)\n[PASS] test_RevertWhen_transferFromExceedsBalanceDespiteAllowance() (gas: 144881)\n[PASS] test_RevertWhen_transferFromToZeroAddress() (gas: 85400)\n[PASS] test_RevertWhen_transferFromWithoutAllowance() (gas: 85325)\n[PASS] test_RevertWhen_transferFromZeroAddressSender() (gas: 33506)\n[PASS] test_RevertWhen_transferMoreThanSupply() (gas: 35269)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 30423)\n[PASS] test_allowanceDoesNotLetSpenderMoveOtherOwnersFunds() (gas: 183996)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 126761)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 65009)\n[PASS] test_chainedTransfersArriveWhole() (gas: 180476)\n[PASS] test_constructorEmitsMintTransfer() (gas: 5454)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 12768)\n[PASS] test_create2DeploymentMintsToTheDeployingContract() (gas: 728378)\n[PASS] test_deployScriptMintsToCaller() (gas: 912177)\n[PASS] test_freshAccountsHoldNothing() (gas: 31970)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 177883)\n[PASS] test_metadata() (gas: 26748)\n[PASS] test_noAdminSelectorIncreasesSupply() (gas: 771700)\n[PASS] test_noOwnerAccessor() (gas: 29524)\n[PASS] test_noPrivilegedSelectorMovesOrFreezesAHolder() (gas: 450635)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1830482)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 24873)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 170929)\n[PASS] test_transferFromSelfWithAllowance() (gas: 128372)\n[PASS] test_transferFromSpendsAllowance() (gas: 204084)\n[PASS] test_transferMovesExactAmount() (gas: 90659)\n[PASS] test_transferToSelfKeepsBalance() (gas: 92755)\n[PASS] test_transferWholeBalance() (gas: 73233)\n[PASS] test_transferZeroAmountSucceeds() (gas: 42947)\n[PASS] test_unknownSelectorReverts() (gas: 29504)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 9.69ms (45.45ms CPU time)\n\nRan 1 test suite in 10.35ms (9.69ms CPU time): 39 tests passed, 0 failed, 0 skipped (39 total tests)\n","passed":true},{"durationMs":36,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DaemonToken.approve(address,uint256)\",\"DaemonToken.transfer(address,uint256)\",\"DaemonToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":156,\"foundry.toml\":24,\"remappings.txt\":1,\"script/DeployDaemonToken.s.sol\":31,\"src/DaemonToken.sol\":163,\"test/DaemonToken.t.sol\":443},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":337,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":235,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/DaemonToken.sol:34: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"07e93b6d7797944e1b2e73dba9a3006ceaa8306d6a7e12bc21585222e59dc513","verifiedTreeHash":"00ab93eebde223d1b0fb4ff7aaa56071cfdb4758","verifierVersion":"0.1.0+f8d984f2"},{"checks":[{"durationMs":908,"exitCode":0,"name":"build","output":"Compiling 22 files with Solc 0.8.26\nSolc 0.8.26 finished in 777.72ms\nCompiler run successful!\n","passed":true},{"durationMs":123,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/DaemonToken.t.sol:DaemonTokenTest\n[PASS] testFuzz_approveIsExact(address,uint256) (runs: 256, μ: 63160, ~: 63498)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 92370, ~: 92871)\nLogs:\n  Bound result 6747883707418819132705611\n  Bound result 236119080115608109429797380530849245797571109325768809297797972\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 115031, ~: 115209)\nLogs:\n  Bound result 859278376340243602633031114\n\n[PASS] testFuzz_transferFromAccounting(uint256,uint256,uint256) (runs: 256, μ: 172257, ~: 153660)\nLogs:\n  Bound result 11\n  Bound result 15808\n  Bound result 404098526\n\n[PASS] test_RevertWhen_approveZeroSpender() (gas: 30400)\n[PASS] test_RevertWhen_sendingEther() (gas: 37236)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 84998)\n[PASS] test_RevertWhen_transferFromEmptyAccount() (gas: 33259)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 132361)\n[PASS] test_RevertWhen_transferFromExceedsBalanceDespiteAllowance() (gas: 144881)\n[PASS] test_RevertWhen_transferFromToZeroAddress() (gas: 85400)\n[PASS] test_RevertWhen_transferFromWithoutAllowance() (gas: 85325)\n[PASS] test_RevertWhen_transferFromZeroAddressSender() (gas: 33506)\n[PASS] test_RevertWhen_transferMoreThanSupply() (gas: 35269)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 30423)\n[PASS] test_allowanceDoesNotLetSpenderMoveOtherOwnersFunds() (gas: 183996)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 126761)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 65009)\n[PASS] test_chainedTransfersArriveWhole() (gas: 180476)\n[PASS] test_constructorEmitsMintTransfer() (gas: 5454)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 12768)\n[PASS] test_create2DeploymentMintsToTheDeployingContract() (gas: 728378)\n[PASS] test_deployScriptMintsToCaller() (gas: 912177)\n[PASS] test_freshAccountsHoldNothing() (gas: 31970)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 177883)\n[PASS] test_metadata() (gas: 26748)\n[PASS] test_noAdminSelectorIncreasesSupply() (gas: 771700)\n[PASS] test_noOwnerAccessor() (gas: 29524)\n[PASS] test_noPrivilegedSelectorMovesOrFreezesAHolder() (gas: 450635)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1830482)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 24873)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 170929)\n[PASS] test_transferFromSelfWithAllowance() (gas: 128372)\n[PASS] test_transferFromSpendsAllowance() (gas: 204084)\n[PASS] test_transferMovesExactAmount() (gas: 90659)\n[PASS] test_transferToSelfKeepsBalance() (gas: 92755)\n[PASS] test_transferWholeBalance() (gas: 73233)\n[PASS] test_transferZeroAmountSucceeds() (gas: 42947)\n[PASS] test_unknownSelectorReverts() (gas: 29504)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 9.17ms (43.34ms CPU time)\n\nRan 1 test suite in 9.77ms (9.17ms CPU time): 39 tests passed, 0 failed, 0 skipped (39 total tests)\n","passed":true},{"durationMs":35,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DaemonToken.approve(address,uint256)\",\"DaemonToken.transfer(address,uint256)\",\"DaemonToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":156,\"foundry.toml\":24,\"launch.json\":24,\"remappings.txt\":1,\"script/DeployDaemonToken.s.sol\":31,\"src/DaemonToken.sol\":163,\"test/DaemonToken.t.sol\":443},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1c5ba2b67b1ad4de1c285a70850654c3ed0b457d43e8de057ca1539a42cb3aa1","verifiedTreeHash":"f3603adb7ebdaa716c304706c9cf08aaf8dad7c7","verifierVersion":"0.1.0+f8d984f2"},{"checks":[{"durationMs":1726,"exitCode":0,"name":"build","output":"Compiling 24 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.61s\nCompiler run successful!\n","passed":true},{"durationMs":16280,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/DaemonToken.t.sol:DaemonTokenTest\n[PASS] testFuzz_approveIsExact(address,uint256) (runs: 256, μ: 63237, ~: 63498)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 92039, ~: 92895)\nLogs:\n  Bound result 74498880884923216825643900\n  Bound result 5352353617481636195018888969895802\n\n[PASS] testFuzz_transferConservesSupplyAndIsExact(address,uint256) (runs: 256, μ: 114986, ~: 115209)\nLogs:\n  Bound result 100\n\n[PASS] testFuzz_transferFromAccounting(uint256,uint256,uint256) (runs: 256, μ: 167947, ~: 153022)\nLogs:\n  Bound result 684831254781382325029624772\n  Bound result 22620\n  Bound result 0\n\n[PASS] test_RevertWhen_approveZeroSpender() (gas: 30400)\n[PASS] test_RevertWhen_sendingEther() (gas: 37236)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 84998)\n[PASS] test_RevertWhen_transferFromEmptyAccount() (gas: 33259)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 132361)\n[PASS] test_RevertWhen_transferFromExceedsBalanceDespiteAllowance() (gas: 144881)\n[PASS] test_RevertWhen_transferFromToZeroAddress() (gas: 85400)\n[PASS] test_RevertWhen_transferFromWithoutAllowance() (gas: 85325)\n[PASS] test_RevertWhen_transferFromZeroAddressSender() (gas: 33506)\n[PASS] test_RevertWhen_transferMoreThanSupply() (gas: 35269)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 30423)\n[PASS] test_allowanceDoesNotLetSpenderMoveOtherOwnersFunds() (gas: 183996)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 126761)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 65009)\n[PASS] test_chainedTransfersArriveWhole() (gas: 180476)\n[PASS] test_constructorEmitsMintTransfer() (gas: 5454)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 12768)\n[PASS] test_create2DeploymentMintsToTheDeployingContract() (gas: 728378)\n[PASS] test_deployScriptMintsToCaller() (gas: 912177)\n[PASS] test_freshAccountsHoldNothing() (gas: 31970)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 177883)\n[PASS] test_metadata() (gas: 26748)\n[PASS] test_noAdminSelectorIncreasesSupply() (gas: 771700)\n[PASS] test_noOwnerAccessor() (gas: 29524)\n[PASS] test_noPrivilegedSelectorMovesOrFreezesAHolder() (gas: 450635)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1830482)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 24873)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 170929)\n[PASS] test_transferFromSelfWithAllowance() (gas: 128372)\n[PASS] test_transferFromSpendsAllowance() (gas: 204084)\n[PASS] test_transferMovesExactAmount() (gas: 90659)\n[PASS] test_transferToSelfKeepsBalance() (gas: 92755)\n[PASS] test_transferWholeBalance() (gas: 73233)\n[PASS] test_transferZeroAmountSucceeds() (gas: 42947)\n[PASS] test_unknownSelectorReverts() (gas: 29504)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 148.82ms (362.49ms CPU time)\n\nRan 33 tests for test/DaemonToken.edges.t.sol:DaemonTokenEdgesTest\n[PASS] testFuzz_approveIsIdempotent(address,uint256) (runs: 1000, μ: 90095, ~: 90506)\nLogs:\n  Bound result 16413\n\n[PASS] testFuzz_approveLastWriteWins(uint256,uint256) (runs: 1000, μ: 89489, ~: 89550)\n[PASS] testFuzz_failedTransferChangesNothing(uint256,uint256) (runs: 1000, μ: 188661, ~: 189246)\nLogs:\n  Bound result 18\n  Bound result 50\n\n[PASS] testFuzz_failedTransferFromChangesNothing(uint256,uint256,uint256) (runs: 1000, μ: 179094, ~: 178836)\nLogs:\n  Bound result 18\n  Bound result 14\n  Bound result 16413\n\n[PASS] testFuzz_fanOutConservesSupply(uint8,uint256) (runs: 1000, μ: 1509998, ~: 875097)\nLogs:\n  Bound result 6\n\n[PASS] testFuzz_mintGoesToWhoeverDeploys(address) (runs: 1000, μ: 26541, ~: 26599)\nLogs:\n  Bound result 11488\n\n[PASS] testFuzz_selfTransferAboveBalanceReverts(uint256,uint256) (runs: 1000, μ: 92256, ~: 92841)\nLogs:\n  Bound result 70446905110941824688450223\n  Bound result 19062761387730410998313981060844124926105\n\n[PASS] testFuzz_selfTransferIsNoOp(uint256,uint256) (runs: 1000, μ: 99909, ~: 100221)\nLogs:\n  Bound result 10258\n  Bound result 5522\n\n[PASS] testFuzz_transferFromSelfToSelfSpendsAllowance(uint256,uint256,uint256) (runs: 1000, μ: 166245, ~: 167336)\nLogs:\n  Bound result 453559058448938972881004282\n  Bound result 14501879484898302644367077894025298770733838920\n  Bound result 101972975623022991118619748\n\n[PASS] testFuzz_transferIsAdditive(uint256,uint256) (runs: 1000, μ: 116961, ~: 117450)\nLogs:\n  Bound result 70446905110941824688450223\n  Bound result 114932268903377478868662751\n\n[PASS] testFuzz_transferOrderIsIrrelevant(uint256,uint256) (runs: 1000, μ: 267269, ~: 269497)\nLogs:\n  Bound result 123456789000000000000000001\n  Bound result 127\n\n[PASS] testFuzz_transferRoundTripRestoresBalances(uint256) (runs: 1000, μ: 111625, ~: 111595)\nLogs:\n  Bound result 503102874732385703073898214\n\n[PASS] test_RevertWhen_transferFromZeroAddressSenderWithZeroAmount() (gas: 33674)\n[PASS] test_RevertWhen_zeroAddressApproves() (gas: 30806)\n[PASS] test_RevertWhen_zeroAddressApprovesZeroSpender() (gas: 30769)\n[PASS] test_RevertWhen_zeroAddressTransfers() (gas: 30804)\n[PASS] test_RevertWhen_zeroAddressTransfersEvenToItself() (gas: 30756)\n[PASS] test_allowanceIsNotSymmetric() (gas: 71214)\n[PASS] test_allowanceOneBelowMaxIsDecremented() (gas: 170593)\n[PASS] test_approveZeroAmountToZeroSpenderStillReverts() (gas: 30409)\n[PASS] test_receiverGainsNoAllowanceFromTransfer() (gas: 110921)\n[PASS] test_spenderCannotReuseAllowanceAfterOwnerDrains() (gas: 195750)\n[PASS] test_transferDoesNotTouchAllowances() (gas: 122270)\n[PASS] test_transferFromDoesNotEmitApproval() (gas: 124225)\n[PASS] test_transferFromZeroAmountToZeroAddressStillReverts() (gas: 36049)\n[PASS] test_transferFromZeroAmountWithoutAllowanceSucceeds() (gas: 60813)\n[PASS] test_transferZeroAmountToZeroAddressStillReverts() (gas: 30475)\n[PASS] test_transferZeroEmitsEvent() (gas: 38882)\n[PASS] test_twoDeploymentsAreIndependent() (gas: 94148)\n[PASS] test_unlimitedAllowanceCanBeRevoked() (gas: 168510)\n[PASS] test_unlimitedAllowanceStillRequiresBalance() (gas: 152583)\n[PASS] test_unlimitedAllowanceSurvivesManySpends() (gas: 522954)\n[PASS] test_unlimitedAllowanceSurvivesTransferFromOfZero() (gas: 92939)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 149.04ms (1.46s CPU time)\n\nRan 1 test for test/DaemonToken.invariant.t.sol:DaemonTokenInvariantTest\n[PASS]\nDaemonTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchLedger\n[PASS] invariant_balancesMatchLedger\n[PASS] invariant_callSummary\n[PASS] invariant_ledgerIsInternallyConsistent\n[PASS] invariant_noEtherAndStableMetadata\n[PASS] invariant_nobodyHoldsMoreThanReceived\n[PASS] invariant_sumOfBalancesEqualsSupply\n[PASS] invariant_totalSupplyNeverChanges\n[PASS] invariant_zeroAddressHoldsNothing\n DaemonTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+-----------------------+-------+---------+----------╮\n| Contract           | Selector              | Calls | Reverts | Discards |\n+=========================================================================+\n| DaemonTokenHandler | approve               | 1351  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | approveMax            | 1282  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | approveZeroSpender    | 1270  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | donateEther           | 1195  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | probeAdminSelector    | 1288  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | transfer              | 1228  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | transferAll           | 1251  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | transferFrom          | 1215  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | transferFromAll       | 1228  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | transferFromUnclamped | 1266  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | transferOneWei        | 1288  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | transferToZero        | 1256  | 0       | 0        |\n|--------------------+-----------------------+-------+---------+----------|\n| DaemonTokenHandler | transferUnclamped     | 1266  | 0       | 0        |\n╰--------------------+-----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 18644971376\n  Bound result 0\n  Bound result 30325700624581341640\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6046\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 96638689900298579257\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\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 16.18s (16.18s CPU time)\n\nRan 3 test suites in 16.18s (16.48s CPU time): 73 tests passed, 0 failed, 0 skipped (73 total tests)\n","passed":true},{"durationMs":52,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DaemonToken.approve(address,uint256)\",\"DaemonToken.transfer(address,uint256)\",\"DaemonToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":156,\"foundry.toml\":24,\"remappings.txt\":1,\"script/DeployDaemonToken.s.sol\":31,\"src/DaemonToken.sol\":163,\"test/DaemonToken.edges.t.sol\":386,\"test/DaemonToken.invariant.t.sol\":519,\"test/DaemonToken.t.sol\":443},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5fc4d6e2c332c828bd43e6e5ba349810dda8448df308a323a288d72c822c5658","verifiedTreeHash":"6a9b5ea4240adb1a1c7545a6e8fff5d595ea0a92","verifierVersion":"0.1.0+f8d984f2"}]}