{"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":"157afe99-5f3a-40c3-b68c-99335aa53a64","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"e03b8385ede2e9ac1b5f8229d2805f61cb1154cbb44d18b3e13f08bdec12789e","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":"cd2250be6ad4ea5acf44dafa2d2e78972b3c67aa30ef9e19d6ef222062677e50","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":"0aa592030c218f03d1d9938c509ce5f7fa41bf35988037adf6b2a395912a94a1","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":"87f8a23750a46dbd2c66b4f927241f4eba8b52638f367b3dc803705f844e5b80","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":"91f065db719d9dda8183f620eb26251c3c8dd753ada98b0d2a1700f4a833f395","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":"2a65c9e150805a38e050fdc374c6cc0f334ca166d21a95a32be02fa965d93318","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":"9e5b85bbaa3c4b2c41be2bf7afe29e81c48fac21fd9a25add2851da750f90305","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":"20611945a81717d34bc6723fd523f1a24b01c66c0d4b8b0cb58cc868a660ded2","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: Pepelstiltskin (PSS).\nToken name: Pepelstiltskin\nToken symbol: PSS\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. Total supply fixed at 1,000,000,000 PSS with 18 decimals minted once at deployment to the deployer.\n2. 90% of the total supply seeds the Uniswap v4 pool; no tokens remain with the deployer after pool seed.\n3. A 3% fee applies only to transfers FROM the Uniswap v4 PoolManager at address 0x000000000004444c5dc75cB358380D2e3dE08A90 (buys).\n4. Transfers TO the PoolManager (sells or pool seed) and wallet-to-wallet transfers have zero fees.\n5. The 3% fee collected remains in the token contract and is distributed pro rata as dividends to all token holders except:\n   - The PoolManager address\n   - The token contract itself\n   - The burn address (0x000000000000000000000000000000000000dEaD)\n6. Holders can claim accumulated dividends at any time via a public claim() function.\n7. The Uniswap v4 pool fee is fixed at 1.25%.\n8. The swarm receives 10% of the total supply via its Merkle distributor outside this contract; no minting or sending of swarm tokens occurs inside.\n9. No owner or admin roles exist; all parameters and fees are fixed constants with no modifiers.\n\nWho can call what:\n- Anyone can transfer tokens subject to the fee rules above.\n- Anyone holding dividends can call claim() to claim their dividends.\n- No owner nor admin functions exist.\n\nTests:\n1. Confirm total supply minted is 1,000,000,000 PSS with 18 decimals.\n2. Confirm 90% supply transfers to the pool with zero fees.\n3. Confirm 3% fee is triggered only on transfers originating FROM the PoolManager address.\n4. Confirm that transfers TO the PoolManager and wallet-to-wallet transfers incur no fee.\n5. Confirm that fees accumulate in contract and correct dividend per holder is calculated.\n6. Confirm holders can successfully claim dividends and balances update accordingly.\n7. Confirm the PoolManager, token contract, and burn address are excluded from dividends.\n8. Confirm no owner or admin functions exist, and constants remain immutable.\n9. Confirm pool fee is 1.25% as set by the launchpad.\n10. Confirm compliance with SIMD rules: 1% creator fee goes to $SIMD, no owner powers, no dynamic fees, no selfdestruct or delegatecall.\n\nMechanics specification (authoritative: where anything above differs, follow these exactly):\nM1. Dividends (same idea as live launch #947): a fee of 3% applies only to buys, i.e. transfers FROM the Uniswap v4 PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90: the buyer receives the amount minus the fee. Transfers TO the PoolManager (sells and the launch factory's pool seed) are never taxed, so Uniswap v4 settlement always balances exactly (a fee on those transfers makes unlock revert with CurrencyNotSettled). The fee stays in the token contract and is distributed to holders pro rata to their balance; holders claim their dividends at any time with claim(). The PoolManager, the token contract and the burn address are excluded. Plain wallet-to-wallet transfers pay no fee.\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 and every deployed contract can be source-verified (Sourcify/Etherscan) right after deploy: every contract the deployer deploys lives in src/, and every import resolves to a file committed in the repo (lib/ vendored, remappings.txt).\n- Token contract: PSSToken. No selfdestruct and no delegatecall anywhere. No proxies, no owner, no upgradeability.\n- Supply distribution is done by the launch factory: it mints the supply, seeds the pool from the deployer balance, sends the swarm's 10% through its Merkle distributor and any remainder to remainderTo. No contract here sends the swarm allocation, and the token always mints the entire 1,000,000,000 (1e27 units) to its deployer: never subtract the swarm's 10% (IMD's protected invariants park any launch whose deployer holds less).\n- Chain: Ethereum mainnet (chainId 1). Swaps happen in Uniswap v4, so the pool's tokens move to and from the PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90.\n- launch.json pool: pairedCurrency 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, fee 3000, tickSpacing 60, initialPrice \"125270724187523965593206900\" (paired-currency minor units per PSS minor unit with PSS 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":"aeea3c5e95e095cea87e55ce09e4c344034738d6af4efd007d115d9bc9177153","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"157afe99-5f3a-40c3-b68c-99335aa53a64","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1085-pepelstiltskin"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52205","feedbackHash":"2fb30e811824335d2b4089c846100e5a78a4a06bde5ca00a2361d0f34034e09b","nodeKey":"audit_economics","submissionHash":"e03b8385ede2e9ac1b5f8229d2805f61cb1154cbb44d18b3e13f08bdec12789e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52136","feedbackHash":"c078f66a53ff2bbfbe27570b4d034a012d08a3dfbaa8a29e4df75efdf69f96ed","nodeKey":"audit_flow","submissionHash":"cd2250be6ad4ea5acf44dafa2d2e78972b3c67aa30ef9e19d6ef222062677e50","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51375","feedbackHash":"7bf70cda3bc13023f0accf6cd1cefb48fc2d29e2a164f2bb972d3bc3f212cd91","nodeKey":"audit_judge","submissionHash":"be6c0ae45c52b791493760fcf3fa1b5f5de849f7ae41cb5d9e1b44eb0a3983a7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51345","feedbackHash":"62fd297c7ad4f4f9ad63af71d6e39c0f950afa1eca1feaaafa4c9f002aa98e7a","nodeKey":"audit_judge","submissionHash":"0aa592030c218f03d1d9938c509ce5f7fa41bf35988037adf6b2a395912a94a1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51382","feedbackHash":"226913db15a05c7f1fe431ecedaf7debcf4841454c562f477f4d7c2ccc50c6da","nodeKey":"audit_math","submissionHash":"87f8a23750a46dbd2c66b4f927241f4eba8b52638f367b3dc803705f844e5b80","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51039","feedbackHash":"c296c403bd03cfbebeb259ce0c27d3b0a82790d07d5e3e8082c91b41ed524ae1","nodeKey":"audit_permissions","submissionHash":"91f065db719d9dda8183f620eb26251c3c8dd753ada98b0d2a1700f4a833f395","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51290","feedbackHash":"e01cdd4a8c16b1c727f8199f1bac6447156081674497848c268eb354fc0c369a","nodeKey":"build_contract_project","submissionHash":"2a65c9e150805a38e050fdc374c6cc0f334ca166d21a95a32be02fa965d93318","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50956","feedbackHash":"e6ff414e8e21c3226d13f8b558b4cd23b67a8ac9768268ff23b7117d73e9f38e","nodeKey":"build_contract_project","submissionHash":"c68234602ff8bd6de876f015154f236af1ce10486dfef165e0d79efa341b73b3","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52473","feedbackHash":"d4d3f8163710ce19f9604d0442ae3ed5badd50e1339ddbf32640fd5d4c1b7491","nodeKey":"build_contract_project","submissionHash":"cb63c40e5b8036afcfe442d41565f71d04a0c0137a63d32460322ef80ddabf5d","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51730","feedbackHash":"e69904251fc95e6dce0255dfd6b730e226dbd23054c9c41b4e0cf91a593f180b","nodeKey":"manifest","submissionHash":"9e5b85bbaa3c4b2c41be2bf7afe29e81c48fac21fd9a25add2851da750f90305","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51377","feedbackHash":"3aadc5118b38d4f7ad2cc6f8596d5c5ed0cf382170d33489e5ef30c03897c7e3","nodeKey":"manifest","submissionHash":"0a82238355ceeea8622b9e22a8a6ab973f84781727d681a7e15b43012166c083","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51733","feedbackHash":"6dab0e9789a1d47d337f8ddae5d5bab19d9fbef8e1474a7693c0cd52bdbe838a","nodeKey":"write_foundry_tests","submissionHash":"20611945a81717d34bc6723fd523f1a24b01c66c0d4b8b0cb58cc868a660ded2","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50961","feedbackHash":"adbf734e34960efb1ce701fef5176646367e6d6c95e999f57d977128d6056985","nodeKey":"write_foundry_tests","submissionHash":"41b92d88fcf6d8159ec3fcd735c4f4a9b720694b16236aa4f67057acc4581c9d","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"f7ae8a0003dff74ca0885cbc7240dbe542eb6ba851fc0afd8dccf4ae76f8f7f9","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"8883fac8a076195f591865ea66b584f952f268e3992697bf5cc9c3fe7a2a27a9","device":"d2ea4ab6ad35e6a1","findings":[],"hash":"0a82238355ceeea8622b9e22a8a6ab973f84781727d681a7e15b43012166c083","nodeId":"b47caec1-6b5b-4767-b781-fb322e8efc2a","outcome":"completed","summary":"Updated only [launch.json](/home/imd-worker/.identitymd-1181/work/157afe99-5f3a-40c3-b68c-99335aa53a64/b47caec1-6b5b-4767-b781-fb322e8efc2a/launch.json), preserving the exact supply, economics and pool settings while clarifying implementation notes.\n\nValidation passed:\n- Manifest constraints and compiled constructor ABI match.\n- `forge build` succeeded.\n- `forge test`: 52 passed, 0 failed.","treeHash":"5a93cfb31217688353c7adf29025c65809692a88","usage":{"cachedInputTokens":575872,"inputTokens":34739,"model":"gpt-6-astra","outputTokens":3230,"runtime":"codex","turns":4,"wallClockMs":155986}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fba19b641cdd6f27","findings":[{"citation":"resolved","description":"Second-round settlement of finding e887f98c5d6dd33d868a1f15477a972b833bd9c7141325c06b3a72ccc4593c42 (medium). The fix holds: claimFor(account) is permissionless, shares _claim with claim(), checkpoints the account first, pays only the account via super._update(address(this), account, amount), takes the modulo so fractional entitlement survives, and returns 0 for excluded addresses (PM, token, 0xdEaD, address(0)) because their _accrued is never written. A repeated call pays 0. The caller's balance is unchanged. This is one of the three remedies the original finding offered, so the finding is closed. Residual for the launch operator, not a code defect: the payout lands in the MerkleDistributor's PSS balance, not in its Merkle leaves; whether that external contract can forward surplus beyond its fixed claims is not verifiable here and the README (line 46) and manifest notes disclose it. Finding eeeb46e334932d562a46140523af401bd17aa2dee2c8a0cda8dcb4a003853295 (buyer self-rebate, medium) is also fixed: the taxed branch at lines 81-85 now moves the fee to the token, distributes against eligibleSupply() (unchanged by that move since both PM and the token are excluded), re-checkpoints the recipient on its pre-buy balance, and only then delivers the net. The attached proof test/scratch/Proof_eeeb46e33493.t.sol passes on the revised code. The three advisory items (ERC-6909 claims round trip, non-buy PoolManager outflows taxed, 0.30% pool fee and absent $SIMD creator fee) are unchanged design limits already disclosed in README.md and launch.json notes; the author's duplicate/disputed answers hold and they are not re-raised.","line":54,"path":"src/PSSToken.sol","reproduction":"test/scratch/Settle.t.sol test_DistributorReleasedViaClaimFor: fresh PSSToken, 100_000_000e18 to a transfer-only contract D, 900_000_000e18 to POOL_MANAGER, deployer holds 0. vm.prank(POOL_MANAGER); token.transfer(BUYER, 1_000_000e18). Observed: totalFeesCollected == 30000e18, claimableDividends(BUYER) == 0 (pre-buy eligibility), claimableDividends(D) == 29999999999999999999999. D forwards its full 100M to CLAIMANT: claimableDividends(CLAIMANT) == 0, claimableDividends(D) unchanged. Third party calls token.claimFor(D): returns 29999999999999999999999, balanceOf(D) == that amount, caller balance unchanged, second claimFor(D) returns 0, balanceOf(token) == 1 wei dust. Expected after the fix: the distributor's entitlement is releasable by anyone; actual matches. Full suite: forge test, 66 passed, 0 failed.","severity":"info","snippet":"    function claimFor(address account) external returns (uint256 amount) {\n        return _claim(account);\n    }","title":"Settled: distributor-stranded buy fees (e887f98c) are fixed by claimFor; the released PSS now sits in the external MerkleDistributor, whose surplus handling is outside this repository"}],"hash":"0aa592030c218f03d1d9938c509ce5f7fa41bf35988037adf6b2a395912a94a1","nodeId":"a8d082e8-cba9-423d-a98b-384c2c1a9d4c","outcome":"completed","summary":"Both previously reported defects are fixed, and the review is written to `.imd-findings.json` with no new blocking findings.\n\n**Settlement of the two findings to be fixed**\n\n- **Buyer self-rebate (medium, eeeb46e3): fixed.** The taxed branch at `src/PSSToken.sol:81-85` now moves the fee into the token, distributes against the eligible supply before the net arrives, re-checkpoints the recipient on its pre-buy balance, and only then delivers the net. The attached proof, copied to test/scratch, passes on the revised code. I also traced a buyer with a prior balance, a buy into an empty float that queues and later flushes, buys into the token itself and into the burn address, and the transferFrom path. All behave as intended.\n- **Distributor-stranded fees (medium, e887f98c): fixed** by the permissionless claimFor path, which was one of the remedies the finding offered. It pays only the named account, returns zero for excluded addresses and on repeat, and cannot redirect funds. My scratch reproduction shows the distributor's full fee entitlement released by a third party after its allocation left. The residual is recorded as info only: the PSS lands in the external distributor's balance, and whether that contract can forward surplus is outside this repository, as README line 46 and the manifest notes already disclose.\n\n**Advisory items** (ERC-6909 claims round trip, taxed non-buy outflows, 0.30% pool fee and no $SIMD routing) are unchanged, documented design limits. The author's disputed answers hold and I did not re-raise them.\n\n**Verification**\n\n```\nforge test: 66 passed, 0 failed (includes the attached proof and my scratch tests)\n```\n\nCoverage answers all five entry points plus two invariants. Only test/scratch and `.imd-findings.json` were touched. Nothing blocks the launch from this review.","treeHash":null,"usage":{"cachedInputTokens":765177,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":11503,"runtime":"claude","turns":12,"wallClockMs":277738}},{"artifacts":[],"attempt":2,"bundleHash":"41f8071cdaff5033cc051e10c7c5ab1ef28ddcc7f61b52f3bfbd253aedbb6a58","device":"6a7dea7fd5378a40","findings":[],"hash":"20611945a81717d34bc6723fd523f1a24b01c66c0d4b8b0cb58cc868a660ded2","nodeId":"763feaa0-8bdf-4147-8136-b214bd6c5587","outcome":"completed","summary":"Updated three test files to fix stale dividend assertions and queued-fee invariant accounting, with regressions for routers and ERC-6909 redemption.\n\nOffline `forge build` and `forge test` pass: 59 tests, zero failures, including randomized invariants.\n\nLive mainnet integration and external creator-fee routing remain unverified.","treeHash":"cff4afd3d1c54183464a4794d76db2fa55eb0c00","usage":{"cachedInputTokens":808832,"inputTokens":87978,"model":"gpt-6-astra","outputTokens":7137,"runtime":"codex","turns":4,"wallClockMs":250349}},{"artifacts":[],"attempt":1,"bundleHash":"029b3121ba0d21eaf5fb4b8dc4f085911cad2dd2184376e282f679c511a074f7","device":"80750826af198795","findings":[],"hash":"2a65c9e150805a38e050fdc374c6cc0f334ca166d21a95a32be02fa965d93318","nodeId":"891513c9-37ec-4972-adb6-9a1882669a11","outcome":"completed","summary":"Implemented both fixes: dividends use pre-buy balances, and `claimFor(account)` pays directly to the holder.\n\nAnswered all 10 findings in `.imd-responses.json`. Documented the remaining v4 and external distributor limitations.\n\nValidation passed: `forge build`, all 31 tests, `forge fmt --check`, manifest checks, and the supplied reviewer proof.","treeHash":"2503d9c6334f3b699db1a016a147b6ede3544b3f","usage":{"cachedInputTokens":1309184,"inputTokens":89646,"model":"gpt-6-astra","outputTokens":14495,"runtime":"codex","turns":6,"wallClockMs":411037}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0b183f15e03d94cc","findings":[],"hash":"35a8dca1d6f99cce579b45a5dfebcecefaeacad9179f0736cc5bb9def766777a","nodeId":"763feaa0-8bdf-4147-8136-b214bd6c5587","outcome":"failed","summary":"{\"type\":\"error\",\"status\":400,\"error\":{\"type\":\"invalid_request_error\",\"message\":\"The 'gpt-6-astra' model is not supported when using Codex with a ChatGPT account.\"}}","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":0,"wallClockMs":7412}},{"artifacts":[],"attempt":1,"bundleHash":"8dcb52b72cfcf27cf00a92e45c4b5965c757e05a35120efe907efb05b80adbcb","device":"d68ba89c0b30801c","findings":[{"description":"The 3% buy fee is implemented as a tax on ERC-20 transfers whose `from` is the PoolManager. Uniswap v4 lets a swapper keep its output inside the manager by calling `mint` (ERC-6909 claims) instead of `take`, and pay a later swap's input by `burn`ing those claims instead of transferring tokens in. In that flow no PSS ever leaves the manager, so `_update` never sees `from == POOL_MANAGER` and nothing is collected: a trader who never takes delivery round-trips the pool with zero PSS fee, and holders receive no dividend from that volume. Claims can also be transferred between addresses as ERC-6909 tokens, which is an untaxed parallel market for PSS inside the manager. The brief (mechanics M1) defines the fee precisely as transfers FROM the PoolManager, so the implementation matches its letter, and the fee is correctly charged the moment claims are redeemed for real PSS (test/UniswapV4Edges.t.sol:test_RedeemingClaimsPaysTheFeeOnTheAmountTaken). This is an economic limitation inherent to any transfer-hook fee on v4 and cannot be fixed inside the token without a pool hook; it is reported so the requester knows the 3% applies only to volume that takes delivery.","line":66,"path":"src/PSSToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {IERC6909Claims} from \"v4-core/src/interfaces/external/IERC6909Claims.sol\";\nimport {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency, CurrencyLibrary} from \"v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"v4-core/src/types/BalanceDelta.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"v4-core/src/types/PoolOperation.sol\";\nimport {TickMath} from \"v4-core/src/libraries/TickMath.sol\";\nimport {FullMath} from \"v4-core/src/libraries/FullMath.sol\";\nimport {PSSToken} from \"src/PSSToken.sol\";\n\ncontract PairStub {\n    mapping(address => uint256) public balanceOf;\n\n    function mint(address a, uint256 n) external {\n        balanceOf[a] += n;\n    }\n\n    function transfer(address to, uint256 n) external returns (bool) {\n        balanceOf[msg.sender] -= n;\n        balanceOf[to] += n;\n        return true;\n    }\n}\n\n/// @dev Trader that takes swap output as ERC-6909 claims and pays swap input by burning claims.\ncontract ClaimsTrader is IUnlockCallback {\n    using CurrencyLibrary for Currency;\n\n    IPoolManager immutable manager;\n\n    constructor(IPoolManager m) {\n        manager = m;\n    }\n\n    function deploy(bytes32 salt) external returns (PSSToken) {\n        return new PSSToken{salt: salt}();\n    }\n\n    function move(IERC20 t, address to, uint256 n) external {\n        require(t.transfer(to, n));\n    }\n\n    function seed(PoolKey memory key, int24 lo, int24 hi, uint128 liq) external {\n        manager.unlock(abi.encode(uint8(0), key, lo, hi, liq, false, int256(0)));\n    }\n\n    function swap(PoolKey memory key, bool zeroForOne, int256 amount) external returns (BalanceDelta d) {\n        d = abi.decode(manager.unlock(abi.encode(uint8(1), key, int24(0), int24(0), uint128(0), zeroForOne, amount)), (BalanceDelta));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        (uint8 kind, PoolKey memory key, int24 lo, int24 hi, uint128 liq, bool zeroForOne, int256 amount) =\n            abi.decode(data, (uint8, PoolKey, int24, int24, uint128, bool, int256));\n        BalanceDelta d;\n        if (kind == 0) {\n            (d,) = manager.modifyLiquidity(key, ModifyLiquidityParams(lo, hi, int256(uint256(liq)), 0), \"\");\n            _settleByTransfer(key.currency0, d.amount0());\n            _settleByTransfer(key.currency1, d.amount1());\n        } else {\n            d = manager.swap(\n                key, SwapParams(zeroForOne, amount, zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1), \"\"\n            );\n            _settleWithClaims(key.currency0, d.amount0());\n            _settleWithClaims(key.currency1, d.amount1());\n        }\n        return abi.encode(d);\n    }\n\n    function _settleByTransfer(Currency c, int128 delta) private {\n        if (delta < 0) {\n            manager.sync(c);\n            require(IERC20(Currency.unwrap(c)).transfer(address(manager), uint128(-delta)));\n            manager.settle();\n        } else if (delta > 0) {\n            manager.take(c, address(this), uint128(delta));\n        }\n    }\n\n    /// @dev PSS is only ever held as claims; the pair token is paid by transfer and taken as claims too.\n    function _settleWithClaims(Currency c, int128 delta) private {\n        if (delta < 0) {\n            uint256 owed = uint128(-delta);\n            uint256 claims = IERC6909Claims(address(manager)).balanceOf(address(this), c.toId());\n            if (claims >= owed) {\n                manager.burn(address(this), c.toId(), owed);\n            } else {\n                manager.sync(c);\n                require(IERC20(Currency.unwrap(c)).transfer(address(manager), owed));\n                manager.settle();\n            }\n        } else if (delta > 0) {\n            manager.mint(address(this), c.toId(), uint128(delta));\n        }\n    }\n}\n\n/// @notice Expected per the brief: \"a 3% fee applies to buys\". Actual: a buy whose output stays inside\n/// the PoolManager as an ERC-6909 claim, later sold by burning that claim, pays no fee at all. The\n/// fee is only charged when real PSS leaves the manager, so a trader who never takes delivery\n/// round-trips tax-free and holders receive nothing from that volume.\ncontract ClaimsRoundTripProof is Test {\n    using CurrencyLibrary for Currency;\n\n    address constant MANAGER = 0x000000000004444c5dc75cB358380D2e3dE08A90;\n    address constant PAIRED = address(bytes20(hex\"d34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\"));\n    uint256 constant SUPPLY = 1_000_000_000 ether;\n    uint160 constant PRICE = 125270724187523965593206900;\n\n    function test_BuyAndSellInsideTheManagerPaysTheBuyFee() public {\n        vm.chainId(1);\n        vm.etch(MANAGER, abi.encodePacked(type(PoolManager).creationCode, abi.encode(address(this))));\n        (bool built, bytes memory runtime) = MANAGER.call(\"\");\n        require(built);\n        vm.etch(MANAGER, runtime);\n        IPoolManager manager = IPoolManager(MANAGER);\n        vm.etch(PAIRED, address(new PairStub()).code);\n        ClaimsTrader factory = new ClaimsTrader(manager);\n        ClaimsTrader trader = new ClaimsTrader(manager);\n\n        PSSToken token;\n        bytes32 codeHash = keccak256(type(PSSToken).creationCode);\n        for (uint256 i; i < 1000; ++i) {\n            address predicted = address(\n                uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(factory), bytes32(i), codeHash))))\n            );\n            if (predicted < PAIRED) {\n                token = factory.deploy(bytes32(i));\n                break;\n            }\n        }\n        factory.move(token, address(0xC1A1), SUPPLY / 10);\n        PoolKey memory key = PoolKey(Currency.wrap(address(token)), Currency.wrap(PAIRED), 3000, 60, IHooks(address(0)));\n        int24 tick = manager.initialize(key, PRICE);\n        int24 floorTick = (tick / 60) * 60;\n        if (tick < 0 && tick % 60 != 0) floorTick -= 60;\n        int24 lo = floorTick + 60;\n        int24 hi = TickMath.maxUsableTick(60);\n        uint160 a = TickMath.getSqrtPriceAtTick(lo);\n        uint160 b = TickMath.getSqrtPriceAtTick(hi);\n        uint256 liq = FullMath.mulDiv(SUPPLY * 9 / 10, FullMath.mulDiv(a, b, 1 << 96), b - a);\n        factory.seed(key, lo, hi, uint128(liq));\n        uint256 poolBefore = token.balanceOf(MANAGER);\n\n        PairStub(PAIRED).mint(address(trader), 1 ether);\n        // Buy 0.01 pair worth of PSS, output kept as an ERC-6909 claim.\n        BalanceDelta buy = trader.swap(key, false, -0.01 ether);\n        uint256 gross = uint128(buy.amount0());\n        assertGt(gross, 0);\n        // Sell the whole position back by burning the claim.\n        trader.swap(key, true, -int256(gross));\n        assertEq(IERC6909Claims(MANAGER).balanceOf(address(trader), key.currency0.toId()), 0);\n        assertEq(token.balanceOf(address(trader)), 0);\n        assertEq(token.balanceOf(MANAGER), poolBefore, \"no PSS ever left the manager\");\n\n        // Expected by the brief: 3% of the bought amount is collected for holders.\n        assertEq(token.totalFeesCollected(), gross * 3 / 100, \"the buy fee was never collected\");\n    }\n}","reproduction":"Seed the pool as the factory does (90% PSS single-sided at the provenance price, fee 3000, spacing 60). A trader swaps 0.01 pair-token for PSS inside unlock() and settles the positive PSS delta with manager.mint(self, id, amount) (claims) instead of take(). Then the trader swaps the full claim amount back to the pair token and settles the negative PSS delta with manager.burn(self, id, amount). Expected per the brief: totalFeesCollected() == 3% of the bought amount (about 118.94 PSS for this trade). Actual: totalFeesCollected() == 0, token.balanceOf(PoolManager) unchanged, trader never held PSS. Run: forge test --match-path test/scratch/ClaimsRoundTrip.t.sol (fails on the current code with `0 != 118939902609431644393`).","severity":"low","title":"Buy fee is bypassed when swap output stays inside the PoolManager as ERC-6909 claims"},{"description":"Only the PoolManager, the token and the burn address are excluded, exactly as the brief specifies, so the launch's MerkleDistributor is an eligible holder while it holds the swarm's 10%. Immediately after launch it is the ONLY eligible holder (90% sits in the PoolManager), so the first buys' fees accrue almost entirely to the distributor. The distributor never calls claim(), so those PSS stay in the token contract forever (there is no recovery path, by design). As contributors claim their shares the distributor's balance shrinks and its share of later fees falls, but the entitlement it already earned is permanent. The same applies to any contract holder that has no code path to call claim(). The implementation follows the brief's exclusion list literally; this is reported as an economic consequence the requester may not have intended (the brief says fees are distributed 'to all token holders').","line":33,"path":"src/PSSToken.sol","reproduction":"Deploy; move 100,000,000 PSS to the distributor address and 900,000,000 PSS to the PoolManager (the launch shape). From the PoolManager transfer 1,000 PSS to a buyer. Expected by the brief's intent: the 30 PSS fee is shared by holders who can claim it. Actual: claimableDividends(distributor) is about 29.9997 PSS and claimableDividends(buyer) is about 0.0003 PSS (buyer's 970 PSS vs the distributor's 1e26 eligible units); the 29.9997 PSS can never be claimed because the distributor contract does not call claim(). Confirmed by the existing test/PSSToken.t.sol:test_SellerKeepsEarnedDividendsAndNewHolderCannotClaimHistory pattern (the distributor address accrues like any wallet) and by test/PSSLedgerInvariant.t.sol, where actor 0 plays the distributor's claimants.","severity":"low","title":"Dividends accrued to the Merkle distributor (and any non-claiming contract) are stranded, and the distributor dominates early distributions"},{"description":"The fee rule keys on the ERC-20 `from` address only, so removing liquidity or collecting LP fees from the launch position is taxed like a buy: the factory (or whoever ends up holding the position) receives 97% of the PSS delta and holders are paid the other 3%. Settlement does not revert because take() does not verify receipt. The README documents this. It does not affect the seed, the swarm distribution or trader swaps, which the protected harness checks, but it should be known before anyone plans to unwind or harvest the position.","line":66,"path":"src/PSSToken.sol","reproduction":"After the launch seed, call modifyLiquidity with liquidityDelta = -liquidity/10 from the factory and take the PSS delta to the factory. Expected by a naive reader: factory receives the full delta. Actual: factory receives delta - delta*3/100, token contract holds delta*3/100, totalFeesCollected grows by it. Asserted as documented behaviour in test/UniswapV4Edges.t.sol:test_LiquidityWithdrawalByFactoryIsTaxedAsAManagerOutflow.","severity":"info","title":"Any PSS withdrawn from the pool by the liquidity position holder (factory) arrives net of 3%"},{"description":"Brief items 7 and 9 ask to confirm a 1.25% pool fee, while the authoritative build requirements and launch.json set pool.fee = 3000 (0.30%) with tickSpacing 60. The existing and new v4 tests initialise the pool with fee 3000 and assert slot0's lpFee == 3000 (static, not dynamic). No test asserts 1.25% because the mandatory requirement wins; if 1.25% was the real intent, launch.json must change (12500 is not a standard v4 tier and would require tickSpacing coordination).","line":12,"path":"launch.json","reproduction":null,"severity":"info","title":"Pool fee: the brief's 1.25% conflicts with the mandatory build requirement of 3000 (0.30%); tests assert 3000"},{"description":"Brief test 10 asks to confirm that 1% creator fee goes to $SIMD. No contract in this repository collects, routes or configures a creator fee; the README states it is the launchpad's responsibility. The suite verifies the parts that are in scope: no owner/admin selectors move or freeze balances, every parameter is a constant, the pool fee is static 3000, and the runtime bytecode contains no DELEGATECALL, CALLCODE or SELFDESTRUCT (test/PSSToken.t.sol and test/PSSTokenEdges.t.sol). The creator-fee routing must be checked on the launchpad before release. Likewise the live factory, Merkle distributor and initialization-guard hook are not vendored here; the Uniswap v4 integration tests run against the vendored PoolManager at the mainnet address with a local pair-token stub, so a fork run against mainnet state of the pair token 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 and the real factory remains owed (no RPC is available to this task or the verifier).","line":9,"path":"src/PSSToken.sol","reproduction":null,"severity":"info","title":"SIMD rules that live outside this repository cannot be verified here"},{"description":"_distribute runs after the net amount has arrived, so the buyer's post-transfer balance is part of the eligible supply for that very fee. When the buyer is a large fraction of eligible supply the effective fee shrinks toward zero: if the buyer is the only eligible holder, the whole 3% comes back as a claimable dividend (test/PSSTokenEdges.t.sol:test_BuyOfEntireManagerBalanceLeavesManagerEmpty). The README states this ordering is intentional and the brief only requires pro rata distribution to holders, so this is not a defect; it is noted because the brief's '3% fee on buys' is, for a dominant buyer, economically much less than 3%.","line":92,"path":"src/PSSToken.sol","reproduction":null,"severity":"info","title":"A buyer shares in the fee of its own buy; a dominant buyer recovers most of it"}],"hash":"41b92d88fcf6d8159ec3fcd735c4f4a9b720694b16236aa4f67057acc4581c9d","nodeId":"763feaa0-8bdf-4147-8136-b214bd6c5587","outcome":"completed","summary":"Done. The delivered suite builds and passes: 52 tests across 6 suites, with the pre-existing 25 untouched and 27 new ones added in three new files under `test/`. No defect in PSSToken rose above low severity, so nothing was tested around; six observations are recorded in `.imd-findings.json`.\n\n**What I added**\n\n- `test/PSSTokenEdges.t.sol` (20 tests). Failure paths and edges the original suite skipped: ether and unknown calldata rejected, a second disjoint list of privileged selectors that must not move or freeze a holder, approve to zero spender, buy allowance that covers only the net 97% reverts, fuzzed gross-allowance rule, fuzzed wallet-to-wallet and sell transfers over arbitrary addresses never taxed, buy of the whole manager balance, the exact 34-wei fee boundary, the distribution event's post-transfer eligible supply, a buy routed to the token contract (fee distributed, net donated), queued fees surviving an untaxed buy and flushing on a taxed buy to an excluded recipient, 40 uneven holders all claiming with dust bounded, claimed tokens sold untaxed and rebought taxed, exit and return, a forwarding router keeping the dividend, a contract holder claiming without callbacks, and two property tests: pro rata within one unit for random balances, and a random 40-step sequence where rounding loss is bounded by distributions plus holders.\n- `test/PSSLedgerInvariant.t.sol` (3 invariants, 256 runs × depth 64). A ghost ledger with six actors mirrors every operation (buy, sell, move with and without allowance, claim, same-transaction round trip, manager self-transfer) and asserts each balance account by account, fees equal exactly 3% of manager outflows, no overpayment, rounding loss within bound, index monotonic, and excluded addresses never owed.\n- `test/UniswapV4Edges.t.sol` (6 tests) against the vendored PoolManager at the mainnet address: exact-output buys in both currency orders, output taken to a router, liquidity withdrawal by the factory, ERC-6909 claim redemption paying the fee, and interleaved traders claiming then exiting with settlement balanced.\n\n**Findings reported** (none critical or high)\n\n- Low: a trader who keeps swap output as ERC-6909 claims and sells by burning them pays no fee, since no PSS leaves the manager. Matches the brief's literal definition, inherent to v4, proof included and verified failing in scratch.\n- Low: the Merkle distributor is an eligible holder and dominates early distributions, and it never calls claim, so those dividends are stranded.\n- Info: liquidity withdrawals by the position holder are taxed 3%; pool fee 1.25% in the brief conflicts with the mandatory 3000 and tests assert 3000; the 1% creator fee to $SIMD lives on the launchpad and cannot be verified here; a dominant buyer recovers most of its own fee.\n\n**Still owed outside this environment**: a fork run against the real pair token, factory, distributor and initialization hook on mainnet. No RPC is available here, so those are covered only by the local PoolManager stand-in.","treeHash":"6de1d2fa0b019a6b373f8767bc7a30b7f5b41bd0","usage":{"cachedInputTokens":1505625,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":60688,"runtime":"claude","turns":32,"wallClockMs":803483}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"85f29f4c09dba910","findings":[{"citation":"resolved","description":"Seam: boundary x invariant (Numerical Gap guide) with a precision-free but order-dependent formula. _update() checkpoints the buyer (_accrue(to)) BEFORE the buy, credits the buyer's net (amount - fee) to its balance, and only then calls _distribute(fee). _distribute computes eligibleSupply() from POST-transfer balances, so the buyer's freshly received net counts as 'holder balance' for the very fee it just paid. The buyer's share of its own fee is net/(float + net). As the buy grows relative to the pre-existing eligible float this share tends to 1 and the fee is returned to the buyer as claimable PSS. The 3% buy fee that M1 says is 'distributed to holders pro rata' therefore does not reward the holders that existed before the buy: a buyer that dominates the float pays, in net terms, almost nothing. At launch this is the normal state: the only eligible float is the distributor's 10% (see finding 2), so early buyers rebate themselves whatever the distributor does not absorb. The same ordering is what makes same-transaction dividend capture (buy large, let another buy land, sell untaxed, claim) cheap: the attacker's own fee is mostly rebated and the victim's fee is split by post-transfer balances. This is an accounting-order defect, not a rounding defect: MAGNITUDE math is exact to <1 wei. Minimal fix preserving the design: in the taxed branch move the fee to the contract, call _distribute(fee), re-checkpoint the recipient with _accrue(to) (it credits the recipient's PRE-buy balance at the new index), and only then transfer the net: super._update(from, address(this), fee); totalFeesCollected += fee; _distribute(fee); _accrue(to); super._update(from, to, amount - fee);. Verified on a scratch copy: with that reorder the attached proof passes and the existing suite semantics (queueing when no eligible holder, fee reserve >= liabilities) are unchanged because the recipient's pre-buy balance is already part of eligibleSupply().","line":72,"path":"src/PSSToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PSSToken} from \"src/PSSToken.sol\";\n\n/// @notice A buy's 3% fee is meant to reward the holders that existed before the buy. Because\n/// `_distribute` runs after the buyer's net receipt is credited, the buyer's new balance takes a\n/// pro-rata share of its own fee. When the buy dwarfs the eligible float, the buyer takes almost\n/// the whole fee back and the effective rate collapses from 300 bps to a few bps.\ncontract BuyerSelfRebateTest is Test {\n    PSSToken token;\n    address constant PM = 0x000000000004444c5dc75cB358380D2e3dE08A90;\n    address constant HOLDER = address(0x401D);\n    address constant BUYER = address(0xB0B);\n    uint256 constant SUPPLY = 1_000_000_000 ether;\n\n    function setUp() public {\n        token = new PSSToken();\n        token.transfer(HOLDER, 1_000_000 ether); // eligible float before the buy\n        token.transfer(PM, SUPPLY - 1_000_000 ether); // the rest is in the pool\n    }\n\n    function test_BuyerDoesNotEarnFromItsOwnBuyFee() public {\n        uint256 amount = 100_000_000 ether;\n        uint256 fee = amount * token.BUY_FEE_BPS() / token.BPS_DENOMINATOR();\n\n        vm.prank(PM);\n        token.transfer(BUYER, amount);\n\n        // The buyer held nothing before this buy, so it earned nothing from this buy's fee.\n        assertEq(token.claimableDividends(BUYER), 0, \"buyer rebated its own fee\");\n        // The pre-existing holder is the only eligible holder, so it gets the whole fee (minus dust).\n        assertApproxEqAbs(token.claimableDividends(HOLDER), fee, 1, \"holder did not receive the fee\");\n    }\n}","reproduction":"State: HOLDER holds 1_000_000e18 PSS (the only eligible float); POOL_MANAGER holds the remaining 999_000_000e18; no one else holds anything. Call: vm.prank(POOL_MANAGER); token.transfer(BUYER, 100_000_000e18). fee = 100_000_000e18 * 300 / 10_000 = 3_000_000e18. eligibleSupply() after transfer = 1_000_000e18 + 97_000_000e18 = 98_000_000e18. Actual: claimableDividends(BUYER) = 2_969_387_755_102_040_816_326_530 (= 3_000_000e18 * 97/98, i.e. 98.98% of its own fee); claimableDividends(HOLDER) = 30_612_244_897_959_183_673_469 (1.02% of the fee). Effective fee paid by the buyer = (3_000_000e18 - 2_969_387.76e18) / 100_000_000e18 = 3 bps, not 300 bps. Expected: the buyer, holding 0 before the buy, earns 0 from this buy's fee and HOLDER receives the whole 3_000_000e18 (minus <1 wei index dust). Proof test test/scratch/BuyerSelfRebate.t.sol fails on the current code with 'buyer rebated its own fee: 2969387755102040816326530 != 0' and passes with the reorder above.","severity":"medium","snippet":"                super._update(from, address(this), fee);\n                super._update(from, to, amount - fee);\n                totalFeesCollected += fee;\n                _distribute(fee);","title":"Buyer's own net receipt shares in its own buy fee: effective buy fee collapses from 300 bps to ~3 bps for buys large relative to the eligible float"},{"citation":"resolved","description":"Seam: boundary x invariant. The exclusion set is only POOL_MANAGER, the token, 0xdEaD and address(0). The factory forwards 10% of the supply (1e26 units) to its MerkleDistributor before seeding the pool, and remainderTo is 0xdead, so immediately after launch the entire eligible float is the distributor's 1e26. The distributor is an ordinary contract with no code path that calls PSSToken.claim(); its _accrued balance can never be withdrawn and the corresponding PSS stays in the token contract forever (there is no recovery function, by design). Every buy fee is split pro rata over eligible balances AFTER the buyer's net is credited (finding 1), so the first buy's fee is split between the distributor (~99%) and the buyer itself (~1%): no claim-capable holder other than the buyer receives anything, and the distributor's part is a permanent sink. The sink persists until contributors claim from the distributor, which happens over an unbounded period; any unclaimed swarm balance keeps absorbing fees indefinitely. Contributors who later claim their PSS from the distributor receive tokens whose _paidIndex is set at claim time, so they do not inherit the dividends the distributor earned on their behalf either. The contract already excludes 0xdEaD precisely to avoid this kind of sink, so the inconsistency is a gap, not a design choice. Fix needs a scope decision because the token cannot learn the distributor address without a constructor argument: take $factory and $launchNumber (the manifest allows them), and treat IFactory(factory).distributorOf(launchNumber) as excluded in isExcludedFromDividends/eligibleSupply/_accrue (reading it at transfer time, since the distributor is created after the token). No proof test is attached because any fix changes the constructor signature the test would have to call.","line":34,"path":"src/PSSToken.sol","reproduction":"State (exact launch shape): factory mints 1e27 to itself, transfers 1e26 to DISTRIBUTOR=0xD157 (eligible, no claim() caller) and 9e26 to POOL_MANAGER; factory balance 0. Call: vm.prank(POOL_MANAGER); token.transfer(BUYER, 1_000_000e18) (the first buy). fee = 30_000e18; eligibleSupply() = 1e26 + 970_000e18 = 100_970_000e18. Actual: claimableDividends(DISTRIBUTOR) = 29_711_795_582_846_390_016_836 (9903 bps of the fee) and claimableDividends(BUYER) = 288_204_417_153_609_983_163 (97 bps). token.balanceOf(address(token)) = 30_000e18, of which 29_711.8e18 can never be claimed by anyone: DISTRIBUTOR has no function that calls claim(), and transferring its tokens out (vm.prank(DISTRIBUTOR); token.transfer(CLAIMANT, x)) leaves _accrued[DISTRIBUTOR] in place and gives CLAIMANT a fresh _paidIndex, so claimableDividends(CLAIMANT) stays 0. Expected: the 3% buy fee is distributed to holders that can actually claim it; value sent to a holder that structurally cannot claim is equivalent to the 0xdEaD case the code already excludes.","severity":"medium","snippet":"        return account == POOL_MANAGER || account == address(this) || account == BURN_ADDRESS || account == address(0);","title":"Dividends allocated to the launch MerkleDistributor (a contract that never calls claim()) are permanently locked; at launch it absorbs ~99% of every early buy fee"}],"hash":"87f8a23750a46dbd2c66b4f927241f4eba8b52638f367b3dc803705f844e5b80","nodeId":"3d66cd83-c11b-44d2-be66-f1674330e08c","outcome":"completed","summary":"Review complete. The findings file `.imd-findings.json` is written with two medium findings and a 12-row coverage record. No source or test files were changed. The scratch directory was removed after use.\n\n**What I checked**\n\nI traced every arithmetic path in `src/PSSToken.sol` against the Math Precision, Boundary and Numerical Gap guides: fee truncation, index scaling by 2^128, accrual products, claim rounding, eligible-supply underflow, overflow at extreme eligible supply, view-versus-write parity, and the launch manifest's price-to-market-cap arithmetic. The pure integer math holds. Every division rounds in the contract-favoring direction, remainders are preserved across claims, and reserves always cover liabilities. I confirmed by test that an eligible supply of 1 wei receiving a 3e25 fee does not overflow any later accrual.\n\n**Findings**\n\n- **Medium: buyer rebates its own fee.** The fee is distributed after the buyer's net receipt is credited, so the buyer's new balance takes a pro-rata share of the fee it just paid. With a 1M PSS float and a 100M PSS buy, the buyer gets back 98.98% of the fee and pays an effective 3 bps instead of 300 bps. Existing holders receive 1.02%. A proof test is attached that fails on the current code and passes with a small reorder in `_update` that I verified on a scratch copy.\n- **Medium: distributor dividend sink.** The MerkleDistributor holds 10% of supply at launch and is not excluded, but it has no way to call `claim()`. On the first buy after launch it absorbs 99.03% of the fee permanently, and keeps absorbing fees until contributors claim. The burn address is already excluded for exactly this reason. The fix needs a constructor argument, so no proof test is attached.\n\n**Not reported**\n\nFee truncation to zero for buys under 34 minor units is dust-level, documented, and already tested, so it is recorded in coverage only. Same-transaction dividend capture is documented as intentional in the README. The 1.25% versus 3000 pool fee and the 1% creator fee are outside the token and marked unreached.","treeHash":null,"usage":{"cachedInputTokens":1192103,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":33868,"runtime":"claude","turns":23,"wallClockMs":554850}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"76ce625b2d0c8171","findings":[],"hash":"8939905b227027321349dfbd43386b151cca6c95c74436e4d9074bba00e6da67","nodeId":"b47caec1-6b5b-4767-b781-fb322e8efc2a","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":1282}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9ab27edcfd62be02","findings":[{"citation":"resolved","description":"Trust gap (economics x asymmetry). Dividends are credited pro rata to every address that is not PoolManager, the token or 0xdEaD, and can only be collected by that address calling claim() (claim pays msg.sender only; there is no claimFor). The launch flow leaves 90% of supply in the PoolManager (excluded), the remainder in 0xdEaD (excluded) and the swarm's 10% in the launch's MerkleDistributor, which is a contract that only transfers fixed claim amounts and never calls PSSToken.claim(). So right after launch eligibleSupply() == the distributor's 100,000,000 PSS and the distributor is the ONLY eligible holder: the fee on the first buys is credited almost entirely to it. When a contributor later claims their share, _accrue(from) checkpoints the distributor's earnings into _accrued[distributor] (src/PSSToken.sol:88) and the claimant inherits nothing (README: 'forwarding its tokens does not forward already earned dividends'). Those PSS stay in the token contract with no recovery path. The same loss repeats for every contract holder without a claim path (CEX custody wallets, bridges, other DEX pools), but the distributor is guaranteed by the launch design and dominates early distributions, so the stated guarantee that 'the 3% fee is distributed as dividends to holders' fails for most of the launch-window fees. None of the existing tests reach this state: every test moves the distributor's 10% to CLAIMANT before the first buy. Fix needs a scope decision by the requester: either exclude the launch distributor (constructorArgs $factory and $launchNumber, exclude factory.distributorOf(launchNumber) in isExcludedFromDividends/eligibleSupply, mirroring the PoolManager exclusion), or accept and document that early fees are burned in effect. Note the second option changes nothing in code; the first changes launch.json constructorArgs.","line":34,"path":"src/PSSToken.sol","reproduction":"State: deployer D deploys PSSToken (1e27 to D). D transfers 100,000,000e18 to distributor contract X (a contract with only a transfer-out function, like MerkleDistributor), 900,000,000e18 to 0x000000000004444c5dc75cB358380D2e3dE08A90, and the rest to 0xdEaD. eligibleSupply() == 100,000,000e18. Buy: vm.prank(POOL_MANAGER); token.transfer(buyer, 1_000_000e18). Fee = 30,000e18 PSS. Expected: the fee is distributed to holders who can claim it. Actual: claimableDividends(X) == 29,711.795582846390016836e18 (99.04% of the fee), claimableDividends(buyer) == 288.204417153609983163e18. X then transfers its full 100,000,000e18 to a claimant: claimableDividends(X) is unchanged, claimableDividends(claimant) == 0, X has no code path to call claim(), and after the buyer claims, balanceOf(token) == 29,711.795582846390016837e18 remains locked forever. Reproduced by test/scratch/DistributorDividends.t.sol (passes on current code, printing these values).","severity":"medium","snippet":"        return account == POOL_MANAGER || account == address(this) || account == BURN_ADDRESS || account == address(0);","title":"Buy fees credited to the launch MerkleDistributor (the only eligible holder at launch) are permanently unclaimable"},{"citation":"resolved","description":"Asymmetry between the two ways a swap output can be collected from Uniswap v4. The fee attaches to an ERC-20 transfer whose from is the PoolManager (take). The PoolManager also lets the swapper mint ERC-6909 claim tokens for the output (PoolManager.mint) instead of taking it, and later settle a sale by burning those claims (PoolManager.burn), so a full buy-then-sell round trip of PSS can be executed with no ERC-20 transfer at all. Arbitrage bots and routers that stay in claims form pay only the 0.3% pool fee; holders receive none of the 3% dividend on that volume, and the claim holder is not an eligible holder either. The spec (M1) defines the fee as 'transfers FROM the PoolManager', so this is an inherent limit of the requested design rather than an implementation slip; it is reported so the requester knows that fee revenue depends on traders taking real tokens. The existing test test_RedeemingClaimsPaysTheFeeOnTheAmountTaken covers only the redeem path and states this round trip is deliberately not asserted. No in-token fix exists without inspecting PoolManager state; mitigation would be a v4 hook on the pool (out of this token's scope).","line":66,"path":"src/PSSToken.sol","reproduction":"State: launch shape with PSS as currency0, pool seeded single-sided, HOLDER holds 10% of supply. Trader T with 1e18 pair tokens: (1) unlock; swap(key, zeroForOne=false, amountSpecified=-0.01e18); settle the pair token; manager.mint(T, currency0.toId(), amount0) for the positive PSS delta. Expected per spec: a buy pays 3% to holders. Actual: balanceOf(POOL_MANAGER) unchanged, totalFeesCollected() == 0, claimableDividends(HOLDER) == 0, T holds amount0 of ERC-6909 claims. (2) unlock; swap(key, zeroForOne=true, amountSpecified=-amount0); manager.burn(T, currency0.toId(), amount0); take the pair token. Actual: round trip complete, totalFeesCollected() still 0, PoolManager PSS balance identical to before. The same round trip done with take/transfer collects amount0*3/100 in fees and credits HOLDER. Reproduced by test/scratch/ClaimsRoundTrip.t.sol against the vendored v4 PoolManager (passes on current code).","severity":"low","snippet":"        if (from == POOL_MANAGER && to != POOL_MANAGER) {","title":"A buy taken as ERC-6909 claims and sold back by burning them never leaves the PoolManager, so the 3% buy fee is never charged"}],"hash":"91f065db719d9dda8183f620eb26251c3c8dd753ada98b0d2a1700f4a833f395","nodeId":"855e68a1-7a0b-44b7-882d-6ee310882133","outcome":"completed","summary":"The review is complete. The findings file is written and validated, and the scratch tests that reproduce both findings pass against the current code.\n\n**Outcome.** The permission model is clean: PSSToken has exactly four state-changing entry points (approve, transfer, transferFrom, claim), no owner, no initializer, no proxy, no receive or fallback, and every parameter is a constant. The existing 52-test suite passes. I found no access-control bypass. The two defects I substantiated sit at the trust-gap seams of economics and asymmetry.\n\n**Finding 1, medium.** Buy fees credited to the launch's MerkleDistributor can never be claimed. After the launch flow, the PoolManager and 0xdEaD are excluded and the distributor holds the entire eligible supply, so the first buys' fees are credited almost entirely to it. The distributor has no path to call claim(), and when it pays a contributor the earned credit stays behind. With a 1,000,000 PSS first buy, the fee is 30,000 PSS and 29,711 PSS of it is locked forever. No existing test reaches this state because every test moves the distributor's share to a claimant before the first buy. The fix needs a scope decision: exclude the distributor via factory.distributorOf(launchNumber) with $factory and $launchNumber constructor args, or document that launch-window fees are effectively burned.\n\n**Finding 2, low.** A buy whose output is minted as ERC-6909 claims and then sold back by burning those claims never moves PSS out of the PoolManager, so the 3% fee is never charged and holders earn nothing on that volume. An earlier contributor already noted this in a test comment. It is inherent to the \"transfer FROM PoolManager\" design the spec mandates, so I reported it for awareness rather than as an implementation slip.\n\n**Coverage.** All four entry points have rows (three hold, transfer carries finding 1), plus four invariant rows covering no-admin surface, exclusions, untaxed sells and seed, and launch.json matching the mandatory spec. The 1% SIMD creator fee and the 1.25% pool fee from the brief are superseded by the mandatory build requirements and belong to the launchpad, not this contract.\n\n**Not reached.** Deep numerical rounding analysis and economic sandwich modeling are outside my three guides and were only sanity-checked; the fuzz and invariant suites cover them to 1000 and 256 runs respectively.","treeHash":null,"usage":{"cachedInputTokens":835932,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":27015,"runtime":"claude","turns":25,"wallClockMs":458255}},{"artifacts":[],"attempt":1,"bundleHash":"59c3c63f7d2ee16c15e86d3d31418698ad46a6d4a0d5b88998e5b4c580f823d6","device":"1ab5a860db2abcb2","findings":[],"hash":"9e5b85bbaa3c4b2c41be2bf7afe29e81c48fac21fd9a25add2851da750f90305","nodeId":"b47caec1-6b5b-4767-b781-fb322e8efc2a","outcome":"completed","summary":"Updated `launch.json` notes and recorded the advisory response in `.imd-responses.json`.\n\nRequired fee `3000` remains unchanged. External creator-fee routing is explicitly unverified.\n\nManifest validation and `forge build` passed; all 59 tests passed.","treeHash":"2771801aba7a5d5a8d996524621053fbfd8fe017","usage":{"cachedInputTokens":283136,"inputTokens":45038,"model":"gpt-6-astra","outputTokens":4956,"runtime":"codex","turns":4,"wallClockMs":143909}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"93c37f17670e4d98","findings":[{"citation":"resolved","description":"Merged from audit_permissions, audit_flow, audit_economics and audit_math (same root cause). The exclusion set is only POOL_MANAGER, the token, 0xdEaD and address(0). The launch factory forwards 10% of supply (100,000,000 PSS) to the launch's MerkleDistributor before seeding 90% into the PoolManager and sending the remainder to remainderTo = 0xdead. Right after launch the distributor is therefore the ONLY eligible holder, and every buy fee is credited almost entirely to it. The distributor is a contract that only transfers Merkle claims; it has no code path that calls PSSToken.claim(), and claim() pays msg.sender only (no claimFor). Forwarding its tokens to a claimant does not forward earned dividends: _accrue(from) at line 62 checkpoints the OLD balance into _accrued[distributor] and the recipient gets a fresh _paidIndex. The credited PSS stays in the token contract as a liability nobody can collect; there is no recovery path. The share shrinks only as contributors and seats claim from the distributor, and the 8% paired-seat share can stay unclaimed indefinitely. The brief's guarantee that 'the 3% fee is distributed to holders ... holders claim their dividends at any time' fails for most launch-window fees; the same mechanism locks the share of any CEX/bridge/router/LP contract that cannot call claim() (README line 21 acknowledges the router case). The code already excludes 0xdEaD to avoid exactly this kind of sink. Fix needs a requester scope decision: take $factory and $launchNumber as constructor arguments (the custom-token-launch reference allows them) and treat IFactory(factory).distributorOf(launchNumber) as excluded in isExcludedFromDividends/eligibleSupply at transfer time (it must be read lazily because the distributor is created after the token), which changes launch.json token.constructorArgs; or add a pull-for-account claim form; or accept and document that early fees are effectively burned. No proof test is attached because any fix changes the constructor signature or ABI the test would call.","line":34,"path":"src/PSSToken.sol","reproduction":"State: fresh PSSToken (1e27 to deployer). Deployer transfers 100_000_000e18 to a contract D that can only forward tokens (stand-in for the MerkleDistributor), 900_000_000e18 to 0x000000000004444c5dc75cB358380D2e3dE08A90; deployer holds 0; eligibleSupply() == 100_000_000e18. Call: vm.prank(POOL_MANAGER); token.transfer(BUYER, 1_000_000e18). Expected per brief: the 30_000e18 fee is claimable by holders. Actual (observed with test/scratch/DistributorStranding.t.sol): totalFeesCollected == 30000000000000000000000; claimableDividends(D) == 29711795582846390016836 (99.04% of the fee); claimableDividends(BUYER) == 288204417153609983163. D forwards its full 100_000_000e18 to CLAIMANT: claimableDividends(D) unchanged, claimableDividends(CLAIMANT) == 0. After BUYER claims, balanceOf(address(token)) == 29711795582846390016837 with no function that can ever pay it out.","severity":"medium","snippet":"        return account == POOL_MANAGER || account == address(this) || account == BURN_ADDRESS || account == address(0);","title":"Buy fees credited to the launch MerkleDistributor (and any contract holder without a claim() path) are permanently locked in the token; at launch that is ~99% of every buy fee"},{"citation":"resolved","description":"From audit_math; reproduced and its proof run. _update checkpoints the buyer (_accrue(to), line 63) BEFORE the buy, credits the net (amount - fee) to the buyer at line 72, and only then calls _distribute(fee) at line 74, which reads eligibleSupply() from POST-transfer balances. The buyer's freshly received net therefore counts as holder balance for the fee it just paid, taking net/(float + net) of it back as claimable PSS. The code comment at line 92 states this ordering is intentional, but the brief's purpose for the fee ('distributed to holders pro rata') is to reward the holders a buy trades against; with this ordering a buyer that dominates the float pays almost nothing net, and it makes same-transaction dividend capture (buy large, let a victim buy land, sell untaxed, claim) cheap because the attacker's own fee is mostly rebated. Combined with finding 1, at launch the only eligible float is the distributor's 10%, so no claim-capable pre-existing holder receives anything from early buys. This is an accounting-order defect, not rounding: the math is exact to <1 wei. Minimal fix preserving the design: move the fee, distribute, re-checkpoint the recipient, then deliver the net: super._update(from, address(this), fee); totalFeesCollected += fee; _distribute(fee); _accrue(to); super._update(from, to, amount - fee);. I verified on a scratch copy (test/scratch/PSSTokenFixed.sol) that with this reorder the attached proof passes and the ledger/dividend invariant suites still hold once the ghost ledger counts a distribution by pre-buy eligibility (a buy into an empty float then queues its fee, as the README already specifies for the no-holder case).","line":71,"path":"src/PSSToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PSSToken} from \"src/PSSToken.sol\";\n\n/// @notice A buy's 3% fee is meant to reward the holders that existed before the buy. Because\n/// `_distribute` runs after the buyer's net receipt is credited, the buyer's new balance takes a\n/// pro-rata share of its own fee. When the buy dwarfs the eligible float, the buyer takes almost\n/// the whole fee back and the effective rate collapses from 300 bps to a few bps.\ncontract BuyerSelfRebateTest is Test {\n    PSSToken token;\n    address constant PM = 0x000000000004444c5dc75cB358380D2e3dE08A90;\n    address constant HOLDER = address(0x401D);\n    address constant BUYER = address(0xB0B);\n    uint256 constant SUPPLY = 1_000_000_000 ether;\n\n    function setUp() public {\n        token = new PSSToken();\n        token.transfer(HOLDER, 1_000_000 ether); // eligible float before the buy\n        token.transfer(PM, SUPPLY - 1_000_000 ether); // the rest is in the pool\n    }\n\n    function test_BuyerDoesNotEarnFromItsOwnBuyFee() public {\n        uint256 amount = 100_000_000 ether;\n        uint256 fee = amount * token.BUY_FEE_BPS() / token.BPS_DENOMINATOR();\n\n        vm.prank(PM);\n        token.transfer(BUYER, amount);\n\n        // The buyer held nothing before this buy, so it earned nothing from this buy's fee.\n        assertEq(token.claimableDividends(BUYER), 0, \"buyer rebated its own fee\");\n        // The pre-existing holder is the only eligible holder, so it gets the whole fee (minus dust).\n        assertApproxEqAbs(token.claimableDividends(HOLDER), fee, 1, \"holder did not receive the fee\");\n    }\n}","reproduction":"State: HOLDER holds 1_000_000e18 PSS (the only eligible float); POOL_MANAGER holds the remaining 999_000_000e18. Call: vm.prank(POOL_MANAGER); token.transfer(BUYER, 100_000_000e18). fee = 3_000_000e18; eligibleSupply() after the transfer = 1_000_000e18 + 97_000_000e18 = 98_000_000e18. Expected: BUYER (balance 0 before the buy) earns 0 from this fee and HOLDER is owed 3_000_000e18 minus <1 wei dust. Actual: claimableDividends(BUYER) == 2969387755102040816326530 (97/98 of its own fee, effective fee 3 bps instead of 300), claimableDividends(HOLDER) == 30612244897959183673469. The attached proof (forge test --match-path test/scratch/Proof_05c9a2a27bf6.t.sol) fails on the current code with 'buyer rebated its own fee: 2969387755102040816326530 != 0' and passes against the reordered copy.","severity":"medium","snippet":"                super._update(from, address(this), fee);\n                super._update(from, to, amount - fee);\n                totalFeesCollected += fee;\n                _distribute(fee);","title":"The buyer's own net receipt shares in the fee it just paid: the effective buy fee collapses from 300 bps toward 0 for buys large relative to the eligible float"},{"citation":"resolved","description":"Merged from audit_permissions, audit_flow and audit_economics; reproduced against the vendored v4 PoolManager. The fee attaches to an ERC-20 transfer whose from is the PoolManager, exactly as mechanics M1 asks. Uniswap v4 flash accounting also lets a swapper settle a positive PSS delta with PoolManager.mint (ERC-6909 claims) instead of take(), and settle a later negative PSS delta with PoolManager.burn instead of transferring tokens in. In that mode no PSS ERC-20 transfer happens on either leg, so _update never runs and no fee is collected; holders earn nothing from that volume and the trader pays only the pool's 0.3% LP fee. This is an inherent limit of the requested design (the token cannot observe claim mints; only a v4 hook on the pool could tax them, and the launch has no hook), so it is reported at low severity for the requester's awareness rather than as an implementation slip. The existing test test_RedeemingClaimsPaysTheFeeOnTheAmountTaken covers only the eventual redemption and explicitly leaves this round trip unasserted. Severity calibrated to low (audit_economics had medium): no holder loses funds they hold; the guarantee as written in M1 ('transfers FROM the PoolManager') is met, only the economic intent 'fee on buys' is avoidable by sophisticated traders.","line":66,"path":"src/PSSToken.sol","reproduction":"State (test/scratch/ClaimsRoundTrip.t.sol, offline): vendored PoolManager constructed at 0x000000000004444c5dc75cB358380D2e3dE08A90, pair stub at 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, PSSToken deployed with address < pair (currency0), pool initialised at sqrtPriceX96 125270724187523965593206900, seeded single-sided with 90% of supply, HOLDER holds 10%. Trader with 1e18 pair units: (1) unlock; swap(zeroForOne=false, amountSpecified=-0.01e18); settle pair by transfer; settle PSS output by manager.mint(trader, id(PSS), gross). Observed gross == 3964663420314388146441 claims, balanceOf(POOL_MANAGER) unchanged, totalFeesCollected() == 0. (2) unlock; swap(zeroForOne=true, -gross); manager.burn(trader, id(PSS), gross); take pair. Observed: claims balance 0, totalFeesCollected() still 0, claimableDividends(HOLDER) == 0, PoolManager PSS balance identical to before, trader's whole round-trip cost 59909868636295 pair wei (the 0.3% pool fee). Expected per brief: a 3% fee on the buy leg. Control in the same test: the same 0.01e18 buy settled with take() records totalFeesCollected() == gross2 * 3 / 100 and credits HOLDER.","severity":"low","snippet":"        if (from == POOL_MANAGER && to != POOL_MANAGER) {","title":"A buy taken as Uniswap v4 ERC-6909 claims and sold back by burning them never leaves the PoolManager, so the 3% buy fee is never charged on that volume"},{"citation":"resolved","description":"From audit_economics (low); reproduced, recalibrated to info. Mechanics M1 defines a buy as a transfer FROM the PoolManager, and that is what ships: the token cannot tell a swap output from a liquidity withdrawal, LP-fee collection or protocol-fee collection, all of which v4 pays through take(). The launch factory, which owns the seed position, receives 97% of any PSS it ever withdraws or collects, and holders get the 3%. Nothing reverts (take() does not check receipt) and README line 13 documents it, so this is spec-conformant behaviour the launch operator should know about rather than a defect.","line":66,"path":"src/PSSToken.sol","reproduction":"State: launch fixture _launch(true) in test/UniswapV4Edges.t.sol. Call: factory.modifyLiquidity(key, lower, upper, -int256(liquidity/10)). Expected under a literal 'buys only' reading: factory receives the full PSS the pool pays out. Actual: factory receives gross - gross*3/100, token.totalFeesCollected() == gross*3/100 and claimableDividends(CLAIMANT) increases. Asserted by the existing passing test: forge test --match-test test_LiquidityWithdrawalByFactoryIsTaxedAsAManagerOutflow.","severity":"info","snippet":"        if (from == POOL_MANAGER && to != POOL_MANAGER) {","title":"Every PoolManager outflow is taxed, not only buys: liquidity removal and LP/protocol fee collection in PSS arrive 3% short"},{"citation":"resolved","description":"Merged from audit_flow and audit_economics (both info). The mandatory build block fixes pool fee 3000 / tickSpacing 60 and is declared authoritative over the narrative, so launch.json, the README and the v4 tests (which assert lpFee == 3000) follow it; the brief's item 7 and test item 9 (1.25%, i.e. fee 12500) are superseded and the requester should confirm that is intended. Test item 10 asks to confirm a 1% creator fee routed to $SIMD; no recipient address exists in the brief and no contract here collects or routes it (grep SIMD src/ returns nothing). README line 44 and the launch.json notes assign it to the launchpad. If the launchpad does not route that fee, item 10 is unmet by anything in this repository. Not a code defect.","line":14,"path":"launch.json","reproduction":"Read launch.json line 14: pool.fee == 3000. Read the brief: 'The Uniswap v4 pool fee is fixed at 1.25%' and test item 9. Run grep -rn SIMD src/: no match. Expected per brief items 9 and 10: 1.25% pool fee and a 1% creator fee reaching $SIMD. Actual: 0.30% pool fee per the mandatory block; no creator-fee routing in the token or manifest.","severity":"info","snippet":"    \"fee\": 3000,","title":"Brief items resolved only in prose: pool fee is 3000 (0.30%) not the narrative's 1.25%, and the 1% creator fee to $SIMD is not implemented anywhere in this repository"}],"hash":"be6c0ae45c52b791493760fcf3fa1b5f5de849f7ae41cb5d9e1b44eb0a3983a7","nodeId":"a8d082e8-cba9-423d-a98b-384c2c1a9d4c","outcome":"completed","summary":"The review is complete. The findings file is in place at the repository root, the working tree is otherwise unchanged (the findings file and test/scratch/ are excluded by the harness's git exclude rules, which is why git shows a clean tree), and no source, config or manifest file was modified.\n\n**Outcome: 5 findings, none critical or high.** The token conforms to the authoritative mechanics M1 on every settlement-critical path. Sells, the pool seed and distributor claims are exact, settlement balances, there is no owner, no mint path, no reentrancy, no delegatecall or selfdestruct, and I confirmed by a worst-case test that the magnified dividend index cannot overflow a checkpoint. The two medium findings are economic guarantees that fail rather than loss of held funds.\n\n**Findings reported**\n\n1. **Medium, distributor stranding (merged from all four specialists).** The launch MerkleDistributor is the only eligible holder right after launch and cannot call claim(). On a 1,000,000 PSS first buy, 99.04% of the 30,000 PSS fee is credited to it and is locked in the token forever. Reproduced with exact values. Fix needs a requester scope decision because excluding the distributor requires the $factory and $launchNumber constructor arguments.\n\n2. **Medium, buyer self-rebate (from audit_math).** Because the fee is distributed after the buyer's net is credited, a buyer takes net/(float+net) of its own fee back. The attached proof fails on current code with the buyer owed 97/98 of its own fee. I confirmed a five-line reorder in `_update` makes the proof pass and keeps the existing ledger and dividend invariants, once the ghost ledger counts distributions by pre-buy eligibility.\n\n3. **Low, ERC-6909 claims round trip (merged from three specialists, recalibrated down from one medium).** A buy minted as claims and sold back by burning them never triggers a PSS transfer, so no 3% is collected. Reproduced against the vendored PoolManager. It is a limit of the requested design, not an implementation slip.\n\n4. **Info, all manager outflows taxed.** Liquidity removal and fee collection in PSS arrive 3% short. Spec-conformant and documented, asserted by an existing test.\n\n5. **Info, brief items resolved only in prose.** Pool fee is 3000 per the mandatory block, not the narrative's 1.25%, and no 1% $SIMD creator fee exists in this repository.\n\n**Coverage:** all four ABI entry points answered. approve and claim hold. transfer and transferFrom carry findings 1 and 2. Three invariant rows added for supply, launch flows and reserve coverage.\n\n**Still owed outside this review:** live confirmation that the launchpad routes the 1% creator fee, and the requester's decision on whether to exclude the distributor and reorder the fee distribution.","treeHash":null,"usage":{"cachedInputTokens":1699332,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":29445,"runtime":"claude","turns":31,"wallClockMs":494312}},{"artifacts":[],"attempt":2,"bundleHash":"f2263fc2ecf2c1acdbcf912f40f6373355f86f43fb929e21163d40c81e49a315","device":"bb0a3bf63233e5e5","findings":[],"hash":"c68234602ff8bd6de876f015154f236af1ce10486dfef165e0d79efa341b73b3","nodeId":"891513c9-37ec-4972-adb6-9a1882669a11","outcome":"completed","summary":"Implemented PSSToken, corrected `launch.json`, vendored dependencies, documentation, and tests.\n\nVerified successfully:\n\n- `forge build`\n- `forge test`: 25 passed, including fuzz, invariant, and offline Uniswap v4 integration tests\n- `forge fmt --check`\n- Manifest validation\n\nUsed the mandatory 0.30% pool fee. The 1% SIMD creator-fee routing remains an external launchpad responsibility, documented in README.","treeHash":"a3c3e0b7f01968fb082c0974595026a0ad22d4de","usage":{"cachedInputTokens":1299840,"inputTokens":99591,"model":"gpt-6-astra","outputTokens":26016,"runtime":"codex","turns":7,"wallClockMs":729994}},{"artifacts":[],"attempt":1,"bundleHash":"8d4fe1acd21684ba7362e8b823d9c74aee478f03bc495d7d827a42b9ccf65866","device":"d67781b306f5a952","findings":[],"hash":"cb63c40e5b8036afcfe442d41565f71d04a0c0137a63d32460322ef80ddabf5d","nodeId":"891513c9-37ec-4972-adb6-9a1882669a11","outcome":"completed","summary":"Implemented `PSSToken`, launch manifest, vendored dependencies, tests, and deployment documentation.\n\nValidation passed:\n\n- `forge build`\n- `forge test`: 23 tests, including fuzz, invariants, and local Uniswap v4 integration\n- `forge fmt --check`\n- Manifest validation\n\nThe manifest uses mandatory `fee: 3000` (0.30%), overriding the conflicting 1.25% description. Factory allocation, SIMD creator-fee routing, and live-mainnet verification remain external launch responsibilities documented in `README.md`.","treeHash":"58325973558b2ddfd7d12bf2b5c2bc69d8e07da0","usage":{"cachedInputTokens":985856,"inputTokens":88483,"model":"gpt-6-astra","outputTokens":21284,"runtime":"codex","turns":6,"wallClockMs":586852}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"00920b27421b9a80","findings":[{"citation":"resolved","description":"First-principles assumption in the dividend design: every address counted in eligibleSupply() (src/PSSToken.sol:38) is a holder who can call claim(). The launch flow breaks it. The factory forwards 10% of the supply (100,000,000 PSS) to the launch's MerkleDistributor before seeding the pool; the distributor is a generic contract that only transfers claims and has no code path that calls PSSToken.claim(). It is not in the exclusion list, so it is an eligible holder, and since the pool's 900M sit in the excluded PoolManager and the remainder goes to the excluded burn address, right after launch the distributor is essentially the ONLY eligible holder. Every buy fee is therefore allocated almost entirely to the distributor's _accrued/_paidIndex checkpoint; that allocation is never claimable by anyone (forwarding tokens to a claimant does not forward the entitlement, by design: _accrue checkpoints the OLD balance). The PSS stays in the token contract with no recovery path. The share declines only as contributors and seats claim from the distributor, and whatever the distributor holds long-term (unclaimed seat shares) keeps capturing fees indefinitely. This contradicts the brief's guarantee that the 3% fee 'is distributed to holders pro rata ... holders claim their dividends at any time'. The reference for custom launches explicitly allows the token to take $factory and $launchNumber constructor arguments and to look up distributorOf(launchNumber) on the factory at transfer time; the minimal fix is to treat that distributor like the PoolManager (excluded in isExcludedFromDividends and subtracted in eligibleSupply). That changes launch.json token.constructorArgs from [] to [\"$factory\",\"$launchNumber\"], which is a scope decision for the requester; the README already documents the behaviour ('The external swarm distributor is an eligible holder while it holds tokens') but not its cost.","line":34,"path":"src/PSSToken.sol","reproduction":"State: fresh PSSToken; deployer sends 100,000,000e18 to a distributor contract D (any contract without a claim() call path), 900,000,000e18 to POOL_MANAGER, remainder to 0xdEaD. Call: vm.prank(POOL_MANAGER); token.transfer(BUYER, 1_000_000e18) (a buy of 1M PSS gross). Expected per brief: fee 30,000e18 distributed to claimable holders. Actual: totalFeesCollected = 30000000000000000000000; claimableDividends(D) = 29711795582846390016836 (9903 bps of the fee); claimableDividends(BUYER) = 288204417153609983163. BUYER claims 288.2e18; token contract still holds 29711795582846390016837 PSS that nobody can ever claim. Then D forwards all 100M to a claimant C: claimableDividends(D) stays 29711795582846390016836, claimableDividends(C) = 0. Test used: test/scratch/DistributorStranded.t.sol (passes on this code, i.e. the numbers above are observed).","severity":"medium","snippet":"        return account == POOL_MANAGER || account == address(this) || account == BURN_ADDRESS || account == address(0);","title":"Buy fees are allocated to the swarm's MerkleDistributor, which can never call claim(); at launch that is ~99% of every fee, stranded forever in the token contract"},{"citation":"resolved","description":"The fee is keyed on an ERC-20 transfer whose from-address is the PoolManager, which is what the authoritative mechanics ask for. Uniswap v4's flash accounting lets a swapper settle a positive PSS delta by minting ERC-6909 claims (manager.mint) instead of take(), and settle a negative PSS delta later by burning those claims (manager.burn) instead of transferring tokens in. In that mode no PSS ERC-20 transfer happens on either leg, so a speculator can buy PSS exposure and sell it back without ever paying the 3% buy fee the brief says 'applies to buys'. Holders earn nothing from that volume. The token cannot see claim mints, so there is no in-token fix; only a v4 hook on the pool (out of this token's scope) could tax claim-settled swaps. Documented here so the requester knows the 'fee on buys' guarantee is 'fee on PSS leaving the manager' in practice; the existing test test_RedeemingClaimsPaysTheFeeOnTheAmountTaken shows the eventual redemption is taxed, but the round trip that never redeems is not.","line":66,"path":"src/PSSToken.sol","reproduction":"State: vendored PoolManager constructed at 0x000000000004444c5dc75cB358380D2e3dE08A90, pair stub at 0xd34a...e263b7, PSSToken deployed with address < pair (currency0), pool initialised at sqrtPriceX96 125270724187523965593206900 and seeded single-sided with 90% of supply; 10% held by HOLDER. Trader (1e18 pair units): (1) unlock -> swap(zeroForOne=false, amountSpecified=-0.01e18) -> settle pair by transfer, settle PSS output by manager.mint(trader, id(PSS), gross). Observed gross = 3964663420314388146441 PSS as claims, totalFeesCollected = 0, token.balanceOf(token) = 0. (2) unlock -> swap(zeroForOne=true, -gross) -> settle PSS input by manager.burn(trader, id(PSS), gross), take pair out. Observed: claims balance 0, totalFeesCollected still 0, claimableDividends(HOLDER) = 0; the trader's only cost is the pool's own 0.3% (59909868636295 pair wei on the round trip). Expected per brief: a 3% fee on the buy leg. Control: the same 0.01e18 buy settled with take() records totalFeesCollected = gross2 * 3 / 100. Test used: test/scratch/ClaimsRoundTrip.t.sol.","severity":"low","snippet":"        if (from == POOL_MANAGER && to != POOL_MANAGER) {","title":"A buy-and-sell round trip done entirely in Uniswap v4 ERC-6909 claims never transfers PSS out of the PoolManager and so pays no 3% fee"},{"citation":"resolved","description":"Not a code defect: the mandatory build block ('launch.json pool: ... fee 3000, tickSpacing 60') is declared authoritative over the narrative, and the README and notes record that precedence. The requester should confirm this is intended, because the 'What it does' section (item 7) and test item 9 still say the Uniswap v4 pool fee is 1.25% (which would be fee 12500), and test item 10 asks for a 1% creator fee routed to $SIMD, which neither PSSToken nor the manifest implements (the token has no fee recipient and the launch fee split is the launchpad's). If the launchpad does not route that fee, the SIMD rule in test item 10 is unmet by anything in this repository.","line":14,"path":"launch.json","reproduction":"Read launch.json: pool.fee == 3000 (0.30%). Read the brief: 'The Uniswap v4 pool fee is fixed at 1.25%' and 'Confirm pool fee is 1.25% as set by the launchpad'. The existing tests test_SeedBuyAndSellWithPSSAsCurrency0 assert getSlot0(...).lpFee == 3000. grep -n SIMD src/ returns nothing: no creator-fee routing exists in the token.","severity":"info","snippet":"    \"fee\": 3000,","title":"Manifest pool fee is 3000 (0.30%) while the brief's narrative and test item 9 say 1.25%; the 1% creator fee to $SIMD is not implemented in the token"}],"hash":"cd2250be6ad4ea5acf44dafa2d2e78972b3c67aa30ef9e19d6ef222062677e50","nodeId":"b4c69f76-7e2a-4bb4-8ffc-0e7c6733db9b","outcome":"completed","summary":"The findings file is in place and excluded from git by the harness's own exclude rule, the scratch tests are removed, and no tracked file changed. The review is complete.\n\n**Outcome.** The token's control flow is sound in my area. Three findings are recorded in `.imd-findings.json`, one medium, one low, one informational, with an 8-row coverage record answering all four entry points.\n\n**Findings**\n\n- **Medium: fees stranded on the Merkle distributor.** The distributor holds 10% of supply at launch and is the only eligible holder, since the pool's 90% sits in the excluded PoolManager and the remainder goes to the burn address. The first buy of 1M PSS allocates 99.03% of its 30,000 PSS fee to the distributor, which has no path to call `claim()`. That PSS stays in the token contract forever. Forwarding the swarm tokens to claimants does not forward the entitlement. The fix the launch reference sanctions is taking `$factory` and `$launchNumber` as constructor arguments and excluding `distributorOf(launchNumber)`, which changes the manifest and is the requester's call.\n- **Low: ERC-6909 claims round trip pays no buy fee.** A swapper who settles PSS output as v4 claims and later burns them to sell never moves PSS out of the manager, so a complete buy-and-sell costs only the pool's 0.3%. The token cannot see this. Only a pool hook could, which is outside this token's scope.\n- **Info: manifest pool fee is 3000 while the brief narrative says 1.25%,** and the 1% creator fee to $SIMD is not implemented anywhere in this repository. The mandatory build block is declared authoritative, so this is a confirmation item, not a defect.\n\n**What held.** The fee branch, dividend index math, overflow bounds, reserve solvency, claim checkpointing, allowance handling on taxed transfers, untaxed sells and seed, the fixed supply, absence of admin surface and forbidden opcodes, the vendored OpenZeppelin base, and the build configuration all traced clean. All 52 existing tests pass, including the two invariant suites.\n\n**Not reached.** Live factory, distributor and router behaviour on mainnet, and the launchpad's creator-fee routing, which no offline test here can exercise.","treeHash":null,"usage":{"cachedInputTokens":1121856,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":31008,"runtime":"claude","turns":28,"wallClockMs":492182}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa5c50e7abe46571","findings":[{"citation":"resolved","description":"Economic Security / Flow Gap (periphery x first principles). The exclusion set is PoolManager, the token itself, the burn address and address(0). The launch factory forwards 10% of supply (100,000,000 PSS) to the launch's MerkleDistributor before seeding 90% into the PoolManager and burning the remainder, so immediately after launch the distributor is the ONLY eligible holder: eligibleSupply() = 100,000,000 PSS + whatever buyers have received. Every buy fee is split pro rata over that denominator, so the distributor is credited almost the whole fee. The distributor is a contract that only transfers Merkle claims; it has no code path that calls PSSToken.claim(), and claim() pays msg.sender only (no claimFor). Transferring tokens out of the distributor does not move earned dividends (_accrue checkpoints the old balance and keeps _accrued with the distributor). The credited PSS therefore sits in the token contract's reserve forever, counted as a liability nobody can collect. The same mechanism strands the share earned by routers/aggregators that take PoolManager output to themselves before forwarding (README line 21 acknowledges this) and by any CEX/bridge/LP contract that cannot call claim(). The stated purpose is that the 3% fee is 'distributed to holders'; in the launch's first phase it is effectively burned. Magnitude: with the distributor at 100M PSS, a 1,000,000 PSS gross buy pays a 30,000 PSS fee of which 29,711.8 PSS (99.03%) is credited to the distributor and 288.2 PSS to the buyer. The distributor's share only falls as contributors claim their Merkle allocations and as circulating supply grows, and the 8% paired-seat share can stay unclaimed indefinitely. Fix within the accepted design: exclude the launch distributor from dividends the way the custom-token-launch reference describes (constructor takes $factory and $launchNumber and the token consults factory.distributorOf(launchNumber) in isExcludedFromDividends/eligibleSupply), or give claim() a pull-for-account form so stranded credits can at least be pushed to the holder. Either changes the constructor signature or ABI, so it needs the requester's scope decision; the reproduction below does not depend on the fix shape.","line":34,"path":"src/PSSToken.sol","reproduction":"State: token deployed by F (factory), F.transfer(D, 100_000_000e18) where D is any contract without a claim() call path (the launch MerkleDistributor), F.transfer(POOL_MANAGER, 900_000_000e18), F holds 0. Call: vm.prank(POOL_MANAGER); token.transfer(BUYER, 1_000_000e18). Expected (purpose: fee goes to holders who can collect it): the 30_000e18 fee is claimable by holders. Actual: claimableDividends(D) = 29_711_795_582_846_390_016_836 (99.03% of the fee), claimableDividends(BUYER) = 288_204_417_153_609_983_163. D.pay(token, CLAIMANT, 100_000_000e18) afterwards leaves claimableDividends(D) unchanged and claimableDividends(CLAIMANT) = 0; no address can call claim() on D's behalf, so after BUYER claims, balanceOf(token) = 29_711_795_582_846_390_016_837 stays locked forever. Run: forge test --match-path test/scratch/DistributorStranding.t.sol -vv (passes on current code: it demonstrates the stranding; see logs).","severity":"medium","snippet":"        return account == POOL_MANAGER || account == address(this) || account == BURN_ADDRESS || account == address(0);","title":"Dividends credited to the launch Merkle distributor (and any other non-claiming contract holder) are permanently stranded; at launch the distributor is ~99% of eligible supply so ~99% of every early b"},{"citation":"resolved","description":"Flow Gap seam 1/2 (execution x periphery x first principles). The fee is keyed on an ERC-20 transfer whose `from` is the PoolManager. Uniswap v4's flash accounting lets the swapper settle a positive PSS delta with PoolManager.mint(to, currencyId, amount) (ERC-6909 claim tokens) instead of take(); no ERC-20 transfer happens, so _update never runs and no fee is charged. The next swap in the other direction settles the negative delta with PoolManager.burn(), again with no transfer. A trader (or an MEV/arbitrage bot, which is who does most of the volume on a memecoin pool) can therefore buy and sell PSS repeatedly paying only the pool's 0.3% LP fee, while the brief says 'a 3% fee applies to buys'. Holders lose the dividend income those buys were supposed to produce; the bot gains a 3% edge over any retail buyer using a router that takes to a wallet. Claim-token holders receive no dividends (the PoolManager balance is excluded), which is consistent, but the fee guarantee itself is void for anyone who wants to avoid it. The previous test suite notes this ('The untaxed in-manager round trip this permits is reported in .imd-findings.json rather than asserted here', test/UniswapV4Edges.t.sol:293), so the judge may treat it as a known, accepted limitation. The token alone cannot close it: only a pool hook (beforeSwap/afterSwap) sees ERC-6909 settlement, and the launch has no hooks, so closing it is a design/scope decision for the requester, not a token patch. Reported so the economics are stated with numbers rather than left implicit.","line":66,"path":"src/PSSToken.sol","reproduction":"State: launch shape (10% to a claimant, 90% seeded single-sided into the vendored PoolManager at 0x000000000004444c5dc75cB358380D2e3dE08A90, remainder burned), trader funded with 10 IMD-stub. Calls inside one unlock each: (1) swap IMD->PSS exact-in 1e18 with the positive PSS delta settled by manager.mint(trader, id(PSS), gross) instead of take; (2) swap PSS->IMD exact-in `gross` with the negative PSS delta settled by manager.burn(trader, id(PSS), gross). Expected per brief: 3% of the gross PSS bought (fee) lands in the token contract and is distributed to holders. Actual: token.totalFeesCollected() == 0, balanceOf(token) == 0, balanceOf(POOL_MANAGER) unchanged, claimableDividends(CLAIMANT) == 0, and the trader's whole round-trip cost is 5_989_686_933_869_303 wei of the pair currency (59 bps of 1e18), i.e. less than the 3% buy fee alone. Run: forge test --match-path test/scratch/ClaimsRoundTrip.t.sol -vv (passes on current code; it demonstrates the bypass).","severity":"medium","snippet":"        if (from == POOL_MANAGER && to != POOL_MANAGER) {","title":"Buys settled as Uniswap v4 ERC-6909 claims never pay the 3% fee: a trader can round-trip PSS in and out of the pool indefinitely with zero fee collected and zero dividends paid to holders"},{"citation":"resolved","description":"Execution x first principles. The brief says the 3% applies to buys; the implementation applies it to every transfer whose from is the PoolManager. v4 pays out LP fees and removed liquidity through take(), i.e. an ERC-20 transfer from the PoolManager, so the owner of the launch liquidity position (the factory) receives 97% of any PSS it collects, and the 3% is redistributed to holders. Protocol-fee collection by Uniswap governance (collectProtocolFees, if ever enabled on this pool) is taxed the same way. Nothing reverts because take() does not verify receipt, and the README documents the behaviour, so impact is a predictable 3% leak on non-buy outflows rather than a broken flow. It is reported because the 'buys only' guarantee in the brief is not what ships and the launch operator should know its LP-fee take is net of 3%.","line":13,"path":"README.md","reproduction":"State: launch fixture from test/UniswapV4Edges.t.sol (_launch(true)). Call: factory.modifyLiquidity(key, lower, upper, -int256(liquidity/10)). Expected per brief ('fee applies only to buys'): factory receives the full PSS amount the pool pays out. Actual: factory receives gross - gross*3/100, token.totalFeesCollected() == gross*3/100 and claimableDividends(CLAIMANT) increases. This is exactly what the existing test test_LiquidityWithdrawalByFactoryIsTaxedAsAManagerOutflow asserts (forge test --match-test test_LiquidityWithdrawalByFactoryIsTaxedAsAManagerOutflow).","severity":"low","snippet":"The fixed PoolManager address is `0x000000000004444c5dc75cB358380D2e3dE08A90`. The rule uses the ERC-20 **from** address, including for `transferFrom`, regardless of the caller. Allowances are spent against the gross amount. The address rule also taxes manager withdrawals unrelated to swaps, such as liquidity removal; the token does not inspect swap intent or pool IDs. Other pools or transfer paths do not trigger this fee.","title":"Any PoolManager outflow that is not a buy (liquidity removal, LP-fee collection, protocol-fee collection) is taxed 3% and pays holders; the launch position's own fee collection in PSS arrives 3% short"},{"citation":"resolved","description":"Economics scope gap, not a code defect. The brief's test list items 9 and 10 ask to confirm a 1.25% pool fee and a 1% creator fee routed to $SIMD. The mandatory build requirements fix the pool fee at 3000 (0.30%), which launch.json and the code follow, so the 1.25% figure is superseded. The 1% creator fee has no $SIMD recipient address anywhere in the brief and no contract here collects or routes it; README and launch.json notes state it is the launchpad's responsibility. If the requester expects it in-token, it is missing; if it is launchpad-side, it needs confirmation outside this repository. No reproduction beyond grep: `grep -rn SIMD src/` returns nothing.","line":44,"path":"README.md","reproduction":"grep -rn 'SIMD' src/ launch.json README.md: src/ has no match; README.md:44 and the launch.json notes disclaim it. Expected per brief item 10: a 1% creator fee reaches $SIMD. Actual: no code path sends anything to any address other than holders via claim().","severity":"info","snippet":"The requested **1% creator-fee routing to $SIMD** is the launchpad's responsibility, separate from this token's holder dividends and the manifest's mandatory pool fee. This repository does not deploy the launchpad, configure its revenue recipient, deduct that fee, or claim to verify its routing. The network deployer must confirm that routing on the external launchpad before release. No missing recipient address is guessed or embedded here.","title":"Brief items not delivered by the token and resolved only in prose: 1% creator fee to $SIMD is absent, and pool fee is 0.30% (3000) not the 1.25% in the brief"}],"hash":"e03b8385ede2e9ac1b5f8229d2805f61cb1154cbb44d18b3e13f08bdec12789e","nodeId":"ab203d47-babb-4198-9085-b69c6364c432","outcome":"completed","summary":"The findings file is written and verified. The review is complete; here is the recap.\n\n**Outcome.** The Economic Security, Invariant and Flow Gap passes found no fund-loss bug in the dividend arithmetic. The accounting conserves supply, the reserve always covers claimable plus queued dividends, excluded addresses never accrue, and sells and the pool seed settle exactly against the vendored v4 PoolManager. The existing 52-test suite passes. Four findings are recorded in `.imd-findings.json`, all with reproductions and exact snippets. Two are medium, one low, one info.\n\n**Findings**\n\n1. **Medium. Dividends stranded on the launch distributor.** The Merkle distributor holds 100M PSS at launch and is the only eligible holder, but it has no way to call claim, and claim pays msg.sender only. My scratch test shows the first 1M PSS buy credits 99.03% of its 30,000 PSS fee to the distributor, where it stays locked forever. Moving the tokens out later does not move the credit. The reference describes a fix within the accepted design (constructor takes factory and launch number, token consults distributorOf), but that changes the constructor, so it is the requester's call.\n\n2. **Medium. ERC-6909 claim settlement bypasses the buy fee.** A trader who settles swap output with PoolManager.mint and sells with PoolManager.burn never triggers a transfer from the manager. My scratch test round-trips 1 IMD for 59 bps total cost with zero fee collected and zero dividends. An earlier reviewer already flagged this, so the judge may treat it as accepted. Only a pool hook could close it.\n\n3. **Low. Non-buy outflows are taxed.** Liquidity removal and LP-fee collection by the launch position owner arrive 3% short. Documented in the README and asserted by an existing test, but it contradicts the brief's \"buys only\".\n\n4. **Info. Brief items not in the token.** No 1% creator fee to $SIMD exists anywhere in the code, and the pool fee is 0.30% per the mandatory requirements rather than the brief's 1.25%.\n\n**Coverage.** All four entry points have rows (approve and transferFrom hold; claim and transfer carry findings 1 and 2). Eight invariant and economics rows also hold, including overflow bounds on the index, the sandwich-on-fee economics, and the provenance price against the 2500 IMD cap.\n\n**Not reached.** Live-state checks against mainnet (real factory, real distributor code, Universal Router take behaviour) are owed and cannot run here. The two scratch tests under `test/scratch/` pass on current code as demonstrations and are not kept.","treeHash":null,"usage":{"cachedInputTokens":1018718,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":37477,"runtime":"claude","turns":26,"wallClockMs":630128}}],"verification":[{"checks":[{"durationMs":24071,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 23.94s\nCompiler run successful!\n","passed":true},{"durationMs":4714,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency0() (gas: 1277153)\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency1() (gas: 1283462)\n[PASS] test_UnderpaidSellRevertsCurrencyNotSettled() (gas: 1474104)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.27ms (3.60ms CPU time)\n\nRan 6 tests for test/UniswapV4Edges.t.sol:UniswapV4EdgesTest\n[PASS] test_ExactOutputBuyDeliversNetOfFeeWithPSSAsCurrency0() (gas: 1253638)\n[PASS] test_ExactOutputBuyDeliversNetOfFeeWithPSSAsCurrency1() (gas: 1258746)\n[PASS] test_InterleavedTradersAccrueExactlyTheFeesAndCanAllClaim() (gas: 2434704)\n[PASS] test_LiquidityWithdrawalByFactoryIsTaxedAsAManagerOutflow() (gas: 1005195)\n[PASS] test_OutputTakenToRouterIsTaxedOnceAndRouterKeepsTheDividend() (gas: 1604208)\n[PASS] test_RedeemingClaimsPaysTheFeeOnTheAmountTaken() (gas: 1188833)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 81.51ms (7.63ms CPU time)\n\nRan 21 tests for test/PSSToken.t.sol:PSSTokenTest\n[PASS] testFuzz_BuyConservesSupplyAndReserves(uint256) (runs: 1000, μ: 472916, ~: 494060)\nLogs:\n  Bound result 3000\n\n[PASS] test_BuySplitsFeeAndEmitsActualTransfers() (gas: 233976)\n[PASS] test_ConstructorMintsEntireManifestSupplyOnlyToDeployer() (gas: 83469)\n[PASS] test_DirectDonationsAreNotMistakenForFees() (gas: 91606)\n[PASS] test_ExcludedBalancesNeverEarnOrClaim() (gas: 485103)\n[PASS] test_FactoryAllocationAndDistributorClaimArriveWhole() (gas: 231133)\n[PASS] test_FailedTransferRollsBackAllowanceAndDividends() (gas: 538651)\n[PASS] test_FutureDividendsFollowCurrentBalancesIncludingPriorClaims() (gas: 566682)\n[PASS] test_InfiniteAllowanceAndDelegatedSell() (gas: 191859)\n[PASS] test_NoAdminMintBurnOrFeeSetterSelectors() (gas: 830850)\n[PASS] test_NoEligibleSupplyQueuesUntilNextTaxedBuy() (gas: 452854)\n[PASS] test_PostBuyProRataDividendsAndClaims() (gas: 566911)\n[PASS] test_RevertsOnZeroRecipientAndInsufficientBalance() (gas: 158231)\n[PASS] test_RuntimeHasNoForbiddenOpcodesAndFitsDeploymentLimit() (gas: 1226342)\n[PASS] test_SalesWalletTransfersAndManagerSelfTransfersAreUntaxed() (gas: 238799)\n[PASS] test_SellerKeepsEarnedDividendsAndNewHolderCannotClaimHistory() (gas: 682526)\n[PASS] test_SubWeiAccrualSurvivesZeroTransfersAndEmptyClaims() (gas: 887326)\n[PASS] test_TransferDoesNotTransferPastDividends() (gas: 593057)\n[PASS] test_TransferFromUsesFromAddressForFeeAndSpendsGrossAllowance() (gas: 442402)\n[PASS] test_UnauthorizedTransferFromFailsEvenForDeployer() (gas: 98760)\n[PASS] test_ZeroTinyAndSelfTransfersPreserveAccounting() (gas: 664174)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 124.71ms (69.06ms CPU time)\n\nRan 20 tests for test/PSSTokenEdges.t.sol:PSSTokenEdgesTest\n[PASS] testFuzz_BuyViaAllowanceNeedsGrossAllowance(uint256,uint256) (runs: 1000, μ: 216967, ~: 206161)\nLogs:\n  Bound result 15744\n  Bound result 123456789\n\n[PASS] testFuzz_ProRataSplitWithinOneUnit(uint256,uint256,uint256,uint256) (runs: 1000, μ: 741264, ~: 753749)\nLogs:\n  Bound result 200375376417456863632747\n  Bound result 100000000000000000000000000\n  Bound result 75997469948743798086926984\n  Bound result 63963091125581845541368410\n\n[PASS] testFuzz_RepeatedBuysAndClaimsNeverOverpay(uint256,uint8) (runs: 500, μ: 1888946, ~: 1319359)\nLogs:\n  Bound result 6\n  Bound result 0\n  Bound result 489305350171223633420621\n  Bound result 495535739361782089199631\n\n[PASS] testFuzz_WalletTransfersAndSellsNeverPayAFee(address,address,uint256) (runs: 1000, μ: 270180, ~: 271204)\nLogs:\n  Bound result 968075081491638796729567948\n\n[PASS] test_BuyOfEntireManagerBalanceLeavesManagerEmpty() (gas: 350905)\n[PASS] test_BuyRoutedToTokenContractDistributesOnlyTheFee() (gas: 405531)\n[PASS] test_ClaimedTokensCanBeSoldUntaxedAndBoughtBackTaxed() (gas: 630822)\n[PASS] test_ConstantsMatchTheBriefAndExclusionsAreFixed() (gas: 99272)\n[PASS] test_ContractHolderClaimsWithoutCallbacks() (gas: 659815)\n[PASS] test_DividendsDistributedEventReportsPostTransferEligibleSupply() (gas: 318709)\n[PASS] test_FeeBoundaryAtThirtyFourMinorUnits() (gas: 537766)\n[PASS] test_HolderWhoExitsEarnsNothingWhileAwayAndResumesOnReturn() (gas: 787370)\n[PASS] test_IntermediaryKeepsDividendsEarnedWhileHolding() (gas: 627848)\n[PASS] test_ManyHoldersClaimEverythingButDust() (gas: 9034649)\n[PASS] test_NoPrivilegedSelectorMovesOrFreezesAHolder() (gas: 835940)\n[PASS] test_QueuedFeesFlushOnNextTaxedBuyEvenToExcludedRecipient() (gas: 489604)\n[PASS] test_RejectsEtherAndUnknownCalldata() (gas: 82277)\n[PASS] test_RevertWhen_ApproveZeroSpender() (gas: 30685)\n[PASS] test_RevertWhen_BuyAllowanceCoversOnlyTheNetAmount() (gas: 170042)\n[PASS] test_ViewMatchesClaimAfterCheckpoints() (gas: 627137)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 134.13ms (376.00ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS] invariant_SupplyEntitlementsAndFeeReserveAreConserved() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| DividendHandler | buy      | 5435  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | claim    | 5454  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | move     | 5495  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 6960\n  Bound result 502687672851581421123110172\n  Bound result 6976\n  Bound result 3325\n  Bound result 132\n  Bound result 5268510195184395993616696\n  Bound result 2636\n  Bound result 125270724187523965593206900\n  Bound result 774729275812476034406780028\n  Bound result 1275\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 10000000000000000\n  Bound result 1\n  Bound result 14\n  Bound result 28\n  Bound result 6\n  Bound result 4096\n  Bound result 1925\n  Bound result 1633\n  Bound result 179\n  Bound result 14\n  Bound result 1\n  Bound result 253\n  Bound result 19\n  Bound result 97\n  Bound result 2677\n  Bound result 1970000000000000000000\n  Bound result 4349\n  Bound result 658024572872830409056\n  Bound result 1867\n  Bound result 4096\n  Bound result 1046636853806754389244\n  Bound result 6099\n  Bound result 25\n  Bound result 3282\n  Bound result 64960323800764907560\n  Bound result 180462413923730710770\n  Bound result 132\n  Bound result 2\n  Bound result 5881\n  Bound result 2250530848372633144\n  Bound result 10182482373635700740799317\n  Bound result 34\n  Bound result 28119505089232374869564191\n  Bound result 14\n  Bound result 1000000000000000\n  Bound result 0\n  Bound result 123456789012345678901\n  Bound result 6954255085040503915854047\n  Bound result 10000000000000000\n  Bound result 7259391823403198289477287\n  Bound result 333000000000000000000\n  Bound result 3566\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.45s (2.45s CPU time)\n\nRan 1 test for test/PSSLedgerInvariant.t.sol:PSSLedgerInvariantTest\n[PASS]\nPSSLedgerInvariantTest invariants:\n[PASS] invariant_EveryBalanceMatchesTheGhostLedger\n[PASS] invariant_ExcludedAddressesNeverHaveDividends\n[PASS] invariant_FeesAreCollectedOnceAndNeverOverpaid\n PSSLedgerInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+---------------------+-------+---------+----------╮\n| Contract      | Selector            | Calls | Reverts | Discards |\n+==================================================================+\n| LedgerHandler | buy                 | 2735  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | claim               | 2728  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | managerSelfTransfer | 2706  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | move                | 2746  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | roundTrip           | 2792  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | sell                | 2677  | 0       | 0        |\n╰---------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6340\n  Bound result 2\n  Bound result 1117\n  Bound result 333000000000000000000\n  Bound result 170585\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 9624\n  Bound result 223415385487191685178194986\n  Bound result 257065578801342348822196427\n  Bound result 38800000000000000000000\n  Bound result 182410205437673686033549832\n  Bound result 300000000000000000001\n  Bound result 5224\n  Bound result 813\n  Bound result 600000000000000000000000000\n  Bound result 40262680178832733430496022\n  Bound result 48693779\n  Bound result 100000000000000000000000000\n  Bound result 165467\n  Bound result 128\n  Bound result 244\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 2233625730\n  Bound result 666\n  Bound result 5893020\n  Bound result 0\n  Bound result 2009\n  Bound result 1998\n  Bound result 1258192927260899260694662\n  Bound result 1005\n  Bound result 37516852387229173349127841\n  Bound result 0\n  Bound result 336\n  Bound result 8815\n  Bound result 10391\n  Bound result 33\n  Bound result 125270724187523965593206900\n  Bound result 100\n  Bound result 404507654302693291\n  Bound result 3662\n  Bound result 12345000000000000000000\n  Bound result 2\n  Bound result 831407496600429078853998921\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.61s (4.61s CPU time)\n\nRan 6 test suites in 4.61s (7.40s CPU time): 52 tests passed, 0 failed, 0 skipped (52 total tests)\n","passed":true},{"durationMs":42,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PSSToken.approve(address,uint256)\",\"PSSToken.claim()\",\"PSSToken.transfer(address,uint256)\",\"PSSToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":13,\"README.md\":66,\"foundry.toml\":12,\"launch.json\":24,\"remappings.txt\":5,\"src/PSSToken.sol\":106,\"test/DividendInvariant.t.sol\":116,\"test/PSSLedgerInvariant.t.sol\":253,\"test/PSSToken.t.sol\":354,\"test/PSSTokenEdges.t.sol\":551,\"test/UniswapV4.t.sol\":229,\"test/UniswapV4Edges.t.sol\":425,\"tools/check_launch.py\":45},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"0a82238355ceeea8622b9e22a8a6ab973f84781727d681a7e15b43012166c083","verifiedTreeHash":"5a93cfb31217688353c7adf29025c65809692a88","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":26493,"exitCode":0,"name":"build","output":"Compiling 79 files with Solc 0.8.26\nSolc 0.8.26 finished in 26.36s\nCompiler run successful!\n","passed":true},{"durationMs":4613,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency0() (gas: 1217198)\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency1() (gas: 1223990)\n[PASS] test_UnderpaidSellRevertsCurrencyNotSettled() (gas: 1371569)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 75.90ms (2.70ms CPU time)\n\nRan 6 tests for test/UniswapV4Edges.t.sol:UniswapV4EdgesTest\n[PASS] test_ExactOutputBuyDeliversNetOfFeeWithPSSAsCurrency0() (gas: 1234321)\n[PASS] test_ExactOutputBuyDeliversNetOfFeeWithPSSAsCurrency1() (gas: 1239929)\n[PASS] test_InterleavedTradersAccrueExactlyTheFeesAndCanAllClaim() (gas: 2440641)\n[PASS] test_LiquidityWithdrawalByFactoryIsTaxedAsAManagerOutflow() (gas: 1028499)\n[PASS] test_OutputTakenToRouterIsTaxedOnceAndLaterDividendsStayWithRouter() (gas: 1827925)\n[PASS] test_RedeemingClaimsPaysTheFeeOnTheAmountTaken() (gas: 1552107)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 78.71ms (8.89ms CPU time)\n\nRan 21 tests for test/PSSToken.t.sol:PSSTokenTest\n[PASS] testFuzz_BuyConservesSupplyAndReserves(uint256) (runs: 1000, μ: 446055, ~: 460848)\nLogs:\n  Bound result 4096\n\n[PASS] test_BuySplitsFeeAndEmitsActualTransfers() (gas: 257216)\n[PASS] test_ConstructorMintsEntireManifestSupplyOnlyToDeployer() (gas: 83491)\n[PASS] test_DirectDonationsAreNotMistakenForFees() (gas: 91606)\n[PASS] test_ExcludedBalancesNeverEarnOrClaim() (gas: 485425)\n[PASS] test_FactoryAllocationAndDistributorClaimArriveWhole() (gas: 231133)\n[PASS] test_FailedTransferRollsBackAllowanceAndDividends() (gas: 517293)\n[PASS] test_FutureDividendsFollowCurrentBalancesIncludingPriorClaims() (gas: 590116)\n[PASS] test_InfiniteAllowanceAndDelegatedSell() (gas: 191859)\n[PASS] test_NoAdminMintBurnOrFeeSetterSelectors() (gas: 831620)\n[PASS] test_NoEligibleSupplyQueuesUntilNextTaxedBuy() (gas: 597596)\n[PASS] test_PreBuyProRataDividendsAndClaims() (gas: 590286)\n[PASS] test_RevertsOnZeroRecipientAndInsufficientBalance() (gas: 158231)\n[PASS] test_RuntimeHasNoForbiddenOpcodesAndFitsDeploymentLimit() (gas: 1246283)\n[PASS] test_SalesWalletTransfersAndManagerSelfTransfersAreUntaxed() (gas: 238799)\n[PASS] test_SellerKeepsEarnedDividendsAndNewHolderCannotClaimHistory() (gas: 663197)\n[PASS] test_SubWeiAccrualSurvivesZeroTransfersAndEmptyClaims() (gas: 888290)\n[PASS] test_TransferDoesNotTransferPastDividends() (gas: 616326)\n[PASS] test_TransferFromUsesFromAddressForFeeAndSpendsGrossAllowance() (gas: 423044)\n[PASS] test_UnauthorizedTransferFromFailsEvenForDeployer() (gas: 98760)\n[PASS] test_ZeroTinyAndSelfTransfersPreserveAccounting() (gas: 696304)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 126.15ms (81.00ms CPU time)\n\nRan 6 tests for test/DividendRevision.t.sol:DividendRevisionTest\n[PASS] test_BuyerEarnsOnlyForTokensHeldBeforeItsBuy() (gas: 494613)\n[PASS] test_ClaimForExcludedAndEmptyAccountsReturnsZero() (gas: 483176)\n[PASS] test_ClaimForPaysOnlyBeneficiaryAndNewBalanceEarnsOnlyFutureFees() (gas: 634391)\n[PASS] test_EmptyFloatBuyQueuesFeeWithoutRebatingNewBuyer() (gas: 427918)\n[PASS] test_EmptyThirdPartyClaimsPreserveFractionalEntitlements() (gas: 872132)\n[PASS] test_ThirdPartyCanReleaseDistributorDividendsAfterAllocationLeaves() (gas: 793075)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 130.16ms (2.46ms CPU time)\n\nRan 20 tests for test/PSSTokenEdges.t.sol:PSSTokenEdgesTest\n[PASS] testFuzz_BuyViaAllowanceNeedsGrossAllowance(uint256,uint256) (runs: 1000, μ: 228017, ~: 206238)\nLogs:\n  Bound result 37254886087097241245243112\n  Bound result 6917982837\n\n[PASS] testFuzz_ProRataSplitWithinOneUnit(uint256,uint256,uint256,uint256) (runs: 1000, μ: 741941, ~: 754050)\nLogs:\n  Bound result 63562673597207104935049031\n  Bound result 89\n  Bound result 65887585352999842897822719\n  Bound result 526841292859883444460279730\n\n[PASS] testFuzz_RepeatedBuysAndClaimsNeverOverpay(uint256,uint8) (runs: 500, μ: 1989411, ~: 1624505)\nLogs:\n  Bound result 1\n  Bound result 0\n\n[PASS] testFuzz_WalletTransfersAndSellsNeverPayAFee(address,address,uint256) (runs: 1000, μ: 269687, ~: 271144)\nLogs:\n  Bound result 19577\n\n[PASS] test_BuyOfEntireManagerBalanceLeavesManagerEmpty() (gas: 620464)\n[PASS] test_BuyRoutedToTokenContractDistributesOnlyTheFee() (gas: 405748)\n[PASS] test_ClaimedTokensCanBeSoldUntaxedAndBoughtBackTaxed() (gas: 637167)\n[PASS] test_ConstantsMatchTheBriefAndExclusionsAreFixed() (gas: 99316)\n[PASS] test_ContractHolderClaimsWithoutCallbacks() (gas: 660094)\n[PASS] test_DividendsDistributedEventReportsPreBuyEligibleSupply() (gas: 372366)\n[PASS] test_FeeBoundaryAtThirtyFourMinorUnits() (gas: 547206)\n[PASS] test_HolderWhoExitsEarnsNothingWhileAwayAndResumesOnReturn() (gas: 787834)\n[PASS] test_IntermediaryKeepsDividendsEarnedWhileHolding() (gas: 918793)\n[PASS] test_ManyHoldersClaimEverythingButDust() (gas: 9036001)\n[PASS] test_NoPrivilegedSelectorMovesOrFreezesAHolder() (gas: 836556)\n[PASS] test_QueuedFeesFlushOnNextTaxedBuyEvenToExcludedRecipient() (gas: 490041)\n[PASS] test_RejectsEtherAndUnknownCalldata() (gas: 82299)\n[PASS] test_RevertWhen_ApproveZeroSpender() (gas: 30685)\n[PASS] test_RevertWhen_BuyAllowanceCoversOnlyTheNetAmount() (gas: 170042)\n[PASS] test_ViewMatchesClaimAfterCheckpoints() (gas: 650406)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 130.20ms (375.23ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS] invariant_SupplyEntitlementsAndFeeReserveAreConserved() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| DividendHandler | buy      | 5486  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | claim    | 5455  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | move     | 5443  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 29100000000000000000000\n  Bound result 899999999999999999999999998\n  Bound result 1\n  Bound result 0\n  Bound result 2552\n  Bound result 6141\n  Bound result 20000000000000000\n  Bound result 1052\n  Bound result 2963\n  Bound result 7136\n  Bound result 33\n  Bound result 805\n  Bound result 6606\n  Bound result 10000000000000000\n  Bound result 7961\n  Bound result 828417\n  Bound result 3910\n  Bound result 786\n  Bound result 25000000000000000000000000\n  Bound result 2462\n  Bound result 3\n  Bound result 803\n  Bound result 12155893490835351752313313\n  Bound result 18\n  Bound result 828417\n  Bound result 5442\n  Bound result 3468\n  Bound result 30\n  Bound result 535\n  Bound result 3\n  Bound result 17\n  Bound result 22116584369620147452947402\n  Bound result 760276845580033108461570016\n  Bound result 400\n  Bound result 4220\n  Bound result 10000000000000000\n  Bound result 1965\n  Bound result 123000000000000000000\n  Bound result 988\n  Bound result 1\n  Bound result 25\n  Bound result 1725540767\n  Bound result 1426\n  Bound result 2491\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.29s (2.29s CPU time)\n\nRan 2 tests for test/PSSLedgerInvariant.t.sol:PSSLedgerInvariantTest\n[PASS]\nPSSLedgerInvariantTest invariants:\n[PASS] invariant_EveryBalanceMatchesTheGhostLedger\n[PASS] invariant_ExcludedAddressesNeverHaveDividends\n[PASS] invariant_FeesAreCollectedOnceAndNeverOverpaid\n PSSLedgerInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+---------------------+-------+---------+----------╮\n| Contract      | Selector            | Calls | Reverts | Discards |\n+==================================================================+\n| LedgerHandler | buy                 | 2704  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | claim               | 2656  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | managerSelfTransfer | 2744  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | move                | 2762  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | roundTrip           | 2849  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | sell                | 2669  | 0       | 0        |\n╰---------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 3000000000000000000000000\n  Bound result 0\n  Bound result 10298\n  Bound result 1970000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 4091\n  Bound result 750051377374858869270669983\n  Bound result 499543954\n  Bound result 149858563525141130729319596\n  Bound result 13169532044176332035265163\n  Bound result 8683\n  Bound result 313696380\n  Bound result 3662\n  Bound result 1\n  Bound result 6925\n  Bound result 6223687271320426501706\n  Bound result 0\n  Bound result 7512\n  Bound result 1000000000000000000000\n  Bound result 20567462540081946083805540\n  Bound result 4181\n  Bound result 6000000000000000000\n  Bound result 0\n  Bound result 9536\n  Bound result 1\n  Bound result 967870153780016235083067107\n  Bound result 296073628367091384187811957\n  Bound result 191002946234483479584354383\n  Bound result 9700000000000000000000\n  Bound result 477813561006855109856911588\n  Bound result 917\n  Bound result 19907220310807016199384538\n  Bound result 9152\n  Bound result 11215\n  Bound result 128792332920871429742451126\n  Bound result 0\n  Bound result 4532\n  Bound result 16\n  Bound result 593\n  Bound result 9136\n  Bound result 659918\n  Bound result 0\n  Bound result 200000000000000000000\n  Bound result 0\n  Bound result 66\n  Bound result 2357142857142857142\n  Bound result 0\n  Bound result 6223\n  Bound result 700000000000000000000\n\n[PASS] test_EmptyFloatRoundTripDoesNotCountQueuedFeesAsDistributed() (gas: 1925262)\nLogs:\n  Bound result 0\n  Bound result 300\n  Bound result 1000\n  Bound result 1000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.52s (4.52s CPU time)\n\nRan 7 test suites in 4.52s (7.35s CPU time): 59 tests passed, 0 failed, 0 skipped (59 total tests)\n","passed":true},{"durationMs":57,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PSSToken.approve(address,uint256)\",\"PSSToken.claim()\",\"PSSToken.claimFor(address)\",\"PSSToken.transfer(address,uint256)\",\"PSSToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":13,\"README.md\":69,\"foundry.toml\":12,\"launch.json\":24,\"remappings.txt\":5,\"src/PSSToken.sol\":117,\"test/DividendInvariant.t.sol\":121,\"test/DividendRevision.t.sol\":139,\"test/PSSLedgerInvariant.t.sol\":282,\"test/PSSToken.t.sol\":358,\"test/PSSTokenEdges.t.sol\":578,\"test/UniswapV4.t.sol\":230,\"test/UniswapV4Edges.t.sol\":452,\"tools/check_launch.py\":45},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"20611945a81717d34bc6723fd523f1a24b01c66c0d4b8b0cb58cc868a660ded2","verifiedTreeHash":"cff4afd3d1c54183464a4794d76db2fa55eb0c00","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":15558,"exitCode":0,"name":"build","output":"Compiling 76 files with Solc 0.8.26\nSolc 0.8.26 finished in 15.42s\nCompiler run successful!\n","passed":true},{"durationMs":2696,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency0() (gas: 1217198)\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency1() (gas: 1223990)\n[PASS] test_UnderpaidSellRevertsCurrencyNotSettled() (gas: 1371569)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.74ms (2.71ms CPU time)\n\nRan 6 tests for test/DividendRevision.t.sol:DividendRevisionTest\n[PASS] test_BuyerEarnsOnlyForTokensHeldBeforeItsBuy() (gas: 494613)\n[PASS] test_ClaimForExcludedAndEmptyAccountsReturnsZero() (gas: 483176)\n[PASS] test_ClaimForPaysOnlyBeneficiaryAndNewBalanceEarnsOnlyFutureFees() (gas: 634391)\n[PASS] test_EmptyFloatBuyQueuesFeeWithoutRebatingNewBuyer() (gas: 427918)\n[PASS] test_EmptyThirdPartyClaimsPreserveFractionalEntitlements() (gas: 872132)\n[PASS] test_ThirdPartyCanReleaseDistributorDividendsAfterAllocationLeaves() (gas: 793075)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.75ms (2.14ms CPU time)\n\nRan 21 tests for test/PSSToken.t.sol:PSSTokenTest\n[PASS] testFuzz_BuyConservesSupplyAndReserves(uint256) (runs: 1000, μ: 447469, ~: 460836)\nLogs:\n  Bound result 19425\n\n[PASS] test_BuySplitsFeeAndEmitsActualTransfers() (gas: 257216)\n[PASS] test_ConstructorMintsEntireManifestSupplyOnlyToDeployer() (gas: 83491)\n[PASS] test_DirectDonationsAreNotMistakenForFees() (gas: 91606)\n[PASS] test_ExcludedBalancesNeverEarnOrClaim() (gas: 485425)\n[PASS] test_FactoryAllocationAndDistributorClaimArriveWhole() (gas: 231133)\n[PASS] test_FailedTransferRollsBackAllowanceAndDividends() (gas: 517293)\n[PASS] test_FutureDividendsFollowCurrentBalancesIncludingPriorClaims() (gas: 590116)\n[PASS] test_InfiniteAllowanceAndDelegatedSell() (gas: 191859)\n[PASS] test_NoAdminMintBurnOrFeeSetterSelectors() (gas: 831620)\n[PASS] test_NoEligibleSupplyQueuesUntilNextTaxedBuy() (gas: 597596)\n[PASS] test_PreBuyProRataDividendsAndClaims() (gas: 590286)\n[PASS] test_RevertsOnZeroRecipientAndInsufficientBalance() (gas: 158231)\n[PASS] test_RuntimeHasNoForbiddenOpcodesAndFitsDeploymentLimit() (gas: 1246283)\n[PASS] test_SalesWalletTransfersAndManagerSelfTransfersAreUntaxed() (gas: 238799)\n[PASS] test_SellerKeepsEarnedDividendsAndNewHolderCannotClaimHistory() (gas: 663197)\n[PASS] test_SubWeiAccrualSurvivesZeroTransfersAndEmptyClaims() (gas: 888290)\n[PASS] test_TransferDoesNotTransferPastDividends() (gas: 616326)\n[PASS] test_TransferFromUsesFromAddressForFeeAndSpendsGrossAllowance() (gas: 423044)\n[PASS] test_UnauthorizedTransferFromFailsEvenForDeployer() (gas: 98760)\n[PASS] test_ZeroTinyAndSelfTransfersPreserveAccounting() (gas: 696304)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 26.65ms (36.74ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS] invariant_SupplyEntitlementsAndFeeReserveAreConserved() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| DividendHandler | buy      | 5312  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | claim    | 5484  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | move     | 5588  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 300000000000000000001\n  Bound result 3000000000000000000\n  Bound result 8297680156234338916309690\n  Bound result 1\n  Bound result 1264\n  Bound result 1858\n  Bound result 18\n  Bound result 1266\n  Bound result 853693307433613786809421\n  Bound result 3223\n  Bound result 2886\n  Bound result 30000000000000000000\n  Bound result 242\n  Bound result 6614\n  Bound result 407228908486519527229015182\n  Bound result 6000000000000000000\n  Bound result 2500000000000000000\n  Bound result 238213446902980053605170736\n  Bound result 7227087817153885308085524\n  Bound result 19400000000000000000000\n  Bound result 9\n  Bound result 306940847499228526879560157\n  Bound result 11012490713721056198584312\n  Bound result 5366\n  Bound result 1299658497044939616679289\n  Bound result 325813131042198418224040358\n  Bound result 111485798850585380514816035\n  Bound result 2092\n  Bound result 659918\n  Bound result 2511\n  Bound result 151766866732084334826820204\n  Bound result 2641888517896922519027653\n  Bound result 659918\n  Bound result 5011\n  Bound result 29100000000000000000000\n  Bound result 2923\n  Bound result 9\n  Bound result 495790613315\n  Bound result 4\n  Bound result 3000000000000000000\n  Bound result 3508\n  Bound result 2142857142857142857\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.59s (2.59s CPU time)\n\nRan 4 test suites in 2.59s (2.62s CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":63,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PSSToken.approve(address,uint256)\",\"PSSToken.claim()\",\"PSSToken.claimFor(address)\",\"PSSToken.transfer(address,uint256)\",\"PSSToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":13,\"README.md\":69,\"foundry.toml\":12,\"launch.json\":24,\"remappings.txt\":5,\"src/PSSToken.sol\":117,\"test/DividendInvariant.t.sol\":121,\"test/DividendRevision.t.sol\":139,\"test/PSSToken.t.sol\":358,\"test/UniswapV4.t.sol\":230,\"tools/check_launch.py\":45},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":795,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":274,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/PSSToken.sol:10: Large Numeric Literal (2 places)\n[low] unused-public-function at src/PSSToken.sol:42: Public Function Not Used Internally","passed":true},{"durationMs":1817,"exitCode":0,"name":"proof eeeb46e33493","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.27s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-f3af20f2/Proof_eeeb46e33493.t.sol:BuyerSelfRebateTest\n[PASS] test_BuyerDoesNotEarnFromItsOwnBuyFee() (gas: 201140)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 460.25µs (123.84µs CPU time)\n\nRan 1 test suite in 3.50ms (460.25µs CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2a65c9e150805a38e050fdc374c6cc0f334ca166d21a95a32be02fa965d93318","verifiedTreeHash":"2503d9c6334f3b699db1a016a147b6ede3544b3f","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":23952,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 23.83s\nCompiler run successful!\n","passed":true},{"durationMs":4575,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency0() (gas: 1277153)\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency1() (gas: 1283462)\n[PASS] test_UnderpaidSellRevertsCurrencyNotSettled() (gas: 1474104)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 141.70ms (2.56ms CPU time)\n\nRan 6 tests for test/UniswapV4Edges.t.sol:UniswapV4EdgesTest\n[PASS] test_ExactOutputBuyDeliversNetOfFeeWithPSSAsCurrency0() (gas: 1253638)\n[PASS] test_ExactOutputBuyDeliversNetOfFeeWithPSSAsCurrency1() (gas: 1258746)\n[PASS] test_InterleavedTradersAccrueExactlyTheFeesAndCanAllClaim() (gas: 2434704)\n[PASS] test_LiquidityWithdrawalByFactoryIsTaxedAsAManagerOutflow() (gas: 1005195)\n[PASS] test_OutputTakenToRouterIsTaxedOnceAndRouterKeepsTheDividend() (gas: 1604208)\n[PASS] test_RedeemingClaimsPaysTheFeeOnTheAmountTaken() (gas: 1188833)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 141.71ms (5.26ms CPU time)\n\nRan 21 tests for test/PSSToken.t.sol:PSSTokenTest\n[PASS] testFuzz_BuyConservesSupplyAndReserves(uint256) (runs: 1000, μ: 471046, ~: 494060)\nLogs:\n  Bound result 423351382150375771881066260\n\n[PASS] test_BuySplitsFeeAndEmitsActualTransfers() (gas: 233976)\n[PASS] test_ConstructorMintsEntireManifestSupplyOnlyToDeployer() (gas: 83469)\n[PASS] test_DirectDonationsAreNotMistakenForFees() (gas: 91606)\n[PASS] test_ExcludedBalancesNeverEarnOrClaim() (gas: 485103)\n[PASS] test_FactoryAllocationAndDistributorClaimArriveWhole() (gas: 231133)\n[PASS] test_FailedTransferRollsBackAllowanceAndDividends() (gas: 538651)\n[PASS] test_FutureDividendsFollowCurrentBalancesIncludingPriorClaims() (gas: 566682)\n[PASS] test_InfiniteAllowanceAndDelegatedSell() (gas: 191859)\n[PASS] test_NoAdminMintBurnOrFeeSetterSelectors() (gas: 830850)\n[PASS] test_NoEligibleSupplyQueuesUntilNextTaxedBuy() (gas: 452854)\n[PASS] test_PostBuyProRataDividendsAndClaims() (gas: 566911)\n[PASS] test_RevertsOnZeroRecipientAndInsufficientBalance() (gas: 158231)\n[PASS] test_RuntimeHasNoForbiddenOpcodesAndFitsDeploymentLimit() (gas: 1226342)\n[PASS] test_SalesWalletTransfersAndManagerSelfTransfersAreUntaxed() (gas: 238799)\n[PASS] test_SellerKeepsEarnedDividendsAndNewHolderCannotClaimHistory() (gas: 682526)\n[PASS] test_SubWeiAccrualSurvivesZeroTransfersAndEmptyClaims() (gas: 887326)\n[PASS] test_TransferDoesNotTransferPastDividends() (gas: 593057)\n[PASS] test_TransferFromUsesFromAddressForFeeAndSpendsGrossAllowance() (gas: 442402)\n[PASS] test_UnauthorizedTransferFromFailsEvenForDeployer() (gas: 98760)\n[PASS] test_ZeroTinyAndSelfTransfersPreserveAccounting() (gas: 664174)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 141.78ms (138.51ms CPU time)\n\nRan 20 tests for test/PSSTokenEdges.t.sol:PSSTokenEdgesTest\n[PASS] testFuzz_BuyViaAllowanceNeedsGrossAllowance(uint256,uint256) (runs: 1000, μ: 217493, ~: 206264)\nLogs:\n  Bound result 416\n  Bound result 362284761535998700610195438\n\n[PASS] testFuzz_ProRataSplitWithinOneUnit(uint256,uint256,uint256,uint256) (runs: 1000, μ: 742539, ~: 753839)\nLogs:\n  Bound result 22692\n  Bound result 15235\n  Bound result 970000000000000000000\n  Bound result 2750\n\n[PASS] testFuzz_RepeatedBuysAndClaimsNeverOverpay(uint256,uint8) (runs: 500, μ: 2190145, ~: 1740043)\nLogs:\n  Bound result 32\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 810179972262672472456881\n  Bound result 261984039741029379264873\n  Bound result 0\n  Bound result 0\n  Bound result 555102705078261110437881\n  Bound result 277377061235366365506637\n  Bound result 375845793386856496851535\n  Bound result 0\n  Bound result 478487818219878752293188\n  Bound result 31852571615873876303701\n  Bound result 858640220262793309927191\n  Bound result 399579799032990562486989\n  Bound result 32997568610892071067569\n  Bound result 15345702975431315102433\n  Bound result 521147904978628400486916\n  Bound result 5161852118778884746962\n  Bound result 168587299488164247118015\n  Bound result 820880269139312279859074\n  Bound result 548641665226417137534672\n\n[PASS] testFuzz_WalletTransfersAndSellsNeverPayAFee(address,address,uint256) (runs: 1000, μ: 270046, ~: 271168)\nLogs:\n  Bound result 29807321368103496625408352\n\n[PASS] test_BuyOfEntireManagerBalanceLeavesManagerEmpty() (gas: 350905)\n[PASS] test_BuyRoutedToTokenContractDistributesOnlyTheFee() (gas: 405531)\n[PASS] test_ClaimedTokensCanBeSoldUntaxedAndBoughtBackTaxed() (gas: 630822)\n[PASS] test_ConstantsMatchTheBriefAndExclusionsAreFixed() (gas: 99272)\n[PASS] test_ContractHolderClaimsWithoutCallbacks() (gas: 659815)\n[PASS] test_DividendsDistributedEventReportsPostTransferEligibleSupply() (gas: 318709)\n[PASS] test_FeeBoundaryAtThirtyFourMinorUnits() (gas: 537766)\n[PASS] test_HolderWhoExitsEarnsNothingWhileAwayAndResumesOnReturn() (gas: 787370)\n[PASS] test_IntermediaryKeepsDividendsEarnedWhileHolding() (gas: 627848)\n[PASS] test_ManyHoldersClaimEverythingButDust() (gas: 9034649)\n[PASS] test_NoPrivilegedSelectorMovesOrFreezesAHolder() (gas: 835940)\n[PASS] test_QueuedFeesFlushOnNextTaxedBuyEvenToExcludedRecipient() (gas: 489604)\n[PASS] test_RejectsEtherAndUnknownCalldata() (gas: 82277)\n[PASS] test_RevertWhen_ApproveZeroSpender() (gas: 30685)\n[PASS] test_RevertWhen_BuyAllowanceCoversOnlyTheNetAmount() (gas: 170042)\n[PASS] test_ViewMatchesClaimAfterCheckpoints() (gas: 627137)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 141.91ms (427.90ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS] invariant_SupplyEntitlementsAndFeeReserveAreConserved() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| DividendHandler | buy      | 5424  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | claim    | 5390  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | move     | 5570  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 523007009371162479775577212\n  Bound result 16993208384057064531999831\n  Bound result 53591\n  Bound result 4078\n  Bound result 7293\n  Bound result 2233625728\n  Bound result 1068796440758465574923790\n  Bound result 7032\n  Bound result 2600\n  Bound result 508\n  Bound result 6712\n  Bound result 127968024825651371\n  Bound result 177464400124660497894713548\n  Bound result 123456789\n  Bound result 43801747590551376460293548\n  Bound result 15933515934825094020661\n  Bound result 10000000000000000000000\n  Bound result 10000\n  Bound result 30\n  Bound result 199502656860274172533472117\n  Bound result 24576\n  Bound result 20200903335154209193391410\n  Bound result 659917\n  Bound result 2827\n  Bound result 16\n  Bound result 2478893115\n  Bound result 24564705356617504941296\n  Bound result 97\n  Bound result 192\n  Bound result 3205\n  Bound result 2\n  Bound result 3\n  Bound result 6890\n  Bound result 244\n  Bound result 1110000000000000000000\n  Bound result 150000000000000000000\n  Bound result 12345000000000000000000\n  Bound result 60000000000000000000\n  Bound result 199513891860274170054578754\n  Bound result 2\n  Bound result 1000000000000000000000\n  Bound result 5702\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.24s (2.24s CPU time)\n\nRan 1 test for test/PSSLedgerInvariant.t.sol:PSSLedgerInvariantTest\n[PASS]\nPSSLedgerInvariantTest invariants:\n[PASS] invariant_EveryBalanceMatchesTheGhostLedger\n[PASS] invariant_ExcludedAddressesNeverHaveDividends\n[PASS] invariant_FeesAreCollectedOnceAndNeverOverpaid\n PSSLedgerInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+---------------------+-------+---------+----------╮\n| Contract      | Selector            | Calls | Reverts | Discards |\n+==================================================================+\n| LedgerHandler | buy                 | 2712  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | claim               | 2784  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | managerSelfTransfer | 2737  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | move                | 2679  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | roundTrip           | 2734  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | sell                | 2738  | 0       | 0        |\n╰---------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 20000000000000000\n  Bound result 9865\n  Bound result 0\n  Bound result 0\n  Bound result 8714\n  Bound result 6716\n  Bound result 110845820424742795389820100\n  Bound result 9084\n  Bound result 40\n  Bound result 5318\n  Bound result 0\n  Bound result 5039\n  Bound result 10000000000000000\n  Bound result 8573\n  Bound result 5748\n  Bound result 839\n  Bound result 125270724187523965593206900\n  Bound result 255\n  Bound result 232902168090431626113540793\n  Bound result 0\n  Bound result 0\n  Bound result 1000\n  Bound result 305\n  Bound result 0\n  Bound result 115148649028782309967469088\n  Bound result 5423\n  Bound result 533\n  Bound result 192\n  Bound result 300000000000000000000\n  Bound result 6202\n  Bound result 0\n  Bound result 0\n  Bound result 6784\n  Bound result 99\n  Bound result 0\n  Bound result 234419084647253219459126585\n  Bound result 9118\n  Bound result 0\n  Bound result 214\n  Bound result 9696\n  Bound result 0\n  Bound result 6686\n  Bound result 2826\n  Bound result 9999\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 51782\n  Bound result 132\n  Bound result 584\n  Bound result 62631\n  Bound result 10211\n  Bound result 0\n  Bound result 49569\n  Bound result 2163\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.49s (4.49s CPU time)\n\nRan 6 test suites in 4.49s (7.30s CPU time): 52 tests passed, 0 failed, 0 skipped (52 total tests)\n","passed":true},{"durationMs":49,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PSSToken.approve(address,uint256)\",\"PSSToken.claim()\",\"PSSToken.transfer(address,uint256)\",\"PSSToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":13,\"README.md\":66,\"foundry.toml\":12,\"launch.json\":24,\"remappings.txt\":5,\"src/PSSToken.sol\":106,\"test/DividendInvariant.t.sol\":116,\"test/PSSLedgerInvariant.t.sol\":253,\"test/PSSToken.t.sol\":354,\"test/PSSTokenEdges.t.sol\":551,\"test/UniswapV4.t.sol\":229,\"test/UniswapV4Edges.t.sol\":425,\"tools/check_launch.py\":45},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"41b92d88fcf6d8159ec3fcd735c4f4a9b720694b16236aa4f67057acc4581c9d","verifiedTreeHash":"6de1d2fa0b019a6b373f8767bc7a30b7f5b41bd0","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":30978,"exitCode":0,"name":"build","output":"Compiling 79 files with Solc 0.8.26\nSolc 0.8.26 finished in 30.83s\nCompiler run successful!\n","passed":true},{"durationMs":5234,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency0() (gas: 1217198)\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency1() (gas: 1223990)\n[PASS] test_UnderpaidSellRevertsCurrencyNotSettled() (gas: 1371569)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.31ms (3.34ms CPU time)\n\nRan 6 tests for test/UniswapV4Edges.t.sol:UniswapV4EdgesTest\n[PASS] test_ExactOutputBuyDeliversNetOfFeeWithPSSAsCurrency0() (gas: 1234321)\n[PASS] test_ExactOutputBuyDeliversNetOfFeeWithPSSAsCurrency1() (gas: 1239929)\n[PASS] test_InterleavedTradersAccrueExactlyTheFeesAndCanAllClaim() (gas: 2440641)\n[PASS] test_LiquidityWithdrawalByFactoryIsTaxedAsAManagerOutflow() (gas: 1028499)\n[PASS] test_OutputTakenToRouterIsTaxedOnceAndLaterDividendsStayWithRouter() (gas: 1827925)\n[PASS] test_RedeemingClaimsPaysTheFeeOnTheAmountTaken() (gas: 1552107)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 82.16ms (6.64ms CPU time)\n\nRan 6 tests for test/DividendRevision.t.sol:DividendRevisionTest\n[PASS] test_BuyerEarnsOnlyForTokensHeldBeforeItsBuy() (gas: 494613)\n[PASS] test_ClaimForExcludedAndEmptyAccountsReturnsZero() (gas: 483176)\n[PASS] test_ClaimForPaysOnlyBeneficiaryAndNewBalanceEarnsOnlyFutureFees() (gas: 634391)\n[PASS] test_EmptyFloatBuyQueuesFeeWithoutRebatingNewBuyer() (gas: 427918)\n[PASS] test_EmptyThirdPartyClaimsPreserveFractionalEntitlements() (gas: 872132)\n[PASS] test_ThirdPartyCanReleaseDistributorDividendsAfterAllocationLeaves() (gas: 793075)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 155.26ms (2.38ms CPU time)\n\nRan 21 tests for test/PSSToken.t.sol:PSSTokenTest\n[PASS] testFuzz_BuyConservesSupplyAndReserves(uint256) (runs: 1000, μ: 446690, ~: 460848)\nLogs:\n  Bound result 17868\n\n[PASS] test_BuySplitsFeeAndEmitsActualTransfers() (gas: 257216)\n[PASS] test_ConstructorMintsEntireManifestSupplyOnlyToDeployer() (gas: 83491)\n[PASS] test_DirectDonationsAreNotMistakenForFees() (gas: 91606)\n[PASS] test_ExcludedBalancesNeverEarnOrClaim() (gas: 485425)\n[PASS] test_FactoryAllocationAndDistributorClaimArriveWhole() (gas: 231133)\n[PASS] test_FailedTransferRollsBackAllowanceAndDividends() (gas: 517293)\n[PASS] test_FutureDividendsFollowCurrentBalancesIncludingPriorClaims() (gas: 590116)\n[PASS] test_InfiniteAllowanceAndDelegatedSell() (gas: 191859)\n[PASS] test_NoAdminMintBurnOrFeeSetterSelectors() (gas: 831620)\n[PASS] test_NoEligibleSupplyQueuesUntilNextTaxedBuy() (gas: 597596)\n[PASS] test_PreBuyProRataDividendsAndClaims() (gas: 590286)\n[PASS] test_RevertsOnZeroRecipientAndInsufficientBalance() (gas: 158231)\n[PASS] test_RuntimeHasNoForbiddenOpcodesAndFitsDeploymentLimit() (gas: 1246283)\n[PASS] test_SalesWalletTransfersAndManagerSelfTransfersAreUntaxed() (gas: 238799)\n[PASS] test_SellerKeepsEarnedDividendsAndNewHolderCannotClaimHistory() (gas: 663197)\n[PASS] test_SubWeiAccrualSurvivesZeroTransfersAndEmptyClaims() (gas: 888290)\n[PASS] test_TransferDoesNotTransferPastDividends() (gas: 616326)\n[PASS] test_TransferFromUsesFromAddressForFeeAndSpendsGrossAllowance() (gas: 423044)\n[PASS] test_UnauthorizedTransferFromFailsEvenForDeployer() (gas: 98760)\n[PASS] test_ZeroTinyAndSelfTransfersPreserveAccounting() (gas: 696304)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 155.39ms (166.17ms CPU time)\n\nRan 20 tests for test/PSSTokenEdges.t.sol:PSSTokenEdgesTest\n[PASS] testFuzz_BuyViaAllowanceNeedsGrossAllowance(uint256,uint256) (runs: 1000, μ: 230587, ~: 206344)\nLogs:\n  Bound result 47567432602681978\n  Bound result 112528543276501822556780068\n\n[PASS] testFuzz_ProRataSplitWithinOneUnit(uint256,uint256,uint256,uint256) (runs: 1000, μ: 742127, ~: 754002)\nLogs:\n  Bound result 165\n  Bound result 23374\n  Bound result 2354\n  Bound result 244\n\n[PASS] testFuzz_RepeatedBuysAndClaimsNeverOverpay(uint256,uint8) (runs: 500, μ: 1985463, ~: 1435586)\nLogs:\n  Bound result 4\n  Bound result 123536585370268324629257\n  Bound result 0\n\n[PASS] testFuzz_WalletTransfersAndSellsNeverPayAFee(address,address,uint256) (runs: 1000, μ: 270447, ~: 271168)\nLogs:\n  Bound result 3\n\n[PASS] test_BuyOfEntireManagerBalanceLeavesManagerEmpty() (gas: 620464)\n[PASS] test_BuyRoutedToTokenContractDistributesOnlyTheFee() (gas: 405748)\n[PASS] test_ClaimedTokensCanBeSoldUntaxedAndBoughtBackTaxed() (gas: 637167)\n[PASS] test_ConstantsMatchTheBriefAndExclusionsAreFixed() (gas: 99316)\n[PASS] test_ContractHolderClaimsWithoutCallbacks() (gas: 660094)\n[PASS] test_DividendsDistributedEventReportsPreBuyEligibleSupply() (gas: 372366)\n[PASS] test_FeeBoundaryAtThirtyFourMinorUnits() (gas: 547206)\n[PASS] test_HolderWhoExitsEarnsNothingWhileAwayAndResumesOnReturn() (gas: 787834)\n[PASS] test_IntermediaryKeepsDividendsEarnedWhileHolding() (gas: 918793)\n[PASS] test_ManyHoldersClaimEverythingButDust() (gas: 9036001)\n[PASS] test_NoPrivilegedSelectorMovesOrFreezesAHolder() (gas: 836556)\n[PASS] test_QueuedFeesFlushOnNextTaxedBuyEvenToExcludedRecipient() (gas: 490041)\n[PASS] test_RejectsEtherAndUnknownCalldata() (gas: 82299)\n[PASS] test_RevertWhen_ApproveZeroSpender() (gas: 30685)\n[PASS] test_RevertWhen_BuyAllowanceCoversOnlyTheNetAmount() (gas: 170042)\n[PASS] test_ViewMatchesClaimAfterCheckpoints() (gas: 650406)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 168.37ms (511.21ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS] invariant_SupplyEntitlementsAndFeeReserveAreConserved() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| DividendHandler | buy      | 5465  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | claim    | 5430  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | move     | 5489  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 2739\n  Bound result 859\n  Bound result 179219978696351561699679\n  Bound result 60000000000000000000\n  Bound result 23789\n  Bound result 1000000000000000000000\n  Bound result 97\n  Bound result 333000000000000000000\n  Bound result 250899437199730603275047784\n  Bound result 19400000000000000000000\n  Bound result 192\n  Bound result 172890756402127386916383212\n  Bound result 28256027396212504311971432\n  Bound result 1000000000000000000\n  Bound result 29100000000000000000000\n  Bound result 5495\n  Bound result 2\n  Bound result 297525748433797273238817536\n  Bound result 69\n  Bound result 435\n  Bound result 28\n  Bound result 300\n  Bound result 5\n  Bound result 3662\n  Bound result 229\n  Bound result 1980\n  Bound result 244\n  Bound result 4032449520667910138304\n  Bound result 1500000000000000000\n  Bound result 2357142857142857142\n  Bound result 5108\n  Bound result 90000000000000000000\n  Bound result 322247064106792858530199113\n  Bound result 16413\n  Bound result 1777\n  Bound result 27555085827006118978388713\n  Bound result 828417\n  Bound result 300\n  Bound result 62631\n  Bound result 51729\n  Bound result 431432098147356777961128599\n  Bound result 2827\n  Bound result 284014476616040337587467\n  Bound result 7047\n  Bound result 828417\n  Bound result 14961819584923558223715\n  Bound result 1199\n  Bound result 1270\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.63s (2.63s CPU time)\n\nRan 2 tests for test/PSSLedgerInvariant.t.sol:PSSLedgerInvariantTest\n[PASS]\nPSSLedgerInvariantTest invariants:\n[PASS] invariant_EveryBalanceMatchesTheGhostLedger\n[PASS] invariant_ExcludedAddressesNeverHaveDividends\n[PASS] invariant_FeesAreCollectedOnceAndNeverOverpaid\n PSSLedgerInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+---------------------+-------+---------+----------╮\n| Contract      | Selector            | Calls | Reverts | Discards |\n+==================================================================+\n| LedgerHandler | buy                 | 2701  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | claim               | 2707  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | managerSelfTransfer | 2775  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | move                | 2757  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | roundTrip           | 2672  | 0       | 0        |\n|---------------+---------------------+-------+---------+----------|\n| LedgerHandler | sell                | 2772  | 0       | 0        |\n╰---------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 7\n  Bound result 101997\n  Bound result 52536673296366579312182043\n  Bound result 3227\n  Bound result 8794\n  Bound result 0\n  Bound result 1242826418\n  Bound result 627\n  Bound result 8161\n  Bound result 66488923709331856166655340\n  Bound result 9999\n  Bound result 0\n  Bound result 0\n  Bound result 2907\n  Bound result 169525808745505628501196787\n  Bound result 6993\n  Bound result 19400000000000000000000\n  Bound result 69\n  Bound result 15000000000000000000\n  Bound result 300\n  Bound result 9141\n  Bound result 700000000000000000000\n  Bound result 17\n  Bound result 18\n  Bound result 416\n  Bound result 95\n  Bound result 28\n  Bound result 14\n  Bound result 959827034248075689894961202\n  Bound result 2500000000000000000\n  Bound result 899999999999999820\n  Bound result 10708\n  Bound result 2827\n  Bound result 0\n  Bound result 201000000000000000000\n  Bound result 6434\n  Bound result 40\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 34280065544018861037080\n  Bound result 97\n  Bound result 455781853826538803945181735\n  Bound result 4123\n  Bound result 0\n  Bound result 0\n  Bound result 17\n  Bound result 12094\n  Bound result 2\n  Bound result 3000\n  Bound result 229\n  Bound result 125270724187523965593206900\n  Bound result 1857123998\n\n[PASS] test_EmptyFloatRoundTripDoesNotCountQueuedFeesAsDistributed() (gas: 1925262)\nLogs:\n  Bound result 0\n  Bound result 300\n  Bound result 1000\n  Bound result 1000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.13s (5.13s CPU time)\n\nRan 7 test suites in 5.14s (8.33s CPU time): 59 tests passed, 0 failed, 0 skipped (59 total tests)\n","passed":true},{"durationMs":71,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PSSToken.approve(address,uint256)\",\"PSSToken.claim()\",\"PSSToken.claimFor(address)\",\"PSSToken.transfer(address,uint256)\",\"PSSToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":13,\"README.md\":69,\"foundry.toml\":12,\"launch.json\":24,\"remappings.txt\":5,\"src/PSSToken.sol\":117,\"test/DividendInvariant.t.sol\":121,\"test/DividendRevision.t.sol\":139,\"test/PSSLedgerInvariant.t.sol\":282,\"test/PSSToken.t.sol\":358,\"test/PSSTokenEdges.t.sol\":578,\"test/UniswapV4.t.sol\":230,\"test/UniswapV4Edges.t.sol\":452,\"tools/check_launch.py\":45},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9e5b85bbaa3c4b2c41be2bf7afe29e81c48fac21fd9a25add2851da750f90305","verifiedTreeHash":"2771801aba7a5d5a8d996524621053fbfd8fe017","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":11758,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 11.63s\nCompiler run successful!\n","passed":true},{"durationMs":2348,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency0() (gas: 1277153)\n[PASS] test_SeedBuyAndSellWithPSSAsCurrency1() (gas: 1283462)\n[PASS] test_UnderpaidSellRevertsCurrencyNotSettled() (gas: 1474104)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 22.31ms (2.42ms CPU time)\n\nRan 21 tests for test/PSSToken.t.sol:PSSTokenTest\n[PASS] testFuzz_BuyConservesSupplyAndReserves(uint256) (runs: 1000, μ: 465559, ~: 494060)\nLogs:\n  Bound result 300000000000000000000\n\n[PASS] test_BuySplitsFeeAndEmitsActualTransfers() (gas: 233976)\n[PASS] test_ConstructorMintsEntireManifestSupplyOnlyToDeployer() (gas: 83469)\n[PASS] test_DirectDonationsAreNotMistakenForFees() (gas: 91606)\n[PASS] test_ExcludedBalancesNeverEarnOrClaim() (gas: 485103)\n[PASS] test_FactoryAllocationAndDistributorClaimArriveWhole() (gas: 231133)\n[PASS] test_FailedTransferRollsBackAllowanceAndDividends() (gas: 538651)\n[PASS] test_FutureDividendsFollowCurrentBalancesIncludingPriorClaims() (gas: 566682)\n[PASS] test_InfiniteAllowanceAndDelegatedSell() (gas: 191859)\n[PASS] test_NoAdminMintBurnOrFeeSetterSelectors() (gas: 830850)\n[PASS] test_NoEligibleSupplyQueuesUntilNextTaxedBuy() (gas: 452854)\n[PASS] test_PostBuyProRataDividendsAndClaims() (gas: 566911)\n[PASS] test_RevertsOnZeroRecipientAndInsufficientBalance() (gas: 158231)\n[PASS] test_RuntimeHasNoForbiddenOpcodesAndFitsDeploymentLimit() (gas: 1226342)\n[PASS] test_SalesWalletTransfersAndManagerSelfTransfersAreUntaxed() (gas: 238799)\n[PASS] test_SellerKeepsEarnedDividendsAndNewHolderCannotClaimHistory() (gas: 682526)\n[PASS] test_SubWeiAccrualSurvivesZeroTransfersAndEmptyClaims() (gas: 887326)\n[PASS] test_TransferDoesNotTransferPastDividends() (gas: 593057)\n[PASS] test_TransferFromUsesFromAddressForFeeAndSpendsGrossAllowance() (gas: 442402)\n[PASS] test_UnauthorizedTransferFromFailsEvenForDeployer() (gas: 98760)\n[PASS] test_ZeroTinyAndSelfTransfersPreserveAccounting() (gas: 664174)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 22.76ms (33.08ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS] invariant_SupplyEntitlementsAndFeeReserveAreConserved() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| DividendHandler | buy      | 5503  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | claim    | 5372  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | move     | 5509  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 755157708405681323029682880\n  Bound result 2787\n  Bound result 1781\n  Bound result 125270724187523965593206900\n  Bound result 32193924647238199347\n  Bound result 33291680151540734678200738\n  Bound result 3821\n  Bound result 255\n  Bound result 747970514777927968843658188\n  Bound result 1429\n  Bound result 24484447720012146794750634\n  Bound result 9999\n  Bound result 5462\n  Bound result 17\n  Bound result 3656\n  Bound result 4205\n  Bound result 1000000000000000000000\n  Bound result 805574767765842643379566\n  Bound result 4891\n  Bound result 7432\n  Bound result 300\n  Bound result 0\n  Bound result 932579317\n  Bound result 76493342181683618843677\n  Bound result 25680319826892131936104244\n  Bound result 400\n  Bound result 128\n  Bound result 30000000000000000000\n  Bound result 1914\n  Bound result 134629339368214742618692\n  Bound result 638212885\n  Bound result 34\n  Bound result 2163\n  Bound result 18\n  Bound result 1\n  Bound result 187006332145090432298506\n  Bound result 7017\n  Bound result 31053529934614150673726452\n  Bound result 6095287886109995683273428\n  Bound result 22616006394443744220207010\n  Bound result 1122691839584474\n  Bound result 10000\n  Bound result 49569\n  Bound result 25165617551394419548569766\n  Bound result 60\n  Bound result 977583198613991195440409\n  Bound result 9\n  Bound result 4072\n  Bound result 5\n  Bound result 2592529113357802122679810\n  Bound result 75000000000000000000\n  Bound result 5731\n  Bound result 4878\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.26s (2.26s CPU time)\n\nRan 3 test suites in 2.26s (2.30s CPU time): 25 tests passed, 0 failed, 0 skipped (25 total tests)\n","passed":true},{"durationMs":40,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PSSToken.approve(address,uint256)\",\"PSSToken.claim()\",\"PSSToken.transfer(address,uint256)\",\"PSSToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":13,\"README.md\":66,\"foundry.toml\":12,\"launch.json\":24,\"remappings.txt\":5,\"src/PSSToken.sol\":106,\"test/DividendInvariant.t.sol\":116,\"test/PSSToken.t.sol\":354,\"test/UniswapV4.t.sol\":229,\"tools/check_launch.py\":45},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":633,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":261,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/PSSToken.sol:10: Large Numeric Literal (2 places)\n[low] unused-public-function at src/PSSToken.sol:42: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c68234602ff8bd6de876f015154f236af1ce10486dfef165e0d79efa341b73b3","verifiedTreeHash":"a3c3e0b7f01968fb082c0974595026a0ad22d4de","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":2208,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.07s\nCompiler run successful!\n","passed":true},{"durationMs":3969,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/UniswapV4.t.sol:UniswapV4Test\n[PASS] test_SeedBuySellAndClaimWithPSSAsCurrency0() (gas: 1511614)\n[PASS] test_SeedBuySellAndClaimWithPSSAsCurrency1() (gas: 1517155)\n[PASS] test_ShortPaidSellRevertsWithCurrencyNotSettledAndRestoresBalances() (gas: 1403737)\n[PASS] test_UnlockAdapterRejectsUnsolicitedCallback() (gas: 31891)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.25ms (3.37ms CPU time)\n\nRan 18 tests for test/PSSToken.t.sol:PSSTokenTest\n[PASS] testFuzz_BuySellClaimConserveSupply(uint256,uint256) (runs: 1000, μ: 575443, ~: 599205)\nLogs:\n  Bound result 397870073715099232987764487\n  Bound result 1262378\n\n[PASS] test_BurnAndDonationExcludeBalancesWithoutDestroyingPastEntitlements() (gas: 759857)\n[PASS] test_BuyFeeAndPostTransferProRataDividends() (gas: 440850)\n[PASS] test_ClaimPaysOnlyCallerAndCannotBeRepeated() (gas: 565206)\n[PASS] test_ClaimedTokensEarnOnlyFutureDividends() (gas: 561452)\n[PASS] test_ExcessivePoolTransferChecksGrossBalanceAndRollsBackFee() (gas: 143832)\n[PASS] test_FactoryReceivesExactManifestSupplyAndDistributesItWhole() (gas: 304149)\n[PASS] test_FiniteAndInfiniteAllowanceDoNotBypassFees() (gas: 319575)\n[PASS] test_FractionalCreditSurvivesRepeatedZeroTransfersAndClaims() (gas: 958171)\n[PASS] test_InvalidTransfersAndAllowanceFailuresAreAtomic() (gas: 298665)\n[PASS] test_NoAdministrativeOrMintingSurfaceForAnyone() (gas: 990439)\n[PASS] test_NoEligibleSupplyQueuesFeesUntilAHoldingExists() (gas: 411574)\n[PASS] test_PastDividendsStayWithSellerAndNewHolderStartsAtCurrentIndex() (gas: 726754)\n[PASS] test_RuntimeContainsNoForbiddenOpcodes() (gas: 1340127)\n[PASS] test_SellAndWalletTransferAreUntaxedEvenWhenCallerIsPoolManager() (gas: 281795)\n[PASS] test_SellingAllTokensPreservesAlreadyEarnedDividends() (gas: 378641)\n[PASS] test_TransferFromPoolManagerUsesSourceNotSpenderAndGrossAllowance() (gas: 262558)\n[PASS] test_ZeroSelfAndSmallTransfersDoNotCorruptBalancesOrCredit() (gas: 508377)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 37.50ms (49.27ms CPU time)\n\nRan 1 test for test/DividendInvariant.t.sol:DividendInvariantTest\n[PASS] invariant_ConservationExclusionsAndSolvency() (runs: 256, calls: 25600, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| DividendHandler | claim    | 12728 | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| DividendHandler | move     | 12872 | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 15440629553533181504768786\n  Bound result 265016757715687274324713128\n  Bound result 3\n  Bound result 8825668053365098807315821\n  Bound result 230573509422169345310086148\n  Bound result 249\n  Bound result 17757\n  Bound result 139639528919147\n  Bound result 4874\n  Bound result 5498\n  Bound result 1896\n  Bound result 15499903877680925\n  Bound result 6306\n  Bound result 244\n  Bound result 155928381234852663887628748\n  Bound result 476155173893509231235769\n  Bound result 1290\n  Bound result 255\n  Bound result 23954488468048844056717210\n  Bound result 5322\n  Bound result 510\n  Bound result 5608\n  Bound result 6101\n  Bound result 86682054779281683269462864\n  Bound result 66\n  Bound result 859165474908122577\n  Bound result 5801828254302102827322621\n  Bound result 4635\n  Bound result 101000000000000000000\n  Bound result 4\n  Bound result 2000000000000000000000\n  Bound result 26330836108130388423085537\n  Bound result 3321\n  Bound result 100000000000000000000\n  Bound result 300000000000000000000\n  Bound result 3152\n  Bound result 101000000000000000000\n  Bound result 72712437033210250573402964\n  Bound result 5560\n  Bound result 6000000000000000000\n  Bound result 2169\n  Bound result 3000000000000000000\n  Bound result 100\n  Bound result 5393804140034113674332143\n  Bound result 100000000000000000000\n  Bound result 589\n  Bound result 154979640245397207973114\n  Bound result 10000\n  Bound result 4604\n  Bound result 30000000000000000000000000\n  Bound result 763600051\n  Bound result 26057337611058347757257423\n  Bound result 139639528919149\n  Bound result 349262939261545166612213583\n  Bound result 86641241191302528307234704\n  Bound result 2306\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.87s (3.87s CPU time)\n\nRan 3 test suites in 3.87s (3.91s CPU time): 23 tests passed, 0 failed, 0 skipped (23 total tests)\n","passed":true},{"durationMs":52,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PSSToken.approve(address,uint256)\",\"PSSToken.claim()\",\"PSSToken.transfer(address,uint256)\",\"PSSToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":143,\"dependencies.lock.json\":22,\"foundry.toml\":13,\"launch.json\":31,\"remappings.txt\":4,\"src/PSSToken.sol\":100,\"test/DividendInvariant.t.sol\":101,\"test/PSSToken.t.sol\":355,\"test/UniswapV4.t.sol\":224,\"tools/check_manifest.py\":41},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":526,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":227,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/PSSToken.sol:10: Large Numeric Literal (2 places)\n[low] unused-public-function at src/PSSToken.sol:41: Public Function Not Used Internally","passed":true}],"detail":"launch.json is not a valid launch manifest: notes: Invalid input: expected string, received array; (root): Unrecognized key: \"chainId\"","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"cb63c40e5b8036afcfe442d41565f71d04a0c0137a63d32460322ef80ddabf5d","verifiedTreeHash":"58325973558b2ddfd7d12bf2b5c2bc69d8e07da0","verifierVersion":"0.1.0+ad90ce4c"}]}