{"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":"d5087949-a7d9-4923-8e5c-55bcb9fe216f","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"fd44619c7dbfd815ec802e69ba0f341861a779c960bfba463ecc049bcabb025a","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"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":"cdec4ca0bd6c3c8fd71534e1ebb3bec8ad4812f0090be0d03fea9612b7e46715","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"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":"9e218a5a589da59702b114dac3ffa539b4a0ac8704c8d3e9859966219595348c","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"220154eeec82a609cd383b2624c7e2f2065168c8c50dbc5702917be01cbfa1e7","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"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":"25174f7452997f0765a27738b447d27382f17183ac80619dc2476bff015c3e7b","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"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":"6c89181df5aedfea5afb2bb543694147a6fd9877e80ad8d23daf3cafa89cfbb8","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"534674133b7a9a78dc855936a806a0a1058ddfa53ae0ae94884e301cc4c7d14e","dependsOn":["build_contract_project","write_foundry_tests"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"fbce10403e3390355830b86c4eac1c0fa91fae02747f3e83519b908639335859","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"[SIMD-LAUNCH]\nA custom token: swarm cat (SCAT).\nToken name: swarm cat\nToken symbol: SCAT\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nMinting after launch: none, the supply is fixed forever.\nTransfer rules: plain ERC-20 transfers with no fee, tax or limit.\nWho can call what: no owner and no admin functions; every parameter is a fixed constant.\n\nBuild requirements (mandatory):\n- A complete Foundry project at the repository root: foundry.toml with solc 0.8.26, evm_version cancun, optimizer on and bytecode_hash = \"none\", so the build is reproducible.\n- Token contract: SCATToken. No selfdestruct and no delegatecall anywhere. No proxies, no owner, no upgradeability.\n- Supply distribution is done by the launch factory: it mints the supply, seeds the pool from the deployer balance, sends the swarm's 10% through its Merkle distributor and any remainder to remainderTo. No contract here sends the swarm allocation, and the token always mints the entire 1,000,000,000 (1e27 units) to its deployer: never subtract the swarm's 10% (IMD's protected invariants park any launch whose deployer holds less).\n- Chain: Ethereum mainnet (chainId 1). Swaps happen in Uniswap v4, so the pool's tokens move to and from the PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90.\n- launch.json pool: pairedCurrency 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, fee 3000, tickSpacing 60, initialPrice \"125270724187523965593206900\" (paired-currency minor units per SCAT minor unit with SCAT as currency0, provenance only; the deployer derives the real opening price from the economics using the deployed currency order). launch.json also carries the economics block below.\n- launch.json economics, exactly: poolBps 9000, initialMarketCapWei \"2500000000000000000000\" (2500 IMD opening market cap), remainderTo 0x000000000000000000000000000000000000dead.","parentJobId":null,"planHash":"672e6d7e9e05000d8c9522c92f54662552899c0b71a5846b118eb583fa9e1125","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"d5087949-a7d9-4923-8e5c-55bcb9fe216f","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1075-swarm-cat"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51508","feedbackHash":"134ef6687ec5c66835c4978013d3234b8229345cbdf88eaa55285edbb7c22531","nodeKey":"audit_economics","submissionHash":"fd44619c7dbfd815ec802e69ba0f341861a779c960bfba463ecc049bcabb025a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51486","feedbackHash":"d2ed93a80c842fafd55a008cf508a9309d4b99be78e7f250e75da967e89066b3","nodeKey":"audit_flow","submissionHash":"cdec4ca0bd6c3c8fd71534e1ebb3bec8ad4812f0090be0d03fea9612b7e46715","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51243","feedbackHash":"4218d97ed6a424347afd14eee8e327d333df43a3151364563f5320854a428869","nodeKey":"audit_judge","submissionHash":"9e218a5a589da59702b114dac3ffa539b4a0ac8704c8d3e9859966219595348c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51882","feedbackHash":"710ec4730add6479228e7b8a86b92cfc4f80dbde28bea5ec203f5794379a58ac","nodeKey":"audit_math","submissionHash":"220154eeec82a609cd383b2624c7e2f2065168c8c50dbc5702917be01cbfa1e7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51884","feedbackHash":"ac168e986ebf2cc2d1ead90628e74ea3d37ab7e391775a24ffc3e089f0037713","nodeKey":"audit_permissions","submissionHash":"25174f7452997f0765a27738b447d27382f17183ac80619dc2476bff015c3e7b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51433","feedbackHash":"b59e8f252b4cf43f44d35f3893683903a0f7df42854a654acbc9ae417f686ac5","nodeKey":"build_contract_project","submissionHash":"6466fb682265aa3a6ccebeeab1c7477139cb93b0c4032f177127f23be21f48e0","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51249","feedbackHash":"0b21c1709e791021930f934c7a4227eb7e917b5c276f600d494c41f8b65ab16b","nodeKey":"build_contract_project","submissionHash":"6c89181df5aedfea5afb2bb543694147a6fd9877e80ad8d23daf3cafa89cfbb8","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51495","feedbackHash":"e7454c45fbee675d98dea5c6b3b7375e97a687dafe61943e6a950c36eff240f6","nodeKey":"manifest","submissionHash":"534674133b7a9a78dc855936a806a0a1058ddfa53ae0ae94884e301cc4c7d14e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51378","feedbackHash":"9e4f9ab4a0ce8bc2246c40f0dbfec05b1b2d35c7fca56b710b78d9265238c0d6","nodeKey":"write_foundry_tests","submissionHash":"fbce10403e3390355830b86c4eac1c0fa91fae02747f3e83519b908639335859","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"3a57955c569d1b1a67885224ce3f1676b3ed7b8b0dec2d54556821d7c79163bf","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5c1e4764d4e20ef5","findings":[],"hash":"220154eeec82a609cd383b2624c7e2f2065168c8c50dbc5702917be01cbfa1e7","nodeId":"e2ba5ae5-d2b1-4a63-9cf4-a5013037f7d8","outcome":"completed","summary":"The math audit of SCATToken is complete and found no defects. The findings file at `.imd-findings.json` holds an empty findings list and seven coverage rows, all `holds`. No tracked file was changed.\n\n**What I checked, against the Math Precision, Boundary and Numerical Gap guides**\n\n- **Arithmetic surface.** The token has two subtractions and one addition, no division, no casts, no shifts, no external calls, no payable or bytes-decoding paths. Both subtractions are guarded by an explicit less-than revert. The receiver addition cannot wrap because balances always sum to the fixed supply.\n- **Supply constant.** The literal flagged by aderyn evaluates at compile time to exactly 1e27, equal to the manifest's totalSupply, and the constructor credits all of it to msg.sender. The lead is not a defect.\n- **Allowance sentinel.** Max is unlimited and max minus one is finite. I verified that one-unit boundary directly. A zero-value transferFrom with zero allowance takes no fast path and leaves the allowance untouched.\n- **Exact-balance edges.** Value equal to balance passes, balance plus one reverts, self-transfers and self-transferFrom preserve balance while consuming finite allowance.\n- **Launch numbers.** The manifest's sqrtPriceX96 equals sqrt(2500e18 / 1e27) times 2^96 with zero difference. Both possible currency orders lie inside Uniswap v4's price bounds. The 90% seed amount fits int128 and the implied single-sided liquidity fits uint128. The 10%/90% split of 1e27 leaves no dust.\n\n**Verification run**\n\n- Existing suite: 37 tests pass, including the 256-run ledger invariant.\n- My scratch suite under `test/scratch/MathBoundary.t.sol`: 7 tests pass. That directory is gitignored and not part of the submission.\n\n**Not reached.** Live Uniswap v4 seeding and swaps against mainnet state. The protected harness covers these in the platform environment, and no network was available here.","treeHash":null,"usage":{"cachedInputTokens":609050,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":11065,"runtime":"claude","turns":22,"wallClockMs":200963}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4aa8623bfb8d8e5e","findings":[{"citation":"resolved","description":"This is the inherent ERC-20 approve() behaviour, not a deviation from the brief (plain ERC-20, no extra surface), and the README already tells holders to account for it. It is recorded so the judge has the trace, not as a defect requiring a change: a holder who lowers an existing non-zero allowance in one approve() call can be front-run by the spender, who then spends both the old and the new allowance. Area lenses: asymmetry between the holder's intent (replace) and the spender's observable window (old value still spendable until the replacing write lands). No privileged actor is involved and no launch flow (factory, distributor, PoolManager) relies on a finite allowance, so launch safety is unaffected. If the requester ever wants to remove the race it needs a scope decision (adding increaseAllowance/decreaseAllowance or EIP-2612 permit), which the current brief excludes.","line":43,"path":"src/SCATToken.sol","reproduction":"State: holder H has balance >= 150. 1) H calls approve(S, 100). 2) Spender S observes H's pending approve(S, 50) in the mempool and front-runs it with transferFrom(H, S, 100): succeeds, allowance now 0. 3) H's approve(S, 50) lands: allowance set to 50. 4) S calls transferFrom(H, S, 50): succeeds. Expected by H: S can move at most 50 after the lowering call. Actual: S moved 150. Verified locally with a scratch test (approve 100, transferFrom 100, approve 50, transferFrom 50, balanceOf(S) == 150).","severity":"info","snippet":"        allowance[msg.sender][spender] = value;","title":"approve() carries the standard ERC-20 allowance-replacement race; no increase/decrease or permit alternative is offered"}],"hash":"25174f7452997f0765a27738b447d27382f17183ac80619dc2476bff015c3e7b","nodeId":"dba5a4e2-97aa-4fe8-b28b-3ca579f644be","outcome":"completed","summary":"The review is complete. The findings file is written and no repository files were changed. The working tree shows no modifications beyond the untracked findings file, and my scratch probe directory has been removed.\n\n**Result: no defects in the Access Control, Trust Gap or Asymmetry areas.** The token at `src/SCATToken.sol` has no roles, owner, initializer, proxy, hooks, fees or external calls. Its ABI exposes exactly the three state-changing functions the verifier listed, plus views. One informational note is recorded.\n\nWhat I checked, in order:\n\n- **Permission map.** The constructor hands out no roles and mints the whole supply to msg.sender. No selector in the ABI mutates anything other than the caller's own balance or allowance, and there is no receive or fallback. Admin-style selector sweeps from the deployer and from strangers all revert.\n- **Asymmetry diff.** The transfer and transferFrom paths share one private helper, so validation, debit and credit are identical. The allowance decrement happens before the balance move and rolls back with it. Self-transfer is exact. The only asymmetry found is the standard ERC-20 approve replacement race, which the README documents and the brief's plain-ERC-20 scope implies.\n- **Trust-gap seams.** With no privileged actor, no pricing formula and no caller-class branch, none of the four seams has two lenses to combine. I probed the PoolManager, the dead address and a factory-like address and all obey allowance like any holder.\n- **Launch floor.** Full supply lands on the CREATE2 deployer, supply is a compile-time constant, no CALL-family opcode exists in the runtime, and the metadata confirms bytecode hash none, Cancun and the optimizer. The manifest copies the brief verbatim and its provenance sqrtPriceX96 equals the value derived from the economics with SCAT as currency0.\n- **Verification runs.** Build, all 37 delivered tests including two invariant suites, and the formatter check pass. Five scratch probes I wrote for edge inputs also passed, then were deleted.\n\nThe findings file holds one info entry with a concrete trace and nine coverage rows: all three entry points are marked `holds`, plus rows for the constructor, supply invariant, opcode scan, fallback surface, manifest and the trust-gap seams. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":977408,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":11991,"runtime":"claude","turns":21,"wallClockMs":224776}},{"artifacts":[],"attempt":1,"bundleHash":"b8f8b4bd46b810571abbf2c8703087f53b7e77c3ee1289345844fffde6af26d6","device":"3311c48cd0280ed4","findings":[],"hash":"534674133b7a9a78dc855936a806a0a1058ddfa53ae0ae94884e301cc4c7d14e","nodeId":"e4f677e8-c5a9-494a-9ae4-916be1b28197","outcome":"completed","summary":"Updated only [launch.json](/home/imd1/.identitymd/work/d5087949-a7d9-4923-8e5c-55bcb9fe216f/e4f677e8-c5a9-494a-9ae4-916be1b28197/launch.json), clarifying the accepted token’s behavior while preserving the exact pool and economics values.\n\nManifest fields and constructor ABI checks passed. `forge build` succeeded; `forge test` passed all 37 tests.","treeHash":"e70b0e1988a71b50dfdbcd0b8a7fb789412e1e4b","usage":{"cachedInputTokens":321152,"inputTokens":43132,"model":"gpt-6-astra","outputTokens":2718,"runtime":"codex","turns":3,"wallClockMs":125194}},{"artifacts":[],"attempt":1,"bundleHash":"0bdd23b039e3939db8e4f7ceb3ac0369c85bcc8a581e4fc779eed2edfc8dfca3","device":"9fd410b500e3af05","findings":[],"hash":"6466fb682265aa3a6ccebeeab1c7477139cb93b0c4032f177127f23be21f48e0","nodeId":"4c71779c-76b7-48d3-8ef5-812cde5a1d8f","outcome":"completed","summary":"Implemented `SCATToken`, exact `launch.json`, pinned Foundry configuration, documentation, and dependency-free tests. The full 1e27 supply goes to the deployer; no fees, minting, burns, or admin powers exist.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passed.\n- `forge test`: 38 passed, including fuzz and invariant tests.\n- `forge fmt --check` passed.\n- Manifest values and compiled ABI checked.\n\nFull Uniswap v4 integration remains unverified locally; offline tests cover token transfer boundaries.","treeHash":"a17403dea43d9dbb2e7408ca9221887425b602fa","usage":{"cachedInputTokens":668800,"inputTokens":71760,"model":"gpt-6-astra","outputTokens":17392,"runtime":"codex","turns":5,"wallClockMs":477979}},{"artifacts":[],"attempt":2,"bundleHash":"f151c103b0644f035193f29bc3fd0c898c618accf945ffe5f868d9ee49436095","device":"dede2fc25efa8cdd","findings":[],"hash":"6c89181df5aedfea5afb2bb543694147a6fd9877e80ad8d23daf3cafa89cfbb8","nodeId":"4c71779c-76b7-48d3-8ef5-812cde5a1d8f","outcome":"completed","summary":"Implemented the complete Foundry project: fixed-supply `SCATToken`, exact launch economics, and deployment documentation. `launch.json` omits the rejected `chainId` field.\n\nValidation passed:\n- `forge build` with Solidity 0.8.26\n- `forge test`: 29 tests, including fuzz and invariant coverage\n- `forge fmt --check`\n\nLocal tests cover token settlement flows; live Uniswap integration remains untested.","treeHash":"b0f978d4c4a8890f81446b01b6079135f8448d5f","usage":{"cachedInputTokens":543616,"inputTokens":74413,"model":"gpt-6-astra","outputTokens":14993,"runtime":"codex","turns":5,"wallClockMs":415582}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"76e5f9ed417094cc","findings":[{"citation":"resolved","description":"Merged duplicate: audit_permissions (id 99fbfd4a...) and audit_economics (id 4a02fe6b...) both report the same root cause at the same line. approve() overwrites allowance[msg.sender][spender] without reference to the current value, and the contract exposes no increaseAllowance, decreaseAllowance or EIP-2612 permit (all three selectors revert on the missing-selector path; verified). A spender watching the mempool for a holder's lowering approve can spend the old allowance first and then the new one. This is the standard EIP-20 approve race, acknowledged in README.md ('Holders should account for the normal ERC-20 approval replacement race'), and the brief asks for plain ERC-20 transfers with no extra surface, so it is a trust note for holders and integrators rather than a defect that reopens the work. No launch flow is affected: the factory, distributor and PoolManager legs use transfer(), and the protected harness never relies on a finite allowance. Recorded at info so the judge record carries the one concrete trace both specialists produced; removing the race would need a scope decision (adding increase/decreaseAllowance or permit) that the current brief excludes.","line":43,"path":"src/SCATToken.sol","reproduction":"Deploy SCATToken; deployer transfers 1_000e18 to ALICE. (1) vm.prank(ALICE); token.approve(BOB, 100e18). (2) ALICE broadcasts approve(BOB, 50e18); BOB front-runs it: vm.prank(BOB); token.transferFrom(ALICE, BOB, 100e18) succeeds, allowance now 0. (3) ALICE's approve(BOB, 50e18) lands. (4) vm.prank(BOB); token.transferFrom(ALICE, BOB, 50e18) succeeds. Expected by the holder: at most 100e18 ever leaves under this approval. Actual: balanceOf(BOB) == 150e18, balanceOf(ALICE) == 850e18, allowance(ALICE,BOB) == 0. Reproduced in test/scratch (not kept): both transferFrom calls return true and the final balances are exactly those; calls to increaseAllowance(address,uint256), decreaseAllowance(address,uint256) and permit(address,address,uint256,uint256,uint8,bytes32,bytes32) all revert.","severity":"info","snippet":"        allowance[msg.sender][spender] = value;","title":"approve() replaces the allowance in place: inherent ERC-20 front-running race, no increase/decrease/permit alternative (merged from audit_permissions and audit_economics)"}],"hash":"9e218a5a589da59702b114dac3ffa539b4a0ac8704c8d3e9859966219595348c","nodeId":"5c1210e9-2262-4c51-8851-211d4fb6dfaf","outcome":"completed","summary":"The review is complete. `.imd-findings.json` is written with one merged info note and a coverage record of 8 rows. No repository file was changed, and the scratch test was removed.\n\n**Outcome: no defect reopens the work.** The SCAT token is a 73-line dependency-free ERC-20 with constants for name, symbol, decimals and supply, no owner, no hooks, and no external calls. It builds reproducibly under the pinned toolchain, passes all 37 project tests including two stateful invariants, and `forge fmt --check` is clean.\n\n**Specialist findings judged**\n\n- The permissions and economics specialists each reported the same thing: `approve` replaces the allowance in place, so a spender can front-run a lowering approval and move old plus new. I reproduced it in a scratch test with the exact balances they stated. It is the standard EIP-20 race, the brief asks for plain ERC-20, and the README already documents it. Merged into one finding at info, explicitly marked as a trust note rather than a defect.\n- The flow and math specialists reported nothing; I confirmed their `holds` rows myself rather than inheriting them.\n- The aderyn large-literal lead evaluates to exactly 1e27 at compile time and was dropped.\n\n**Independent checks beyond the specialists**\n\n- A PUSH-aware scan of both runtime and creation bytecode found no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- The compiled ABI exposes only the three listed entry points, so every mint, burn, pause, blacklist, seize and upgrade selector in the protected harness reverts.\n- The manifest is schema-shaped, economics are copied verbatim, and the provenance sqrtPriceX96 implies 2.5e-6 IMD per SCAT, consistent with a 2500 IMD cap over 1e9 tokens.\n\n**Coverage record:** all three entry points `holds`, plus rows for the constructor mint, post-launch supply immutability, forbidden-opcode scan, manifest, and the static-analysis lead.","treeHash":null,"usage":{"cachedInputTokens":415379,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":11562,"runtime":"claude","turns":20,"wallClockMs":204254}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0e78515c4d95885a","findings":[],"hash":"cdec4ca0bd6c3c8fd71534e1ebb3bec8ad4812f0090be0d03fea9612b7e46715","nodeId":"39534c8d-c360-4b97-8cb6-93945815751c","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree has no modified tracked files.\n\n**Result: no defects found.** The file `.imd-findings.json` holds an empty findings list and eight coverage rows, all `holds`.\n\n**What I checked, against the Execution Trace, Periphery and First Principles guides**\n\n- **approve**: only writes the caller's own allowance slot. Zero spender reverts. Replacement semantics, the unlimited sentinel, and the MAX-1 finite case were all executed.\n- **transfer**: balance is debited before the credit is read, so a self-transfer preserves the balance. Zero value, zero recipient, value above balance, and value at the uint256 maximum all behave as intended.\n- **transferFrom**: the allowance is checked and reduced before the balance move, so a revert in the move rolls back both. The three-way alias where holder, spender and recipient are the same address, the exact boundary where allowance equals balance equals value, and a zero-value call without allowance were traced and run.\n- **constructor**: mints exactly 1e27 units to its caller once, with no arguments and no external calls. A CREATE2 factory fixture confirms the factory, not the transaction origin, holds the supply.\n- **Periphery**: there are no libraries, helpers or base contracts. The compiled runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT opcodes. Unknown selectors, short calldata and ether all revert.\n- **Launch flow**: every leg moves exactly the requested amount and returns a single ABI-encoded true word, which the Uniswap v4 currency library accepts. The swarm's 10 percent plus the 90 percent pool share leaves the factory at exactly zero.\n- **Manifest**: supply, decimals, empty constructor arguments, economics block and remainder address match the brief. The provenance sqrtPriceX96 recomputes exactly from the 2500 IMD cap over 1e27 units with SCAT as currency0.\n\n**Evidence run**\n\n- The delivered suite of 37 tests passes, including two stateful invariant suites and five 1000-run fuzz tests.\n- A scratch suite of seven extra edge tests passed and was then deleted, since nothing under test/scratch is kept.\n- Formatting check passes. Static analysis reported only a cosmetic large-literal note, which is the supply constant and not a defect.\n\n**Not covered**: live Uniswap v4 seeding and swaps on mainnet, which the platform's protected harness runs with the real pool manager. That is the only launch behaviour this offline review could not exercise.","treeHash":null,"usage":{"cachedInputTokens":765175,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":10368,"runtime":"claude","turns":16,"wallClockMs":166007}},{"artifacts":[],"attempt":1,"bundleHash":"2bd979b2e6ab0195fd8000ac69493b4675a1e00773e44feb2d63caa0e75dfa78","device":"f1bc2d45837b6b78","findings":[],"hash":"fbce10403e3390355830b86c4eac1c0fa91fae02747f3e83519b908639335859","nodeId":"15bdeecb-b1dd-4beb-a007-f53140720d62","outcome":"completed","summary":"Added failure-path fuzz tests and independent balance/allowance invariants. Only two files under `test/` were added.\n\n`forge build` and `forge test` pass: 37 tests, 7,000 fuzz cases, and 40,960 invariant calls.\n\nNo defects found. Live Uniswap integration was not run.","treeHash":"74f4ecd3b6adbe2f4b174bef548c1fbb9c3d5673","usage":{"cachedInputTokens":357760,"inputTokens":51476,"model":"gpt-6-astra","outputTokens":9396,"runtime":"codex","turns":4,"wallClockMs":296723}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3516474d8a268bd8","findings":[{"citation":"resolved","description":"Economic Security guide, 'Break ERC compliance' / 'Approval residuals'. approve() overwrites allowance[msg.sender][spender] with no reference to the current value, and the contract exposes no increaseAllowance, decreaseAllowance or EIP-2612 permit (all three selectors revert via the missing-selector path). A spender who watches the mempool for a holder's replacement approve can spend the old allowance first and then the new one, moving the sum of both. This is the standard ERC-20 approve race documented in EIP-20 itself and already acknowledged in README.md ('Holders should account for the normal ERC-20 approval replacement race'); the brief asks for plain ERC-20 transfers with no extra surface, so this is a trust note for holders and integrators, not a defect that should reopen the work. It does not affect any launch flow: the factory, distributor and PoolManager legs use transfer() only, and the PoolManager never calls transferFrom. Reported at info so the judge has the one concrete edge in the Economic Security area on record.","line":43,"path":"src/SCATToken.sol","reproduction":"Deploy SCATToken; deployer transfers 1_000e18 to ALICE. (1) vm.prank(ALICE); token.approve(BOB, 100e18). (2) ALICE broadcasts approve(BOB, 50e18) intending to lower the budget; BOB front-runs it with vm.prank(BOB); token.transferFrom(ALICE, BOB, 100e18). (3) ALICE's approve(BOB, 50e18) lands. (4) vm.prank(BOB); token.transferFrom(ALICE, BOB, 50e18). Expected by the holder: at most 100e18 ever leaves ALICE under this approval. Actual: balanceOf(BOB) == 150e18, balanceOf(ALICE) == 850e18, allowance(ALICE,BOB) == 0. Verified locally in a scratch test (test/scratch, not kept): both steps succeed and the final balances are exactly those. Also verified that calls to increaseAllowance(address,uint256), decreaseAllowance(address,uint256) and permit(address,address,uint256,uint256,uint8,bytes32,bytes32) all revert (unknown selector), so holders can only mitigate by approving 0 first and waiting for inclusion.","severity":"info","snippet":"        allowance[msg.sender][spender] = value;","title":"approve replaces the allowance in place, so a spender can front-run a replacement and move old+new (inherent ERC-20 race; no increaseAllowance/decreaseAllowance or permit entry points)"}],"hash":"fd44619c7dbfd815ec802e69ba0f341861a779c960bfba463ecc049bcabb025a","nodeId":"c2e262c3-aab1-48da-8425-ad4aadfa86d6","outcome":"completed","summary":"The review is complete and the findings file is written. The working tree is otherwise untouched.\n\n**Result: no defect in the Economic Security, Invariant or Flow Gap areas.** The findings file holds one informational note and seven coverage rows, all three listed entry points answered.\n\nWhat I checked and how it held up:\n\n- **Conservation and supply.** The supply is a compile-time constant, the constructor credits it whole to the deployer, and the ABI exposes no mint, burn, owner, pause or upgrade selector. The existing suite's two stateful invariants and my own trace of the debit-then-credit order confirm the sum of balances never leaves 1e27, including on self-transfers.\n- **Bytecode.** An independent opcode walk of both creation and runtime code found no DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL, STATICCALL or CREATE. The artifact metadata confirms solc 0.8.26, Cancun, optimizer on and no bytecode hash.\n- **Launch flows.** Every leg the factory, distributor and PoolManager drive uses plain transfer with a 32-byte true return, no fee, hook or callback, so v4 sync and settle deltas match what was sent. The remainder address is nonzero, so a zero or dust remainder transfer succeeds.\n- **Economics in launch.json.** poolBps, initialMarketCapWei and remainderTo match the brief verbatim. Recomputing the sqrtPriceX96 from 2500 IMD over 1e27 units at high precision reproduces the manifest's initialPrice to the last digit.\n- **The one note (info).** approve overwrites the allowance in place and there is no increaseAllowance, decreaseAllowance or permit, so a spender can front-run a replacement approval and move old plus new. I reproduced it with concrete balances in a scratch test, then deleted the scratch directory. It is the standard ERC-20 race, the README already discloses it, and the brief asks for plain ERC-20, so it is recorded for the judge rather than as a defect.\n\nNot covered here: a live seed and swap against the real PoolManager, which is the protected harness's job and cannot run in this tree since neither forge-std nor v4-core is vendored.","treeHash":null,"usage":{"cachedInputTokens":978233,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":15277,"runtime":"claude","turns":16,"wallClockMs":244912}}],"verification":[{"checks":[{"durationMs":522,"exitCode":0,"name":"build","output":"Compiling 6 files with Solc 0.8.26\nSolc 0.8.26 finished in 473.90ms\nCompiler run successful!\n","passed":true},{"durationMs":10364,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 28 tests for test/SCATToken.t.sol:SCATTokenTest\n[PASS] testFuzz_AllowanceLimitsSpendingAndIsAtomic(uint256,uint256) (runs: 1000, μ: 179842, ~: 181964)\n[PASS] testFuzz_TransferRoundTripConservesSupply(address,uint256) (runs: 1000, μ: 121430, ~: 121744)\n[PASS] testFuzz_ZeroRecipientAlwaysReverts(uint256) (runs: 1000, μ: 42163, ~: 42103)\n[PASS] test_ApprovalDoesNotAuthorizeAnotherSpender() (gas: 92135)\n[PASS] test_ApproveReplacesAndRevokesOnlyCallersAllowance() (gas: 218701)\n[PASS] test_ApproveZeroApproverReverts() (gas: 30655)\n[PASS] test_ApproveZeroSpenderReverts() (gas: 34601)\n[PASS] test_ConstructorMintsEntireSupplyAndEmitsEvent() (gas: 33318)\n[PASS] test_Create2MintsToFactoryRatherThanTransactionOrigin() (gas: 206619)\n[PASS] test_EntireSupplyCanMoveAndReturnWithoutLimits() (gas: 128170)\n[PASS] test_FactoryDistributionClaimsAndPoolManagerTransfersAreExact() (gas: 540676)\n[PASS] test_FiniteAllowanceCanBeSpentExactlyOnce() (gas: 238086)\n[PASS] test_InfiniteAllowanceRemainsInfiniteAcrossSpends() (gas: 218410)\n[PASS] test_InsufficientBalanceRollsBackAllowance() (gas: 105634)\n[PASS] test_InvalidRecipientRollsBackAllowance() (gas: 95028)\n[PASS] test_MaximumTransferCannotOverflowOrChangeSupply() (gas: 50015)\n[PASS] test_NoAdminMintBurnOrUpgradeEntryPointsForDeployerOrStranger() (gas: 1235763)\n[PASS] test_NoRecipientCallbackIsRequired() (gas: 251967)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 358275)\n[PASS] test_SelfTransferPreservesBalance() (gas: 68502)\n[PASS] test_TransferEmitsExactAmount() (gas: 72449)\n[PASS] test_TransferFromByHolderStillRequiresAllowance() (gas: 134094)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 94357)\n[PASS] test_TransferToRemainderAddressDoesNotBurnSupply() (gas: 60386)\n[PASS] test_UnknownCallAndEtherAreRejected() (gas: 58546)\n[PASS] test_ZeroSenderCannotTransferEvenZero() (gas: 57767)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 55288)\n[PASS] test_ZeroTransferFromWithoutAllowanceSucceedsAndEmitsEvent() (gas: 53231)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 62.94ms (175.63ms CPU time)\n\nRan 6 tests for test/SCATToken.adversarial.t.sol:SCATTokenAdversarialTest\n[PASS] testFuzz_ApprovalBelongsToHolderAndDoesNotFollowTokens(uint256) (runs: 1000, μ: 269738, ~: 269726)\n[PASS] testFuzz_DelegatedTransferWithAliasedRoles(uint256,uint256,uint8,bool) (runs: 1000, μ: 115208, ~: 105264)\n[PASS] testFuzz_FailedDelegatedTransferIsAtomicAfterPriorSpend(uint256,uint256,uint256,bool,bool) (runs: 1000, μ: 230624, ~: 231183)\n[PASS] testFuzz_ReplacementApprovalDoesNotAddToUnusedBudget(uint256,uint256,uint256) (runs: 1000, μ: 382971, ~: 384677)\n[PASS] test_CanonicalAdminCalldataCannotFreezeOrSeizeApprovedHoldings() (gas: 991662)\n[PASS] test_MaxMinusOneApprovalIsFiniteEvenWhenBalanceReturns() (gas: 225731)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 63.35ms (246.65ms CPU time)\n\nRan 1 test for test/SCATToken.invariant.t.sol:SCATTokenInvariantTest\n[PASS] invariant_AllBalancesSumToFixedSupply() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 5503  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 5452  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 5429  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 866.60ms (865.74ms CPU time)\n\nRan 2 tests for test/SCATToken.model.invariant.t.sol:SCATTokenLedgerInvariantTest\n[PASS] invariant_EveryBalanceAndAllowanceMatchesIndependentLedger() (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------+--------------+-------+---------+----------╮\n| Contract          | Selector     | Calls | Reverts | Discards |\n+===============================================================+\n| SCATLedgerHandler | approve      | 8233  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| SCATLedgerHandler | transfer     | 8200  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| SCATLedgerHandler | transferFrom | 8143  | 0       | 0        |\n╰-------------------+--------------+-------+---------+----------╯\n\n[PASS] test_HandlerExercisesSuccessfulAndRejectedCalls() (gas: 12118000)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.31s (10.32s CPU time)\n\nRan 4 test suites in 10.31s (11.31s CPU time): 37 tests passed, 0 failed, 0 skipped (37 total tests)\n","passed":true},{"durationMs":24,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SCATToken.approve(address,uint256)\",\"SCATToken.transfer(address,uint256)\",\"SCATToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"LICENSE\":21,\"README.md\":117,\"foundry.toml\":12,\"launch.json\":24,\"src/SCATToken.sol\":73,\"test/SCATToken.adversarial.t.sol\":187,\"test/SCATToken.invariant.t.sol\":87,\"test/SCATToken.model.invariant.t.sol\":189,\"test/SCATToken.t.sol\":396,\"test/TestBase.sol\":27},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"534674133b7a9a78dc855936a806a0a1058ddfa53ae0ae94884e301cc4c7d14e","verifiedTreeHash":"e70b0e1988a71b50dfdbcd0b8a7fb789412e1e4b","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":448,"exitCode":0,"name":"build","output":"Compiling 6 files with Solc 0.8.26\nSolc 0.8.26 finished in 397.87ms\nCompiler run successful!\n","passed":true},{"durationMs":1046,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/LaunchTransfers.t.sol:LaunchTransfersTest\n[PASS] testFuzz_DistributionConservesWholeSupply(uint256) (runs: 1000, μ: 218433, ~: 218786)\n[PASS] test_ApprovedSettlementAndLiquidityDustArriveWhole() (gas: 352222)\n[PASS] test_FactoryHoldsWholeSupplyBeforeAnyDistribution() (gas: 37923)\n[PASS] test_FullPoolBudgetCanBeTransferredAndTradedBothDirections() (gas: 274318)\n[PASS] test_PoolManagerAndFactoryCannotPullHolderTokensWithoutApproval() (gas: 178100)\n[PASS] test_SwarmAllocationAndClaimArriveWhole() (gas: 143495)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 22.03ms (23.18ms CPU time)\n\nRan 31 tests for test/SCATToken.t.sol:SCATTokenTest\n[PASS] testFuzz_AnyNonzeroRecipientReceivesExactAmount(address,uint256) (runs: 1000, μ: 72380, ~: 73387)\n[PASS] testFuzz_DelegatedRoundTripAndRemainingAllowance(uint256,uint256) (runs: 1000, μ: 139313, ~: 170123)\n[PASS] testFuzz_TransferRoundTripConservesEntireSupply(uint256) (runs: 1000, μ: 113839, ~: 114143)\n[PASS] test_AdminMintBurnAndUpgradeSelectorsRevertForDeployerAndStranger() (gas: 1557066)\n[PASS] test_ApprovalDoesNotRequireBalanceOrReserveTokens() (gas: 170857)\n[PASS] test_ApproveOverwritesAndRevokesWithEvent() (gas: 156148)\n[PASS] test_Create2MintsToImmediateFactoryAtPredictedAddress() (gas: 252500)\n[PASS] test_CreateMintsToImmediateFactory() (gas: 255177)\n[PASS] test_EntireSupplyCanMoveWithoutFeeOrLimit() (gas: 138836)\n[PASS] test_MaximumTransferAmountCannotOverflowBalances() (gas: 130618)\n[PASS] test_MetadataAndEntireSupplyMintedOnceWithEvent() (gas: 34742)\n[PASS] test_PlainEtherAndUnknownCallsRevert() (gas: 108260)\n[PASS] test_RevertAllowanceCannotBeReusedByAnotherSpenderOrOwner() (gas: 180362)\n[PASS] test_RevertApproveZeroApprover() (gas: 30860)\n[PASS] test_RevertApproveZeroSpender() (gas: 34580)\n[PASS] test_RevertBalanceFailureRollsBackAllowanceSpending() (gas: 106192)\n[PASS] test_RevertInvalidRecipientRollsBackAllowanceSpending() (gas: 95588)\n[PASS] test_RevertOverAllowancePreservesState() (gas: 100236)\n[PASS] test_RevertSelfTransferWithInsufficientBalance() (gas: 37205)\n[PASS] test_RevertTransferFromRequiresAllowanceEvenForHolder() (gas: 33510)\n[PASS] test_RevertTransferFromZeroSender() (gas: 58086)\n[PASS] test_RevertTransferToZeroEvenForZeroAmount() (gas: 63836)\n[PASS] test_RevertTransferWithInsufficientBalance() (gas: 44996)\n[PASS] test_RuntimeContainsNoForbiddenOpcodes() (gas: 378141)\n[PASS] test_SelfTransferFromConsumesAllowanceButPreservesBalance() (gas: 94730)\n[PASS] test_SelfTransferPreservesEntireBalance() (gas: 40624)\n[PASS] test_TimeAndBlocksDoNotUnlockNewSupplyOrRestrictions() (gas: 64080)\n[PASS] test_TransferFromConsumesExactAllowanceWithTransferEvent() (gas: 186168)\n[PASS] test_UnlimitedAllowanceIsNotDecremented() (gas: 116165)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 50341)\n[PASS] test_ZeroTransferFromWithoutAllowanceEmitsEvent() (gas: 46344)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 22.05ms (73.39ms CPU time)\n\nRan 1 test for test/SCATToken.invariant.t.sol:SCATTokenInvariantTest\n[PASS] invariant_SupplyEqualsSumOfAllBalancesAndNeverChanges() (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------+----------------------+-------+---------+----------╮\n| Contract    | Selector             | Calls | Reverts | Discards |\n+=================================================================+\n| SCATHandler | approve              | 3272  | 0       | 0        |\n|-------------+----------------------+-------+---------+----------|\n| SCATHandler | rejectOverdraw       | 3331  | 0       | 0        |\n|-------------+----------------------+-------+---------+----------|\n| SCATHandler | rejectUnapprovedPull | 3205  | 0       | 0        |\n|-------------+----------------------+-------+---------+----------|\n| SCATHandler | transfer             | 3289  | 0       | 0        |\n|-------------+----------------------+-------+---------+----------|\n| SCATHandler | transferFrom         | 3287  | 0       | 0        |\n╰-------------+----------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.00s (1.00s CPU time)\n\nRan 3 test suites in 1.00s (1.05s CPU time): 38 tests passed, 0 failed, 0 skipped (38 total tests)\n","passed":true},{"durationMs":18,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SCATToken.approve(address,uint256)\",\"SCATToken.transfer(address,uint256)\",\"SCATToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":142,\"foundry.toml\":12,\"launch.json\":25,\"src/SCATToken.sol\":71,\"test/LaunchTransfers.t.sol\":121,\"test/SCATToken.invariant.t.sol\":107,\"test/SCATToken.t.sol\":409,\"test/helpers/TestBase.sol\":41,\"test/helpers/TokenDeployer.sol\":15},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":301,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":194,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SCATToken.sol:11: Large Numeric Literal","passed":true}],"detail":"launch.json is not a valid launch manifest: (root): Unrecognized key: \"chainId\"","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"6466fb682265aa3a6ccebeeab1c7477139cb93b0c4032f177127f23be21f48e0","verifiedTreeHash":"a17403dea43d9dbb2e7408ca9221887425b602fa","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":332,"exitCode":0,"name":"build","output":"Compiling 4 files with Solc 0.8.26\nSolc 0.8.26 finished in 285.57ms\nCompiler run successful!\n","passed":true},{"durationMs":839,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 28 tests for test/SCATToken.t.sol:SCATTokenTest\n[PASS] testFuzz_AllowanceLimitsSpendingAndIsAtomic(uint256,uint256) (runs: 1000, μ: 179561, ~: 181952)\n[PASS] testFuzz_TransferRoundTripConservesSupply(address,uint256) (runs: 1000, μ: 121219, ~: 121696)\n[PASS] testFuzz_ZeroRecipientAlwaysReverts(uint256) (runs: 1000, μ: 42161, ~: 42115)\n[PASS] test_ApprovalDoesNotAuthorizeAnotherSpender() (gas: 92135)\n[PASS] test_ApproveReplacesAndRevokesOnlyCallersAllowance() (gas: 218701)\n[PASS] test_ApproveZeroApproverReverts() (gas: 30655)\n[PASS] test_ApproveZeroSpenderReverts() (gas: 34601)\n[PASS] test_ConstructorMintsEntireSupplyAndEmitsEvent() (gas: 33318)\n[PASS] test_Create2MintsToFactoryRatherThanTransactionOrigin() (gas: 206619)\n[PASS] test_EntireSupplyCanMoveAndReturnWithoutLimits() (gas: 128170)\n[PASS] test_FactoryDistributionClaimsAndPoolManagerTransfersAreExact() (gas: 540676)\n[PASS] test_FiniteAllowanceCanBeSpentExactlyOnce() (gas: 238086)\n[PASS] test_InfiniteAllowanceRemainsInfiniteAcrossSpends() (gas: 218410)\n[PASS] test_InsufficientBalanceRollsBackAllowance() (gas: 105634)\n[PASS] test_InvalidRecipientRollsBackAllowance() (gas: 95028)\n[PASS] test_MaximumTransferCannotOverflowOrChangeSupply() (gas: 50015)\n[PASS] test_NoAdminMintBurnOrUpgradeEntryPointsForDeployerOrStranger() (gas: 1235763)\n[PASS] test_NoRecipientCallbackIsRequired() (gas: 251967)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 358275)\n[PASS] test_SelfTransferPreservesBalance() (gas: 68502)\n[PASS] test_TransferEmitsExactAmount() (gas: 72449)\n[PASS] test_TransferFromByHolderStillRequiresAllowance() (gas: 134094)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 94357)\n[PASS] test_TransferToRemainderAddressDoesNotBurnSupply() (gas: 60386)\n[PASS] test_UnknownCallAndEtherAreRejected() (gas: 58546)\n[PASS] test_ZeroSenderCannotTransferEvenZero() (gas: 57767)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 55288)\n[PASS] test_ZeroTransferFromWithoutAllowanceSucceedsAndEmitsEvent() (gas: 53231)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 21.95ms (70.12ms CPU time)\n\nRan 1 test for test/SCATToken.invariant.t.sol:SCATTokenInvariantTest\n[PASS] invariant_AllBalancesSumToFixedSupply() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 5425  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 5548  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 5411  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 791.93ms (791.18ms CPU time)\n\nRan 2 test suites in 793.20ms (813.88ms CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true},{"durationMs":26,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SCATToken.approve(address,uint256)\",\"SCATToken.transfer(address,uint256)\",\"SCATToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"LICENSE\":21,\"README.md\":117,\"foundry.toml\":12,\"launch.json\":24,\"src/SCATToken.sol\":73,\"test/SCATToken.invariant.t.sol\":87,\"test/SCATToken.t.sol\":396,\"test/TestBase.sol\":27},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":281,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":193,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SCATToken.sol:12: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6c89181df5aedfea5afb2bb543694147a6fd9877e80ad8d23daf3cafa89cfbb8","verifiedTreeHash":"b0f978d4c4a8890f81446b01b6079135f8448d5f","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":528,"exitCode":0,"name":"build","output":"Compiling 6 files with Solc 0.8.26\nSolc 0.8.26 finished in 475.56ms\nCompiler run successful!\n","passed":true},{"durationMs":9351,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/SCATToken.adversarial.t.sol:SCATTokenAdversarialTest\n[PASS] testFuzz_ApprovalBelongsToHolderAndDoesNotFollowTokens(uint256) (runs: 1000, μ: 269737, ~: 269726)\n[PASS] testFuzz_DelegatedTransferWithAliasedRoles(uint256,uint256,uint8,bool) (runs: 1000, μ: 116683, ~: 105338)\n[PASS] testFuzz_FailedDelegatedTransferIsAtomicAfterPriorSpend(uint256,uint256,uint256,bool,bool) (runs: 1000, μ: 230132, ~: 231171)\n[PASS] testFuzz_ReplacementApprovalDoesNotAddToUnusedBudget(uint256,uint256,uint256) (runs: 1000, μ: 383297, ~: 384677)\n[PASS] test_CanonicalAdminCalldataCannotFreezeOrSeizeApprovedHoldings() (gas: 991662)\n[PASS] test_MaxMinusOneApprovalIsFiniteEvenWhenBalanceReturns() (gas: 225731)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 66.60ms (256.53ms CPU time)\n\nRan 28 tests for test/SCATToken.t.sol:SCATTokenTest\n[PASS] testFuzz_AllowanceLimitsSpendingAndIsAtomic(uint256,uint256) (runs: 1000, μ: 179745, ~: 181970)\n[PASS] testFuzz_TransferRoundTripConservesSupply(address,uint256) (runs: 1000, μ: 121236, ~: 121732)\n[PASS] testFuzz_ZeroRecipientAlwaysReverts(uint256) (runs: 1000, μ: 42164, ~: 42115)\n[PASS] test_ApprovalDoesNotAuthorizeAnotherSpender() (gas: 92135)\n[PASS] test_ApproveReplacesAndRevokesOnlyCallersAllowance() (gas: 218701)\n[PASS] test_ApproveZeroApproverReverts() (gas: 30655)\n[PASS] test_ApproveZeroSpenderReverts() (gas: 34601)\n[PASS] test_ConstructorMintsEntireSupplyAndEmitsEvent() (gas: 33318)\n[PASS] test_Create2MintsToFactoryRatherThanTransactionOrigin() (gas: 206619)\n[PASS] test_EntireSupplyCanMoveAndReturnWithoutLimits() (gas: 128170)\n[PASS] test_FactoryDistributionClaimsAndPoolManagerTransfersAreExact() (gas: 540676)\n[PASS] test_FiniteAllowanceCanBeSpentExactlyOnce() (gas: 238086)\n[PASS] test_InfiniteAllowanceRemainsInfiniteAcrossSpends() (gas: 218410)\n[PASS] test_InsufficientBalanceRollsBackAllowance() (gas: 105634)\n[PASS] test_InvalidRecipientRollsBackAllowance() (gas: 95028)\n[PASS] test_MaximumTransferCannotOverflowOrChangeSupply() (gas: 50015)\n[PASS] test_NoAdminMintBurnOrUpgradeEntryPointsForDeployerOrStranger() (gas: 1235763)\n[PASS] test_NoRecipientCallbackIsRequired() (gas: 251967)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 358275)\n[PASS] test_SelfTransferPreservesBalance() (gas: 68502)\n[PASS] test_TransferEmitsExactAmount() (gas: 72449)\n[PASS] test_TransferFromByHolderStillRequiresAllowance() (gas: 134094)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 94357)\n[PASS] test_TransferToRemainderAddressDoesNotBurnSupply() (gas: 60386)\n[PASS] test_UnknownCallAndEtherAreRejected() (gas: 58546)\n[PASS] test_ZeroSenderCannotTransferEvenZero() (gas: 57767)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 55288)\n[PASS] test_ZeroTransferFromWithoutAllowanceSucceedsAndEmitsEvent() (gas: 53231)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 66.63ms (194.62ms CPU time)\n\nRan 1 test for test/SCATToken.invariant.t.sol:SCATTokenInvariantTest\n[PASS] invariant_AllBalancesSumToFixedSupply() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 5431  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 5547  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 5406  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 889.72ms (888.65ms CPU time)\n\nRan 2 tests for test/SCATToken.model.invariant.t.sol:SCATTokenLedgerInvariantTest\n[PASS] invariant_EveryBalanceAndAllowanceMatchesIndependentLedger() (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------+--------------+-------+---------+----------╮\n| Contract          | Selector     | Calls | Reverts | Discards |\n+===============================================================+\n| SCATLedgerHandler | approve      | 8268  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| SCATLedgerHandler | transfer     | 8208  | 0       | 0        |\n|-------------------+--------------+-------+---------+----------|\n| SCATLedgerHandler | transferFrom | 8100  | 0       | 0        |\n╰-------------------+--------------+-------+---------+----------╯\n\n[PASS] test_HandlerExercisesSuccessfulAndRejectedCalls() (gas: 12118000)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.30s (9.30s CPU time)\n\nRan 4 test suites in 9.30s (10.32s CPU time): 37 tests passed, 0 failed, 0 skipped (37 total tests)\n","passed":true},{"durationMs":26,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SCATToken.approve(address,uint256)\",\"SCATToken.transfer(address,uint256)\",\"SCATToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"LICENSE\":21,\"README.md\":117,\"foundry.toml\":12,\"launch.json\":24,\"src/SCATToken.sol\":73,\"test/SCATToken.adversarial.t.sol\":187,\"test/SCATToken.invariant.t.sol\":87,\"test/SCATToken.model.invariant.t.sol\":189,\"test/SCATToken.t.sol\":396,\"test/TestBase.sol\":27},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"fbce10403e3390355830b86c4eac1c0fa91fae02747f3e83519b908639335859","verifiedTreeHash":"74f4ecd3b6adbe2f4b174bef548c1fbb9c3d5673","verifierVersion":"0.1.0+ad90ce4c"}]}