{"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":"03691248-f445-41ce-8d20-6503c0f8b105","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"5e6eab6a20584fbdbee754d9a60c240e205303a9982e7a23b8c4ca6845ca157e","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":"37e2e91522658254bd0f65f0c26cec086d74ff25a2126975a91d6bd4773d5a5d","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":"d73892f43ee060fa69f7a10f4e69b052290358284094919f182d63e5e2076675","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"345ab1393dc10ad60a4f5bec36689dc8577a353947dacd939e7ed57442526af8","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":"0212ceb3aaf00584dd513b341e3c6720ae2e62b0f1d5cbe66a7ef68c948c023f","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":"3d50f4443602fdcb184a4b6bf694d81db12569dc236abaf622e4f434fbe101c6","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"b9fa1ac2bd54151008b0dbbd367a73ae2209fea404894736b025219d3ce398c3","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"f2aa11231edc14e61abb452e44bf569c39bff6d7a4256e5751b988dbc5133094","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Dog hood (DOG).\nToken name: Dog hood\nToken symbol: DOG\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"249136b539ce3c406ba053bc7445e5fde0ebb2747a83f1b6c10de28706920e22","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"03691248-f445-41ce-8d20-6503c0f8b105","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1629-dog-hood"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51319","feedbackHash":"22be0c7fbd39e4f240ef41de1bec0aa2118b1deb5fddc4695ba6539c975f5990","nodeKey":"audit_economics","submissionHash":"5e6eab6a20584fbdbee754d9a60c240e205303a9982e7a23b8c4ca6845ca157e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51540","feedbackHash":"4796e244f932c72b80f831ea241f435dd617ec7b04aa6394aea2196cd9ea4a06","nodeKey":"audit_flow","submissionHash":"37e2e91522658254bd0f65f0c26cec086d74ff25a2126975a91d6bd4773d5a5d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52161","feedbackHash":"afeb1e2843d2392097d7a1fe214f50d1ebd20776da41078305897f55ec0bef78","nodeKey":"audit_judge","submissionHash":"d73892f43ee060fa69f7a10f4e69b052290358284094919f182d63e5e2076675","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52173","feedbackHash":"ee9198179185422de84d2adbb1f92d95c06adf0eaf2a2ec135c5c21386ee94c0","nodeKey":"audit_math","submissionHash":"345ab1393dc10ad60a4f5bec36689dc8577a353947dacd939e7ed57442526af8","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51168","feedbackHash":"9648f1aedf5eec89f2b2ef24dc8cb8328f367c5bb9dcbcfbd635130340f809df","nodeKey":"audit_permissions","submissionHash":"0212ceb3aaf00584dd513b341e3c6720ae2e62b0f1d5cbe66a7ef68c948c023f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51139","feedbackHash":"201a0270e0f433b01269e9e29d5439163d1005c8baabaf9ab7704bb703aeb736","nodeKey":"build_contract_project","submissionHash":"3d50f4443602fdcb184a4b6bf694d81db12569dc236abaf622e4f434fbe101c6","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51375","feedbackHash":"b77aa41d9d1c9a0bb36055320c44dbd53f3b7593733857c5c0df0ba3be27bc5e","nodeKey":"manifest","submissionHash":"b9fa1ac2bd54151008b0dbbd367a73ae2209fea404894736b025219d3ce398c3","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51144","feedbackHash":"e94b7dad1b89f5ff2099b350aa04efbdb941339d7cd8839a186c8337f58eb122","nodeKey":"write_foundry_tests","submissionHash":"f2aa11231edc14e61abb452e44bf569c39bff6d7a4256e5751b988dbc5133094","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"d29a2f47b499632122b662f60a65c115bd7183e747c51ebe355aabc906149d2b","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6208734cdf5317a1","findings":[{"citation":"resolved","description":"Asymmetry guide, pair approve <-> transferFrom. DogHoodToken inherits OpenZeppelin v5.1.0 ERC20 unmodified (vendored copy diffed byte-for-byte against upstream tag v5.1.0). ERC20.approve (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:127) writes _allowances[owner][spender] = value unconditionally, while _spendAllowance (line 301) only decrements. There is no increaseAllowance/decreaseAllowance (removed in OZ v5), so a holder who wants to lower a live allowance has no atomic path: the spender can consume the old allowance before the new one lands. This is the documented ERC-20 allowance race, inherent to the standard, and the README already tells holders they are responsible for their own approvals. It is not a permission bypass: only an address the holder explicitly approved can do this, and only up to the sum of the two approvals. Reported as a trust assumption for the record, not as a defect to fix; changing approve semantics would break ERC-20 compatibility with the PoolManager and routers. If the author wants to address it, the compatible option is to add the standard increaseAllowance/decreaseAllowance helpers, which does not alter approve itself.","line":13,"path":"src/DogHoodToken.sol","reproduction":"State: Alice holds 1000 DOG. 1) prank(alice) token.approve(bob, 100e18). 2) Alice submits approve(bob, 50e18) intending to lower it; Bob sees it in the mempool and first calls prank(bob) token.transferFrom(alice, bob, 100e18). 3) Alice's approve(bob, 50e18) executes. 4) prank(bob) token.transferFrom(alice, bob, 50e18). Expected by Alice: Bob can take at most 100 DOG in total. Actual: balanceOf(bob) == 150e18, balanceOf(alice) == 850e18. Verified with a scratch Foundry test on this tree (test passes, i.e. the behaviour is as described).","severity":"info","snippet":"contract DogHoodToken is ERC20 {","title":"approve sets the allowance absolutely, so a spender can front-run an allowance reduction and spend old plus new (standard ERC-20 behaviour, no code change recommended)"}],"hash":"0212ceb3aaf00584dd513b341e3c6720ae2e62b0f1d5cbe66a7ef68c948c023f","nodeId":"47080aa8-c2cc-4567-8a29-a22afefbdee5","outcome":"completed","summary":"The review is complete. The findings file is written and the scratch test is removed.\n\n**Outcome: no defects found in the assigned area.** The Dog hood token is OpenZeppelin v5.1.0 ERC20 with a constructor that mints the full supply once to the deployer, and nothing else. The findings file holds one info-level note and a nine-row coverage record.\n\n**What I verified**\n\n- **Access control.** The compiled ABI exposes only approve, transfer, transferFrom, the ERC-20 views, five constant getters and the constructor. There is no owner, minter, initializer, proxy, receive or fallback. Internal mint and burn are unreachable from any external function, and unknown selectors revert.\n- **Vendored library integrity.** The five OpenZeppelin files the token depends on are byte-identical to the upstream v5.1.0 tag, so the inherited transfer and allowance logic is the audited one.\n- **Asymmetry.** The transfer and transferFrom pair both route through the same internal path with no fee or privileged branch. The only asymmetry is the standard ERC-20 allowance race in approve, reproduced with concrete numbers and recorded as info, with no code change recommended since changing approve would break pool compatibility.\n- **Trust gap.** There is no privileged actor, settable parameter or pricing formula in the token, so none of the guide's seams is reachable.\n- **Static analysis leads.** Slither reported nothing. The aderyn large-literal lead is a compile-time constant that tests assert equals one billion times ten to the eighteenth, so it is not a defect.\n- **Build and tests.** Both the project suite and my scratch checks pass under forge 1.8.3 with solc 0.8.26, and formatting is clean.\n\n**Not covered.** The launch flows themselves, meaning the factory, distributor and pool seeding, live outside this repository and were out of reach, though the token's lack of fees means it cannot short them.","treeHash":null,"usage":{"cachedInputTokens":494150,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":11128,"runtime":"claude","turns":22,"wallClockMs":168527}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c2e167266d13dcf4","findings":[],"hash":"345ab1393dc10ad60a4f5bec36689dc8577a353947dacd939e7ed57442526af8","nodeId":"d55725a4-d171-419b-a909-090303b82a8e","outcome":"completed","summary":"The review is complete. The findings file holds an empty findings list and a coverage record of eight rows, and the working tree has no other changes.\n\n**Outcome: no defects found in the math, boundary or numerical-gap area.** The token in `src/DogHoodToken.sol` is a 31-line wrapper over the vendored OpenZeppelin v5.1.0 ERC20, which I read in full and confirmed is the unmodified upstream implementation. The only arithmetic the token itself adds is the supply constant on line 24, which folds at compile time to exactly the manifest's one billion tokens in minor units and fits within 90 bits.\n\nWhat I checked, with a scratch Foundry suite that I ran and then removed:\n\n- **Max-value inputs.** Transfers of the full supply plus one and of the maximum uint256 revert on the balance check before any unchecked arithmetic runs. An allowance of max minus one is treated as finite and decrements normally. Only the exact maximum is infinite.\n- **Zero and self paths.** Zero-value transfers from empty accounts succeed without moving anything. A self-transfer of the whole balance through transferFrom leaves the balance intact and spends the allowance. A transferFrom from the zero address reverts before any state change.\n- **Conservation.** A fuzzed sequence of random transfers among four holders always sums to exactly the supply, and totalSupply never changes since nothing can mint or burn after construction.\n- **Launch share arithmetic on this supply.** The ten percent swarm share and the eighty-eight percent pool share divide with zero remainder, the scaling product cannot overflow, and the sqrtPriceX96 the deployer would derive from the 2,500 IMD opening cap lies inside Uniswap v4's bounds for either currency order.\n- **Boundary guide call-site list.** The contract makes no external calls, has no payable, receive or fallback function, no sentinel branches and no bytes decoding, so that guide's enumeration is empty.\n\nThe aderyn large-numeric-literal lead on line 24 is a style note only. The existing 26-test suite passes as shipped.\n\nCoverage: all three listed entry points are marked holds, plus five invariant rows. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":487705,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":10694,"runtime":"claude","turns":18,"wallClockMs":151801}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"589ef002581a5371","findings":[{"citation":"resolved","description":"First Principles / desynchronized coupling. The contract documents TOKEN_DECIMALS as 'Decimals returned by decimals()' and derives TOTAL_SUPPLY from it (line 24), but decimals() is never overridden: the value the chain reports comes from OpenZeppelin's default (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:78, returns 18). The two agree today, so the deployed token is correct: decimals() == 18, totalSupply() == 1e27, and the manifest values in README match. The coupling is one-directional, so a future edit of TOKEN_DECIMALS silently changes the minted supply while decimals() stays 18. Not a defect in the code as it stands; recorded so the author can decide whether to add `function decimals() public pure override returns (uint8) { return TOKEN_DECIMALS; }` (which preserves behaviour exactly) or drop the constant.","line":21,"path":"src/DogHoodToken.sol","reproduction":"Current tree: deploy DogHoodToken; decimals() returns 18, TOKEN_DECIMALS() returns 18, totalSupply() returns 1000000000000000000000000000. No failing input exists today. Failing state if the constant is edited: set TOKEN_DECIMALS = 9 and redeploy; TOTAL_SUPPLY becomes 1000000000000000000 (1e18) and totalSupply() returns that, while decimals() still returns 18, so a manifest written as 1e9 tokens with 9 decimals (totalSupply \"1000000000000000000\", decimals 9) fails the protected test_decimalsMatchTheManifest (reports 18) and wallets display 1 DOG instead of 1,000,000,000 DOG.","severity":"info","snippet":"    uint8 public constant TOKEN_DECIMALS = 18;","title":"TOKEN_DECIMALS constant is not wired to decimals(); the two values are coupled only by convention"},{"citation":"resolved","description":"Execution Trace / approval residuals. The token inherits OpenZeppelin v5.1.0 approve (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:127), which overwrites the allowance. A spender who front-runs a holder's re-approval can spend the old allowance and then the new one. This is the behaviour the ERC-20 standard specifies and the README already tells holders to approve only what a spender needs; OpenZeppelin v5 deliberately removed increaseAllowance/decreaseAllowance. No change is required for the launch: the factory, distributor and PoolManager flows use transfer/transferFrom with amounts they control. Recorded as a trust assumption on holders, not a defect.","line":13,"path":"src/DogHoodToken.sol","reproduction":"State: alice holds 1000 DOG and has approved bob for 100. Sequence: (1) bob calls transferFrom(alice, bob, 100) -> succeeds, allowance 0; (2) alice calls approve(bob, 50) intending to lower the original 100 -> allowance 50; (3) bob calls transferFrom(alice, bob, 50) -> succeeds. Result: bob received 150 although alice never intended more than 100 outstanding. Verified with a scratch test (test/scratch/Trace.t.sol test_approveRace): balanceOf(bob) == 150. Expected under ERC-20: exactly this; the standard has no atomic set-and-check.","severity":"info","snippet":"contract DogHoodToken is ERC20 {","title":"approve() is set-not-increment, so the standard ERC-20 allowance race applies (inherited, by design)"}],"hash":"37e2e91522658254bd0f65f0c26cec086d74ff25a2126975a91d6bd4773d5a5d","nodeId":"e54ce877-2cfb-40b7-b1d2-fcf36def7c5a","outcome":"completed","summary":"The review is complete and the findings file is written. No tracked file changed.\n\n**Outcome: no defects found in the Dog hood token.** The findings file holds two informational notes and nine coverage rows. Nothing in it opens a revision.\n\n**What I checked, against the Execution Trace, Periphery and First Principles guides:**\n\n- **Periphery.** All five OpenZeppelin files the token inherits, including ERC20.sol and Context.sol, hash identical to upstream v5.1.0. The sender context is plain msg.sender, so caller identity is exact.\n- **Execution trace.** Traced approve, transfer and transferFrom through the inherited internals with concrete values in a scratch test. Self-transfer, transferFrom to the sender, zero amounts, zero addresses, max allowance, approve overwrite, and the event counts all behave as ERC-20 specifies. Twelve scratch tests passed, plus the project's own 26.\n- **First principles.** The constructor mints the whole supply once to msg.sender with no arguments and no external calls, and works through a CREATE2 factory stub. No function can grow or freeze a balance. The runtime has no DELEGATECALL, CALLCODE, SELFDESTRUCT or any call opcode. It does use PUSH0 and one MCOPY, so the chain must support Cancun, which the launch's Uniswap v4 PoolManager already requires.\n- **Static analysis lead.** The aderyn large-literal line is the supply constant and equals the brief exactly.\n\n**Two informational notes, both with reproductions:**\n\n1. The TOKEN_DECIMALS constant drives the minted supply but decimals() is never overridden, so the two agree only by convention today. Harmless as shipped. A one-line override would bind them.\n2. The inherited approve is set-not-increment, so the standard ERC-20 allowance race applies. Reproduced at 150 spent against an intended 100. This is by design and the README already warns holders.\n\n**Not reached:** the protected launch suite itself, which needs v4-core and launch environment variables absent from this tree. The token has no fee or exemption logic, so its flows cannot arrive short.","treeHash":null,"usage":{"cachedInputTokens":1127493,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":14036,"runtime":"claude","turns":18,"wallClockMs":220149}},{"artifacts":[],"attempt":1,"bundleHash":"d1d16236a4b4715070292fd6408d93919033399fd76cd6d4eb2599daea1f08ff","device":"8d26cb1a4eaeb75a","findings":[],"hash":"3d50f4443602fdcb184a4b6bf694d81db12569dc236abaf622e4f434fbe101c6","nodeId":"a9235220-07d8-4343-910f-f46ba1f40d06","outcome":"completed","summary":"The Dog hood (DOG) token is built, tested and committed on main. The working tree is clean and no stray files remain.\n\n**What was delivered**\n\n- `src/DogHoodToken.sol` is a plain OpenZeppelin v5.1.0 ERC-20. The constructor takes no arguments and mints the full supply once to the deployer. There is no owner, mint, burn, pause, blocklist, fee or ether path, and the runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- `foundry.toml` pins solc 0.8.26, sets `bytecode_hash = \"none\"`, keeps ffi off and grants no filesystem permissions.\n- `lib/` holds forge-std v1.9.7 and the OpenZeppelin token, interfaces and utils trees as ordinary files. No submodule or nested git metadata is present.\n- `test/DogHoodToken.t.sol` covers metadata, supply, a CREATE2 factory deployment mirroring the launch, transfers, allowances, every standard failure path, the absence of any admin or mint function for both the deployer and a stranger, and the same opcode scan the protected floor test runs. Four fuzz tests check supply conservation and balance and allowance bounds.\n- `README.md` documents the token values, launch assumptions, manifest-relevant fields, operational responsibilities and the fact that there are no open deployment choices and nothing to set after launch.\n\n**Verification results**\n\n| Check | Result |\n| --- | --- |\n| forge build | passes, runtime 2,164 bytes |\n| forge test with the verifier's fuzz seed | 26 passed, 0 failed |\n| forge fmt --check | passes |\n| git status --porcelain | clean after commit |\n\nThe protected floor tests could not be run here because their harness (v4-core and the floor's helpers) is not in this repository. The token matches every condition they check: the manifest supply is minted to the factory address, no transfer takes a fee, the supply cannot grow, no privileged call exists, and the bytecode has no forbidden opcodes.","treeHash":"58e814e5ee49b1ddd4bd5e51afdb1a5b7a7cd12d","usage":{"cachedInputTokens":927157,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":18600,"runtime":"claude","turns":30,"wallClockMs":243432}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8eebc53449bafe7b","findings":[],"hash":"5e6eab6a20584fbdbee754d9a60c240e205303a9982e7a23b8c4ca6845ca157e","nodeId":"088ca6b1-d478-4dd3-95ae-de226c95e30b","outcome":"completed","summary":"The findings file is in place and is simply excluded from git by the harness's own exclude rule, so the tree is otherwise untouched. The review is complete.\n\n**Result: no defects found.** The economics, invariant and flow-gap review of Dog hood (DOG) produced an empty findings list. The file `.imd-findings.json` holds that empty list plus eight coverage rows, all `holds`, covering the three listed entry points and five invariants or economic properties I checked.\n\n**What the token is.** A single contract that inherits OpenZeppelin v5.1.0 `ERC20` unchanged and mints the whole supply to the deployer in its constructor. It has no owner, mint, burn, pause, blocklist, fee, hook, external call, or `receive` function. The compiled ABI exposes thirteen selectors, all standard ERC-20 views and the three writers.\n\n**What I verified.**\n- The vendored OpenZeppelin files the token depends on are byte-identical to the upstream v5.1.0 npm release, so no transfer logic was altered.\n- The existing 26-test suite passes. I added a scratch stateful invariant suite that ran random transfer, approve and transferFrom sequences across six actors and held sum-of-balances equal to a constant total supply of exactly 1e27 throughout. It also confirmed each launch hop arrives whole and that the 10/88/2 split has zero rounding. I ran it, saw it pass, and deleted it.\n- The aderyn large-literal lead is a compile-time constant that evaluates to exactly 1e27. It is not a defect.\n- The only remaining trust point is the standard ERC-20 approve race, which is inherent to the interface and listed as do-not-report in the Pashov validation rules.\n\n**Not covered.** Pool, price and policy values live in the launch manifest, which this repository does not include, so I could not check them against a concrete file. The token's arithmetic is compatible with them: the pool share fits a Uniswap v4 uint128 delta.","treeHash":null,"usage":{"cachedInputTokens":821972,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":12929,"runtime":"claude","turns":25,"wallClockMs":214921}},{"artifacts":[],"attempt":1,"bundleHash":"2d90b0df51856463467433c40233197c72e33dd7c506d2fa250b71b281901ffa","device":"93c37f17670e4d98","findings":[],"hash":"b9fa1ac2bd54151008b0dbbd367a73ae2209fea404894736b025219d3ce398c3","nodeId":"d3b9fd6e-94f9-437f-bd10-0559ad44d2f9","outcome":"completed","summary":"Done. The manifest is written and verified, and nothing else in the tree changed.\n\n**What I wrote** in launch.json:\n- kind \"custom_token\", token contract `DogHoodToken`, name \"Dog hood\", symbol \"DOG\", decimals 18, empty constructorArgs, totalSupply of 1,000,000,000 tokens in minor units.\n- An empty contracts list, since the accepted tree contains only the token and no application contracts.\n- The launch's pool block as given: IMD pair address, fee 12500, tick spacing 60, the one-to-one initialPrice.\n- The requester's economics object copied verbatim.\n- Notes describing the token's behaviour and the launch flows, well under the 4,000 character limit.\n\n**Verification:**\n- The compiled ABI confirms the constructor takes no inputs, so the empty constructorArgs matches the accepted implementation.\n- The constructor mints exactly the manifest supply to msg.sender, matching what the protected token test checks.\n- forge build succeeds and all 26 tests pass under the verifier's fuzz seed.\n- A script check confirmed the manifest has only the schema's keys, a lowercase pair address, and the exact economics object.\n- git status shows launch.json as the only new file. No configuration or source file was touched.","treeHash":"db4d8834dc2eb7567a9c5564d486c66b8bf07a96","usage":{"cachedInputTokens":229434,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":3277,"runtime":"claude","turns":10,"wallClockMs":56170}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ca075d17c94a854b","findings":[{"citation":"resolved","description":"Merged from audit_flow and audit_permissions, which reported the same root cause. DogHoodToken inherits the unmodified OpenZeppelin v5.1.0 ERC20 (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol matches the upstream v5.1.0 file byte for byte; sha256 be0df7e4...). ERC20.approve (lib line 127) sets _allowances[owner][spender] = value absolutely and _spendAllowance only decrements, and OZ v5 has no increaseAllowance/decreaseAllowance, so a holder has no atomic way to lower a live allowance: a spender who sees the re-approval pending can spend the old allowance first and then the new one. This is exactly what ERC-20 specifies, it is reachable only by an address the holder explicitly approved, and it is bounded by the sum of the two approvals. The launch flows (factory to distributor, pool seed through the PoolManager, remainder to the requester) use transfer/transferFrom with amounts the callers control and are not affected. The README already tells holders they are responsible for their own approvals. No code change is required for the launch; changing approve semantics would break compatibility with the PoolManager and routers. Recorded as a documented trust assumption for the author's record.","line":13,"path":"src/DogHoodToken.sol","reproduction":"Reproduced on this tree with test/scratch/Judge.t.sol test_approveRaceIsStandardERC20 (passes, i.e. the behaviour is as described). State: factory deploys DogHoodToken and transfers 1000e18 DOG to alice. Sequence: (1) prank(alice) token.approve(bob, 100e18); (2) prank(bob) token.transferFrom(alice, bob, 100e18) succeeds, allowance 0; (3) prank(alice) token.approve(bob, 50e18) intending to lower the original 100e18; (4) prank(bob) token.transferFrom(alice, bob, 50e18) succeeds. Expected by alice: at most 100e18 taken. Actual: balanceOf(bob) == 150e18, balanceOf(alice) == 850e18.","severity":"info","snippet":"contract DogHoodToken is ERC20 {","title":"approve() overwrites the allowance, so the standard ERC-20 allowance race applies (inherited OpenZeppelin v5.1.0 behaviour; trust assumption on holders, not a defect)"},{"citation":"resolved","description":"Reported by audit_flow; reproduced. TOKEN_DECIMALS is documented as 'Decimals returned by decimals()' and TOTAL_SUPPLY on line 24 is derived from it, but decimals() is never overridden: the chain reports OpenZeppelin's hard-coded default of 18 (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol line 78). Today both are 18, so the deployed token is correct: decimals() == 18, totalSupply() == 1e27, and launch.json (decimals 18, totalSupply 1000000000000000000000000000) matches. The coupling is one-directional: editing the constant would change the minted supply while decimals() stayed 18. Not a defect in the code as it stands. If the author wants the constant to mean what its comment says, `function decimals() public pure override returns (uint8) { return TOKEN_DECIMALS; }` preserves behaviour exactly; alternatively drop the constant and write 1e27 directly.","line":21,"path":"src/DogHoodToken.sol","reproduction":"Current tree (test/scratch/Judge.t.sol test_mintsWholeSupplyToDeployerAndMetadata): deploy DogHoodToken from a factory contract; decimals() returns 18, TOKEN_DECIMALS() returns 18, totalSupply() returns 1000000000000000000000000000, balanceOf(factory) equals totalSupply. No failing input exists on this code. The latent failure needs a source edit: set TOKEN_DECIMALS = 9 and redeploy; totalSupply() becomes 1e18 while decimals() still returns 18, so a manifest written for 9 decimals fails the protected test_decimalsMatchTheManifest.","severity":"info","snippet":"    uint8 public constant TOKEN_DECIMALS = 18;","title":"TOKEN_DECIMALS constant is not wired to decimals(); the two values agree only by convention (no failing input in the code as it stands)"}],"hash":"d73892f43ee060fa69f7a10f4e69b052290358284094919f182d63e5e2076675","nodeId":"66fe9b14-6f79-4da5-8962-5037d642bf73","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. The tree is otherwise unchanged.\n\n**Outcome:** no defects. The token is a 31-line fixed-supply ERC-20 on the unmodified OpenZeppelin v5.1.0 base, and every entry point and launch-floor property holds.\n\n**What I verified**\n\n- The five vendored OpenZeppelin files the token depends on match upstream v5.1.0 byte for byte by sha256.\n- The constructor takes no arguments and mints exactly 1e27 to the deployer. CREATE2 deployment is deterministic and creation and runtime sizes are far under the protocol limits.\n- The three entry points `approve`, `transfer` and `transferFrom` behave as plain ERC-20 on every success and revert path. There is no mint, burn, owner, pause, blocklist, receive or fallback, and the runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- The manifest in launch.json agrees with the code on contract name, metadata, decimals, supply and empty constructor arguments.\n- The repository's 66 tests pass, and my scratch test of all of the above passed before I removed it.\n\n**Specialist findings**\n\n- The two approve-race reports from audit_flow and audit_permissions share one root cause, so I merged them into one info finding and reproduced it. It is standard ERC-20 behaviour and a holder trust assumption, not a defect.\n- The TOKEN_DECIMALS coupling report from audit_flow reproduces as described. It has no failing input on the current code, so it is kept as info only.\n- Slither reported nothing. Aderyn's large-literal line is the 1e27 supply constant, which is correct.\n\n**Coverage:** all three entry points answered `holds`, plus three invariant rows. No finding is critical or high, so no proof file was attached.","treeHash":null,"usage":{"cachedInputTokens":569950,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":8724,"runtime":"claude","turns":12,"wallClockMs":139319}},{"artifacts":[],"attempt":1,"bundleHash":"04e9263344c44c60e9138560080b91d201511a0cf32874b7d74b9c98365e474f","device":"91067b3439961e55","findings":[],"hash":"f2aa11231edc14e61abb452e44bf569c39bff6d7a4256e5751b988dbc5133094","nodeId":"369b0d28-2367-475a-9857-e427a6a2e1a4","outcome":"completed","summary":"Done. The suite passes with the verifier's fuzz seed, and I found no defect in the token, so there is no findings file.\n\n**What was there.** The implementation is a thin wrapper over OpenZeppelin v5.1.0 ERC20 with no added logic. The earlier contributor's `test/DogHoodToken.t.sol` already covered metadata, supply, basic transfers, allowances, and the main revert paths, but had no invariant tests, which the acceptance criteria require.\n\n**What I added**, both under `test/` and left the existing file untouched:\n\n- `test/DogHoodToken.invariant.t.sol` holds a handler that drives six actors through transfer, approve and transferFrom with bounded inputs, plus failure paths that must revert: transfers above balance, transferFrom above allowance, transfers to the zero address, sixteen privileged signatures tried from every actor including the deployer, and ether sent to the token. Every handler path is non-reverting by construction, so the run uses `fail-on-revert = true`. Invariants check that supply never changes, balances sum to supply, each balance equals its ghost net flow, inflows equal outflows, every allowance equals what was approved less what was spent, and the token holds no ether. Two unit tests ground the harness by driving every handler path directly and checking the ghost counters.\n- `test/DogHoodToken.edges.t.sol` covers the corners the first file did not reach: approve overwrites rather than adds, self-approval and self-spend, the zero-address owner and spender paths with their exact error selectors, allowance checked before balance, transferFrom to zero not spending allowance, event counts on transferFrom and zero transfers, empty and truncated calldata, deployment from inside another contract's constructor, and fuzzed round-trip, multi-hop, split, allowance-decrement and atomicity properties using `bound` so no run is discarded.\n\n**Verification.** Results with the verifier seed:\n\n| Suite | Tests | Result |\n| --- | --- | --- |\n| DogHoodToken.t.sol | 26 | pass |\n| DogHoodToken.edges.t.sol | 37 | pass |\n| DogHoodToken.invariant.t.sol | 3 | pass, 8192 handler calls, 0 reverts |\n\nTo confirm the invariants are not vacuous, I ran the same handler against a scratch 1% burn-on-transfer mutant and it failed on the first sequence. The scratch file was removed. `forge fmt --check` passes and `git status` shows only the two new test files.","treeHash":"91dd4ff2038d0a6d02e7743316a2498bbe9642e8","usage":{"cachedInputTokens":550017,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":26995,"runtime":"claude","turns":17,"wallClockMs":338436}}],"verification":[{"checks":[{"durationMs":807,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 736.74ms\nCompiler run successful!\n","passed":true},{"durationMs":96,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/DogHoodToken.t.sol:DogHoodTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99457, ~: 99835)\nLogs:\n  Bound result 632455711\n  Bound result 2\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 97664, ~: 97949)\nLogs:\n  Bound result 69623654396097923915995699\n\n[PASS] testFuzz_transferFromAboveAllowanceReverts(uint256,uint256) (runs: 256, μ: 93253, ~: 93818)\nLogs:\n  Bound result 6240\n  Bound result 1000000000000000000000\n\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256,uint256) (runs: 256, μ: 222267, ~: 228427)\nLogs:\n  Bound result 697616278944671404299877532\n  Bound result 31203341022\n  Bound result 8792222172\n\n[PASS] test_approveAndTransferFrom() (gas: 224757)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 11521)\n[PASS] test_create2FromFactoryMintsToFactory() (gas: 823128)\n[PASS] test_eachDeploymentMintsItsOwnSupply() (gas: 44809)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 184034)\n[PASS] test_metadata() (gas: 59003)\n[PASS] test_noEtherAccepted() (gas: 39457)\n[PASS] test_noMintOrAdminFunctionExists() (gas: 618785)\n[PASS] test_revert_approveZeroSpender() (gas: 32964)\n[PASS] test_revert_transferFromEmptyAccount() (gas: 37738)\n[PASS] test_revert_transferFromExceedsBalanceEvenWhenApproved() (gas: 146492)\n[PASS] test_revert_transferFromInsufficientAllowance() (gas: 140981)\n[PASS] test_revert_transferFromWithoutApproval() (gas: 38403)\n[PASS] test_revert_transferInsufficientBalance() (gas: 92728)\n[PASS] test_revert_transferToZeroAddress() (gas: 33024)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2779065)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 27776)\n[PASS] test_transferMovesExactAmount() (gas: 96151)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43935)\n[PASS] test_transferWholeBalance() (gas: 78505)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47811)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 33928)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 10.44ms (45.81ms CPU time)\n\nRan 1 test suite in 11.01ms (10.44ms CPU time): 26 tests passed, 0 failed, 0 skipped (26 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DogHoodToken.approve(address,uint256)\",\"DogHoodToken.transfer(address,uint256)\",\"DogHoodToken.transferFrom(address,address,uint256)\"],\"files\":{\"README.md\":103,\"foundry.toml\":21,\"remappings.txt\":2,\"src/DogHoodToken.sol\":31,\"test/DogHoodToken.t.sol\":321},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":436,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":246,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/DogHoodToken.sol:24: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3d50f4443602fdcb184a4b6bf694d81db12569dc236abaf622e4f434fbe101c6","verifiedTreeHash":"58e814e5ee49b1ddd4bd5e51afdb1a5b7a7cd12d","verifierVersion":"0.1.0+7129bf9d"},{"checks":[{"durationMs":829,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 760.27ms\nCompiler run successful!\n","passed":true},{"durationMs":81,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/DogHoodToken.t.sol:DogHoodTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99457, ~: 99835)\nLogs:\n  Bound result 6240\n  Bound result 1000000000000000000000\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 97664, ~: 97949)\nLogs:\n  Bound result 692524389232476965605121183\n\n[PASS] testFuzz_transferFromAboveAllowanceReverts(uint256,uint256) (runs: 256, μ: 93253, ~: 93818)\nLogs:\n  Bound result 6240\n  Bound result 1000000000000000000000\n\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256,uint256) (runs: 256, μ: 222267, ~: 228427)\nLogs:\n  Bound result 979049625423639962580259421\n  Bound result 92697319106367\n  Bound result 854057\n\n[PASS] test_approveAndTransferFrom() (gas: 224757)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 11521)\n[PASS] test_create2FromFactoryMintsToFactory() (gas: 823128)\n[PASS] test_eachDeploymentMintsItsOwnSupply() (gas: 44809)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 184034)\n[PASS] test_metadata() (gas: 59003)\n[PASS] test_noEtherAccepted() (gas: 39457)\n[PASS] test_noMintOrAdminFunctionExists() (gas: 618785)\n[PASS] test_revert_approveZeroSpender() (gas: 32964)\n[PASS] test_revert_transferFromEmptyAccount() (gas: 37738)\n[PASS] test_revert_transferFromExceedsBalanceEvenWhenApproved() (gas: 146492)\n[PASS] test_revert_transferFromInsufficientAllowance() (gas: 140981)\n[PASS] test_revert_transferFromWithoutApproval() (gas: 38403)\n[PASS] test_revert_transferInsufficientBalance() (gas: 92728)\n[PASS] test_revert_transferToZeroAddress() (gas: 33024)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2779065)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 27776)\n[PASS] test_transferMovesExactAmount() (gas: 96151)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43935)\n[PASS] test_transferWholeBalance() (gas: 78505)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47811)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 33928)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 10.30ms (47.16ms CPU time)\n\nRan 1 test suite in 11.02ms (10.30ms CPU time): 26 tests passed, 0 failed, 0 skipped (26 total tests)\n","passed":true},{"durationMs":34,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DogHoodToken.approve(address,uint256)\",\"DogHoodToken.transfer(address,uint256)\",\"DogHoodToken.transferFrom(address,address,uint256)\"],\"files\":{\"README.md\":103,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/DogHoodToken.sol\":31,\"test/DogHoodToken.t.sol\":321},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b9fa1ac2bd54151008b0dbbd367a73ae2209fea404894736b025219d3ce398c3","verifiedTreeHash":"db4d8834dc2eb7567a9c5564d486c66b8bf07a96","verifierVersion":"0.1.0+7129bf9d"},{"checks":[{"durationMs":1489,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.42s\nCompiler run successful!\n","passed":true},{"durationMs":4965,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/DogHoodToken.t.sol:DogHoodTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 99586, ~: 99871)\nLogs:\n  Bound result 14888\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129625046\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 97784, ~: 97967)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_transferFromAboveAllowanceReverts(uint256,uint256) (runs: 256, μ: 93359, ~: 93826)\nLogs:\n  Bound result 14888\n  Bound result 999999999999999999999985111\n\n[PASS] testFuzz_transferFromWithinAllowance(uint256,uint256,uint256) (runs: 256, μ: 223055, ~: 228329)\nLogs:\n  Bound result 592189512082546461800411766\n  Bound result 175628373879749420514632319\n  Bound result 65809917570496610344623024\n\n[PASS] test_approveAndTransferFrom() (gas: 224757)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 11521)\n[PASS] test_create2FromFactoryMintsToFactory() (gas: 823128)\n[PASS] test_eachDeploymentMintsItsOwnSupply() (gas: 44809)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 184034)\n[PASS] test_metadata() (gas: 59003)\n[PASS] test_noEtherAccepted() (gas: 39457)\n[PASS] test_noMintOrAdminFunctionExists() (gas: 618785)\n[PASS] test_revert_approveZeroSpender() (gas: 32964)\n[PASS] test_revert_transferFromEmptyAccount() (gas: 37738)\n[PASS] test_revert_transferFromExceedsBalanceEvenWhenApproved() (gas: 146492)\n[PASS] test_revert_transferFromInsufficientAllowance() (gas: 140981)\n[PASS] test_revert_transferFromWithoutApproval() (gas: 38403)\n[PASS] test_revert_transferInsufficientBalance() (gas: 92728)\n[PASS] test_revert_transferToZeroAddress() (gas: 33024)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2779065)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 27776)\n[PASS] test_transferMovesExactAmount() (gas: 96151)\n[PASS] test_transferToSelfKeepsBalance() (gas: 43935)\n[PASS] test_transferWholeBalance() (gas: 78505)\n[PASS] test_transferZeroAmountSucceeds() (gas: 47811)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 33928)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 90.54ms (138.13ms CPU time)\n\nRan 37 tests for test/DogHoodToken.edges.t.sol:DogHoodTokenEdgesTest\n[PASS] testFuzz_allowanceDecrementsBySpent(uint256,uint256,uint256,uint256) (runs: 1000, μ: 257611, ~: 263429)\nLogs:\n  Bound result 92904118339137233383143994\n  Bound result 64192987426365727562595348\n  Bound result 64192987426365727562595345\n  Bound result 1\n\n[PASS] testFuzz_anyNonZeroAddressCanReceive(uint256,uint256) (runs: 1000, μ: 75277, ~: 75878)\nLogs:\n  Bound result 1461501637330902918203684832716283019655932542972\n  Bound result 465340515255\n\n[PASS] testFuzz_approveLastWriteWins(uint256,uint256,uint256) (runs: 1000, μ: 136647, ~: 136653)\nLogs:\n  Bound result 42\n\n[PASS] testFuzz_failedTransferFromKeepsAllowance(uint256,uint256) (runs: 1000, μ: 187247, ~: 187874)\nLogs:\n  Bound result 1\n  Bound result 23906639108719152921829756500801811297558003318058693033292040160\n\n[PASS] testFuzz_failedTransferIsAtomic(uint256,uint256) (runs: 1000, μ: 136282, ~: 136800)\nLogs:\n  Bound result 999999999999999999999999996\n  Bound result 465340515255\n\n[PASS] testFuzz_multiHopConservesAmount(uint256,uint256,uint256) (runs: 1000, μ: 266172, ~: 271040)\nLogs:\n  Bound result 27452\n  Bound result 12815\n  Bound result 1551\n\n[PASS] testFuzz_noCallerCanMint(uint256,uint256) (runs: 1000, μ: 75537, ~: 75447)\nLogs:\n  Bound result 1461501637330902918203684832716283019655932542972\n\n[PASS] testFuzz_splitTransfers(uint256,uint256) (runs: 1000, μ: 154875, ~: 157746)\nLogs:\n  Bound result 999999999999999999999999997\n  Bound result 465340515255\n\n[PASS] testFuzz_transferRoundTripRestoresBalances(uint256,uint256) (runs: 1000, μ: 128885, ~: 129256)\nLogs:\n  Bound result 10639310798517824835971093623363610210625885\n  Bound result 624687939918011969842907113\n\n[PASS] testFuzz_unlimitedAllowanceSurvivesSpends(uint256,uint256,uint256) (runs: 1000, μ: 238834, ~: 240444)\nLogs:\n  Bound result 667667424671764583181614965\n  Bound result 148749360834912065090866254\n  Bound result 17396823727735987024240352\n\n[PASS] test_allowanceIsDirectional() (gas: 80347)\n[PASS] test_approveDoesNotMoveTokens() (gas: 132422)\n[PASS] test_approveIsNotBoundedByBalance() (gas: 78541)\n[PASS] test_approveOverwritesInsteadOfAdding() (gas: 95975)\n[PASS] test_approveSelfThenTransferFromSelf() (gas: 187227)\n[PASS] test_approveZeroClearsAllowance() (gas: 90850)\n[PASS] test_deployFromAContractConstructorMintsToThatContract() (gas: 135899)\n[PASS] test_maxMinusOneAllowanceIsDecremented() (gas: 174713)\n[PASS] test_revert_allowanceCheckedBeforeBalance() (gas: 38418)\n[PASS] test_revert_approveFromZeroAddress() (gas: 33099)\n[PASS] test_revert_emptyCalldata() (gas: 29336)\n[PASS] test_revert_increaseAllowanceDoesNotExist() (gas: 41055)\n[PASS] test_revert_shortCalldataForTransfer() (gas: 54134)\n[PASS] test_revert_transferFromSelfWithoutApproval() (gas: 93383)\n[PASS] test_revert_transferFromToZeroAddress() (gas: 151351)\n[PASS] test_revert_transferFromZeroAddressOwner() (gas: 63664)\n[PASS] test_revert_transferFromZeroAddressSpender() (gas: 93137)\n[PASS] test_revert_transferMaxUint() (gas: 38169)\n[PASS] test_revert_transferSupplyPlusOne() (gas: 38096)\n[PASS] test_revert_unknownSelector() (gas: 29727)\n[PASS] test_revertedTransferEmitsNothing() (gas: 39010)\n[PASS] test_supplyFitsComfortablyBelowOverflow() (gas: 20969)\n[PASS] test_transferFromEmitsOnlyTransfer() (gas: 180608)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 205312)\n[PASS] test_transferFromToOwnerKeepsBalanceAndSpendsAllowance() (gas: 164715)\n[PASS] test_transferFromZeroAmountWithoutApprovalSucceeds() (gas: 53216)\n[PASS] test_zeroTransferStillEmits() (gas: 43876)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 90.60ms (849.67ms CPU time)\n\nRan 3 tests for test/DogHoodToken.invariant.t.sol:DogHoodTokenInvariantTest\n[PASS]\nDogHoodTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchGhost\n[PASS] invariant_balancesMatchGhostFlows\n[PASS] invariant_balancesSumToSupply\n[PASS] invariant_outflowsEqualInflows\n[PASS] invariant_tokenHoldsNoEther\n[PASS] invariant_totalSupplyNeverChanges\n DogHoodTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+--------------------------------+-------+---------+----------╮\n| Contract       | Selector                       | Calls | Reverts | Discards |\n+==============================================================================+\n| DogHoodHandler | approve                        | 1006  | 0       | 0        |\n|----------------+--------------------------------+-------+---------+----------|\n| DogHoodHandler | privilegedCall                 | 1015  | 0       | 0        |\n|----------------+--------------------------------+-------+---------+----------|\n| DogHoodHandler | sendEther                      | 991   | 0       | 0        |\n|----------------+--------------------------------+-------+---------+----------|\n| DogHoodHandler | transfer                       | 1040  | 0       | 0        |\n|----------------+--------------------------------+-------+---------+----------|\n| DogHoodHandler | transferExceedingBalance       | 1048  | 0       | 0        |\n|----------------+--------------------------------+-------+---------+----------|\n| DogHoodHandler | transferFrom                   | 995   | 0       | 0        |\n|----------------+--------------------------------+-------+---------+----------|\n| DogHoodHandler | transferFromExceedingAllowance | 1072  | 0       | 0        |\n|----------------+--------------------------------+-------+---------+----------|\n| DogHoodHandler | transferToZeroAddress          | 1025  | 0       | 0        |\n╰----------------+--------------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 3\n  Bound result 0\n  Bound result 2\n  Bound result 1\n  Bound result 4\n  Bound result 6000000000000000000\n  Bound result 0\n  Bound result 1232818376470682585\n  Bound result 1\n  Bound result 4\n  Bound result 2\n  Bound result 60161040849034551390\n  Bound result 4\n  Bound result 40000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 2\n  Bound result 1024238409\n  Bound result 1\n  Bound result 0\n  Bound result 4\n  Bound result 5\n  Bound result 4\n  Bound result 2514000706\n  Bound result 0\n  Bound result 1\n  Bound result 5\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 4\n  Bound result 1960493495140405340324157171\n  Bound result 0\n  Bound result 42\n  Bound result 3\n  Bound result 3\n  Bound result 0\n  Bound result 9223\n  Bound result 3\n  Bound result 0\n  Bound result 14365\n  Bound result 3\n  Bound result 3\n  Bound result 452083006291809372909863370\n  Bound result 4\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 7\n  Bound result 3\n  Bound result 0\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 0\n  Bound result 1\n  Bound result 5\n  Bound result 0\n  Bound result 1\n  Bound result 2\n  Bound result 4\n  Bound result 757250949140098219039260673\n  Bound result 1\n  Bound result 4\n  Bound result 42\n  Bound result 3\n  Bound result 3\n  Bound result 6\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 392196806302832112923220196\n  Bound result 3\n  Bound result 4\n  Bound result 250\n  Bound result 4\n  Bound result 5\n  Bound result 2138\n  Bound result 5\n  Bound result 5\n  Bound result 0\n  Bound result 3\n  Bound result 2\n  Bound result 14364\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 11474\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 91941355100977523190113941\n  Bound result 5\n  Bound result 4\n  Bound result 18\n  Bound result 4\n  Bound result 0\n  Bound result 14763\n  Bound result 3\n  Bound result 1\n  Bound result 2\n  Bound result 2073\n  Bound result 0\n  Bound result 5\n  Bound result 4594636\n  Bound result 3\n  Bound result 3\n  Bound result 1704717255790685190736314230\n  Bound result 0\n  Bound result 4\n  Bound result 14406\n  Bound result 1\n  Bound result 2\n  Bound result 0\n  Bound result 1\n  Bound result 4\n  Bound result 242\n  Bound result 1\n  Bound result 3056207985\n  Bound result 0\n  Bound result 4\n  Bound result 1795\n  Bound result 5\n  Bound result 2\n  Bound result 13926\n  Bound result 3\n  Bound result 70048586448897548883\n  Bound result 4\n  Bound result 0\n  Bound result 2\n  Bound result 5\n  Bound result 4\n  Bound result 5000000000000000000\n  Bound result 1\n  Bound result 5\n  Bound result 2\n  Bound result 0\n  Bound result 4\n  Bound result 4\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 11000000000000000000\n  Bound result 2\n  Bound result 1\n  Bound result 5\n  Bound result 7668558808532172\n  Bound result 4\n  Bound result 3\n  Bound result 868\n  Bound result 4\n  Bound result 5\n  Bound result 1\n  Bound result 95\n  Bound result 3\n  Bound result 0\n  Bound result 5\n  Bound result 1\n  Bound result 0\n  Bound result 255\n  Bound result 2\n  Bound result 1683\n  Bound result 5\n  Bound result 1\n  Bound result 3\n  Bound result 45\n  Bound result 1\n  Bound result 5\n  Bound result 0\n  Bound result 5\n  Bound result 7\n  Bound result 4\n  Bound result 96\n  Bound result 5\n  Bound result 4\n  Bound result 2\n  Bound result 0\n  Bound result 1\n  Bound result 15\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n\n[PASS] test_everyPrivilegedSignatureIsRefusedFromEveryActor() (gas: 4715885)\nLogs:\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 2\n  Bound result 0\n  Bound result 1\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 4\n  Bound result 0\n  Bound result 1\n  Bound result 5\n  Bound result 0\n  Bound result 1\n  Bound result 6\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 0\n  Bound result 1\n  Bound result 8\n  Bound result 0\n  Bound result 1\n  Bound result 9\n  Bound result 0\n  Bound result 1\n  Bound result 10\n  Bound result 0\n  Bound result 1\n  Bound result 11\n  Bound result 0\n  Bound result 1\n  Bound result 12\n  Bound result 0\n  Bound result 1\n  Bound result 13\n  Bound result 0\n  Bound result 1\n  Bound result 14\n  Bound result 0\n  Bound result 1\n  Bound result 15\n  Bound result 1\n  Bound result 2\n  Bound result 0\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 2\n  Bound result 4\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 1\n  Bound result 2\n  Bound result 6\n  Bound result 1\n  Bound result 2\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 8\n  Bound result 1\n  Bound result 2\n  Bound result 9\n  Bound result 1\n  Bound result 2\n  Bound result 10\n  Bound result 1\n  Bound result 2\n  Bound result 11\n  Bound result 1\n  Bound result 2\n  Bound result 12\n  Bound result 1\n  Bound result 2\n  Bound result 13\n  Bound result 1\n  Bound result 2\n  Bound result 14\n  Bound result 1\n  Bound result 2\n  Bound result 15\n  Bound result 2\n  Bound result 3\n  Bound result 0\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 3\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 2\n  Bound result 3\n  Bound result 5\n  Bound result 2\n  Bound result 3\n  Bound result 6\n  Bound result 2\n  Bound result 3\n  Bound result 7\n  Bound result 2\n  Bound result 3\n  Bound result 8\n  Bound result 2\n  Bound result 3\n  Bound result 9\n  Bound result 2\n  Bound result 3\n  Bound result 10\n  Bound result 2\n  Bound result 3\n  Bound result 11\n  Bound result 2\n  Bound result 3\n  Bound result 12\n  Bound result 2\n  Bound result 3\n  Bound result 13\n  Bound result 2\n  Bound result 3\n  Bound result 14\n  Bound result 2\n  Bound result 3\n  Bound result 15\n  Bound result 3\n  Bound result 4\n  Bound result 0\n  Bound result 3\n  Bound result 4\n  Bound result 1\n  Bound result 3\n  Bound result 4\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 3\n  Bound result 3\n  Bound result 4\n  Bound result 4\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 3\n  Bound result 4\n  Bound result 6\n  Bound result 3\n  Bound result 4\n  Bound result 7\n  Bound result 3\n  Bound result 4\n  Bound result 8\n  Bound result 3\n  Bound result 4\n  Bound result 9\n  Bound result 3\n  Bound result 4\n  Bound result 10\n  Bound result 3\n  Bound result 4\n  Bound result 11\n  Bound result 3\n  Bound result 4\n  Bound result 12\n  Bound result 3\n  Bound result 4\n  Bound result 13\n  Bound result 3\n  Bound result 4\n  Bound result 14\n  Bound result 3\n  Bound result 4\n  Bound result 15\n  Bound result 4\n  Bound result 5\n  Bound result 0\n  Bound result 4\n  Bound result 5\n  Bound result 1\n  Bound result 4\n  Bound result 5\n  Bound result 2\n  Bound result 4\n  Bound result 5\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 4\n  Bound result 4\n  Bound result 5\n  Bound result 5\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 4\n  Bound result 5\n  Bound result 7\n  Bound result 4\n  Bound result 5\n  Bound result 8\n  Bound result 4\n  Bound result 5\n  Bound result 9\n  Bound result 4\n  Bound result 5\n  Bound result 10\n  Bound result 4\n  Bound result 5\n  Bound result 11\n  Bound result 4\n  Bound result 5\n  Bound result 12\n  Bound result 4\n  Bound result 5\n  Bound result 13\n  Bound result 4\n  Bound result 5\n  Bound result 14\n  Bound result 4\n  Bound result 5\n  Bound result 15\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 1\n  Bound result 5\n  Bound result 0\n  Bound result 2\n  Bound result 5\n  Bound result 0\n  Bound result 3\n  Bound result 5\n  Bound result 0\n  Bound result 4\n  Bound result 5\n  Bound result 0\n  Bound result 5\n  Bound result 5\n  Bound result 0\n  Bound result 6\n  Bound result 5\n  Bound result 0\n  Bound result 7\n  Bound result 5\n  Bound result 0\n  Bound result 8\n  Bound result 5\n  Bound result 0\n  Bound result 9\n  Bound result 5\n  Bound result 0\n  Bound result 10\n  Bound result 5\n  Bound result 0\n  Bound result 11\n  Bound result 5\n  Bound result 0\n  Bound result 12\n  Bound result 5\n  Bound result 0\n  Bound result 13\n  Bound result 5\n  Bound result 0\n  Bound result 14\n  Bound result 5\n  Bound result 0\n  Bound result 15\n\n[PASS] test_handlerPathsAreLive() (gas: 2829334)\nLogs:\n  Bound result 0\n  Bound result 1\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 2\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 3\n  Bound result 40000000000000000000\n  Bound result 3\n  Bound result 4\n  Bound result 1\n  Bound result 4\n  Bound result 3\n  Bound result 5\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 5\n  Bound result 1\n  Bound result 3\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 1000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.88s (4.88s CPU time)\n\nRan 3 test suites in 4.88s (5.06s CPU time): 66 tests passed, 0 failed, 0 skipped (66 total tests)\n","passed":true},{"durationMs":31,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DogHoodToken.approve(address,uint256)\",\"DogHoodToken.transfer(address,uint256)\",\"DogHoodToken.transferFrom(address,address,uint256)\"],\"files\":{\"README.md\":103,\"foundry.toml\":21,\"remappings.txt\":2,\"src/DogHoodToken.sol\":31,\"test/DogHoodToken.edges.t.sol\":424,\"test/DogHoodToken.invariant.t.sol\":406,\"test/DogHoodToken.t.sol\":321},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f2aa11231edc14e61abb452e44bf569c39bff6d7a4256e5751b988dbc5133094","verifiedTreeHash":"91dd4ff2038d0a6d02e7743316a2498bbe9642e8","verifierVersion":"0.1.0+7129bf9d"}]}