{"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":"478fbc53-bdbf-4ab1-b167-98eda44691ea","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"574873d03fc3702cdad7c1f2aef00b2f5465956046703e2792d0ee71fb070cc4","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"3de4c960ae8743c5f5ff83488f795cb49f950f5f8122522088026dd73126215a","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"3a132c8599959681ab930ede1706b8eadd00fda6218bbd60f122d44eb3a7d4f2","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":"cbc03e95be0ab8a3a25f673f0c3d3c415e4a603709452a6ca8b188d55a7fee8c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"8ec39994c2f52ba29e4b789ff0b4dda11b1b2a7d07ce3fafee738b74287fb41c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"cdf475dc234ae2f846eaba09290c3ff7287ae03066352f11a8e8116e2bdcc75c","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"89192ed01fc2c5a660fe45c60d92edbdae264149fc604b91b6c5638990fd85c2","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"433d6b1c317da27d93c7f3e53c8b5873fa4db443acbca17ba0a237c7efa4e4e0","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: 1MDollar (1MD).\nToken name: 1MDollar\nToken symbol: 1MD\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: 99% tax fee just on the liquidity pool","parentJobId":null,"planHash":"83aa932704d04100c9173456eb5b2d1ae6f012e843247f1e704faff55d73965e","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"478fbc53-bdbf-4ab1-b167-98eda44691ea","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-935-1mdollar"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51234","feedbackHash":"214772f7f33eb900acb08fb68030d22ce9aa0f561f935476f41d8f0971bde116","nodeKey":"audit_economics","submissionHash":"574873d03fc3702cdad7c1f2aef00b2f5465956046703e2792d0ee71fb070cc4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51140","feedbackHash":"e43ea341d2bfd79638929939efc286fbb53cee478181984062715c6cc20da9f2","nodeKey":"audit_flow","submissionHash":"3de4c960ae8743c5f5ff83488f795cb49f950f5f8122522088026dd73126215a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52277","feedbackHash":"6e14c2aaff89be38e496101f138ea7e298f71b2d697b033932d8e7df2de7ef8e","nodeKey":"audit_judge","submissionHash":"3a132c8599959681ab930ede1706b8eadd00fda6218bbd60f122d44eb3a7d4f2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52225","feedbackHash":"3150c0b4adf285a96e5e65c2d95306f6ff0a05bd724f6cbf2e82bc3019a2e140","nodeKey":"audit_judge","submissionHash":"9de4b4b4c6f8549856f5dc0f7e30b3a8afaa5c94e54384e1af8872e469a2a92b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51367","feedbackHash":"bf7341729829d743cb9be3dcc411d95f3f702cd237bd5745994760662938938e","nodeKey":"audit_judge","submissionHash":"9e0cf4b1933225ccce959c67f49bf04dd685da426bdf9d4c62f09fe39cd1bebc","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51291","feedbackHash":"5fb13f5f0e3965019e12cd19d80e0ec749594dbb83a5128bce97af44a481d052","nodeKey":"audit_math","submissionHash":"cbc03e95be0ab8a3a25f673f0c3d3c415e4a603709452a6ca8b188d55a7fee8c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50907","feedbackHash":"ed502b207373550e18dee48ff5c054d345201b27f665f1a29e372fff15d194dd","nodeKey":"audit_permissions","submissionHash":"8ec39994c2f52ba29e4b789ff0b4dda11b1b2a7d07ce3fafee738b74287fb41c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51293","feedbackHash":"e97d064d8b0b503e695bf3e451f5219796ff5d0187f7b7d92661d71584e725d7","nodeKey":"build_contract_project","submissionHash":"588a1bbdf8e523294723aaaa2fc3e0e917334e7c2c7ca4bf6f9afbc7c37dad2f","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51072","feedbackHash":"1a06169e4c9238b291420938f263f5753096b5d1ba0c805eb4d4d65a61837e9f","nodeKey":"build_contract_project","submissionHash":"cdf475dc234ae2f846eaba09290c3ff7287ae03066352f11a8e8116e2bdcc75c","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51093","feedbackHash":"bffca2184f27eb91ff7cf460956aca702f8a3bc2781c12fbf3b0feebff0be9e6","nodeKey":"manifest","submissionHash":"a5eef8c3ed77d87c89f24d218d0637ed2a71ad5b6db8d4ca7113f03e65109303","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51312","feedbackHash":"34edbda426a566f58c237910b3cde33baeabf1a07a01bbb68116135e33efdc4f","nodeKey":"manifest","submissionHash":"24c2fa7908118c695635d06540837d8287cd3a00c77e9c59b632f7e74ad980a3","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51354","feedbackHash":"444c043869da2f19a74482699046355b4e938a74595e28c7c0d7d0eb77e4e291","nodeKey":"manifest","submissionHash":"89192ed01fc2c5a660fe45c60d92edbdae264149fc604b91b6c5638990fd85c2","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51477","feedbackHash":"eea56517287ccba8b0cd10b1b6393e5482ca6065b522426013dcd7930332d987","nodeKey":"write_foundry_tests","submissionHash":"0b7edc82d998ffda382e784c357b935bb561440322c2097c19bca7087c7cfaef","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51431","feedbackHash":"69319bad15baab630edb5875167f00d0218d2c573b7e1b29f2629df13e9b663e","nodeKey":"write_foundry_tests","submissionHash":"635c44728235f660a463a75919075c84e8f70af971ece9a964243a85726ea193","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51296","feedbackHash":"9a8d62195892ea19185e8bb091794ae98f1f4213e26dc8861b42a6763e8e3c7b","nodeKey":"write_foundry_tests","submissionHash":"433d6b1c317da27d93c7f3e53c8b5873fa4db443acbca17ba0a237c7efa4e4e0","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"dc01706268c9432f89b589e7599f33da6e67dd3ec2133882c525001e47335dbf","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"359ddbddbc0813ae8bbc8df701f7ee7abd3fb324c313b5d43c6fc8417c648304","device":"1c3f1bd2a9480b62","findings":[],"hash":"0b7edc82d998ffda382e784c357b935bb561440322c2097c19bca7087c7cfaef","nodeId":"edea3839-62a1-416a-bcea-09477997e135","outcome":"completed","summary":"Added failure-path, boundary, and fuzz tests, plus persistent balance/allowance invariants covering 32,768 randomized calls.\n\n`forge build` and `forge test` pass offline: **46 passed, 0 failed, 0 skipped**.\n\nOnly `test/` changed. No confirmed defects were reproduced. The tests document the existing launch PoolManager exemption; the 99% tax applies to the separate configured pool.","treeHash":"a79836361e4e6c873cea25f0d1df24df2426269d","usage":{"cachedInputTokens":841344,"inputTokens":84685,"model":"gpt-6-astra","outputTokens":12671,"runtime":"codex","turns":6,"wallClockMs":696489}},{"artifacts":[],"attempt":2,"bundleHash":"db5d1d2f8475c1f8eb7a7f445542d95a0ed23e1bc8acd5a95757220616b753aa","device":"71ee8cbe44073cf6","findings":[],"hash":"24c2fa7908118c695635d06540837d8287cd3a00c77e9c59b632f7e74ad980a3","nodeId":"c0c5cbdd-9471-45cc-af6a-9f9e3cf0a24a","outcome":"completed","summary":"Created [launch.json](/home/seat/.identitymd/work/478fbc53-bdbf-4ab1-b167-98eda44691ea/c0c5cbdd-9471-45cc-af6a-9f9e3cf0a24a/launch.json) with exact supply, economics, and matching constructor arguments. Only this file changed.\n\n`forge build` succeeded; all 32 tests passed.\n\nThe manifest documents that taxable address `0x1001` comes from accepted tests; no deployed venue is verified. The accepted implementation exempts the launch PoolManager from tax.","treeHash":"3fdbcb8ae3c950e971aa76d2bac9bc8e0e31a3a2","usage":{"cachedInputTokens":344832,"inputTokens":40174,"model":"gpt-6-astra","outputTokens":4934,"runtime":"codex","turns":4,"wallClockMs":265439}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"06c32862bedacb46","findings":[{"citation":"resolved","description":"Prior finding dc640682b2a5175f0e6d4bbb324114df5418605bb52fa36e95ea20838773fb59 remains reproducible. The overlapping launch-pool findings from flow, permissions, math and economics are merged here. The revised condition fixes manager relays involving the configured liquidityPool, but normal launch swaps never touch that separate address. The constructor rejects liquidityPool_ == poolManager_ and both are immutable. launch.json in this reviewed tree selects 0x1001 as the taxable endpoint, deploys no application contracts, and expressly states that no production taxable venue is established and the launch v4 pool has no 99% token transfer tax. Thus the only established launch pool charges no requested token tax. This is an unmet economic requirement, not evidence of stolen funds. The author is correct that imposing a two-direction token transfer tax on nominal PoolManager settlement is an incompatible repair: manager inflows are credited by actual received balance, so short-paying a seed or sale leaves an unsettled delta and reverts. The supplied hookless proof establishes the current missing tax; it does not establish a compatible hook-based repair or authorize buy-only economics. Documentation and the disputed response acknowledge the gap but do not resolve it. Resolution requires a settlement-aware launch integration delivering the agreed economics, or explicit requester acceptance of revised economics with a verified separate taxable venue. Do not silently introduce an incompatible token-only tax.","line":49,"path":"src/OneMDollar.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.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 {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} 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 {OneMDollar} from \"src/OneMDollar.sol\";\n\n/// @dev Seeds the launch pool and trades at it exactly as the factory and an ordinary trader do.\ncontract V4Participant is IUnlockCallback {\n    IPoolManager internal immutable manager;\n    address internal immutable controller = msg.sender;\n\n    constructor(IPoolManager manager_) {\n        manager = manager_;\n    }\n\n    receive() external payable {}\n\n    function seed(PoolKey calldata key, bool tokenIsZero) external {\n        require(msg.sender == controller, \"controller only\");\n        manager.unlock(abi.encode(true, key, tokenIsZero, int256(10_000 ether)));\n    }\n\n    function swap(PoolKey calldata key, bool zeroForOne, int256 amount) external returns (BalanceDelta) {\n        require(msg.sender == controller, \"controller only\");\n        return abi.decode(manager.unlock(abi.encode(false, key, zeroForOne, amount)), (BalanceDelta));\n    }\n\n    function unlockCallback(bytes calldata data) external override returns (bytes memory) {\n        require(msg.sender == address(manager), \"manager only\");\n        (bool isSeed, PoolKey memory key, bool direction, int256 amount) =\n            abi.decode(data, (bool, PoolKey, bool, int256));\n        BalanceDelta delta;\n        if (isSeed) {\n            (delta,) = manager.modifyLiquidity(\n                key,\n                ModifyLiquidityParams(\n                    direction ? int24(0) : int24(-600), direction ? int24(600) : int24(0), amount, bytes32(0)\n                ),\n                \"\"\n            );\n        } else {\n            uint160 limit = direction ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1;\n            delta = manager.swap(key, SwapParams(direction, amount, limit), \"\");\n        }\n        _settle(key.currency0, delta.amount0());\n        _settle(key.currency1, delta.amount1());\n        return abi.encode(delta);\n    }\n\n    function _settle(Currency currency, int128 delta) private {\n        if (delta < 0) {\n            uint256 amount = uint256(-int256(delta));\n            if (Currency.unwrap(currency) == address(0)) {\n                manager.settle{value: amount}();\n            } else {\n                manager.sync(currency);\n                OneMDollar(Currency.unwrap(currency)).transfer(address(manager), amount);\n                manager.settle();\n            }\n        } else if (delta > 0) {\n            manager.take(currency, address(this), uint256(int256(delta)));\n        }\n    }\n}\n\n/// @dev The brief asks for a 99% fee on the liquidity pool. The launch has exactly one pool: the\n/// Uniswap v4 pool inside the PoolManager. A buy at that pool must pay the fee to the treasury.\ncontract LaunchPoolUntaxedTest is Test {\n    PoolManager internal manager;\n    OneMDollar internal token;\n    V4Participant internal factory;\n    address internal constant OTHER_POOL = address(0x1001);\n    address internal constant TREASURY = address(0x1002);\n\n    function setUp() public {\n        manager = new PoolManager(address(this));\n        factory = new V4Participant(manager);\n        vm.prank(address(factory));\n        token = new OneMDollar(OTHER_POOL, TREASURY, address(manager));\n        assertEq(token.balanceOf(address(factory)), token.totalSupply(), \"factory holds the supply\");\n    }\n\n    function test_buyAtTheLaunchPoolPaysThePoolTax() public {\n        bool tokenIsZero = address(token) < address(0);\n        PoolKey memory key = PoolKey(\n            Currency.wrap(tokenIsZero ? address(token) : address(0)),\n            Currency.wrap(tokenIsZero ? address(0) : address(token)),\n            3000,\n            60,\n            IHooks(address(0))\n        );\n        manager.initialize(key, uint160(1 << 96));\n        factory.seed(key, tokenIsZero);\n        assertGt(token.balanceOf(address(manager)), 0, \"seed arrived\");\n\n        V4Participant trader = new V4Participant(manager);\n        vm.deal(address(trader), 1 ether);\n        uint256 treasuryBefore = token.balanceOf(TREASURY);\n\n        // Buy: 0.01 ETH exact input, 1MD out of the launch pool to the trader.\n        BalanceDelta delta = trader.swap(key, !tokenIsZero, -0.01 ether);\n        int128 tokenDelta = tokenIsZero ? delta.amount0() : delta.amount1();\n        assertGt(tokenDelta, 0, \"swap produced tokens\");\n        uint256 gross = uint256(int256(tokenDelta));\n        uint256 fee = (gross * token.TAX_BPS()) / token.BPS_DENOMINATOR();\n        assertGt(fee, 0, \"fee is material\");\n\n        assertEq(token.balanceOf(address(trader)), gross - fee, \"buyer should receive the 1% net\");\n        assertEq(token.balanceOf(TREASURY) - treasuryBefore, fee, \"treasury should receive the 99% pool fee\");\n    }\n}","reproduction":"Copied .imd/reads/proofs/Proof_dc640682b2a5.t.sol unchanged to test/scratch/LaunchPoolTax.t.sol and ran forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path test/scratch/LaunchPoolTax.t.sol -vv (also executed with the four other supplied proofs). Solidity 0.8.26 compilation succeeded; test_buyAtTheLaunchPoolPaysThePoolTax failed: buyer should receive the 1% net: 9969990059919910 != 99699900599200. State: real local v4 PoolManager M; factory F deploys OneMDollar(0x1001, 0x1002, M), receiving 1e27 units; initialize hookless ETH/1MD pool with fee 3000, tick spacing 60 and sqrtPriceX96=2^96; F seeds 10000e18 liquidity at ticks [-600,0]. Trader funded with 1 ETH buys with 0.01 ETH exact input. Actual gross output and buyer receipt are both 9969990059919910 minor units; treasury receipt is zero. Expected for the requested 99% pool tax: floor(gross*9900/10000)=9870290159320710 to treasury, net 99699900599200 to buyer. Manager-to-trader never touches liquidityPool, so line 49 selects the untaxed branch. The author reproduced exactly this failure and does not claim it fixed. The separate relay proofs now pass and are not retained as findings. Existing-suite check: forge test --offline --out test/scratch/out --cache-path test/scratch/cache --no-match-path test/scratch/*.t.sol -vv passed all 55 tests, including native/ERC20 seed-buy-sell round trips asserting treasury zero, constructor rejection when taxable pool equals manager, and delegated wallet-to-manager transfers delivering the gross amount. The original protected harness was read but not executed: it requires network-specific environment values and launch-helper sources absent from this project. The author's diagnostic token variants were not supplied as executable files; their settlement explanation was checked against the vendored PoolManager.unlock and _settle code. No public-network assumptions or unverified treasury-control claims are retained.","severity":"medium","snippet":"        if (from != address(0) && (from == liquidityPool || to == liquidityPool)) {","title":"Unresolved: the launch liquidity pool still never pays the requested 99% tax"}],"hash":"3a132c8599959681ab930ede1706b8eadd00fda6218bbd60f122d44eb3a7d4f2","nodeId":"ff81e995-0d4c-4bbe-ab09-4878a15b2fb0","outcome":"completed","summary":"Wrote [.imd-findings.json](/home/imd5/.identitymd/work/478fbc53-bdbf-4ab1-b167-98eda44691ea/ff81e995-0d4c-4bbe-ab09-4878a15b2fb0/.imd-findings.json).\n\nOne medium finding remains: the launch pool pays no 99% tax. Confirmed the relay-bypass and factory fee-recipient fixes. All 55 existing tests passed; all three entry points are covered.","treeHash":null,"usage":{"cachedInputTokens":626962,"inputTokens":97674,"model":"gpt-6.1-sol","outputTokens":4847,"runtime":"codex","turns":4,"wallClockMs":112789}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ddc5542bddcad225","findings":[{"citation":"resolved","description":"_update exempts any transfer whose sender or recipient is the launch PoolManager, regardless of the other endpoint. The PoolManager is a public contract: anyone may call unlock and, inside the callback, sync(token), transfer tokens to the manager, settle() to be credited the exact amount received, and take(token, to, amount) to have the manager transfer them out again. Both legs of that route are exempt (the first because to == poolManager, the second because from == poolManager), so a holder can deliver tokens into the taxed liquidityPool untaxed, and a venue swap whose output recipient is the PoolManager (pool -> manager -> buyer) delivers 100% to the buyer instead of 1%. The exemption exists so the launch pool settles whole, but it also covers transfers whose other endpoint is the taxed pool, which the launch never performs (the constructor forbids liquidityPool == poolManager). Execution-trace class: a sentinel address on either endpoint skips the validation the normal path enforces. The README notes the bypass in passing; it is not a minor leak: it costs nothing beyond gas and removes the only fee the token has. Minimal fix that keeps the launch floor intact (verified: test/LaunchCompatibility.t.sol still passes with it): tax every transfer touching liquidityPool and only exempt the manager when the other endpoint is not the taxed pool, i.e. drop `&& from != poolManager && to != poolManager` from the condition (manager <-> pool transfers never occur in the launch flows). The attached proof fails on the current code and passes with that change.","line":47,"path":"src/OneMDollar.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.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 {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {OneMDollar} from \"src/OneMDollar.sol\";\n\n/// @dev Stands at the taxed `liquidityPool` address. It only forwards what it holds, like any venue.\ncontract PoolStub {\n    function push(OneMDollar token, address to, uint256 amount) external {\n        token.transfer(to, amount);\n    }\n}\n\n/// @dev An ordinary trader. Routes a transfer through the exempt PoolManager instead of sending directly.\ncontract Conduit is IUnlockCallback {\n    IPoolManager internal immutable manager;\n    OneMDollar internal immutable token;\n\n    constructor(IPoolManager manager_, OneMDollar token_) {\n        manager = manager_;\n        token = token_;\n    }\n\n    /// Sell path: my tokens -> PoolManager (exempt: to == poolManager) -> taxed pool (exempt: from == poolManager).\n    function sellThroughManager(address pool, uint256 amount) external {\n        manager.unlock(abi.encode(true, pool, amount));\n    }\n\n    /// Buy path: taxed pool -> PoolManager (exempt: to == poolManager) -> me (exempt: from == poolManager).\n    function buyThroughManager(PoolStub pool, uint256 amount) external {\n        manager.unlock(abi.encode(false, address(pool), amount));\n    }\n\n    function unlockCallback(bytes calldata data) external override returns (bytes memory) {\n        require(msg.sender == address(manager), \"manager only\");\n        (bool sell, address pool, uint256 amount) = abi.decode(data, (bool, address, uint256));\n        Currency currency = Currency.wrap(address(token));\n        manager.sync(currency);\n        if (sell) {\n            token.transfer(address(manager), amount);\n        } else {\n            PoolStub(pool).push(token, address(manager), amount);\n        }\n        manager.settle();\n        manager.take(currency, sell ? pool : address(this), amount);\n        return \"\";\n    }\n}\n\ncontract PoolManagerBypassTest is Test {\n    PoolManager internal manager;\n    OneMDollar internal token;\n    PoolStub internal pool;\n    Conduit internal trader;\n    address internal constant TREASURY = address(0x1002);\n\n    function setUp() public {\n        manager = new PoolManager(address(this));\n        pool = new PoolStub();\n        token = new OneMDollar(address(pool), TREASURY, address(manager));\n        trader = new Conduit(manager, token);\n    }\n\n    /// A sale of 100 1MD into the taxed pool must leave 99 1MD with the treasury and 1 1MD in the pool,\n    /// whichever path the tokens take. Routed through the PoolManager, the pool receives all 100 and\n    /// the treasury nothing.\n    function test_sellIntoTaxedPoolThroughPoolManagerPaysTax() public {\n        token.transfer(address(trader), 100 ether);\n        trader.sellThroughManager(address(pool), 100 ether);\n        assertEq(token.balanceOf(address(trader)), 0, \"trader kept tokens\");\n        assertEq(token.balanceOf(TREASURY), 99 ether, \"treasury did not receive the 99% fee\");\n        assertEq(token.balanceOf(address(pool)), 1 ether, \"pool received more than the 1% net\");\n    }\n\n    /// 100 1MD leaving the taxed pool must deliver at most 1 1MD to the buyer. Routed through the\n    /// PoolManager, the buyer receives all 100 and the treasury nothing.\n    function test_buyFromTaxedPoolThroughPoolManagerPaysTax() public {\n        // Fund the pool directly in storage so the setup itself is untaxed on any version of the token.\n        deal(address(token), address(pool), 100 ether);\n        assertEq(token.balanceOf(address(pool)), 100 ether);\n\n        // Once fixed, the routed buy either reverts (the manager was shorted) or delivers the taxed net.\n        try trader.buyThroughManager(pool, 100 ether) {} catch {}\n        assertLe(token.balanceOf(address(trader)), 1 ether, \"buyer received more than the 1% net\");\n        assertEq(\n            token.balanceOf(address(pool)) + token.balanceOf(TREASURY) + token.balanceOf(address(trader))\n                + token.balanceOf(address(manager)),\n            100 ether,\n            \"conservation\"\n        );\n    }\n}","reproduction":"State: token = new OneMDollar(POOL, TREASURY, PM) where PM is a real Uniswap v4 PoolManager and POOL is any address with code that can forward tokens; trader holds 100e18 1MD. Sell: trader calls PM.unlock; in unlockCallback: PM.sync(token); token.transfer(PM, 100e18); PM.settle(); PM.take(token, POOL, 100e18). Expected (per README table and test_sellSends99PercentToTreasuryAnd1PercentToPool): POOL +1e18, TREASURY +99e18. Actual: POOL +100e18, TREASURY +0, PoolTax never emitted. Buy: POOL holds 100e18; trader calls PM.unlock; in callback: PM.sync(token); POOL forwards 100e18 to PM (exempt, to == PM); PM.settle(); PM.take(token, trader, 100e18) (exempt, from == PM). Expected: trader receives at most 1e18. Actual: trader receives 100e18, TREASURY 0. Run: forge test --match-path test/scratch/PoolManagerBypass.t.sol -> both tests FAIL on the current code (treasury 0 != 99e18; buyer 100e18 > 1e18).","severity":"medium","snippet":"            from != address(0) && (from == liquidityPool || to == liquidityPool) && from != poolManager\n                && to != poolManager","title":"The 99% pool tax is bypassed in both directions by routing through the exempt PoolManager"},{"citation":"resolved","description":"The brief asks for a 99% fee on the liquidity pool. The launch creates exactly one pool, inside the Uniswap v4 PoolManager, and the token exempts every transfer to or from that manager, while the constructor rejects liquidityPool_ == poolManager_. The only taxable venue is therefore a separate static address passed as the first constructor word. Under the launch that address must be fixed before the token exists, and the token address (CREATE2 by the factory with the init-code hash, which includes the constructor words) depends on it, so any AMM pair or pool whose address derives from the token address (Uniswap v2/v3 style) cannot be named. In the launched configuration the fee path is dead code: trades on the launch pool pay 0 and the treasury receives nothing, which the project's own test test/LaunchCompatibility.t.sol:161 asserts (balanceOf(TREASURY) == 0 after a buy and a sell). The README documents this as a reinterpretation, but the delivered behaviour is \"no tax on the liquidity pool\", the opposite of the requested guarantee, and a reviewer of the manifest will have to pick an arbitrary static address for liquidityPool. Scope decision for the requester, not a silent code fix: a sell-side tax at the PoolManager cannot pass the launch floor (settle() credits only what arrived, so the trader's swap reverts with CurrencyNotSettled). A buy-side tax on transfers leaving the PoolManager to non-exempt recipients does survive the floor's buy-then-sell round trip (checked locally with a real PoolManager: buyer received 1% of the swap output, treasury 99%, and selling the received amount back succeeded), but the written floor says trader flows must \"move exactly what they say\", so whether that is admitted needs confirmation from the network. Otherwise the brief and the launch floor are in direct conflict and the requester must choose: no tax, or a tax implemented elsewhere (a hook), neither of which this token can supply.","line":35,"path":"src/OneMDollar.sol","reproduction":"State: factory (CREATE2 deployer) deploys OneMDollar(POOL=0x1001, TREASURY=0x1002, PM=<real PoolManager>), moves 10% to the distributor, initializes the v4 pool and seeds it single-sided, exactly as test/LaunchCompatibility.t.sol:_roundTrip does. Trader swaps 0.01 ETH for 1MD through PM, then sells the whole amount back. Expected per brief: 99% of each pool-side transfer to TREASURY. Actual: TREASURY balance 0 after both swaps (asserted by the project test itself at test/LaunchCompatibility.t.sol:161), PoolTax never emitted. Constructor input showing the conflict: new OneMDollar(PM, TREASURY, PM) reverts InvalidLiquidityPool, so the launch pool can never be the taxed pool.","severity":"medium","snippet":"            liquidityPool_ == address(0) || liquidityPool_ == address(this) || liquidityPool_ == msg.sender\n                || liquidityPool_ == feeRecipient_ || liquidityPool_ == poolManager_","title":"The requested 99% tax never applies to the launch liquidity pool; the taxed venue is a static address that cannot be the launch pool"},{"citation":"resolved","description":"The constructor rejects msg.sender as liquidityPool and as poolManager but not as feeRecipient. Under the launch, msg.sender is ProjectFactory, a shared contract that forwards the supply once during launchCustom and has no stated role afterwards. feeRecipient is a static manifest word chosen by hand; if it is set to the factory address (the README says the treasury \"may be the deployer\", and at launch the deployer is the factory), every taxed transfer credits 99% of the amount to the factory contract. Nothing in this tree can move tokens out of the factory after launch, so the fee proceeds would be unrecoverable unless the factory has a sweep, which is not shown here. Minimal fix: add `|| feeRecipient_ == msg.sender` to the InvalidFeeRecipient check, or document that the treasury must be an address the requester controls and never the factory.","line":31,"path":"src/OneMDollar.sol","reproduction":"State: deployer D calls new OneMDollar(POOL, D, PM) -> succeeds (no revert). D transfers 100e18 to ALICE; ALICE transfers 100e18 to POOL. Expected if D is the factory: constructor rejects the argument like it rejects D as liquidityPool. Actual: balanceOf(D) increases by 99e18 on every sale; with D = ProjectFactory those tokens sit in the factory contract.","severity":"low","snippet":"        if (feeRecipient_ == address(0) || feeRecipient_ == address(this) || feeRecipient_ == poolManager_) {","title":"Constructor accepts the deploying factory as feeRecipient, stranding all fees in ProjectFactory"}],"hash":"3de4c960ae8743c5f5ff83488f795cb49f950f5f8122522088026dd73126215a","nodeId":"ad11797f-3867-41c9-aa1f-570ee53659c7","outcome":"completed","summary":"Review complete. The findings file is written and validated, the source tree is untouched, and the only new files are the findings JSON and the scratch proof, both in paths the task designates.\n\n**What I found**\n\n- **Medium: the 99% pool tax is bypassable in both directions.** `_update` exempts any transfer with the PoolManager on either end. Since the manager is public, anyone can unlock it, sync, transfer in, settle, and take out to the taxed pool, or have the pool deliver to the manager and take to themselves. Both legs are exempt, so a 100 1MD sale lands 100 in the pool and 0 in the treasury. The proof in `test/scratch/PoolManagerBypass.t.sol` fails on the current code and passes once the manager exemption is dropped for transfers whose other endpoint is the taxed pool. I confirmed that fix keeps the launch compatibility suite green.\n- **Medium: the tax never applies to the launch pool.** The launch pool lives inside the exempt PoolManager, and the constructor forbids naming the manager as the taxed pool. The taxed venue is a static address that must be fixed before the token address exists, which rules out any pair whose address derives from the token. The project's own launch test asserts the treasury receives zero after a buy and a sell. I noted that a sell-side tax at the manager cannot pass the floor, while a buy-side tax does survive the floor's round trip in a local experiment, but the written floor's wording makes that a scope decision for the requester and network.\n- **Low: the factory is accepted as feeRecipient.** The constructor rejects the deployer as pool and manager but not as treasury. At launch the deployer is ProjectFactory, so a misconfigured static word strands all fees there.\n\n**Coverage**\n\nAll three ABI entry points have rows. The approve path holds. Transfer and transferFrom carry finding 1. Extra rows record that fixed supply, fee arithmetic and atomicity, absence of external calls, and the vendored OpenZeppelin and v4 libraries all hold. Build and the existing 32 tests pass with solc 0.8.26.","treeHash":null,"usage":{"cachedInputTokens":1358245,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":30255,"runtime":"claude","turns":29,"wallClockMs":429231}},{"artifacts":[],"attempt":1,"bundleHash":"7a3a96f179460c664a79195d1dcacb76bc49fed14f24eb7befac972d9f98b107","device":"e54711bd1fbb0d02","findings":[],"hash":"433d6b1c317da27d93c7f3e53c8b5873fa4db443acbca17ba0a237c7efa4e4e0","nodeId":"edea3839-62a1-416a-bcea-09477997e135","outcome":"completed","summary":"Added focused relay tests covering transfer equivalence, overdraw rollback, valid retries, and rounding boundaries. Existing invariant suites remain intact.\n\nOffline `forge build` and `forge test` pass: **55 tests, 0 failures**, including 40,960 invariant calls. Only `test/` changed.\n\nThe documented limitation remains: taxation applies to the separate configured pool, not the launch pool.","treeHash":"6538f8f7a4dc144921af5d0b81cf34c89f68acb8","usage":{"cachedInputTokens":888832,"inputTokens":74766,"model":"gpt-6-astra","outputTokens":7201,"runtime":"codex","turns":5,"wallClockMs":404906}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6d41a24119881b34","findings":[],"hash":"4374830885c32dc228d7f98406830bcac5695c2ad9cfa744e1ad01de1dcb5f9d","nodeId":"f1b55070-94f3-425e-81eb-1229c0aabff0","outcome":"no_change","summary":"Recorded a dispute in [.imd-responses.json](/home/imd-worker/.identitymd/work/478fbc53-bdbf-4ab1-b167-98eda44691ea/f1b55070-94f3-425e-81eb-1229c0aabff0/.imd-responses.json).\n\nThe gap reproduces. Experiments show a two-way manager tax breaks required settlement; resolving it needs launch-integration changes. Contracts remain unchanged.\n\n`forge build`, all 36 existing tests, and formatting checks pass. The reviewer’s proof still fails; the launch tax remains unresolved.","treeHash":null,"usage":{"cachedInputTokens":455424,"inputTokens":58101,"model":"gpt-6-astra","outputTokens":8761,"runtime":"codex","turns":4,"wallClockMs":493703}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d00f790fc692b1a4","findings":[{"citation":"resolved","description":"The brief asks for a 99% fee 'just on the liquidity pool'. A custom launch has exactly one pool: the Uniswap v4 pool that lives inside the PoolManager singleton. OneMDollar._update exempts every transfer whose sender or recipient is poolManager and instead taxes a separate immutable `liquidityPool` address. Launch constructor arguments may only be static words or $factory/$poolManager/$launchNumber, so `liquidityPool` can only be an arbitrary static address that hosts no launch liquidity. Net effect: every buy and every sell at the launch pool pays 0 to the treasury, permanently (all three addresses are immutable). Anyone can also open further hookless v4 pools for 1MD at the same manager, all untaxed, while a separately configured venue cannot attract liquidity because adding liquidity there is itself taxed 99%. The requested economics (treasury receives 99% of pool flow) therefore never materialise. The README documents this as an unavoidable conflict with the protected floor, but it is not unavoidable: the floor only requires inflows to the manager (the factory seed, trader sells) to settle whole, a buyer to end with a nonzero balance, and the buyer to be able to sell everything back. A buy-side tax on transfers FROM the PoolManager (`from == poolManager`) satisfies all of that: verified locally with a real PoolManager, the seed arrives whole, a 0.01 ETH buy delivers 1% to the trader and 99% to the treasury, and the trader sells its whole balance back. Tradeoffs the requester must decide: the tax becomes buy-side only at the launch pool, and any `take` of 1MD from the manager (including liquidity removal by the position owner) is taxed. If the requester instead accepts an untaxed launch pool, this is a scope decision to record, not a code fix; as delivered, the token's single feature is inert in the launch.","line":47,"path":"src/OneMDollar.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.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 {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} 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 {OneMDollar} from \"src/OneMDollar.sol\";\n\n/// @dev Seeds the launch pool and trades at it exactly as the factory and an ordinary trader do.\ncontract V4Participant is IUnlockCallback {\n    IPoolManager internal immutable manager;\n    address internal immutable controller = msg.sender;\n\n    constructor(IPoolManager manager_) {\n        manager = manager_;\n    }\n\n    receive() external payable {}\n\n    function seed(PoolKey calldata key, bool tokenIsZero) external {\n        require(msg.sender == controller, \"controller only\");\n        manager.unlock(abi.encode(true, key, tokenIsZero, int256(10_000 ether)));\n    }\n\n    function swap(PoolKey calldata key, bool zeroForOne, int256 amount) external returns (BalanceDelta) {\n        require(msg.sender == controller, \"controller only\");\n        return abi.decode(manager.unlock(abi.encode(false, key, zeroForOne, amount)), (BalanceDelta));\n    }\n\n    function unlockCallback(bytes calldata data) external override returns (bytes memory) {\n        require(msg.sender == address(manager), \"manager only\");\n        (bool isSeed, PoolKey memory key, bool direction, int256 amount) =\n            abi.decode(data, (bool, PoolKey, bool, int256));\n        BalanceDelta delta;\n        if (isSeed) {\n            (delta,) = manager.modifyLiquidity(\n                key,\n                ModifyLiquidityParams(\n                    direction ? int24(0) : int24(-600), direction ? int24(600) : int24(0), amount, bytes32(0)\n                ),\n                \"\"\n            );\n        } else {\n            uint160 limit = direction ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1;\n            delta = manager.swap(key, SwapParams(direction, amount, limit), \"\");\n        }\n        _settle(key.currency0, delta.amount0());\n        _settle(key.currency1, delta.amount1());\n        return abi.encode(delta);\n    }\n\n    function _settle(Currency currency, int128 delta) private {\n        if (delta < 0) {\n            uint256 amount = uint256(-int256(delta));\n            if (Currency.unwrap(currency) == address(0)) {\n                manager.settle{value: amount}();\n            } else {\n                manager.sync(currency);\n                OneMDollar(Currency.unwrap(currency)).transfer(address(manager), amount);\n                manager.settle();\n            }\n        } else if (delta > 0) {\n            manager.take(currency, address(this), uint256(int256(delta)));\n        }\n    }\n}\n\n/// @dev The brief asks for a 99% fee on the liquidity pool. The launch has exactly one pool: the\n/// Uniswap v4 pool inside the PoolManager. A buy at that pool must pay the fee to the treasury.\ncontract LaunchPoolUntaxedTest is Test {\n    PoolManager internal manager;\n    OneMDollar internal token;\n    V4Participant internal factory;\n    address internal constant OTHER_POOL = address(0x1001);\n    address internal constant TREASURY = address(0x1002);\n\n    function setUp() public {\n        manager = new PoolManager(address(this));\n        factory = new V4Participant(manager);\n        vm.prank(address(factory));\n        token = new OneMDollar(OTHER_POOL, TREASURY, address(manager));\n        assertEq(token.balanceOf(address(factory)), token.totalSupply(), \"factory holds the supply\");\n    }\n\n    function test_buyAtTheLaunchPoolPaysThePoolTax() public {\n        bool tokenIsZero = address(token) < address(0);\n        PoolKey memory key = PoolKey(\n            Currency.wrap(tokenIsZero ? address(token) : address(0)),\n            Currency.wrap(tokenIsZero ? address(0) : address(token)),\n            3000,\n            60,\n            IHooks(address(0))\n        );\n        manager.initialize(key, uint160(1 << 96));\n        factory.seed(key, tokenIsZero);\n        assertGt(token.balanceOf(address(manager)), 0, \"seed arrived\");\n\n        V4Participant trader = new V4Participant(manager);\n        vm.deal(address(trader), 1 ether);\n        uint256 treasuryBefore = token.balanceOf(TREASURY);\n\n        // Buy: 0.01 ETH exact input, 1MD out of the launch pool to the trader.\n        BalanceDelta delta = trader.swap(key, !tokenIsZero, -0.01 ether);\n        int128 tokenDelta = tokenIsZero ? delta.amount0() : delta.amount1();\n        assertGt(tokenDelta, 0, \"swap produced tokens\");\n        uint256 gross = uint256(int256(tokenDelta));\n        uint256 fee = (gross * token.TAX_BPS()) / token.BPS_DENOMINATOR();\n        assertGt(fee, 0, \"fee is material\");\n\n        assertEq(token.balanceOf(address(trader)), gross - fee, \"buyer should receive the 1% net\");\n        assertEq(token.balanceOf(TREASURY) - treasuryBefore, fee, \"treasury should receive the 99% pool fee\");\n    }\n}","reproduction":"State: PoolManager M deployed; factory F deploys OneMDollar(liquidityPool=0x1001, feeRecipient=0x1002, poolManager=M) and holds the 1e27 supply; pool key (1MD/ETH, fee 3000, spacing 60, no hook) initialised at sqrtPriceX96 = 2^96; F seeds 10,000e18 liquidity single-sided in 1MD. Call: an ordinary trader swaps 0.01 ETH exact-input for 1MD (manager.swap, then manager.take(1MD, trader, delta)). Actual: trader balance 9969990059919910 (100% of the swap output), treasury balance 0. Expected under the brief: trader 99699900599200 (1%), treasury 9870290159320710 (99%). The same holds for a sell (trader -> manager): treasury receives 0. The proof test fails on this tree with 'buyer should receive the 1% net: 9969990059919910 != 99699900599200' and passes once transfers from poolManager are taxed.","severity":"high","snippet":"            from != address(0) && (from == liquidityPool || to == liquidityPool) && from != poolManager\n                && to != poolManager","title":"The launch's only liquidity pool (the Uniswap v4 PoolManager) is fully exempt, so the 99% pool fee never applies in the launch"},{"citation":"resolved","description":"Even under the delivered design (a separate taxable venue at `liquidityPool`), the tax collects nothing from any trader who routes through the launch PoolManager. Lines 47-48 exempt a transfer whenever the manager is EITHER endpoint, including when the OTHER endpoint is the taxed pool. The v4 PoolManager is a public pass-through: inside `unlock`, anyone may `sync(currency)`, move tokens to the manager, `settle()` to be credited the measured balance delta, and `take(currency, to, amount)` to ANY address. Sell bypass: wallet -> manager is an ordinary untaxed transfer; `take(1MD, liquidityPool, amount)` is manager -> pool, exempt by `from != poolManager`; the pool then receives the full gross and its swap pays out the paired asset on the full amount. Buy bypass: any v2-style pool whose `swap(amount0Out, amount1Out, to, data)` lets the caller choose `to` sends its output to the manager (pool -> manager, exempt by `to != poolManager`), the attacker settles for the credit and takes to itself (manager -> attacker, exempt). Who profits: every informed trader/router keeps the 99% that should have gone to the treasury; cost is one unlock worth of gas. The README acknowledges 'routing through the exempt manager can avoid this fee', which makes the fee optional and therefore worthless as an economic mechanism. The exemption is not needed for manager accounting on these legs: `_settle` credits `balanceOfSelf() - reservesBefore` (lib/v4-core/src/PoolManager.sol:357-359), so a taxed pool -> manager leg simply credits the 1% that arrived, and `take` debits the full amount from the caller regardless of what the recipient receives. Minimal fix: tax whenever either endpoint is `liquidityPool`, i.e. `from != address(0) && (from == liquidityPool || to == liquidityPool)`, and keep the manager exemption only for legs that do not touch `liquidityPool`. Verified locally: the protected floor's flows (factory -> distributor -> claimant, seed, buy, sell) never touch `liquidityPool` and stay untaxed, and both proof tests pass.","line":48,"path":"src/OneMDollar.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.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 {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {OneMDollar} from \"src/OneMDollar.sol\";\n\n/// @dev Stands in for the configured taxable venue. Like a Uniswap v2 pair's\n/// swap(amount0Out, amount1Out, to, data), it delivers its token output to whatever\n/// address the caller names. Nothing else about the venue matters for this test.\ncontract TaxedVenue {\n    OneMDollar internal immutable token;\n\n    constructor(OneMDollar token_) {\n        token = token_;\n    }\n\n    function swapOut(address to, uint256 amount) external {\n        token.transfer(to, amount);\n    }\n}\n\n/// @dev An ordinary trader that uses the exempt launch PoolManager as a pass-through:\n/// sync -> move tokens in -> settle -> take to the final recipient.\ncontract PassThroughTrader is IUnlockCallback {\n    IPoolManager internal immutable manager;\n    OneMDollar internal immutable token;\n    TaxedVenue internal immutable venue;\n\n    constructor(IPoolManager manager_, OneMDollar token_, TaxedVenue venue_) {\n        manager = manager_;\n        token = token_;\n        venue = venue_;\n    }\n\n    /// Sell `amount` into the taxed venue without paying the pool tax.\n    function sellViaManager(uint256 amount) external {\n        manager.unlock(abi.encode(true, amount));\n    }\n\n    /// Buy `amount` out of the taxed venue without paying the pool tax.\n    function buyViaManager(uint256 amount) external {\n        manager.unlock(abi.encode(false, amount));\n    }\n\n    function unlockCallback(bytes calldata data) external override returns (bytes memory) {\n        require(msg.sender == address(manager), \"manager only\");\n        (bool sell, uint256 amount) = abi.decode(data, (bool, uint256));\n        Currency currency = Currency.wrap(address(token));\n        manager.sync(currency);\n        if (sell) {\n            // wallet -> manager: an ordinary transfer, untaxed by design.\n            token.transfer(address(manager), amount);\n        } else {\n            // venue -> manager: taxable endpoint, but the manager leg is exempt.\n            venue.swapOut(address(manager), amount);\n        }\n        uint256 paid = manager.settle();\n        // manager -> venue (sell) or manager -> trader (buy): the manager leg is exempt again.\n        manager.take(currency, sell ? address(venue) : address(this), paid);\n        return \"\";\n    }\n}\n\ncontract PoolManagerPassThroughTest is Test {\n    PoolManager internal manager;\n    OneMDollar internal token;\n    TaxedVenue internal venue;\n    PassThroughTrader internal trader;\n    address internal constant TREASURY = address(0x1002);\n\n    function setUp() public {\n        manager = new PoolManager(address(this));\n        address predictedVenue = vm.computeCreateAddress(address(this), vm.getNonce(address(this)) + 1);\n        token = new OneMDollar(predictedVenue, TREASURY, address(manager));\n        venue = new TaxedVenue(token);\n        assertEq(address(venue), predictedVenue, \"venue prediction\");\n        trader = new PassThroughTrader(manager, token, venue);\n    }\n\n    /// A sale of 100 1MD into the taxed venue must deliver 1 1MD to the venue and 99 1MD to the\n    /// treasury. Routed wallet -> manager -> venue, the venue receives all 100 and the treasury 0.\n    function test_sellThroughManagerStillPaysPoolTax() public {\n        token.transfer(address(trader), 100 ether);\n        uint256 treasuryBefore = token.balanceOf(TREASURY);\n\n        trader.sellViaManager(100 ether);\n\n        assertEq(token.balanceOf(address(trader)), 0, \"trader kept tokens\");\n        assertLe(token.balanceOf(address(venue)), 1 ether, \"venue should receive at most the 1% net\");\n        assertGe(token.balanceOf(TREASURY) - treasuryBefore, 99 ether, \"treasury should receive at least the 99% fee\");\n    }\n\n    /// A purchase of 100 1MD out of the taxed venue must deliver 1 1MD to the buyer and 99 1MD to\n    /// the treasury. Routed venue -> manager -> buyer, the buyer receives all 100 and the treasury 0.\n    function test_buyThroughManagerStillPaysPoolTax() public {\n        // Fund the venue with 100 1MD. This wallet -> venue leg is taxed in every version of the\n        // token (10,000 in, 100 arrive), so the fixture is identical before and after a fix.\n        token.transfer(address(venue), 10_000 ether);\n        assertEq(token.balanceOf(address(venue)), 100 ether, \"venue fixture\");\n        uint256 treasuryBefore = token.balanceOf(TREASURY);\n\n        trader.buyViaManager(100 ether);\n\n        assertEq(token.balanceOf(address(venue)), 0, \"venue should have paid out\");\n        assertLe(token.balanceOf(address(trader)), 1 ether, \"buyer should receive at most the 1% net\");\n        assertGe(token.balanceOf(TREASURY) - treasuryBefore, 99 ether, \"treasury should receive at least the 99% fee\");\n    }\n}","reproduction":"State: PoolManager M; venue V at the address passed as liquidityPool; OneMDollar(V, treasury=0x1002, M). Trader T holds 100e18 1MD. Sell: T calls M.unlock; in the callback: M.sync(1MD); 1MD.transfer(M, 100e18) [wallet->manager, untaxed]; M.settle() returns 100e18; M.take(1MD, V, 100e18) [manager->pool, exempt]. Actual: V balance +100e18, treasury +0. Expected: V +1e18, treasury +99e18. Buy: V holds 100e18; T calls M.unlock; callback: M.sync(1MD); V.swapOut(M, 100e18) [pool->manager, exempt]; M.settle() returns 100e18; M.take(1MD, T, 100e18) [manager->trader, exempt]. Actual: T +100e18, treasury +0. Expected: T +1e18, treasury +99e18. Proof test fails on this tree with 'venue should receive at most the 1% net: 100000000000000000000 > 1000000000000000000' and 'buyer should receive at most the 1% net: 100000000000000000000 > 1000000000000000000'.","severity":"high","snippet":"                && to != poolManager","title":"The pool tax is bypassed in both directions by routing through the exempt PoolManager (sync/settle/take pass-through), at gas cost only"},{"citation":"resolved","description":"The constructor rejects `msg.sender` as `liquidityPool_` (line 35) and as `poolManager_` (line 28) but accepts it as `feeRecipient_`, and the README's deployment table says the treasury 'May be the deployer'. In the launch the constructor's msg.sender is ProjectFactory, a contract that forwards the requester's remainder once at launch and has no path to spend 1MD credited to it afterwards. A manifest that writes `$factory` as the second constructor argument deploys, passes the protected floor, and then sends 99% of every taxed transfer to an address nobody can withdraw from: the fee is permanently lost to the requester rather than paid to a treasury. The code cannot know who msg.sender is, but it can refuse the one address the launch guarantees is a non-custodial contract, as it already does for the other two arguments. Fix: add `feeRecipient_ == msg.sender` to the InvalidFeeRecipient condition and drop 'May be the deployer' from the README.","line":31,"path":"src/OneMDollar.sol","reproduction":"State: contract C (standing in for the factory) runs `new OneMDollar(0x1001, address(C), M)`; the constructor succeeds. Call: C transfers 100e18 to Alice; Alice calls transfer(0x1001, 100e18). Actual: balanceOf(C) increases by 99e18 and C exposes no function that moves 1MD, so the fee is unrecoverable. Expected: the constructor reverts with InvalidFeeRecipient for feeRecipient_ == msg.sender, exactly as it does for the pool and manager arguments.","severity":"low","snippet":"        if (feeRecipient_ == address(0) || feeRecipient_ == address(this) || feeRecipient_ == poolManager_) {","title":"Constructor accepts the deployer as feeRecipient; in a launch the deployer is the factory contract, which would strand every fee"}],"hash":"574873d03fc3702cdad7c1f2aef00b2f5465956046703e2792d0ee71fb070cc4","nodeId":"e1a8bc50-9774-493f-9ec1-e1c71cab961d","outcome":"completed","summary":"The review is complete. The findings file exists and is valid, the scratch tests are deleted, and the working tree is clean apart from the intentionally excluded output file.\n\n**Outcome:** three findings written to `.imd-findings.json`, two high with Foundry proofs that fail on the current tree, one low. Build and the existing 32 tests pass; the code is arithmetically sound and conserves supply. The defects are economic: the 99% fee does not reach the treasury in the launch.\n\n- **High, line 47: the launch pool is never taxed.** The only pool in a custom launch lives inside the Uniswap v4 PoolManager, and the token exempts every transfer touching the manager. A 0.01 ETH buy at a real local PoolManager delivered 100% of the output to the trader and nothing to the treasury. The README calls this unavoidable under the floor, but I verified a buy-side-only tax on transfers from the manager passes the floor's seed, buy and sell-everything flows while paying the treasury. That is a design decision for the requester, stated as such in the finding.\n- **High, line 48: the configured pool's tax is bypassable in both directions.** The manager is a public pass-through: sync, move tokens in, settle, then `take` to any address. Selling 100 1MD via wallet to manager to pool delivered 100 to the pool instead of 1. Buying via a v2-style pool whose swap targets the manager delivered 100 to the buyer instead of 1. Manager accounting does not need these exempt legs since settle credits the measured balance delta. The minimal fix taxes any leg touching the pool regardless of the manager, and the floor flows stay untaxed.\n- **Low, line 31: the deployer is accepted as fee recipient.** The constructor rejects the deployer as pool and manager but not as treasury, and the README suggests it. In a launch the deployer is the factory contract, so fees would be stranded there.\n\n**Coverage:** all three entry points answered, approve holds, transfer and transferFrom carry findings. Six invariant rows record what held: conservation, fixed supply, gross allowance and balance debits, fee rounding, and treasury-endpoint accounting. Dust-level rounding below 100 wei was checked and not reported as uneconomic.\n\n**Not reached:** the real ProjectFactory, MerkleDistributor and LaunchLiquidity contracts are not in the tree, so the factory-stranding claim in the low finding rests on the launch description rather than on read source.","treeHash":null,"usage":{"cachedInputTokens":1252512,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":45604,"runtime":"claude","turns":36,"wallClockMs":628443}},{"artifacts":[],"attempt":1,"bundleHash":"c6a8ae03735993a80db99315c8689d55c0fbbcbd2201590ade5ba93efd593849","device":"0db9dd6ea32a69f2","findings":[],"hash":"588a1bbdf8e523294723aaaa2fc3e0e917334e7c2c7ca4bf6f9afbc7c37dad2f","nodeId":"f1b55070-94f3-425e-81eb-1229c0aabff0","outcome":"completed","summary":"Implemented 1MDollar with 18 decimals, one billion tokens minted to the deployer, and a fixed 99% pool tax.\n\nThe tax targets a separately configured pool. The launch PoolManager remains untaxed because the pinned checks require full settlement.\n\nValidation passed: `forge build`, all 32 tests, and `forge fmt --check`. Dependencies are vendored; deployment parameters and operational responsibilities are documented in [README.md](/home/imdworker/.identitymd/work/478fbc53-bdbf-4ab1-b167-98eda44691ea/f1b55070-94f3-425e-81eb-1229c0aabff0/README.md).","treeHash":"88b6163ac105e2c0b034d6b5686d9f2bcf22fe00","usage":{"cachedInputTokens":681088,"inputTokens":75780,"model":"gpt-6-astra","outputTokens":20203,"runtime":"codex","turns":6,"wallClockMs":548835}},{"artifacts":[],"attempt":1,"bundleHash":"3063d4c03863402ea9993118aa0f45008440960f8eb8b68280f839428c3ee6b6","device":"74f6c6912a376f27","findings":[],"hash":"635c44728235f660a463a75919075c84e8f70af971ece9a964243a85726ea193","nodeId":"edea3839-62a1-416a-bcea-09477997e135","outcome":"completed","summary":"Revised only `test/`: repaired stale funding fixtures and invariant accounting, and added manager/pool regressions in both directions.\n\nOffline `forge build` and `forge test` pass: **52 passed, 0 failed**, including failure-path and randomized invariant coverage.\n\nCoverage concerns the separate configured taxable pool; the v4 launch pool remains untaxed.","treeHash":"19dd05f5cea046440925f708af480d0b48bc7b4a","usage":{"cachedInputTokens":1266560,"inputTokens":105688,"model":"gpt-6-astra","outputTokens":9348,"runtime":"codex","turns":5,"wallClockMs":541247}},{"artifacts":[],"attempt":1,"bundleHash":"71c29c7e97c85bd6deb663869e3e01ede491468ad5cf7f778edef72be01e4661","device":"992fb0c2029425f3","findings":[],"hash":"89192ed01fc2c5a660fe45c60d92edbdae264149fc604b91b6c5638990fd85c2","nodeId":"c0c5cbdd-9471-45cc-af6a-9f9e3cf0a24a","outcome":"completed","summary":"Updated only [launch.json](/home/worker2/.identitymd/work/478fbc53-bdbf-4ab1-b167-98eda44691ea/c0c5cbdd-9471-45cc-af6a-9f9e3cf0a24a/launch.json), clarifying constructor arguments, exact supply, and tax behavior while preserving accepted parameters and verbatim economics.\n\nSchema and ABI checks passed. `forge build` succeeded; all 36 tests passed.\n\nThe configured taxable venue remains unverified; the accepted implementation leaves the v4 launch pool untaxed.","treeHash":"59cbd3333c09f321208a01d345358f364ce1288e","usage":{"cachedInputTokens":193280,"inputTokens":28552,"model":"gpt-6-astra","outputTokens":3741,"runtime":"codex","turns":3,"wallClockMs":210626}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5fd2de06561c50a4","findings":[{"citation":"resolved","description":"Area: Access Control x Asymmetry (Trust Gap seam 3) and Asymmetry step 6 (a defensive clause that should not exist). The taxed branch of _update is skipped whenever either endpoint is poolManager, even when the other endpoint is liquidityPool. The exemption is granted to an address, not to a flow, and the Uniswap v4 PoolManager is a permissionless contract: anyone can call unlock(), sync(currency) is open, settle() credits whoever unlocked with whatever balance arrived, and take(currency,to,amount) makes the manager transfer its tokens to any address the unlocker names. So an unprivileged trader uses the manager as a toll-free relay: buy side = venue -> manager (exempt, to == poolManager) then manager -> trader (exempt, from == poolManager); sell side = trader -> manager (untaxed wallet transfer) then take() manager -> venue (exempt). The 99% fee that the brief asks for at the pool is collected only from traders who do not know the trick; the treasury (feeRecipient) loses the fee on every informed trade, and ordinary traders are taxed 99% while sophisticated ones pay 0%. The clause is not needed for the launch: the constructor already enforces liquidityPool != poolManager and liquidityPool != factory, so no launch flow (factory -> distributor, factory -> manager seed, manager <-> trader swaps, claims, remainder) ever has liquidityPool as an endpoint, and test/LaunchCompatibility.t.sol passes unchanged with the clause removed (verified locally). Tellingly the project's own unit-test helper _fundPool in test/OneMDollar.t.sol funds the pool through exactly this relay (deployer -> MANAGER -> POOL) because it is the only untaxed way in. README.md line 50 mentions that 'routing through the exempt manager' can avoid the fee, but frames it as an alternative venue; it does not say that the taxed pool itself can be traded at zero tax by any caller. Fix (minimal, preserves the design): delete '&& from != poolManager && to != poolManager' from the condition at lines 47-48 so the tax applies to every transfer whose endpoint is liquidityPool. Four of the author's unit tests (test_buyTaxesPoolOutput, test_poolManagerEndpointsAlwaysReceiveFullAmounts, test_poolSelfTransferChargesFeeAndWalletSelfTransferDoesNot, testFuzz_buysConserveSupplyAndApplyExactFee) then fail because _fundPool relied on the relay; they must fund the pool through the taxed path instead. The NatSpec at lines 7-8 should be updated to say the manager is untaxed because it is never the taxed pool, not because transfers touching it are exempt.","line":47,"path":"src/OneMDollar.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.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 {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {OneMDollar} from \"src/OneMDollar.sol\";\n\n/// @dev The taxed venue. Like UniswapV2Pair.swap, the caller names who receives the output.\ncontract TaxedVenue {\n    function swap(OneMDollar token, uint256 amountOut, address to) external {\n        token.transfer(to, amountOut);\n    }\n}\n\n/// @dev An ordinary, unprivileged trader that routes the taxed venue's tokens through the exempt\n/// PoolManager using only its public unlock / sync / settle / take surface.\ncontract Relay is IUnlockCallback {\n    IPoolManager internal immutable manager;\n    OneMDollar internal immutable token;\n    TaxedVenue internal immutable venue;\n\n    constructor(IPoolManager manager_, OneMDollar token_, TaxedVenue venue_) {\n        manager = manager_;\n        token = token_;\n        venue = venue_;\n    }\n\n    /// Buy side: venue -> manager (exempt) -> relay (exempt).\n    function buy(uint256 amount) external {\n        manager.unlock(abi.encode(true, amount));\n    }\n\n    /// Sell side: relay -> manager (exempt) -> venue (exempt).\n    function sell(uint256 amount) external {\n        manager.unlock(abi.encode(false, amount));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(manager), \"manager only\");\n        (bool isBuy, uint256 amount) = abi.decode(data, (bool, uint256));\n        Currency c = Currency.wrap(address(token));\n        manager.sync(c);\n        if (isBuy) {\n            venue.swap(token, amount, address(manager));\n        } else {\n            token.transfer(address(manager), amount);\n        }\n        uint256 credited = manager.settle();\n        manager.take(c, isBuy ? address(this) : address(venue), credited);\n        return \"\";\n    }\n}\n\ncontract PoolManagerRelayBypassTest is Test {\n    PoolManager internal manager;\n    OneMDollar internal token;\n    TaxedVenue internal venue;\n    Relay internal relay;\n    address internal constant TREASURY = address(0x1002);\n    uint256 internal constant AMOUNT = 100 ether;\n\n    function setUp() public {\n        manager = new PoolManager(address(this));\n        venue = new TaxedVenue();\n        token = new OneMDollar(address(venue), TREASURY, address(manager));\n        relay = new Relay(manager, token, venue);\n        // Fund the venue through the taxed path: 10,000 in, 1% (100) lands in the venue.\n        token.transfer(address(venue), 10_000 ether);\n        assertEq(token.balanceOf(address(venue)), AMOUNT);\n        assertEq(token.balanceOf(TREASURY), 9_900 ether);\n    }\n\n    /// A buyer taking 100 1MD out of the taxed venue should net at most 1 1MD; the treasury 99.\n    function test_buyFromTaxedPoolThroughManagerPaysNoTax() public {\n        uint256 treasuryBefore = token.balanceOf(TREASURY);\n        relay.buy(AMOUNT);\n        assertLe(token.balanceOf(address(relay)), AMOUNT / 100, \"buyer kept more than the 1% net of a taxed buy\");\n        assertEq(token.balanceOf(TREASURY) - treasuryBefore, AMOUNT - AMOUNT / 100, \"treasury did not receive the 99% fee\");\n    }\n\n    /// A seller putting 100 1MD into the taxed venue should deliver at most 1 1MD; the treasury 99.\n    function test_sellIntoTaxedPoolThroughManagerPaysNoTax() public {\n        token.transfer(address(relay), AMOUNT); // ordinary wallet transfer, untaxed by design\n        uint256 venueBefore = token.balanceOf(address(venue));\n        uint256 treasuryBefore = token.balanceOf(TREASURY);\n        relay.sell(AMOUNT);\n        assertLe(token.balanceOf(address(venue)) - venueBefore, AMOUNT / 100, \"venue received more than the 1% net of a taxed sell\");\n        assertEq(token.balanceOf(TREASURY) - treasuryBefore, AMOUNT - AMOUNT / 100, \"treasury did not receive the 99% fee\");\n    }\n}","reproduction":"State: token = new OneMDollar(venue, TREASURY, manager) where manager is a real v4 PoolManager and venue is any contract that lets the caller name the output recipient (UniswapV2Pair.swap's `to` parameter; the proof uses a minimal stand-in). Venue holds 100e18 1MD. Attacker is an unprivileged contract. Call: attacker -> manager.unlock(data); in unlockCallback: manager.sync(1MD); venue.swap(100e18, to=manager); credited = manager.settle(); manager.take(1MD, attacker, credited). Expected (99% pool tax): attacker ends with at most 1e18 and TREASURY gains 99e18. Actual: attacker ends with 100e18, TREASURY gains 0, no PoolTax event. Sell side: attacker holds 100e18; unlock; sync; token.transfer(manager, 100e18); credited = settle(); take(1MD, venue, credited). Expected venue +1e18, TREASURY +99e18. Actual venue +100e18, TREASURY +0. Proof file test/scratch/PoolManagerRelayBypass.t.sol: both tests fail on the current code (100e18 > 1e18) and pass once the poolManager clause at lines 47-48 is removed.","severity":"high","snippet":"            from != address(0) && (from == liquidityPool || to == liquidityPool) && from != poolManager\n                && to != poolManager","title":"PoolManager exemption lets anyone relay through the launch PoolManager to buy from and sell into the taxed pool with 0% tax"},{"citation":"resolved","description":"Scope note, not a code bug, recorded so the requester confirms it. The brief asks for a 99% tax 'just on the liquidity pool'. The launch's only pool is the Uniswap v4 pool whose balances live in the PoolManager, and the protected floor (.imd/reads/protected/custom_token/Token.protected.t.sol, test_theSeedAndASwapEachWaySucceed) requires trader <-> PoolManager swaps to settle whole, so taxing that pool is incompatible with admission. README.md lines 8-16 document this and the contract instead taxes an immutable liquidityPool address that the launch does not create; the manifest must supply a static address for it and the constructor refuses zero. As delivered, if the requester supplies a placeholder, the token has no effective tax anywhere; if they supply a real second venue, finding 1 applies to it. If the requester wants the tax on the launch pool itself, it needs a different mechanism (for example a v4 hook taking the fee at swap time) and a scope decision outside this token.","line":7,"path":"src/OneMDollar.sol","reproduction":"State: token deployed by the factory with constructorArgs [liquidityPool=any static address, feeRecipient=TREASURY, $poolManager]; pool seeded through the PoolManager as in test/LaunchCompatibility.t.sol _roundTrip. Call: an ordinary trader swaps 0.01 ETH for 1MD then sells it all back. Observed: TREASURY balance stays 0 (LaunchCompatibility asserts assertEq(token.balanceOf(TREASURY), 0) after the round trip). Against the brief's literal reading (99% tax on the liquidity pool) the expected treasury balance would be nonzero; against the floor it must be zero.","severity":"info","snippet":"/// @dev The launch PoolManager is exempt so its exact settlement accounting remains valid.","title":"The launch pool is untaxed by design: the 99% tax applies only to a separately configured address, not to the pool the launch creates"}],"hash":"8ec39994c2f52ba29e4b789ff0b4dda11b1b2a7d07ce3fafee738b74287fb41c","nodeId":"0fe1763b-825d-483e-beb7-9ecf5b458461","outcome":"completed","summary":"Taylor, review complete. Findings are in `.imd-findings.json` with the proof test under `test/scratch/`. No tracked file was changed.\n\n**One high finding, with a failing proof.** The tax exemption for the launch PoolManager at `src/OneMDollar.sol:47` is granted to an address, not a flow. The Uniswap v4 PoolManager is permissionless: anyone can `unlock`, `sync`, `settle`, and `take` to any recipient. So an ordinary trader uses it as a toll-free relay around the taxed pool in both directions. Buy side goes venue to manager to trader. Sell side goes trader to manager to venue. Every leg is exempt, and the treasury collects nothing.\n\n- The proof at `test/scratch/PoolManagerRelayBypass.t.sol` runs a real v4 PoolManager. Both tests fail now because the trader keeps the full amount instead of 1%.\n- The clause is unnecessary for the launch. The constructor already forces the taxed pool to differ from the manager and factory, so no launch flow ever touches the taxed address. With the clause deleted, the proof passes and the launch-floor suite still passes. Four of the author's unit tests then fail only because their `_fundPool` helper funds the pool through this exact relay.\n- The README mentions routing through the manager as a way to avoid the fee, but frames it as another venue, not as zero-tax trading at the taxed pool itself.\n\n**One info note for the requester.** The launch pool is untaxed by design, because the admission floor requires PoolManager swaps to settle whole. The tax applies only to a static address the manifest must supply. If that address is a placeholder, the token has no effective tax anywhere. Taxing the launch pool would need a different mechanism such as a v4 hook, which is a scope decision.\n\n**Coverage.** All three entry points have rows: `approve` holds, `transfer` and `transferFrom` carry finding 1. Five invariant rows cover constructor roles, fixed supply, exact launch flows, forbidden opcodes, and taxed-branch arithmetic with aliased endpoints. All hold. Static analysis reported nothing above a large-literal note, which is not a defect.","treeHash":null,"usage":{"cachedInputTokens":841201,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":23274,"runtime":"claude","turns":24,"wallClockMs":314147}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1d2eacca0a6e8449","findings":[],"hash":"98e15e9a65dcfbfd22e98b40ff9bf1cba5ed1e3ce4753c312dfc50d95cb107f6","nodeId":"c0c5cbdd-9471-45cc-af6a-9f9e3cf0a24a","outcome":"failed","summary":"the task produced no changes; the agent's last message was: I need the separate taxable-pool address to finish `launch.json`. The constructor rejects `$poolManager` for that argument, and the supplied inputs contain no pool address.\n\n`forge build` succeeded; all 32 tests passed. No submitted files changed.","treeHash":null,"usage":{"cachedInputTokens":293376,"inputTokens":29626,"model":"gpt-6-astra","outputTokens":4862,"runtime":"codex","turns":5,"wallClockMs":217360}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"820ba900755d37ad","findings":[{"citation":"resolved","description":"Prior finding 1fa97e43fa2025e33c19a9050bd5441edb28ec465e818aad584d6cdd576f9302 remains reproducible; the overlapping flow, permissions, math and economics reports are merged here. The revised condition correctly taxes PoolManager relays involving liquidityPool, but normal launch-pool swaps never involve that separate address. The constructor still rejects liquidityPool_ == poolManager_ (lines 37-40), and both addresses are immutable. Consequently launch buys and sells pay no token tax. Contrary to the author response describing its earlier input tree, launch.json is present in this reviewed tree: constructorArgs[0] selects 0x1001, contracts is empty, and notes explicitly say a functional separate taxable venue has not been established and the launch v4 pool has no 99% transfer tax. This is a failure to deliver the requested launch economics, not evidence of stolen funds. The author correctly identifies an integration/scope conflict: a token tax that shorts manager settlement is not a compatible repair, and the README disclosure is not a fix or requester acceptance. Resolution needs a launch integration that implements the agreed tax while preserving settlement, or explicit requester acceptance of revised economics and a verified separate taxable venue; do not silently impose an incompatible token-only tax.","line":49,"path":"src/OneMDollar.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.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 {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} 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 {OneMDollar} from \"src/OneMDollar.sol\";\n\n/// @dev Seeds the launch pool and trades at it exactly as the factory and an ordinary trader do.\ncontract V4Participant is IUnlockCallback {\n    IPoolManager internal immutable manager;\n    address internal immutable controller = msg.sender;\n\n    constructor(IPoolManager manager_) {\n        manager = manager_;\n    }\n\n    receive() external payable {}\n\n    function seed(PoolKey calldata key, bool tokenIsZero) external {\n        require(msg.sender == controller, \"controller only\");\n        manager.unlock(abi.encode(true, key, tokenIsZero, int256(10_000 ether)));\n    }\n\n    function swap(PoolKey calldata key, bool zeroForOne, int256 amount) external returns (BalanceDelta) {\n        require(msg.sender == controller, \"controller only\");\n        return abi.decode(manager.unlock(abi.encode(false, key, zeroForOne, amount)), (BalanceDelta));\n    }\n\n    function unlockCallback(bytes calldata data) external override returns (bytes memory) {\n        require(msg.sender == address(manager), \"manager only\");\n        (bool isSeed, PoolKey memory key, bool direction, int256 amount) =\n            abi.decode(data, (bool, PoolKey, bool, int256));\n        BalanceDelta delta;\n        if (isSeed) {\n            (delta,) = manager.modifyLiquidity(\n                key,\n                ModifyLiquidityParams(\n                    direction ? int24(0) : int24(-600), direction ? int24(600) : int24(0), amount, bytes32(0)\n                ),\n                \"\"\n            );\n        } else {\n            uint160 limit = direction ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1;\n            delta = manager.swap(key, SwapParams(direction, amount, limit), \"\");\n        }\n        _settle(key.currency0, delta.amount0());\n        _settle(key.currency1, delta.amount1());\n        return abi.encode(delta);\n    }\n\n    function _settle(Currency currency, int128 delta) private {\n        if (delta < 0) {\n            uint256 amount = uint256(-int256(delta));\n            if (Currency.unwrap(currency) == address(0)) {\n                manager.settle{value: amount}();\n            } else {\n                manager.sync(currency);\n                OneMDollar(Currency.unwrap(currency)).transfer(address(manager), amount);\n                manager.settle();\n            }\n        } else if (delta > 0) {\n            manager.take(currency, address(this), uint256(int256(delta)));\n        }\n    }\n}\n\n/// @dev The brief asks for a 99% fee on the liquidity pool. The launch has exactly one pool: the\n/// Uniswap v4 pool inside the PoolManager. A buy at that pool must pay the fee to the treasury.\ncontract LaunchPoolUntaxedTest is Test {\n    PoolManager internal manager;\n    OneMDollar internal token;\n    V4Participant internal factory;\n    address internal constant OTHER_POOL = address(0x1001);\n    address internal constant TREASURY = address(0x1002);\n\n    function setUp() public {\n        manager = new PoolManager(address(this));\n        factory = new V4Participant(manager);\n        vm.prank(address(factory));\n        token = new OneMDollar(OTHER_POOL, TREASURY, address(manager));\n        assertEq(token.balanceOf(address(factory)), token.totalSupply(), \"factory holds the supply\");\n    }\n\n    function test_buyAtTheLaunchPoolPaysThePoolTax() public {\n        bool tokenIsZero = address(token) < address(0);\n        PoolKey memory key = PoolKey(\n            Currency.wrap(tokenIsZero ? address(token) : address(0)),\n            Currency.wrap(tokenIsZero ? address(0) : address(token)),\n            3000,\n            60,\n            IHooks(address(0))\n        );\n        manager.initialize(key, uint160(1 << 96));\n        factory.seed(key, tokenIsZero);\n        assertGt(token.balanceOf(address(manager)), 0, \"seed arrived\");\n\n        V4Participant trader = new V4Participant(manager);\n        vm.deal(address(trader), 1 ether);\n        uint256 treasuryBefore = token.balanceOf(TREASURY);\n\n        // Buy: 0.01 ETH exact input, 1MD out of the launch pool to the trader.\n        BalanceDelta delta = trader.swap(key, !tokenIsZero, -0.01 ether);\n        int128 tokenDelta = tokenIsZero ? delta.amount0() : delta.amount1();\n        assertGt(tokenDelta, 0, \"swap produced tokens\");\n        uint256 gross = uint256(int256(tokenDelta));\n        uint256 fee = (gross * token.TAX_BPS()) / token.BPS_DENOMINATOR();\n        assertGt(fee, 0, \"fee is material\");\n\n        assertEq(token.balanceOf(address(trader)), gross - fee, \"buyer should receive the 1% net\");\n        assertEq(token.balanceOf(TREASURY) - treasuryBefore, fee, \"treasury should receive the 99% pool fee\");\n    }\n}","reproduction":"Copied the unchanged supplied .imd/reads/proofs/Proof_68ec01616526.t.sol to test/scratch/LaunchPoolTax.t.sol. Executed it with the other supplied proofs using forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path 'test/scratch/*.t.sol' -vv; isolate it with --match-path test/scratch/LaunchPoolTax.t.sol. State: a real local v4 PoolManager M; factory F deploys OneMDollar(0x1001, 0x1002, M), receiving all 1e27 units; initialize a hookless ETH/1MD pool with fee 3000, tick spacing 60 and sqrtPriceX96=2^96; F adds single-sided liquidity of 10000e18 over ticks [-600,0]. Trader funded with 1 ETH buys with 0.01 ETH exact input. Actual gross token output and buyer receipt are both 9969990059919910 minor units, treasury receipt is 0. Expected under the requested pool tax: fee floor(gross*9900/10000)=9870290159320710, buyer receipt 99699900599200. test_buyAtTheLaunchPoolPaysThePoolTax fails with buyer should receive the 1% net: 9969990059919910 != 99699900599200. Also ran the author's test_nativePairSingleSidedSeedBuyAndSell, test_erc20PairSingleSidedSeedBuyAndSell and test_invalidConstructorParametersRevert in the existing suite (52 tests passed): both launch buy/sell round trips assert treasury balance remains zero, and OneMDollar(M, 0x1002, M) reverts InvalidLiquidityPool. Delegated transfers share the same untaxed manager path: the passing test_poolManagerWalletEndpointsReceiveFullAmounts approves ROUTER for 100e18 from ALICE, then ROUTER.transferFrom(ALICE, MANAGER, 100e18) credits all 100e18 to MANAGER and zero to TREASURY. A documented design conflict does not remove this reproduced economic gap.","severity":"medium","snippet":"        if (from != address(0) && (from == liquidityPool || to == liquidityPool)) {","title":"Unresolved: the launch liquidity pool still never pays the requested 99% tax"}],"hash":"9de4b4b4c6f8549856f5dc0f7e30b3a8afaa5c94e54384e1af8872e469a2a92b","nodeId":"ff81e995-0d4c-4bbe-ab09-4878a15b2fb0","outcome":"completed","summary":"Wrote [`.imd-findings.json`](.imd-findings.json) with one reproduced medium finding: the launch pool remains untaxed.\n\nConfirmed both code fixes and dropped the rounding advisory as documented behavior. All three entry points are covered.\n\nValidation: 52 existing tests and eight relay-proof tests passed; the launch-tax proof failed as reported. The network-specific protected harness wasn’t run because required helpers and inputs are absent.\n\nImplementation files are unchanged.","treeHash":null,"usage":{"cachedInputTokens":995584,"inputTokens":119115,"model":"gpt-6-astra","outputTokens":7681,"runtime":"codex","turns":5,"wallClockMs":476181}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ddfb1efa72fe9a94","findings":[{"citation":"resolved","description":"Merged from audit_flow, audit_permissions, audit_math and audit_economics (same root cause, four reports). _update skips the taxed branch whenever either endpoint is poolManager, even when the other endpoint is liquidityPool. The Uniswap v4 PoolManager is permissionless: inside unlock anyone may sync(token), move tokens into the manager, settle() to be credited exactly what arrived, and take(token, to, amount) to have the manager transfer to any address. Each leg of a trade at the taxed venue can therefore be given the manager as its other endpoint. Sell: trader -> manager (ordinary, untaxed) then take() manager -> liquidityPool (exempt by from != poolManager). Buy: venue delivers output to the manager (exempt by to != poolManager; any v2-style swap(...,to,...) or router allows this) then take() manager -> trader (exempt). No fee is computed, the treasury receives 0 instead of 99%, and the three addresses are immutable so this is permanent. Reproduced: all three specialist proofs fail on this tree for exactly this reason. The exemption on these legs is not needed by the launch: the constructor already forbids liquidityPool == poolManager and liquidityPool == factory, so no launch flow (factory -> distributor, seed, trader <-> manager swaps, claims, remainder) has liquidityPool as an endpoint. Verified locally: with `&& from != poolManager && to != poolManager` removed from the condition, the attached proof passes and all seven tests in test/LaunchCompatibility.t.sol (seed, buy, sell for native and ERC-20 pairs, swarm share, admin probes, opcode scan) still pass. Minimal fix preserving the design: tax every transfer with liquidityPool as an endpoint, i.e. condition `from != address(0) && (from == liquidityPool || to == liquidityPool)`. The author's unit tests that fund the pool through the manager relay (test/OneMDollar.t.sol _fundPool and test_poolManagerEndpointsAlwaysReceiveFullAmounts) encode the current behaviour and need updating; NatSpec at lines 7-8 and the README table row 'including transfers involving the taxable pool' should change with it. Note that under the current launch.json the taxed address is the placeholder 0x...1001 with no venue, so the leak only materialises once a real venue exists there (see finding 2).","line":47,"path":"src/OneMDollar.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.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 {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {OneMDollar} from \"src/OneMDollar.sol\";\n\n/// @dev Stands in for the configured taxable venue. Like a Uniswap v2 pair's\n/// swap(amount0Out, amount1Out, to, data), it delivers its token output to whatever\n/// address the caller names. Nothing else about the venue matters for this test.\ncontract TaxedVenue {\n    OneMDollar internal immutable token;\n\n    constructor(OneMDollar token_) {\n        token = token_;\n    }\n\n    function swapOut(address to, uint256 amount) external {\n        token.transfer(to, amount);\n    }\n}\n\n/// @dev An ordinary trader that uses the exempt launch PoolManager as a pass-through:\n/// sync -> move tokens in -> settle -> take to the final recipient.\ncontract PassThroughTrader is IUnlockCallback {\n    IPoolManager internal immutable manager;\n    OneMDollar internal immutable token;\n    TaxedVenue internal immutable venue;\n\n    constructor(IPoolManager manager_, OneMDollar token_, TaxedVenue venue_) {\n        manager = manager_;\n        token = token_;\n        venue = venue_;\n    }\n\n    /// Sell `amount` into the taxed venue without paying the pool tax.\n    function sellViaManager(uint256 amount) external {\n        manager.unlock(abi.encode(true, amount));\n    }\n\n    /// Buy `amount` out of the taxed venue without paying the pool tax.\n    function buyViaManager(uint256 amount) external {\n        manager.unlock(abi.encode(false, amount));\n    }\n\n    function unlockCallback(bytes calldata data) external override returns (bytes memory) {\n        require(msg.sender == address(manager), \"manager only\");\n        (bool sell, uint256 amount) = abi.decode(data, (bool, uint256));\n        Currency currency = Currency.wrap(address(token));\n        manager.sync(currency);\n        if (sell) {\n            // wallet -> manager: an ordinary transfer, untaxed by design.\n            token.transfer(address(manager), amount);\n        } else {\n            // venue -> manager: taxable endpoint, but the manager leg is exempt.\n            venue.swapOut(address(manager), amount);\n        }\n        uint256 paid = manager.settle();\n        // manager -> venue (sell) or manager -> trader (buy): the manager leg is exempt again.\n        manager.take(currency, sell ? address(venue) : address(this), paid);\n        return \"\";\n    }\n}\n\ncontract PoolManagerPassThroughTest is Test {\n    PoolManager internal manager;\n    OneMDollar internal token;\n    TaxedVenue internal venue;\n    PassThroughTrader internal trader;\n    address internal constant TREASURY = address(0x1002);\n\n    function setUp() public {\n        manager = new PoolManager(address(this));\n        address predictedVenue = vm.computeCreateAddress(address(this), vm.getNonce(address(this)) + 1);\n        token = new OneMDollar(predictedVenue, TREASURY, address(manager));\n        venue = new TaxedVenue(token);\n        assertEq(address(venue), predictedVenue, \"venue prediction\");\n        trader = new PassThroughTrader(manager, token, venue);\n    }\n\n    /// A sale of 100 1MD into the taxed venue must deliver 1 1MD to the venue and 99 1MD to the\n    /// treasury. Routed wallet -> manager -> venue, the venue receives all 100 and the treasury 0.\n    function test_sellThroughManagerStillPaysPoolTax() public {\n        token.transfer(address(trader), 100 ether);\n        uint256 treasuryBefore = token.balanceOf(TREASURY);\n\n        trader.sellViaManager(100 ether);\n\n        assertEq(token.balanceOf(address(trader)), 0, \"trader kept tokens\");\n        assertLe(token.balanceOf(address(venue)), 1 ether, \"venue should receive at most the 1% net\");\n        assertGe(token.balanceOf(TREASURY) - treasuryBefore, 99 ether, \"treasury should receive at least the 99% fee\");\n    }\n\n    /// A purchase of 100 1MD out of the taxed venue must deliver 1 1MD to the buyer and 99 1MD to\n    /// the treasury. Routed venue -> manager -> buyer, the buyer receives all 100 and the treasury 0.\n    function test_buyThroughManagerStillPaysPoolTax() public {\n        // Fund the venue with 100 1MD. This wallet -> venue leg is taxed in every version of the\n        // token (10,000 in, 100 arrive), so the fixture is identical before and after a fix.\n        token.transfer(address(venue), 10_000 ether);\n        assertEq(token.balanceOf(address(venue)), 100 ether, \"venue fixture\");\n        uint256 treasuryBefore = token.balanceOf(TREASURY);\n\n        trader.buyViaManager(100 ether);\n\n        assertEq(token.balanceOf(address(venue)), 0, \"venue should have paid out\");\n        assertLe(token.balanceOf(address(trader)), 1 ether, \"buyer should receive at most the 1% net\");\n        assertGe(token.balanceOf(TREASURY) - treasuryBefore, 99 ether, \"treasury should receive at least the 99% fee\");\n    }\n}","reproduction":"State: manager = new PoolManager(owner); venue V (any contract that forwards its 1MD output to a caller-named address, standing in for a v2 pair) at the address passed as liquidityPool; token = new OneMDollar(V, TREASURY=0x1002, manager). Trader T holds 100e18 1MD. Sell: T calls manager.unlock; in unlockCallback: manager.sync(1MD); token.transfer(manager, 100e18); paid = manager.settle() (returns 100e18); manager.take(1MD, V, paid). Expected (README table, 99% tax on transfers into the pool): V +1e18, TREASURY +99e18, PoolTax emitted. Actual: V +100e18, TREASURY +0, no PoolTax. Buy: V holds 100e18 (funded by a taxed 10_000e18 wallet transfer); T unlocks; callback: manager.sync(1MD); V.swapOut(manager, 100e18); paid = settle() = 100e18; manager.take(1MD, T, paid). Expected: T +1e18, TREASURY +99e18. Actual: T +100e18, TREASURY +0. Contrast: T.transfer(V, 100e18) directly pays 99e18 to TREASURY. Run: forge test --match-path test/scratch/PoolManagerPassThrough.t.sol -> both tests FAIL on this tree ('venue should receive at most the 1% net: 100000000000000000000 > 1000000000000000000', 'buyer should receive at most the 1% net: ...'); both PASS with the manager clause removed from lines 47-48.","severity":"high","snippet":"            from != address(0) && (from == liquidityPool || to == liquidityPool) && from != poolManager\n                && to != poolManager","title":"The 99% pool tax is bypassed in both directions by relaying through the exempt PoolManager (sync/settle/take), at gas cost only"},{"citation":"resolved","description":"Merged from audit_flow (medium), audit_permissions (info), audit_math (medium) and audit_economics (high). The brief asks for a 99% fee 'just on the liquidity pool'. A custom launch creates exactly one pool, inside the Uniswap v4 PoolManager, and every transfer to or from poolManager is exempt by this condition; the constructor also rejects liquidityPool_ == poolManager_ (line 36) so the launch pool can never be the taxed one. The taxed venue is instead a static constructor word that must be fixed before the token exists. The accepted launch.json writes 0x0000000000000000000000000000000000001001 for it and its own notes say no venue exists there. As deployed, therefore, buys and sells at the launch pool pay 0 (the project's own test/LaunchCompatibility.t.sol:161 asserts the treasury stays 0 after a buy-and-sell round trip), and the 99% applies only to an address with no liquidity, where the 1% that does arrive is unrecoverable. The token's single requested feature is inert in this launch. The README discloses this reconciliation, but the delivered behaviour is the opposite of the stated requirement, which the requester must accept knowingly or change scope. Severity recalibrated to medium: no funds are lost, but the requested economic guarantee is not delivered. On remedies: a sell-side tax at the manager cannot pass the floor (settle() credits only what arrives, so the trader's sell would revert CurrencyNotSettled). A buy-side-only tax on transfers from poolManager to non-exempt recipients does pass the protected test's literal assertions (bought > 0, full sell-back succeeds; the audit_economics proof demonstrates this with a real PoolManager), but it also taxes every take() of 1MD from the manager including liquidity removal, and the written floor says trader flows must 'move exactly what they say', so admission would need confirmation from the network. The alternatives are to accept an untaxed launch pool and drop or repurpose the liquidityPool argument, or move the fee to the pool layer (a v4 hook), which the launch design does not currently allow. This is a scope decision for the requester; no proof is attached because each remedy changes the agreed design differently.","line":47,"path":"src/OneMDollar.sol","reproduction":"State: exactly test/LaunchCompatibility.t.sol::_roundTrip: factory (CREATE2 deployer) deploys OneMDollar(POOL=0x1001, TREASURY=0x1002, PM=real PoolManager), moves 10% to the distributor, initialises the hookless pool at sqrtPriceX96 = 2^96 and seeds it single-sided; an ordinary trader swaps 0.01 ETH exact-input for 1MD and then sells its whole balance back. Expected under the brief (99% on each pool-side transfer): trader keeps about 1% of the swap output and TREASURY > 0. Actual: trader receives 100% of the output (9969990059919910 wei of 1MD in the audit_economics proof), TREASURY == 0 after both swaps (asserted at test/LaunchCompatibility.t.sol:161), PoolTax never emitted. Run: forge test --match-test test_nativePairSingleSidedSeedBuyAndSell. Inverse: new OneMDollar(PM, TREASURY, PM) reverts InvalidLiquidityPool (lines 34-37), so the launch pool can never be configured as the taxed pool. Manifest evidence: launch.json token.constructorArgs[0] = 0x...1001, notes: 'No production taxable-pool address was supplied ... no ... evidence of a deployed venue at that address.'","severity":"medium","snippet":"            from != address(0) && (from == liquidityPool || to == liquidityPool) && from != poolManager\n                && to != poolManager","title":"The requested 99% tax never applies to the launch liquidity pool: the only pool the launch creates is fully exempt and the taxed address in launch.json is a placeholder with no venue"},{"citation":"resolved","description":"Merged from audit_flow and audit_economics. The constructor rejects msg.sender as poolManager_ (line 28) and as liquidityPool_ (line 35) but accepts it as feeRecipient_, and README line 70 says the treasury 'May be the deployer'. Under the launch msg.sender is ProjectFactory, a shared contract that forwards the supply once and has no path to spend 1MD credited to it later. A manifest writing $factory in the second slot deploys, passes the floor, and sends 99% of every taxed transfer to an address nobody can withdraw from. The accepted launch.json uses the requester's remainderTo, so this launch is not affected; the finding is the missing guard and the misleading README row. Fix: add `|| feeRecipient_ == msg.sender` to the InvalidFeeRecipient condition and drop 'May be the deployer' from the README.","line":31,"path":"src/OneMDollar.sol","reproduction":"State: contract D (standing in for the factory) runs new OneMDollar(0x1001, address(D), PM). Actual: constructor succeeds and feeRecipient() == D. D transfers 100e18 to ALICE; ALICE calls transfer(0x1001, 100e18): balanceOf(D) rises by 99e18 and D has no function that moves 1MD. Expected: InvalidFeeRecipient, exactly as D.deploy(D, TREASURY, PM) reverts InvalidLiquidityPool and D.deploy(POOL, TREASURY, D) reverts InvalidPoolManager. Reproduced in test/scratch/Judge.t.sol::test_deployerAcceptedAsFeeRecipient (passes on this tree, showing the acceptance).","severity":"low","snippet":"        if (feeRecipient_ == address(0) || feeRecipient_ == address(this) || feeRecipient_ == poolManager_) {\n            revert InvalidFeeRecipient();\n        }","title":"Constructor accepts the deploying factory as feeRecipient, which would strand every fee in ProjectFactory"},{"citation":"resolved","description":"From audit_math. fee = value * 9900 / 10000 truncates, so for value 1 the fee is 0 and the whole unit reaches the pool; for 2..99 the pool keeps 1 unit (more than 1%). Economic impact is nil (moving 1 token this way costs 1e18 transactions) and the README documents the rounding, so this is recorded for completeness. If exactness is wanted, round the fee up: (value * TAX_BPS + BPS_DENOMINATOR - 1) / BPS_DENOMINATOR.","line":55,"path":"src/OneMDollar.sol","reproduction":"token = new OneMDollar(POOL, TREASURY, PM); token.transfer(POOL, 1): POOL +1, TREASURY +0, no PoolTax (expected under round-up: fee 1, POOL +0). token.transfer(POOL, 99): fee 98, POOL +1. Reproduced in test/scratch/Judge.t.sol::test_feeRoundsDown and already in test/OneMDollar.t.sol::test_zeroAndDustTransfersRoundFeeDown.","severity":"info","snippet":"            uint256 fee = (value * TAX_BPS) / BPS_DENOMINATOR;","title":"Fee rounds down: taxed transfers below 100 minor units pay less than 99%, and a 1-unit transfer pays 0"}],"hash":"9e0cf4b1933225ccce959c67f49bf04dd685da426bdf9d4c62f09fe39cd1bebc","nodeId":"ff81e995-0d4c-4bbe-ab09-4878a15b2fb0","outcome":"completed","summary":"The review is complete. The findings file is written at the repository root with four merged findings and a six-row coverage record, and no tracked file was changed.\n\n**What I did**\n\n- Ran all four specialist proofs against the current tree. All seven tests fail for the reasons stated.\n- Built a copy of the token with the proposed one-line fix under test/scratch and reran the bypass proof and the full launch-floor suite against it. The proof passes and all seven launch tests still pass, so the fix is safe for admission.\n- Reproduced the two smaller leads and several edge cases in my own scratch test. Ran the project's own suite as a baseline. All 46 tests pass.\n\n**Findings kept, after merging eleven specialist reports into four**\n\n1. **High. PoolManager relay bypasses the 99% tax both ways.** Four specialists reported the same root cause at lines 47 to 48. Anyone can route trader to manager to taxed pool, or pool to manager to trader, using the manager's public sync, settle and take. The treasury receives nothing. The attached proof fails on this tree and passes once the manager clause is dropped from the condition.\n2. **Medium. The launch pool itself is never taxed.** Four specialists reported it at severities from info to high. I set medium: no funds are lost, but the brief's only requested feature is inert at the only pool the launch creates. The launch.json taxed address is a placeholder with no venue, and the project's own test asserts the treasury stays zero after a round trip. No proof attached, because each remedy changes the agreed design and the requester must choose.\n3. **Low. The constructor accepts the deployer as fee recipient.** Two specialists reported it. Reproduced the acceptance and the contrast with the other two slots, which reject the deployer.\n4. **Info. Fee rounds down below 100 minor units.** One specialist reported it. Reproduced and documented in the README, so kept as information.\n\nNothing dropped: every specialist finding reproduced. My own pass over approve, transfer, transferFrom and the constructor found nothing beyond these.\n\n**Coverage**: approve holds, transfer and transferFrom carry finding 1, the constructor carries finding 3, and the supply and launch-flow invariants hold.","treeHash":null,"usage":{"cachedInputTokens":899912,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":15407,"runtime":"claude","turns":14,"wallClockMs":311777}},{"artifacts":[],"attempt":1,"bundleHash":"f9cdbb082d10f304aa17c142c99564db57311fd5f711f6a2efda7e976b54e269","device":"575a41a8798743c2","findings":[],"hash":"a5eef8c3ed77d87c89f24d218d0637ed2a71ad5b6db8d4ca7113f03e65109303","nodeId":"c0c5cbdd-9471-45cc-af6a-9f9e3cf0a24a","outcome":"completed","summary":"Updated only [launch.json](/home/imd/.identitymd/work/478fbc53-bdbf-4ab1-b167-98eda44691ea/c0c5cbdd-9471-45cc-af6a-9f9e3cf0a24a/launch.json), correcting tax notes to match the accepted implementation. Constructor arguments, supply and economics remain unchanged.\n\nManifest checks and `forge build` passed; all 36 tests passed.\n\nThe manifest retains the caveat that no working taxable venue at `0x1001` is established.","treeHash":"3167a601db04247e7e8ba962e7389155141c5683","usage":{"cachedInputTokens":201984,"inputTokens":25395,"model":"gpt-6-astra","outputTokens":2950,"runtime":"codex","turns":3,"wallClockMs":127273}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bd7adba3a8045853","findings":[{"citation":"resolved","description":"The only feature of this token is a 99% fee on transfers into or out of `liquidityPool`. `_update` skips that fee whenever either endpoint is `poolManager`, including legs between the PoolManager and the taxed pool. The Uniswap v4 PoolManager is a permissionless pass-through: inside `unlock`, anyone may `sync(token)`, move tokens into the manager, `settle()` to be credited the exact amount that arrived, and `take(token, to, amount)` to have the manager send that amount to any `to`, with no pool, no swap and no fee. Each leg of a trade at the taxed venue can therefore be made to have the manager as its other endpoint: trader -> manager -> venue (sell) and venue -> manager -> trader (buy, since v2/v3 pairs and routers deliver output to a caller-chosen recipient). Every leg matches the exemption, `fee` is never computed, and the treasury receives 0 instead of 99%. The bypass costs two extra calls and a few thousand gas, is open to every trader, and is permanent because all three addresses are immutable. The README acknowledges 'routing through the exempt manager ... can avoid this fee' in one sentence, but a fee that any trader can zero at will is a broken guarantee, not a documented limitation: the treasury's entire fee income can be withheld and a venue advertised as 99% taxed trades tax-free. Boundary: the sentinel branch `from != poolManager && to != poolManager`; assumption: the manager only ever transacts with the launch pool's own LPs and traders; actual: it transfers to and accepts from arbitrary addresses on anyone's instruction. Minimal fix preserving the design: tax every transfer whose endpoint is `liquidityPool` regardless of the manager, i.e. drop `&& from != poolManager && to != poolManager` from the condition (the manager stays exempt for all other transfers, so the launch seed, swaps, distributor and requester flows are unaffected; verified: test/LaunchCompatibility.t.sol passes with that change and the attached proof passes). The unit tests `_fundPool` and `test_poolManagerEndpointsAlwaysReceiveFullAmounts` in test/OneMDollar.t.sol encode the current exemption and would need updating with the fix.","line":47,"path":"src/OneMDollar.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.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 {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {OneMDollar} from \"src/OneMDollar.sol\";\n\n/// @dev Stands in for the configured taxed pool: a venue that, like a Uniswap v2/v3 pair or any\n/// router, delivers bought tokens to a recipient the trader names.\ncontract TaxedVenue {\n    OneMDollar public token;\n\n    function init(OneMDollar token_) external {\n        require(address(token) == address(0), \"set\");\n        token = token_;\n    }\n\n    /// @notice Sells `amount` 1MD to `to` for native currency at a fixed price.\n    function buy(address to, uint256 amount) external payable {\n        require(msg.value >= amount / 1_000_000, \"underpaid\");\n        require(token.transfer(to, amount), \"transfer failed\");\n    }\n}\n\n/// @dev An ordinary trader that uses the exempt PoolManager as a pass-through: no pool, no swap,\n/// only sync / settle / take. Every token leg touching the taxed venue has the manager as the other\n/// endpoint, so the token's `_update` never charges the 99% fee.\ncontract Bypasser is IUnlockCallback {\n    IPoolManager internal immutable manager;\n    OneMDollar internal immutable token;\n    TaxedVenue internal immutable venue;\n\n    constructor(IPoolManager manager_, OneMDollar token_, TaxedVenue venue_) {\n        manager = manager_;\n        token = token_;\n        venue = venue_;\n    }\n\n    receive() external payable {}\n\n    /// @notice Sell `amount` into the taxed venue without paying the fee.\n    function sellUntaxed(uint256 amount) external {\n        manager.unlock(abi.encode(true, amount));\n    }\n\n    /// @notice Buy `amount` from the taxed venue without paying the fee.\n    function buyUntaxed(uint256 amount) external {\n        manager.unlock(abi.encode(false, amount));\n    }\n\n    function unlockCallback(bytes calldata data) external override returns (bytes memory) {\n        require(msg.sender == address(manager), \"manager only\");\n        (bool sell, uint256 amount) = abi.decode(data, (bool, uint256));\n        Currency c = Currency.wrap(address(token));\n        if (sell) {\n            // trader -> manager (exempt), manager -> venue (exempt): the venue receives 100%.\n            manager.sync(c);\n            token.transfer(address(manager), amount);\n            uint256 paid = manager.settle();\n            manager.take(c, address(venue), paid);\n        } else {\n            // venue -> manager (exempt), manager -> trader (exempt): the trader receives 100%.\n            manager.sync(c);\n            venue.buy{value: amount / 1_000_000}(address(manager), amount);\n            uint256 paid = manager.settle();\n            manager.take(c, address(this), paid);\n        }\n        return \"\";\n    }\n}\n\ncontract TaxBypassViaManagerTest is Test {\n    uint256 internal constant SUPPLY = 1_000_000_000 ether;\n    address internal constant TREASURY = address(0x1002);\n\n    PoolManager internal manager;\n    TaxedVenue internal venue;\n    OneMDollar internal token;\n    Bypasser internal trader;\n\n    function setUp() public {\n        manager = new PoolManager(address(this));\n        venue = new TaxedVenue();\n        token = new OneMDollar(address(venue), TREASURY, address(manager));\n        venue.init(token);\n        trader = new Bypasser(manager, token, venue);\n        vm.deal(address(trader), 10 ether);\n    }\n\n    /// @dev Expected: selling 1,000 1MD into the taxed pool pays 990 1MD to the treasury and\n    /// delivers 10 1MD to the pool. Actual on this code: the pool receives all 1,000 and the\n    /// treasury receives nothing, because both legs have the exempt PoolManager as an endpoint.\n    function test_sellIntoTaxedPoolThroughManagerPaysNoFee() public {\n        uint256 amount = 1_000 ether;\n        token.transfer(address(trader), amount);\n\n        trader.sellUntaxed(amount);\n\n        uint256 expectedFee = (amount * token.TAX_BPS()) / token.BPS_DENOMINATOR();\n        assertEq(token.balanceOf(address(trader)), 0, \"trader kept tokens\");\n        assertEq(token.balanceOf(address(manager)), 0, \"manager kept tokens\");\n        assertEq(token.balanceOf(TREASURY), expectedFee, \"the 99% sell tax was not collected\");\n        assertEq(token.balanceOf(address(venue)), amount - expectedFee, \"the pool received more than the net amount\");\n    }\n\n    /// @dev Expected: buying 1,000 1MD from the taxed pool pays 990 1MD to the treasury and\n    /// delivers 10 1MD to the buyer. Actual on this code: the buyer receives all 1,000 and the\n    /// treasury receives nothing.\n    function test_buyFromTaxedPoolThroughManagerPaysNoFee() public {\n        uint256 amount = 1_000 ether;\n        // Stock the venue the way any LP would, by an ordinary (taxed) transfer; then measure only the buy.\n        token.transfer(address(venue), 1_000_000 ether);\n        uint256 treasuryBefore = token.balanceOf(TREASURY);\n\n        trader.buyUntaxed(amount);\n\n        uint256 expectedFee = (amount * token.TAX_BPS()) / token.BPS_DENOMINATOR();\n        assertEq(token.balanceOf(address(manager)), 0, \"manager kept tokens\");\n        assertEq(token.balanceOf(TREASURY) - treasuryBefore, expectedFee, \"the 99% buy tax was not collected\");\n        assertEq(token.balanceOf(address(trader)), amount - expectedFee, \"the buyer received more than the net amount\");\n    }\n}","reproduction":"State: token deployed as `new OneMDollar(venue, TREASURY, manager)` with `manager` a Uniswap v4 PoolManager and `venue` any contract that sends bought tokens to a caller-named recipient. Trader holds 1,000 1MD.\nSell leg: trader calls manager.unlock(); in unlockCallback: manager.sync(token); token.transfer(manager, 1000e18) [from=trader,to=manager -> untaxed]; paid = manager.settle() -> 1000e18; manager.take(token, venue, 1000e18) [from=manager,to=venue -> untaxed by the `to != poolManager`/`from != poolManager` carve-out].\nExpected: venue balance +10e18, TREASURY +990e18. Actual: venue +1000e18, TREASURY +0, manager 0.\nBuy leg: in unlockCallback: manager.sync(token); venue.buy{value}(to=manager, 1000e18) [from=venue,to=manager -> untaxed]; paid = manager.settle() -> 1000e18; manager.take(token, trader, 1000e18) [from=manager -> untaxed].\nExpected: trader +10e18, TREASURY +990e18. Actual: trader +1000e18, TREASURY +0.\nContrast: a direct trader.transfer(venue, 1000e18) pays 990e18 to TREASURY. Run: forge test --match-path test/scratch/TaxBypassViaManager.t.sol (both tests fail on this code: 'the 99% sell/buy tax was not collected: 0 != 990000000000000000000'; both pass with the fix above).","severity":"high","snippet":"            from != address(0) && (from == liquidityPool || to == liquidityPool) && from != poolManager\n                && to != poolManager","title":"99% pool tax is fully bypassable in both directions by routing through the exempt PoolManager (sync/settle/take pass-through)"},{"citation":"resolved","description":"The brief asks for a '99% tax fee just on the liquidity pool'. The launch's only liquidity pool is the Uniswap v4 pool whose token balances live in the PoolManager, and every transfer to or from the PoolManager is exempt by this condition. The taxed address is instead a separate `liquidityPool` constructor argument that the launch does not create: the manifest's constructorArgs may only be static words or $factory/$poolManager/$launchNumber, and the constructor rejects $factory and $poolManager for that slot, so it must be a hard-coded address of a venue that does not exist in the launch. As deployed, the token therefore has a 0% fee at the only pool holders will trade on and a 99% fee at an address with no liquidity. The README states this reconciliation openly, and the reason is real: a tax on PoolManager legs would make the floor's seed and sell-back settle short and revert. This is reported so the requester decides the scope knowingly rather than discovering it after launch: the delivered behaviour does not implement the stated objective, and no fix inside the token can satisfy both the objective and the launch floor. Options are (a) accept an untaxed launch pool and drop or repurpose the `liquidityPool` argument, or (b) move the 99% to the pool layer (a v4 dynamic/LP fee or hook), which the launch design currently does not allow since the pool's hook is the network's initialization guard.","line":47,"path":"src/OneMDollar.sol","reproduction":"State: test/LaunchCompatibility.t.sol::_roundTrip - factory deploys the token with poolManager = the real PoolManager, seeds the v4 pool single-sided, an ordinary trader buys with 0.01 ETH and sells everything back.\nExpected under the brief: the trader's buy and sell each pay 99% of the token leg to the treasury (treasury > 0, trader receives ~1% of the output).\nActual: `assertEq(token.balanceOf(TREASURY), 0)` at test/LaunchCompatibility.t.sol:161 holds; the trader receives 100% of the pool output and the pool receives 100% of the sale. Run: forge test --match-test test_nativePairSingleSidedSeedBuyAndSell -vv.\nInverse check: configuring the PoolManager as the taxed pool is impossible, `new OneMDollar(MANAGER, TREASURY, MANAGER)` reverts InvalidLiquidityPool (src/OneMDollar.sol:36-37).","severity":"medium","snippet":"            from != address(0) && (from == liquidityPool || to == liquidityPool) && from != poolManager\n                && to != poolManager","title":"The launch liquidity pool itself carries no tax: the requested 99% fee never applies to the pool the launch actually creates"},{"citation":"resolved","description":"`fee = value * 9900 / 10000` truncates toward zero, so the fee is the wrong rounding direction for a fee (fees round up per the Math Precision guide). For value = 1 the fee is 0 and the full unit reaches the pool; for value = 2..100 the pool receives 1 unit while the nominal net is 0.01..1 unit, i.e. the effective rate is below 99% for every value < 100 and only converges above. Seam: boundary x precision. Economic impact is nil because moving 1 token this way needs 1e18 transactions, and the README documents the rounding, so this is recorded for completeness and not as something that must change. If exactness is wanted, round the fee up: fee = (value * TAX_BPS + BPS_DENOMINATOR - 1) / BPS_DENOMINATOR, which keeps net >= 0 and still never underflows.","line":55,"path":"src/OneMDollar.sol","reproduction":"token.transfer(POOL, 1): expected fee ceil(0.99) = 1 to TREASURY and 0 to POOL under round-up; actual fee = 1*9900/10000 = 0, POOL +1, TREASURY +0, no PoolTax event. token.transfer(POOL, 99): fee = 98, POOL +1 (1.01% retained instead of 1%). token.transfer(POOL, 100): fee = 99, POOL +1 (exact). Already exercised by test/OneMDollar.t.sol::test_zeroAndDustTransfersRoundFeeDown lines 244-252.","severity":"info","snippet":"            uint256 fee = (value * TAX_BPS) / BPS_DENOMINATOR;","title":"Fee rounds down: a 1 minor-unit transfer at the taxed pool pays 0% instead of 99%"}],"hash":"cbc03e95be0ab8a3a25f673f0c3d3c415e4a603709452a6ca8b188d55a7fee8c","nodeId":"c145f8fd-a19b-4944-8257-74fe7b53baa1","outcome":"completed","summary":"Review complete. The findings and coverage record are in `.imd-findings.json` at the repository root. No tracked file was changed. The only additions are the findings file and the scratch proof under `test/scratch/`, which is not kept.\n\n**What I found**\n\n1. **High: the 99% pool tax is bypassable in both directions.** The fee is skipped whenever either endpoint is the PoolManager, including legs between the manager and the taxed pool. The Uniswap v4 PoolManager is a permissionless pass-through: inside `unlock`, anyone can sync, transfer in, settle, and then `take` to any address. A trader sells by sending tokens to the manager and taking them to the taxed venue, and buys by having the venue deliver to the manager and taking them out. Every leg is exempt, so the treasury receives nothing. The proof test fails on the current code on both legs with \"0 != 990000000000000000000\" and passes once the manager carve-out is dropped for legs touching the taxed pool. I verified in a throwaway copy that this fix also keeps the launch-compatibility suite green, because the launch flows never touch the taxed pool address.\n\n2. **Medium: the launch pool itself carries no tax.** The brief asks for a 99% fee on the liquidity pool. The launch's only pool lives in the PoolManager, which is exempt, and the taxed address must be a hard-coded venue the launch never creates. The README states this reconciliation and the floor forces it, since a tax on manager legs would make the seed and the sell-back settle short. I reported it so the requester makes the scope call knowingly. No fix inside the token satisfies both the objective and the floor.\n\n3. **Info: fee rounds down.** A one-unit transfer at the taxed pool pays zero fee. Economically irrelevant and already documented, recorded for completeness in my area.\n\n**Math coverage.** Overflow is bounded by the gross balance check before multiplication, fee plus net equals value exactly, supply is conserved, the net is never zero for a nonzero value, and the treasury-as-sender and pool-self-transfer aliases are arithmetically consistent. All three entry points have coverage rows, plus four invariant rows.","treeHash":null,"usage":{"cachedInputTokens":805238,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":22832,"runtime":"claude","turns":21,"wallClockMs":336882}},{"artifacts":[],"attempt":1,"bundleHash":"60349ce145d4847e9360d8af15c12d4cec89b4368372c9b2d4bd09fa0530d47c","device":"85f8921773f3e9b5","findings":[],"hash":"cdf475dc234ae2f846eaba09290c3ff7287ae03066352f11a8e8116e2bdcc75c","nodeId":"f1b55070-94f3-425e-81eb-1229c0aabff0","outcome":"completed","summary":"Fixed the PoolManager tax bypass and deployer-as-treasury trap. Added regression tests and documented all four findings in [.imd-responses.json](/home/imdworker/.identitymd-nft1/work/478fbc53-bdbf-4ab1-b167-98eda44691ea/f1b55070-94f3-425e-81eb-1229c0aabff0/.imd-responses.json).\n\nValidation passed: `forge build`, all 36 tests, `forge fmt --check`, and both supplied proof tests.\n\nThe launch-pool tax remains a disputed scope conflict requiring resolution before deployment. Documented rounding remains unchanged.","treeHash":"f44520c142f87867074aab08b6ec10759f67ce8c","usage":{"cachedInputTokens":716032,"inputTokens":72589,"model":"gpt-6-astra","outputTokens":10730,"runtime":"codex","turns":5,"wallClockMs":640118}}],"verification":[{"checks":[{"durationMs":2258,"exitCode":0,"name":"build","output":"Compiling 77 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.14s\nCompiler run successful!\n","passed":true},{"durationMs":17733,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_actorRejectsForgedCallback() (gas: 31991)\n[PASS] test_create2FactoryReceivesEntireSupply() (gas: 33633)\n[PASS] test_erc20PairSingleSidedSeedBuyAndSell() (gas: 2532648)\n[PASS] test_nativePairSingleSidedSeedBuyAndSell() (gas: 1885742)\n[PASS] test_noCommonAdminCallCanMintOrControlHolder() (gas: 1956815)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsEIP170() (gas: 1354079)\n[PASS] test_swarmShareAndClaimsArriveWhole() (gas: 158685)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 130.59ms (7.46ms CPU time)\n\nRan 12 tests for test/OneMDollarAdversarial.t.sol:OneMDollarAdversarialTest\n[PASS] testFuzz_approvalIsIdempotentAndDoesNotMoveValue(uint8,uint8,uint256) (runs: 1000, μ: 1376589, ~: 1378473)\n[PASS] testFuzz_delegationMatchesDirectTransferIncludingAliases(uint8,uint8,uint8,uint256,bool) (runs: 1000, μ: 421271, ~: 420108)\nLogs:\n  Bound result 14909\n\n[PASS] testFuzz_overdrawRevertsAtomicallyAcrossRoles(uint8,uint8,uint8,uint256,uint256,bool,bool) (runs: 1000, μ: 1229316, ~: 1231308)\nLogs:\n  Bound result 71908396362304475604609891\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639933\n\n[PASS] testFuzz_shortGrossAllowanceRevertsAtomically(uint8,uint8,uint8,uint256,uint256,uint256) (runs: 1000, μ: 1228706, ~: 1232789)\nLogs:\n  Bound result 600\n  Bound result 226\n  Bound result 82\n\n[PASS] test_fullSupplyCanBeSoldThenEntirePoolBalanceBought() (gas: 303924)\n[PASS] test_maximumDelegatedOverdrawPreservesFiniteAllowance() (gas: 1217633)\n[PASS] test_poolSelfTransferStillConsumesGrossAllowance() (gas: 271261)\n[PASS] test_replacedAllowanceIsNotAddedAndOtherSpenderCannotUseIt() (gas: 1396403)\n[PASS] test_roundingEdgesInBothDirections() (gas: 3616394)\n[PASS] test_treasuryCannotReuseAllowanceAfterReceivingItsOwnFee() (gas: 1295722)\n[PASS] test_zeroDirectAndDelegatedTransfersEmitOnlyOneTransferAcrossAllRoles() (gas: 3868637)\n[PASS] test_zeroReceiverRejectsEvenZeroTransfersAndInfiniteAllowance() (gas: 1814890)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 255.07ms (1.01s CPU time)\n\nRan 24 tests for test/OneMDollar.t.sol:OneMDollarTest\n[PASS] testFuzz_buysConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 237223, ~: 238510)\nLogs:\n  Bound result 21308\n\n[PASS] testFuzz_sellsConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 199932, ~: 200980)\nLogs:\n  Bound result 21308\n\n[PASS] testFuzz_walletTransfersHaveNoFee(uint256) (runs: 512, μ: 137080, ~: 137456)\nLogs:\n  Bound result 12\n\n[PASS] test_approvalReplacementRevocationAndInfiniteAllowance() (gas: 332913)\n[PASS] test_buyTaxesPoolOutput() (gas: 209458)\n[PASS] test_constructorEmitsFullMint() (gas: 6040)\n[PASS] test_deployerHasNoSpecialTaxExemption() (gas: 100457)\n[PASS] test_extremeAmountRevertsBeforeFeeMultiplication() (gas: 33467)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 171489)\n[PASS] test_insufficientBalanceRollsBackFeeAndAllowance() (gas: 177390)\n[PASS] test_invalidConstructorParametersRevert() (gas: 4059)\n[PASS] test_managerAsSpenderDoesNotExemptTaxedEndpoints() (gas: 198958)\n[PASS] test_metadataAndEntireSupplyMintedOnceToDeployer() (gas: 107189)\n[PASS] test_poolManagerEndpointsAlwaysReceiveFullAmounts() (gas: 336401)\n[PASS] test_poolSelfTransferChargesFeeAndWalletSelfTransferDoesNot() (gas: 272103)\n[PASS] test_routerCallingOrdinaryTransferDoesNotTriggerTax() (gas: 171994)\n[PASS] test_selfAddressConstructorParametersRevert() (gas: 4871)\n[PASS] test_sellSends99PercentToTreasuryAnd1PercentToPool() (gas: 179483)\n[PASS] test_transferFromConsumesGrossAllowanceOnSellAndBuy() (gas: 347782)\n[PASS] test_treasuryAsSenderOrRecipientPreservesAccounting() (gas: 190439)\n[PASS] test_treasuryCannotTransferMoreThanItsGrossBalance() (gas: 85680)\n[PASS] test_walletTransfersAndOtherVenuesAreUntaxed() (gas: 171513)\n[PASS] test_zeroAddressesRevertWithoutBurningOrSpendingAllowance() (gas: 177294)\n[PASS] test_zeroAndDustTransfersRoundFeeDown() (gas: 258330)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 255.05ms (760.37ms CPU time)\n\nRan 1 test for test/OneMDollarInvariant.t.sol:OneMDollarInvariantTest\n[PASS] invariant_fixedSupplyAndConservationAcrossTransfers() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| TransferHandler | move     | 8192  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 120059685575902612121113102\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 4097\n  Bound result 0\n  Bound result 2236\n  Bound result 1110\n  Bound result 255\n  Bound result 400\n  Bound result 39\n  Bound result 0\n  Bound result 0\n  Bound result 279\n  Bound result 4\n  Bound result 1\n  Bound result 33\n  Bound result 659918\n  Bound result 64\n  Bound result 2\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 168496\n  Bound result 652\n  Bound result 3\n  Bound result 1\n  Bound result 73528\n  Bound result 95\n  Bound result 381230495193655279568839440\n  Bound result 477831979281525120627706249\n  Bound result 99\n  Bound result 376\n  Bound result 4791\n  Bound result 6212\n  Bound result 255\n  Bound result 4100\n  Bound result 2021\n  Bound result 100000000000000000000\n  Bound result 1418\n  Bound result 8194\n  Bound result 223689\n  Bound result 5377\n  Bound result 27\n  Bound result 4101\n  Bound result 8193\n  Bound result 469363702919863075099340433\n  Bound result 1980000000000000000\n  Bound result 118310298681783982557954038\n  Bound result 12\n  Bound result 20000000000000000000\n  Bound result 0\n  Bound result 9900\n  Bound result 319381285345728167273316233\n  Bound result 4111\n  Bound result 22793368125035134259\n  Bound result 16413\n  Bound result 12\n  Bound result 8198\n  Bound result 40\n  Bound result 1980000000000000000\n  Bound result 777275454116829242390098\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.28s (1.28s CPU time)\n\nRan 2 tests for test/OneMDollarAllowancesInvariant.t.sol:OneMDollarAllowancesInvariantTest\n[PASS]\nOneMDollarAllowancesInvariantTest invariants:\n[PASS] invariant_balancesMatchPersistentGhostLedger\n[PASS] invariant_onlyAuthorizedGrossSpendsReduceAllowances\n[PASS] invariant_supplyCannotLeakToUntrackedAccounts\n OneMDollarAllowancesInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭------------------+--------------------+-------+---------+----------╮\n| Contract         | Selector           | Calls | Reverts | Discards |\n+====================================================================+\n| AllowanceHandler | approve            | 4825  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | rejectOverBalance  | 4636  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | rejectZeroReceiver | 4651  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | rejectZeroSpender  | 4598  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | revokeAndReject    | 4640  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | spend              | 4752  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | transfer           | 4666  | 0       | 0        |\n╰------------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 2000000000000000000\n  Bound result 0\n  Bound result 95\n  Bound result 10000000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 600\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 163\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3870\n  Bound result 2347460779842221704936186\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 600\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 14\n  Bound result 0\n  Bound result 0\n  Bound result 3924\n  Bound result 41\n\n[PASS] test_handlerExercisesSpendsRevocationAndBalanceFailures() (gas: 2069273)\nLogs:\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 1000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 17.64s (17.63s CPU time)\n\nRan 5 test suites in 17.64s (19.55s CPU time): 46 tests passed, 0 failed, 0 skipped (46 total tests)\n","passed":true},{"durationMs":48,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMDollar.approve(address,uint256)\",\"OneMDollar.transfer(address,uint256)\",\"OneMDollar.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.json\":26,\"README.md\":164,\"foundry.toml\":23,\"remappings.txt\":4,\"src/OneMDollar.sol\":65,\"test/LaunchCompatibility.t.sol\":171,\"test/OneMDollar.t.sol\":337,\"test/OneMDollarAdversarial.t.sol\":302,\"test/OneMDollarAllowancesInvariant.t.sol\":93,\"test/OneMDollarInvariant.t.sol\":82,\"test/TESTING.md\":44,\"test/support/AllowanceHandler.sol\":133,\"test/support/V4Actor.sol\":84},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"0b7edc82d998ffda382e784c357b935bb561440322c2097c19bca7087c7cfaef","verifiedTreeHash":"a79836361e4e6c873cea25f0d1df24df2426269d","verifierVersion":"0.1.0+be003835"},{"checks":[{"durationMs":1991,"exitCode":0,"name":"build","output":"Compiling 74 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.82s\nCompiler run successful!\n","passed":true},{"durationMs":1335,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_actorRejectsForgedCallback() (gas: 31991)\n[PASS] test_create2FactoryReceivesEntireSupply() (gas: 33633)\n[PASS] test_erc20PairSingleSidedSeedBuyAndSell() (gas: 2532648)\n[PASS] test_nativePairSingleSidedSeedBuyAndSell() (gas: 1885742)\n[PASS] test_noCommonAdminCallCanMintOrControlHolder() (gas: 1956815)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsEIP170() (gas: 1354079)\n[PASS] test_swarmShareAndClaimsArriveWhole() (gas: 158685)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 5.82ms (6.96ms CPU time)\n\nRan 24 tests for test/OneMDollar.t.sol:OneMDollarTest\n[PASS] testFuzz_buysConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 236932, ~: 238546)\nLogs:\n  Bound result 479469445395701352748543538\n\n[PASS] testFuzz_sellsConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 199707, ~: 201004)\nLogs:\n  Bound result 127822130238330667\n\n[PASS] testFuzz_walletTransfersHaveNoFee(uint256) (runs: 512, μ: 136958, ~: 137480)\nLogs:\n  Bound result 9990000000000000000\n\n[PASS] test_approvalReplacementRevocationAndInfiniteAllowance() (gas: 332913)\n[PASS] test_buyTaxesPoolOutput() (gas: 209458)\n[PASS] test_constructorEmitsFullMint() (gas: 6040)\n[PASS] test_deployerHasNoSpecialTaxExemption() (gas: 100457)\n[PASS] test_extremeAmountRevertsBeforeFeeMultiplication() (gas: 33467)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 171489)\n[PASS] test_insufficientBalanceRollsBackFeeAndAllowance() (gas: 177390)\n[PASS] test_invalidConstructorParametersRevert() (gas: 4059)\n[PASS] test_managerAsSpenderDoesNotExemptTaxedEndpoints() (gas: 198958)\n[PASS] test_metadataAndEntireSupplyMintedOnceToDeployer() (gas: 107189)\n[PASS] test_poolManagerEndpointsAlwaysReceiveFullAmounts() (gas: 336401)\n[PASS] test_poolSelfTransferChargesFeeAndWalletSelfTransferDoesNot() (gas: 272103)\n[PASS] test_routerCallingOrdinaryTransferDoesNotTriggerTax() (gas: 171994)\n[PASS] test_selfAddressConstructorParametersRevert() (gas: 4871)\n[PASS] test_sellSends99PercentToTreasuryAnd1PercentToPool() (gas: 179483)\n[PASS] test_transferFromConsumesGrossAllowanceOnSellAndBuy() (gas: 347782)\n[PASS] test_treasuryAsSenderOrRecipientPreservesAccounting() (gas: 190439)\n[PASS] test_treasuryCannotTransferMoreThanItsGrossBalance() (gas: 85680)\n[PASS] test_walletTransfersAndOtherVenuesAreUntaxed() (gas: 171513)\n[PASS] test_zeroAddressesRevertWithoutBurningOrSpendingAllowance() (gas: 177294)\n[PASS] test_zeroAndDustTransfersRoundFeeDown() (gas: 258330)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 18.35ms (52.71ms CPU time)\n\nRan 1 test for test/OneMDollarInvariant.t.sol:OneMDollarInvariantTest\n[PASS] invariant_fixedSupplyAndConservationAcrossTransfers() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| TransferHandler | move     | 8192  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 43\n  Bound result 49569\n  Bound result 0\n  Bound result 0\n  Bound result 227\n  Bound result 225\n  Bound result 0\n  Bound result 0\n  Bound result 244\n  Bound result 999999999999999999999950388\n  Bound result 6150\n  Bound result 51456\n  Bound result 0\n  Bound result 44590\n  Bound result 15533236389448697\n  Bound result 2\n  Bound result 0\n  Bound result 5536\n  Bound result 858589414\n  Bound result 44\n  Bound result 2552851541\n  Bound result 0\n  Bound result 3410\n  Bound result 2317\n  Bound result 4833\n  Bound result 4744\n  Bound result 1000\n  Bound result 309\n  Bound result 410\n  Bound result 343\n  Bound result 583\n  Bound result 196\n  Bound result 2\n  Bound result 0\n  Bound result 532\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2165\n  Bound result 630807749\n  Bound result 6026\n  Bound result 1429559686\n  Bound result 0\n  Bound result 0\n  Bound result 586\n  Bound result 0\n  Bound result 5261571\n  Bound result 3000\n  Bound result 9901\n  Bound result 1046363171\n  Bound result 96\n  Bound result 0\n  Bound result 4194\n  Bound result 1047676344599105\n  Bound result 2552906525\n  Bound result 99\n  Bound result 10000\n  Bound result 1\n  Bound result 127\n  Bound result 4100\n  Bound result 552\n  Bound result 96\n  Bound result 3727\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.24s (1.24s CPU time)\n\nRan 3 test suites in 1.24s (1.27s CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":40,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMDollar.approve(address,uint256)\",\"OneMDollar.transfer(address,uint256)\",\"OneMDollar.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.json\":26,\"README.md\":164,\"foundry.toml\":23,\"launch.json\":24,\"remappings.txt\":4,\"src/OneMDollar.sol\":65,\"test/LaunchCompatibility.t.sol\":171,\"test/OneMDollar.t.sol\":337,\"test/OneMDollarInvariant.t.sol\":82,\"test/support/V4Actor.sol\":84},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"24c2fa7908118c695635d06540837d8287cd3a00c77e9c59b632f7e74ad980a3","verifiedTreeHash":"3fdbcb8ae3c950e971aa76d2bac9bc8e0e31a3a2","verifierVersion":"0.1.0+be003835"},{"checks":[{"durationMs":2705,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.57s\nCompiler run successful!\n","passed":true},{"durationMs":17001,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 25 tests for test/OneMDollar.t.sol:OneMDollarTest\n[PASS] testFuzz_buysConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 207037, ~: 208191)\nLogs:\n  Bound result 100\n\n[PASS] testFuzz_sellsConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 199777, ~: 200847)\nLogs:\n  Bound result 3065640764509689800560591\n\n[PASS] testFuzz_walletTransfersHaveNoFee(uint256) (runs: 512, μ: 136922, ~: 137424)\nLogs:\n  Bound result 100\n\n[PASS] test_approvalReplacementRevocationAndInfiniteAllowance() (gas: 332711)\n[PASS] test_buyTaxesPoolOutput() (gas: 179069)\n[PASS] test_constructorEmitsFullMint() (gas: 6018)\n[PASS] test_deployerHasNoSpecialTaxExemption() (gas: 100415)\n[PASS] test_extremeAmountRevertsBeforeFeeMultiplication() (gas: 33305)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 171449)\n[PASS] test_insufficientBalanceRollsBackFeeAndAllowance() (gas: 177298)\n[PASS] test_invalidConstructorParametersRevert() (gas: 4037)\n[PASS] test_managerAsSpenderDoesNotExemptTaxedEndpoints() (gas: 198789)\n[PASS] test_metadataAndEntireSupplyMintedOnceToDeployer() (gas: 107167)\n[PASS] test_poolManagerEndpointsStillPayPoolTax() (gas: 239622)\n[PASS] test_poolManagerWalletEndpointsReceiveFullAmounts() (gas: 240673)\n[PASS] test_poolSelfTransferChargesFeeAndWalletSelfTransferDoesNot() (gas: 241634)\n[PASS] test_routerCallingOrdinaryTransferDoesNotTriggerTax() (gas: 171914)\n[PASS] test_selfAddressConstructorParametersRevert() (gas: 4871)\n[PASS] test_sellSends99PercentToTreasuryAnd1PercentToPool() (gas: 179303)\n[PASS] test_transferFromConsumesGrossAllowanceOnSellAndBuy() (gas: 347452)\n[PASS] test_treasuryAsSenderOrRecipientPreservesAccounting() (gas: 190097)\n[PASS] test_treasuryCannotTransferMoreThanItsGrossBalance() (gas: 85478)\n[PASS] test_walletTransfersAndOtherVenuesAreUntaxed() (gas: 171415)\n[PASS] test_zeroAddressesRevertWithoutBurningOrSpendingAllowance() (gas: 177294)\n[PASS] test_zeroAndDustTransfersRoundFeeDown() (gas: 257770)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 263.57ms (328.11ms CPU time)\n\nRan 8 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_actorRejectsForgedCallback() (gas: 31991)\n[PASS] test_create2FactoryReceivesEntireSupply() (gas: 33633)\n[PASS] test_erc20PairSingleSidedSeedBuyAndSell() (gas: 2532470)\n[PASS] test_factoryCannotBeFeeRecipient() (gas: 33655)\n[PASS] test_nativePairSingleSidedSeedBuyAndSell() (gas: 1885564)\n[PASS] test_noCommonAdminCallCanMintOrControlHolder() (gas: 1956735)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsEIP170() (gas: 1318899)\n[PASS] test_swarmShareAndClaimsArriveWhole() (gas: 158605)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 269.34ms (6.62ms CPU time)\n\nRan 5 tests for test/PoolManagerRelay.t.sol:PoolManagerRelayTest\n[PASS] testFuzz_relayMatchesDirectTransfer(bool,uint256) (runs: 1000, μ: 370191, ~: 371158)\nLogs:\n  Bound result 28826949830974\n\n[PASS] testFuzz_relayOverdrawRollsBackAndAllowsRetry(bool,uint256,uint256) (runs: 1000, μ: 531299, ~: 532938)\nLogs:\n  Bound result 667045438131075918688761653\n  Bound result 115792089237316195423570985008687907853269984665639896994019453474256225899269\n\n[PASS] test_buyRelayChargesExactly99Percent() (gas: 258823)\n[PASS] test_relayRoundingEdgesAndEntireAvailableBalance() (gas: 4843947)\n[PASS] test_sellRelayChargesExactly99Percent() (gas: 225590)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 269.40ms (526.77ms CPU time)\n\nRan 13 tests for test/OneMDollarAdversarial.t.sol:OneMDollarAdversarialTest\n[PASS] testFuzz_approvalIsIdempotentAndDoesNotMoveValue(uint8,uint8,uint256) (runs: 1000, μ: 1405819, ~: 1350984)\n[PASS] testFuzz_delegationMatchesDirectTransferIncludingAliases(uint8,uint8,uint8,uint256,bool) (runs: 1000, μ: 463222, ~: 396380)\nLogs:\n  Bound result 4099\n\n[PASS] testFuzz_overdrawRevertsAtomicallyAcrossRoles(uint8,uint8,uint8,uint256,uint256,bool,bool) (runs: 1000, μ: 1257799, ~: 1202999)\nLogs:\n  Bound result 471560091064307441945543123\n  Bound result 115792089237316195423570985008687907853269984665640114837901257520671001956146\n\n[PASS] testFuzz_shortGrossAllowanceRevertsAtomically(uint8,uint8,uint8,uint256,uint256,uint256) (runs: 1000, μ: 1259269, ~: 1204744)\nLogs:\n  Bound result 108\n  Bound result 73\n  Bound result 29\n\n[PASS] test_delegatedPoolManagerEndpointsPayTaxAndSpendGrossAllowance() (gas: 379336)\n[PASS] test_fullSupplyCanBeSoldThenEntirePoolBalanceBought() (gas: 274437)\n[PASS] test_maximumDelegatedOverdrawPreservesFiniteAllowance() (gas: 1188342)\n[PASS] test_poolSelfTransferStillConsumesGrossAllowance() (gas: 629062)\n[PASS] test_replacedAllowanceIsNotAddedAndOtherSpenderCannotUseIt() (gas: 1367102)\n[PASS] test_roundingEdgesInBothDirections() (gas: 6008082)\n[PASS] test_treasuryCannotReuseAllowanceAfterReceivingItsOwnFee() (gas: 1266413)\n[PASS] test_zeroDirectAndDelegatedTransfersEmitOnlyOneTransferAcrossAllRoles() (gas: 3866579)\n[PASS] test_zeroReceiverRejectsEvenZeroTransfersAndInfiniteAllowance() (gas: 2172364)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 269.75ms (1.11s CPU time)\n\nRan 1 test for test/OneMDollarInvariant.t.sol:OneMDollarInvariantTest\n[PASS] invariant_fixedSupplyAndConservationAcrossTransfers() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| TransferHandler | move     | 8192  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\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 26\n  Bound result 0\n  Bound result 659918\n  Bound result 0\n  Bound result 496480\n  Bound result 0\n  Bound result 163438\n  Bound result 0\n  Bound result 36470\n  Bound result 396000000000000000000\n  Bound result 8195\n  Bound result 8198\n  Bound result 295\n  Bound result 3\n  Bound result 1738\n  Bound result 1020\n  Bound result 583800009178719095\n  Bound result 4101\n  Bound result 22\n  Bound result 0\n  Bound result 2081570322573276092162931\n  Bound result 4586363092834251\n  Bound result 600\n  Bound result 140190971855308653468447629\n  Bound result 1\n  Bound result 255\n  Bound result 8193\n  Bound result 4098\n  Bound result 192\n  Bound result 9990000000000000000\n  Bound result 104971799567879906069613708\n  Bound result 1\n  Bound result 5\n  Bound result 1\n  Bound result 53591\n  Bound result 1828\n  Bound result 16413\n  Bound result 8663196971973425078206341\n  Bound result 2827\n  Bound result 8193\n  Bound result 3000\n  Bound result 291756837042980676195149541\n  Bound result 3\n  Bound result 8197\n  Bound result 3000\n  Bound result 5617\n  Bound result 4099\n  Bound result 1000000000\n  Bound result 3\n  Bound result 8663196971973424078218732\n  Bound result 2773519737955877924414035\n  Bound result 10000\n  Bound result 2438\n  Bound result 198000000000000000000\n  Bound result 242\n  Bound result 255\n  Bound result 8194\n  Bound result 9953\n  Bound result 197\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.29s (1.29s CPU time)\n\nRan 3 tests for test/OneMDollarAllowancesInvariant.t.sol:OneMDollarAllowancesInvariantTest\n[PASS]\nOneMDollarAllowancesInvariantTest invariants:\n[PASS] invariant_balancesMatchPersistentGhostLedger\n[PASS] invariant_onlyAuthorizedGrossSpendsReduceAllowances\n[PASS] invariant_supplyCannotLeakToUntrackedAccounts\n OneMDollarAllowancesInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭------------------+--------------------+-------+---------+----------╮\n| Contract         | Selector           | Calls | Reverts | Discards |\n+====================================================================+\n| AllowanceHandler | approve            | 4661  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | rejectOverBalance  | 4681  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | rejectZeroReceiver | 4688  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | rejectZeroSpender  | 4679  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | revokeAndReject    | 4686  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | spend              | 4667  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | transfer           | 4706  | 0       | 0        |\n╰------------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 25\n  Bound result 4098\n  Bound result 0\n  Bound result 5752\n  Bound result 29\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 4270\n  Bound result 4430\n  Bound result 0\n  Bound result 98\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 101\n  Bound result 8194\n  Bound result 0\n  Bound result 999999999999999999999999998\n  Bound result 0\n  Bound result 99\n  Bound result 56\n  Bound result 99\n  Bound result 26\n  Bound result 47\n  Bound result 9990000000000000000\n  Bound result 3980\n  Bound result 4991\n  Bound result 39\n  Bound result 197\n  Bound result 554145396\n  Bound result 4097\n  Bound result 1000\n  Bound result 0\n  Bound result 99990000000000000000\n  Bound result 26\n  Bound result 0\n  Bound result 0\n\n[PASS] test_handlerExercisesSpendsRevocationAndBalanceFailures() (gas: 2061783)\nLogs:\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] test_handlerTaxesManagerPoolTransfersInBothDirections() (gas: 2537375)\nLogs:\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 16.90s (16.90s CPU time)\n\nRan 6 test suites in 16.91s (19.26s CPU time): 55 tests passed, 0 failed, 0 skipped (55 total tests)\n","passed":true},{"durationMs":42,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMDollar.approve(address,uint256)\",\"OneMDollar.transfer(address,uint256)\",\"OneMDollar.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.json\":26,\"README.md\":185,\"foundry.toml\":23,\"remappings.txt\":4,\"src/OneMDollar.sol\":65,\"test/LaunchCompatibility.t.sol\":176,\"test/OneMDollar.t.sol\":352,\"test/OneMDollarAdversarial.t.sol\":331,\"test/OneMDollarAllowancesInvariant.t.sol\":129,\"test/OneMDollarInvariant.t.sol\":82,\"test/PoolManagerRelay.t.sol\":169,\"test/TESTING.md\":65,\"test/support/AllowanceHandler.sol\":137,\"test/support/V4Actor.sol\":84},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"433d6b1c317da27d93c7f3e53c8b5873fa4db443acbca17ba0a237c7efa4e4e0","verifiedTreeHash":"6538f8f7a4dc144921af5d0b81cf34c89f68acb8","verifierVersion":"0.1.0+a2d9a899"},{"checks":[{"durationMs":2211,"exitCode":0,"name":"build","output":"Compiling 74 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.05s\nCompiler run successful!\n","passed":true},{"durationMs":1597,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_actorRejectsForgedCallback() (gas: 31991)\n[PASS] test_create2FactoryReceivesEntireSupply() (gas: 33633)\n[PASS] test_erc20PairSingleSidedSeedBuyAndSell() (gas: 2532648)\n[PASS] test_nativePairSingleSidedSeedBuyAndSell() (gas: 1885742)\n[PASS] test_noCommonAdminCallCanMintOrControlHolder() (gas: 1956815)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsEIP170() (gas: 1354079)\n[PASS] test_swarmShareAndClaimsArriveWhole() (gas: 158685)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 19.12ms (9.06ms CPU time)\n\nRan 24 tests for test/OneMDollar.t.sol:OneMDollarTest\n[PASS] testFuzz_buysConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 236944, ~: 238546)\nLogs:\n  Bound result 974090726852731362617723876\n\n[PASS] testFuzz_sellsConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 199719, ~: 201004)\nLogs:\n  Bound result 805684696623984433589961174\n\n[PASS] testFuzz_walletTransfersHaveNoFee(uint256) (runs: 512, μ: 136970, ~: 137480)\nLogs:\n  Bound result 512113549\n\n[PASS] test_approvalReplacementRevocationAndInfiniteAllowance() (gas: 332913)\n[PASS] test_buyTaxesPoolOutput() (gas: 209458)\n[PASS] test_constructorEmitsFullMint() (gas: 6040)\n[PASS] test_deployerHasNoSpecialTaxExemption() (gas: 100457)\n[PASS] test_extremeAmountRevertsBeforeFeeMultiplication() (gas: 33467)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 171489)\n[PASS] test_insufficientBalanceRollsBackFeeAndAllowance() (gas: 177390)\n[PASS] test_invalidConstructorParametersRevert() (gas: 4059)\n[PASS] test_managerAsSpenderDoesNotExemptTaxedEndpoints() (gas: 198958)\n[PASS] test_metadataAndEntireSupplyMintedOnceToDeployer() (gas: 107189)\n[PASS] test_poolManagerEndpointsAlwaysReceiveFullAmounts() (gas: 336401)\n[PASS] test_poolSelfTransferChargesFeeAndWalletSelfTransferDoesNot() (gas: 272103)\n[PASS] test_routerCallingOrdinaryTransferDoesNotTriggerTax() (gas: 171994)\n[PASS] test_selfAddressConstructorParametersRevert() (gas: 4871)\n[PASS] test_sellSends99PercentToTreasuryAnd1PercentToPool() (gas: 179483)\n[PASS] test_transferFromConsumesGrossAllowanceOnSellAndBuy() (gas: 347782)\n[PASS] test_treasuryAsSenderOrRecipientPreservesAccounting() (gas: 190439)\n[PASS] test_treasuryCannotTransferMoreThanItsGrossBalance() (gas: 85680)\n[PASS] test_walletTransfersAndOtherVenuesAreUntaxed() (gas: 171513)\n[PASS] test_zeroAddressesRevertWithoutBurningOrSpendingAllowance() (gas: 177294)\n[PASS] test_zeroAndDustTransfersRoundFeeDown() (gas: 258330)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 71.04ms (152.63ms CPU time)\n\nRan 1 test for test/OneMDollarInvariant.t.sol:OneMDollarInvariantTest\n[PASS] invariant_fixedSupplyAndConservationAcrossTransfers() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| TransferHandler | move     | 8192  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1183860801\n  Bound result 5327\n  Bound result 0\n  Bound result 600\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 5424\n  Bound result 269\n  Bound result 115\n  Bound result 0\n  Bound result 0\n  Bound result 3223\n  Bound result 9990000000000000000\n  Bound result 24576\n  Bound result 4196\n  Bound result 99\n  Bound result 12\n  Bound result 19999997632323636\n  Bound result 379\n  Bound result 49841905593\n  Bound result 2057\n  Bound result 10109\n  Bound result 197\n  Bound result 0\n  Bound result 16413\n  Bound result 1000000000\n  Bound result 1038\n  Bound result 273\n  Bound result 4980\n  Bound result 351\n  Bound result 23\n  Bound result 10\n  Bound result 100\n  Bound result 17309\n  Bound result 50\n  Bound result 0\n  Bound result 16413\n  Bound result 205\n  Bound result 2075965005113615686\n  Bound result 2827\n  Bound result 100\n  Bound result 965427556034820630546539702\n  Bound result 6353\n  Bound result 4098\n  Bound result 6168\n  Bound result 99000000000000000000\n  Bound result 656964193929825269\n  Bound result 2\n  Bound result 0\n  Bound result 327767171255139680\n  Bound result 5944\n  Bound result 255\n  Bound result 312\n  Bound result 16413\n  Bound result 2716884972195985965\n  Bound result 6081\n  Bound result 4098\n  Bound result 1314552551193087188\n  Bound result 34572543622143563383285213\n  Bound result 359\n  Bound result 1762\n  Bound result 4928\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.48s (1.47s CPU time)\n\nRan 3 test suites in 1.48s (1.57s CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":55,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMDollar.approve(address,uint256)\",\"OneMDollar.transfer(address,uint256)\",\"OneMDollar.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.json\":26,\"README.md\":164,\"foundry.toml\":23,\"remappings.txt\":4,\"src/OneMDollar.sol\":65,\"test/LaunchCompatibility.t.sol\":171,\"test/OneMDollar.t.sol\":337,\"test/OneMDollarInvariant.t.sol\":82,\"test/support/V4Actor.sol\":84},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":625,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":248,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/OneMDollar.sol:10: Large Numeric Literal (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"588a1bbdf8e523294723aaaa2fc3e0e917334e7c2c7ca4bf6f9afbc7c37dad2f","verifiedTreeHash":"88b6163ac105e2c0b034d6b5686d9f2bcf22fe00","verifierVersion":"0.1.0+be003835"},{"checks":[{"durationMs":2437,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.30s\nCompiler run successful!\n","passed":true},{"durationMs":16479,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_actorRejectsForgedCallback() (gas: 31991)\n[PASS] test_create2FactoryReceivesEntireSupply() (gas: 33633)\n[PASS] test_erc20PairSingleSidedSeedBuyAndSell() (gas: 2532470)\n[PASS] test_factoryCannotBeFeeRecipient() (gas: 33655)\n[PASS] test_nativePairSingleSidedSeedBuyAndSell() (gas: 1885564)\n[PASS] test_noCommonAdminCallCanMintOrControlHolder() (gas: 1956735)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsEIP170() (gas: 1318899)\n[PASS] test_swarmShareAndClaimsArriveWhole() (gas: 158605)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 7.83ms (6.02ms CPU time)\n\nRan 2 tests for test/PoolManagerRelay.t.sol:PoolManagerRelayTest\n[PASS] test_buyRelayChargesExactly99Percent() (gas: 258548)\n[PASS] test_sellRelayChargesExactly99Percent() (gas: 225302)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.27ms (257.52µs CPU time)\n\nRan 25 tests for test/OneMDollar.t.sol:OneMDollarTest\n[PASS] testFuzz_buysConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 206684, ~: 208155)\nLogs:\n  Bound result 90455167996654\n\n[PASS] testFuzz_sellsConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 199353, ~: 200799)\nLogs:\n  Bound result 3044741136\n\n[PASS] testFuzz_walletTransfersHaveNoFee(uint256) (runs: 512, μ: 136705, ~: 137376)\nLogs:\n  Bound result 3044741136\n\n[PASS] test_approvalReplacementRevocationAndInfiniteAllowance() (gas: 332711)\n[PASS] test_buyTaxesPoolOutput() (gas: 179069)\n[PASS] test_constructorEmitsFullMint() (gas: 6018)\n[PASS] test_deployerHasNoSpecialTaxExemption() (gas: 100415)\n[PASS] test_extremeAmountRevertsBeforeFeeMultiplication() (gas: 33305)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 171449)\n[PASS] test_insufficientBalanceRollsBackFeeAndAllowance() (gas: 177298)\n[PASS] test_invalidConstructorParametersRevert() (gas: 4037)\n[PASS] test_managerAsSpenderDoesNotExemptTaxedEndpoints() (gas: 198789)\n[PASS] test_metadataAndEntireSupplyMintedOnceToDeployer() (gas: 107167)\n[PASS] test_poolManagerEndpointsStillPayPoolTax() (gas: 239622)\n[PASS] test_poolManagerWalletEndpointsReceiveFullAmounts() (gas: 240673)\n[PASS] test_poolSelfTransferChargesFeeAndWalletSelfTransferDoesNot() (gas: 241634)\n[PASS] test_routerCallingOrdinaryTransferDoesNotTriggerTax() (gas: 171914)\n[PASS] test_selfAddressConstructorParametersRevert() (gas: 4871)\n[PASS] test_sellSends99PercentToTreasuryAnd1PercentToPool() (gas: 179303)\n[PASS] test_transferFromConsumesGrossAllowanceOnSellAndBuy() (gas: 347452)\n[PASS] test_treasuryAsSenderOrRecipientPreservesAccounting() (gas: 190097)\n[PASS] test_treasuryCannotTransferMoreThanItsGrossBalance() (gas: 85478)\n[PASS] test_walletTransfersAndOtherVenuesAreUntaxed() (gas: 171415)\n[PASS] test_zeroAddressesRevertWithoutBurningOrSpendingAllowance() (gas: 177294)\n[PASS] test_zeroAndDustTransfersRoundFeeDown() (gas: 257770)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 252.64ms (294.13ms CPU time)\n\nRan 13 tests for test/OneMDollarAdversarial.t.sol:OneMDollarAdversarialTest\n[PASS] testFuzz_approvalIsIdempotentAndDoesNotMoveValue(uint8,uint8,uint256) (runs: 1000, μ: 1407781, ~: 1350996)\n[PASS] testFuzz_delegationMatchesDirectTransferIncludingAliases(uint8,uint8,uint8,uint256,bool) (runs: 1000, μ: 461942, ~: 396262)\nLogs:\n  Bound result 4098\n\n[PASS] testFuzz_overdrawRevertsAtomicallyAcrossRoles(uint8,uint8,uint8,uint256,uint256,bool,bool) (runs: 1000, μ: 1253972, ~: 1202953)\nLogs:\n  Bound result 886865587479278469178441052\n  Bound result 161531383206758619743480567578496598261651315756785176214341811512017353\n\n[PASS] testFuzz_shortGrossAllowanceRevertsAtomically(uint8,uint8,uint8,uint256,uint256,uint256) (runs: 1000, μ: 1254621, ~: 1204484)\nLogs:\n  Bound result 2978\n  Bound result 2608\n  Bound result 2035\n\n[PASS] test_delegatedPoolManagerEndpointsPayTaxAndSpendGrossAllowance() (gas: 379336)\n[PASS] test_fullSupplyCanBeSoldThenEntirePoolBalanceBought() (gas: 274437)\n[PASS] test_maximumDelegatedOverdrawPreservesFiniteAllowance() (gas: 1188342)\n[PASS] test_poolSelfTransferStillConsumesGrossAllowance() (gas: 629062)\n[PASS] test_replacedAllowanceIsNotAddedAndOtherSpenderCannotUseIt() (gas: 1367102)\n[PASS] test_roundingEdgesInBothDirections() (gas: 6008082)\n[PASS] test_treasuryCannotReuseAllowanceAfterReceivingItsOwnFee() (gas: 1266413)\n[PASS] test_zeroDirectAndDelegatedTransfersEmitOnlyOneTransferAcrossAllRoles() (gas: 3866579)\n[PASS] test_zeroReceiverRejectsEvenZeroTransfersAndInfiniteAllowance() (gas: 2172364)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 259.40ms (1.04s CPU time)\n\nRan 1 test for test/OneMDollarInvariant.t.sol:OneMDollarInvariantTest\n[PASS] invariant_fixedSupplyAndConservationAcrossTransfers() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| TransferHandler | move     | 8192  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 120678820474\n  Bound result 0\n  Bound result 0\n  Bound result 8197\n  Bound result 0\n  Bound result 220000903800171656877806093\n  Bound result 282\n  Bound result 197\n  Bound result 894\n  Bound result 99\n  Bound result 6\n  Bound result 779999096199828222443365522\n  Bound result 587074383799436590088868389\n  Bound result 0\n  Bound result 2\n  Bound result 8195\n  Bound result 396000000000000000000\n  Bound result 3312\n  Bound result 1837913\n  Bound result 53255888774875660401392132\n  Bound result 225\n  Bound result 659918\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 540\n  Bound result 117\n  Bound result 324\n  Bound result 175\n  Bound result 1\n  Bound result 1\n  Bound result 2261\n  Bound result 99990000000000000000\n  Bound result 62\n  Bound result 400\n  Bound result 303556212855608307063280073\n  Bound result 1\n  Bound result 62\n  Bound result 3277\n  Bound result 1956\n  Bound result 2695\n  Bound result 100000000000000000000000\n  Bound result 4098\n  Bound result 537\n  Bound result 17\n  Bound result 228\n  Bound result 4697\n  Bound result 44\n  Bound result 164103085732476972642071806\n  Bound result 9990000000000000000\n  Bound result 20000000000000000000\n  Bound result 719206528\n  Bound result 18059999999999929176\n  Bound result 809\n  Bound result 4077\n  Bound result 10000000000000000\n  Bound result 207353164036349515551975506\n  Bound result 28\n  Bound result 1279\n  Bound result 3851654598271893790\n  Bound result 8\n  Bound result 217051650279996345979453985\n  Bound result 5292370926150060547831863\n  Bound result 1537344717625387\n  Bound result 7090\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.19s (1.19s CPU time)\n\nRan 3 tests for test/OneMDollarAllowancesInvariant.t.sol:OneMDollarAllowancesInvariantTest\n[PASS]\nOneMDollarAllowancesInvariantTest invariants:\n[PASS] invariant_balancesMatchPersistentGhostLedger\n[PASS] invariant_onlyAuthorizedGrossSpendsReduceAllowances\n[PASS] invariant_supplyCannotLeakToUntrackedAccounts\n OneMDollarAllowancesInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭------------------+--------------------+-------+---------+----------╮\n| Contract         | Selector           | Calls | Reverts | Discards |\n+====================================================================+\n| AllowanceHandler | approve            | 4689  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | rejectOverBalance  | 4636  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | rejectZeroReceiver | 4682  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | rejectZeroSpender  | 4612  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | revokeAndReject    | 4758  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | spend              | 4712  | 0       | 0        |\n|------------------+--------------------+-------+---------+----------|\n| AllowanceHandler | transfer           | 4679  | 0       | 0        |\n╰------------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 3000000000000000000\n  Bound result 0\n  Bound result 6355\n  Bound result 0\n  Bound result 3307787102\n  Bound result 0\n  Bound result 0\n  Bound result 999999999999999999\n  Bound result 0\n  Bound result 0\n  Bound result 4100\n  Bound result 0\n  Bound result 659918\n  Bound result 0\n  Bound result 1000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 1048\n  Bound result 990000000000000000000000000\n  Bound result 7241\n  Bound result 9012\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 951\n  Bound result 53\n  Bound result 790382336171094497045243817\n  Bound result 29296257974099123283052\n  Bound result 0\n  Bound result 1000000000\n  Bound result 0\n\n[PASS] test_handlerExercisesSpendsRevocationAndBalanceFailures() (gas: 2061783)\nLogs:\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] test_handlerTaxesManagerPoolTransfersInBothDirections() (gas: 2537375)\nLogs:\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 83333333333333333333333333\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n  Bound result 100000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 16.38s (16.39s CPU time)\n\nRan 6 test suites in 16.38s (18.10s CPU time): 52 tests passed, 0 failed, 0 skipped (52 total tests)\n","passed":true},{"durationMs":39,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMDollar.approve(address,uint256)\",\"OneMDollar.transfer(address,uint256)\",\"OneMDollar.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.json\":26,\"README.md\":185,\"foundry.toml\":23,\"remappings.txt\":4,\"src/OneMDollar.sol\":65,\"test/LaunchCompatibility.t.sol\":176,\"test/OneMDollar.t.sol\":352,\"test/OneMDollarAdversarial.t.sol\":331,\"test/OneMDollarAllowancesInvariant.t.sol\":129,\"test/OneMDollarInvariant.t.sol\":82,\"test/PoolManagerRelay.t.sol\":98,\"test/TESTING.md\":57,\"test/support/AllowanceHandler.sol\":137,\"test/support/V4Actor.sol\":84},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"635c44728235f660a463a75919075c84e8f70af971ece9a964243a85726ea193","verifiedTreeHash":"19dd05f5cea046440925f708af480d0b48bc7b4a","verifierVersion":"0.1.0+a2d9a899"},{"checks":[{"durationMs":1701,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.60s\nCompiler run successful!\n","passed":true},{"durationMs":1160,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/PoolManagerRelay.t.sol:PoolManagerRelayTest\n[PASS] test_buyRelayChargesExactly99Percent() (gas: 258548)\n[PASS] test_sellRelayChargesExactly99Percent() (gas: 225302)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 792.80µs (344.36µs CPU time)\n\nRan 8 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_actorRejectsForgedCallback() (gas: 31991)\n[PASS] test_create2FactoryReceivesEntireSupply() (gas: 33633)\n[PASS] test_erc20PairSingleSidedSeedBuyAndSell() (gas: 2532470)\n[PASS] test_factoryCannotBeFeeRecipient() (gas: 33655)\n[PASS] test_nativePairSingleSidedSeedBuyAndSell() (gas: 1885564)\n[PASS] test_noCommonAdminCallCanMintOrControlHolder() (gas: 1956735)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsEIP170() (gas: 1318899)\n[PASS] test_swarmShareAndClaimsArriveWhole() (gas: 158605)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 13.05ms (5.24ms CPU time)\n\nRan 25 tests for test/OneMDollar.t.sol:OneMDollarTest\n[PASS] testFuzz_buysConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 206570, ~: 208101)\nLogs:\n  Bound result 8945379868025190703378176\n\n[PASS] testFuzz_sellsConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 199161, ~: 200727)\nLogs:\n  Bound result 61384125853843947119\n\n[PASS] testFuzz_walletTransfersHaveNoFee(uint256) (runs: 512, μ: 136668, ~: 137304)\nLogs:\n  Bound result 654752500164015148461286577\n\n[PASS] test_approvalReplacementRevocationAndInfiniteAllowance() (gas: 332711)\n[PASS] test_buyTaxesPoolOutput() (gas: 179069)\n[PASS] test_constructorEmitsFullMint() (gas: 6018)\n[PASS] test_deployerHasNoSpecialTaxExemption() (gas: 100415)\n[PASS] test_extremeAmountRevertsBeforeFeeMultiplication() (gas: 33305)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 171449)\n[PASS] test_insufficientBalanceRollsBackFeeAndAllowance() (gas: 177298)\n[PASS] test_invalidConstructorParametersRevert() (gas: 4037)\n[PASS] test_managerAsSpenderDoesNotExemptTaxedEndpoints() (gas: 198789)\n[PASS] test_metadataAndEntireSupplyMintedOnceToDeployer() (gas: 107167)\n[PASS] test_poolManagerEndpointsStillPayPoolTax() (gas: 239622)\n[PASS] test_poolManagerWalletEndpointsReceiveFullAmounts() (gas: 240673)\n[PASS] test_poolSelfTransferChargesFeeAndWalletSelfTransferDoesNot() (gas: 241634)\n[PASS] test_routerCallingOrdinaryTransferDoesNotTriggerTax() (gas: 171914)\n[PASS] test_selfAddressConstructorParametersRevert() (gas: 4871)\n[PASS] test_sellSends99PercentToTreasuryAnd1PercentToPool() (gas: 179303)\n[PASS] test_transferFromConsumesGrossAllowanceOnSellAndBuy() (gas: 347452)\n[PASS] test_treasuryAsSenderOrRecipientPreservesAccounting() (gas: 190097)\n[PASS] test_treasuryCannotTransferMoreThanItsGrossBalance() (gas: 85478)\n[PASS] test_walletTransfersAndOtherVenuesAreUntaxed() (gas: 171415)\n[PASS] test_zeroAddressesRevertWithoutBurningOrSpendingAllowance() (gas: 177294)\n[PASS] test_zeroAndDustTransfersRoundFeeDown() (gas: 257770)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 15.27ms (46.97ms CPU time)\n\nRan 1 test for test/OneMDollarInvariant.t.sol:OneMDollarInvariantTest\n[PASS] invariant_fixedSupplyAndConservationAcrossTransfers() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| TransferHandler | move     | 8192  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 252\n  Bound result 0\n  Bound result 0\n  Bound result 4098\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1639\n  Bound result 27\n  Bound result 30000000000000000000\n  Bound result 1\n  Bound result 0\n  Bound result 7\n  Bound result 11\n  Bound result 205\n  Bound result 2957397980\n  Bound result 6\n  Bound result 127\n  Bound result 64550310826112268465531404\n  Bound result 552\n  Bound result 880\n  Bound result 2664\n  Bound result 3\n  Bound result 24894320624580557606279587\n  Bound result 96\n  Bound result 2\n  Bound result 0\n  Bound result 9900\n  Bound result 1\n  Bound result 0\n  Bound result 667391067796244985912806418\n  Bound result 2163\n  Bound result 4918\n  Bound result 0\n  Bound result 4099\n  Bound result 0\n  Bound result 3\n  Bound result 2\n  Bound result 281202422024874582916747635\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000\n  Bound result 2261\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 1000000003\n  Bound result 10000\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 110926482877583\n  Bound result 99000000000000000000\n  Bound result 2021\n  Bound result 30000000000000000000\n  Bound result 100\n  Bound result 984646368869\n  Bound result 410\n  Bound result 242\n  Bound result 6\n  Bound result 0\n  Bound result 255\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.08s (1.08s CPU time)\n\nRan 4 test suites in 1.08s (1.11s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMDollar.approve(address,uint256)\",\"OneMDollar.transfer(address,uint256)\",\"OneMDollar.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.json\":26,\"README.md\":185,\"foundry.toml\":23,\"launch.json\":24,\"remappings.txt\":4,\"src/OneMDollar.sol\":65,\"test/LaunchCompatibility.t.sol\":176,\"test/OneMDollar.t.sol\":352,\"test/OneMDollarInvariant.t.sol\":82,\"test/PoolManagerRelay.t.sol\":98,\"test/support/V4Actor.sol\":84},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"89192ed01fc2c5a660fe45c60d92edbdae264149fc604b91b6c5638990fd85c2","verifiedTreeHash":"59cbd3333c09f321208a01d345358f364ce1288e","verifierVersion":"0.1.0+a2d9a899"},{"checks":[{"durationMs":1849,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.73s\nCompiler run successful!\n","passed":true},{"durationMs":1288,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/PoolManagerRelay.t.sol:PoolManagerRelayTest\n[PASS] test_buyRelayChargesExactly99Percent() (gas: 258548)\n[PASS] test_sellRelayChargesExactly99Percent() (gas: 225302)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.13ms (409.20µs CPU time)\n\nRan 8 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_actorRejectsForgedCallback() (gas: 31991)\n[PASS] test_create2FactoryReceivesEntireSupply() (gas: 33633)\n[PASS] test_erc20PairSingleSidedSeedBuyAndSell() (gas: 2532470)\n[PASS] test_factoryCannotBeFeeRecipient() (gas: 33655)\n[PASS] test_nativePairSingleSidedSeedBuyAndSell() (gas: 1885564)\n[PASS] test_noCommonAdminCallCanMintOrControlHolder() (gas: 1956735)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsEIP170() (gas: 1318899)\n[PASS] test_swarmShareAndClaimsArriveWhole() (gas: 158605)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 15.07ms (5.58ms CPU time)\n\nRan 25 tests for test/OneMDollar.t.sol:OneMDollarTest\n[PASS] testFuzz_buysConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 206552, ~: 208131)\nLogs:\n  Bound result 601\n\n[PASS] testFuzz_sellsConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 199285, ~: 200775)\nLogs:\n  Bound result 692851899115547082646000309\n\n[PASS] testFuzz_walletTransfersHaveNoFee(uint256) (runs: 512, μ: 136637, ~: 137352)\nLogs:\n  Bound result 2085\n\n[PASS] test_approvalReplacementRevocationAndInfiniteAllowance() (gas: 332711)\n[PASS] test_buyTaxesPoolOutput() (gas: 179069)\n[PASS] test_constructorEmitsFullMint() (gas: 6018)\n[PASS] test_deployerHasNoSpecialTaxExemption() (gas: 100415)\n[PASS] test_extremeAmountRevertsBeforeFeeMultiplication() (gas: 33305)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 171449)\n[PASS] test_insufficientBalanceRollsBackFeeAndAllowance() (gas: 177298)\n[PASS] test_invalidConstructorParametersRevert() (gas: 4037)\n[PASS] test_managerAsSpenderDoesNotExemptTaxedEndpoints() (gas: 198789)\n[PASS] test_metadataAndEntireSupplyMintedOnceToDeployer() (gas: 107167)\n[PASS] test_poolManagerEndpointsStillPayPoolTax() (gas: 239622)\n[PASS] test_poolManagerWalletEndpointsReceiveFullAmounts() (gas: 240673)\n[PASS] test_poolSelfTransferChargesFeeAndWalletSelfTransferDoesNot() (gas: 241634)\n[PASS] test_routerCallingOrdinaryTransferDoesNotTriggerTax() (gas: 171914)\n[PASS] test_selfAddressConstructorParametersRevert() (gas: 4871)\n[PASS] test_sellSends99PercentToTreasuryAnd1PercentToPool() (gas: 179303)\n[PASS] test_transferFromConsumesGrossAllowanceOnSellAndBuy() (gas: 347452)\n[PASS] test_treasuryAsSenderOrRecipientPreservesAccounting() (gas: 190097)\n[PASS] test_treasuryCannotTransferMoreThanItsGrossBalance() (gas: 85478)\n[PASS] test_walletTransfersAndOtherVenuesAreUntaxed() (gas: 171415)\n[PASS] test_zeroAddressesRevertWithoutBurningOrSpendingAllowance() (gas: 177294)\n[PASS] test_zeroAndDustTransfersRoundFeeDown() (gas: 257770)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 15.76ms (46.17ms CPU time)\n\nRan 1 test for test/OneMDollarInvariant.t.sol:OneMDollarInvariantTest\n[PASS] invariant_fixedSupplyAndConservationAcrossTransfers() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| TransferHandler | move     | 8192  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 818983418891637099914030383\n  Bound result 0\n  Bound result 638212886\n  Bound result 3963891462\n  Bound result 5282\n  Bound result 33096925\n  Bound result 1122\n  Bound result 181016581108362904049866360\n  Bound result 1239446557\n  Bound result 637966837783274191900267279\n  Bound result 0\n  Bound result 5998\n  Bound result 0\n  Bound result 183012\n  Bound result 0\n  Bound result 20000000000000000000\n  Bound result 8175862529964765978\n  Bound result 5137\n  Bound result 0\n  Bound result 4099\n  Bound result 197\n  Bound result 5616\n  Bound result 181016581108362900085969616\n  Bound result 2698984595404321479\n  Bound result 5071\n  Bound result 60\n  Bound result 4576\n  Bound result 1000000000000000000\n  Bound result 5586\n  Bound result 2119039784173263205\n  Bound result 1189136015456562835\n  Bound result 23\n  Bound result 161351974013829934986733827\n  Bound result 10000000000000000\n  Bound result 99990000000000000000\n  Bound result 24576\n  Bound result 10000000000000000\n  Bound result 3458\n  Bound result 5353\n  Bound result 2\n  Bound result 98\n  Bound result 2340769577573362169\n  Bound result 211\n  Bound result 2827\n  Bound result 149377524451528856315800171\n  Bound result 2293517444\n  Bound result 2179\n  Bound result 4098\n  Bound result 5019\n  Bound result 95\n  Bound result 2022\n  Bound result 1000\n  Bound result 127\n  Bound result 1000000000000000000\n  Bound result 11824137470035417035\n  Bound result 2021\n  Bound result 135468573457136710043475833\n  Bound result 1427\n  Bound result 127\n  Bound result 4097\n  Bound result 127\n  Bound result 49013282991279559628790568\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.20s (1.20s CPU time)\n\nRan 4 test suites in 1.20s (1.23s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":40,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMDollar.approve(address,uint256)\",\"OneMDollar.transfer(address,uint256)\",\"OneMDollar.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.json\":26,\"README.md\":185,\"foundry.toml\":23,\"launch.json\":24,\"remappings.txt\":4,\"src/OneMDollar.sol\":65,\"test/LaunchCompatibility.t.sol\":176,\"test/OneMDollar.t.sol\":352,\"test/OneMDollarInvariant.t.sol\":82,\"test/PoolManagerRelay.t.sol\":98,\"test/support/V4Actor.sol\":84},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a5eef8c3ed77d87c89f24d218d0637ed2a71ad5b6db8d4ca7113f03e65109303","verifiedTreeHash":"3167a601db04247e7e8ba962e7389155141c5683","verifierVersion":"0.1.0+be003835"},{"checks":[{"durationMs":1928,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.81s\nCompiler run successful!\n","passed":true},{"durationMs":1283,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/PoolManagerRelay.t.sol:PoolManagerRelayTest\n[PASS] test_buyRelayChargesExactly99Percent() (gas: 258548)\n[PASS] test_sellRelayChargesExactly99Percent() (gas: 225302)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.13ms (514.88µs CPU time)\n\nRan 8 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_actorRejectsForgedCallback() (gas: 31991)\n[PASS] test_create2FactoryReceivesEntireSupply() (gas: 33633)\n[PASS] test_erc20PairSingleSidedSeedBuyAndSell() (gas: 2532470)\n[PASS] test_factoryCannotBeFeeRecipient() (gas: 33655)\n[PASS] test_nativePairSingleSidedSeedBuyAndSell() (gas: 1885564)\n[PASS] test_noCommonAdminCallCanMintOrControlHolder() (gas: 1956735)\n[PASS] test_runtimeHasNoForbiddenOpcodesAndFitsEIP170() (gas: 1318899)\n[PASS] test_swarmShareAndClaimsArriveWhole() (gas: 158605)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 16.92ms (6.18ms CPU time)\n\nRan 25 tests for test/OneMDollar.t.sol:OneMDollarTest\n[PASS] testFuzz_buysConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 206605, ~: 208131)\nLogs:\n  Bound result 4098\n\n[PASS] testFuzz_sellsConserveSupplyAndApplyExactFee(uint256) (runs: 512, μ: 199214, ~: 200763)\nLogs:\n  Bound result 768647788967393903958690390\n\n[PASS] testFuzz_walletTransfersHaveNoFee(uint256) (runs: 512, μ: 136670, ~: 137340)\nLogs:\n  Bound result 4098\n\n[PASS] test_approvalReplacementRevocationAndInfiniteAllowance() (gas: 332711)\n[PASS] test_buyTaxesPoolOutput() (gas: 179069)\n[PASS] test_constructorEmitsFullMint() (gas: 6018)\n[PASS] test_deployerHasNoSpecialTaxExemption() (gas: 100415)\n[PASS] test_extremeAmountRevertsBeforeFeeMultiplication() (gas: 33305)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 171449)\n[PASS] test_insufficientBalanceRollsBackFeeAndAllowance() (gas: 177298)\n[PASS] test_invalidConstructorParametersRevert() (gas: 4037)\n[PASS] test_managerAsSpenderDoesNotExemptTaxedEndpoints() (gas: 198789)\n[PASS] test_metadataAndEntireSupplyMintedOnceToDeployer() (gas: 107167)\n[PASS] test_poolManagerEndpointsStillPayPoolTax() (gas: 239622)\n[PASS] test_poolManagerWalletEndpointsReceiveFullAmounts() (gas: 240673)\n[PASS] test_poolSelfTransferChargesFeeAndWalletSelfTransferDoesNot() (gas: 241634)\n[PASS] test_routerCallingOrdinaryTransferDoesNotTriggerTax() (gas: 171914)\n[PASS] test_selfAddressConstructorParametersRevert() (gas: 4871)\n[PASS] test_sellSends99PercentToTreasuryAnd1PercentToPool() (gas: 179303)\n[PASS] test_transferFromConsumesGrossAllowanceOnSellAndBuy() (gas: 347452)\n[PASS] test_treasuryAsSenderOrRecipientPreservesAccounting() (gas: 190097)\n[PASS] test_treasuryCannotTransferMoreThanItsGrossBalance() (gas: 85478)\n[PASS] test_walletTransfersAndOtherVenuesAreUntaxed() (gas: 171415)\n[PASS] test_zeroAddressesRevertWithoutBurningOrSpendingAllowance() (gas: 177294)\n[PASS] test_zeroAndDustTransfersRoundFeeDown() (gas: 257770)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 17.55ms (53.85ms CPU time)\n\nRan 1 test for test/OneMDollarInvariant.t.sol:OneMDollarInvariantTest\n[PASS] invariant_fixedSupplyAndConservationAcrossTransfers() (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| TransferHandler | move     | 8192  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 264326442298595401970982787\n  Bound result 0\n  Bound result 187\n  Bound result 0\n  Bound result 0\n  Bound result 327935414228638122348494506\n  Bound result 176\n  Bound result 1000000000\n  Bound result 4102\n  Bound result 0\n  Bound result 2226\n  Bound result 7\n  Bound result 2828\n  Bound result 0\n  Bound result 0\n  Bound result 1158\n  Bound result 34\n  Bound result 0\n  Bound result 207020673104213793087052011\n  Bound result 1032\n  Bound result 9990000000000000000\n  Bound result 174\n  Bound result 10\n  Bound result 3402\n  Bound result 16413\n  Bound result 643\n  Bound result 2584358459887887190\n  Bound result 592\n  Bound result 701406686\n  Bound result 479\n  Bound result 819\n  Bound result 18\n  Bound result 1587\n  Bound result 3258307518537759081\n  Bound result 4341\n  Bound result 5166\n  Bound result 4826\n  Bound result 4097\n  Bound result 1935885408722309101813950\n  Bound result 4102\n  Bound result 4097\n  Bound result 134321322319828829030384\n  Bound result 4098\n  Bound result 4\n  Bound result 2826\n  Bound result 6578399\n  Bound result 735674890924627796018707801\n  Bound result 1\n  Bound result 4300\n  Bound result 541\n  Bound result 0\n  Bound result 1705331956851290738\n  Bound result 1544959053358165\n  Bound result 1000000000000000000\n  Bound result 3\n  Bound result 2293517445\n  Bound result 528492556390260129625433215\n  Bound result 255\n  Bound result 3000\n  Bound result 26\n  Bound result 186310166987776037513105716\n  Bound result 2237012246577777\n  Bound result 213663181966092157878481351\n  Bound result 940382633888132068286534\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.19s (1.18s CPU time)\n\nRan 4 test suites in 1.19s (1.22s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":41,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OneMDollar.approve(address,uint256)\",\"OneMDollar.transfer(address,uint256)\",\"OneMDollar.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.json\":26,\"README.md\":185,\"foundry.toml\":23,\"remappings.txt\":4,\"src/OneMDollar.sol\":65,\"test/LaunchCompatibility.t.sol\":176,\"test/OneMDollar.t.sol\":352,\"test/OneMDollarInvariant.t.sol\":82,\"test/PoolManagerRelay.t.sol\":98,\"test/support/V4Actor.sol\":84},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":406,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":277,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/OneMDollar.sol:10: Large Numeric Literal (2 places)","passed":true},{"durationMs":1739,"exitCode":0,"name":"proof e9508a994e34","output":"Compiling 72 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.18s\nCompiler run successful!\n\nRan 2 tests for test/imd-proof-d991e55e/Proof_e9508a994e34.t.sol:PoolManagerPassThroughTest\n[PASS] test_buyThroughManagerStillPaysPoolTax() (gas: 227490)\n[PASS] test_sellThroughManagerStillPaysPoolTax() (gas: 198884)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.01ms (631.66µs CPU time)\n\nRan 1 test suite in 2.71ms (1.01ms CPU time): 2 tests passed, 0 failed, 0 skipped (2 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"cdf475dc234ae2f846eaba09290c3ff7287ae03066352f11a8e8116e2bdcc75c","verifiedTreeHash":"f44520c142f87867074aab08b6ec10759f67ce8c","verifierVersion":"0.1.0+be003835"}]}