{"assessments":[],"deployments":[{"attestationHash":"9d0e51efcf3a33ccc913191019844dfd8d2b6b9162055d7dcf1ddd123c53997b","chainId":4663,"contracts":[{"address":"0x08ba8da349d3f5f8cd4366bf11020594a6d8077a","blockNumber":95488794,"name":"MerkleDistributor","role":"distributor","txHash":"0xccca5503ba6598587c4047742434a8c41a1e0c044994588491831e79260b7f2c"},{"address":"0xc665950e8825dbce6981b96e623667e828a4f955","blockNumber":95488794,"name":"SoothToken","role":"token","txHash":"0xccca5503ba6598587c4047742434a8c41a1e0c044994588491831e79260b7f2c"},{"address":"0x19bec7c2e1b2aadaf67b259744751a9960d66000","blockNumber":95488794,"name":"PoolInitializationGuard","role":"hook","txHash":"0xccca5503ba6598587c4047742434a8c41a1e0c044994588491831e79260b7f2c"}],"id":"a1e14a27-a677-4119-ab86-b25a2a2ad6cc","manifestHash":"a2f4c66067e79581868e8bba977f0e2ea288213d4b7dad6c707e0dbd608b7ff7","status":"live"}],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"029a2b67-9ef1-4229-9af1-eca91da1b09c","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"0f2e2540f45e742593125586f447ac12518452b58bcf5b0265627992f9340d50","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":"98d08cdcca679bffc5a05fa41eb085560983405c06b6674742c9a381f714cda7","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":"ecef890fd1cbf927ba65fb4ef998f2aba19b274cdca13d41749b3974c959959f","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":"9cf3b1a518cc039e478ede52543ae3babec5531b22068f78737cbbfcd8497126","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":"5db672d536e13b5f3bed22b9a849ec9db2c497e6dfc40f878f83b108c9e99704","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":"2a0826a4414d476da35c8b33ec849e36bbff04ed52190f2ab2431242438da0a1","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"dc8b1186ee185e34d069d27c9dabaefddfc02269eb7c5ec21aca89175e637458","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"b80d1cfc47257a65cf9985427cab7a810f4a0788c49bed66adfaa6d3ef7d56a4","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":"13bcf0a05e46ad87875675b7db355c11d3a8f959216fdb7c1645ca834777af26","previousHash":"24dfd310aa055c770d9a29f8b77c9abb785b516a82339d6f1d09e2020e0a5bec","projectId":"029a2b67-9ef1-4229-9af1-eca91da1b09c","publication":{"commit":"a2f091f6c954d00cd9e788ebc844258cb5bf2e4e","deliveredAt":"2026-10-22T23:22:05.917Z","repoUrl":"https://github.com/identity-md-launches/launch-2490-sooth-protocol"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"18dc6d6dbfe1ccec66a897d8c0d23f650fa0fd647eda8cd32d9bdee030645d8a","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dd2ee4882a1be950","findings":[],"hash":"0f2e2540f45e742593125586f447ac12518452b58bcf5b0265627992f9340d50","nodeId":"f84131b3-6b0c-4ba4-a908-f9da366690d0","outcome":"completed","summary":"Review complete. The findings file is written and valid, and no tracked file was modified.\n\n**Result: no defects found** in the Economic Security, Invariant and Flow Gap areas for SoothToken. The contract is an unmodified OpenZeppelin 5.4.0 ERC20 plus ERC20Permit with a single constructor mint and a decimals override, and I could not construct a failing input for any of the four entry points.\n\nWhat I verified, beyond reading:\n\n- **Library integrity.** All 22 OpenZeppelin files the token compiles against are byte-identical to the upstream v5.4.0 tag. The README calls them plain vendored files, so a tampered copy was the most plausible hidden defect, and there is none.\n- **Conservation invariants.** A scratch Foundry invariant suite ran 128,000 randomized transfer, transferFrom and permit calls with zero reverts. The sum of balances and totalSupply stayed at exactly 1e27 throughout, and allowance and nonce accounting were exact on every call.\n- **Permit domain.** DOMAIN_SEPARATOR equals the EIP-712 hash of name \"Sooth Protocol\", version \"1\", chain id 4663 and the token address, and it changes when the chain id changes, so signatures cannot replay across chains. Replay, expiry, wrong signer, tampered value and zero signature all revert.\n- **Launch flows.** The 10 percent swarm share, 80 percent pool seed and 10 percent remainder, a claim, and a trader round trip all move exactly the stated amounts from a factory-like deployer. The token taxes nothing, so no exemption list is needed.\n- **Fixed supply and no privilege.** The compiled ABI exposes only the four listed state-changing functions plus views. Mint-like, admin-like and freeze-like selectors revert from both the factory and a stranger, ETH sent to the token reverts, and the project's own 37 tests pass under the verifier's fuzz seed.\n\nThe static-analysis lead (aderyn's large numeric literal at line 30) resolves to the correct value 1e27, so it is not a defect.\n\nThe coverage record lists all four entry points as `holds` plus six invariant and dependency rows. The scratch test lives under test/scratch/, which is git-ignored and not part of the submission.","treeHash":null,"usage":{"cachedInputTokens":734853,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":16289,"runtime":"claude","turns":30,"wallClockMs":269162}},{"artifacts":[],"attempt":1,"bundleHash":"7ab2d9785337d8c788258e1d43d35a73a83eb98f9428e219b799f5f8a8a3ccc7","device":"f9cb4fd544aa3c68","findings":[],"hash":"2a0826a4414d476da35c8b33ec849e36bbff04ed52190f2ab2431242438da0a1","nodeId":"9e4f98f7-019f-4003-a6ba-4098dbf4d5d4","outcome":"completed","summary":"Done. The Sooth Protocol token is implemented, tested and committed as a root-level Foundry project.\n\n**What was built**\n\n- `src/SoothToken.sol`: contract `SoothToken`, an OpenZeppelin 5.4.0 ERC-20 with ERC-2612 permit. Name \"Sooth Protocol\", symbol \"SOOTH\", 18 decimals. The constructor takes no arguments and mints the full 1e27 minor units once to `msg.sender`, which at launch is the ProjectFactory. There is no owner, mint, pause, blocklist, fee or upgrade path, so it clears every rule in the protected floor test.\n- `test/SoothToken.t.sol`: 37 tests covering metadata, supply, transfers, allowances, permit success and failure paths, absence of mint and admin functions, the privileged-call probe from the protected test, a reachable-opcode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT, exact launch flows, and the deploy script. Two fuzz tests pass under the verifier's seed.\n- `script/DeploySoothToken.s.sol`: reference script with a `deploy()` function the tests call directly, and a `run()` wrapper. No environment reads.\n- `README.md`: assumptions, launch parameters, an empty \"After launch\" section since nothing is configurable, operational responsibilities, and test coverage.\n- `foundry.toml` pins solc 0.8.26, cancun, optimizer at 200 runs and `bytecode_hash = \"none\"`, with ffi off and no filesystem permissions.\n\n**Dependencies** are vendored as plain files under `lib/` (forge-std 1.17.0 and OpenZeppelin Contracts 5.4.0) with all git metadata removed. The index contains no submodule entries, and the built bytecode has no link placeholders.\n\n**Checks run locally**\n\n| Check | Result |\n| --- | --- |\n| forge build | passes |\n| forge test with the verifier's fuzz seed | 37 passed, 0 failed |\n| forge fmt --check | passes |\n\n**One judgment call to flag.** The brief asked only for a fixed-supply token. I included ERC-2612 permit as a standard, non-privileged convenience and documented it in the README. It can be removed by dropping the `ERC20Permit` parent if the requester wants the bare minimum.\n\nCommit `b54f9e2` on `main` holds the work. No launch.json was written, and no deployment was performed.","treeHash":"ceb7197167d54af16b1cd189a0d66b4ab0bf7c55","usage":{"cachedInputTokens":712366,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":21389,"runtime":"claude","turns":22,"wallClockMs":263558}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b57ae3a96321a0e1","findings":[{"citation":"resolved","description":"SoothToken inherits OpenZeppelin 5.4.0 ERC20Permit unchanged (vendored lib/ is byte-identical to upstream v5.4.0; verified by diff). permit(owner, spender, value, deadline, v, r, s) is callable by anyone holding a valid signature, as ERC-2612 specifies. Because the nonce is consumed on first use (lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol:55 `_useNonce(owner)`), an observer who sees a signed permit in the mempool can submit it first; the holder's (or an integrator's) later call with the same signature then reverts with ERC2612InvalidSigner. The allowance is still set exactly as signed and no balance moves, so the only effect is that a transaction bundling `permit` + `transferFrom` reverts once and must be resent without the permit. This is the documented behaviour of every OpenZeppelin ERC20Permit token and is not a defect in SoothToken; it is recorded here as the one trust observation in the Access Control / Trust Gap area so that application contracts or front-ends built on this token wrap `permit` in a try/catch (or check `allowance` first) rather than assuming their call will be the first. No change to the token is recommended.","line":19,"path":"src/SoothToken.sol","reproduction":"State: fresh SoothToken; signer S (key 0xA11CE) holds nothing; attacker A; spender alice. 1) S signs Permit(owner=S, spender=alice, value=5e18, nonce=0, deadline=now+1h) against token.DOMAIN_SEPARATOR(). 2) A calls token.permit(S, alice, 5e18, deadline, v, r, s) -> succeeds; allowance(S, alice) == 5e18; nonces(S) == 1. 3) alice calls token.permit(S, alice, 5e18, deadline, v, r, s) with the same signature -> reverts ERC2612InvalidSigner (nonce is now 1 so the recovered address differs). Expected per ERC-2612: exactly this. Observed: exactly this; allowance remains 5e18, balanceOf(alice) == 0. Reproduced in test/scratch/AccessProbe.t.sol::test_permitCanBeFrontRunButAllowanceIsStillSet (passes, i.e. confirms the behaviour).","severity":"info","snippet":"contract SoothToken is ERC20, ERC20Permit {","title":"permit() can be submitted by any third party ahead of the holder's own transaction (standard ERC-2612 front-running); no token fix required, integrators must tolerate it"}],"hash":"5db672d536e13b5f3bed22b9a849ec9db2c497e6dfc40f878f83b108c9e99704","nodeId":"65d3eafe-6cb0-4913-81b2-95370078510d","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. The working tree is clean apart from the gitignored scratch test and the findings file.\n\n**Outcome: no defect found in the assigned area.** The token is OpenZeppelin 5.4.0 `ERC20` plus `ERC20Permit` with a single constructor mint and a `decimals()` override, and it has no privileged surface at all.\n\n**What I verified**\n\n- **Vendored libraries are genuine.** The OpenZeppelin tree (319 files) and forge-std match upstream v5.4.0 and v1.17.0 byte for byte, so the inherited guards are the audited ones, not a tampered copy.\n- **Access control.** No owner, role, initializer, pause, blocklist, mint, burnFrom or upgrade selector exists in the compiled ABI. The only balance writers are `transfer` and `transferFrom`, both bound to the caller or an allowance the holder granted.\n- **Deployment phase.** The constructor mints exactly 1e27 to `msg.sender`. A CREATE2 deployment from a factory-like contract credits that contract with the whole supply, as the floor requires.\n- **Permit.** Deadline, nonce consumption, low-s malleability rejection, zero owner or spender rejection, and chain-id-aware domain separator all hold on the actual library lines and in scratch tests.\n- **Asymmetry and trust-gap seams.** Every paired function routes through the same internal helper with identical checks. There is no settable parameter, fee recipient or pricing formula, so no seam exists for a privileged actor to exploit.\n\n**Tests run.** The project's 37 tests pass with the verifier's fuzz seed, and 10 scratch probes in `test/scratch/AccessProbe.t.sol` pass. The protected pool-seed test could not be run here because it needs the floor harness and v4-core, but no transfer path treats any address differently, so the exact-amount flows hold by construction.\n\n**Reported.** One info-level note: anyone can submit a holder's signed permit first, which is standard ERC-2612 behaviour. The allowance is still set and nothing moves, so integrators should wrap `permit` in a try/catch. No token change is recommended.\n\n**Coverage record.** All four listed entry points have rows (three hold, permit references the info note), plus ten invariant rows covering the constructor, supply cap, launch flows, bytecode opcodes, vendored dependencies, deploy script, trust-gap seams and asymmetry pairs.","treeHash":null,"usage":{"cachedInputTokens":795097,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":17977,"runtime":"claude","turns":30,"wallClockMs":250359}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0476c44a80aa9574","findings":[],"hash":"98d08cdcca679bffc5a05fa41eb085560983405c06b6674742c9a381f714cda7","nodeId":"a45ceb95-533b-413d-8c77-71b6ab24d815","outcome":"completed","summary":"The review is complete. `.imd-findings.json` is written at the repository root with an empty findings list and eight coverage rows, and the working tree is otherwise untouched (scratch tests and build output removed).\n\n**Result: no defects found in the Execution Trace, Periphery and First Principles areas.** The token is a 44-line wrapper over OpenZeppelin 5.4.0 `ERC20` + `ERC20Permit` with one constructor mint and a `decimals()` override, and every path I traced behaves as the brief requires.\n\nWhat I checked, and how:\n\n- **Execution flow of all four entry points.** Traced `transfer`, `transferFrom`, `approve` and `permit` through OZ's `_update`, `_spendAllowance`, `_approve`, `ECDSA.recover` and `EIP712`. There are no external calls, hooks, payable functions or fallback, so no reentrancy, value-leak or stale-read surface exists. Amounts move exactly, so the swarm, seed and trader flows arrive whole.\n- **Edge inputs by scratch test.** Zero owner, zero spender, flipped-s (malleable) signatures, deadline boundary, chain-id change, infinite allowance, `transferFrom` with zero sender or without self-approval, ETH sends and unknown selectors all revert or behave correctly. A 2000-run fuzz confirmed sum of balances equals the supply after mixed transfers.\n- **Periphery integrity.** Diffed the vendored `lib/openzeppelin-contracts/contracts` against npm `@openzeppelin/contracts@5.4.0` and `lib/forge-std/src` against forge-std v1.17.0. No Solidity file differs, so the inherited code is genuine. The ECDSA high-s guard is present.\n- **First principles.** The supply constant folds to exactly 1e27 and matches the manifest; the constructor takes no arguments, so the CREATE2 address is deterministic and the whole supply lands on the factory. The storage layout is pure OZ, the ABI has only standard ERC-20/2612/5267 functions, and the existing opcode scan for `DELEGATECALL`/`SELFDESTRUCT` passes.\n\nThe static-analysis lead (a large numeric literal at line 30) is a style note only: the literal is the intended supply. The one thing outside my reach was running the protected floor test itself, which needs the verifier's environment variables; the project's own 37 tests and my probes pass under forge 1.8.3.","treeHash":null,"usage":{"cachedInputTokens":810674,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":16374,"runtime":"claude","turns":32,"wallClockMs":286684}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fb1af3f11ddf6470","findings":[],"hash":"9cf3b1a518cc039e478ede52543ae3babec5531b22068f78737cbbfcd8497126","nodeId":"9a9be61f-3b71-48bb-a07b-c4942eb94ae6","outcome":"completed","summary":"I found no math defects in SOOTH. `.imd-findings.json` has an empty findings list and a coverage row for each of the 4 entry points, all marked `holds`, plus 2 rows for invariants I checked.\n\n**What I reviewed:** `src/SoothToken.sol` and the library code it uses. The contract only adds constants, a constructor that mints the supply once, and `decimals()` returning 18. Everything else comes from the bundled OpenZeppelin 5.4.0 ERC20 and ERC20Permit. I compared the bundled copies of every file involved (ERC20, ERC20Permit, ECDSA, EIP712, Nonces, MessageHashUtils, ShortStrings, StorageSlot, IERC20, the error interface, Context) against the official npm 5.4.0 release, and they are identical.\n\n**Math precision:** The contract has no division, fees, scaling between decimals, narrowing casts or rounding. The supply `1_000_000_000 * 10 ** 18` comes to exactly 1e27, as the brief requires. The only arithmetic that skips overflow checks is in the library's balance and allowance updates, and each one is checked first (`fromBalance < value`, `currentAllowance < value`). A balance can't overflow because all balances add up to the total supply, which is fixed at 1e27, far below the uint256 maximum.\n\n**Boundaries:** I ran a scratch Foundry test, then deleted it; no repository files changed. It covered:\n- **Transfers:** fuzzed transfers keep the total supply and the sum of balances equal; zero-amount and whole-balance transfers work.\n- **Allowances:** fuzzed allowance and amount pairs leave exactly the expected remainder, or revert when the amount is too large. A maximum (\"infinite\") allowance is not reduced, as intended.\n- **Permit:** a deadline equal to the current time is accepted and one second later is rejected. A replayed signature, a tampered (high-s) signature and a zero-address owner with a garbage signature all revert.\n\nThe existing 37 tests also pass.\n\n**Numerical gaps:** No invariant depends on a rounded or edge-case number. Supply is fixed after deployment because nothing outside the constructor can mint or burn.\n\n**Static analysis:** Aderyn's \"large numeric literal\" warning at line 30 points at the supply constant. It evaluates to the correct value, so it isn't a defect, and Slither reported nothing.\n\n**Not covered:** I didn't run the supplied launch-flow test (`Token.protected.t.sol`) or review its PoolManager seeding flow, which belongs to another specialist's area. It imports `src/LaunchLiquidity.sol` and Uniswap v4 code, neither of which is in this repository. The token has no transfer fees or exemptions, so nothing in my area affects that flow.","treeHash":null,"usage":{"cachedInputTokens":405397,"inputTokens":20,"model":"claude-opus-5-5","outputTokens":6421,"runtime":"claude","turns":10,"wallClockMs":98926}},{"artifacts":[],"attempt":1,"bundleHash":"d0d47ae3de946ba0ed63d4e33068cc678214513ca7b49140290366dadde5c246","device":"523ef565dd740e25","findings":[],"hash":"b80d1cfc47257a65cf9985427cab7a810f4a0788c49bed66adfaa6d3ef7d56a4","nodeId":"449942d3-7dd8-453e-8cb9-47c085ad44f3","outcome":"completed","summary":"I added two test files. `forge test` passes all 70 tests (37 from the earlier suite plus my 33), both with the verifier's seed `0x808c…cb18` and with a random seed. I found no defects, so I didn't write `.imd-findings.json`.\n\n**`test/SoothToken.invariant.t.sol`**: random-sequence tests over balances, allowances and permit nonces.\n- A handler contract drives the token from 5 actors that can each sign permits. Coins can go to those actors or to the token contract itself, so the list of possible holders is closed and the sum check below covers everyone.\n- It calls transfers, approvals (including unlimited ones), `transferFrom`, permits and time jumps. It also makes calls that must fail and checks the exact error each time: sending more than the balance, sending to the zero address, spending over the allowance, a reused or old permit, an expired permit, and a permit signed by the wrong key.\n- It keeps its own record of every balance, allowance and nonce. After every call it checks:\n  - the total supply never changes;\n  - all holder balances add up to the full supply;\n  - each balance, allowance and nonce matches the handler's record;\n  - the token holds no ETH and its name, symbol and decimals stay the same.\n- Settings are in the file: 256 runs of 64 calls each (16,384 calls), with no handler call reverting unexpectedly. Every function was called about 1,400–1,550 times, so none of the checks pass without being exercised.\n\n**`test/SoothToken.edge.t.sol`**: failure paths and boundary values the earlier suite didn't cover.\n- **Amounts:** one wei, the full supply plus one, and the maximum possible amount. Zero-amount transfers still emit the event, and sending zero to the zero address still reverts. Tokens sent to the token contract itself stay stuck there.\n- **Allowances:**\n  - spending exactly the allowance leaves zero;\n  - an allowance one below the maximum still goes down when spent;\n  - an owner needs an allowance even to move their own tokens with `transferFrom`;\n  - setting an allowance to zero revokes it, and allowances are kept per spender;\n  - a failed `transferFrom` leaves the allowance unchanged;\n  - two fuzz tests check the allowance arithmetic.\n- **Permit:**\n  - signatures in the alternate \"high-s\" form, which would let a valid signature be reused, are rejected, and so are invalid `v` values;\n  - nobody can approve on behalf of the zero address, and approving the zero address as spender is rejected;\n  - signatures with the wrong spender or a future nonce are rejected;\n  - a signature made for another copy of the token or another chain doesn't work;\n  - the signing domain's name, version, chain and address are checked;\n  - a deadline equal to the current time is accepted, and anyone can submit a permit;\n  - nonces go up by one per permit, plus fuzz tests over any value and any wrong key.\n- **Unknown calls:** a fuzz test sends arbitrary calls from the deployer and checks the deployer's balance and the total supply never change.\n\n**Findings:** none. `SoothToken` is a plain OpenZeppelin token with permit: the whole supply is minted once to the deployer, and there's no owner, extra minting, pause or fee. Nothing I tested behaved incorrectly.\n\nI couldn't commit because git on this machine has no author name or email set. I didn't change the git config, so the two files are in the working tree but not committed.","treeHash":"5c6611e897f2867bed4db4a8882c469448315d28","usage":{"cachedInputTokens":516756,"inputTokens":22,"model":"claude-opus-5-5","outputTokens":17492,"runtime":"claude","turns":11,"wallClockMs":213528}},{"artifacts":[],"attempt":1,"bundleHash":"84d8aaffe15e102a35f1558bdbabe1d88484976d8fe0127cc8b98cf5ca0da92c","device":"fd5402086dce252e","findings":[],"hash":"dc8b1186ee185e34d069d27c9dabaefddfc02269eb7c5ec21aca89175e637458","nodeId":"e4b30e1d-cdda-4c96-8166-f170500d224a","outcome":"completed","summary":"I wrote launch.json for the Sooth Protocol launch. It is the only changed file.\n\n**What the manifest says**\n- Kind is custom_token. The token contract is SoothToken, named Sooth Protocol with symbol SOOTH and 18 decimals.\n- constructorArgs is empty. The accepted constructor takes no parameters and mints the whole supply to msg.sender, so no launch placeholders apply.\n- totalSupply is 1000000000000000000000000000, which matches the contract's TOTAL_SUPPLY constant of one billion tokens at 18 decimals.\n- contracts is empty. The accepted tree has no application contracts, only the token, a unit test and a reference deploy script.\n- pool and economics are copied verbatim from the launch reference: IMD as paired currency, fee 12500, tick spacing 60, the one-to-one provenance price, and the requester's poolBps, opening cap and remainderTo.\n- notes describe only the token that is present and run 1453 characters.\n\n**Checks run**\n- A schema-shape check confirmed only the allowed top-level keys, string uints and addresses, numeric fee, tickSpacing and decimals, and a contract name under 32 characters.\n- forge build compiled cleanly. forge test with the verifier's fuzz seed passed all 37 tests.\n- git status shows launch.json as the sole new file. No configuration, lib or workflow files were touched.","treeHash":"9767208f59538b21c8e4334badfba0550081787e","usage":{"cachedInputTokens":165748,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":2973,"runtime":"claude","turns":8,"wallClockMs":51179}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc7103e773ea194a","findings":[{"citation":"resolved","description":"Merged from the audit_permissions specialist (the only area that reported it; no other specialist or the tester raised a finding, so nothing else to merge). SoothToken inherits OpenZeppelin 5.4.0 ERC20Permit unchanged. I re-verified the vendored lib/openzeppelin-contracts/contracts tree is byte-identical to upstream tag v5.4.0 (recursive diff against a fresh clone: no differing files). permit(owner, spender, value, deadline, v, r, s) at lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol:41-64 consumes the owner's nonce via _useNonce(owner) before recovering the signer, so whoever submits a valid signature first sets the allowance and any later submission of the same signature reverts with ERC2612InvalidSigner. The allowance is set exactly as the holder signed it and no balance moves, so there is no loss and no privilege gain: this is the behaviour ERC-2612 specifies and every OpenZeppelin permit token shares. It is recorded as a trust note for application contracts or front-ends that bundle permit + transferFrom: they should wrap permit in try/catch or check allowance first. Not a defect in SoothToken; no fix recommended. Severity stays info.","line":19,"path":"src/SoothToken.sol","reproduction":"Reproduced in test/scratch/Review.t.sol::test_permitFrontRunReproduction (passes, i.e. confirms the behaviour). State: fresh SoothToken; signer S = vm.addr(0xA11CE); spender alice = 0xA11; attacker = 0xBAD. 1) S signs Permit(owner=S, spender=alice, value=5e18, nonce=0, deadline=block.timestamp+1h) over token.DOMAIN_SEPARATOR(). 2) vm.prank(attacker); token.permit(S, alice, 5e18, deadline, v, r, s) -> succeeds; allowance(S, alice) == 5e18; nonces(S) == 1. 3) vm.prank(alice); token.permit(S, alice, 5e18, deadline, v, r, s) with the identical signature -> reverts (ERC2612InvalidSigner, since the nonce is now 1 and the recovered address differs from S). After: allowance(S, alice) still 5e18, balanceOf(alice) == 0, totalSupply unchanged. Expected per ERC-2612: exactly this. Actual: exactly this.","severity":"info","snippet":"contract SoothToken is ERC20, ERC20Permit {","title":"permit() is submittable by any third party ahead of the holder (standard ERC-2612 behaviour); integrators must tolerate a consumed nonce, no token change needed"}],"hash":"ecef890fd1cbf927ba65fb4ef998f2aba19b274cdca13d41749b3974c959959f","nodeId":"77e783d8-817f-4e6a-bc7d-22f8d792e138","outcome":"completed","summary":"Review complete. The findings file is valid, the snippet matches line 19 of the source, and no tracked file changed.\n\n**Outcome:** SoothToken has no defects. The single specialist report, an informational note on ERC-2612 permit front-running, reproduces exactly as described and is kept at info severity. Nothing else was found.\n\nWhat I verified:\n- **Specialist finding reproduced.** Any third party can submit a holder's signed permit first. The holder's identical resubmission then reverts, the allowance is set as signed, and no balance moves. This is standard OpenZeppelin ERC20Permit behaviour, so it stays an integrator note, not a defect. My scratch test confirms it.\n- **Dependencies are clean.** The vendored OpenZeppelin tree is byte-identical to a fresh clone of upstream v5.4.0.\n- **Deployment model holds.** CREATE2 from a factory-like contract with no constructor arguments mints the whole supply to the factory. Creation and runtime bytecode are far under the protocol size limits.\n- **Launch flows are exact.** Factory to distributor to claimant moves exactly the amounts requested, and total supply stays fixed.\n- **No admin surface.** No mint path, owner, pause, blocklist, fallback, or receive. Runtime contains no DELEGATECALL, CALLCODE, or SELFDESTRUCT.\n- **Manifest matches the code.** Empty constructorArgs, supply, decimals and contract name all agree with the source.\n\nAll 70 project tests and my 5 scratch tests pass. Coverage records `holds` for all four entry points plus three invariant rows. Static analysis leads were a style note only.","treeHash":null,"usage":{"cachedInputTokens":499995,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":10677,"runtime":"claude","turns":17,"wallClockMs":174795}}],"verification":[{"checks":[{"durationMs":1057,"exitCode":0,"name":"build","output":"Compiling 42 files with Solc 0.8.26\nSolc 0.8.26 finished in 962.10ms\nCompiler run successful!\n","passed":true},{"durationMs":111,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 37 tests for test/SoothToken.t.sol:SoothTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 93923, ~: 94059)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 100080, ~: 100783)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 92810)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 65029)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 32950)\n[PASS] test_cannotSendEtherToToken() (gas: 38743)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8084)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 25099)\n[PASS] test_contractNameFitsTheManifest() (gas: 358)\n[PASS] test_deploymentsAreIndependent() (gas: 21153)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 120528)\n[PASS] test_launchFlowsMoveExactAmounts() (gas: 213093)\n[PASS] test_metadata() (gas: 53129)\n[PASS] test_noMintPathExists() (gas: 301546)\n[PASS] test_noOwnerOrAdminFunctions() (gas: 196075)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 442785)\n[PASS] test_permitRejectsExpiredDeadline() (gas: 56891)\n[PASS] test_permitRejectsReplay() (gas: 134745)\n[PASS] test_permitRejectsTamperedValue() (gas: 79814)\n[PASS] test_permitRejectsWrongSigner() (gas: 78614)\n[PASS] test_permitSetsAllowance() (gas: 115845)\n[PASS] test_permitThenTransferFrom() (gas: 226467)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 2330702)\n[PASS] test_scriptDeployMintsToCaller() (gas: 2470405)\n[PASS] test_supplyConstantIsOneBillionWithEighteenDecimals() (gas: 17463)\n[PASS] test_supplyGoesToWhoeverDeploys() (gas: 21765)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 88148)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 146516)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 44481)\n[PASS] test_transferFromSpendsAllowance() (gas: 147553)\n[PASS] test_transferMovesExactAmount() (gas: 87103)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37760)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 96851)\n[PASS] test_transferToSelfKeepsBalance() (gas: 40634)\n[PASS] test_transferToZeroAddressReverts() (gas: 33002)\n[PASS] test_transferWholeBalance() (gas: 72379)\n[PASS] test_transferZeroAmountSucceeds() (gas: 44576)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 9.31ms (35.85ms CPU time)\n\nRan 1 test suite in 9.92ms (9.31ms CPU time): 37 tests passed, 0 failed, 0 skipped (37 total tests)\n","passed":true},{"durationMs":46,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SoothToken.approve(address,uint256)\",\"SoothToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"SoothToken.transfer(address,uint256)\",\"SoothToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":126,\"foundry.toml\":22,\"remappings.txt\":2,\"script/DeploySoothToken.s.sol\":27,\"src/SoothToken.sol\":43,\"test/SoothToken.t.sol\":456},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1601,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":532,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SoothToken.sol:30: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2a0826a4414d476da35c8b33ec849e36bbff04ed52190f2ab2431242438da0a1","verifiedTreeHash":"ceb7197167d54af16b1cd189a0d66b4ab0bf7c55","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":1889,"exitCode":0,"name":"build","output":"Compiling 44 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.80s\nCompiler run successful!\n","passed":true},{"durationMs":7688,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/SoothToken.edge.t.sol:SoothTokenEdgeTest\n[PASS] testFuzz_arbitraryCallDoesNotMoveDeployerFunds(bytes4,bytes) (runs: 500, μ: 56090, ~: 55892)\n[PASS] testFuzz_permitAnyValue(uint256,uint256) (runs: 500, μ: 121246, ~: 121751)\n[PASS] testFuzz_permitByStrangerKeyRejected(uint256) (runs: 500, μ: 80310, ~: 80285)\n[PASS] testFuzz_transferFromAboveAllowanceReverts(uint256,uint256) (runs: 1000, μ: 105374, ~: 105872)\n[PASS] testFuzz_transferFromAccounting(uint256,uint256) (runs: 1000, μ: 150226, ~: 151752)\n[PASS] test_allowanceIsPerSpender() (gas: 102747)\n[PASS] test_approveZeroRevokes() (gas: 113472)\n[PASS] test_eip712DomainIsTheTokenName() (gas: 18725)\n[PASS] test_failedTransferFromKeepsAllowance() (gas: 160714)\n[PASS] test_maxMinusOneAllowanceIsDecremented() (gas: 124032)\n[PASS] test_ownerNeedsAllowanceForOwnTransferFrom() (gas: 38477)\n[PASS] test_permitAtExactDeadlineSucceeds() (gas: 103445)\n[PASS] test_permitCanBeSubmittedByAnyone() (gas: 118198)\n[PASS] test_permitCannotApproveForZeroAddressOwner() (gas: 63524)\n[PASS] test_permitMaxValueIsInfinite() (gas: 214123)\n[PASS] test_permitRejectsFutureNonce() (gas: 79322)\n[PASS] test_permitRejectsHighSMalleatedSignature() (gas: 76475)\n[PASS] test_permitRejectsInvalidV() (gas: 75986)\n[PASS] test_permitRejectsWrongSpender() (gas: 79736)\n[PASS] test_permitSignatureForOtherDeploymentIsRejected() (gas: 82980)\n[PASS] test_permitSignatureFromOtherChainIsRejected() (gas: 96674)\n[PASS] test_permitToZeroSpenderReverts() (gas: 75296)\n[PASS] test_sequentialPermitsUseIncrementingNonces() (gas: 254046)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 158873)\n[PASS] test_transferFromToZeroAddressReverts() (gas: 93256)\n[PASS] test_transferFromZeroAddressOwnerReverts() (gas: 38122)\n[PASS] test_transferMaxUintReverts() (gas: 38191)\n[PASS] test_transferOneWei() (gas: 77093)\n[PASS] test_transferToTokenContractIsAcceptedAndStuck() (gas: 72623)\n[PASS] test_transferWholeSupplyPlusOneReverts() (gas: 38096)\n[PASS] test_transferZeroEmitsEvent() (gas: 43821)\n[PASS] test_transferZeroToZeroAddressStillReverts() (gas: 32910)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 32.89ms (214.13ms CPU time)\n\nRan 37 tests for test/SoothToken.t.sol:SoothTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 93757, ~: 94059)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 100315, ~: 100795)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 92810)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 65029)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 32950)\n[PASS] test_cannotSendEtherToToken() (gas: 38743)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8084)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 25099)\n[PASS] test_contractNameFitsTheManifest() (gas: 358)\n[PASS] test_deploymentsAreIndependent() (gas: 21153)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 120528)\n[PASS] test_launchFlowsMoveExactAmounts() (gas: 213093)\n[PASS] test_metadata() (gas: 53129)\n[PASS] test_noMintPathExists() (gas: 301546)\n[PASS] test_noOwnerOrAdminFunctions() (gas: 196075)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 442785)\n[PASS] test_permitRejectsExpiredDeadline() (gas: 56891)\n[PASS] test_permitRejectsReplay() (gas: 134745)\n[PASS] test_permitRejectsTamperedValue() (gas: 79814)\n[PASS] test_permitRejectsWrongSigner() (gas: 78614)\n[PASS] test_permitSetsAllowance() (gas: 115845)\n[PASS] test_permitThenTransferFrom() (gas: 226467)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 2330702)\n[PASS] test_scriptDeployMintsToCaller() (gas: 2470405)\n[PASS] test_supplyConstantIsOneBillionWithEighteenDecimals() (gas: 17463)\n[PASS] test_supplyGoesToWhoeverDeploys() (gas: 21765)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 88148)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 146516)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 44481)\n[PASS] test_transferFromSpendsAllowance() (gas: 147553)\n[PASS] test_transferMovesExactAmount() (gas: 87103)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37760)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 96851)\n[PASS] test_transferToSelfKeepsBalance() (gas: 40634)\n[PASS] test_transferToZeroAddressReverts() (gas: 33002)\n[PASS] test_transferWholeBalance() (gas: 72379)\n[PASS] test_transferZeroAmountSucceeds() (gas: 44576)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 32.87ms (95.52ms CPU time)\n\nRan 1 test for test/SoothToken.invariant.t.sol:SoothTokenInvariantTest\n[PASS]\nSoothTokenInvariantTest invariants:\n[PASS] invariant_allowancesAndNoncesMatchModel\n[PASS] invariant_balancesMatchModel\n[PASS] invariant_balancesSumToSupply\n[PASS] invariant_metadataAndNoEther\n[PASS] invariant_totalSupplyIsFixed\n SoothTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+---------------------------+-------+---------+----------╮\n| Contract     | Selector                  | Calls | Reverts | Discards |\n+=======================================================================+\n| SoothHandler | approve                   | 1416  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| SoothHandler | permit                    | 1530  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| SoothHandler | permitExpired             | 1520  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| SoothHandler | permitReplayOrStale       | 1479  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| SoothHandler | permitWrongSigner         | 1555  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| SoothHandler | transfer                  | 1465  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| SoothHandler | transferFrom              | 1498  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| SoothHandler | transferFromOverAllowance | 1511  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| SoothHandler | transferToZero            | 1522  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| SoothHandler | transferTooMuch           | 1431  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| SoothHandler | warp                      | 1457  | 0       | 0        |\n╰--------------+---------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.60s (7.59s CPU time)\n\nRan 3 test suites in 7.60s (7.66s CPU time): 70 tests passed, 0 failed, 0 skipped (70 total tests)\n","passed":true},{"durationMs":52,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SoothToken.approve(address,uint256)\",\"SoothToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"SoothToken.transfer(address,uint256)\",\"SoothToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":126,\"foundry.toml\":22,\"remappings.txt\":2,\"script/DeploySoothToken.s.sol\":27,\"src/SoothToken.sol\":43,\"test/SoothToken.edge.t.sol\":368,\"test/SoothToken.invariant.t.sol\":317,\"test/SoothToken.t.sol\":456},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b80d1cfc47257a65cf9985427cab7a810f4a0788c49bed66adfaa6d3ef7d56a4","verifiedTreeHash":"5c6611e897f2867bed4db4a8882c469448315d28","verifierVersion":"0.1.0+ead9012e"},{"checks":[{"durationMs":1979,"exitCode":0,"name":"build","output":"Compiling 42 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.74s\nCompiler run successful!\n","passed":true},{"durationMs":309,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 37 tests for test/SoothToken.t.sol:SoothTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 93923, ~: 94059)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 100080, ~: 100783)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 92810)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 65029)\n[PASS] test_approveZeroAddressSpenderReverts() (gas: 32950)\n[PASS] test_cannotSendEtherToToken() (gas: 38743)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 8084)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 25099)\n[PASS] test_contractNameFitsTheManifest() (gas: 358)\n[PASS] test_deploymentsAreIndependent() (gas: 21153)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 120528)\n[PASS] test_launchFlowsMoveExactAmounts() (gas: 213093)\n[PASS] test_metadata() (gas: 53129)\n[PASS] test_noMintPathExists() (gas: 301546)\n[PASS] test_noOwnerOrAdminFunctions() (gas: 196075)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 442785)\n[PASS] test_permitRejectsExpiredDeadline() (gas: 56891)\n[PASS] test_permitRejectsReplay() (gas: 134745)\n[PASS] test_permitRejectsTamperedValue() (gas: 79814)\n[PASS] test_permitRejectsWrongSigner() (gas: 78614)\n[PASS] test_permitSetsAllowance() (gas: 115845)\n[PASS] test_permitThenTransferFrom() (gas: 226467)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 2330702)\n[PASS] test_scriptDeployMintsToCaller() (gas: 2470405)\n[PASS] test_supplyConstantIsOneBillionWithEighteenDecimals() (gas: 17463)\n[PASS] test_supplyGoesToWhoeverDeploys() (gas: 21765)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 88148)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 146516)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 44481)\n[PASS] test_transferFromSpendsAllowance() (gas: 147553)\n[PASS] test_transferMovesExactAmount() (gas: 87103)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37760)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 96851)\n[PASS] test_transferToSelfKeepsBalance() (gas: 40634)\n[PASS] test_transferToZeroAddressReverts() (gas: 33002)\n[PASS] test_transferWholeBalance() (gas: 72379)\n[PASS] test_transferZeroAmountSucceeds() (gas: 44576)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 49.41ms (91.94ms CPU time)\n\nRan 1 test suite in 51.60ms (49.41ms CPU time): 37 tests passed, 0 failed, 0 skipped (37 total tests)\n","passed":true},{"durationMs":92,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SoothToken.approve(address,uint256)\",\"SoothToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"SoothToken.transfer(address,uint256)\",\"SoothToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":126,\"foundry.toml\":22,\"launch.json\":24,\"remappings.txt\":2,\"script/DeploySoothToken.s.sol\":27,\"src/SoothToken.sol\":43,\"test/SoothToken.t.sol\":456},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"dc8b1186ee185e34d069d27c9dabaefddfc02269eb7c5ec21aca89175e637458","verifiedTreeHash":"9767208f59538b21c8e4334badfba0550081787e","verifierVersion":"0.1.0+ead9012e"}]}