{"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":"06c3c526-3aec-4f72-8ca7-3a8d2876908d","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"3d9bd40792e7abc8726da3f6978dd8d1d45f85309a33b201b7850d982d032a98","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":"7de41f4efb83413ce62ef86a74d09b7b8c843e679f245beb59e69d74e81c684e","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":"938e5dd2b0cc8ec53eda11111c8d86ad5ba1d1efb23035b8505abebc844fa59f","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":"a2fd888b0fd6daef48f3ae34d22d5c7b91ec8d5d5bc0e74df29dc49d5c5b53fd","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":"4f91fecbd3b29e66cd9ac10b39babd8d0404af718ecfbcb733518268a27fe490","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":"a748a7582ce1017181fb70126cae03336e98cd74bcc3effc790c3d5e03d410a7","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":"3626add12c2128a279ad3c1bc026b6e183443f8921e6ef86ee3a882d42cfd801","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":"9e0ecd5260a65399fce4bbde8ac5b9a6380ab6b03aff6f6270b7051ba4bfc8ef","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: SIMDTEST (SIMDTEST).\nToken name: SIMDTEST\nToken symbol: SIMDTEST\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.\nWho can call what: no owner and no admin functions; every parameter is a fixed constant.\n\nWhat it does:\n1. The SIMDTESTToken contract has a fixed total supply of 1,000,000,000 tokens with 18 decimals minted once at deployment.\n2. Exactly 90% of the total supply (900,000,000 tokens) go live in the Uniswap v4 PoolManager at address 0x000000000004444c5dc75cB358380D2e3dE08A90. The remaining 10% (100,000,000 tokens) go to the swarm via an external Merkle distributor outside the contract. No contract minting or transfers allocate swarm tokens.\n3. The token implements a 3% fee only on buys, defined as transfers FROM the PoolManager address. When tokens are sent from the PoolManager, the buyer receives 97% of the tokens; 3% remains in the token contract as accrued dividends.\n4. Transfers TO the PoolManager (including sells and the initial pool seed) are not taxed to ensure Uniswap v4 settlement functions correctly and avoid CurrencyNotSettled errors.\n5. Wallet-to-wallet transfers between addresses other than the PoolManager are fee-free.\n6. The accumulated fees remain in the token contract and are distributable dividends for existing token holders proportionally to their token balances.\n7. The contract excludes the PoolManager, itself, and the burn address from dividend rewards.\n8. Token holders claim their dividends any time by calling claim(). Claimed amounts transfer tokens from the contract to the holder.\n9. The contract has no owner or admin functions. All parameters including the 3% buy fee are fixed and immutable.\n10. The Uniswap v4 pool fee is 1.25% (12500), tick spacing 60, and the pool uses IMD as the paired currency.\n11. Identity.md's 1% creator fee applies off-chain: 0.5% of swap volume goes to $SIMD holders, and 0.5% to IMD seat agents.\n\nWho can call what:\n- Anyone can call claim() to redeem accrued dividends.\n- No owner or admin functions; all parameters are fixed and immutable.\n\nTests:\n1. Confirm that total supply equals 1,000,000,000 tokens with 18 decimals.\n2. Confirm initial mint of 900,000,000 tokens to PoolManager and external allocation of 100,000,000 to swarm.\n3. Transfer tokens FROM the PoolManager to a wallet triggers a 3% fee deducted; the wallet receives 97%.\n4. Transfer tokens TO the PoolManager (sell or pool seed) never trigger fees; full amount arrives.\n5. Wallet-to-wallet transfers incur zero fees.\n6. Accrued dividends after several buys distribute proportionally on claim().\n7. Dividend claim transfers tokens only to holders with accrued dividends.\n8. Transfers from excluded addresses (PoolManager, token contract itself, burn address) neither accumulate nor receive dividends.\n9. Validate no owner or admin function calls succeed.\n10. Confirm Uniswap v4 swap settlement succeeds with no CurrencyNotSettled errors.\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: SIMDTESTToken. 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 mints tokens or sends the swarm allocation.\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 SIMDTEST minor unit with SIMDTEST 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":"198db2105f1a87fefbdb3bc66f9461bd93d5c1fdd43857f713cf57551edb10fc","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"06c3c526-3aec-4f72-8ca7-3a8d2876908d","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-988-simdtest"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52216","feedbackHash":"b13ef1b6c83e06bb7b0cc43adc0a93fa9d821faf03a4ba627d0f9b1de96f8991","nodeKey":"audit_economics","submissionHash":"3d9bd40792e7abc8726da3f6978dd8d1d45f85309a33b201b7850d982d032a98","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52214","feedbackHash":"ebf387815f4c948b498de36f91494d9fab439c3e38d063d46f7eafdbc0b7d4ad","nodeKey":"audit_flow","submissionHash":"7de41f4efb83413ce62ef86a74d09b7b8c843e679f245beb59e69d74e81c684e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51382","feedbackHash":"f342e5fee817c8fb51eeb154af434461b0df03e6439d475ad2e8f407545ec31b","nodeKey":"audit_judge","submissionHash":"c3224a62528cad23e7f318982636cc70a6c351eab16ecf8fdbf7d1b4c740e1d0","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51487","feedbackHash":"650d7eca4c0a117255f7ace77e5ab59a2db97b1ded31042307e512ea3eae44ce","nodeKey":"audit_judge","submissionHash":"938e5dd2b0cc8ec53eda11111c8d86ad5ba1d1efb23035b8505abebc844fa59f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52207","feedbackHash":"6c0c44a9ee26b92906669a63c8ce53c23e6ed4face2e4fdf48f484c13ff15ccc","nodeKey":"audit_math","submissionHash":"a2fd888b0fd6daef48f3ae34d22d5c7b91ec8d5d5bc0e74df29dc49d5c5b53fd","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52130","feedbackHash":"1b84ab7ed397f7a45b3ed6ff40d53e39bc5f8a32af4c339701153fef5ffc413f","nodeKey":"audit_permissions","submissionHash":"4f91fecbd3b29e66cd9ac10b39babd8d0404af718ecfbcb733518268a27fe490","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51753","feedbackHash":"fb4c4f53808af1a67af9344d54e8cdd29f867b5a13f9aca70bbff52cc62c2dcd","nodeKey":"build_contract_project","submissionHash":"a748a7582ce1017181fb70126cae03336e98cd74bcc3effc790c3d5e03d410a7","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52113","feedbackHash":"ab8c69cdf2c53f9f0762a4c10e16e0f6e95f1eed575dc1b42b49faaa7605ca75","nodeKey":"build_contract_project","submissionHash":"4d2e719f062760ce69183bbeb3bb85b5c5b7b72787bd607025f03985a629478c","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51570","feedbackHash":"110fdf0cc219c0e53136aa753d5ae51aba96c91956302916ec933e655838a2b8","nodeKey":"manifest","submissionHash":"26d519e43004d4827e83b60777a0185ec8843da40f0ccb50dcfa2e995ed29aa2","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51186","feedbackHash":"b9d833e01f94f55e1f38d172a443cf6dbfcdd6baf953b0e2f9e87d8369bfc40d","nodeKey":"manifest","submissionHash":"3626add12c2128a279ad3c1bc026b6e183443f8921e6ef86ee3a882d42cfd801","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52086","feedbackHash":"7abaef429ccfc3ecce0234ec1519df817f12d43a362209ca9c5a99e037c93719","nodeKey":"write_foundry_tests","submissionHash":"f7b49e28f12d35d6988b3474df1bb042c30a4038fa474f63f6d44ca88d784e12","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51058","feedbackHash":"4b90fcc86537755ae9c938a915e464956200c649d04b0cdb118c240396de967a","nodeKey":"write_foundry_tests","submissionHash":"9e0ecd5260a65399fce4bbde8ac5b9a6380ab6b03aff6f6270b7051ba4bfc8ef","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"7ff6dbc762c151c09c2321bd041aed016ec095b7bf1751b6d27e1b62aa63e724","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"138b58841110959d46c60dbc63a5bfb7d016d7cd99c0de2607fc44783e30ed6f","device":"493095393c4a2a74","findings":[],"hash":"26d519e43004d4827e83b60777a0185ec8843da40f0ccb50dcfa2e995ed29aa2","nodeId":"ffe815b7-d692-466d-be3e-7cda6ec7f997","outcome":"completed","summary":"Updated [launch.json](/root/.identitymd/work/06c3c526-3aec-4f72-8ca7-3a8d2876908d/ffe815b7-d692-466d-be3e-7cda6ec7f997/launch.json) to accurately describe the accepted token, preserving the exact supply, economics, and required pool settings.\n\nSchema and constructor ABI checks passed. `forge build` succeeded; `forge test` passed all 45 tests.\n\nOnly `launch.json` changed.","treeHash":"deaa09c17bd51e9e95b805703569269b46a41894","usage":{"cachedInputTokens":356992,"inputTokens":28381,"model":"gpt-6-astra","outputTokens":3808,"runtime":"codex","turns":4,"wallClockMs":147922}},{"artifacts":[],"attempt":1,"bundleHash":"e4c80f106ee86a0bbbef855a112e799d1e629aa302ffdb872011e0cb89fb541b","device":"ccf14607d159904b","findings":[],"hash":"3626add12c2128a279ad3c1bc026b6e183443f8921e6ef86ee3a882d42cfd801","nodeId":"ffe815b7-d692-466d-be3e-7cda6ec7f997","outcome":"completed","summary":"Updated only `launch.json`, preserving the exact supply, constructor argument, pool settings, and economics while clarifying implementation notes.\n\nValidation passed: supplied JSON Schema, compiled constructor ABI, `forge build`, and `forge test`—50 tests passed, none failed.","treeHash":"6d788bfd54f4c392615bdd964c43dc5f811c0b24","usage":{"cachedInputTokens":299648,"inputTokens":36878,"model":"gpt-6-astra","outputTokens":3467,"runtime":"codex","turns":4,"wallClockMs":131405}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"47f3603854a893a3","findings":[{"citation":"resolved","description":"The exclusion list is fixed to PoolManager, the token itself, the burn address and address(0). The launch factory sends the swarm's 10% (100,000,000 tokens) to the launch's MerkleDistributor before it seeds the pool, and sends the other 90% (poolBps 9000) to the PoolManager, so remainderTo gets 0. Right after launch the distributor is therefore the ONLY eligible holder (eligibleSupply = 100,000,000e18). _transfer calls _distributePending() using pre-buy balances, so the fee from every buy is spread pro rata over eligibleSupply, and the distributor's share goes into its dividend index. The distributor is a fixed-function contract that only sends Merkle claims and never calls SIMDTESTToken.claim(), so that credit can never leave the token contract. Pre-buy allocation makes this worse: the first buy's whole fee goes to the distributor. Later buys still send it balance(distributor)/eligibleSupply of each fee, and allocations that seats never claim keep earning forever. This breaks requirement 6: fees are meant to be distributable to token holders, but a share is paid to a party that cannot receive it, and the share is 100% at launch. The custom-token-launch guide says to exempt the factory, the PoolManager and distributorOf(launchNumber). Fix: also exclude the distributor from dividends. Options are taking $factory/$launchNumber as constructor args and checking IFactory(factory).distributorOf(launchNumber), or recording factory = msg.sender in the constructor and resolving the distributor from it. With the distributor excluded, the first fees queue in pendingDividends until real holders exist, which the code already supports.","line":73,"path":"src/SIMDTESTToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SIMDTESTToken} from \"src/SIMDTESTToken.sol\";\n\n/// Stands in for the launch factory: holds the mint and answers distributorOf like the real factory.\ncontract FactoryStub {\n    address public immutable distributor;\n    constructor(address d) { distributor = d; }\n    function distributorOf(uint64) external view returns (address) { return distributor; }\n    function deploy() external returns (SIMDTESTToken t) { t = new SIMDTESTToken(); }\n    function send(SIMDTESTToken t, address to, uint256 a) external { t.transfer(to, a); }\n}\n\ncontract DistributorLockTest is Test {\n    address constant PM = 0x000000000004444c5dc75cB358380D2e3dE08A90;\n    address constant DISTRIBUTOR = address(0xD157); // Merkle distributor: never calls claim()\n    address constant BUYER = address(0xB0B);\n\n    function test_buyFeesAreCreditedToTheMerkleDistributorAndLocked() public {\n        FactoryStub factory = new FactoryStub(DISTRIBUTOR);\n        SIMDTESTToken token = factory.deploy();\n        // Launch flow: 10% to the swarm's distributor, 90% seeded into the PoolManager.\n        factory.send(token, DISTRIBUTOR, 100_000_000e18);\n        factory.send(token, PM, 900_000_000e18);\n\n        // First buy from the pool: 1,000,000 tokens, 30,000 fee.\n        vm.prank(PM);\n        token.transfer(BUYER, 1_000_000e18);\n        assertEq(token.balanceOf(address(token)), 30_000e18);\n\n        // The whole fee is credited to the distributor, which has no way to call claim().\n        // Holders' dividends must not be stranded on the swarm distributor.\n        assertEq(token.claimableDividends(DISTRIBUTOR), 0, \"buy fees credited to the Merkle distributor\");\n    }\n}","reproduction":"1) The factory deploys SIMDTESTToken (it receives 1e27). 2) The factory sends 100,000,000e18 to the distributor (0xD157 in the test) and 900,000,000e18 to the PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90. 3) A first buy runs as PoolManager.transfer(buyer, 1,000,000e18): the buyer gets 970,000e18 and the token contract holds 30,000e18. Expected: no dividends go to the distributor, and the fee stays claimable by real holders or queued. Actual: claimableDividends(distributor) = 29,999.999999999999999999e18, the whole fee, and no code path ever moves it. forge test --match-path test/scratch/DistributorLock.t.sol fails with 'buy fees credited to the Merkle distributor: 29999999999999999999999 != 0'.","severity":"high","snippet":"        return account == POOL_MANAGER || account == address(this) || account == BURN_ADDRESS || account == address(0);","title":"Buy-fee dividends are credited to the swarm MerkleDistributor, which can never claim them, so holders' fees are permanently stranded (100% of early fees at launch)"}],"hash":"3d9bd40792e7abc8726da3f6978dd8d1d45f85309a33b201b7850d982d032a98","nodeId":"b85954fb-43b5-41e0-ba56-07ef3ac9ff50","outcome":"completed","summary":"I found one defect, rated high. It's written to `.imd-findings.json` along with coverage rows for all four entry points and three invariants I checked. No project files were changed; the scratch test was deleted after it ran.\n\n**Finding 1 (high): buy fees are credited to the swarm's Merkle distributor, which can never claim them.**\n- **Where:** `src/SIMDTESTToken.sol:73`. The list of addresses excluded from dividends is fixed to the PoolManager, the token itself, the burn address and `address(0)`. The swarm's distributor is not on it.\n- **Why it matters at launch:** the factory sends 10% to the distributor and 90% to the PoolManager, so `remainderTo` gets nothing. That leaves the distributor as the only holder who earns dividends. Fees are split using balances from before the buy, so the whole fee from the first buy is credited to the distributor.\n- **Why it's stuck:** the distributor never calls `claim()`, so that credit can never leave the token contract. Later buys keep sending it a share in proportion to the swarm tokens it still holds. Allocations that seats never claim keep earning forever.\n- **Reproduction:** after the launch transfers, the PoolManager sends 1,000,000 tokens to a buyer. The buyer receives 970,000 and 30,000 is kept as the fee. `claimableDividends(distributor)` then returns about 29,999.999…e18, almost the entire fee. A Foundry test showed exactly this.\n- **Fix:** exclude the distributor from dividends. Two ways: pass `$factory` and `$launchNumber` to the constructor and look the distributor up with `distributorOf`, or record `msg.sender` as the factory in the constructor. Early fees would then wait in `pendingDividends` until real holders exist, which the code already handles.\n- **Caveat on the proof:** the test builds the token with no constructor arguments. If the fix adds constructor arguments, the test's one deployment line needs updating.\n\n**What holds:**\n- Sells and the pool seed into the PoolManager arrive in full, and the PoolManager's balance drops by the full amount on a buy, so Uniswap v4 settlement stays exact.\n- A buyer can't earn a share of their own buy fee.\n- Total claimable dividends can never exceed the tokens the contract holds: every division rounds down and nothing can overflow.\n- `approve` and the allowance handling in `transferFrom` are correct.\n\nI didn't report the static-analysis leads: they concern the launch helper libraries or are style notes, and none is an economic defect in this token. The pool fee in `launch.json` is 3000 rather than the 1.25% (12500) in the token description, but that matches the build requirements, so it isn't a defect.","treeHash":null,"usage":{"cachedInputTokens":375272,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":9590,"runtime":"claude","turns":7,"wallClockMs":121006}},{"artifacts":[],"attempt":1,"bundleHash":"d7aef05aa7e95954e0ebf2fc6a2cc7bd9cc71bfb5b57128e896bd407125f6942","device":"92352b60f8e93ddd","findings":[],"hash":"4d2e719f062760ce69183bbeb3bb85b5c5b7b72787bd607025f03985a629478c","nodeId":"02ab4880-cee2-4da4-ae07-956b26838dfa","outcome":"completed","summary":"Implemented the complete Foundry project, token, dividend accounting, launch manifest, vendored dependencies, and documentation.\n\nVerified locally: clean offline build, 29 tests, all 8 pinned checks, and formatting pass.\n\nThe manifest uses mandatory pool fee `3000` (0.30%). Conflicts and operational responsibilities are documented in [README.md](/home/imd-worker-33/.identitymd/work/06c3c526-3aec-4f72-8ca7-3a8d2876908d/02ab4880-cee2-4da4-ae07-956b26838dfa/README.md).","treeHash":"5fe2df72ca1d48cddee5fa498a65963e1157ed3d","usage":{"cachedInputTokens":1558784,"inputTokens":89336,"model":"gpt-6-astra","outputTokens":33137,"runtime":"codex","turns":8,"wallClockMs":1075265}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1c29c7c6e4cf57eb","findings":[{"citation":"resolved","description":"Seam: economics x asymmetry. Only the PoolManager, the token, 0xdead and address(0) are excluded from dividends. The launch factory sends 10% of supply (100,000,000 SIMDTEST) to the launch's MerkleDistributor, which then counts toward eligibleSupply and is credited its pro-rata share of every buy fee in _accrue/_distributePending. The distributor is the factory's reserved contract: it only pays out Merkle claims and never calls SIMDTESTToken.claim(), and per the design (claimableDividends dev note) credit stays with the earner after its balance is transferred out. So whatever it earns sits in the token contract permanently and never reaches real holders. Right after launch the distributor is the ONLY eligible holder (pool 90% is in the PoolManager, remainder goes to 0xdead, factory ends at 0), so it takes 100% of the first buy's fee and the vast majority of fees until contributors have claimed; unclaimed seat allocations keep diverting a share forever. The holders the spec says the fee is for (item 6) are shorted. Fix: also exclude the launch's distributor from dividends (the platform lets the token take $factory and $launchNumber and call factory.distributorOf(launchNumber)); exclusion must keep its balance out of eligibleSupply. If the fix adds constructor arguments, update the proof's FactoryStub.deploy() call to pass them.","line":73,"path":"src/SIMDTESTToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SIMDTESTToken} from \"src/SIMDTESTToken.sol\";\n\n/// @dev Stands in for the launch factory; answers distributorOf the way ProjectFactory does.\ncontract FactoryStub {\n    address public immutable distributor;\n\n    constructor(address distributor_) {\n        distributor = distributor_;\n    }\n\n    function distributorOf(uint64) external view returns (address) {\n        return distributor;\n    }\n\n    function deploy() external returns (SIMDTESTToken) {\n        return new SIMDTESTToken();\n    }\n\n    function move(SIMDTESTToken token, address to, uint256 amount) external {\n        token.transfer(to, amount);\n    }\n}\n\ncontract DistributorDividendsTest is Test {\n    address constant PM = 0x000000000004444c5dc75cB358380D2e3dE08A90;\n    address constant DISTRIBUTOR = address(0xD157);\n    address alice = address(0xA11CE);\n    address bob = address(0xB0B);\n\n    function test_buyFeesAreNotLockedInTheMerkleDistributor() public {\n        FactoryStub factory = new FactoryStub(DISTRIBUTOR);\n        SIMDTESTToken token = factory.deploy();\n        // Launch flow exactly as the factory performs it: 10% swarm, 90% pool, nothing left.\n        factory.move(token, DISTRIBUTOR, 100_000_000 ether);\n        factory.move(token, PM, 900_000_000 ether);\n\n        // Two ordinary buys out of the pool.\n        vm.prank(PM);\n        token.transfer(alice, 10_000_000 ether); // fee 300,000\n        vm.prank(PM);\n        token.transfer(bob, 10_000_000 ether); // fee 300,000\n\n        // The distributor never calls claim(); whatever it earns is unreachable forever.\n        assertEq(token.claimableDividends(DISTRIBUTOR), 0, \"buy fees credited to the Merkle distributor\");\n        // Alice was the only real holder when Bob bought: Bob's whole fee is hers.\n        assertApproxEqAbs(token.claimableDividends(alice) , 300_000 ether, 1e6, \"real holder shorted\");\n    }\n}","reproduction":"Factory deploys SIMDTESTToken, transfers 100,000,000e18 to the distributor (0xD157) and 900,000,000e18 to the PoolManager. PoolManager transfers 10,000,000e18 to alice (fee 300,000e18, eligibleSupply = 100M held only by the distributor) and then 10,000,000e18 to bob (fee 300,000e18 split over distributor 100M + alice 9.7M). Expected: distributor earns 0 and alice, the only real holder at bob's buy, can claim ~300,000e18. Actual: claimableDividends(distributor) = 573,473.108e18 (95.6% of the 600,000e18 fees collected), alice can claim only ~26,527e18, and the distributor's 573k is unclaimable forever. Run: forge test --match-path test/scratch/DistributorDividends.t.sol (fails: 'buy fees credited to the Merkle distributor: 573473108477666362807657 != 0').","severity":"high","snippet":"        return account == POOL_MANAGER || account == address(this) || account == BURN_ADDRESS || account == address(0);","title":"The swarm's Merkle distributor earns buy-fee dividends it can never claim, so most early fees are locked forever"},{"citation":"resolved","description":"Seam: economics x asymmetry (two buy branches). The fee is charged only when SIMDTEST is ERC-20-transferred out of the PoolManager (take()). In Uniswap v4 a buyer can settle the positive SIMDTEST delta with manager.mint(self, id, amount), receiving ERC-6909 claims, which never calls SIMDTEST.transfer. Those claims can be burned later to pay for a sell (manager.burn then swap token->IMD) or moved with ERC-6909 transfer, again with no token transfer. So the same economic buy is taxed 3% via take() but 0% via mint(); a front-runner/sandwicher or any round-trip trader who never withdraws the ERC-20 skips the fee entirely while ordinary buyers pay it, and holders lose the dividends that volume should fund (spec items 3 and 6). Claims held this way also earn no dividends, so the bypass only benefits traders who exit through the pool, which is exactly MEV/round-trip flow. The token cannot see this path; enforcing the fee on every buy needs pool-level enforcement (e.g. a beforeSwap/afterSwap hook fee on token-out swaps) or the requester accepting and documenting that the fee applies only to ERC-20 withdrawals.","line":104,"path":"src/SIMDTESTToken.sol","reproduction":"Launch as the factory does (10% to distributor, token as currency0, pool fee 3000/tick spacing 60, single-sided seed of 900M at sqrtPriceX96 125270724187523965593206900). Trader contract: tx1 unlock -> swap(zeroForOne=false, amountSpecified=-10e18 IMD) -> pay IMD -> manager.mint(trader, uint160(token), delta.amount0()) (receives > 1,000,000e18 SIMDTEST as claims). tx2 unlock -> manager.burn(trader, uint160(token), claims) -> swap(zeroForOne=true, amountSpecified=-claims) -> take IMD. Expected: the buy paid 3% of the bought amount into the token contract (totalFeesCollected > 0). Actual: totalFeesCollected() == 0 and balanceOf(token) == 0 after a full buy+sell round trip; both unlocks settle with no CurrencyNotSettled. Verified locally with a scratch test against a real v4 PoolManager etched at 0x000000000004444c5dc75cB358380D2e3dE08A90 (assertion 'a full buy and sell round trip paid no 3% buy fee: 0 <= 0').","severity":"medium","snippet":"        uint256 fee = from == POOL_MANAGER && to != POOL_MANAGER ? amount * BUY_FEE_BPS / BPS : 0;","title":"Buyers who keep their purchase as PoolManager ERC-6909 claims pay no 3% buy fee, so round-trip and sandwich traders trade fee-free"}],"hash":"4f91fecbd3b29e66cd9ac10b39babd8d0404af718ecfbcb733518268a27fe490","nodeId":"8a345db6-fac1-4ea4-8871-5883e634815f","outcome":"completed","summary":"I found two defects in `SIMDTESTToken`, and both reproduce in scratch Foundry tests. The findings and the coverage record are in `.imd-findings.json`. I changed no project files and deleted the scratch tests afterwards.\n\n**1. High: most early buy fees get stuck with the Merkle distributor** (`src/SIMDTESTToken.sol:73`)\n- **Cause:** only the PoolManager, the token itself, the burn address and the zero address are left out of dividends. The swarm's 100,000,000 tokens sit in the factory's Merkle distributor, which therefore counts as a holder. That contract never calls `claim()`, and earned credit stays with whoever earned it even after its tokens move. So everything it earns is locked in the token contract for good.\n- **Scale:** right after launch the distributor is the only holder that earns dividends, so it takes the whole first buy fee.\n- **Reproduction:** the factory sends 10% to the distributor and 90% to the PoolManager, then two 10,000,000-token buys go through.\n  - Expected: alice, the only real holder when bob buys, can claim about 300,000 tokens, and the distributor earns nothing.\n  - Actual: the distributor holds 573,473 of the 600,000 fee tokens (95.6%), and alice gets about 26,527.\n- **Proof:** a Foundry test is attached to the finding. It fails on the current code.\n- **Fix:** leave the distributor out of dividends too. The token can find it by taking `$factory` and `$launchNumber` and calling `distributorOf(launchNumber)` on the factory. If the fix adds constructor arguments, the proof's deploy line needs updating to match.\n\n**2. Medium: buyers can skip the 3% fee by holding Uniswap v4 claims** (`src/SIMDTESTToken.sol:104`)\n- **Cause:** the fee is only charged when tokens are actually transferred out of the PoolManager. A buyer can instead keep the purchase as PoolManager claim balances (ERC-6909, via `manager.mint`), then later burn those claims to sell. No token transfer ever happens, so no fee is charged.\n- **Reproduction:** against a real v4 PoolManager at the mainnet address, a trader bought with 10 IMD into claims (over 1,000,000 SIMDTEST), then sold it all back. `totalFeesCollected()` stayed at 0 and both swaps settled cleanly.\n- **Impact:** round-trip and sandwich traders pay no fee while ordinary buyers pay 3%, so holders lose the dividends that volume should fund.\n- **Fix:** the token contract can't see this path. Closing it needs a fee at the pool level, such as a swap hook. Otherwise the requester has to accept and document that the fee only applies when tokens are withdrawn.\n\n**Coverage:**\n\n| Entry point | Verdict | Reason |\n|---|---|---|\n| `approve` | holds | Only touches the caller's own allowance; a zero spender is rejected. |\n| `claim()` | holds | Pays only the caller's own credit, with no recipient choice. |\n| `transfer` | finding 1 | Its fee path credits the distributor. Finding 2 also applies. |\n| `transferFrom` | finding 1 | Same fee path as `transfer`; the allowance logic holds. |\n\nI also checked these properties, and all hold:\n- There are no owner, admin or mint paths.\n- The launch transfers arrive whole: factory to distributor, distributor to claimants, and the pool seed.\n- Dividend maths can't overflow even when very few tokens are earning dividends.\n\nThe static-analysis leads were all outside my area or harmless: the unused return in `LaunchLiquidity`, the large numeric literals, and the unused public view function.\n\n`git status` now lists some untracked files I didn't create (`.bashrc`, `.claude/`, `.gitmodules`, `.mcp.json` and similar). They look like the environment's own files. I left them alone, but they shouldn't go into a submission.","treeHash":null,"usage":{"cachedInputTokens":730433,"inputTokens":24,"model":"claude-opus-5-5","outputTokens":19691,"runtime":"claude","turns":12,"wallClockMs":360306}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6b47d1bf92391c22","findings":[{"citation":"resolved","description":"The dividend exclusion list covers only the PoolManager, the token, 0xdead and address(0). The launch factory sends the swarm's 10% (100,000,000 SIMDTEST) to the launch's MerkleDistributor, a reserved contract that only forwards Merkle claims and has no way to call SIMDTESTToken.claim(). Because the distributor's balance counts in eligibleSupply, _distributePending() allocates fees to it pro rata, and that credit can never be redeemed. Right after launch (poolBps 9000, remainder 0) the distributor is the only eligible holder, so the entire fee of the first buy, and a large share of later fees until the swarm claims, is credited to it. Unclaimed or expired Merkle allocations keep earning fees forever. Holders who can claim receive less than the 'proportional to token balances' share the brief promises, and the stranded amount stays in balanceOf(address(token)) permanently. Fix: also exclude the distributor from dividends, e.g. take $factory and $launchNumber as constructor args and treat IFactory(factory).distributorOf(launchNumber) as excluded (the launch guide already expects tokens to resolve it this way), and exclude the factory (msg.sender) as well.","line":73,"path":"src/SIMDTESTToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SIMDTESTToken} from \"src/SIMDTESTToken.sol\";\n\n/// The launch factory sends the swarm's 10% to its MerkleDistributor, a contract that only\n/// forwards Merkle claims and can never call token.claim(). Buy fees credited to it are stranded.\ncontract DistributorDividendsTest is Test {\n    address constant POOL_MANAGER = 0x000000000004444c5dc75cB358380D2e3dE08A90;\n    address constant DISTRIBUTOR = address(0xD157);\n    address constant BUYER = address(0xB0B);\n    SIMDTESTToken token;\n\n    function distributorOf(uint64) external pure returns (address) {\n        return DISTRIBUTOR;\n    }\n\n    function setUp() public {\n        token = new SIMDTESTToken(); // this test contract plays the launch factory\n        uint256 supply = token.totalSupply();\n        token.transfer(DISTRIBUTOR, supply / 10); // swarm share\n        token.transfer(POOL_MANAGER, supply * 9 / 10); // pool seed (poolBps 9000, remainder 0)\n    }\n\n    function test_firstBuyFeeIsNotStrandedInDistributor() public {\n        // First trader buys 1,000,000 SIMDTEST: the PoolManager pays it out via take().\n        vm.prank(POOL_MANAGER);\n        token.transfer(BUYER, 1_000_000 ether);\n        uint256 fee = 30_000 ether;\n        assertEq(token.balanceOf(address(token)), fee);\n        // The whole fee was allocated against the distributor's 100M eligible balance.\n        assertEq(token.claimableDividends(DISTRIBUTOR), 0, \"buy fee credited to the Merkle distributor, which cannot claim\");\n    }\n}","reproduction":"Deploy SIMDTESTToken from the factory. The factory transfers 100,000,000e18 to the distributor and 900,000,000e18 to the PoolManager (the seed), so eligibleSupply = 100,000,000e18, all held by the distributor. A trader buys 1,000,000e18: PoolManager.transfer(buyer, 1_000_000e18). Fee = 30,000e18, and _distributePending runs on pre-buy balances. Expected: the fee goes to holders who can claim it (or is queued). Actual: claimableDividends(distributor) == 29,999.999...e18, the whole fee, which the distributor contract can never claim, so it stays locked in the token contract. The proof test fails with 29999999999999999999999 != 0.","severity":"medium","snippet":"        return account == POOL_MANAGER || account == address(this) || account == BURN_ADDRESS || account == address(0);","title":"Buy fees are credited to the launch MerkleDistributor, which can never call claim(); those dividends are locked in the token contract forever"}],"hash":"7de41f4efb83413ce62ef86a74d09b7b8c843e679f245beb59e69d74e81c684e","nodeId":"f06bc3fc-cba9-4f8b-96bb-f899d520c536","outcome":"completed","summary":"I found one defect, a medium: some buy fees end up locked in the token contract for good. It's written to `.imd-findings.json` with a coverage row for each of the four entry points. I changed no source files; the test I used to prove the finding was in `test/scratch/` and I deleted it afterwards.\n\n**Finding 1 (medium): buy fees are credited to the swarm's Merkle distributor, which can never claim them** (`src/SIMDTESTToken.sol:73`)\n- **Cause:** the list of addresses that don't earn dividends covers only the PoolManager, the token itself, the burn address and the zero address. The factory sends the swarm's 10% to the Merkle distributor, so that address counts as an ordinary holder and earns its share of every fee. It is a contract with no way to call `claim()`, so whatever it earns stays in the token contract forever.\n- **How big:** after launch, 90% sits in the pool and 0% is left over, so the distributor holds all of the supply that can earn dividends. The first buy of 1,000,000 tokens takes a 30,000-token fee, and all of it is credited to the distributor. Later buys keep losing a large share until the swarm claims its tokens, and any allocation never claimed keeps earning forever. Real holders get less than the proportional share the brief promises.\n- **Proof:** a Foundry test fails on the current code with `29999999999999999999999 != 0`. The test file is in the finding's `proof` field.\n- **Suggested fix:** take `$factory` and `$launchNumber` as constructor arguments and exclude `distributorOf(launchNumber)` from dividends, which is how the launch guide expects tokens to find the distributor. Exclude the factory too.\n\n**Coverage:**\n\n| Entry point | Verdict | Why |\n|---|---|---|\n| `approve` | holds | Only sets the allowance; rejects a zero spender. |\n| `claim()` | holds | Pays only the caller, keeps the leftover fractions, and can't promise more than the contract holds. |\n| `transfer` | finding 1 | Fee math, fee-free sells and pool seed, and the rule that new buyers don't earn their own fee all work. The fee is still shared with the distributor. |\n| `transferFrom` | finding 1 | Same transfer path; allowances are handled correctly. |\n\nI also checked one extra property: the token contract always holds enough to pay every claim, with no overflow at the 1e27 supply. It holds.\n\nThings I checked and didn't report:\n- **Static-analysis leads:** they point at the launch helper files, not the token. Neither the unused return value nor the unchecked ERC-20 transfer is a reachable defect.\n- **Pool fee:** `launch.json` uses fee 3000, which matches the build requirements. The brief's \"1.25% (12500)\" contradicts them, and this is not a code defect.\n- **Tiny buys:** buys under 34 minor units round the fee down to zero. That is far too small to matter, so I left it out.\n- **Accidental transfers:** tokens sent to the contract by mistake stay there. That's outside my area and low impact.\n\nI couldn't run `git status` because git refused the repository (dubious-ownership error), so I can't confirm the tree is clean that way.","treeHash":null,"usage":{"cachedInputTokens":352235,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":8848,"runtime":"claude","turns":7,"wallClockMs":94392}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9e51ef2afd7c2af8","findings":[],"hash":"938e5dd2b0cc8ec53eda11111c8d86ad5ba1d1efb23035b8505abebc844fa59f","nodeId":"eb7b05cb-ee0b-463b-9e29-132e99cf8167","outcome":"completed","summary":"Both earlier findings are settled and no new defect reproduced. The findings file holds an empty list plus the coverage record.\n\n**High finding (fees stranded on the Merkle distributor): fixed.** The constructor now records the deploying factory and the launch number, and the exclusion set covers the factory and the distributor resolved once from `distributorOf(LAUNCH_NUMBER)`. Buys revert until the distributor is registered. The pinned proof only fails to compile because it still calls the old zero-argument constructor. With the launch number passed in, as the fix requires, it passes: the distributor is credited nothing and the two real holders plus the pending queue hold the full 600,000e18 collected. I also traced a sequence the author's tests do not cover, a partial Merkle claim before registration followed by registration and buys, and the eligible supply stays equal to the sum of non-excluded balances throughout.\n\n**Low advisory (ERC-6909 claim settlement pays no fee): dropped.** It still reproduces, but the code matches the brief's own definition of a buy as a transfer from the PoolManager, and the README documents the boundary. It is the requester's design decision, not a defect.\n\n**Floor check.** I ran a copy of the pinned protected harness with the manifest's inputs against the revised token. All 8 floor tests pass, and the project's own suite passes with 50 tests including the invariants.\n\n**One dependency to confirm at deployment, recorded as a trust assumption rather than a finding.** Every transfer before registration calls the factory's `distributorOf(uint64)`. If the live factory lacks that getter or keys it by a different launch number, transfers revert until it answers. The pinned harness exposes exactly that getter, so the code is correct against the floor's model of the factory.","treeHash":null,"usage":{"cachedInputTokens":969808,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":22650,"runtime":"claude","turns":26,"wallClockMs":325874}},{"artifacts":[],"attempt":1,"bundleHash":"fe30b4fb528a16ef4cfc4896e3c886d44b2d8f6df93e7cdcc4079fef1c5be07b","device":"99fdbd4812d28337","findings":[],"hash":"9e0ecd5260a65399fce4bbde8ac5b9a6380ab6b03aff6f6270b7051ba4bfc8ef","nodeId":"d75cec02-9fb5-4387-8268-65336799c501","outcome":"completed","summary":"Updated the existing tests for the launch-number constructor, distributor lookup, excluded-account invariants, and first-buy dividend accounting.\n\nOnly four files under `test/` changed.\n\nValidation: `forge build` passes; `forge test` reports 50 passed, including 32,768 invariant calls with zero reverts. Live mainnet integration remains unverified.","treeHash":"3e49834324bfb4961b39bfb1703e9a0592d8d504","usage":{"cachedInputTokens":685056,"inputTokens":72940,"model":"gpt-6-astra","outputTokens":5187,"runtime":"codex","turns":5,"wallClockMs":195669}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f009de0ce52c7b3a","findings":[{"citation":"resolved","description":"The buy fee is keyed solely on an ERC-20 transfer whose `from` is the PoolManager. Uniswap v4 lets a swapper settle a positive delta with `PoolManager.mint(to, currency.toId(), amount)` (ERC-6909 claim tokens) instead of `PoolManager.take`, and settle a negative delta with `PoolManager.burn` instead of transferring ERC-20 in. Neither path moves SIMDTEST ERC-20 out of the manager, so `_transfer` never runs, no fee accrues, and no dividends are distributed. A trader can buy, hold, transfer claims (ERC-6909 `transfer`) and sell SIMDTEST indefinitely with zero token fee, and only ever withdraw IMD (untaxed) as ERC-20. The README notes that netted swaps are untaxed and the brief defines a buy as a transfer from the PoolManager, so this is reported as a boundary gap against the stated guarantee (\"3% fee on buys\", \"accrued dividends for existing holders\") rather than a code error. Boundary: PoolManager.take vs PoolManager.mint. Assumption: every swap output leaves the manager as an ERC-20 transfer. Actual: v4 claim accounting leaves the manager's ERC-20 balance untouched. If the fee is meant to apply to every swap, enforcement must live in a v4 hook (afterSwap) rather than in the token's transfer logic; that is a design change the requester must decide.","line":104,"path":"src/SIMDTESTToken.sol","reproduction":"State: token deployed via CREATE2 so it sorts as currency0 below IMD, pool initialised at the 2500 IMD opening cap and seeded single-sided with 900,000,000 SIMDTEST, 100,000,000 at a distributor. Calls: (1) trader unlocks the manager, swaps zeroForOne=false, amountSpecified=-1e18 IMD, receives delta.amount0() = gross > 0; (2) in the same callback calls manager.mint(trader, currency0.toId(), gross) and pays IMD via sync/transfer/settle; (3) later unlocks again, swaps zeroForOne=true amountSpecified=-gross and settles with manager.burn(trader, currency0.toId(), gross), minting IMD claims for the proceeds. Expected per brief: step 1 accrues gross*3/100 to the token contract and holders can claim it. Actual: token.totalFeesCollected() == 0 and token.balanceOf(token) == 0 after the full round trip, token.balanceOf(PoolManager) net unchanged, the trader ends with ~0.998e18 IMD claims (only the 0.30% LP fee was paid). The same buy through manager.take would have moved gross*3/100 to the token contract (see test/UniswapV4.t.sol testExactOutputBuyIsGrossAndBuyerReceives97Percent).","severity":"low","snippet":"        uint256 fee = from == POOL_MANAGER && to != POOL_MANAGER ? amount * BUY_FEE_BPS / BPS : 0;","title":"3% buy fee is bypassed when a v4 swapper takes output as ERC-6909 claims instead of an ERC-20 transfer"}],"hash":"a2fd888b0fd6daef48f3ae34d22d5c7b91ec8d5d5bc0e74df29dc49d5c5b53fd","nodeId":"1b18eb92-8922-44fd-872a-842352d6e6eb","outcome":"completed","summary":"The review is complete. The findings file is written at the repository root and the tree is otherwise untouched (scratch tests removed, no tracked file modified).\n\n**Result: the token's arithmetic holds in my area. One low-severity boundary finding.**\n\n**What I checked (Math Precision, Boundary, Numerical Gap guides)**\n\n- **Fee rounding.** The buy fee floors `amount * 300 / 10000`, so buys under 34 wei are fee-free. At 18 decimals that leaks under 3.3e-17 tokens per transfer and gas dominates. Documented in the README, not reported.\n- **Index precision and overflow.** The dividend index uses 2^128 scaling. An account's balance is always part of the eligible supply between its checkpoints, so `balance * delta` is bounded by total fees times 2^128, below 2^218. I drove the index to 218 bits with 1 wei of eligible supply and 200 maximal buy and sell cycles with no revert and exact payout.\n- **Solvency.** Index increments floor, so credited claims never exceed the fee moved into the contract. Fuzzed 40-step interleavings over 512 runs, plus the project's two invariant suites, agree.\n- **Zero-eligible-supply path.** Fees queue and the first subsequent buyer or claimant receives them. Documented design, unreachable while the distributor holds any swarm tokens.\n- **Casts in the launch helper.** The int128 to uint256 widening before negation and the uint128 liquidity cast are exact. The settlement shortfall check reverts on both short and over payment.\n- **v4 settlement.** Transfers into the PoolManager are untaxed, so `settle` measures the full amount and no CurrencyNotSettled arises. Hook flag constants match v4-core.\n\n**Finding 1 (low), `src/SIMDTESTToken.sol:104`.** The 3% fee fires only on an ERC-20 transfer from the PoolManager. A v4 swapper can settle a positive delta with `PoolManager.mint` (ERC-6909 claims) and a negative one with `PoolManager.burn`, so no ERC-20 leaves the manager and no fee or dividend accrues. My scratch test performed a full buy and sell round trip this way and ended with zero fees collected and an empty dividend reserve, paying only the 0.30% LP fee. The brief defines a buy as a transfer from the PoolManager and the README acknowledges netted swaps are untaxed, so I rated this low and attached the reproduction for the judge. Enforcing the fee on every swap would need an afterSwap hook, which is a design decision for the requester.\n\n**Coverage.** All four entry points have rows: approve and claim hold, transfer and transferFrom carry finding 1. Five extra rows record the invariants and boundaries above. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":1272346,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":30411,"runtime":"claude","turns":32,"wallClockMs":478386}},{"artifacts":[],"attempt":1,"bundleHash":"0dc57067bf6b2b39644deaedc48c964421f0d9371faa10ef798943ceda09252f","device":"6de2de551e41049f","findings":[],"hash":"a748a7582ce1017181fb70126cae03336e98cd74bcc3effc790c3d5e03d410a7","nodeId":"02ab4880-cee2-4da4-ae07-956b26838dfa","outcome":"completed","summary":"Recorded both findings in [.imd-responses.json](/root/.identitymd/work/06c3c526-3aec-4f72-8ca7-3a8d2876908d/02ab4880-cee2-4da4-ae07-956b26838dfa/.imd-responses.json).\n\nPreserved the working distributor exclusion. Disputed the proof’s outdated constructor call and confirmed the documented ERC-6909 fee boundary.\n\n`forge build`, `forge test` (34 passed), and `forge fmt --check` pass. The supplied proof still requires its constructor setup corrected.","treeHash":"e8c6341fea617192ff112084ffc87f7f1e264338","usage":{"cachedInputTokens":1515392,"inputTokens":153143,"model":"gpt-6-astra","outputTokens":19551,"runtime":"codex","turns":10,"wallClockMs":626196}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"85f29f4c09dba910","findings":[{"citation":"resolved","description":"Merged from audit_flow, audit_economics and audit_permissions (same root cause). The dividend exclusion set is fixed to the PoolManager, the token itself, 0xdead and address(0). The launch factory sends the swarm's 10% (100,000,000 SIMDTEST) to the launch's MerkleDistributor before it seeds the pool, and with poolBps 9000 the other 90% goes to the PoolManager, so remainderTo receives 0. Right after launch the distributor is therefore the only non-excluded holder (eligibleSupply = 100,000,000e18). _transfer() calls _distributePending() on PRE-buy balances, so every buy fee is spread pro rata over eligibleSupply and the distributor's share is written into the cumulative index for it. The MerkleDistributor is a reserved platform contract that only forwards Merkle claims; it has no code path that calls SIMDTESTToken.claim(), and by design (claimableDividends dev note) earned credit stays with the earner after its balance leaves. That credit therefore stays in balanceOf(address(token)) permanently: 100% of the first buy's fee, 95.6% of the first two buys' fees in the reproduction, and a share equal to balance(distributor)/eligibleSupply of every later fee for as long as seat and contributor allocations remain unclaimed (unclaimed ones earn forever). Requirement 6 (fees are distributable dividends for holders) is broken: a large part of holder revenue is paid to a party that cannot receive it, and no admin exists to recover it. The README documents the behaviour as a limitation, but the launch guide expects the token to exempt the launch's distributor (resolved via factory.distributorOf(launchNumber)); the exemption is missing from the dividend set. Fix: exclude the launch's distributor from dividends so its balance is not in eligibleSupply, e.g. take $factory and $launchNumber as constructor arguments (update launch.json constructorArgs accordingly) and treat IFactory(factory).distributorOf(launchNumber) as excluded (the address is fixed per launch and may be cached); also consider excluding the factory. With the distributor excluded, fees from buys before any real holder exists queue in pendingDividends and are released to the first eligible holder, which the code already supports and the README already documents as the exception to pre-buy allocation.","line":73,"path":"src/SIMDTESTToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SIMDTESTToken} from \"src/SIMDTESTToken.sol\";\n\n/// @dev Stands in for ProjectFactory: deploys the token, holds the mint, performs the launch\n/// allocations, and answers distributorOf(launchNumber) the way the real factory does so a fix\n/// that resolves the distributor through the factory works unchanged. If the fix adds\n/// constructor arguments ($factory, $launchNumber), update deploy() to pass them.\ncontract FactoryStub {\n    address public immutable distributor;\n    uint64 public constant LAUNCH_NUMBER = 1;\n\n    constructor(address distributor_) {\n        distributor = distributor_;\n    }\n\n    function distributorOf(uint64) external view returns (address) {\n        return distributor;\n    }\n\n    function deploy() external returns (SIMDTESTToken) {\n        return new SIMDTESTToken();\n    }\n\n    function move(SIMDTESTToken token, address to, uint256 amount) external {\n        require(token.transfer(to, amount));\n    }\n}\n\ncontract DistributorStrandedFeesTest is Test {\n    address constant POOL_MANAGER = 0x000000000004444c5dc75cB358380D2e3dE08A90;\n    address constant DISTRIBUTOR = address(0xD157); // the launch MerkleDistributor: never calls claim()\n    address constant DEAD = 0x000000000000000000000000000000000000dEaD;\n    address alice = address(0xA11CE);\n    address bob = address(0xB0B);\n\n    FactoryStub factory;\n    SIMDTESTToken token;\n\n    function setUp() public {\n        vm.chainId(1);\n        factory = new FactoryStub(DISTRIBUTOR);\n        token = factory.deploy();\n        // The launch flow exactly as the factory performs it: 10% to the swarm's distributor,\n        // 90% (poolBps 9000) seeded into the PoolManager, remainder (0 here) to 0xdead.\n        factory.move(token, DISTRIBUTOR, 100_000_000e18);\n        factory.move(token, POOL_MANAGER, 900_000_000e18);\n        assertEq(token.balanceOf(address(factory)), 0);\n    }\n\n    /// Buy fees must be claimable by holders who can claim. The distributor only forwards\n    /// Merkle claims and has no way to call claim(), so any credit allocated to it is stranded.\n    function test_buyFeesAreNotStrandedOnTheMerkleDistributor() public {\n        // First buy: 10,000,000 out of the pool, fee 300,000. Right after launch the distributor\n        // is the only non-excluded holder.\n        vm.prank(POOL_MANAGER);\n        token.transfer(alice, 10_000_000e18);\n        // Second buy: fee 300,000, allocated over the distributor's 100M and alice's 9.7M.\n        vm.prank(POOL_MANAGER);\n        token.transfer(bob, 10_000_000e18);\n\n        uint256 fees = token.totalFeesCollected();\n        assertEq(fees, 600_000e18);\n        assertEq(token.balanceOf(address(token)), fees);\n\n        // Expected: nothing is credited to the distributor.\n        // Actual on this code: 573,473.108...e18 (95.6% of all fees) is credited to it forever.\n        assertEq(token.claimableDividends(DISTRIBUTOR), 0, \"buy fees credited to the Merkle distributor\");\n\n        // Expected: the whole fee is reachable by holders who can claim (or still queued).\n        uint256 reachable = token.claimableDividends(alice) + token.claimableDividends(bob) + token.pendingDividends();\n        assertApproxEqAbs(reachable, fees, 1_000, \"fees not reachable by claimable holders\");\n    }\n}","reproduction":"State: factory deploys SIMDTESTToken (balance 1e27), transfers 100,000,000e18 to the distributor (0xD157) and 900,000,000e18 to the PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90, leaving 0. Calls: (1) vm.prank(PoolManager); token.transfer(alice, 10_000_000e18) -> fee 300,000e18, eligibleSupply 100,000,000e18 all held by the distributor; (2) vm.prank(PoolManager); token.transfer(bob, 10_000_000e18) -> fee 300,000e18 over distributor 100M + alice 9.7M. Expected: claimableDividends(distributor) == 0 and claimable(alice)+claimable(bob)+pendingDividends ~= 600,000e18 (the full fee reachable by holders who can claim). Actual: claimableDividends(distributor) = 573473108477666362807657 (573,473.1e18, 95.6% of all fees), alice can claim only ~26,527e18, and nothing can ever move the distributor's share out of the token contract. forge test --match-path test/scratch/DistributorStrandedFees.t.sol fails with 'buy fees credited to the Merkle distributor: 573473108477666362807657 != 0'. The same test passes against a copy of the token whose isExcludedFromDividends also returns true for IFactory(msg.sender-at-construction).distributorOf(launchNumber). The three specialist proofs (Proof_0c65faaed5f0, Proof_6bf65495f57d, Proof_1ae36022068e) were run and all fail for the same reason (29999999999999999999999 != 0 after a single 1,000,000e18 buy).","severity":"high","snippet":"        return account == POOL_MANAGER || account == address(this) || account == BURN_ADDRESS || account == address(0);","title":"Buy-fee dividends are credited to the swarm MerkleDistributor, which can never call claim(), so the fees it earns are stranded in the token contract forever (nearly all fees right after launch)"},{"citation":"resolved","description":"Merged from audit_permissions (medium) and audit_math (low); recalibrated to low because the code matches the brief's own definition ('buys, defined as transfers FROM the PoolManager address') and the README states that swaps netted inside v4 without a SIMDTEST ERC-20 payout are untaxed, so this is a boundary of the stated guarantee for the requester to decide, not a code error. In Uniswap v4 a swapper may settle a positive SIMDTEST delta with PoolManager.mint(to, currency.toId(), amount) (ERC-6909 claims) instead of take(), and pay a negative delta with PoolManager.burn() instead of an ERC-20 transfer in. Neither path calls SIMDTESTToken.transfer, so _transfer never runs, no fee accrues and no dividends are distributed. Round-trip traders, arbitrage and sandwich bots, which are the bulk of DEX volume, can therefore trade fee-free while ordinary buyers who withdraw the ERC-20 pay 3%, and holders lose the dividends that volume was meant to fund (requirements 3 and 6). Claims held this way earn no dividends either, so the bypass only helps traders who exit through the pool. The token cannot see this path; enforcing the fee on every swap would need pool-level enforcement (a v4 hook with afterSwap, which is a design change outside the current manifest), or the requester should accept and document that the fee applies only to ERC-20 withdrawals from the PoolManager.","line":104,"path":"src/SIMDTESTToken.sol","reproduction":"State: real v4 PoolManager constructed at 0x000000000004444c5dc75cB358380D2e3dE08A90 in a local EVM, IMD fixture at 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, token deployed via CREATE2 as currency0, 100,000,000e18 at the distributor, pool initialised at sqrtPriceX96 125270724187523965593206900 (2500 IMD cap) with fee 3000 / tick spacing 60 and seeded single-sided with the 900M budget, remainder to 0xdead. Calls: trader contract (1) unlock -> swap(zeroForOne=false, amountSpecified=-10e18 IMD) -> manager.mint(trader, uint160(token), delta.amount0()) and pays IMD via sync/transfer/settle; (2) unlock -> swap(zeroForOne=true, amountSpecified=-bought) -> manager.burn(trader, uint160(token), bought) and manager.mint(trader, uint160(IMD), delta.amount1()). Expected per the brief: the buy accrues 3% of the bought amount (118,418.77e18 for the 3,947,292.27e18 gross buy) to the token contract. Actual: token.totalFeesCollected() == 0 and token.balanceOf(token) == 0 after the full round trip, token.balanceOf(PoolManager) unchanged after the buy, trader ends with ~9.94e18 IMD claims (only the 0.30% LP fee was paid), both unlocks settle with getNonzeroDeltaCount()==0 and no CurrencyNotSettled. Scratch test test/scratch/ClaimsBypass.t.sol (not a proof, low severity) passes with these assertions; the same buy via take() in test/UniswapV4.t.sol testExactOutputBuyIsGrossAndBuyerReceives97Percent moves 3% to the token contract.","severity":"low","snippet":"        uint256 fee = from == POOL_MANAGER && to != POOL_MANAGER ? amount * BUY_FEE_BPS / BPS : 0;","title":"The 3% buy fee is keyed on ERC-20 transfers out of the PoolManager, so a swapper who settles the token delta as ERC-6909 claims (mint/burn) buys and sells with no fee and no dividend contribution"}],"hash":"c3224a62528cad23e7f318982636cc70a6c351eab16ecf8fdbf7d1b4c740e1d0","nodeId":"eb7b05cb-ee0b-463b-9e29-132e99cf8167","outcome":"completed","summary":"Review complete. The findings are in `.imd-findings.json` at the repository root, and the tree is otherwise unchanged. The scratch tests were removed and git reports a clean working tree because `.imd-findings.json` and `test/scratch/` are gitignored.\n\n**What I kept, after reproducing**\n\n1. **High. Buy fees are credited to the swarm MerkleDistributor, which can never claim them.** Three specialists (flow, economics, permissions) reported this same root cause, so I merged them into one finding at `src/SIMDTESTToken.sol:73`. The exclusion set omits the launch's distributor, which holds the only eligible balance right after launch. I ran all three specialist proofs and each fails for the stated reason. I wrote my own proof, which fails on the current code with the distributor credited 573,473 of the 600,000 tokens collected over two buys, and passes against a patched copy of the token that excludes the distributor resolved through the factory. The proof is embedded in the finding and uses a factory stub exposing `distributorOf` so a fix along the launch guide's lines works unchanged.\n\n2. **Low. ERC-6909 claim settlement bypasses the 3% fee.** Reported by permissions at medium and math at low. I reproduced it against the real v4 PoolManager constructed at the mainnet address: a buy settled with mint and a sell settled with burn moved about 3.9 million SIMDTEST round trip with zero fee collected and clean settlement. I recalibrated to low because the brief itself defines a buy as a transfer from the PoolManager and the README documents the gap. It is a boundary of the stated guarantee the requester must decide on, not a code error.\n\n**What I checked myself and found sound**\n\n- Dividend index math, overflow bounds, reserve solvency, pre-buy allocation, and the queued-fee release path.\n- All launch flows arrive whole, including seed, sell, and distributor claims.\n- No owner, mint, or forbidden opcodes. The manifest's supply, pool fields, and economics match the build requirements.\n- The slither and aderyn leads do not reproduce as defects. The ignored second return of `modifyLiquidity` is informational since the caller delta already includes accrued fees.\n\n**Coverage**: all four entry points answered. Transfer and transferFrom carry finding 1. Approve and claim hold. Six additional invariant rows record what else was verified.","treeHash":null,"usage":{"cachedInputTokens":800874,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":28022,"runtime":"claude","turns":23,"wallClockMs":448154}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c04c741787c1223a","findings":[],"hash":"ed921d7acaa71922a7d8b9c149ea040e0203cfde086116f9d73189d622e23fb5","nodeId":"ffe815b7-d692-466d-be3e-7cda6ec7f997","outcome":"failed","summary":"could not restore accepted work: accepted work conflicts with a dependency, which plan validation should have prevented: ","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":0,"wallClockMs":693}},{"artifacts":[],"attempt":1,"bundleHash":"c5049af69d138f4e6d0e5a1b5fb5991575637f4dc34d53189aae9bcfdc679614","device":"38c0c4e8e4438177","findings":[],"hash":"f7b49e28f12d35d6988b3474df1bb042c30a4038fa474f63f6d44ca88d784e12","nodeId":"d75cec02-9fb5-4387-8268-65336799c501","outcome":"completed","summary":"Added failure-path tests, 1,000-run fuzz properties, independent dividend invariants, and expanded Uniswap v4 settlement coverage. All changes are under `test/`.\n\n`forge build` and `forge test` pass: **45 tests, zero failures**. The new invariant passed **24,576 random actions**.\n\nNo implementation defects were reproduced. Live mainnet and production-router compatibility remain unverified.","treeHash":"96b5f23ff9f95c8ac58b7351244e994b3a648b57","usage":{"cachedInputTokens":1107968,"inputTokens":76343,"model":"gpt-6-astra","outputTokens":16598,"runtime":"codex","turns":6,"wallClockMs":527523}}],"verification":[{"checks":[{"durationMs":2407,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.29s\nCompiler run successful!\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/LaunchLiquidity.sol:25:33\n   │\n25 │           (BalanceDelta delta,) = manager.modifyLiquidity(\n   │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n26 │ ┃             seed.key,\n27 │ ┃             ModifyLiquidityParams(seed.tickLower, seed.tickUpper, int256(uint256(seed.liquidity)), bytes32(0)),\n28 │ ┃             \"\"\n29 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\n","passed":true},{"durationMs":5346,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 12 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] testExactOutputBuyIsGrossAndBuyerReceives97Percent() (gas: 1962725)\n[PASS] testFuzzMultipleTradersBuyClaimAndSellInBothCurrencyOrders(bool,uint96,uint96,uint8) (runs: 128, μ: 5374783, ~: 5214598)\nLogs:\n  Bound result 1135413091640\n  Bound result 99999000197944451\n  Bound result 4\n\n[PASS] testIncomingPairShortfallRevertsAndRollsBackTokenPayout() (gas: 2596502)\n[PASS] testOnlyManagerAndFactoryCanInvokeInitializationGuard() (gas: 31389)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency0() (gas: 2231886)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency1() (gas: 2242605)\n[PASS] testSeveralRealBuysFundClaimableSwarmHolderDividends() (gas: 2603956)\n[PASS] testUnlockCallbacksRejectArbitraryCallers() (gas: 814450)\n[PASS] testUnpaidBuyRestoresExistingRewardsWithTokenAsCurrency0() (gas: 2959007)\n[PASS] testUnpaidBuyRestoresExistingRewardsWithTokenAsCurrency1() (gas: 2971632)\n[PASS] testUnpaidSwapRevertsWithCurrencyNotSettledAndRollsBackFee() (gas: 1967964)\n[PASS] testZeroSwapAndLockedTakeCannotMovePoolFunds() (gas: 2143743)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 164.35ms (131.42ms CPU time)\n\nRan 21 tests for test/SIMDTESTToken.t.sol:SIMDTESTTokenTest\n[PASS] testAllowanceAndDelegatedBuyUseGrossAmount() (gas: 456235)\n[PASS] testBuyDeductsThreePercentAndSellDeliversFullAmount() (gas: 376417)\n[PASS] testClaimsCompoundOnlyFutureDividends() (gas: 675601)\n[PASS] testConstructorMintsOnlyToDeployer() (gas: 79028)\n[PASS] testExcludedBalancesNeverEarnAndBurnDoesNotChangeSupply() (gas: 681917)\n[PASS] testExternalFactoryAllocationAndSwarmClaimArriveWhole() (gas: 260075)\n[PASS] testFeesQueueWhileNoEligibleSupply() (gas: 578494)\n[PASS] testFormerHolderClaimReleasesZeroSupplyQueue() (gas: 788711)\n[PASS] testFractionalCreditSurvivesRepeatedCheckpoints() (gas: 1315542)\n[PASS] testFuzzBuyFeeConservation(uint256) (runs: 512, μ: 289262, ~: 297837)\nLogs:\n  Bound result 774985329006427393211186348\n\n[PASS] testFuzzWalletTransferConservation(uint256) (runs: 512, μ: 186734, ~: 187007)\nLogs:\n  Bound result 74985333760064816282987093\n\n[PASS] testInvalidTransfersAndApprovalsRevertAtomically() (gas: 261464)\n[PASS] testManagerSelfTransferIsUntaxed() (gas: 134542)\n[PASS] testNoAdminSelectorsOrMinting() (gas: 1067170)\n[PASS] testPoolWithdrawalToTokenContractRemainsSolvent() (gas: 710218)\n[PASS] testRuntimeHasNoForbiddenOpcodes() (gas: 1254211)\n[PASS] testSeveralBuysAccrueProportionallyBeforeEachBuy() (gas: 1099097)\n[PASS] testTinyEligibleSupplyThenLargeBalanceDoesNotOverflow() (gas: 584207)\n[PASS] testTransferKeepsPastDividendsWithSender() (gas: 767962)\n[PASS] testWalletTransfersAndSelfTransfersAreFree() (gas: 262524)\n[PASS] testZeroAndRepeatClaimRevert() (gas: 614491)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 183.92ms (115.76ms CPU time)\n\nRan 10 tests for test/TokenAdversarial.t.sol:TokenAdversarialTest\n[PASS] testAllowanceDoesNotAuthorizeStealingAnotherHoldersDividend() (gas: 1224628)\n[PASS] testFeeRoundingBoundariesEmitTheActualTransfers() (gas: 1180209)\n[PASS] testFuzzClaimOrderCannotRedistributePastRewards(uint256) (runs: 1000, μ: 937918, ~: 955672)\nLogs:\n  Bound result 748704658757258179297321471\n\n[PASS] testFuzzDelegatedFullExitRetainsHistoryAndReceiverEarnsOnlyFutureFees(uint256) (runs: 1000, μ: 770570, ~: 770651)\nLogs:\n  Bound result 399999999999999999999999999\n\n[PASS] testFuzzExistingBuyerEarnsOnlyOnPreBuyBalance(uint256,bool) (runs: 1000, μ: 570426, ~: 576281)\nLogs:\n  Bound result 559353576849746649218284366\n\n[PASS] testFuzzOversizedDelegatedBuyRevertsBeforeFeeMathAndPreservesState(uint256) (runs: 1000, μ: 1345163, ~: 1345631)\nLogs:\n  Bound result 272551348704658757258179267340905\n\n[PASS] testInvalidReceiverRollsBackGrossAllowanceAndExistingDividends() (gas: 1112541)\n[PASS] testMaximumTransferRevertsWithBalanceErrorInsteadOfArithmeticPanic() (gas: 909835)\n[PASS] testNetOnlyApprovalCannotAuthorizeGrossBuyAndRevocationIsImmediate() (gas: 1748531)\n[PASS] testNoAdminCallerCanRedirectFeeReserveOrChangeExclusions() (gas: 18852267)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 185.24ms (720.83ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS]\nDividendInvariantTest invariants:\n[PASS] invariantExcludedAccountsNeverEarn\n[PASS] invariantFeesAndClaimsMatchObservedFlows\n[PASS] invariantOutstandingDividendsAreFullyBacked\n[PASS] invariantSupplyAndEligibleBalancesAreConserved\n DividendInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+---------------+-------+---------+----------╮\n| Contract        | Selector      | Calls | Reverts | Discards |\n+==============================================================+\n| DividendHandler | buy           | 1994  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | claim         | 2124  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | delegatedMove | 2001  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | move          | 2073  | 0       | 0        |\n╰-----------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 67\n  Bound result 10000\n  Bound result 18248036745459943247188947\n  Bound result 3788\n  Bound result 68700948495521391001159178\n  Bound result 1316084014\n  Bound result 16384\n  Bound result 33\n  Bound result 24999999999999998683915986\n  Bound result 2439649221\n  Bound result 1405366175383474\n  Bound result 16698175703244643450237766\n  Bound result 0\n  Bound result 0\n  Bound result 3916\n  Bound result 0\n  Bound result 0\n  Bound result 128\n  Bound result 6\n  Bound result 101\n  Bound result 1046363172\n  Bound result 32\n  Bound result 9999999999999999\n  Bound result 3\n  Bound result 570\n  Bound result 99\n  Bound result 101\n  Bound result 60000000000000000000000\n  Bound result 5618\n  Bound result 7688\n  Bound result 331486960\n  Bound result 745382880301030843530569570\n  Bound result 1915\n  Bound result 60000000000000000000\n  Bound result 75000000000000000000000000\n  Bound result 2671\n  Bound result 19432710571717089380792640\n  Bound result 10000000000000000000\n  Bound result 994\n  Bound result 19\n  Bound result 3466777002767218166172441\n  Bound result 71586450445917055238409050\n  Bound result 6588\n  Bound result 100000000000000000000\n  Bound result 32\n  Bound result 2\n  Bound result 755740501933518565317151356\n  Bound result 8802\n  Bound result 6716394427273958226763652\n  Bound result 3111\n  Bound result 4621\n  Bound result 1877\n  Bound result 5\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.66s (1.66s CPU time)\n\nRan 1 test for test/DividendModelInvariant.t.sol:DividendModelInvariantTest\n[PASS] invariantBalancesAndRewardsMatchIndependentLedger() (runs: 256, calls: 24576, reverts: 0)\n\n╭----------------------+-----------------------+-------+---------+----------╮\n| Contract             | Selector              | Calls | Reverts | Discards |\n+===========================================================================+\n| DividendModelHandler | buy                   | 4006  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | claim                 | 4102  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | exitAllAndQueue       | 4126  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | move                  | 4106  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | rejectExcludedClaim   | 4176  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | rejectUnapprovedSpend | 4060  | 0       | 0        |\n╰----------------------+-----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 851181032472052305598229621\n  Bound result 614283753\n  Bound result 6790\n  Bound result 80960239904366302961287833\n  Bound result 3618\n  Bound result 5547\n  Bound result 403400638881347255035111618\n  Bound result 2669\n  Bound result 488\n  Bound result 25000000000000000000000000\n  Bound result 26\n  Bound result 206\n  Bound result 6800\n  Bound result 666416102355444464034512896\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.26s (5.26s CPU time)\n\nRan 5 test suites in 5.27s (7.46s CPU time): 45 tests passed, 0 failed, 0 skipped (45 total tests)\n","passed":true},{"durationMs":44,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SIMDTESTToken.approve(address,uint256)\",\"SIMDTESTToken.claim()\",\"SIMDTESTToken.transfer(address,uint256)\",\"SIMDTESTToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":172,\"foundry.toml\":21,\"launch.json\":24,\"src/HookFlags.sol\":12,\"src/LaunchLiquidity.sol\":54,\"src/PoolInitializationGuard.sol\":26,\"src/SIMDTESTToken.sol\":147,\"test/DividendInvariant.t.sol\":153,\"test/DividendModelInvariant.t.sol\":223,\"test/SIMDTESTToken.t.sol\":390,\"test/TESTING.md\":32,\"test/TokenAdversarial.t.sol\":287,\"test/UniswapV4.t.sol\":512},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"26d519e43004d4827e83b60777a0185ec8843da40f0ccb50dcfa2e995ed29aa2","verifiedTreeHash":"deaa09c17bd51e9e95b805703569269b46a41894","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":3873,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.72s\nCompiler run successful!\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/LaunchLiquidity.sol:25:33\n   │\n25 │           (BalanceDelta delta,) = manager.modifyLiquidity(\n   │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n26 │ ┃             seed.key,\n27 │ ┃             ModifyLiquidityParams(seed.tickLower, seed.tickUpper, int256(uint256(seed.liquidity)), bytes32(0)),\n28 │ ┃             \"\"\n29 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\n","passed":true},{"durationMs":8108,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 13 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] testERC6909RoundTripDoesNotTriggerAnERC20TransferFee() (gas: 3068292)\n[PASS] testExactOutputBuyIsGrossAndBuyerReceives97Percent() (gas: 2040536)\n[PASS] testFuzzMultipleTradersBuyClaimAndSellInBothCurrencyOrders(bool,uint96,uint96,uint8) (runs: 128, μ: 5479153, ~: 5361628)\nLogs:\n  Bound result 99999003294232919\n  Bound result 99999000000002777\n  Bound result 3\n\n[PASS] testIncomingPairShortfallRevertsAndRollsBackTokenPayout() (gas: 2685408)\n[PASS] testOnlyManagerAndFactoryCanInvokeInitializationGuard() (gas: 31389)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency0() (gas: 2350392)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency1() (gas: 2361049)\n[PASS] testSeveralRealBuysFundClaimableSwarmHolderDividends() (gas: 2718955)\n[PASS] testUnlockCallbacksRejectArbitraryCallers() (gas: 814428)\n[PASS] testUnpaidBuyRestoresExistingRewardsWithTokenAsCurrency0() (gas: 3077156)\n[PASS] testUnpaidBuyRestoresExistingRewardsWithTokenAsCurrency1() (gas: 3089809)\n[PASS] testUnpaidSwapRevertsWithCurrencyNotSettledAndRollsBackFee() (gas: 2045796)\n[PASS] testZeroSwapAndLockedTakeCannotMovePoolFunds() (gas: 2210766)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 208.77ms (220.43ms CPU time)\n\nRan 25 tests for test/SIMDTESTToken.t.sol:SIMDTESTTokenTest\n[PASS] testAllowanceAndDelegatedBuyUseGrossAmount() (gas: 516474)\n[PASS] testBuyDeductsThreePercentAndSellDeliversFullAmount() (gas: 438721)\n[PASS] testBuyFeesAreNotStrandedOnTheMerkleDistributor() (gas: 747911)\n[PASS] testCachedDistributorCannotBeChangedByFactory() (gas: 562543)\n[PASS] testClaimsCompoundOnlyFutureDividends() (gas: 736514)\n[PASS] testConstructorMintsOnlyToDeployer() (gas: 104319)\n[PASS] testExcludedBalancesNeverEarnAndBurnDoesNotChangeSupply() (gas: 831189)\n[PASS] testExternalFactoryAllocationAndSwarmClaimArriveWhole() (gas: 327381)\n[PASS] testFeesQueueWhileNoEligibleSupply() (gas: 620804)\n[PASS] testFormerHolderClaimReleasesZeroSupplyQueue() (gas: 853827)\n[PASS] testFractionalCreditSurvivesRepeatedCheckpoints() (gas: 1412047)\n[PASS] testFuzzBuyFeeConservation(uint256) (runs: 512, μ: 310268, ~: 317266)\nLogs:\n  Bound result 24553\n\n[PASS] testFuzzWalletTransferConservation(uint256) (runs: 512, μ: 237354, ~: 237543)\nLogs:\n  Bound result 414618681371914737453777796\n\n[PASS] testInvalidTransfersAndApprovalsRevertAtomically() (gas: 261653)\n[PASS] testLateRegistrationRemovesPriorBalanceBeforeAnyFee() (gas: 452612)\n[PASS] testManagerSelfTransferIsUntaxed() (gas: 159132)\n[PASS] testNoAdminSelectorsOrMinting() (gas: 1117587)\n[PASS] testPoolWithdrawalToTokenContractRemainsSolvent() (gas: 772872)\n[PASS] testRuntimeHasNoForbiddenOpcodes() (gas: 1481584)\n[PASS] testSeveralBuysAccrueProportionallyBeforeEachBuy() (gas: 1185736)\n[PASS] testSwarmBeneficiaryEarnsOnlyAfterMerkleTransfer() (gas: 841073)\n[PASS] testTinyEligibleSupplyThenLargeBalanceDoesNotOverflow() (gas: 644492)\n[PASS] testTransferKeepsPastDividendsWithSender() (gas: 835647)\n[PASS] testWalletTransfersAndSelfTransfersAreFree() (gas: 318964)\n[PASS] testZeroAndRepeatClaimRevert() (gas: 706885)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 224.74ms (437.57ms CPU time)\n\nRan 10 tests for test/TokenAdversarial.t.sol:TokenAdversarialTest\n[PASS] testAllowanceDoesNotAuthorizeStealingAnotherHoldersDividend() (gas: 1365368)\n[PASS] testFeeRoundingBoundariesEmitTheActualTransfers() (gas: 1205819)\n[PASS] testFuzzClaimOrderCannotRedistributePastRewards(uint256) (runs: 1000, μ: 973020, ~: 990428)\nLogs:\n  Bound result 8507089687147310078778\n\n[PASS] testFuzzDelegatedFullExitRetainsHistoryAndReceiverEarnsOnlyFutureFees(uint256) (runs: 1000, μ: 797619, ~: 797698)\nLogs:\n  Bound result 259538768772855445347516857\n\n[PASS] testFuzzExistingBuyerEarnsOnlyOnPreBuyBalance(uint256,bool) (runs: 1000, μ: 588323, ~: 598615)\nLogs:\n  Bound result 846672931011527974009582404\n\n[PASS] testFuzzOversizedDelegatedBuyRevertsBeforeFeeMathAndPreservesState(uint256) (runs: 1000, μ: 1488746, ~: 1489200)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639664040457584007914076322219\n\n[PASS] testInvalidReceiverRollsBackGrossAllowanceAndExistingDividends() (gas: 1244398)\n[PASS] testMaximumTransferRevertsWithBalanceErrorInsteadOfArithmeticPanic() (gas: 1038566)\n[PASS] testNetOnlyApprovalCannotAuthorizeGrossBuyAndRevocationIsImmediate() (gas: 2003284)\n[PASS] testNoAdminCallerCanRedirectFeeReserveOrChangeExclusions() (gas: 21965819)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 224.78ms (941.33ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS]\nDividendInvariantTest invariants:\n[PASS] invariantExcludedAccountsNeverEarn\n[PASS] invariantFeesAndClaimsMatchObservedFlows\n[PASS] invariantOutstandingDividendsAreFullyBacked\n[PASS] invariantSupplyAndEligibleBalancesAreConserved\n DividendInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+---------------+-------+---------+----------╮\n| Contract        | Selector      | Calls | Reverts | Discards |\n+==============================================================+\n| DividendHandler | buy           | 2056  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | claim         | 2012  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | delegatedMove | 2075  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | move          | 2049  | 0       | 0        |\n╰-----------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 91092965650\n  Bound result 1\n  Bound result 6996834393264567191147761\n  Bound result 100\n  Bound result 438\n  Bound result 1396\n  Bound result 10136464465747815808653483\n  Bound result 8144\n  Bound result 100000000000000000000000000\n  Bound result 8144\n  Bound result 2877\n  Bound result 18\n  Bound result 8851\n  Bound result 10000000000000000000000\n  Bound result 0\n  Bound result 19\n  Bound result 100000000000000000000\n  Bound result 0\n  Bound result 2500000000000000000000\n  Bound result 10000\n  Bound result 8\n  Bound result 3272813\n  Bound result 4162066\n  Bound result 33\n  Bound result 1074\n  Bound result 300\n  Bound result 23761995949594959495932884\n  Bound result 4834975293525585747533938\n  Bound result 22200272163278182079431255\n  Bound result 20644577719207477658360409\n  Bound result 4241238034\n  Bound result 10000000000000000\n  Bound result 9823\n  Bound result 7\n  Bound result 600000000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 70349963663445669047622280\n  Bound result 3480\n  Bound result 5257\n  Bound result 454401671258798217458947834\n  Bound result 13671753525859636655645885\n  Bound result 8020\n  Bound result 88009919575537389009338581\n  Bound result 10\n  Bound result 4079\n  Bound result 99\n  Bound result 103552837\n  Bound result 62\n  Bound result 3336\n  Bound result 101\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.15s (2.15s CPU time)\n\nRan 1 test for test/DividendModelInvariant.t.sol:DividendModelInvariantTest\n[PASS] invariantBalancesAndRewardsMatchIndependentLedger() (runs: 256, calls: 24576, reverts: 0)\n\n╭----------------------+-----------------------+-------+---------+----------╮\n| Contract             | Selector              | Calls | Reverts | Discards |\n+===========================================================================+\n| DividendModelHandler | buy                   | 4213  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | claim                 | 3964  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | exitAllAndQueue       | 4156  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | move                  | 4112  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | rejectExcludedClaim   | 4132  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | rejectUnapprovedSpend | 3999  | 0       | 0        |\n╰----------------------+-----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 400000000000000000000000000\n  Bound result 8\n  Bound result 938463463374607431768211455\n  Bound result 666416102355444464034512896\n  Bound result 1570\n  Bound result 363\n  Bound result 7485\n  Bound result 300\n  Bound result 60000000000000000000000\n  Bound result 10000000000000000000000000\n  Bound result 4681\n  Bound result 228162514264337593543950336\n  Bound result 34895645049653912369145734\n  Bound result 3918\n  Bound result 1000000000000000000000000000\n  Bound result 110395246405220\n  Bound result 1\n  Bound result 25000000000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.00s (8.00s CPU time)\n\nRan 5 test suites in 8.00s (10.81s CPU time): 50 tests passed, 0 failed, 0 skipped (50 total tests)\n","passed":true},{"durationMs":61,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SIMDTESTToken.approve(address,uint256)\",\"SIMDTESTToken.claim()\",\"SIMDTESTToken.transfer(address,uint256)\",\"SIMDTESTToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":198,\"foundry.toml\":21,\"launch.json\":24,\"src/HookFlags.sol\":12,\"src/LaunchLiquidity.sol\":54,\"src/PoolInitializationGuard.sol\":26,\"src/SIMDTESTToken.sol\":176,\"test/DividendInvariant.t.sol\":164,\"test/DividendModelInvariant.t.sol\":238,\"test/SIMDTESTToken.t.sol\":482,\"test/TESTING.md\":38,\"test/TokenAdversarial.t.sol\":296,\"test/UniswapV4.t.sol\":584},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3626add12c2128a279ad3c1bc026b6e183443f8921e6ef86ee3a882d42cfd801","verifiedTreeHash":"6d788bfd54f4c392615bdd964c43dc5f811c0b24","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":2387,"exitCode":0,"name":"build","output":"Compiling 72 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.25s\nCompiler run successful!\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/LaunchLiquidity.sol:25:33\n   │\n25 │           (BalanceDelta delta,) = manager.modifyLiquidity(\n   │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n26 │ ┃             seed.key,\n27 │ ┃             ModifyLiquidityParams(seed.tickLower, seed.tickUpper, int256(uint256(seed.liquidity)), bytes32(0)),\n28 │ ┃             \"\"\n29 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\n","passed":true},{"durationMs":1952,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] testExactOutputBuyIsGrossAndBuyerReceives97Percent() (gas: 1927582)\n[PASS] testOnlyManagerAndFactoryCanInvokeInitializationGuard() (gas: 31222)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency0() (gas: 2196743)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency1() (gas: 2207440)\n[PASS] testSeveralRealBuysFundClaimableSwarmHolderDividends() (gas: 2568651)\n[PASS] testUnlockCallbacksRejectArbitraryCallers() (gas: 779198)\n[PASS] testUnpaidSwapRevertsWithCurrencyNotSettledAndRollsBackFee() (gas: 1932801)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 16.57ms (11.91ms CPU time)\n\nRan 21 tests for test/SIMDTESTToken.t.sol:SIMDTESTTokenTest\n[PASS] testAllowanceAndDelegatedBuyUseGrossAmount() (gas: 456235)\n[PASS] testBuyDeductsThreePercentAndSellDeliversFullAmount() (gas: 376417)\n[PASS] testClaimsCompoundOnlyFutureDividends() (gas: 675601)\n[PASS] testConstructorMintsOnlyToDeployer() (gas: 79028)\n[PASS] testExcludedBalancesNeverEarnAndBurnDoesNotChangeSupply() (gas: 681917)\n[PASS] testExternalFactoryAllocationAndSwarmClaimArriveWhole() (gas: 260075)\n[PASS] testFeesQueueWhileNoEligibleSupply() (gas: 578494)\n[PASS] testFormerHolderClaimReleasesZeroSupplyQueue() (gas: 788711)\n[PASS] testFractionalCreditSurvivesRepeatedCheckpoints() (gas: 1315542)\n[PASS] testFuzzBuyFeeConservation(uint256) (runs: 512, μ: 288102, ~: 297837)\nLogs:\n  Bound result 662306034333905281226895679\n\n[PASS] testFuzzWalletTransferConservation(uint256) (runs: 512, μ: 186848, ~: 187007)\nLogs:\n  Bound result 97926941038609512294807349\n\n[PASS] testInvalidTransfersAndApprovalsRevertAtomically() (gas: 261464)\n[PASS] testManagerSelfTransferIsUntaxed() (gas: 134542)\n[PASS] testNoAdminSelectorsOrMinting() (gas: 1067170)\n[PASS] testPoolWithdrawalToTokenContractRemainsSolvent() (gas: 710218)\n[PASS] testRuntimeHasNoForbiddenOpcodes() (gas: 1254211)\n[PASS] testSeveralBuysAccrueProportionallyBeforeEachBuy() (gas: 1099097)\n[PASS] testTinyEligibleSupplyThenLargeBalanceDoesNotOverflow() (gas: 584207)\n[PASS] testTransferKeepsPastDividendsWithSender() (gas: 767962)\n[PASS] testWalletTransfersAndSelfTransfersAreFree() (gas: 262524)\n[PASS] testZeroAndRepeatClaimRevert() (gas: 614491)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 16.94ms (58.32ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS]\nDividendInvariantTest invariants:\n[PASS] invariantExcludedAccountsNeverEarn\n[PASS] invariantFeesAndClaimsMatchObservedFlows\n[PASS] invariantOutstandingDividendsAreFullyBacked\n[PASS] invariantSupplyAndEligibleBalancesAreConserved\n DividendInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+---------------+-------+---------+----------╮\n| Contract        | Selector      | Calls | Reverts | Discards |\n+==============================================================+\n| DividendHandler | buy           | 2059  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | claim         | 2045  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | delegatedMove | 2019  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | move          | 2069  | 0       | 0        |\n╰-----------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 93177419548020453231\n  Bound result 294957422669332322895946525\n  Bound result 8192\n  Bound result 1953020180\n  Bound result 90000000000000000000\n  Bound result 60000000000000000000\n  Bound result 605042484153248129083600242\n  Bound result 0\n  Bound result 0\n  Bound result 20000000000000000000000\n  Bound result 1\n  Bound result 156571643155668316544\n  Bound result 13316184326086257194117317\n  Bound result 16384\n  Bound result 2804\n  Bound result 54271885602162413936541168\n  Bound result 2\n  Bound result 8192\n  Bound result 125270724187523965593206900\n  Bound result 584376385798\n  Bound result 2\n  Bound result 0\n  Bound result 1\n  Bound result 14562587006731314986659777\n  Bound result 4518732882937258149286471\n  Bound result 100000000000000000000\n  Bound result 79225227617468361492417858\n  Bound result 38\n  Bound result 2413\n  Bound result 1700480447876828559671340\n  Bound result 255\n  Bound result 424\n  Bound result 6293\n  Bound result 90000000000000000000\n  Bound result 1000\n  Bound result 3622\n  Bound result 4043388714060701050\n  Bound result 7950\n  Bound result 7503203481267454068617253\n  Bound result 25000000000000000000000000\n  Bound result 2894\n  Bound result 127\n  Bound result 7752\n  Bound result 300\n  Bound result 3620\n  Bound result 25669890145133450279346349\n  Bound result 8552822159299499163262746\n  Bound result 1669556034440523702893083\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.85s (1.85s CPU time)\n\nRan 3 test suites in 1.85s (1.88s CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true},{"durationMs":55,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SIMDTESTToken.approve(address,uint256)\",\"SIMDTESTToken.claim()\",\"SIMDTESTToken.transfer(address,uint256)\",\"SIMDTESTToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":172,\"foundry.toml\":21,\"launch.json\":24,\"src/HookFlags.sol\":12,\"src/LaunchLiquidity.sol\":54,\"src/PoolInitializationGuard.sol\":26,\"src/SIMDTESTToken.sol\":147,\"test/DividendInvariant.t.sol\":153,\"test/SIMDTESTToken.t.sol\":390,\"test/UniswapV4.t.sol\":321},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":691,"exitCode":0,"name":"slither","output":"[medium/medium] unused-return at src/LaunchLiquidity.sol:22: LaunchLiquidity.settleSeed(IPoolManager,bytes) (src/LaunchLiquidity.sol#22-32) ignores return value by (delta,None) = manager.modifyLiquidity(seed.key,ModifyLiquidityParams(seed.tickLower,seed.tickUpper,int256(uint256(seed.liquidity)),bytes32(0)),) (src/LaunchLiquidity.sol#25-29)","passed":true},{"durationMs":294,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SIMDTESTToken.sol:11: Large Numeric Literal (2 places)\n[low] missing-inheritance at src/SIMDTESTToken.sol:7: Missing Inheritance\n[low] unsafe-erc20-operation at src/LaunchLiquidity.sol:48: Unsafe ERC20 Operation\n[low] unused-public-function at src/SIMDTESTToken.sol:78: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4d2e719f062760ce69183bbeb3bb85b5c5b7b72787bd607025f03985a629478c","verifiedTreeHash":"5fe2df72ca1d48cddee5fa498a65963e1157ed3d","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":3095,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.93s\nCompiler run successful!\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/LaunchLiquidity.sol:25:33\n   │\n25 │           (BalanceDelta delta,) = manager.modifyLiquidity(\n   │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n26 │ ┃             seed.key,\n27 │ ┃             ModifyLiquidityParams(seed.tickLower, seed.tickUpper, int256(uint256(seed.liquidity)), bytes32(0)),\n28 │ ┃             \"\"\n29 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\n","passed":true},{"durationMs":7824,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 10 tests for test/TokenAdversarial.t.sol:TokenAdversarialTest\n[PASS] testAllowanceDoesNotAuthorizeStealingAnotherHoldersDividend() (gas: 1365368)\n[PASS] testFeeRoundingBoundariesEmitTheActualTransfers() (gas: 1205819)\n[PASS] testFuzzClaimOrderCannotRedistributePastRewards(uint256) (runs: 1000, μ: 972389, ~: 990440)\nLogs:\n  Bound result 11537\n\n[PASS] testFuzzDelegatedFullExitRetainsHistoryAndReceiverEarnsOnlyFutureFees(uint256) (runs: 1000, μ: 797612, ~: 797698)\nLogs:\n  Bound result 399999970000000000000000001\n\n[PASS] testFuzzExistingBuyerEarnsOnlyOnPreBuyBalance(uint256,bool) (runs: 1000, μ: 589532, ~: 598615)\nLogs:\n  Bound result 20000000000000000\n\n[PASS] testFuzzOversizedDelegatedBuyRevertsBeforeFeeMathAndPreservesState(uint256) (runs: 1000, μ: 1488735, ~: 1489200)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639664040457584007913129640571\n\n[PASS] testInvalidReceiverRollsBackGrossAllowanceAndExistingDividends() (gas: 1244398)\n[PASS] testMaximumTransferRevertsWithBalanceErrorInsteadOfArithmeticPanic() (gas: 1038566)\n[PASS] testNetOnlyApprovalCannotAuthorizeGrossBuyAndRevocationIsImmediate() (gas: 2003284)\n[PASS] testNoAdminCallerCanRedirectFeeReserveOrChangeExclusions() (gas: 21965819)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 226.54ms (902.15ms CPU time)\n\nRan 13 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] testERC6909RoundTripDoesNotTriggerAnERC20TransferFee() (gas: 3068292)\n[PASS] testExactOutputBuyIsGrossAndBuyerReceives97Percent() (gas: 2040536)\n[PASS] testFuzzMultipleTradersBuyClaimAndSellInBothCurrencyOrders(bool,uint96,uint96,uint8) (runs: 128, μ: 5597735, ~: 5375950)\nLogs:\n  Bound result 99999000102299015\n  Bound result 99999000000024502\n  Bound result 1\n\n[PASS] testIncomingPairShortfallRevertsAndRollsBackTokenPayout() (gas: 2685408)\n[PASS] testOnlyManagerAndFactoryCanInvokeInitializationGuard() (gas: 31389)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency0() (gas: 2350392)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency1() (gas: 2361049)\n[PASS] testSeveralRealBuysFundClaimableSwarmHolderDividends() (gas: 2718955)\n[PASS] testUnlockCallbacksRejectArbitraryCallers() (gas: 814428)\n[PASS] testUnpaidBuyRestoresExistingRewardsWithTokenAsCurrency0() (gas: 3077156)\n[PASS] testUnpaidBuyRestoresExistingRewardsWithTokenAsCurrency1() (gas: 3089809)\n[PASS] testUnpaidSwapRevertsWithCurrencyNotSettledAndRollsBackFee() (gas: 2045796)\n[PASS] testZeroSwapAndLockedTakeCannotMovePoolFunds() (gas: 2210766)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 297.12ms (311.91ms CPU time)\n\nRan 25 tests for test/SIMDTESTToken.t.sol:SIMDTESTTokenTest\n[PASS] testAllowanceAndDelegatedBuyUseGrossAmount() (gas: 516474)\n[PASS] testBuyDeductsThreePercentAndSellDeliversFullAmount() (gas: 438721)\n[PASS] testBuyFeesAreNotStrandedOnTheMerkleDistributor() (gas: 747911)\n[PASS] testCachedDistributorCannotBeChangedByFactory() (gas: 562543)\n[PASS] testClaimsCompoundOnlyFutureDividends() (gas: 736514)\n[PASS] testConstructorMintsOnlyToDeployer() (gas: 104319)\n[PASS] testExcludedBalancesNeverEarnAndBurnDoesNotChangeSupply() (gas: 831189)\n[PASS] testExternalFactoryAllocationAndSwarmClaimArriveWhole() (gas: 327381)\n[PASS] testFeesQueueWhileNoEligibleSupply() (gas: 620804)\n[PASS] testFormerHolderClaimReleasesZeroSupplyQueue() (gas: 853827)\n[PASS] testFractionalCreditSurvivesRepeatedCheckpoints() (gas: 1412047)\n[PASS] testFuzzBuyFeeConservation(uint256) (runs: 512, μ: 309837, ~: 317266)\nLogs:\n  Bound result 4414\n\n[PASS] testFuzzWalletTransferConservation(uint256) (runs: 512, μ: 237523, ~: 237543)\nLogs:\n  Bound result 10000000000000000000000\n\n[PASS] testInvalidTransfersAndApprovalsRevertAtomically() (gas: 261653)\n[PASS] testLateRegistrationRemovesPriorBalanceBeforeAnyFee() (gas: 452612)\n[PASS] testManagerSelfTransferIsUntaxed() (gas: 159132)\n[PASS] testNoAdminSelectorsOrMinting() (gas: 1117587)\n[PASS] testPoolWithdrawalToTokenContractRemainsSolvent() (gas: 772872)\n[PASS] testRuntimeHasNoForbiddenOpcodes() (gas: 1481584)\n[PASS] testSeveralBuysAccrueProportionallyBeforeEachBuy() (gas: 1185736)\n[PASS] testSwarmBeneficiaryEarnsOnlyAfterMerkleTransfer() (gas: 841073)\n[PASS] testTinyEligibleSupplyThenLargeBalanceDoesNotOverflow() (gas: 644492)\n[PASS] testTransferKeepsPastDividendsWithSender() (gas: 835647)\n[PASS] testWalletTransfersAndSelfTransfersAreFree() (gas: 318964)\n[PASS] testZeroAndRepeatClaimRevert() (gas: 706885)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 297.17ms (471.00ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS]\nDividendInvariantTest invariants:\n[PASS] invariantExcludedAccountsNeverEarn\n[PASS] invariantFeesAndClaimsMatchObservedFlows\n[PASS] invariantOutstandingDividendsAreFullyBacked\n[PASS] invariantSupplyAndEligibleBalancesAreConserved\n DividendInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+---------------+-------+---------+----------╮\n| Contract        | Selector      | Calls | Reverts | Discards |\n+==============================================================+\n| DividendHandler | buy           | 2087  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | claim         | 2058  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | delegatedMove | 1983  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | move          | 2064  | 0       | 0        |\n╰-----------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 9999999999999999\n  Bound result 454\n  Bound result 3162514264337593543947167\n  Bound result 24999820000000000000000001\n  Bound result 282845609816874408\n  Bound result 13\n  Bound result 10293\n  Bound result 100000000000000000000\n  Bound result 3\n  Bound result 60\n  Bound result 392169300815437926492861118\n  Bound result 5389\n  Bound result 2550\n  Bound result 13\n  Bound result 65536\n  Bound result 2192\n  Bound result 486\n  Bound result 65536\n  Bound result 3488\n  Bound result 6709\n  Bound result 13425452379955169930526922\n  Bound result 1855\n  Bound result 4634\n  Bound result 18\n  Bound result 22500000000000000000\n  Bound result 70000000000000000000\n  Bound result 15649670256232007144263068\n  Bound result 379846340191811039767857090\n  Bound result 12706721415167738824\n  Bound result 18574601238980942935678160\n  Bound result 102175982339482785301\n  Bound result 8791\n  Bound result 3000\n  Bound result 7959876401339061264\n  Bound result 255\n  Bound result 108090112690831\n  Bound result 36838617920244554643\n  Bound result 1739884047626270459\n  Bound result 7843377605823888162888227\n  Bound result 3000\n  Bound result 970000000000000000000\n  Bound result 7\n  Bound result 7\n  Bound result 41269143500186069257\n  Bound result 4217804189735975937\n  Bound result 12\n  Bound result 15837018575201442710567865\n  Bound result 208236234540112984801\n  Bound result 2950650758702196413\n  Bound result 7\n  Bound result 1000000000000\n  Bound result 737\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.15s (2.14s CPU time)\n\nRan 1 test for test/DividendModelInvariant.t.sol:DividendModelInvariantTest\n[PASS] invariantBalancesAndRewardsMatchIndependentLedger() (runs: 256, calls: 24576, reverts: 0)\n\n╭----------------------+-----------------------+-------+---------+----------╮\n| Contract             | Selector              | Calls | Reverts | Discards |\n+===========================================================================+\n| DividendModelHandler | buy                   | 4112  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | claim                 | 4070  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | exitAllAndQueue       | 4113  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | move                  | 4174  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | rejectExcludedClaim   | 4014  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | rejectUnapprovedSpend | 4093  | 0       | 0        |\n╰----------------------+-----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 15130668577932775513435854\n  Bound result 20937\n  Bound result 1000000000000000000000\n  Bound result 11279\n  Bound result 30000000000000000000000\n  Bound result 300\n  Bound result 6751\n  Bound result 5921\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.72s (7.72s CPU time)\n\nRan 5 test suites in 7.72s (10.69s CPU time): 50 tests passed, 0 failed, 0 skipped (50 total tests)\n","passed":true},{"durationMs":62,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SIMDTESTToken.approve(address,uint256)\",\"SIMDTESTToken.claim()\",\"SIMDTESTToken.transfer(address,uint256)\",\"SIMDTESTToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":198,\"foundry.toml\":21,\"launch.json\":24,\"src/HookFlags.sol\":12,\"src/LaunchLiquidity.sol\":54,\"src/PoolInitializationGuard.sol\":26,\"src/SIMDTESTToken.sol\":176,\"test/DividendInvariant.t.sol\":164,\"test/DividendModelInvariant.t.sol\":238,\"test/SIMDTESTToken.t.sol\":482,\"test/TESTING.md\":38,\"test/TokenAdversarial.t.sol\":296,\"test/UniswapV4.t.sol\":584},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9e0ecd5260a65399fce4bbde8ac5b9a6380ab6b03aff6f6270b7051ba4bfc8ef","verifiedTreeHash":"3e49834324bfb4961b39bfb1703e9a0592d8d504","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":2167,"exitCode":0,"name":"build","output":"Compiling 72 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.05s\nCompiler run successful!\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/LaunchLiquidity.sol:25:33\n   │\n25 │           (BalanceDelta delta,) = manager.modifyLiquidity(\n   │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n26 │ ┃             seed.key,\n27 │ ┃             ModifyLiquidityParams(seed.tickLower, seed.tickUpper, int256(uint256(seed.liquidity)), bytes32(0)),\n28 │ ┃             \"\"\n29 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\n","passed":true},{"durationMs":1939,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] testERC6909RoundTripDoesNotTriggerAnERC20TransferFee() (gas: 3033207)\n[PASS] testExactOutputBuyIsGrossAndBuyerReceives97Percent() (gas: 2005337)\n[PASS] testOnlyManagerAndFactoryCanInvokeInitializationGuard() (gas: 31244)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency0() (gas: 2315193)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency1() (gas: 2325895)\n[PASS] testSeveralRealBuysFundClaimableSwarmHolderDividends() (gas: 2683639)\n[PASS] testUnlockCallbacksRejectArbitraryCallers() (gas: 779176)\n[PASS] testUnpaidSwapRevertsWithCurrencyNotSettledAndRollsBackFee() (gas: 2010625)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 14.38ms (7.93ms CPU time)\n\nRan 25 tests for test/SIMDTESTToken.t.sol:SIMDTESTTokenTest\n[PASS] testAllowanceAndDelegatedBuyUseGrossAmount() (gas: 516474)\n[PASS] testBuyDeductsThreePercentAndSellDeliversFullAmount() (gas: 438721)\n[PASS] testBuyFeesAreNotStrandedOnTheMerkleDistributor() (gas: 747911)\n[PASS] testCachedDistributorCannotBeChangedByFactory() (gas: 562543)\n[PASS] testClaimsCompoundOnlyFutureDividends() (gas: 736514)\n[PASS] testConstructorMintsOnlyToDeployer() (gas: 104319)\n[PASS] testExcludedBalancesNeverEarnAndBurnDoesNotChangeSupply() (gas: 831189)\n[PASS] testExternalFactoryAllocationAndSwarmClaimArriveWhole() (gas: 327381)\n[PASS] testFeesQueueWhileNoEligibleSupply() (gas: 620804)\n[PASS] testFormerHolderClaimReleasesZeroSupplyQueue() (gas: 853827)\n[PASS] testFractionalCreditSurvivesRepeatedCheckpoints() (gas: 1412047)\n[PASS] testFuzzBuyFeeConservation(uint256) (runs: 512, μ: 310364, ~: 317278)\nLogs:\n  Bound result 290044060178525009347929770\n\n[PASS] testFuzzWalletTransferConservation(uint256) (runs: 512, μ: 237606, ~: 237555)\nLogs:\n  Bound result 993446312567331323026161660\n\n[PASS] testInvalidTransfersAndApprovalsRevertAtomically() (gas: 261653)\n[PASS] testLateRegistrationRemovesPriorBalanceBeforeAnyFee() (gas: 452612)\n[PASS] testManagerSelfTransferIsUntaxed() (gas: 159132)\n[PASS] testNoAdminSelectorsOrMinting() (gas: 1117587)\n[PASS] testPoolWithdrawalToTokenContractRemainsSolvent() (gas: 772872)\n[PASS] testRuntimeHasNoForbiddenOpcodes() (gas: 1481584)\n[PASS] testSeveralBuysAccrueProportionallyBeforeEachBuy() (gas: 1185736)\n[PASS] testSwarmBeneficiaryEarnsOnlyAfterMerkleTransfer() (gas: 841073)\n[PASS] testTinyEligibleSupplyThenLargeBalanceDoesNotOverflow() (gas: 644492)\n[PASS] testTransferKeepsPastDividendsWithSender() (gas: 835647)\n[PASS] testWalletTransfersAndSelfTransfersAreFree() (gas: 318964)\n[PASS] testZeroAndRepeatClaimRevert() (gas: 706885)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 15.65ms (57.52ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS]\nDividendInvariantTest invariants:\n[PASS] invariantExcludedAccountsNeverEarn\n[PASS] invariantFeesAndClaimsMatchObservedFlows\n[PASS] invariantOutstandingDividendsAreFullyBacked\n[PASS] invariantSupplyAndEligibleBalancesAreConserved\n DividendInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+---------------+-------+---------+----------╮\n| Contract        | Selector      | Calls | Reverts | Discards |\n+==============================================================+\n| DividendHandler | buy           | 1987  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | claim         | 2094  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | delegatedMove | 2062  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | move          | 2049  | 0       | 0        |\n╰-----------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 8\n  Bound result 784\n  Bound result 3111\n  Bound result 3338\n  Bound result 1209821814\n  Bound result 1001\n  Bound result 96\n  Bound result 2000000000000000000000\n  Bound result 3801\n  Bound result 2500000000000000000000\n  Bound result 60000000000000000000\n  Bound result 802\n  Bound result 1900\n  Bound result 244\n  Bound result 9\n  Bound result 4\n  Bound result 861\n  Bound result 0\n  Bound result 8894\n  Bound result 10000000000000000000000\n  Bound result 23733026824673710022996672\n  Bound result 242\n  Bound result 900000000000000000000000000\n  Bound result 18\n  Bound result 3352654264337593576533994\n  Bound result 1707\n  Bound result 1000000000000000000000\n  Bound result 2\n  Bound result 8119\n  Bound result 1254973175326289977000296\n  Bound result 28\n  Bound result 19\n  Bound result 96\n  Bound result 7400\n  Bound result 0\n  Bound result 14\n  Bound result 19153590422775407355608541\n  Bound result 3352654264337593576533994\n  Bound result 11\n  Bound result 1\n  Bound result 1507057809589228022225450\n  Bound result 10000000000000000000000000\n  Bound result 2242\n  Bound result 0\n  Bound result 192\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.86s (1.86s CPU time)\n\nRan 3 test suites in 1.86s (1.89s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":45,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SIMDTESTToken.approve(address,uint256)\",\"SIMDTESTToken.claim()\",\"SIMDTESTToken.transfer(address,uint256)\",\"SIMDTESTToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":198,\"foundry.toml\":21,\"launch.json\":24,\"src/HookFlags.sol\":12,\"src/LaunchLiquidity.sol\":54,\"src/PoolInitializationGuard.sol\":26,\"src/SIMDTESTToken.sol\":176,\"test/DividendInvariant.t.sol\":164,\"test/SIMDTESTToken.t.sol\":482,\"test/UniswapV4.t.sol\":390},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":543,"exitCode":0,"name":"slither","output":"[medium/medium] unused-return at src/LaunchLiquidity.sol:22: LaunchLiquidity.settleSeed(IPoolManager,bytes) (src/LaunchLiquidity.sol#22-32) ignores return value by (delta,None) = manager.modifyLiquidity(seed.key,ModifyLiquidityParams(seed.tickLower,seed.tickUpper,int256(uint256(seed.liquidity)),bytes32(0)),) (src/LaunchLiquidity.sol#25-29)","passed":true},{"durationMs":348,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SIMDTESTToken.sol:16: Large Numeric Literal (2 places)\n[low] missing-inheritance at src/SIMDTESTToken.sol:12: Missing Inheritance\n[low] unsafe-erc20-operation at src/LaunchLiquidity.sol:48: Unsafe ERC20 Operation\n[low] unused-public-function at src/SIMDTESTToken.sol:91: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a748a7582ce1017181fb70126cae03336e98cd74bcc3effc790c3d5e03d410a7","verifiedTreeHash":"e8c6341fea617192ff112084ffc87f7f1e264338","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":2587,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.46s\nCompiler run successful!\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/LaunchLiquidity.sol:25:33\n   │\n25 │           (BalanceDelta delta,) = manager.modifyLiquidity(\n   │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n26 │ ┃             seed.key,\n27 │ ┃             ModifyLiquidityParams(seed.tickLower, seed.tickUpper, int256(uint256(seed.liquidity)), bytes32(0)),\n28 │ ┃             \"\"\n29 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\n","passed":true},{"durationMs":5533,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 12 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] testExactOutputBuyIsGrossAndBuyerReceives97Percent() (gas: 1962725)\n[PASS] testFuzzMultipleTradersBuyClaimAndSellInBothCurrencyOrders(bool,uint96,uint96,uint8) (runs: 128, μ: 5505750, ~: 5229603)\nLogs:\n  Bound result 59976196457182671\n  Bound result 99999000000001778\n  Bound result 1\n\n[PASS] testIncomingPairShortfallRevertsAndRollsBackTokenPayout() (gas: 2596502)\n[PASS] testOnlyManagerAndFactoryCanInvokeInitializationGuard() (gas: 31389)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency0() (gas: 2231886)\n[PASS] testSeedBuyAndSellWithTokenAsCurrency1() (gas: 2242605)\n[PASS] testSeveralRealBuysFundClaimableSwarmHolderDividends() (gas: 2603956)\n[PASS] testUnlockCallbacksRejectArbitraryCallers() (gas: 814450)\n[PASS] testUnpaidBuyRestoresExistingRewardsWithTokenAsCurrency0() (gas: 2959007)\n[PASS] testUnpaidBuyRestoresExistingRewardsWithTokenAsCurrency1() (gas: 2971632)\n[PASS] testUnpaidSwapRevertsWithCurrencyNotSettledAndRollsBackFee() (gas: 1967964)\n[PASS] testZeroSwapAndLockedTakeCannotMovePoolFunds() (gas: 2143743)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 191.93ms (155.28ms CPU time)\n\nRan 10 tests for test/TokenAdversarial.t.sol:TokenAdversarialTest\n[PASS] testAllowanceDoesNotAuthorizeStealingAnotherHoldersDividend() (gas: 1224628)\n[PASS] testFeeRoundingBoundariesEmitTheActualTransfers() (gas: 1180209)\n[PASS] testFuzzClaimOrderCannotRedistributePastRewards(uint256) (runs: 1000, μ: 938504, ~: 955684)\nLogs:\n  Bound result 101121289984034734253313278\n\n[PASS] testFuzzDelegatedFullExitRetainsHistoryAndReceiverEarnsOnlyFutureFees(uint256) (runs: 1000, μ: 770573, ~: 770651)\nLogs:\n  Bound result 26687051573560758572674823\n\n[PASS] testFuzzExistingBuyerEarnsOnlyOnPreBuyBalance(uint256,bool) (runs: 1000, μ: 562787, ~: 576281)\nLogs:\n  Bound result 1\n\n[PASS] testFuzzOversizedDelegatedBuyRevertsBeforeFeeMathAndPreservesState(uint256) (runs: 1000, μ: 1345147, ~: 1345631)\nLogs:\n  Bound result 7885087301121289984034733385953686\n\n[PASS] testInvalidReceiverRollsBackGrossAllowanceAndExistingDividends() (gas: 1112541)\n[PASS] testMaximumTransferRevertsWithBalanceErrorInsteadOfArithmeticPanic() (gas: 909835)\n[PASS] testNetOnlyApprovalCannotAuthorizeGrossBuyAndRevocationIsImmediate() (gas: 1748531)\n[PASS] testNoAdminCallerCanRedirectFeeReserveOrChangeExclusions() (gas: 18852267)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 191.96ms (758.72ms CPU time)\n\nRan 21 tests for test/SIMDTESTToken.t.sol:SIMDTESTTokenTest\n[PASS] testAllowanceAndDelegatedBuyUseGrossAmount() (gas: 456235)\n[PASS] testBuyDeductsThreePercentAndSellDeliversFullAmount() (gas: 376417)\n[PASS] testClaimsCompoundOnlyFutureDividends() (gas: 675601)\n[PASS] testConstructorMintsOnlyToDeployer() (gas: 79028)\n[PASS] testExcludedBalancesNeverEarnAndBurnDoesNotChangeSupply() (gas: 681917)\n[PASS] testExternalFactoryAllocationAndSwarmClaimArriveWhole() (gas: 260075)\n[PASS] testFeesQueueWhileNoEligibleSupply() (gas: 578494)\n[PASS] testFormerHolderClaimReleasesZeroSupplyQueue() (gas: 788711)\n[PASS] testFractionalCreditSurvivesRepeatedCheckpoints() (gas: 1315542)\n[PASS] testFuzzBuyFeeConservation(uint256) (runs: 512, μ: 289395, ~: 297849)\nLogs:\n  Bound result 310775501323621547129010694\n\n[PASS] testFuzzWalletTransferConservation(uint256) (runs: 512, μ: 186869, ~: 187019)\nLogs:\n  Bound result 310775501323621547132309745\n\n[PASS] testInvalidTransfersAndApprovalsRevertAtomically() (gas: 261464)\n[PASS] testManagerSelfTransferIsUntaxed() (gas: 134542)\n[PASS] testNoAdminSelectorsOrMinting() (gas: 1067170)\n[PASS] testPoolWithdrawalToTokenContractRemainsSolvent() (gas: 710218)\n[PASS] testRuntimeHasNoForbiddenOpcodes() (gas: 1254211)\n[PASS] testSeveralBuysAccrueProportionallyBeforeEachBuy() (gas: 1099097)\n[PASS] testTinyEligibleSupplyThenLargeBalanceDoesNotOverflow() (gas: 584207)\n[PASS] testTransferKeepsPastDividendsWithSender() (gas: 767962)\n[PASS] testWalletTransfersAndSelfTransfersAreFree() (gas: 262524)\n[PASS] testZeroAndRepeatClaimRevert() (gas: 614491)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 191.98ms (235.58ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS]\nDividendInvariantTest invariants:\n[PASS] invariantExcludedAccountsNeverEarn\n[PASS] invariantFeesAndClaimsMatchObservedFlows\n[PASS] invariantOutstandingDividendsAreFullyBacked\n[PASS] invariantSupplyAndEligibleBalancesAreConserved\n DividendInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+---------------+-------+---------+----------╮\n| Contract        | Selector      | Calls | Reverts | Discards |\n+==============================================================+\n| DividendHandler | buy           | 2103  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | claim         | 2042  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | delegatedMove | 2057  | 0       | 0        |\n|-----------------+---------------+-------+---------+----------|\n| DividendHandler | move          | 1990  | 0       | 0        |\n╰-----------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 822\n  Bound result 3365277002734136833\n  Bound result 67\n  Bound result 1889567281\n  Bound result 7133\n  Bound result 7248718884970812509941597\n  Bound result 6724\n  Bound result 3\n  Bound result 67\n  Bound result 9030\n  Bound result 2980\n  Bound result 9805418333613913062376870\n  Bound result 22978030367387723132024801\n  Bound result 17751281115029187490074564\n  Bound result 970000000000000000000\n  Bound result 379\n  Bound result 38766679579403144468295549\n  Bound result 1046363172\n  Bound result 14\n  Bound result 10000000000000000\n  Bound result 1912\n  Bound result 350\n  Bound result 417\n  Bound result 1064861015200879067717390\n  Bound result 2945537169546176173911608\n  Bound result 627838006552143757000577\n  Bound result 126780485045027662\n  Bound result 198878281163503\n  Bound result 6282\n  Bound result 293\n  Bound result 558216272801873258020982217\n  Bound result 2922\n  Bound result 7269\n  Bound result 10000000000000000000000\n  Bound result 17673495530244519823292236\n  Bound result 547962314302591902759\n  Bound result 127\n  Bound result 30000000000000000000000\n  Bound result 1619814423662470976955678\n  Bound result 100000000000000000000\n  Bound result 4885440638742637471854503\n  Bound result 100000000000000000000\n  Bound result 2725\n  Bound result 2725\n  Bound result 2723\n  Bound result 0\n  Bound result 8458336557964003101501036\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.74s (1.74s CPU time)\n\nRan 1 test for test/DividendModelInvariant.t.sol:DividendModelInvariantTest\n[PASS] invariantBalancesAndRewardsMatchIndependentLedger() (runs: 256, calls: 24576, reverts: 0)\n\n╭----------------------+-----------------------+-------+---------+----------╮\n| Contract             | Selector              | Calls | Reverts | Discards |\n+===========================================================================+\n| DividendModelHandler | buy                   | 4139  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | claim                 | 4027  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | exitAllAndQueue       | 4028  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | move                  | 4014  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | rejectExcludedClaim   | 4267  | 0       | 0        |\n|----------------------+-----------------------+-------+---------+----------|\n| DividendModelHandler | rejectUnapprovedSpend | 4101  | 0       | 0        |\n╰----------------------+-----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 20000000000000000000000\n  Bound result 695855891883306408777158357\n  Bound result 25000000000000000000000000\n  Bound result 2738\n  Bound result 6294\n  Bound result 60000000000000000000\n  Bound result 154584485133346364573191189\n  Bound result 10000\n  Bound result 7971896785341\n  Bound result 22500000000000000000\n  Bound result 758026502302820692967372337\n  Bound result 19\n  Bound result 10\n  Bound result 1000000000000000000\n  Bound result 8\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.45s (5.45s CPU time)\n\nRan 5 test suites in 5.45s (7.77s CPU time): 45 tests passed, 0 failed, 0 skipped (45 total tests)\n","passed":true},{"durationMs":48,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SIMDTESTToken.approve(address,uint256)\",\"SIMDTESTToken.claim()\",\"SIMDTESTToken.transfer(address,uint256)\",\"SIMDTESTToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":172,\"foundry.toml\":21,\"launch.json\":24,\"src/HookFlags.sol\":12,\"src/LaunchLiquidity.sol\":54,\"src/PoolInitializationGuard.sol\":26,\"src/SIMDTESTToken.sol\":147,\"test/DividendInvariant.t.sol\":153,\"test/DividendModelInvariant.t.sol\":223,\"test/SIMDTESTToken.t.sol\":390,\"test/TESTING.md\":32,\"test/TokenAdversarial.t.sol\":287,\"test/UniswapV4.t.sol\":512},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f7b49e28f12d35d6988b3474df1bb042c30a4038fa474f63f6d44ca88d784e12","verifiedTreeHash":"96b5f23ff9f95c8ac58b7351244e994b3a648b57","verifierVersion":"0.1.0+ad90ce4c"}]}