{"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":"d53dcb9a-432d-460c-8601-51e6d2d18cb9","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"9a88d4cc2cebbae98a673dca0e3b118225809a8fa67a396d3f8371100398fecc","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":"7e5ea8c63227c87a2e1fd35e9b8ca49187a6aec33c780b2fe8fd4b0a1874d6f1","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":"8fb73c788fdb2f2e4f046fdebb8ec2404688a3488a4bac951b59396b0ef268f2","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":"8149d6d825aed7618a1935e6624587fa5d2fa349b5ab128fb99b0e6d8a50f362","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":"feeec4b9a90f64b7f4712f85c72cb0c682e98187398d0d886d3c2cab0801fe13","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":"01fc17272441396813ddb5c78714d6b86b0894231d3f6c5a0fb95187a8e577ac","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":"d0baa0f80aa2560be719d39c9859df03493ea98c16933114f72774559701c95d","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"ad74efc7a1045c655db32b03b4db39b76355d2c5849c9cba76a74a752d95b4fc","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: Sooth Protocol (SOOTH).\nToken name: Sooth Protocol\nToken symbol: SOOTH\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"e3b3058a4b0fa895e4ae5cadc83e583276e1a132a797509072d720437b8962f6","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"d53dcb9a-432d-460c-8601-51e6d2d18cb9","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1755-sooth-protocol"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52252","feedbackHash":"051dea2ef085ba881cc163c6fc34b85a64d1a9d46198cb354a12933c776418b1","nodeKey":"audit_economics","submissionHash":"9a88d4cc2cebbae98a673dca0e3b118225809a8fa67a396d3f8371100398fecc","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51484","feedbackHash":"b69acb899965d7c2836171220017ec6fbe4cb6fd2292f65e4376cd2c960d2e3b","nodeKey":"audit_flow","submissionHash":"7e5ea8c63227c87a2e1fd35e9b8ca49187a6aec33c780b2fe8fd4b0a1874d6f1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51243","feedbackHash":"ced72e5a8f277f102bffd227317c7dcdf25d5d6cd272a1738911d2f948523cf2","nodeKey":"audit_judge","submissionHash":"8fb73c788fdb2f2e4f046fdebb8ec2404688a3488a4bac951b59396b0ef268f2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50952","feedbackHash":"7474e3f6e5380e6e8642e3c51e19b7fbf2009ced063372e10f10f1282f580972","nodeKey":"audit_math","submissionHash":"8149d6d825aed7618a1935e6624587fa5d2fa349b5ab128fb99b0e6d8a50f362","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50903","feedbackHash":"cfbf3bd54f163a1810edd95164423bbcdda2a315c4c16053826854251065ada8","nodeKey":"audit_permissions","submissionHash":"feeec4b9a90f64b7f4712f85c72cb0c682e98187398d0d886d3c2cab0801fe13","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51155","feedbackHash":"3a97b4fa610cd71300dde396f07dc5a13e21309f5f1a64da621bbc5b5f9727f1","nodeKey":"build_contract_project","submissionHash":"01fc17272441396813ddb5c78714d6b86b0894231d3f6c5a0fb95187a8e577ac","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51064","feedbackHash":"986c3817744caa63d95fa3e54a66bd6da73ea58d6ef4a8927ee412c68ecb0acf","nodeKey":"manifest","submissionHash":"d0baa0f80aa2560be719d39c9859df03493ea98c16933114f72774559701c95d","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52233","feedbackHash":"be451cf29cd9cd4859ab577b7a17ffb7d433f13a2cc26a88fade8194c6479e9e","nodeKey":"write_foundry_tests","submissionHash":"ad74efc7a1045c655db32b03b4db39b76355d2c5849c9cba76a74a752d95b4fc","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"d02be6ffe469f658005e9cca75fdd0e9711ccc13286564b4efab3e7c103de887","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"0271b83854e3dd26087cc047f164fa9308f032c032ee6f6c3a660ad27d3628e5","device":"a84da3707fa87187","findings":[],"hash":"01fc17272441396813ddb5c78714d6b86b0894231d3f6c5a0fb95187a8e577ac","nodeId":"d02444d2-926f-4c39-a80f-34cb2d5ab9f9","outcome":"completed","summary":"Implemented [SoothToken.sol](/home/imd/.identitymd/work/d53dcb9a-432d-460c-8601-51e6d2d18cb9/d02444d2-926f-4c39-a80f-34cb2d5ab9f9/src/SoothToken.sol): Sooth Protocol (SOOTH), with 1 billion tokens, 18 decimals, minted once to the deployer.\n\nAdded vendored dependencies, success/failure tests, fuzz tests, invariants, and deployment documentation.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passes.\n- `forge test` passes: 33 tests using the required seed.\n- `forge fmt --check` passes.\n- Clean offline build and parallel tests pass.","treeHash":"e38e46aab87cb7ea41c89a883a6cd10bddca9242","usage":{"cachedInputTokens":580096,"inputTokens":68009,"model":"gpt-6-astra","outputTokens":15205,"runtime":"codex","turns":5,"wallClockMs":402999}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6ed09c2eb1ff6aec","findings":[],"hash":"7e5ea8c63227c87a2e1fd35e9b8ca49187a6aec33c780b2fe8fd4b0a1874d6f1","nodeId":"b95eb08d-e930-4230-84b7-68bb1d5a1942","outcome":"completed","summary":"I found no defects in SoothToken, and `.imd-findings.json` has an empty findings list plus a coverage row for each entry point.\n\nThe token is `src/SoothToken.sol`, a plain OpenZeppelin ERC20 with nothing changed. Its constructor mints `INITIAL_SUPPLY = 1_000_000_000 * 10 ** 18` once, to `msg.sender` (the factory). It has no owner, no mint or burn after deployment, no transfer hooks, fees or pause, and no external calls, so the Execution Trace and Periphery guides have nothing to trace beyond OpenZeppelin's own logic. On First Principles, the supply can't grow, and the launch transfers (to the distributor, into the pool, and swaps) each move exactly the amount sent.\n\nCoverage, all `holds`:\n- **`approve(address,uint256)`:** sets the allowance and reverts on a zero address; no side effects.\n- **`transfer(address,uint256)`:** checks the balance before debiting and credits the exact amount.\n- **`transferFrom(address,address,uint256)`:** reduces the allowance (except an unlimited one) and reverts when it is too small.\n- **Fixed-supply invariant:** the whole supply is minted only in the constructor, to the deployer.\n\nThe project's existing tests pass (33 of 33 from `forge test`). The static-analysis lead, aderyn's \"large numeric literal\" at line 10, is only a style note: the value is the intended 10²⁷ base units, which is 1,000,000,000 SOOTH at 18 decimals. I didn't run the protected harness tests myself. I read their assertions and the code meets them. No files in the repository were changed apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":130908,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":1508,"runtime":"claude","turns":4,"wallClockMs":37102}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ce6eaff570c608ab","findings":[{"citation":"resolved","description":"Outside the math area; reported because it is a reproducible inconsistency in the project's own provenance record. README.md line 114 says the Forge Standard Library sources are 'vendored without modification' and that DEPENDENCIES.json records their per-file SHA-256. The six OpenZeppelin files match their recorded hashes, and the forge-std v1.9.7 archive matches its recorded archive hash (45157353ab49...). But seven vendored forge-std files do not match the per-file hashes recorded for them: src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol. A diff against the upstream v1.9.7 archive shows only whitespace changes (multi-line function signatures collapsed to one line, as forge fmt does); no semantic change. forge-std is test-only and is not part of the deployed bytecode, so there is no on-chain impact, but anyone following the README's verification path by hashing the vendored files will get a mismatch for these seven files. Fix: either re-vendor the seven files byte-for-byte from the v1.9.7 archive, or regenerate the per-file hashes in DEPENDENCIES.json from the files actually committed and drop the 'without modification' claim for forge-std.","line":111,"path":"DEPENDENCIES.json","reproduction":"From the repository root run: sha256sum lib/forge-std/src/Vm.sol lib/forge-std/src/StdAssertions.sol. Expected (per DEPENDENCIES.json lines 111-112 and 59-60): 9068805b59ac1d0e... and d4c89eec70d267de.... Actual: a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15 and 3fbf4a025b4fc94eaca4c38c1f3dacb37bee10f12ee81994cfaf365ac1ce7384. Checking every entry in DEPENDENCIES.json with a short Python loop gives 7 mismatches, all under lib/forge-std/src/, and 0 mismatches under lib/openzeppelin-contracts/. diff against forge-std-1.9.7/src/Vm.sol (from the archive whose sha256 matches the recorded 45157353...) shows only line-wrapping differences, e.g. upstream line 827-830 'function getDeployment(string calldata contractName, uint64 chainId)\\n external\\n view\\n returns (address deployedAddress);' versus the vendored single line.","severity":"info","snippet":"        \"path\": \"lib/forge-std/src/Vm.sol\",\n        \"sha256\": \"9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1\"","title":"DEPENDENCIES.json records upstream forge-std hashes, but 7 vendored forge-std files were reformatted and no longer match"}],"hash":"8149d6d825aed7618a1935e6624587fa5d2fa349b5ab128fb99b0e6d8a50f362","nodeId":"d523b4c0-5926-4124-b9e3-b549b5507631","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. The math area is clean; the one item reported is an informational provenance note outside my area.\n\n**What I checked**\n\n- **Supply constant.** The literal on line 10 of `src/SoothToken.sol` evaluates at compile time to exactly 10^27, which equals one billion tokens at the live `decimals()` of 18 and matches the README, the test suite and the manifest. It is far below the uint128 ceiling, so no downcast in the v4 liquidity path can wrap it. The aderyn \"large numeric literal\" lead is style only.\n- **Transfer arithmetic.** The vendored OpenZeppelin v5.4.0 `_update` guards `fromBalance < value` before its unchecked subtraction, and the unchecked receiver addition cannot overflow because every balance is bounded by the fixed supply. Supply, supply plus one, and max-uint amounts all behave as specified.\n- **Allowance arithmetic.** Max-uint is infinite and untouched, max minus one is finite and decremented, an allowance equal to the amount reaches exactly zero, and an infinite allowance does not bypass the balance guard. Failed transfers roll the allowance decrement back.\n- **Zero and sentinel paths.** Zero-amount transfers are no-ops that still revert for a zero sender or receiver. Launch splits of 10, 80 and 10 percent divide 10^27 with no remainder.\n- **Evidence.** The project's 33 tests pass under the pinned fuzz seed, and a 12-test scratch suite covering the boundaries above passed before I removed it. All six vendored OpenZeppelin files match their recorded hashes.\n\n**Finding reported (info)**\n\nSeven vendored forge-std files do not match the per-file SHA-256 values in `DEPENDENCIES.json`, although the README says they are vendored without modification. A diff against the upstream v1.9.7 archive, whose hash does match the record, shows only line-wrapping changes. No deployed bytecode is affected. The fix is to re-vendor those files byte-for-byte or regenerate the recorded hashes.\n\n**Coverage**\n\nAll three entry points, `approve`, `transfer` and `transferFrom`, are marked `holds`, with four additional rows for the supply, conservation and launch-split invariants and the static-analysis lead. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":765379,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14551,"runtime":"claude","turns":22,"wallClockMs":209098}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"76e5f9ed417094cc","findings":[{"citation":"resolved","description":"Merged from audit_math and audit_permissions (same root cause). README.md line 114 states the OpenZeppelin and Forge Standard Library sources are 'vendored without modification' and that DEPENDENCIES.json records their per-file SHA-256 hashes. I re-verified every entry: all 6 OpenZeppelin files are byte-identical to the upstream v5.4.0 archive (archive sha256 b89829be... matches the recorded value), but 7 of the 30 recorded forge-std files do not hash to their recorded values: src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol. I downloaded the upstream forge-std v1.9.7 archive (sha256 45157353ab49... matches DEPENDENCIES.json line 40) and diffed each mismatched file with all whitespace stripped: every diff is empty, so the changes are line-wrapping only (multi-line signatures joined to one line, as forge fmt at line_length 120 produces). forge-std is test-only and is not part of SoothToken's creation or runtime bytecode, so there is no on-chain or funds impact. The defect is in the provenance record: a reviewer following the README's verification path gets 7 hash mismatches and cannot confirm the test library's integrity without diffing by hand. Fix: either restore the 7 files byte-for-byte from the v1.9.7 archive so the recorded hashes hold, or regenerate the per-file hashes from the committed files and change the README to say forge-std was reformatted.","line":111,"path":"DEPENDENCIES.json","reproduction":"State: the committed tree at HEAD (e104922). Run from the repository root: `sha256sum lib/forge-std/src/Vm.sol`. Expected (DEPENDENCIES.json line 112): 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1. Actual: a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15. A Python loop hashing every `path` in DEPENDENCIES.json against its `sha256` reports 36 files, 7 mismatches, all under lib/forge-std/src/, 0 under lib/openzeppelin-contracts/. With the upstream archive extracted to /tmp/fstd/forge-std-1.9.7: `diff -q <(tr -d ' \\t\\n' < lib/forge-std/src/Vm.sol) <(tr -d ' \\t\\n' < /tmp/fstd/forge-std-1.9.7/src/Vm.sol)` prints nothing (identical ignoring whitespace), and the same holds for the other six files; a plain `diff` shows only lines such as upstream 827-830 `function getDeployment(string calldata contractName, uint64 chainId)\\n external\\n view\\n returns (address deployedAddress);` collapsed to one line in the vendored copy.","severity":"info","snippet":"        \"path\": \"lib/forge-std/src/Vm.sol\",\n        \"sha256\": \"9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1\"","title":"DEPENDENCIES.json per-file hashes do not match seven vendored forge-std files (whitespace-only reformatting); README's 'vendored without modification' claim fails for forge-std"}],"hash":"8fb73c788fdb2f2e4f046fdebb8ec2404688a3488a4bac951b59396b0ef268f2","nodeId":"03917a01-ec55-4357-8df8-89023f6da491","outcome":"completed","summary":"Review complete. The findings file is written and no tracked files were changed.\n\n**Outcome:** The Sooth Protocol token is sound. One info-level finding survives, merged from the two specialists who reported the same root cause.\n\n**What I verified**\n\n- **Token code:** `src/SoothToken.sol` is a bare OpenZeppelin v5.4.0 ERC20 with a no-argument constructor minting 10^27 units once to the deployer. The ABI has only three state-changing entry points. I traced approve, transfer and transferFrom through the vendored ERC20 and each holds: correct zero-address and balance/allowance reverts, exact amounts moved, atomic failure, no hooks, fees, burns or external calls.\n- **Vendored dependencies:** All six OpenZeppelin files are byte-identical to the upstream v5.4.0 archive, which I downloaded and hashed. So the token's behaviour rests on genuine library code.\n- **Deployability:** Build succeeds with the pinned compiler. Runtime is 1753 bytes, creation 2645 bytes. An opcode-level scan finds no DELEGATECALL, CALLCODE, SELFDESTRUCT or CALL family instructions.\n- **Tests:** The project's 49 unit, fuzz and invariant tests pass with the README's seed, and `forge fmt --check` is clean.\n- **Manifest:** `launch.json` uses only schema keys, the supply string matches the mint, constructor arguments are empty as the constructor requires, and addresses are lowercase.\n\n**The one kept finding (info):** Seven vendored forge-std files do not match the hashes recorded in `DEPENDENCIES.json`, contradicting the README's claim that libraries were vendored without modification. I confirmed against the upstream v1.9.7 archive that every difference is whitespace only. forge-std is test-only, so there is no on-chain impact. The fix is to either restore the seven files byte-for-byte or re-record the hashes and correct the README wording.\n\n**Dropped:** nothing else was reported by the specialists or the tester, and the static analysis leads (aderyn's large numeric literal) are stylistic, not defects. My own pass found no additional issues.\n\nThe coverage record answers all three entry points as `holds`, plus three invariant rows for the constructor and supply, the opcode and size floor, and the manifest.","treeHash":null,"usage":{"cachedInputTokens":601183,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":9049,"runtime":"claude","turns":12,"wallClockMs":133465}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c0fc4ea4f50e3380","findings":[],"hash":"9a88d4cc2cebbae98a673dca0e3b118225809a8fa67a396d3f8371100398fecc","nodeId":"c7db0dc5-ea2f-46a0-be00-0bbc3931c9b0","outcome":"completed","summary":"The review is complete. The findings file is valid JSON with zero findings and nine coverage rows, and no tracked file was changed.\n\n**Outcome: no defects found in the assigned area.** SOOTH is a plain fixed-supply token built on an unmodified OpenZeppelin v5.4.0 ERC20, and every failure mode in the Economic Security, Invariant and Flow Gap guides either does not apply or is blocked by a guard I traced.\n\nWhat I verified:\n\n- **Library provenance.** The vendored ERC20.sol and Context.sol match the hashes in DEPENDENCIES.json and are verbatim OpenZeppelin v5.4.0. There is nothing custom in the transfer path.\n- **Entry points.** The compiled ABI has exactly three state-changing functions: approve, transfer and transferFrom. There is no receive, fallback, mint, burn, owner or pause path. All three rows are marked `holds`.\n- **Supply invariant.** The constructor mints 1e27 units once to msg.sender. Internal mint and burn have no external caller, and a transfer to the zero address reverts, so supply can neither grow nor shrink after launch. The aderyn large-literal lead is benign since the literal evaluates to the brief's supply.\n- **Launch flows.** The token takes no fee and has no exemption list because it needs none. The factory-to-distributor transfer, the claim, the pool seed and swaps each way all move exactly what they say. A privileged caller without allowance cannot move a holder's balance.\n- **Economic surface.** No oracle, no external call, no ETH acceptance, no blacklist or pause. The ERC-20 allowance replacement race exists but is inherent to the standard and documented in the README, so I did not report it as a defect.\n- **Tests.** The project's 33 unit, fuzz and invariant tests pass under the pinned seed.\n\nOne coverage row is `unreached`: launch.json does not exist yet because the manifest step runs after this review. The README's stated values for contract name, decimals, empty constructor arguments and total supply match the compiled contract, so the later manifest should be straightforward.","treeHash":null,"usage":{"cachedInputTokens":567485,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":9641,"runtime":"claude","turns":23,"wallClockMs":146943}},{"artifacts":[],"attempt":1,"bundleHash":"dc1c3f810020218c87cb72df33cb4f321303c94d13a90b521cb339373169021c","device":"0da932e4a0b9bd4a","findings":[],"hash":"ad74efc7a1045c655db32b03b4db39b76355d2c5849c9cba76a74a752d95b4fc","nodeId":"22da991d-7a53-4586-b9a1-d44d167fe7b1","outcome":"completed","summary":"Added 16 boundary, failure-path, and fuzz tests, and expanded the stateful invariant handler to 12 actions.\n\n`forge build` and `forge test` pass offline with the supplied seed: **49 tests passed**, including **32,768 invariant calls**.\n\nNo confirmed implementation defects found. Only files under `test/` changed.","treeHash":"0fc28a608c007dcdb8dcf925f910c83980c0fac8","usage":{"cachedInputTokens":495104,"inputTokens":73513,"model":"gpt-6-astra","outputTokens":10120,"runtime":"codex","turns":5,"wallClockMs":295485}},{"artifacts":[],"attempt":1,"bundleHash":"d5b0317e4177bcdd668dd3432914c241c9632e119763990b900694d2e3cb0900","device":"63274cc86a9400de","findings":[],"hash":"d0baa0f80aa2560be719d39c9859df03493ea98c16933114f72774559701c95d","nodeId":"2dd44a23-7d34-402a-924a-8e9b8f7cc9b2","outcome":"completed","summary":"I wrote launch.json for the Sooth Protocol launch, and it is the only changed file.\n\n**What the manifest says**\n- Kind is custom_token, with token contract SoothToken, name Sooth Protocol, symbol SOOTH, 18 decimals.\n- Constructor arguments are empty, matching the compiled ABI, which has no constructor inputs.\n- Total supply is one billion tokens in minor units, exactly what the constructor mints to msg.sender.\n- Contracts list is empty, since the accepted tree contains only the token.\n- Pool and economics are copied exactly as the launch gives them: IMD pair address, fee 12500, tick spacing 60, the one-to-one provenance price, and the requester's economics object verbatim.\n- Notes describe the token's fixed supply, lack of privileged functions, and that all launch flows move exact amounts.\n\n**Verification**\n- forge build compiled cleanly.\n- forge test with the verifier's fuzz seed passed all 33 tests across both suites.\n- git status shows launch.json as the only new or changed file.","treeHash":"b9bf463f517710813759fea9d99c1ad0a7ff9e5f","usage":{"cachedInputTokens":170346,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":2486,"runtime":"claude","turns":8,"wallClockMs":50559}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"523ef565dd740e25","findings":[{"citation":"resolved","description":"README.md lines 113-114 state that the OpenZeppelin and Forge Standard Library sources are 'vendored without modification' and that DEPENDENCIES.json records their per-file SHA-256 hashes. All six OpenZeppelin files match their recorded hashes, and the recorded forge-std archive hash (45157353ab49...) matches the real v1.9.7 archive. But seven forge-std files in the tree do not hash to the values DEPENDENCIES.json records: src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol. Comparing each against the upstream v1.9.7 archive shows the differences are whitespace only (multi-line function signatures and one constant joined onto one line, consistent with a `forge fmt` pass at line_length 120), so the semantics of the test library are unchanged. The deployed token (src/SoothToken.sol and the OpenZeppelin files it imports) is not affected; forge-std is compiled into tests only. Impact: the provenance record the README tells a reviewer to rely on does not verify as written, so an independent check of the vendored tree fails and the reviewer must diff by hand, as this review did. This is outside the assigned permission area and carries no funds or access impact; it is reported because it is a concrete, reproducible discrepancy in the delivered tree. Fix: either restore the seven files byte-for-byte from the v1.9.7 archive (so the recorded hashes hold), or re-record the hashes of the files actually in the tree and soften the README claim to say the files were reformatted.","line":112,"path":"DEPENDENCIES.json","reproduction":"State: the committed tree at HEAD (3621c49). Input: `sha256sum lib/forge-std/src/Vm.sol` -> a1b1c82924aecf0f... Expected (DEPENDENCIES.json line 112, and the file in the v1.9.7 archive whose sha256 45157353ab49eab01d294565866731e599b32401757229689ee459aa26b7ee94 matches line 40): 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1. Actual: mismatch. Running the same check over every entry in DEPENDENCIES.json yields 7 mismatches out of 36 files, all under lib/forge-std/src/; `diff <(tr -d ' \\t\\n' < lib/forge-std/src/Vm.sol) <(tr -d ' \\t\\n' < <upstream v1.9.7>/src/Vm.sol)` is empty for every mismatched file, proving the differences are whitespace only.","severity":"info","snippet":"        \"sha256\": \"9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1\"","title":"DEPENDENCIES.json records upstream forge-std hashes that seven vendored test-library files in the tree do not match (whitespace-only reformatting); README's 'vendored without modification' claim fails"}],"hash":"feeec4b9a90f64b7f4712f85c72cb0c682e98187398d0d886d3c2cab0801fe13","nodeId":"12074bd4-d06d-4706-8325-3f30e9c2a482","outcome":"completed","summary":"The review is complete and the findings file is written. Nothing else is pending: the only repository file I created is `.imd-findings.json`, the working tree is otherwise clean, and no scratch tests were needed because nothing rose to high or critical.\n\n**Outcome.** The permission model of Sooth Protocol (SOOTH) holds. The token is the unmodified OpenZeppelin v5.4.0 ERC-20 with a constructor that mints the whole supply once to the deployer. There are no roles, modifiers, initializers, hooks, exemption lists, receive or fallback paths, and no inherited mint, burn or permit functions. The compiled ABI exposes exactly the three listed entry points as state-changing functions.\n\n**What I checked in the assigned area**\n- **Access Control.** Mapped every writer of each storage slot. Balances are written only through the shared update path, allowances only by the owner's own approve or the spender's own transferFrom. No slot has two writers with different guards. The deployer and factory hold no power over other holders after construction.\n- **Asymmetry.** Compared transfer against transferFrom and approve against the allowance-spending path. Validation, storage writes and revert behaviour mirror each other. The infinite-allowance branch is the documented OpenZeppelin behaviour.\n- **Trust Gap.** With no privileged actor and no economic formula, there is no seam where authorization, economics and asymmetry can interact.\n\n**Evidence.** All 33 project tests pass under the README's fuzz seed, including the invariant campaign. The six vendored OpenZeppelin files match their recorded SHA-256 hashes. The runtime bytecode contains no delegatecall, callcode or selfdestruct.\n\n**One finding, severity info, outside the assigned area.** The README says the vendored forge-std sources are unmodified and points to DEPENDENCIES.json for hashes. Seven forge-std files in the tree do not match those hashes. I fetched the real v1.9.7 archive, whose hash does match the record, and confirmed every difference is whitespace only. This affects test tooling, not the deployed token. The fix is to restore the seven files byte-for-byte or to re-record the hashes and reword the README.\n\n**Leads from static analysis.** The single aderyn note on the large numeric literal is a compile-time constant equal to the brief's supply and is not a defect.\n\n**Coverage.** Nine rows are recorded: the three entry points, the constructor, four invariants, and the provenance row tied to the finding. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":615111,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":13944,"runtime":"claude","turns":31,"wallClockMs":242876}}],"verification":[{"checks":[{"durationMs":1132,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.06s\nCompiler run successful!\n","passed":true},{"durationMs":3618,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/SoothToken.t.sol:SoothTokenTest\n[PASS] testFuzz_delegatedTransferConservesSupplyAndAllowance(uint256,uint256) (runs: 1024, μ: 163091, ~: 165232)\nLogs:\n  Bound result 9036545615012374527\n  Bound result 1092542877771701093\n\n[PASS] testFuzz_infiniteAllowanceIsNotConsumed(uint256) (runs: 1024, μ: 158163, ~: 158389)\nLogs:\n  Bound result 18\n\n[PASS] testFuzz_transferAboveAllowanceReverts(uint256,uint256) (runs: 1024, μ: 123426, ~: 123851)\nLogs:\n  Bound result 337799013276193526928413086\n  Bound result 989689194784298822547451689\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 1024, μ: 127287, ~: 127542)\nLogs:\n  Bound result 322636723898904472\n  Bound result 103287392762525694846174584868054232872934640846522142900115968907732\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 1024, μ: 92986, ~: 93141)\nLogs:\n  Bound result 690744248463801857211836569\n\n[PASS] testFuzz_transferToZeroAddressReverts(uint256) (runs: 1024, μ: 47845, ~: 47792)\n[PASS] test_approvalDoesNotRequireBalance() (gas: 78682)\n[PASS] test_approveEmitsEventAndReplacesAllowance() (gas: 119454)\n[PASS] test_approveZeroSpenderReverts() (gas: 37612)\n[PASS] test_constructorEmitsExactlyOneMintEvent() (gas: 9620)\n[PASS] test_deployerAndStrangerHaveNoMintBurnOrAdminPowers() (gas: 1150327)\n[PASS] test_entireSupplyCanMoveAndMoveBack() (gas: 149166)\n[PASS] test_factoryReceivesSupplyInsteadOfCallerOrOrigin() (gas: 227038)\n[PASS] test_insufficientBalanceRollsBackAllowanceSpending() (gas: 126609)\n[PASS] test_invalidReceiverRollsBackAllowanceSpending() (gas: 125031)\n[PASS] test_launchDistributionAndClaimTransfersAreExact() (gas: 443302)\n[PASS] test_metadataAndEntireSupply() (gas: 107627)\n[PASS] test_nativeCurrencyAndUnknownCallsAreRejected() (gas: 64689)\n[PASS] test_revocationPreventsFurtherSpending() (gas: 129159)\n[PASS] test_runtimeHasNoForbiddenOpcodesOrOversizedCode() (gas: 786499)\n[PASS] test_selfTransferPreservesBalance() (gas: 51410)\n[PASS] test_selfTransferStillRequiresBalance() (gas: 35930)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 93461)\n[PASS] test_transferFromCannotUseAnotherSpendersAllowance() (gas: 103572)\n[PASS] test_transferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 244673)\n[PASS] test_transferFromSelfStillRequiresAllowance() (gas: 35685)\n[PASS] test_transferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103700)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 80742)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 120476)\n[PASS] test_transferToContractNeedsNoReceiverCallback() (gas: 217535)\n[PASS] test_zeroAddressCannotBeUsedAsMintSource() (gas: 56838)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73345)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 43.91ms (259.00ms CPU time)\n\nRan 1 test for test/SoothToken.invariant.t.sol:SoothTokenInvariantTest\n[PASS]\nSoothTokenInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchTheModel\n[PASS] invariant_supplyIsFixedAndAllTokensAreAccountedFor\n SoothTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------------+--------------------------+-------+---------+----------╮\n| Contract          | Selector                 | Calls | Reverts | Discards |\n+===========================================================================+\n| SoothTokenHandler | approve                  | 3326  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transfer                 | 3225  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transferFrom             | 3217  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transferTooMuch          | 3283  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | unauthorizedTransferFrom | 3333  | 0       | 0        |\n╰-------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1055\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 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 7\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 20\n  Bound result 4233\n  Bound result 999999995000000000000005268\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.54s (3.54s CPU time)\n\nRan 2 test suites in 3.54s (3.58s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":52,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SoothToken.approve(address,uint256)\",\"SoothToken.transfer(address,uint256)\",\"SoothToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":164,\"LICENSE\":21,\"README.md\":125,\"foundry.toml\":19,\"remappings.txt\":2,\"src/SoothToken.sol\":17,\"test/SoothToken.invariant.t.sol\":121,\"test/SoothToken.t.sol\":386},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":432,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":238,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SoothToken.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"01fc17272441396813ddb5c78714d6b86b0894231d3f6c5a0fb95187a8e577ac","verifiedTreeHash":"e38e46aab87cb7ea41c89a883a6cd10bddca9242","verifierVersion":"0.1.0+67c588fa"},{"checks":[{"durationMs":2772,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.55s\nCompiler run successful!\n","passed":true},{"durationMs":10938,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 16 tests for test/SoothToken.edge.t.sol:SoothTokenEdgeTest\n[PASS] testFuzz_balanceFailureRollsBackDelegatedSpend(uint256,uint256,bool) (runs: 1024, μ: 218460, ~: 219730)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 255\n\n[PASS] testFuzz_delegatedSelfTransferRequiresRealBalance(uint256,uint256) (runs: 1024, μ: 192414, ~: 192749)\nLogs:\n  Bound result 949728202043042031326543673\n  Bound result 34249973523354631\n\n[PASS] testFuzz_reapprovalReplacesRatherThanAdds(uint256,uint256) (runs: 1024, μ: 179326, ~: 179446)\n[PASS] testFuzz_roundTripRestoresBalancesButConsumesFiniteAllowance(uint256,uint256) (runs: 1024, μ: 213614, ~: 213649)\nLogs:\n  Bound result 211\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639904\n\n[PASS] testFuzz_splitDelegatedSpendMatchesSingleSpend(uint256,uint256,uint256) (runs: 1024, μ: 375748, ~: 376812)\nLogs:\n  Bound result 10299624042755558495157996\n  Bound result 2012908777082960038821287\n  Bound result 20358736400318931632356534852130204978737491456653801880744\n\n[PASS] test_allowancesAreScopedToBothOwnerAndSpender() (gas: 524829)\n[PASS] test_exhaustedAllowanceCannotBeReplayedAfterTokensReturn() (gas: 224698)\n[PASS] test_infiniteAllowanceCanBeReplacedAndRevokedAfterUse() (gas: 362021)\n[PASS] test_largestFiniteAllowanceIsDecremented() (gas: 153557)\n[PASS] test_maximumDelegatedTransferCannotUseInfiniteApprovalAsBalance() (gas: 129461)\n[PASS] test_maximumDirectTransferRevertsWithoutWrapping() (gas: 65378)\n[PASS] test_oneWeiCanMoveDirectlyAndThroughAnAllowance() (gas: 222840)\n[PASS] test_ownerCanTransferFromWithItsOwnFiniteApproval() (gas: 169295)\n[PASS] test_zeroDelegatedTransferEmitsEventAndPreservesExistingAllowance() (gas: 139669)\n[PASS] test_zeroReceiverRejectsBoundaryAmountsWithoutBurning() (gas: 442354)\n[PASS] test_zeroSpenderRejectsZeroAndMaximumApprovals() (gas: 114918)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 127.15ms (537.35ms CPU time)\n\nRan 32 tests for test/SoothToken.t.sol:SoothTokenTest\n[PASS] testFuzz_delegatedTransferConservesSupplyAndAllowance(uint256,uint256) (runs: 1024, μ: 162977, ~: 165232)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 9307\n\n[PASS] testFuzz_infiniteAllowanceIsNotConsumed(uint256) (runs: 1024, μ: 158202, ~: 158401)\nLogs:\n  Bound result 17664\n\n[PASS] testFuzz_transferAboveAllowanceReverts(uint256,uint256) (runs: 1024, μ: 123441, ~: 123851)\nLogs:\n  Bound result 0\n  Bound result 2\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 1024, μ: 127268, ~: 127560)\nLogs:\n  Bound result 67341223099494624921967643\n  Bound result 38652749886121717520689881591437084362\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 1024, μ: 93055, ~: 93141)\nLogs:\n  Bound result 690744248463801857211836569\n\n[PASS] testFuzz_transferToZeroAddressReverts(uint256) (runs: 1024, μ: 47847, ~: 47792)\n[PASS] test_approvalDoesNotRequireBalance() (gas: 78682)\n[PASS] test_approveEmitsEventAndReplacesAllowance() (gas: 119454)\n[PASS] test_approveZeroSpenderReverts() (gas: 37612)\n[PASS] test_constructorEmitsExactlyOneMintEvent() (gas: 9620)\n[PASS] test_deployerAndStrangerHaveNoMintBurnOrAdminPowers() (gas: 1150327)\n[PASS] test_entireSupplyCanMoveAndMoveBack() (gas: 149166)\n[PASS] test_factoryReceivesSupplyInsteadOfCallerOrOrigin() (gas: 227038)\n[PASS] test_insufficientBalanceRollsBackAllowanceSpending() (gas: 126609)\n[PASS] test_invalidReceiverRollsBackAllowanceSpending() (gas: 125031)\n[PASS] test_launchDistributionAndClaimTransfersAreExact() (gas: 443302)\n[PASS] test_metadataAndEntireSupply() (gas: 107627)\n[PASS] test_nativeCurrencyAndUnknownCallsAreRejected() (gas: 64689)\n[PASS] test_revocationPreventsFurtherSpending() (gas: 129159)\n[PASS] test_runtimeHasNoForbiddenOpcodesOrOversizedCode() (gas: 786499)\n[PASS] test_selfTransferPreservesBalance() (gas: 51410)\n[PASS] test_selfTransferStillRequiresBalance() (gas: 35930)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 93461)\n[PASS] test_transferFromCannotUseAnotherSpendersAllowance() (gas: 103572)\n[PASS] test_transferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 244673)\n[PASS] test_transferFromSelfStillRequiresAllowance() (gas: 35685)\n[PASS] test_transferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103700)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 80742)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 120476)\n[PASS] test_transferToContractNeedsNoReceiverCallback() (gas: 217535)\n[PASS] test_zeroAddressCannotBeUsedAsMintSource() (gas: 56838)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73345)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 127.13ms (620.39ms CPU time)\n\nRan 1 test for test/SoothToken.invariant.t.sol:SoothTokenInvariantTest\n[PASS]\nSoothTokenInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchTheModel\n[PASS] invariant_supplyIsFixedAndAllTokensAreAccountedFor\n SoothTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------------+--------------------------+-------+---------+----------╮\n| Contract          | Selector                 | Calls | Reverts | Discards |\n+===========================================================================+\n| SoothTokenHandler | approve                  | 2679  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | approveFinite            | 2751  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | approveUnlimited         | 2737  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | approveZeroSpender       | 2784  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | revokeAndRejectSpend     | 2692  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transfer                 | 2687  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transferFrom             | 2758  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transferFromToZero       | 2683  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transferFromTooMuch      | 2748  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transferToZero           | 2723  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transferTooMuch          | 2815  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | unauthorizedTransferFrom | 2711  | 0       | 0        |\n╰-------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 18\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 0\n  Bound result 2086\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 739\n  Bound result 1435\n  Bound result 63\n  Bound result 127\n  Bound result 491460923342184218035706888008750043977755113262\n  Bound result 0\n  Bound result 972\n  Bound result 18794263057438751\n  Bound result 0\n  Bound result 999999999981205736942559163\n  Bound result 6000000000000000000\n  Bound result 501\n  Bound result 4327494721009642571\n  Bound result 1449482789039052413829507378592740125893587012685000990255846130\n  Bound result 24576\n  Bound result 2000000000000000000\n  Bound result 7\n  Bound result 1731\n  Bound result 694632589215986198354010633\n  Bound result 0\n  Bound result 10\n  Bound result 1691\n  Bound result 127\n  Bound result 60\n  Bound result 242\n  Bound result 160\n  Bound result 110\n  Bound result 7\n  Bound result 267777225801151257\n  Bound result 0\n  Bound result 627\n  Bound result 418430673766\n  Bound result 36\n  Bound result 5030\n  Bound result 0\n  Bound result 0\n  Bound result 107477463\n  Bound result 2\n  Bound result 1672505697421031297\n  Bound result 4\n  Bound result 20\n  Bound result 10544\n  Bound result 536\n  Bound result 2\n  Bound result 0\n  Bound result 3422\n  Bound result 8330\n  Bound result 1131\n  Bound result 4\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.80s (10.78s CPU time)\n\nRan 3 test suites in 10.81s (11.05s CPU time): 49 tests passed, 0 failed, 0 skipped (49 total tests)\n","passed":true},{"durationMs":45,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SoothToken.approve(address,uint256)\",\"SoothToken.transfer(address,uint256)\",\"SoothToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":164,\"LICENSE\":21,\"README.md\":125,\"foundry.toml\":19,\"remappings.txt\":2,\"src/SoothToken.sol\":17,\"test/SoothToken.edge.t.sol\":289,\"test/SoothToken.invariant.t.sol\":208,\"test/SoothToken.t.sol\":386},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ad74efc7a1045c655db32b03b4db39b76355d2c5849c9cba76a74a752d95b4fc","verifiedTreeHash":"0fc28a608c007dcdb8dcf925f910c83980c0fac8","verifierVersion":"0.1.0+67c588fa"},{"checks":[{"durationMs":1233,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.14s\nCompiler run successful!\n","passed":true},{"durationMs":3621,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/SoothToken.t.sol:SoothTokenTest\n[PASS] testFuzz_delegatedTransferConservesSupplyAndAllowance(uint256,uint256) (runs: 1024, μ: 163091, ~: 165232)\nLogs:\n  Bound result 245427712418260010884\n  Bound result 6657068\n\n[PASS] testFuzz_infiniteAllowanceIsNotConsumed(uint256) (runs: 1024, μ: 158163, ~: 158389)\nLogs:\n  Bound result 244506647444859423042279583\n\n[PASS] testFuzz_transferAboveAllowanceReverts(uint256,uint256) (runs: 1024, μ: 123426, ~: 123851)\nLogs:\n  Bound result 18092\n  Bound result 999999999999999999999982471\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 1024, μ: 127287, ~: 127542)\nLogs:\n  Bound result 2276\n  Bound result 35658987784606569022678261332702094084\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 1024, μ: 92986, ~: 93141)\nLogs:\n  Bound result 833130534639153798149504595\n\n[PASS] testFuzz_transferToZeroAddressReverts(uint256) (runs: 1024, μ: 47845, ~: 47792)\n[PASS] test_approvalDoesNotRequireBalance() (gas: 78682)\n[PASS] test_approveEmitsEventAndReplacesAllowance() (gas: 119454)\n[PASS] test_approveZeroSpenderReverts() (gas: 37612)\n[PASS] test_constructorEmitsExactlyOneMintEvent() (gas: 9620)\n[PASS] test_deployerAndStrangerHaveNoMintBurnOrAdminPowers() (gas: 1150327)\n[PASS] test_entireSupplyCanMoveAndMoveBack() (gas: 149166)\n[PASS] test_factoryReceivesSupplyInsteadOfCallerOrOrigin() (gas: 227038)\n[PASS] test_insufficientBalanceRollsBackAllowanceSpending() (gas: 126609)\n[PASS] test_invalidReceiverRollsBackAllowanceSpending() (gas: 125031)\n[PASS] test_launchDistributionAndClaimTransfersAreExact() (gas: 443302)\n[PASS] test_metadataAndEntireSupply() (gas: 107627)\n[PASS] test_nativeCurrencyAndUnknownCallsAreRejected() (gas: 64689)\n[PASS] test_revocationPreventsFurtherSpending() (gas: 129159)\n[PASS] test_runtimeHasNoForbiddenOpcodesOrOversizedCode() (gas: 786499)\n[PASS] test_selfTransferPreservesBalance() (gas: 51410)\n[PASS] test_selfTransferStillRequiresBalance() (gas: 35930)\n[PASS] test_transferEmitsEventAndMovesExactAmount() (gas: 93461)\n[PASS] test_transferFromCannotUseAnotherSpendersAllowance() (gas: 103572)\n[PASS] test_transferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 244673)\n[PASS] test_transferFromSelfStillRequiresAllowance() (gas: 35685)\n[PASS] test_transferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103700)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 80742)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 120476)\n[PASS] test_transferToContractNeedsNoReceiverCallback() (gas: 217535)\n[PASS] test_zeroAddressCannotBeUsedAsMintSource() (gas: 56838)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 73345)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 53.93ms (277.95ms CPU time)\n\nRan 1 test for test/SoothToken.invariant.t.sol:SoothTokenInvariantTest\n[PASS]\nSoothTokenInvariantTest invariants:\n[PASS] invariant_balancesAndAllowancesMatchTheModel\n[PASS] invariant_supplyIsFixedAndAllTokensAreAccountedFor\n SoothTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------------+--------------------------+-------+---------+----------╮\n| Contract          | Selector                 | Calls | Reverts | Discards |\n+===========================================================================+\n| SoothTokenHandler | approve                  | 3326  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transfer                 | 3225  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transferFrom             | 3217  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | transferTooMuch          | 3283  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| SoothTokenHandler | unauthorizedTransferFrom | 3333  | 0       | 0        |\n╰-------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1055\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 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 7\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 20\n  Bound result 4233\n  Bound result 999999995000000000000005268\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.52s (3.52s CPU time)\n\nRan 2 test suites in 3.52s (3.57s CPU time): 33 tests passed, 0 failed, 0 skipped (33 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SoothToken.approve(address,uint256)\",\"SoothToken.transfer(address,uint256)\",\"SoothToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":164,\"LICENSE\":21,\"README.md\":125,\"foundry.toml\":19,\"launch.json\":24,\"remappings.txt\":2,\"src/SoothToken.sol\":17,\"test/SoothToken.invariant.t.sol\":121,\"test/SoothToken.t.sol\":386},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d0baa0f80aa2560be719d39c9859df03493ea98c16933114f72774559701c95d","verifiedTreeHash":"b9bf463f517710813759fea9d99c1ad0a7ff9e5f","verifierVersion":"0.1.0+67c588fa"}]}