{"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":"a9b8bc8f-944e-4b22-b45a-16be46558c98","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"7f55dd6ad9b4c5da9cec2d6e40bcd7141124366045df52cc630ef24efc147f45","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":"46217f44749049cccb7e19d843b6057de7ab5507abfd46b277d64090b8bf075c","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":"d0e5ff95a3408e5c485f18610763a789ab09c4227fa26fe51052951164acf3d9","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":"6d484aed4af3bc575b6229bf6ee8a005f2749d4905557797b28352922739a797","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":"4e810e422e4d6c6175de3c36fc8b9a8eb1373ea97915d17564ec710d34e7857e","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":"f0c2b9491eeff8695196ee2189d1cb6d8c9448f47cb096f7962eb0b9de080fec","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"c31115b47b4e5ef36b3f08fbda7991cd6f6d3ff73afb19f8f1e38c1a84498858","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"870139ae7d39ed8c15fb9e64157316a6a4703e2dac30ec46c33c77c6ac988006","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Scoop (SCOOP).\nToken name: Scoop\nToken symbol: SCOOP\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"97854a6d86cdf5ad9a98630cacfec49c53a3ef9645d288e2587b4495261f1794","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"a9b8bc8f-944e-4b22-b45a-16be46558c98","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1396-scoop"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52174","feedbackHash":"ef45f32b242e11218fbf3ffdb82f5ddbf0009d24bb77c8fb7e3984c44c10250c","nodeKey":"audit_economics","submissionHash":"7f55dd6ad9b4c5da9cec2d6e40bcd7141124366045df52cc630ef24efc147f45","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52173","feedbackHash":"780320ad9f1f45385a18b3ae835b125e510265b630a1936222322d66dddc8a86","nodeKey":"audit_flow","submissionHash":"46217f44749049cccb7e19d843b6057de7ab5507abfd46b277d64090b8bf075c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52011","feedbackHash":"8715e9ff08f1afb97f097a121e1a3cab1138b62db46b746c42191f0587de6d85","nodeKey":"audit_judge","submissionHash":"d0e5ff95a3408e5c485f18610763a789ab09c4227fa26fe51052951164acf3d9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52214","feedbackHash":"23013c0244ad566e7f389d046d4fe8b6fc76f100e39d428cfe989258a2d16e25","nodeKey":"audit_math","submissionHash":"6d484aed4af3bc575b6229bf6ee8a005f2749d4905557797b28352922739a797","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52323","feedbackHash":"13f849debccc7c1c69a5f83e39959f22c73da31199db9801b776b66d55c4a6ad","nodeKey":"audit_permissions","submissionHash":"4e810e422e4d6c6175de3c36fc8b9a8eb1373ea97915d17564ec710d34e7857e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51510","feedbackHash":"11c514809880086319f250e823f7fbfe5448da4e1cb6244889469b85bafb63de","nodeKey":"build_contract_project","submissionHash":"f0c2b9491eeff8695196ee2189d1cb6d8c9448f47cb096f7962eb0b9de080fec","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52420","feedbackHash":"70cdd1a66d011c0f3fee6b4729edf2bb1d6d55fb5f7aea12e05948ec04da7451","nodeKey":"manifest","submissionHash":"c31115b47b4e5ef36b3f08fbda7991cd6f6d3ff73afb19f8f1e38c1a84498858","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52180","feedbackHash":"b1582b0db77abe056631d0cb04d16fc0d02998cedc4f1a95b6e95af21f0f9306","nodeKey":"write_foundry_tests","submissionHash":"870139ae7d39ed8c15fb9e64157316a6a4703e2dac30ec46c33c77c6ac988006","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"401a4ca7160c6c9eb9752063f14bee63a8b89e5253c02b32e1ebd6a86016b606","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c2e167266d13dcf4","findings":[{"citation":"resolved","description":"Execution trace of transferFrom(from, to, amount): _spendAllowance(from, msg.sender, amount) reads allowance[from][msg.sender] (0 for any pair that never approved), passes the `current < amount` check when amount == 0, writes the allowance back as 0 and emits Approval(from, msg.sender, 0). _transfer then rejects only `to == address(0)`; it never checks `from`. With amount == 0 the balance check `0 < 0` is false, so the call completes and emits Transfer(from, to, 0). Consequently an unprivileged caller can, with no balance and no allowance, (a) emit Transfer(address(0), anyAddress, 0), which off-chain indexers and explorers read as a mint from the zero address (the only other Transfer from address(0) is the real constructor mint), and (b) emit Approval(anyOwner, caller, 0) for an owner who never approved anything. Balances, allowances and totalSupply are not affected: a non-zero amount from address(0) reverts because balanceOf[address(0)] is always 0 (checked: it reverts with InsufficientAllowance before even reaching the balance check). The OpenZeppelin reference implementation reverts in _transfer when from == address(0) (ERC20InvalidSender) and its v5 _spendAllowance does not emit Approval on spend, so this is a divergence from the reference behaviour rather than from the ERC-20 text, which permits zero-value transfers. No funds are at risk; the impact is limited to spoofed zero-value events that can confuse mint/approval indexers or alerting. Minimal fix that preserves intended behaviour: add `if (from == address(0)) revert ZeroAddress();` at the top of _transfer (and optionally skip the Approval emission when nothing was consumed). Note that OpenZeppelin-style tokens also allow Transfer(owner, to, 0) from arbitrary owners, so only the from-zero case is unusual.","line":116,"path":"src/ScoopToken.sol","reproduction":"State: freshly constructed ScoopToken; attacker = any EOA holding 0 SCOOP with no allowances. Call 1: vm.prank(attacker); token.transferFrom(address(0), attacker, 0). Expected (reference ERC-20 behaviour): revert, since the zero address is not a valid sender. Actual: returns true and emits Approval(address(0), attacker, 0) followed by Transfer(address(0), attacker, 0); totalSupply still 1000000000000000000000000000 and every balance unchanged. Call 2: vm.prank(attacker); token.transferFrom(victim, attacker, 0) where victim never approved attacker. Actual: returns true and emits Approval(victim, attacker, 0) and Transfer(victim, attacker, 0). Confirmed with a scratch Foundry test using vm.expectEmit on both events (test/scratch, not kept). Control: token.transferFrom(address(0), attacker, 1) reverts with InsufficientAllowance(attacker, 0, 1), so no non-zero amount can ever leave the zero address.","severity":"info","snippet":"        if (to == address(0)) revert ZeroAddress();\n        uint256 fromBalance = balanceOf[from];\n        if (fromBalance < amount) revert InsufficientBalance(from, fromBalance, amount);","title":"_transfer does not reject from == address(0), so anyone can emit a zero-value Transfer from the zero address (a fake mint event) and a zero Approval for any owner"}],"hash":"46217f44749049cccb7e19d843b6057de7ab5507abfd46b277d64090b8bf075c","nodeId":"19db4091-1063-4841-b4ce-1ed76d506716","outcome":"completed","summary":"The review is complete and recorded in `.imd-findings.json` at the repository root. No source file was changed and the scratch test was removed.\n\n**Outcome:** the Scoop token is sound in the assigned area. I found no defect that moves funds, grows supply, or breaks a launch flow. One informational item is reported.\n\n**What I covered**\n\n- All five state-changing entry points were traced from call to final state against the Execution Trace, Periphery and First Principles guides: parameter divergence, sentinel bypass, stale reads, partial updates, approval residuals, boundary values (zero, max, whole balance, self-transfer), and unchecked arithmetic reasoning. Each row in the coverage record carries a reason.\n- Invariants checked and recorded as rows: the constructor mints exactly the stated supply once to the deployer, the supply is immutable with no mint or admin selector in the ABI, every transfer path moves exactly the requested amount so the swarm share, pool seed and swaps arrive whole, and the runtime has no dangerous opcodes or fallback.\n- Periphery: the deploy script is outside the launch path and only wraps the constructor. Vendored forge-std is test tooling and not linked into the token.\n- Existing suite passes (32 tests). A scratch fuzz of balance conservation across two hops also passed.\n\n**The one finding (info)**\n\nThe private transfer routine rejects a zero recipient but never checks the sender. Combined with a zero-amount allowance spend that always passes, any caller with no tokens and no allowance can emit a zero-value Transfer from the zero address, which indexers read as a mint event, and a zero Approval naming any owner. Balances, allowances and total supply are untouched. A non-zero amount from the zero address reverts. The reproduction is two calls on a fresh token, confirmed with event assertions. The suggested fix is a one-line sender check that preserves all intended behaviour.\n\n**Leads from static analysis:** the only tool line was a low-impact large-literal note on the supply constant. The literal equals the stated supply exactly, so it is not a defect.\n\n**Not reached:** nothing inside the assigned area. The manifest and launch service checks were not in the tree and were not assessed.","treeHash":null,"usage":{"cachedInputTokens":667553,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":14038,"runtime":"claude","turns":22,"wallClockMs":207161}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3a720671678111bc","findings":[{"citation":"resolved","description":"Asymmetry between the two address checks in `_transfer` (src/ScoopToken.sol:115-118). `to == address(0)` reverts with `ZeroAddress()` (line 116) but `from` is never checked, and `transferFrom` (line 90) accepts any `from`, including `address(0)`. With `amount == 0`, `_spendAllowance(address(0), msg.sender, 0)` passes (allowance 0 is not < 0) and `_transfer(address(0), to, 0)` passes the balance check (0 is not < 0), so the call succeeds and emits `Approval(address(0), caller, 0)` and `Transfer(address(0), to, 0)`. `Transfer` from the zero address is the event shape the constructor uses for the single real mint (line 67), and explorers, indexers and wallets label it a mint. An unprivileged caller can therefore stamp fake zero-value 'mint' events on the token's log for any recipient they choose, including the factory, the distributor or the requester's remainder address, at any time after launch. The zero-value `transferFrom(victim, lookalike, 0)` variant (standard ERC-20 behaviour, also accepted by OpenZeppelin) is the address-poisoning primitive; the zero-sender variant goes beyond what OpenZeppelin v5 permits (it reverts with `ERC20InvalidSender(address(0))`). No balance or supply changes: `balanceOf[address(0)]` is always 0 because transfers to it are refused, so a non-zero amount reverts (with `InsufficientAllowance` first, then `InsufficientBalance`). Impact is limited to off-chain log integrity, hence low. Fix: add `if (from == address(0)) revert ZeroAddress();` at the top of `_transfer`, mirroring the `to` check; this preserves every intended behaviour (the constructor writes storage directly and does not go through `_transfer`).","line":115,"path":"src/ScoopToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ScoopToken} from \"src/ScoopToken.sol\";\n\n/// @notice `_transfer` rejects `to == address(0)` but never checks `from`. Any account can therefore\n/// call `transferFrom(address(0), anyone, 0)` with no allowance and have the token emit\n/// `Transfer(address(0), anyone, 0)`: the same event shape the constructor uses for the one real mint.\n/// Fails on the current code (the call succeeds and emits). Passes once `_transfer` rejects a zero\n/// `from` the way it rejects a zero `to`.\ncontract ZeroSenderTransferTest is Test {\n    address deployer = makeAddr(\"deployer\");\n    address attacker = makeAddr(\"attacker\");\n    ScoopToken token;\n\n    function setUp() public {\n        vm.prank(deployer);\n        token = new ScoopToken();\n    }\n\n    function test_transferFromZeroSenderMustRevert() public {\n        vm.expectRevert(ScoopToken.ZeroAddress.selector);\n        vm.prank(attacker);\n        token.transferFrom(address(0), attacker, 0);\n    }\n}","reproduction":"State: fresh ScoopToken deployed by any deployer; attacker holds no tokens and no allowance. Call: vm.prank(attacker); token.transferFrom(address(0), attacker, 0). Expected (mirroring the `to` check and OpenZeppelin ERC20): revert ZeroAddress(). Actual: returns true and emits Approval(0x0000000000000000000000000000000000000000, attacker, 0) and Transfer(0x0000000000000000000000000000000000000000, attacker, 0). Trace from forge -vvv: `emit Approval(owner: 0x0000…0000, spender: attacker, amount: 0)`, `emit Transfer(from: 0x0000…0000, to: attacker, amount: 0)`, `← [Return] true`. Balances and totalSupply are unchanged. test/scratch/ZeroSenderTransfer.t.sol fails on the current code with `next call did not revert as expected`.","severity":"low","snippet":"    function _transfer(address from, address to, uint256 amount) private {\n        if (to == address(0)) revert ZeroAddress();\n        uint256 fromBalance = balanceOf[from];\n        if (fromBalance < amount) revert InsufficientBalance(from, fromBalance, amount);","title":"_transfer validates the recipient but not the sender: anyone can emit Transfer(address(0), X, 0), the mint-event shape, via transferFrom with no allowance"}],"hash":"4e810e422e4d6c6175de3c36fc8b9a8eb1373ea97915d17564ec710d34e7857e","nodeId":"b7f8a37c-0f20-4382-88ed-5648aebb7052","outcome":"completed","summary":"The review is complete. The source tree is unchanged, and the findings file is in place.\n\n**Outcome.** The Scoop token has no privileged surface at all, so the Access Control and Trust Gap guides produce no findings. One low-severity Asymmetry defect is substantiated and recorded in `.imd-findings.json`, with a Foundry proof under `test/scratch/` that fails on the current code and passes with the one-line fix.\n\n**Finding 1 (low), src/ScoopToken.sol:115.** The internal transfer helper rejects a zero recipient but never checks the sender. Any account can call `transferFrom(address(0), anyone, 0)` with no allowance, and the token emits an Approval and a Transfer from the zero address. That is the same event shape the constructor uses for the one real mint, so explorers and indexers label it a mint. No balance or supply changes, since the zero address can never hold tokens and a non-zero amount reverts. Impact is limited to off-chain log integrity. OpenZeppelin v5 rejects this case. The fix is to add the mirrored zero-sender check at the top of the helper. I verified the fix makes the proof pass while the existing 32-test suite still passes.\n\n**What I covered in depth.**\n- Access Control: enumerated all five state-changing entry points plus constructor, receive and fallback. No owner, modifier, initializer, proxy, pause, blocklist, fee or exemption list exists. The constructor hands out only the supply to the deployer. The admin-style selectors the launch floor probes all revert for stranger and deployer alike.\n- Trust Gap: no privileged actor exists, so no access-times-economics or access-times-asymmetry seam is reachable. The launch flows (factory to distributor, claims, pool seed, swaps) move exact amounts with no exemption logic, matching the protected test's expectations and the empty constructor arguments.\n- Asymmetry: diffed transfer against transferFrom, approve against increase and decrease allowance, and both zero-address checks. Verified self-transfer, infinite allowance, max-minus-one allowance, and three-party conservation under fuzzing.\n\n**Coverage record.** All five listed entry points have rows: four hold, transferFrom carries finding 1. Three additional invariant rows are included.\n\n**Static analysis leads.** Slither reported nothing. Aderyn's large-numeric-literal line is the supply constant and is not a defect.\n\n**Not reached.** The manifest does not exist yet, so no manifest review was possible. Nothing else in scope was left unexamined.","treeHash":null,"usage":{"cachedInputTokens":799478,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14183,"runtime":"claude","turns":22,"wallClockMs":226191}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6b47d1bf92391c22","findings":[{"citation":"resolved","description":"_transfer checks only the recipient for the zero address and never the sender. At the amount = 0 boundary, _spendAllowance(address(0), msg.sender, 0) passes because the allowance is 0 and 0 >= 0, and the balance check 0 >= 0 passes too. Any caller can therefore emit Approval(address(0), caller, 0) and Transfer(address(0), to, 0). Balances and totalSupply do not change, so no value is at risk. The trouble is that a Transfer from the zero address is the ERC-20 mint signal, and an off-chain supply tracker that takes those events at face value sees mints happen after construction on a token documented as minting only once. OpenZeppelin ERC20 reverts here (ERC20InvalidApprover / ERC20InvalidSender).","line":116,"path":"src/ScoopToken.sol","reproduction":"Deploy ScoopToken. From any EOA, call transferFrom(address(0), address(2), 0). Expected: revert ZeroAddress, as for a zero recipient. Actual: it returns true and emits Approval(0x0, caller, 0) and Transfer(0x0, 0x2, 0). Confirmed with a local Foundry test (test_fromZero passed, meaning the call did not revert). Fix: add `if (from == address(0)) revert ZeroAddress();` to _transfer.","severity":"info","snippet":"        if (to == address(0)) revert ZeroAddress();","title":"transferFrom accepts from == address(0) with amount 0, emitting a Transfer(0x0, to, 0) that indexers read as a mint"}],"hash":"6d484aed4af3bc575b6229bf6ee8a005f2749d4905557797b28352922739a797","nodeId":"3f6cfdf5-a4b7-4780-adb5-aad61b99a01e","outcome":"completed","summary":"I found no math, precision or boundary defects in `src/ScoopToken.sol` that put value at risk. The one thing I report is an informational quirk, and the results are in `.imd-findings.json`.\n\n**Finding 1 (info):** anyone can call `transferFrom(address(0), to, 0)` and it succeeds. The sender is never checked for the zero address (the check sits at `src/ScoopToken.sol:116` and only covers the recipient). At amount 0 the allowance and balance checks both pass, so the call emits `Transfer(0x0, to, 0)`. That is the standard mint signal, so an off-chain supply tracker could log mints on a token documented as minting only once. Balances and supply don't change. OpenZeppelin's ERC-20 reverts in this case; the fix is one line adding a zero-address check on the sender in `_transfer`.\n\n**What I checked against the three guides:**\n- **The two unchecked blocks:**\n  - The balance subtraction in `_transfer` is safe because it only runs after the balance check.\n  - The recipient's balance can't overflow because all balances add up to the fixed supply of 1e27.\n  - The allowance subtraction in `_spendAllowance` is safe for the same reason as the balance subtraction.\n- **Allowance edges:** an unlimited allowance (`type(uint256).max`) is not reduced when spent, which is intended. Raising it by 1 reverts, and lowering it by 1 makes it an ordinary finite allowance.\n- **Off-by-one:** spending one more than the balance or the allowance reverts. Zero-amount transfers work.\n- **Self-transfer:** the balance stays the same.\n- **Supply constant:** `1_000_000_000 * 10 ** 18` is exactly 1e27 and fits easily. Aderyn's \"large numeric literal\" warning on line 25 is only about style.\n\nI wrote a throwaway Foundry test covering these cases, including two fuzz tests that check tokens are conserved across transfers. All 5 tests passed, and the project's own 32 tests still pass (37 in the full run). I then deleted the scratch test, so no repository file is changed apart from `.imd-findings.json`.\n\n**Coverage:** all five entry points have a row. `approve`, `increaseAllowance`, `decreaseAllowance` and `transfer` hold; `transferFrom` points to finding 1. There is also a row for the invariant that the supply is fixed and never grows. The token has no owner, fees or mint path, so the rest of the math checklist (fees, rounding, price math) has nothing to apply to. There is no `launch.json` in the tree yet, so I did not review a manifest.","treeHash":null,"usage":{"cachedInputTokens":278747,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":4546,"runtime":"claude","turns":6,"wallClockMs":52927}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b4f6137e7c93a2b3","findings":[],"hash":"7f55dd6ad9b4c5da9cec2d6e40bcd7141124366045df52cc630ef24efc147f45","nodeId":"a336d1bf-9bb4-4c76-9c95-d7e7117219d2","outcome":"completed","summary":"The findings file is in place at the repository root, the scratch tests are removed, and the tracked tree is unchanged.\n\n**Result: no defects found in the Economic Security, Invariant and Flow Gap areas.** The findings list is empty and the coverage record answers all five entry points as `holds`, plus six invariant and flow rows.\n\n**What I checked**\n\n- **Economic Security.** The token has no external dependencies, no oracle, no callbacks and no fee, tax, reflection, pause, blocklist or exemption list. Every ERC-20 function returns a well-formed `true`, which is what the Uniswap v4 currency library expects from its low-level call. A scratch probe that settles the way the PoolManager does, by balance difference, credited exactly the amount sent in both directions.\n- **Invariant.** The sum of balances equals the fixed supply of 1,000,000,000e18. Only one private function writes balances and it subtracts and adds the same amount. A Foundry invariant run of 256 sequences and 128,000 random transfer and transferFrom calls over five actors never broke it. The supply is an immutable, the ABI exposes no mint, burn, owner, initializer, receive or fallback, and transfer to the zero address reverts, so no path grows or shrinks it. Self-transfer through both paths keeps the balance; the allowance underflow and overflow boundaries revert.\n- **Flow Gap.** The factory to distributor to claimant flow moves 10 percent whole and drains the distributor to exactly zero. The pool seed and swaps see no shortfall. The whole supply, 1e27, fits the int128 deltas the PoolManager uses. Constructor takes no arguments, so CREATE2 with empty constructorArgs deploys it unchanged and all supply lands on the factory.\n- **Static analysis leads.** The single aderyn low on the large numeric literal at line 25 is a style note; the literal equals the manifest supply exactly and is not a defect.\n\n**Trust assumptions.** None in the code. The only custodial point is whoever controls the remainder address, which is launch policy rather than token code.\n\n**Not covered.** The deployer's liquidity math and the opening price derivation are outside the token and I did not evaluate them.","treeHash":null,"usage":{"cachedInputTokens":670553,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":13651,"runtime":"claude","turns":27,"wallClockMs":200408}},{"artifacts":[],"attempt":1,"bundleHash":"faa9965196c53aa362985c79ec2776aaccabbdd229fe0fcc3a58773810f91b8c","device":"c722c2e9ac9aa084","findings":[{"description":"`_transfer` validates `to != address(0)` but never validates `from`. `transferFrom(address(0), to, 0)` is callable by anyone on chain: the allowance check passes because 0 <= allowance[address(0)][caller] == 0, the balance check passes because 0 <= balanceOf[address(0)] == 0, and the call succeeds, emitting `Approval(address(0), caller, 0)` and `Transfer(address(0), to, 0)`. No balance or supply changes, so this is not an exploit, and ERC-20 permits zero-value transfers. It is reported because a `Transfer` whose `from` is the zero address is the conventional mint signal: indexers, explorers and the launch's own tooling that count mints by that pattern will see mint events of zero after construction, which contradicts the contract's documented 'minted once' property at the event level. OpenZeppelin's ERC20 rejects `from == address(0)` in `_transfer` with `ERC20InvalidSender` for this reason. The test suite asserts the balance and supply consequences (nothing moves, nothing is minted) but does not assert the event as correct.","line":90,"path":"src/ScoopToken.sol","reproduction":"Deploy ScoopToken. From any account X (no approvals anywhere), call token.transferFrom(address(0), X, 0). Expected (if the zero address is rejected as a sender): revert with ZeroAddress(). Actual: returns true and emits Approval(0x0, X, 0) and Transfer(0x0, X, 0); totalSupply and all balances are unchanged. With amount > 0 the call correctly reverts: InsufficientAllowance(X, 0, amount) when X holds no allowance from the zero address, and InsufficientBalance(0x0, 0, amount) when it does (an approve pranked from address(0) in a test), so no value can be created this way.","severity":"info","title":"transferFrom accepts the zero address as `from` for a zero amount and emits a mint-shaped Transfer event"}],"hash":"870139ae7d39ed8c15fb9e64157316a6a4703e2dac30ec46c33c77c6ac988006","nodeId":"ddad6957-fb6e-4f55-9f12-bbbdffa63d95","outcome":"completed","summary":"Done. The suite builds with no warnings and `forge test` passes 86 tests across three files. Only test paths were touched, and nothing was installed.\n\n**What I added** on top of the accepted unit suite, which I left untouched:\n\n- `test/ScoopToken.invariants.t.sol` holds a handler and six invariants over random call sequences. The handler drives six actors plus arbitrary fuzzed recipients with bounded inputs and keeps a ghost ledger of balances and allowances. Every failure path is exercised inside the handler through try/catch with the exact custom error asserted, and the run uses fail-on-revert so a missing or half-applied revert fails the test. Invariants: fixed supply, sum of all holder balances equals supply, balances match the ghost ledger, allowances match the ghost ledger, the zero address holds nothing, and every holder can still move its whole balance after any sequence. I grounded the harness with two scratch mutants of the token (sender never debited, allowance check removed) and both were caught.\n- `test/ScoopToken.edges.t.sol` holds 48 edge and failure-path tests: one wei, the whole supply twice, the maximum, zero to the zero address, allowance exactly one below the unlimited sentinel, the order in which transferFrom's two checks fire, the allowance decrement rolling back on a balance revert, the owner needing a self-allowance, no path that mints from the zero address, the deployer having no residual power, and a mirror of the launch flows (10% swarm, 80% pool pull, 10% remainder, seven uneven claims) arriving whole. The fuzz tests use `bound` only, with 1000 runs set by inline config.\n\n**Finding reported** in `.imd-findings.json`, severity info, no proof needed: `transferFrom(address(0), to, 0)` succeeds for any caller and emits a mint-shaped `Transfer(0x0, to, 0)` event after construction. Balances and supply are unchanged and any non-zero amount reverts, so there is no exploit. I did not assert that event as correct. The implementation is otherwise sound against everything I threw at it.\n\nFiles are left uncommitted in the working tree for the pipeline to pick up, as the earlier contributor's work was.","treeHash":"6796db3d750013dd33afaa8bcf2c9cfd5a5ae848","usage":{"cachedInputTokens":1690544,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":40582,"runtime":"claude","turns":30,"wallClockMs":592134}},{"artifacts":[],"attempt":1,"bundleHash":"1bbec40e78353124ead8ffe17dde118992fced5f8accf98a4537d10b0d50987e","device":"1559912e747bbcd4","findings":[],"hash":"c31115b47b4e5ef36b3f08fbda7991cd6f6d3ff73afb19f8f1e38c1a84498858","nodeId":"04ca34c3-bee5-415f-acc7-d74fd170401a","outcome":"completed","summary":"Done. I wrote `launch.json` describing the accepted Scoop launch, and it is the only changed file.\n\n**What the manifest says**\n\n- Kind `custom_token`, token contract ScoopToken, name Scoop, symbol SCOOP, 18 decimals.\n- Constructor arguments are an empty list. The compiled ABI confirms the constructor takes no inputs, and it mints the whole supply to msg.sender once.\n- Total supply is 1000000000000000000000000000 minor units, matching the INITIAL_SUPPLY constant in the source.\n- No application contracts. The tree holds only the token, a manual deploy script and tests.\n- Pool and economics are copied exactly from the launch terms: IMD pair at the given address, fee 12500, tick spacing 60, the one-to-one initialPrice, and the requester's economics object verbatim.\n- Notes explain the token's behavior and why it takes no launch placeholders, at 1473 characters.\n\n**Checks run**\n\n- A scratch script confirmed the manifest has only the schema's top-level keys, strings for uint256 and address fields, numbers for fee, tickSpacing and decimals, lowercase addresses, and the verbatim economics.\n- `forge build` succeeded and `forge test` passed all 32 tests.\n- `git status` shows launch.json as the only new or changed path.","treeHash":"5556a40cdeb073a4837080feddf1f7e514b06c3b","usage":{"cachedInputTokens":185939,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":2991,"runtime":"claude","turns":8,"wallClockMs":64217}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a406deaac63a93b0","findings":[{"citation":"resolved","description":"Merged from all four specialist reports (write_foundry_tests, audit_math, audit_permissions, audit_flow), which share one root cause: `_transfer` (src/ScoopToken.sol:115-126) validates only `to`, never `from`, and `transferFrom` (line 90) forwards any `from`. For amount == 0 every guard passes: `_spendAllowance(address(0), caller, 0)` reads allowance 0, `0 < 0` is false, writes 0 back and emits Approval(0x0, caller, 0); `_transfer` then sees balanceOf[0x0] == 0, `0 < 0` is false, and emits Transfer(0x0, to, 0). So any unprivileged account, with no balance and no allowance, can stamp zero-value Transfer events from the zero address, the exact shape the constructor uses for the single real mint (line 67), onto the log for any recipient it chooses. Balances, allowances and totalSupply never change: balanceOf[address(0)] is permanently 0 because transfers to it revert, so any non-zero amount reverts (InsufficientAllowance first, InsufficientBalance if an allowance from 0x0 were somehow present). ERC-20 permits zero-value transfers, but the reference implementation (OpenZeppelin ERC20) reverts in _transfer when from == address(0) with ERC20InvalidSender, and the contract's own documented property is that the supply is minted exactly once. Impact is confined to off-chain log integrity: explorers, indexers and alerting that count `Transfer` from the zero address as mints will see post-construction 'mints' of 0. No funds at risk, so low. The related observation that transferFrom(victim, caller, 0) emits Approval(victim, caller, 0) and Transfer(victim, caller, 0) without any approval is standard ERC-20 behaviour (OpenZeppelin accepts it too) and is not reported separately. Minimal fix preserving all intended behaviour: add `if (from == address(0)) revert ZeroAddress();` at the top of `_transfer`; the constructor writes storage directly and does not go through `_transfer`, so the one real mint is unaffected and every launch flow (factory to distributor, claims, pool seed, swaps) is unchanged.","line":116,"path":"src/ScoopToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ScoopToken} from \"src/ScoopToken.sol\";\n\n/// @notice `_transfer` rejects `to == address(0)` but never checks `from`. Any account can therefore\n/// call `transferFrom(address(0), anyone, 0)` with no allowance and have the token emit\n/// `Transfer(address(0), anyone, 0)`: the same event shape the constructor uses for the one real mint.\n/// Fails on the current code (the call succeeds and emits). Passes once `_transfer` rejects a zero\n/// `from` the way it rejects a zero `to`.\ncontract ZeroSenderTransferTest is Test {\n    address deployer = makeAddr(\"deployer\");\n    address attacker = makeAddr(\"attacker\");\n    ScoopToken token;\n\n    function setUp() public {\n        vm.prank(deployer);\n        token = new ScoopToken();\n    }\n\n    function test_transferFromZeroSenderMustRevert() public {\n        vm.expectRevert(ScoopToken.ZeroAddress.selector);\n        vm.prank(attacker);\n        token.transferFrom(address(0), attacker, 0);\n    }\n}","reproduction":"State: fresh ScoopToken deployed by `deployer`; `attacker` holds 0 SCOOP and no allowances. Call: vm.prank(attacker); token.transferFrom(address(0), attacker, 0). Expected (mirroring the `to` check and the reference ERC-20): revert ZeroAddress(). Actual: returns true and emits Approval(0x0000000000000000000000000000000000000000, attacker, 0) then Transfer(0x0000000000000000000000000000000000000000, attacker, 0); totalSupply stays 1000000000000000000000000000, balanceOf(attacker) and balanceOf(address(0)) stay 0. Verified with vm.expectEmit on both events. Controls: transferFrom(address(0), attacker, 1) reverts InsufficientAllowance(attacker, 0, 1); after vm.prank(address(0)); token.approve(attacker, 1) it reverts InsufficientBalance(0x0, 0, 1), so no value can ever leave the zero address. The attached proof (from the audit_permissions specialist, re-run here) fails on the current code with `next call did not revert as expected` and passes once `_transfer` rejects a zero `from`.","severity":"low","snippet":"        if (to == address(0)) revert ZeroAddress();\n        uint256 fromBalance = balanceOf[from];\n        if (fromBalance < amount) revert InsufficientBalance(from, fromBalance, amount);","title":"_transfer rejects a zero recipient but not a zero sender, so transferFrom(address(0), anyone, 0) succeeds and emits a mint-shaped Transfer(0x0, anyone, 0) with no allowance"}],"hash":"d0e5ff95a3408e5c485f18610763a789ab09c4227fa26fe51052951164acf3d9","nodeId":"3da938a3-9cdd-4e72-9815-0ae198f000e6","outcome":"completed","summary":"The review is complete. The findings file is at the repository root, the snippet matches line 116 of the token exactly, and the working tree has no other changes.\n\n**Outcome: one low finding, merged from all four specialist reports.**\n\n- **Zero sender accepted by transferFrom** (`src/ScoopToken.sol:116`). The transfer helper rejects a zero recipient but never checks the sender. With amount zero, every guard passes, so anyone with no balance and no allowance can make the token emit a Transfer from the zero address, the same event shape as the one real constructor mint. Balances, allowances and supply never change, and any non-zero amount reverts, so impact is limited to off-chain log integrity. Severity is low. The specialist proof fails on the current code for the stated reason, so I kept it on the finding. The minimal fix is a matching zero-sender check at the top of the transfer helper.\n\n**What I verified myself**\n\n- The full repository suite passes, including the opcode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT.\n- A scratch test confirmed the emitted Approval and Transfer events and both revert controls for non-zero amounts.\n- All five entry points are covered: four hold, transferFrom carries the finding. I also recorded rows for the constructor's fixed supply, the manifest, and the static-analysis leads.\n- The manifest uses only schema keys, has no constructor arguments to match the no-argument constructor, states the supply the constructor mints, and keeps notes under the limit.\n- The aderyn large-literal lead is style only. The constant evaluates to exactly one billion times ten to the eighteenth, which a repository test asserts, so I left it out.\n\nNothing else was found on my own pass. The token has no privileged roles, no external calls, no receive or fallback, and its creation and runtime code are far below the size limits.","treeHash":null,"usage":{"cachedInputTokens":464857,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":9700,"runtime":"claude","turns":15,"wallClockMs":157378}},{"artifacts":[],"attempt":1,"bundleHash":"bc340ef6d6a4f651c02f6b31b082737e69a0485da364fe1cf76d03ae7c415937","device":"8d428b115b0ebd64","findings":[],"hash":"f0c2b9491eeff8695196ee2189d1cb6d8c9448f47cb096f7962eb0b9de080fec","nodeId":"b4a66fa3-8d11-4b95-9851-213381fd7dbd","outcome":"completed","summary":"The Scoop (SCOOP) token project is complete, verified, and committed on `main`.\n\n**What was built**\n\n- `src/ScoopToken.sol` is a self-contained, fixed-supply ERC-20. The constructor takes no arguments and mints 1,000,000,000 SCOOP with 18 decimals once to the deployer, which is the launch factory at launch. There is no owner, minter, pause, fee, blocklist, burn, proxy or external call, so the supply can never grow and every launch flow moves exactly what it says.\n- `test/ScoopToken.t.sol` holds 32 tests covering success paths, failure paths with specific custom errors, fuzzed supply conservation and allowance handling, deployment through a CREATE2 factory probe, and mirrors of the protected floor's checks. The mirrored checks include the admin and freeze selector sweeps and the runtime opcode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT.\n- `script/DeployScoop.s.sol` offers a manual deploy helper whose `deploy()` function the tests call directly. It reads no environment variables.\n- `foundry.toml` pins solc 0.8.26 by version, sets `bytecode_hash = \"none\"`, disables ffi and filesystem access. forge-std v1.14.0 is vendored under `lib/` as 31 plain files with no nested git metadata or submodule.\n- `README.md` documents behaviour, assumptions, the launch's deployment parameters for the manifest step, manual deployment, operational responsibilities, and the security checklist review.\n\n**Verification results**\n\n| Check | Result |\n| --- | --- |\n| forge build | passes |\n| forge test | 32 passed, 0 failed |\n| forge fmt --check | passes |\n| Offline build and test with empty environment | passes |\n| Built runtime contains CBOR metadata | no |\n| Nested .git, submodule, launch.json, .env in tree | none |\n\n**Notes for the next steps**\n\n- No launch.json was written, by design. The README lists the values the manifest step needs.\n- The protected floor test itself could not be executed here because it depends on the harness's own v4-core and LaunchLiquidity sources, which were not provided. The tests mirror its token-facing assertions instead.\n- Only Foundry's compiler and tests ran. Slither and Mythril were not available, which the README records as an open item.","treeHash":"dda77697967ca5ed48fb53a1c66b95945a556ec1","usage":{"cachedInputTokens":680291,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":23744,"runtime":"claude","turns":28,"wallClockMs":316135}}],"verification":[{"checks":[{"durationMs":1629,"exitCode":0,"name":"build","output":"Compiling 25 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.53s\nCompiler run successful!\n","passed":true},{"durationMs":7010,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/ScoopToken.t.sol:ScoopTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 256, μ: 38746, ~: 39068)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 88019, ~: 88358)\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 113468, ~: 91554)\n[PASS] test_approveOverwritesPriorAllowance() (gas: 92464)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32505)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 64763)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8091)\n[PASS] test_constructorMintsWholeSupplyToDeployerOnce() (gas: 31567)\n[PASS] test_creationCodeHasNoConstructorArguments() (gas: 691069)\n[PASS] test_decreaseAllowanceRevertsBelowZero() (gas: 85318)\n[PASS] test_deployScriptMintsToTheBroadcaster() (gas: 1024098)\n[PASS] test_deployedByAContractMintsToThatContract() (gas: 768881)\n[PASS] test_increaseAllowanceRevertsOnOverflow() (gas: 84754)\n[PASS] test_increaseAndDecreaseAllowance() (gas: 149930)\n[PASS] test_metadata() (gas: 23748)\n[PASS] test_noAdminCallIncreasesSupplyOrMints() (gas: 635648)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 466849)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 677433)\n[PASS] test_transferFromInfiniteAllowanceIsNotDecremented() (gas: 129866)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 87957)\n[PASS] test_transferFromRevertsToZeroAddress() (gas: 89947)\n[PASS] test_transferFromRevertsWhenOwnerBalanceTooLow() (gas: 95096)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40392)\n[PASS] test_transferFromSpendsAllowance() (gas: 151144)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 84502)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37674)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 92534)\n[PASS] test_transferRevertsToZeroAddress() (gas: 32526)\n[PASS] test_transferToSelfKeepsBalance() (gas: 40382)\n[PASS] test_transferWholeBalance() (gas: 72031)\n[PASS] test_transferZeroAmountSucceeds() (gas: 44269)\n[PASS] test_unknownSelectorAndPlainEtherRevert() (gas: 60603)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 1.16s (1.19s CPU time)\n\nRan 48 tests for test/ScoopToken.edges.t.sol:ScoopTokenEdgesTest\n[PASS] testFuzz_approveLastWriteWins(address,uint256,uint256) (runs: 1000, μ: 90279, ~: 90491)\n[PASS] testFuzz_decreaseAllowanceBelowZeroReverts(uint256,uint256) (runs: 1000, μ: 90589, ~: 90801)\n[PASS] testFuzz_deployerHasNoResidualPower(uint256) (runs: 1000, μ: 126159, ~: 125892)\n[PASS] testFuzz_finiteAllowanceIsSpentExactlyAcrossPulls(uint256,uint256,uint256) (runs: 1000, μ: 173813, ~: 170220)\n[PASS] testFuzz_increaseAllowancePastMaxReverts(uint256,uint256) (runs: 1000, μ: 90902, ~: 90896)\n[PASS] testFuzz_increaseThenDecreaseRoundTrips(uint256,uint256) (runs: 1000, μ: 137971, ~: 138139)\n[PASS] testFuzz_infiniteAllowanceSurvivesRepeatedPulls(uint256,uint256,uint256) (runs: 1000, μ: 216937, ~: 217155)\n[PASS] testFuzz_nobodyPullsWithoutApproval(address,uint256) (runs: 1000, μ: 90706, ~: 90521)\n[PASS] testFuzz_oneWeiAboveBalanceReverts(uint256) (runs: 1000, μ: 96924, ~: 97005)\n[PASS] testFuzz_onlyTheDeployerHoldsAnythingAtConstruction(address) (runs: 256, μ: 30203, ~: 30203)\n[PASS] testFuzz_selfTransferIsIdentity(uint256) (runs: 1000, μ: 40996, ~: 40730)\n[PASS] testFuzz_twoHopTransferLandsExactly(address,address,uint256,uint256) (runs: 1000, μ: 169265, ~: 173327)\n[PASS] testFuzz_zeroRecipientAlwaysReverts(uint256) (runs: 1000, μ: 32835, ~: 32785)\n[PASS] test_allowanceFromZeroAddressCannotMint() (gas: 111700)\n[PASS] test_allowanceOneBelowMaxIsFinite() (gas: 125201)\n[PASS] test_approveIsIdempotent() (gas: 89554)\n[PASS] test_approveSelfAsSpender() (gas: 60136)\n[PASS] test_approveWithoutBalanceSucceeds() (gas: 72342)\n[PASS] test_approveZeroClearsAllowanceAndEmits() (gas: 89974)\n[PASS] test_constructorEmitsExactlyOneEvent() (gas: 9591)\n[PASS] test_contractSpenderPullsExactlyAndNoMore() (gas: 343900)\n[PASS] test_decreaseAllowanceByOneFromZeroReverts() (gas: 37828)\n[PASS] test_decreaseAllowanceFromMaxMakesItFinite() (gas: 170300)\n[PASS] test_decreaseAllowanceRevertsForZeroSpender() (gas: 34977)\n[PASS] test_decreaseAllowanceToExactlyZero() (gas: 87879)\n[PASS] test_eachDeploymentMintsItsOwnSupplyOnce() (gas: 36516)\n[PASS] test_increaseAllowanceByZeroAtMaxSucceeds() (gas: 90207)\n[PASS] test_increaseAllowanceOverflowIsCheckedPanic() (gas: 89532)\n[PASS] test_increaseAllowanceRevertsForZeroSpender() (gas: 34910)\n[PASS] test_increaseAllowanceToExactlyMaxSucceeds() (gas: 93070)\n[PASS] test_launchFlowsArriveWhole() (gas: 887206)\n[PASS] test_ownerCanTransferFromItselfWithSelfAllowance() (gas: 132225)\n[PASS] test_ownerCannotTransferFromItselfWithoutSelfAllowance() (gas: 38536)\n[PASS] test_supplyIsExactlyOneBillionTimesTenToTheEighteen() (gas: 32766)\n[PASS] test_transferFromAboveBalanceLeavesAllowanceIntact() (gas: 109301)\n[PASS] test_transferFromChecksAllowanceBeforeBalance() (gas: 87850)\n[PASS] test_transferFromExactAllowanceThenOneMoreFails() (gas: 164156)\n[PASS] test_transferFromInfiniteAllowanceStillNeedsBalance() (gas: 94936)\n[PASS] test_transferFromZeroWithZeroAllowanceSucceeds() (gas: 56280)\n[PASS] test_transferMaxUintReverts() (gas: 38215)\n[PASS] test_transferOneWei() (gas: 76816)\n[PASS] test_transferToAContractWithoutReceiverHookSucceeds() (gas: 312806)\n[PASS] test_transferToTokenItselfIsAcceptedAndConserved() (gas: 137378)\n[PASS] test_transferToZeroAddressFromEmptyAccountRevertsWithZeroAddress() (gas: 32581)\n[PASS] test_transferWholeBalanceTwiceFailsTheSecondTime() (gas: 99426)\n[PASS] test_transferZeroFromEmptyAccountEmits() (gas: 43534)\n[PASS] test_transferZeroToZeroAddressReverts() (gas: 32576)\n[PASS] test_zeroAddressCannotSendAnything() (gas: 35529)\nSuite result: ok. 48 passed; 0 failed; 0 skipped; finished in 2.96s (8.02s CPU time)\n\nRan 6 tests for test/ScoopToken.invariants.t.sol:ScoopTokenInvariantTest\n[PASS] invariant_allowancesMatchGhostLedger() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+----------------------------+-------+---------+----------╮\n| Contract     | Selector                   | Calls | Reverts | Discards |\n+========================================================================+\n| ScoopHandler | adminProbe                 | 1110  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approve                    | 1151  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approveZeroSpender         | 1118  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowance          | 1155  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowanceBelowZero | 1206  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowance          | 1185  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowanceOverflow  | 1213  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | selfTransfer               | 1147  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transfer                   | 1149  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferAboveBalance       | 1216  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFrom               | 1185  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveAllowance | 1178  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveBalance   | 1208  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferToAnyone           | 1163  | 0       | 0        |\n╰--------------+----------------------------+-------+---------+----------╯\n\n[PASS] invariant_balancesMatchGhostLedger() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+----------------------------+-------+---------+----------╮\n| Contract     | Selector                   | Calls | Reverts | Discards |\n+========================================================================+\n| ScoopHandler | adminProbe                 | 1110  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approve                    | 1151  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approveZeroSpender         | 1118  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowance          | 1155  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowanceBelowZero | 1206  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowance          | 1185  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowanceOverflow  | 1213  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | selfTransfer               | 1147  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transfer                   | 1149  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferAboveBalance       | 1216  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFrom               | 1185  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveAllowance | 1178  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveBalance   | 1208  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferToAnyone           | 1163  | 0       | 0        |\n╰--------------+----------------------------+-------+---------+----------╯\n\n[PASS] invariant_balancesSumToSupply() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+----------------------------+-------+---------+----------╮\n| Contract     | Selector                   | Calls | Reverts | Discards |\n+========================================================================+\n| ScoopHandler | adminProbe                 | 1110  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approve                    | 1151  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approveZeroSpender         | 1118  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowance          | 1155  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowanceBelowZero | 1206  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowance          | 1185  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowanceOverflow  | 1213  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | selfTransfer               | 1147  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transfer                   | 1149  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferAboveBalance       | 1216  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFrom               | 1185  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveAllowance | 1178  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveBalance   | 1208  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferToAnyone           | 1163  | 0       | 0        |\n╰--------------+----------------------------+-------+---------+----------╯\n\n[PASS] invariant_everyHolderCanStillMoveEverything() (runs: 128, calls: 4096, reverts: 0)\n\n╭--------------+----------------------------+-------+---------+----------╮\n| Contract     | Selector                   | Calls | Reverts | Discards |\n+========================================================================+\n| ScoopHandler | adminProbe                 | 274   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approve                    | 298   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approveZeroSpender         | 266   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowance          | 292   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowanceBelowZero | 283   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowance          | 308   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowanceOverflow  | 293   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | selfTransfer               | 274   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transfer                   | 319   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferAboveBalance       | 305   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFrom               | 282   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveAllowance | 302   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveBalance   | 297   | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferToAnyone           | 303   | 0       | 0        |\n╰--------------+----------------------------+-------+---------+----------╯\n\n[PASS] invariant_totalSupplyIsFixed() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+----------------------------+-------+---------+----------╮\n| Contract     | Selector                   | Calls | Reverts | Discards |\n+========================================================================+\n| ScoopHandler | adminProbe                 | 1110  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approve                    | 1151  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approveZeroSpender         | 1118  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowance          | 1155  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowanceBelowZero | 1206  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowance          | 1185  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowanceOverflow  | 1213  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | selfTransfer               | 1147  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transfer                   | 1149  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferAboveBalance       | 1216  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFrom               | 1185  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveAllowance | 1178  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveBalance   | 1208  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferToAnyone           | 1163  | 0       | 0        |\n╰--------------+----------------------------+-------+---------+----------╯\n\n[PASS] invariant_zeroAddressHoldsNothing() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+----------------------------+-------+---------+----------╮\n| Contract     | Selector                   | Calls | Reverts | Discards |\n+========================================================================+\n| ScoopHandler | adminProbe                 | 1110  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approve                    | 1151  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | approveZeroSpender         | 1118  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowance          | 1155  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | decreaseAllowanceBelowZero | 1206  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowance          | 1185  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | increaseAllowanceOverflow  | 1213  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | selfTransfer               | 1147  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transfer                   | 1149  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferAboveBalance       | 1216  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFrom               | 1185  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveAllowance | 1178  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferFromAboveBalance   | 1208  | 0       | 0        |\n|--------------+----------------------------+-------+---------+----------|\n| ScoopHandler | transferToAnyone           | 1163  | 0       | 0        |\n╰--------------+----------------------------+-------+---------+----------╯\n\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 6.93s (15.03s CPU time)\n\nRan 3 test suites in 6.93s (11.06s CPU time): 86 tests passed, 0 failed, 0 skipped (86 total tests)\n","passed":true},{"durationMs":33,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ScoopToken.approve(address,uint256)\",\"ScoopToken.decreaseAllowance(address,uint256)\",\"ScoopToken.increaseAllowance(address,uint256)\",\"ScoopToken.transfer(address,uint256)\",\"ScoopToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":8,\"README.md\":145,\"foundry.toml\":27,\"remappings.txt\":1,\"script/DeployScoop.s.sol\":26,\"src/ScoopToken.sol\":143,\"test/ScoopToken.edges.t.sol\":622,\"test/ScoopToken.invariants.t.sol\":529,\"test/ScoopToken.t.sol\":393},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"870139ae7d39ed8c15fb9e64157316a6a4703e2dac30ec46c33c77c6ac988006","verifiedTreeHash":"6796db3d750013dd33afaa8bcf2c9cfd5a5ae848","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":775,"exitCode":0,"name":"build","output":"Compiling 23 files with Solc 0.8.26\nSolc 0.8.26 finished in 690.44ms\nCompiler run successful!\n","passed":true},{"durationMs":79,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/ScoopToken.t.sol:ScoopTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 256, μ: 38752, ~: 39068)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 88070, ~: 88370)\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 114013, ~: 91554)\n[PASS] test_approveOverwritesPriorAllowance() (gas: 92464)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32505)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 64763)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8091)\n[PASS] test_constructorMintsWholeSupplyToDeployerOnce() (gas: 31567)\n[PASS] test_creationCodeHasNoConstructorArguments() (gas: 691069)\n[PASS] test_decreaseAllowanceRevertsBelowZero() (gas: 85318)\n[PASS] test_deployScriptMintsToTheBroadcaster() (gas: 1024098)\n[PASS] test_deployedByAContractMintsToThatContract() (gas: 768881)\n[PASS] test_increaseAllowanceRevertsOnOverflow() (gas: 84754)\n[PASS] test_increaseAndDecreaseAllowance() (gas: 149930)\n[PASS] test_metadata() (gas: 23748)\n[PASS] test_noAdminCallIncreasesSupplyOrMints() (gas: 635648)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 466849)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 677433)\n[PASS] test_transferFromInfiniteAllowanceIsNotDecremented() (gas: 129866)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 87957)\n[PASS] test_transferFromRevertsToZeroAddress() (gas: 89947)\n[PASS] test_transferFromRevertsWhenOwnerBalanceTooLow() (gas: 95096)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40392)\n[PASS] test_transferFromSpendsAllowance() (gas: 151144)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 84502)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37674)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 92534)\n[PASS] test_transferRevertsToZeroAddress() (gas: 32526)\n[PASS] test_transferToSelfKeepsBalance() (gas: 40382)\n[PASS] test_transferWholeBalance() (gas: 72031)\n[PASS] test_transferZeroAmountSucceeds() (gas: 44269)\n[PASS] test_unknownSelectorAndPlainEtherRevert() (gas: 60603)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 8.01ms (22.43ms CPU time)\n\nRan 1 test suite in 8.76ms (8.01ms CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":40,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ScoopToken.approve(address,uint256)\",\"ScoopToken.decreaseAllowance(address,uint256)\",\"ScoopToken.increaseAllowance(address,uint256)\",\"ScoopToken.transfer(address,uint256)\",\"ScoopToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":8,\"README.md\":145,\"foundry.toml\":27,\"launch.json\":24,\"remappings.txt\":1,\"script/DeployScoop.s.sol\":26,\"src/ScoopToken.sol\":143,\"test/ScoopToken.t.sol\":393},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c31115b47b4e5ef36b3f08fbda7991cd6f6d3ff73afb19f8f1e38c1a84498858","verifiedTreeHash":"5556a40cdeb073a4837080feddf1f7e514b06c3b","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":835,"exitCode":0,"name":"build","output":"Compiling 23 files with Solc 0.8.26\nSolc 0.8.26 finished in 748.73ms\nCompiler run successful!\n","passed":true},{"durationMs":79,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/ScoopToken.t.sol:ScoopTokenTest\n[PASS] testFuzz_transferAboveBalanceReverts(uint256) (runs: 256, μ: 38740, ~: 39068)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 88044, ~: 88370)\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 113032, ~: 91554)\n[PASS] test_approveOverwritesPriorAllowance() (gas: 92464)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32505)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 64763)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8091)\n[PASS] test_constructorMintsWholeSupplyToDeployerOnce() (gas: 31567)\n[PASS] test_creationCodeHasNoConstructorArguments() (gas: 691069)\n[PASS] test_decreaseAllowanceRevertsBelowZero() (gas: 85318)\n[PASS] test_deployScriptMintsToTheBroadcaster() (gas: 1024098)\n[PASS] test_deployedByAContractMintsToThatContract() (gas: 768881)\n[PASS] test_increaseAllowanceRevertsOnOverflow() (gas: 84754)\n[PASS] test_increaseAndDecreaseAllowance() (gas: 149930)\n[PASS] test_metadata() (gas: 23748)\n[PASS] test_noAdminCallIncreasesSupplyOrMints() (gas: 635648)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 466849)\n[PASS] test_runtimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 677433)\n[PASS] test_transferFromInfiniteAllowanceIsNotDecremented() (gas: 129866)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 87957)\n[PASS] test_transferFromRevertsToZeroAddress() (gas: 89947)\n[PASS] test_transferFromRevertsWhenOwnerBalanceTooLow() (gas: 95096)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 40392)\n[PASS] test_transferFromSpendsAllowance() (gas: 151144)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 84502)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37674)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 92534)\n[PASS] test_transferRevertsToZeroAddress() (gas: 32526)\n[PASS] test_transferToSelfKeepsBalance() (gas: 40382)\n[PASS] test_transferWholeBalance() (gas: 72031)\n[PASS] test_transferZeroAmountSucceeds() (gas: 44269)\n[PASS] test_unknownSelectorAndPlainEtherRevert() (gas: 60603)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 5.78ms (21.84ms CPU time)\n\nRan 1 test suite in 6.35ms (5.78ms CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":28,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ScoopToken.approve(address,uint256)\",\"ScoopToken.decreaseAllowance(address,uint256)\",\"ScoopToken.increaseAllowance(address,uint256)\",\"ScoopToken.transfer(address,uint256)\",\"ScoopToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":8,\"README.md\":145,\"foundry.toml\":27,\"remappings.txt\":1,\"script/DeployScoop.s.sol\":26,\"src/ScoopToken.sol\":143,\"test/ScoopToken.t.sol\":393},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":334,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":109,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/ScoopToken.sol:25: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f0c2b9491eeff8695196ee2189d1cb6d8c9448f47cb096f7962eb0b9de080fec","verifiedTreeHash":"dda77697967ca5ed48fb53a1c66b95945a556ec1","verifierVersion":"0.1.0+fb8278c5"}]}