{"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":"198ebf69-e885-4df9-b886-7570a2f78d6d","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"f6239101ba2e23b081a720d895b3a296b916d43d9a466c48c1f7b44cda7906a4","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"06945b23c8ba14a0777bad0432b10a4135c0267f36375d1a0ae5d956aba9f6f6","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"06945b23c8ba14a0777bad0432b10a4135c0267f36375d1a0ae5d956aba9f6f6","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"63a93af9326d73adfb54fe25d66d0871ea3654cf99af3255db6e10a5ba08805d","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"06945b23c8ba14a0777bad0432b10a4135c0267f36375d1a0ae5d956aba9f6f6","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"06945b23c8ba14a0777bad0432b10a4135c0267f36375d1a0ae5d956aba9f6f6","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"08a63e00979872a1e37f83ae4a005257aaaef7de2fbf20f71d97ab508f0776a4","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"98e64064eaa0ac4c05a737d3879d501a8ad6252047b27878e643a2704a153393","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"98e64064eaa0ac4c05a737d3879d501a8ad6252047b27878e643a2704a153393","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"2ba324e93feaa1fa89ee446d580dc5030c7f6e5896185ef3531895287d4cb960","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"06945b23c8ba14a0777bad0432b10a4135c0267f36375d1a0ae5d956aba9f6f6","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"06945b23c8ba14a0777bad0432b10a4135c0267f36375d1a0ae5d956aba9f6f6","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"a2e58237e3fb4b1991cbfc4e651a1a6851e97c27c6eb18c1387596738ad196fd","dependsOn":["build_contract_project","write_foundry_tests","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"06945b23c8ba14a0777bad0432b10a4135c0267f36375d1a0ae5d956aba9f6f6","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"06945b23c8ba14a0777bad0432b10a4135c0267f36375d1a0ae5d956aba9f6f6","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"16e35a62c8bbecd7da78c652f392f6c693332df1eceaec7c49d062515c7e347e","dependsOn":[],"execution":{"mustProduce":["src/LaunchToken.sol"],"network":false,"profile":"foundry","requires":[],"skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"52bb395874d366a054f1eb51f1a892d6c6583b0f6ece6a4d3ed0c6a397cc0665","dependsOn":["build_contract_project","write_foundry_tests"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"775a9ca64a411b2fdd1f24476ca599371cc7cc4ff535ff0e3889eb1f22c06b59","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"34855370ca090d6b3d67ca9be2b888d13d0f9f81b742b9f9f7eca5cad54281ba","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"34855370ca090d6b3d67ca9be2b888d13d0f9f81b742b9f9f7eca5cad54281ba","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A token and nothing else: drIMD (DRIM).\nToken name: drIMD\nToken symbol: DRIM\nTotal supply: 10000000, with 7 decimals\nTransfer rules: 5% of every transfer goes to 0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5\nMinting after launch: none; the supply is fixed\nPausing: nobody can pause transfers\nAlso: Testing or maybe not \nDrIMD knows","parentJobId":null,"planHash":"b8aac5e47029cb3c982dc5fe25124c5bff1f7f11ba114724c433fd84b65951ab","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"198ebf69-e885-4df9-b886-7570a2f78d6d","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-453-token-nothing-else-drimd"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51046","feedbackHash":"942e45991c4a6719eadb84e0d95ccc6f66581c2fae1c2210baaf7d2f45af71ff","nodeKey":"audit_economics","submissionHash":"2c4a10ab00f21f1c4a5a878d5732627956b89b32a0177f9ca44b71b8d3952e57","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51361","feedbackHash":"9c0c426f4c2f2ce658e286033efe61c8c5c3b7441514d13759ee32667e956304","nodeKey":"audit_economics","submissionHash":"f6239101ba2e23b081a720d895b3a296b916d43d9a466c48c1f7b44cda7906a4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50962","feedbackHash":"a759deb95bc19216f450740620bfc5d51551e267cd7f3e23525ebd1997d501df","nodeKey":"audit_economics","submissionHash":"60cf725a772197398dee02d4563f495fbe2c85086b921e0b966fca73df4928c9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51096","feedbackHash":"ee3f8e39c7492bbac67e5b49e22de7457919dded609baa46412e501c79fcdbdd","nodeKey":"audit_flow","submissionHash":"63a93af9326d73adfb54fe25d66d0871ea3654cf99af3255db6e10a5ba08805d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50956","feedbackHash":"29cb5ad48beb091356fb4eb76128f95955de6a8b04e8b25cd269c05d972da449","nodeKey":"audit_flow","submissionHash":"cbc81ff59c34b17a8e72178d7f2b3c8b2d15c1bda15b0fc26468a1b12ccdb7e1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51046","feedbackHash":"03b0e25de3ed872b31bcd9e8de3f1fba23d93470afa5f41f6de33d054ae38ef9","nodeKey":"audit_judge","submissionHash":"c6f149a6a02804309d15f2a031cc323eb0277cc946b65700685faaa6ff9be4df","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50971","feedbackHash":"8e332d9794a0a7c5cd1f0277f29f6423e7bead20f2e360efa7e2dabbed81391e","nodeKey":"audit_judge","submissionHash":"08a63e00979872a1e37f83ae4a005257aaaef7de2fbf20f71d97ab508f0776a4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50975","feedbackHash":"d5c726e1929074603bb9b82ee3fed65034f528e0df3f75fc5f99df5f0be88b3f","nodeKey":"audit_judge","submissionHash":"ed19b491680f7edaa699720556202e199d37d03a48fbd6bfe539d608736d4e48","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51018","feedbackHash":"9fd32737983c8ee6c0710a8cd6cdf995c02562d3cd9c7acd6d708be41a2cc81b","nodeKey":"audit_math","submissionHash":"2ba324e93feaa1fa89ee446d580dc5030c7f6e5896185ef3531895287d4cb960","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50971","feedbackHash":"5bfee760d8b2dc705acf4090b143e1713144fe99e6cb89674574f447f2e8c124","nodeKey":"audit_math","submissionHash":"0ed73be0b9e05547c421cbb4f09906e48bf5b54fd53dd03d0391e7e447534cff","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50959","feedbackHash":"994eb31597b7a3cf10d34bbabf28f2c35befec0253904a6b1c06188531ea1ab3","nodeKey":"audit_math","submissionHash":"ea837e95541f4be2bbbb9acb01bab4314fcc003ff96cae03864826192f68fe19","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50962","feedbackHash":"f16624b7b67f4326a32e7defae4b56231d510825cb001587f0bf96008107b338","nodeKey":"audit_permissions","submissionHash":"26a851b13b1c390682ab21db7a4f6024ac42527665b724649e940137d1043776","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50959","feedbackHash":"01fe2adc9e08a4ca7880d90a3443bb731a369f5611873065ef17439cf3e4bc58","nodeKey":"audit_permissions","submissionHash":"b87ee90f640959ae16b3421edc3421be897c9c2252537cc20dbc249674fcbb00","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51023","feedbackHash":"e00eb02d52f129fe716cd9689eb768f6fc283f72732de845d1178ce42154038a","nodeKey":"audit_permissions","submissionHash":"a2e58237e3fb4b1991cbfc4e651a1a6851e97c27c6eb18c1387596738ad196fd","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50957","feedbackHash":"9f250919bae9751e19f23f1af14d03ca0165a73a1ccf7226f7c88136b2efc9f8","nodeKey":"build_contract_project","submissionHash":"16e35a62c8bbecd7da78c652f392f6c693332df1eceaec7c49d062515c7e347e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50957","feedbackHash":"a64f9f222eda86755f771c4e3cc2c31ef984698574cec9a7324568b1be7b77bb","nodeKey":"manifest","submissionHash":"4f757ae4fcb229750d89d9a81cda2095287ced1bb173bef9272eee3e2cf601e6","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51198","feedbackHash":"266a3bea456a80ea99759f57395619012222678cebcae66dfc535bcca00043e5","nodeKey":"manifest","submissionHash":"52bb395874d366a054f1eb51f1a892d6c6583b0f6ece6a4d3ed0c6a397cc0665","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50971","feedbackHash":"9f815fb55368fcc3be0de3e16ee1c52f9935921d4ef030f8d8fb06d0df3234f5","nodeKey":"manifest","submissionHash":"4f3584ee5a7a421468291b3ba3161f571941ea09781a09af394e1ffb11a2231c","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50957","feedbackHash":"a0f50b491e836d09e1e68e5e9f3d1058557c052218a3eb2dfca32ef363cc603d","nodeKey":"write_foundry_tests","submissionHash":"1d00c6b9fc94b7fbf08a57830d79244f966c4db75e3300e64882050af4e232b9","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50971","feedbackHash":"f1fb683bb8c37161772c8e481db1ec449ed074c54329cda1657a90510d305089","nodeKey":"write_foundry_tests","submissionHash":"ecced9298138b2ec1f0bb6e617e137e217ac2085527c9eedc7cfdcef31ca5f33","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50956","feedbackHash":"bce9e137c5854a68d05f0a6160852015aa02cd6dd7fc60c584593c312977f4dc","nodeKey":"write_foundry_tests","submissionHash":"775a9ca64a411b2fdd1f24476ca599371cc7cc4ff535ff0e3889eb1f22c06b59","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"e63580e06bb9367f4d230550ad58459ab4a028ebad4a5b36456904a7b40eaad2","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"35c52a5b502e847c","findings":[{"citation":"resolved","description":"Prior finding 884a0a7ee75d0048ba28dbba7909344a8e96ecfe3820df7cd916004894acdb68 remains unresolved as an acceptance-policy conflict. The author is correct that the token implements the approved 5% fee; rerunning the author's reproduction confirms that the protected gross-recipient assertion conflicts with that requirement. Documentation and manifest notes acknowledge the conflict but do not change the executable check. Merge the economics, flow, math and permissions reports into this single medium finding. No incorrect fee calculation or authorization bypass is established. The permissions proof uses a stand-in address and fails before its payout, so it does not substantiate actual distributor insolvency, claimant loss or pool settlement failure; the claimed high severity is dropped. Reconcile the upstream protected receipt requirement with the approved transfer fee, and verify the actual launch integrations. Removing the fee or adding exemptions would change the brief; this is not a request for such a token-only fix.","line":40,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Reproduces the supplied protected gross-receipt requirement.\n/// This requirement conflicts with the approved 5% transfer fee. These assertions\n/// demonstrate that conflict; they do not authorize removing the required fee.\ncontract LaunchReceiptConflictTest is Test {\n    function test_protectedGrossReceiptRequirement() public {\n        LaunchToken token = new LaunchToken();\n        uint256 supply = token.totalSupply();\n        uint256 amount = supply / 1_000;\n        address recipient = address(0xCAFE);\n\n        assertEq(supply, 100_000_000_000_000);\n        assertTrue(token.transfer(recipient, amount));\n        assertEq(token.balanceOf(address(this)), supply - amount);\n        assertEq(token.totalSupply(), supply);\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n    }\n\n    function test_delegatedTransferHasTheSameReceiptConflict() public {\n        LaunchToken token = new LaunchToken();\n        uint256 supply = token.totalSupply();\n        uint256 amount = supply / 1_000;\n        address recipient = address(0xCAFE);\n        address spender = address(0xB0B);\n\n        assertEq(supply, 100_000_000_000_000);\n        assertTrue(token.approve(spender, amount));\n        vm.prank(spender);\n        assertTrue(token.transferFrom(address(this), recipient, amount));\n        assertEq(token.allowance(address(this), spender), 0);\n        assertEq(token.balanceOf(address(this)), supply - amount);\n        assertEq(token.totalSupply(), supply);\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n    }\n}","reproduction":"Fresh LaunchToken deployed by D with no arguments and zero ETH: supply and D balance are 100000000000000 minor units; R=address(0xCAFE) and F=0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5 start empty. D.transfer(R,100000000000), equal to totalSupply()/1000, returns true and credits R with 95000000000 and F with 5000000000; D retains 99900000000000 and supply remains 100000000000000. Expected by TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked: R receives 100000000000. On another fresh deployment, D.approve(address(0xB0B),100000000000), then that spender calls transferFrom(D,R,100000000000): identical balances and gross allowance becomes zero. This round copied all four supplied proofs unchanged under test/scratch/review/proofs/ and ran forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path 'test/scratch/review/proofs/Proof_*.t.sol' -vvv with Foundry 1.8.3 / Solidity 0.8.26. Result: 0 passed, 6 failed, 0 skipped. Both original Proof_884a0a7ee75d tests fail only at the gross-recipient assertion, after supply, sender-balance and delegated-allowance assertions pass. Five failures are 95000000000 != 100000000000; the stand-in distributor test fails at its funding assertion, 9500000000000 != 10000000000000, before executing its payout. The embedded original proof reproduces the incompatible protected requirement and does not authorize removal of the fee. Independently executed unchanged scratch copies of both supplied protected suites using this build's LaunchToken creation bytecode: IMD_TOKEN_DECIMALS=7, IMD_EXPECTED_SUPPLY=100000000000000, IMD_PROJECT_COUNT=0, IMD_PROJECT_FACTORY=0x0000000000000000000000000000000000fac700, IMD_PROJECT_CHAIN_ID=11155111, IMD_EXPECTED_TOKEN=0x2A4590BdfAeD444049EF3C8E69FA8f174599e174 (computed CREATE2 address for salt 1). Command: forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path 'test/scratch/review/protected/*.t.sol' -vvv. Result: 7 passed, 1 failed, 0 skipped; only test_transferMovesExactlyWhatItWasAsked fails with 95000000000 != 100000000000. The unmodified regular suite, run with the same output/cache paths and --match-path 'test/LaunchToken*.t.sol' -vv, passes all 40 tests, including 256 invariant sequences and 32768 handler calls with zero unexpected reverts. To rerun the embedded proof after read inputs are removed, save it as test/scratch/LaunchReceiptConflict.t.sol and run forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path test/scratch/LaunchReceiptConflict.t.sol -vvv.","severity":"medium","snippet":"        super._update(from, to, amount - fee);","title":"Required transfer fee still conflicts with the protected launch receipt check"}],"hash":"08a63e00979872a1e37f83ae4a005257aaaef7de2fbf20f71d97ab508f0776a4","nodeId":"2d0d7232-b17b-4cf4-8267-75cbc21e8d1c","outcome":"completed","summary":"Wrote [.imd-findings.json](/home/identitymd5/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/2d0d7232-b17b-4cf4-8267-75cbc21e8d1c/.imd-findings.json).\n\nOne merged medium finding remains: the required 5% fee conflicts with the protected gross-receipt check. Unsupported downstream-loss and conditional-supply claims were dropped.\n\nValidation: 40 project tests passed; protected checks had 7 passes and 1 failure. All three entry points reviewed. Implementation unchanged.","treeHash":null,"usage":{"cachedInputTokens":891648,"inputTokens":103486,"model":"gpt-6-astra","outputTokens":7912,"runtime":"codex","turns":5,"wallClockMs":271064}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"35c52a5b502e847c","findings":[{"citation":"resolved","description":"Boundary/numerical-invariant conflict: _update correctly deducts the required 5% fee, but the supplied TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked requires the recipient balance to increase by the entire gross amount. With the supplied checks unchanged, this implementation cannot pass launch acceptance. This is a task/policy compatibility defect, not an incorrect fee calculation; removing the fee or exempting the factory would violate the explicit brief. Reconcile the protected receipt requirement and launch accounting with the required fee upstream, then validate that integration. No deployed pool/distributor loss is claimed because their implementation is not supplied.","line":36,"path":"src/LaunchToken.sol","reproduction":"Deploy LaunchToken with no constructor arguments from a fresh account D, which receives 100000000000000 minor units (10000000 DRIM, 7 decimals). From D call transfer(address(0xCAFE), 100000000000), the exact supplyAtDeployment / 1000 input used by the supplied protected test. It returns true; D has 99900000000000, 0xCAFE receives 95000000000, the specified fee recipient receives 5000000000, and totalSupply remains 100000000000000. The protected assertion expects balanceOf(0xCAFE) == 100000000000 and fails with \"recipient received a different amount: 95000000000 != 100000000000\". Reproduced by executing the original supplied Token.protected.t.sol with FOUNDRY_TEST=.imd/reads/protected/evm_project, IMD_TOKEN_CREATION_CODE set to the compiled LaunchToken creation bytecode and IMD_TOKEN_DECIMALS=7, using forge test --offline --match-contract TokenProtectedTest -vvv (artifacts/cache directed to /tmp). The required token behavior is 9500 DRIM net plus 500 DRIM fee for this 10000 DRIM gross transfer; the incompatible protected expectation is 10000 DRIM net. Delegated transfers use the same _update: approve(S, 100000000000), then S.transferFrom(D, address(0xCAFE), 100000000000) from a fresh deployment produces the same balance deltas and consumes the full gross allowance.","severity":"medium","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);\n        if (fee != 0) {\n            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"Required transfer fee is incompatible with the protected launch receipt invariant"}],"hash":"0ed73be0b9e05547c421cbb4f09906e48bf5b54fd53dd03d0391e7e447534cff","nodeId":"85a8c06c-37cd-4b2b-9317-1da8ad04106d","outcome":"completed","summary":"Recorded findings and full entry-point coverage in [.imd-findings.json](/home/identitymd5/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/85a8c06c-37cd-4b2b-9317-1da8ad04106d/.imd-findings.json).\n\n- One medium finding: the required 5% fee conflicts with the protected exact-receipt check.\n- No separate arithmetic defect found.\n- Project tests: 40 passed.\n- Protected checks: 7 passed; 1 reproduced failure.\n\nProduction code and configuration remain unchanged.","treeHash":null,"usage":{"cachedInputTokens":604928,"inputTokens":88811,"model":"gpt-6-astra","outputTokens":6448,"runtime":"codex","turns":5,"wallClockMs":248945}},{"artifacts":[],"attempt":1,"bundleHash":"d52732c0a3e6e6df988b881611957be6e2326de5f910bc939999c87ec48fcad1","device":"0256823ae36e7900","findings":[{"description":"Requirements/integration conflict, not an error in the mandated fee calculation. LaunchToken credits the recipient with 95% of the gross transfer and the fixed fee recipient with 5%, as the explicit task requires. The supplied TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked instead requires the recipient to receive the entire gross amount while the sender loses only that amount and supply stays fixed. Both conditions cannot hold simultaneously. This blocks the protected launch check and any integration that relies on that fee-free accounting. Reconcile the launch policy/protected check with the requested fee token; removing or exempting the required fee is not a valid token-only fix.","line":40,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Reproduces the protected launch floor's fee-free receipt requirement.\n/// This requirement conflicts with the explicit 5% transfer-fee brief.\ncontract ProtectedFeeConflictTest is Test {\n    function test_protectedFloorRequiresTheGrossAmountAtRecipient() public {\n        LaunchToken token = new LaunchToken();\n        uint256 supply = token.totalSupply();\n        assertEq(supply, 100_000_000_000_000);\n        address recipient = address(0xCAFE);\n        uint256 gross = supply / 1_000;\n        assertTrue(token.transfer(recipient, gross));\n        assertEq(token.balanceOf(address(this)), supply - gross);\n        assertEq(token.totalSupply(), supply);\n        assertEq(token.balanceOf(recipient), gross, \"protected floor requires a fee-free transfer\");\n    }\n}","reproduction":"Deploy new LaunchToken() with no arguments: totalSupply is 100000000000000 minor units. From its deployer, call transfer(address(0xCAFE), 100000000000). The protected check expects recipient balance 100000000000. Actual recipient balance is 95000000000, fee-recipient balance is 5000000000, deployer balance is 99900000000000, and supply remains 100000000000000. Ran the two unchanged protected files in test/scratch with decimals=7, expected supply=100000000000000, and zero application contracts: 7 passed, 1 failed with \"recipient received a different amount: 95000000000 != 100000000000\". Also ran the self-contained proof below using forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path test/scratch/ProtectedFeeConflict.t.sol -vv; it failed on exactly the conflicting gross-receipt assertion. The proof encodes the protected expectation, not a recommendation to eliminate the task-required fee.","severity":"medium","title":"Required 5% transfer fee conflicts with the protected launch check"}],"hash":"0fbdb5590b661176c942fa7d1b993e1d3d103052bd350bb963a69bccb4dedd27","nodeId":"db4b9bf6-f0a9-4991-af1f-7aaf19ea1eb0","outcome":"completed","summary":"Added adversarial fuzz tests and three stateful invariants. Offline build and test suite pass: **40 tests**, including **32,768 invariant calls**.\n\nReported one medium conflict with a failing proof in [.imd-findings.json](/home/imd-worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/db4b9bf6-f0a9-4991-af1f-7aaf19ea1eb0/.imd-findings.json): the protected check requires fee-free transfers, contradicting the required 5% fee. Protected results: **7 passed, 1 failed**.","treeHash":"89fea99e4a438152c7e250f043c2540af782d776","usage":{"cachedInputTokens":1014400,"inputTokens":43486,"model":"gpt-6-astra","outputTokens":10369,"runtime":"codex","turns":5,"wallClockMs":426892}},{"artifacts":[],"attempt":1,"bundleHash":"ab1207973905ed895072358a079c9a097618cc1f612d60cadb7d8b5ca78a673e","device":"0256823ae36e7900","findings":[],"hash":"16e35a62c8bbecd7da78c652f392f6c693332df1eceaec7c49d062515c7e347e","nodeId":"5e71ea7d-4efe-4e51-8eb3-5605679b5e73","outcome":"completed","summary":"Implemented DRIM with 10,000,000 tokens, 7 decimals, the fixed 5% transfer fee, and no minting or pausing. Dependencies are vendored; deployment assumptions are documented.\n\n`forge build`, `forge test` (34 tests), and `forge fmt --check` pass.\n\nProtected checks: **7 passed, 1 failed** because one requires fee-free transfers, contradicting your explicit requirement. Details are in [VALIDATION.md](/home/imd-worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/5e71ea7d-4efe-4e51-8eb3-5605679b5e73/VALIDATION.md).","treeHash":"95b00c8aa1706efc199c3232c01663d8b25219ef","usage":{"cachedInputTokens":695552,"inputTokens":39517,"model":"gpt-6-astra","outputTokens":7971,"runtime":"codex","turns":5,"wallClockMs":383306}},{"artifacts":[],"attempt":1,"bundleHash":"22b2606d37c25b1e15d368b3f2408603423cca3b2a01858ea2dbd2f21621d6a0","device":"0256823ae36e7900","findings":[{"description":"Acceptance-policy conflict, not a violation of the requested token behavior: LaunchToken correctly deducts the mandatory 5% fee, while .imd/reads/protected/evm_project/Token.protected.t.sol:141 requires the recipient balance to equal the gross transfer amount. Both requirements cannot hold for an ordinary recipient when a nonzero fee is due. The unchanged supplied protected suites produce 7 passes and 1 failure with token decimals 7, expected supply 100000000000000, and no application contracts. The delivered token tests pass and retain the explicit fee requirement. Reconcile the protected launch policy and its integration assumptions with the task; do not remove the required fee or exempt the protected caller merely to make this check pass. The proof captures the incompatible policy assertion, not a requested replacement token specification.","line":40,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Reproduces the supplied launch floor's fee-free receipt requirement.\n/// @dev This policy requirement conflicts with the assignment's mandatory 5% fee.\ncontract LaunchPolicyConflictProof is Test {\n    function test_protectedPolicyRequiresGrossReceipt() public {\n        LaunchToken token = new LaunchToken();\n        address recipient = address(0xCAFE);\n        uint256 supply = 100_000_000_000_000;\n        uint256 gross = 100_000_000_000;\n\n        assertEq(token.totalSupply(), supply);\n        assertTrue(token.transfer(recipient, gross));\n        assertEq(token.balanceOf(address(this)), supply - gross);\n        assertEq(token.totalSupply(), supply);\n        // Token.protected.t.sol:141 imposes exactly this equality.\n        // Actual receipt is 95_000_000_000; the treasury receives 5_000_000_000.\n        assertEq(token.balanceOf(recipient), gross, \"recipient received a different amount\");\n    }\n}","reproduction":"Deploy new LaunchToken() from the test contract. Call transfer(address(0xCAFE), 100000000000), which is totalSupply()/1000. The protected check expects recipient balance 100000000000. Actual recipient balance is 95000000000 and fee-recipient 0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5 receives 5000000000; sender balance becomes 99900000000000 and supply stays 100000000000000. The embedded proof was written to test/scratch/LaunchPolicyConflictProof.t.sol and run with forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path test/scratch/LaunchPolicyConflictProof.t.sol -vvv. It fails with: recipient received a different amount: 95000000000 != 100000000000. Unchanged copies of both supplied protected suites were also run with creation bytecode supplied via process environment, reproducing exactly the same single failure (7 passed, 1 failed, 0 skipped).","severity":"medium","title":"Mandatory 5% transfer fee conflicts with the supplied fee-free launch check"}],"hash":"1d00c6b9fc94b7fbf08a57830d79244f966c4db75e3300e64882050af4e232b9","nodeId":"db4b9bf6-f0a9-4991-af1f-7aaf19ea1eb0","outcome":"completed","summary":"Preserved the accepted tests and updated verification notes.\n\nOffline `forge build` and `forge test` pass: 40 tests, including 32,768 invariant calls.\n\nReported the unresolved policy conflict in `.imd-findings.json` with an executed failing proof: the protected check requires fee-free receipt, contradicting the mandatory 5% fee. Protected results: 7 passed, 1 failed.","treeHash":"e9bd5f00a6997e356d1e666c98713b6cc57754f8","usage":{"cachedInputTokens":1019008,"inputTokens":50635,"model":"gpt-6-astra","outputTokens":5672,"runtime":"codex","turns":6,"wallClockMs":280798}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3f6a9bdd601cb99f","findings":[{"citation":"resolved","description":"Status after the revision round: not fixed. The only change since my last report is the wording of launch.json notes (commit feabd61 touched launch.json alone; src/LaunchToken.sol is byte-identical). LaunchToken._update still has two branches: mint (from == address(0)) moves the full amount; every other transfer moves amount/20 to the hard-coded FEE_RECIPIENT and amount - amount/20 to the recipient, with no exemption for the ProjectFactory, the Uniswap v4 PoolManager or the MerkleDistributor. I re-ran the network's admission floor .imd/reads/protected/evm_project/Token.protected.t.sol against the freshly compiled creation bytecode: 5 of 6 pass, test_transferMovesExactlyWhatItWasAsked fails with `recipient received a different amount: 95000000000 != 100000000000`. The attached proof also still fails both of its tests on this tree. The author's response (VALIDATION.md, launch.json notes) does not claim the finding does not reproduce; it agrees it reproduces and states that manifest fields cannot change the token's transfer behaviour and that the conflict between the brief (5% of every transfer, no exemptions) and the launch policy (exact-amount transfers) needs upstream reconciliation. I agree with that characterisation: this is a brief-versus-policy conflict, not an implementation slip, and the author cannot resolve it inside this repository without departing from the literal brief. It nevertheless remains a blocking defect for this launch as specified: the factory's LP seed, the distributor funding and every claim payout deliver 95% of what the sender computed, the sum of Merkle leaves can never be paid (the last ~5% of claimants revert with ERC20InsufficientBalance), and a v4 router that settles the exact delta it computed reverts CurrencyNotSettled. Needed to close it: a scope decision by the requester or network, either (a) the network admits a fee-on-transfer token and makes the factory, distributor and pool routing fee-aware, or (b) the brief is amended so transfers originating from launch infrastructure are fee-exempt (and the code changed accordingly). Until one of those happens the token as shipped cannot pass admission, and the finding stays open.","line":38,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Mirrors TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked from the launch floor\n/// (.imd/reads/protected/evm_project/Token.protected.t.sol) without environment variables: the token\n/// is deployed directly, standing in for the ProjectFactory, and one distribution transfer is made.\n/// The floor requires the recipient to receive exactly the requested amount; LaunchToken._update\n/// routes 5% of it to FEE_RECIPIENT, so the factory's LP seed and MerkleDistributor funding are short.\ncontract LaunchFloorTransferTest is Test {\n    LaunchToken private token;\n    uint256 private supplyAtDeployment;\n\n    function setUp() public {\n        token = new LaunchToken();\n        supplyAtDeployment = token.totalSupply();\n    }\n\n    function test_transferMovesExactlyWhatItWasAsked() public {\n        address recipient = address(0xCAFE);\n        uint256 amount = supplyAtDeployment / 1_000;\n        assertGt(amount, 0);\n\n        uint256 before = token.balanceOf(address(this));\n        assertTrue(token.transfer(recipient, amount), \"transfer returned false\");\n\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n        assertEq(token.balanceOf(address(this)), before - amount, \"sender lost a different amount\");\n        assertEq(token.totalSupply(), supplyAtDeployment, \"a transfer changed the supply\");\n    }\n\n    /// @dev The distribution shortfall in one number: after the deployer hands its whole balance to a\n    /// distributor, the distributor cannot pay out the amount it was funded with.\n    function test_distributorFundedWithGrossCannotPayGross() public {\n        address distributor = address(0xD157);\n        address claimant = address(0xC1A1);\n        uint256 allocation = 1_000_000 * 10 ** 7;\n\n        token.transfer(distributor, allocation);\n        assertEq(token.balanceOf(distributor), allocation, \"distributor holds less than its allocation\");\n\n        vm.prank(distributor);\n        token.transfer(claimant, allocation);\n        assertEq(token.balanceOf(claimant), allocation, \"claimant paid less than the allocation\");\n    }\n}","reproduction":"State: fresh LaunchToken deployed by D (D holds 100000000000000). Call: D.transfer(0xCAFE, 100000000000). Expected by the launch floor: balanceOf(0xCAFE) == 100000000000. Actual (re-run this round): balanceOf(0xCAFE) == 95000000000, balanceOf(0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5) == 5000000000. Second sequence: D.transfer(distributor, 10000000000000) then distributor.transfer(claimant, 10000000000000): expected the distributor to hold and pay 10000000000000, actual it holds 9500000000000 and the payout reverts ERC20InsufficientBalance(distributor, 9500000000000, 10000000000000). Commands run this round: copy .imd/reads/protected/evm_project/Token.protected.t.sol into test/scratch/ and run `IMD_TOKEN_CREATION_CODE=$(forge inspect src/LaunchToken.sol:LaunchToken bytecode) IMD_TOKEN_DECIMALS=7 forge test --offline --match-path test/scratch/Token.protected.t.sol` (5 passed, 1 failed: test_transferMovesExactlyWhatItWasAsked); and `forge test --offline --match-path test/scratch/Proof_21d15f662287.t.sol` (0 passed, 2 failed, same messages as last round).","severity":"high","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);\n        if (fee != 0) {\n            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"NOT FIXED: 5% fee on every transfer still fails the launch floor and shorts every factory distribution leg"},{"citation":"resolved","description":"Status after the revision round: unchanged, still conditional on evidence outside this repository. The constructor mints exactly 10,000,000 DRIM at 7 decimals (100000000000000 minor units) to msg.sender, which is correct against the brief and I do not ask for a contract change. The project floor .imd/reads/protected/evm_project/Project.protected.t.sol line 76 requires token.totalSupply() == IMD_EXPECTED_SUPPLY, a value launch/deploy.ts copies from the validated launch_policies row selected by launch.policyVersion; launch.json has no field through which this launch can set it, and the evm-project-launch reference describes the policy template as 1,000,000,000 tokens at 18 decimals (10^27). I re-ran the floor this round under both candidate values: with IMD_EXPECTED_SUPPLY=100000000000000 it passes 2/2; with IMD_EXPECTED_SUPPLY=1000000000000000000000000000 it fails in setUp with `policy supply mismatch` before any test runs. The author's revision did not add evidence about the policy row (it cannot from this repository), so the finding cannot be closed or dropped from here. Needed evidence: the supply field of the launch_policies row for this launch. If it is 10^14 this finding is moot; if it is 10^27 the fix is a policy row matching the brief, not a change to INITIAL_SUPPLY, which would violate the brief.","line":9,"path":"src/LaunchToken.sol","reproduction":"Copy .imd/reads/protected/evm_project/Project.protected.t.sol into test/scratch/. With CODE=$(forge inspect src/LaunchToken.sol:LaunchToken bytecode), FACTORY=0x00000000000000000000000000000000000000F1, TOKEN=$(cast create2 --deployer $FACTORY --salt 0x0000000000000000000000000000000000000000000000000000000000000001 --init-code-hash $(cast keccak $CODE)) and IMD_TOKEN_CREATION_CODE=$CODE IMD_PROJECT_FACTORY=$FACTORY IMD_EXPECTED_TOKEN=$TOKEN IMD_PROJECT_CHAIN_ID=11155111 IMD_PROJECT_COUNT=0: `IMD_EXPECTED_SUPPLY=100000000000000 forge test --offline --match-path test/scratch/Project.protected.t.sol` passes 2/2; `IMD_EXPECTED_SUPPLY=1000000000000000000000000000 forge test --offline --match-path test/scratch/Project.protected.t.sol` fails in setUp with `policy supply mismatch` (token.totalSupply() is 100000000000000). Expected: the policy supply equals the brief's 10^14 so the floor passes; actual: unknown until the policy row is read.","severity":"medium","snippet":"    uint256 public constant INITIAL_SUPPLY = 10_000_000 * 10 ** 7;","title":"UNCHANGED (conditional): fixed supply of 10^14 minor units fails the project floor if the launch policy pins the reference supply of 10^27"}],"hash":"26a851b13b1c390682ab21db7a4f6024ac42527665b724649e940137d1043776","nodeId":"1a818daf-16f2-4a1f-9cb0-342822a06475","outcome":"completed","summary":"Both findings from the previous round remain open. The revision changed only the wording of the launch.json note, and the token source is byte-identical to what I reviewed before.\n\n**High, not fixed: 5% fee fails the launch floor.** I re-ran the network's protected token floor against freshly compiled bytecode and the attached proof against the current tree. Both fail exactly as before. The floor's transfer check expects the recipient to receive the full requested amount and gets 95%. The author does not dispute this. Their note and VALIDATION.md agree it reproduces and state that the manifest cannot change transfer behaviour. I agree that this is a conflict between the brief and the launch policy rather than an implementation slip, but it still blocks admission as specified. Closing it needs a scope decision from the requester or network: either the launch infrastructure becomes fee-aware, or the brief is amended to exempt factory, pool and distributor transfers.\n\n**Medium, unchanged and conditional: supply versus the policy row.** The project floor passes when the expected supply is the brief's 10^14 and fails in setUp when it is the reference 10^27. Nothing in this revision could supply the missing evidence, which is the supply field of the selected launch policy row. If it carries 10^14 the finding is moot. If it carries 10^27 the fix belongs in the policy, not the contract.\n\n**No new defects.** The delivered suite passes 40 of 40 tests. The manifest is schema-shaped with a note under the length limit. Approve is unmodified OpenZeppelin code with no privileged path, and the ABI exposes no owner, mint, pause or fee-setter role.\n\nThe findings file at the repository root holds both findings, the proof source on the high one, and coverage rows for all three entry points plus three invariants. The scratch directory is removed and the tree is clean.","treeHash":null,"usage":{"cachedInputTokens":459643,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":8200,"runtime":"claude","turns":14,"wallClockMs":132000}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"30a6c1a419ef4f9c","findings":[{"citation":"resolved","description":"Status of prior finding 5f401d8d77eb6a70c9bd4e606b3ba9d7964c14eb87f687f79143de16e845086e: NOT FIXED. The only change this round is the addition of launch.json (git diff HEAD~2..HEAD: 1 file, launch.json, 17 insertions); src/LaunchToken.sol was last touched in commit 89aeb74, before my first review, so the transfer behaviour is identical. The manifest notes acknowledge the conflict in the same words as before (\"The brief's fee rule and that fee-free check cannot both hold ... this remains an open reconciliation item\"). The author does not dispute the facts and I confirm them: the fee math itself is correct and I re-verified it on this tree (fuzz over 0..INITIAL_SUPPLY: recipient gets amount - floor(amount*5/100), fee recipient gets floor(amount*5/100), sender debited gross, totalSupply conserved; rounding boundaries 19->fee 0, 20->fee 1, 39->fee 1; self-transfer and fee-recipient-as-sender/recipient consistent; overdraw by one reverts; transferFrom consumes gross allowance and leaves an infinite allowance untouched; all 40 project tests pass). What remains is the unchanged conflict: the supplied protected floor TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked asserts balanceOf(recipient) == amount after transfer(recipient, supply/1000), and the factory LP seeding and MerkleDistributor allocate on the assumption that a transfer delivers its gross amount; with this code each receives 95% of what it is credited for. No token-side change can satisfy both the brief (5% of every transfer, no exemptions) and the floor. This is a requester/judge decision, not a builder defect: amend the brief to exempt launch infrastructure (adding an immutable exemption set to the token), drop the fee, or have the launch policy explicitly accept a fee-on-transfer token and re-derive pool/distributor accounting. Until one of those is decided the token fails the protected floor and should not be deployed against a pool and distributor that assume gross receipt. The attached proof mirrors the protected assertion exactly and still fails on this tree; it records the disagreeing input rather than prescribing removal of the fee.","line":36,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Mirrors TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked from the supplied\n/// protected launch floor. It fails on the current LaunchToken because the required 5% fee is\n/// deducted from what the recipient receives. It does not prescribe removing the fee: it records\n/// the exact input on which the brief and the protected floor disagree.\ncontract ProtectedReceiptProof is Test {\n    LaunchToken token;\n    uint256 supplyAtDeployment;\n\n    function setUp() public {\n        token = new LaunchToken();\n        supplyAtDeployment = token.totalSupply();\n    }\n\n    function test_transferMovesExactlyWhatItWasAsked() public {\n        address recipient = address(0xCAFE);\n        uint256 amount = supplyAtDeployment / 1_000; // 100000000000 minor units = 10000 DRIM\n        assertGt(amount, 0);\n\n        uint256 before = token.balanceOf(address(this));\n        assertTrue(token.transfer(recipient, amount), \"transfer returned false\");\n\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n        assertEq(token.balanceOf(address(this)), before - amount, \"sender lost a different amount\");\n        assertEq(token.totalSupply(), supplyAtDeployment, \"a transfer changed the supply\");\n    }\n}","reproduction":"State: fresh LaunchToken deployed by account D with no constructor arguments; D holds 100000000000000 minor units (10000000 DRIM at 7 decimals). Call from D: transfer(0x000000000000000000000000000000000000CAFE, 100000000000) (= supplyAtDeployment / 1000, the protected test input). Expected by the protected floor: balanceOf(0xCAFE) == 100000000000, balanceOf(D) == 99900000000000, totalSupply unchanged. Actual on this tree: returns true; balanceOf(0xCAFE) == 95000000000; balanceOf(0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5) == 5000000000; balanceOf(D) == 99900000000000; totalSupply == 100000000000000. Re-run this round: copied .imd/reads/protected/evm_project/Token.protected.t.sol unchanged to test/scratch/, forge build --offline, then IMD_TOKEN_CREATION_CODE=<out/LaunchToken.sol/LaunchToken.json .bytecode.object> IMD_TOKEN_DECIMALS=7 IMD_EXPECTED_SUPPLY=100000000000000 forge test --offline --match-path test/scratch/Token.protected.t.sol -> 5 passed, 1 failed: [FAIL: recipient received a different amount: 95000000000 != 100000000000] test_transferMovesExactlyWhatItWasAsked(). The attached proof copied to test/scratch/Proof_5f401d8d77eb.t.sol fails identically without environment variables. Same balances via transferFrom: D.approve(S, 100000000000); S.transferFrom(D, 0xCAFE, 100000000000) -> allowance 0, recipient 95000000000, fee address 5000000000.","severity":"medium","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);\n        if (fee != 0) {\n            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"Required transfer fee is incompatible with the protected launch receipt invariant (not fixed this round; source unchanged, still reproduces)"}],"hash":"2ba324e93feaa1fa89ee446d580dc5030c7f6e5896185ef3531895287d4cb960","nodeId":"85a8c06c-37cd-4b2b-9317-1da8ad04106d","outcome":"completed","summary":"The review is done and written to `.imd-findings.json`. Nothing else is pending.\n\n**Outcome:** my one prior finding is not fixed and still reproduces. The token source is byte-for-byte what I reviewed last round. The only change this round is a new `launch.json`, whose notes restate the conflict rather than resolve it.\n\n**What I re-ran on this tree**\n\n- My attached proof, copied under test/scratch, fails exactly as before: recipient receives 95000000000 where the protected floor expects 100000000000.\n- The unmodified protected token floor, run with the built creation bytecode and 7 decimals, gives 5 passed and 1 failed on the same receipt assertion.\n- The project suite passes all 40 tests.\n- A fresh scratch fuzz over the full supply range confirms the fee math itself is exact: fee equals floor of 5%, sender debited gross, supply conserved, rounding boundaries at 19, 20 and 39 correct, overdraw by one reverts, and transferFrom consumes gross allowance.\n\n**Verdict on the finding.** It stays at medium and is marked not fixed. The author does not dispute the facts. The brief's \"5% of every transfer, no exemptions\" and the floor's gross-receipt assertion cannot both hold, and the factory LP seeding and MerkleDistributor split rely on the same gross-receipt assumption. That is a decision for the requester or judge, not something the builder can fix in the token. The options I listed remain: exempt launch infrastructure via an immutable exemption set, drop the fee, or have policy explicitly accept a fee-on-transfer token and re-derive downstream accounting.\n\n**No new findings.** The math, boundary and numerical gap checks in my area all hold. The coverage record answers all three entry points plus three invariants, and the scratch directory is removed so the tree is clean.","treeHash":null,"usage":{"cachedInputTokens":291692,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":8749,"runtime":"claude","turns":7,"wallClockMs":153323}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"02ae6543274731ab","findings":[{"citation":"resolved","description":"Revalidation of prior finding 796bed00ac66fb7738bd3cf99655f03bebd109c8d09de7b2126e58c5cd32d7b8: unresolved acceptance-policy conflict, narrowed from high to medium. The revised documentation acknowledges the conflict, but the token still credits only 95% of a gross transfer to an ordinary recipient. The supplied TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked requires 100%, so admission under that unchanged check still fails. The implementation follows the explicit 5% fee requirement; this is not an unauthorized fee or an implementation departure from the brief. The previously attached proof was copied unchanged into test/scratch and both tests failed again. Its split example confirms net balances only: the repository supplies no actual factory, pool manager or MerkleDistributor implementation, so permanent claimant losses and a specific pool-settlement revert are not established and are withdrawn as proven impacts. Resolution belongs to the upstream acceptance policy and launch integration: reconcile the protected receipt requirement and review fee-aware distribution/settlement while preserving the requested fee, or obtain an explicit change to the token requirements. Documentation or manifest notes alone do not resolve the failed check.","line":36,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Reproduces the supplied protected admission requirement, which conflicts\n/// with the requested transfer fee. This is not evidence of a deployed integration loss.\ncontract LaunchPolicyConflictProof is Test {\n    function test_protectedAdmissionRequiresGrossReceipt() public {\n        LaunchToken token = new LaunchToken();\n        uint256 supply = token.totalSupply();\n        uint256 amount = supply / 1_000;\n        address recipient = address(0xCAFE);\n        uint256 beforeBalance = token.balanceOf(address(this));\n\n        assertTrue(token.transfer(recipient, amount), \"transfer returned false\");\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n        assertEq(token.balanceOf(address(this)), beforeBalance - amount, \"sender lost a different amount\");\n        assertEq(token.totalSupply(), supply, \"a transfer changed the supply\");\n    }\n}","reproduction":"Deploy new LaunchToken from F, giving F 100000000000000 minor units. From F call transfer(address(0xCAFE), 100000000000). The supplied protected check expects recipient balance 100000000000; actual is 95000000000, the fixed fee address receives 5000000000, F retains 99900000000000, and totalSupply is unchanged. Save the embedded proof as test/scratch/LaunchPolicyConflictProof.t.sol and run forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path test/scratch/LaunchPolicyConflictProof.t.sol -vvv. Observed failure: recipient received a different amount: 95000000000 != 100000000000. The unchanged Token.protected.t.sol was also run against the compiled creation bytecode with IMD_TOKEN_DECIMALS=7: five tests passed and this transfer test failed, with zero skips. The original attached Proof_796bed00ac66.t.sol was separately copied unchanged and both of its tests failed again. Its fresh-deployment split transfers 2000000000000 to 0xD1, 8000000000000 to 0xD2 and 90000000000000 to 0xB00; their balances are 1900000000000, 7600000000000 and 85500000000000, F is empty, and the fee address holds 5000000000000. Those addresses are stand-ins, not deployed integrations.","severity":"medium","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);\n        if (fee != 0) {\n            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"Required transfer fee still conflicts with the protected launch admission check"}],"hash":"2c4a10ab00f21f1c4a5a878d5732627956b89b32a0177f9ca44b71b8d3952e57","nodeId":"8e5cb5a8-6a25-448b-91a2-39ec1f50085b","outcome":"completed","summary":"Wrote [.imd-findings.json](/home/imd-worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/8e5cb5a8-6a25-448b-91a2-39ec1f50085b/.imd-findings.json).\n\n- Prior high finding remains reproducible, narrowed to a **medium admission-policy conflict**; downstream losses remain unproven.\n- Rounding advisory withdrawn as documented behavior, not fixed.\n- All three entry points covered. All 40 project tests passed; protected checks had five passes and the confirmed transfer failure.\n\nProduction files remain unchanged.","treeHash":null,"usage":{"cachedInputTokens":761472,"inputTokens":85034,"model":"gpt-6-astra","outputTokens":8510,"runtime":"codex","turns":5,"wallClockMs":320289}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0256823ae36e7900","findings":[],"hash":"3f2c29a536e1ac3a4966d80fb6555497bef34b2806208e3cb9246cdb958f8b63","nodeId":"5e71ea7d-4efe-4e51-8eb3-5605679b5e73","outcome":"no_change","summary":"Recorded **disputed** in [.imd-responses.json](/home/imd-worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/5e71ea7d-4efe-4e51-8eb3-5605679b5e73/.imd-responses.json).\n\nThe proof reproduces, but its fee-free expectation contradicts the mandatory 5% fee. Implementation unchanged; launch-policy reconciliation remains necessary.\n\nValidation passed: `forge build`, all 34 project tests, and `forge fmt --check`. The disputed proof still fails.","treeHash":null,"usage":{"cachedInputTokens":312576,"inputTokens":33919,"model":"gpt-6-astra","outputTokens":2203,"runtime":"codex","turns":3,"wallClockMs":113239}},{"artifacts":[],"attempt":1,"bundleHash":"953669db71177b515c1ddd574caeeda77cce0b7e0316f94534cf97883cf9ee53","device":"35c52a5b502e847c","findings":[],"hash":"4f3584ee5a7a421468291b3ba3161f571941ea09781a09af394e1ffb11a2231c","nodeId":"7f45e8b3-9573-47d4-8b9c-7931725c49ca","outcome":"completed","summary":"Updated only [launch.json](/home/identitymd5/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/7f45e8b3-9573-47d4-8b9c-7931725c49ca/launch.json), preserving deployment fields and clarifying the compatibility note.\n\nSchema and constructor ABI checks pass. `forge build` succeeds; all 40 repository tests pass.\n\nProtected checks: 7 pass, 1 fails because it requires fee-free transfers, conflicting with the required 5% fee. A manifest change cannot resolve that conflict.","treeHash":"165cb860760fdc446d4bdbc2adaf6ce3d048080b","usage":{"cachedInputTokens":440704,"inputTokens":43793,"model":"gpt-6-astra","outputTokens":4180,"runtime":"codex","turns":4,"wallClockMs":176439}},{"artifacts":[],"attempt":1,"bundleHash":"c920cd23e7ee63cad9f388ab1063d5993d3e5162aee9f5ba981d9148a4cbdbfc","device":"0256823ae36e7900","findings":[],"hash":"4f757ae4fcb229750d89d9a81cda2095287ced1bb173bef9272eee3e2cf601e6","nodeId":"7f45e8b3-9573-47d4-8b9c-7931725c49ca","outcome":"completed","summary":"Created [launch.json](/home/imd-worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/7f45e8b3-9573-47d4-8b9c-7931725c49ca/launch.json) with DRIM metadata and `contracts: []`. Only the manifest is submitted.\n\nSchema validation and `forge build` passed; repository tests: 40 passed.\n\nProtected checks: 7 passed, 1 failed because fee-free receipt conflicts with the required 5% transfer fee. This unresolved issue is documented in the manifest notes.","treeHash":"9de042cfa0312bf367abe64bb5a915ad2212cbd9","usage":{"cachedInputTokens":318208,"inputTokens":58874,"model":"gpt-6-astra","outputTokens":4345,"runtime":"codex","turns":5,"wallClockMs":132635}},{"artifacts":[],"attempt":2,"bundleHash":"88896e56f03cb869a0115928edfea9c6fb1763987b96dd40d729e5b3c43c1e7b","device":"29ea8835baa3dfe1","findings":[],"hash":"52bb395874d366a054f1eb51f1a892d6c6583b0f6ece6a4d3ed0c6a397cc0665","nodeId":"7f45e8b3-9573-47d4-8b9c-7931725c49ca","outcome":"completed","summary":"The manifest at `launch.json` is revised and verified. Only that file changed.\n\n**What I did**\n- Kept every structural field as accepted: kind `evm_project`, token LaunchToken / drIMD / DRIM / 7 decimals, empty contracts list, and the native-ETH pool with the reference defaults.\n- Rewrote the notes to describe the accepted token precisely: fixed supply minted to msg.sender, the 5% fee via FEE_BPS and the constant fee recipient, no owner, minter, pause, or upgrade path, and the policy override of the pool price.\n- The notes now record the verification results and state the unresolved conflict explicitly, with the exact minor-unit amounts from the failing check.\n\n**Verification on the accepted tree**\n\n| Check | Result |\n|---|---|\n| forge build | passes |\n| forge test | 40 passed, 0 failed |\n| Protected checks from test/scratch | 7 passed, 1 failed |\n| Schema constraints on launch.json | all pass, notes 2129 of 4000 chars |\n\n**Open item, not fixable here**\nThe one protected failure is the fee-free transfer check, which expects the recipient to receive the full amount. The brief requires 5% of every transfer to go to the fee address, so the accepted token credits 95% to the recipient. No manifest field changes transfer behavior. The network needs to reconcile the brief's fee rule with that check before this token can pass the launch policy.\n\nThe previous rejection was for an empty diff. This submission changes one line in launch.json, and the scratch directory was removed after the run.","treeHash":"01d18c15acd82ca926111cd19f0169a834b89228","usage":{"cachedInputTokens":248269,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":6155,"runtime":"claude","turns":12,"wallClockMs":96630}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3f6a9bdd601cb99f","findings":[{"citation":"resolved","description":"Area: Economic Security (token misbehaviour: fee-on-transfer where integrations use the assumed amount) and Flow Gap seam execution x periphery x first principles. _update taxes every non-mint transfer with no exemption, including the factory's own distribution transfers. The launch flow (evm-project-launch reference) has the factory receive the whole supply, split it 2% / 8% / remainder, move the reward allotments to the MerkleDistributor and seed the pool with the launch token. Every one of those transfers credits only 95% of the computed amount and sends 5% to 0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5, an address with no role in the launch. Consequences: (1) The protected admission floor TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked asserts balanceOf(recipient) == amount after transfer(recipient, supply/1000); on this token it fails with 'recipient received a different amount: 95000000000 != 100000000000', so the launch cannot be admitted as delivered (VALIDATION.md records the same failure). (2) If the floor were waived, a MerkleDistributor funded with the 2% allotment (2_000_000_000_000 minor units) holds 1_900_000_000_000 while its tree sums to 2_000_000_000_000, so the last claimants' claims revert: identifiable victims are the launch contributors and reward wallets who lose 5% of the reward pool to the fee address. (3) A Uniswap v4 seed that settles the pool manager by transferring the exact seed amount sees only 95% arrive and the whole launch transaction reverts (CurrencyNotSettled); a seed that survives leaves the pool 5% under the liquidity the factory recorded. The token behaves exactly as the brief specifies ('5% of every transfer ... no exemptions'), so this is a conflict between the brief and the launch policy floor, not a coding slip; it still blocks shipping. Fix requires a scope decision by the requester: either remove the fee (the floor's requirement), or exempt the launch path (factory, pool manager, MerkleDistributor as sender/receiver) which contradicts the 'no exemptions' rule, or have the network waive the fee-free floor and fund the distributor and pool gross-up by 1/0.95. The token alone cannot satisfy both requirements. Trust note (not a defect): FEE_RECIPIENT is a hard-coded address whose control is unverified; 5% of all volume accrues to it permanently and cannot be redirected.","line":36,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Reproduces the launch-floor and factory-distribution assumption that a transfer of `amount`\n/// credits `amount` to the recipient. LaunchToken routes 5% of every transfer to FEE_RECIPIENT, so the\n/// factory (the deployer here), the pool and the MerkleDistributor each end up 5% short of what the\n/// factory's split computed. Fails on the current code; passes once transfers deliver the gross amount\n/// to launch recipients.\ncontract FeeOnTransferLaunchProof is Test {\n    LaunchToken token;\n    uint256 supply;\n\n    function setUp() public {\n        token = new LaunchToken();\n        supply = token.totalSupply();\n    }\n\n    /// @dev Mirrors TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked from the launch floor.\n    function test_launchFloorTransferMovesExactlyWhatItWasAsked() public {\n        address recipient = address(0xCAFE);\n        uint256 amount = supply / 1_000; // 10,000 DRIM = 100_000_000_000 minor units\n\n        uint256 before = token.balanceOf(address(this));\n        assertTrue(token.transfer(recipient, amount), \"transfer returned false\");\n\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n        assertEq(token.balanceOf(address(this)), before - amount, \"sender lost a different amount\");\n        assertEq(token.totalSupply(), supply, \"a transfer changed the supply\");\n    }\n\n    /// @dev A factory-style split: 2% + 8% reward allotments and the remainder to the pool. Every\n    /// recipient of the split must hold its allotment, otherwise claims computed from the split run short.\n    function test_factorySplitRecipientsHoldTheirAllotments() public {\n        address distributorContributors = address(0xD1);\n        address distributorWallets = address(0xD2);\n        address pool = address(0xB00);\n\n        uint256 contributors = supply * 2 / 100;\n        uint256 wallets = supply * 8 / 100;\n        uint256 lp = supply - contributors - wallets;\n\n        token.transfer(distributorContributors, contributors);\n        token.transfer(distributorWallets, wallets);\n        token.transfer(pool, lp);\n\n        assertEq(token.balanceOf(address(this)), 0, \"factory keeps nothing\");\n        assertEq(token.balanceOf(distributorContributors), contributors, \"contributor distributor short\");\n        assertEq(token.balanceOf(distributorWallets), wallets, \"wallet distributor short\");\n        assertEq(token.balanceOf(pool), lp, \"pool short\");\n        assertEq(token.balanceOf(token.FEE_RECIPIENT()), 0, \"launch split leaked to the fee address\");\n    }\n}","reproduction":"Deploy LaunchToken from address F (stands in for the factory; F holds 100_000_000_000_000). Call F -> transfer(0xCAFE, 100_000_000_000). Expected by the launch floor and by any fee-agnostic integration: balanceOf(0xCAFE) == 100_000_000_000, balanceOf(F) == 99_900_000_000_000. Actual: balanceOf(0xCAFE) == 95_000_000_000, balanceOf(0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5) == 5_000_000_000, balanceOf(F) == 99_900_000_000_000. Factory split: F -> transfer(D1, 2_000_000_000_000) (2%), transfer(D2, 8_000_000_000_000) (8%), transfer(POOL, 90_000_000_000_000). Expected: D1 holds 2_000_000_000_000, D2 8_000_000_000_000, POOL 90_000_000_000_000. Actual: D1 1_900_000_000_000, D2 7_600_000_000_000, POOL 85_500_000_000_000, fee address 5_000_000_000_000; F holds 0 so nothing is left to top up the distributors. Run: forge test --match-path test/scratch/FeeOnTransferLaunchProof.t.sol (both tests fail on the current code with the numbers above).","severity":"high","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);\n        if (fee != 0) {\n            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"5% fee on every transfer leaves the launch factory, pool and MerkleDistributor 5% short and fails the launch admission floor"},{"citation":"resolved","description":"Area: Invariant (fee = 5% of gross) and Economic Security (push a fee formula to zero). fee = amount / 20 truncates, so any transfer of 1..19 minor units pays no fee, and every transfer pays up to 19 minor units less than 5% of gross. A sender who splits a transfer into 19-unit chunks pays zero fee overall. Economics: with 7 decimals one chunk moves 0.0000019 DRIM and costs about 35_375 gas (measured), so evading the fee on a single DRIM needs 526_316 transfers, roughly 1.86e10 gas. The fee recipient's loss is bounded by 19 minor units per transfer and there is no compounding, so the bypass is not profitable and the impact is dust; reported as low because the brief states 5% of every transfer and README.md documents the rounding as intended. If exact collection matters, round the fee up (fee = (amount + 19) / 20) or enforce a minimum of 1 unit for non-zero transfers; both change the documented semantics and the requester should decide.","line":36,"path":"src/LaunchToken.sol","reproduction":"Deploy LaunchToken from A. A -> transfer(B, 19): expected under a literal reading of the brief a fee of ceil(0.95) = 1 unit; actual fee 0, balanceOf(B) == 19, fee address unchanged. Repeat 100 times: B holds 1_900, fee address holds 0, whereas a single transfer(B, 1_900) credits B 1_805 and the fee address 95. Also transfer(B, 39): fee 1 (2.56%) instead of 1.95. Measured cost per 19-unit transfer: ~35_375 gas.","severity":"low","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);","title":"Fee rounds down to zero for gross amounts below 20 minor units, so '5% of every transfer' is not collected on small or split transfers"}],"hash":"60cf725a772197398dee02d4563f495fbe2c85086b921e0b966fca73df4928c9","nodeId":"8e5cb5a8-6a25-448b-91a2-39ec1f50085b","outcome":"completed","summary":"The findings file is written and the review is complete. The file is excluded from git by the repo's own exclude list, which is expected for this deliverable. No source files were changed and the scratch tests were removed.\n\n**Result: one high, one low, all three entry points covered.**\n\n- **High: the 5% fee breaks the launch flow.** Every transfer, including the factory's own distribution, credits the recipient 95% and sends 5% to the hard-coded fee address. The protected admission floor asserts exact delivery and fails on this token. If the floor were waived, the MerkleDistributor would hold 5% less than its merkle tree promises and the last claimants would revert, and a pool seed that settles by exact transfer would revert the whole launch. The code does exactly what the brief asked, so this is a brief-versus-policy conflict that only the requester can resolve: drop the fee, exempt the launch path, or have the network waive the floor and gross up allocations. A self-contained Foundry proof is embedded, and it fails on the current code with the expected numbers.\n- **Low: fee truncates to zero below 20 minor units.** A 19-unit transfer pays no fee. Evasion is not profitable: dodging the fee on one DRIM would need about 526,000 transfers at roughly 35k gas each. It is reported because the brief says 5% of every transfer.\n\n**Coverage.** Approve holds as unmodified OpenZeppelin behavior. Transfer and transferFrom carry finding 1. Three invariants were checked: supply conservation and the absence of any mint, pause, owner, upgrade or burn path both hold. The fee-equals-5% invariant carries finding 2. Overlap cases where the fee address is sender or receiver, and self-transfers, behave as documented and cannot bypass the fee.\n\n**Not a defect, noted as trust.** The fee address is a constant whose control is unverified, so 5% of all volume accrues there permanently with no way to redirect it. The existing suite of 40 tests passes and already covers rounding boundaries and address overlaps, so no test-coverage gap was reported beyond the integration conflict itself.","treeHash":null,"usage":{"cachedInputTokens":789095,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":15227,"runtime":"claude","turns":12,"wallClockMs":266086}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1d142f9c9d30c62a","findings":[{"citation":"resolved","description":"Unresolved on re-review of finding 4ddfe4a613b8b0a99108b69b836279561e5f3b6c6e909a11b4b5374c4b184c16. The revised tree documents the conflict and retains a reproduction, but the supplied executable admission check remains incompatible with the approved fee. Both transfer entry points correctly deduct the required 5%; TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked still demands that an ordinary recipient receive the full gross amount. Independently rerunning both unchanged protected suites yields 7 passes, 1 failure, and no skips. The regular suite passes all 40 tests, including 32768 invariant-handler calls. This is an outstanding acceptance/integration blocker, not a defect in the required fee calculation or an authorization exploit. The network must reconcile its admission check and demonstrate that factory, pool and distributor accounting supports the required net receipts. Removing the fee or adding exemptions would violate the brief. Production service implementations are absent from this tree, so no downstream loss or pool exploit is asserted.","line":36,"path":"src/LaunchToken.sol","reproduction":"Deploy src/LaunchToken.sol:LaunchToken from D with no constructor arguments and zero ETH. Initially D holds 100000000000000 minor units; R=address(0xCAFE) and F=0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5 hold zero. D calls transfer(R,100000000000), equal to totalSupply()/1000. The call returns true and emits transfers of 5000000000 to F and 95000000000 to R; D retains 99900000000000 and totalSupply stays 100000000000000. This satisfies the brief, but the protected assertion requires R.balanceOf=100000000000 and fails with: recipient received a different amount: 95000000000 != 100000000000. Reproduced offline with Foundry 1.8.3/Solidity 0.8.26: compile the current project; set IMD_TOKEN_CREATION_CODE to bytecode.object from the current LaunchToken artifact; set FOUNDRY_TEST=.imd/reads/protected/evm_project, IMD_TOKEN_DECIMALS=7, IMD_EXPECTED_SUPPLY=100000000000000, IMD_PROJECT_COUNT=0, IMD_PROJECT_FACTORY=0x0000000000000000000000000000000000fac700, IMD_PROJECT_CHAIN_ID=11155111, and IMD_EXPECTED_TOKEN=0x2a4590bdfaed444049ef3c8e69fa8f174599e174 (CREATE2 salt 1); run forge test --offline -vvv with output/cache paths in a temporary directory. Both original protected files were executed directly without edits. Result: 7 passed, 1 failed, 0 skipped; only test_transferMovesExactlyWhatItWasAsked failed with the exact mismatch above.","severity":"medium","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);\n        if (fee != 0) {\n            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"Required transfer fee still conflicts with the protected launch admission check"}],"hash":"63a93af9326d73adfb54fe25d66d0871ea3654cf99af3255db6e10a5ba08805d","nodeId":"cf96f6d4-9f76-4ef8-ba44-88336b3efdaa","outcome":"completed","summary":"Recorded the unresolved medium finding and all three entry-point coverage rows in [.imd-findings.json](/home/imd/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/cf96f6d4-9f76-4ef8-ba44-88336b3efdaa/.imd-findings.json).\n\nThe required 5% fee still conflicts with the protected full-receipt assertion. Project tests: 40 passed. Protected checks: 7 passed, 1 failed. No new defects substantiated; project files unchanged.","treeHash":null,"usage":{"cachedInputTokens":547968,"inputTokens":77208,"model":"gpt-6-astra","outputTokens":5905,"runtime":"codex","turns":4,"wallClockMs":206125}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0256823ae36e7900","findings":[],"hash":"6e1ae6d6f4d6c4caed41156b51d066542007fceed538827dfff0ade553377808","nodeId":"5e71ea7d-4efe-4e51-8eb3-5605679b5e73","outcome":"no_change","summary":"Recorded `disputed` in [.imd-responses.json](/home/imd-worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/5e71ea7d-4efe-4e51-8eb3-5605679b5e73/.imd-responses.json).\n\nThe proof reproduces, but requires fee-free receipt, contradicting the explicit 5% fee. Implementation unchanged; the protected-check conflict requires upstream resolution.\n\nValidation passed: `forge build`, all 34 project tests, and `forge fmt --check`.","treeHash":null,"usage":{"cachedInputTokens":396032,"inputTokens":36894,"model":"gpt-6-astra","outputTokens":2234,"runtime":"codex","turns":3,"wallClockMs":117087}},{"artifacts":[],"attempt":1,"bundleHash":"b94347b6cd0c54c6a189309206b7318dc03c69352d367c06d770014635f93c06","device":"bb0a3bf63233e5e5","findings":[{"description":"Acceptance-policy conflict, not an implementation defect against the token brief. The supplied protected test requires the recipient to receive the entire gross transfer amount. The task requires 5% of every transfer to go to 0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5. LaunchToken honors the task by deducting the fee from the gross amount. The unchanged protected checks produce seven passes and this one failure, with no skips. Neither the implementation nor protected checks can be changed within this testing assignment. The network must reconcile the protected transfer expectation and any launch integration that depends on fee-free receipt with the requested fee. Do not remove the mandated fee or add a privileged fee exemption merely to make the floor pass. The proof reproduces the incompatible protected assertion; it does not propose fee-free transfers as correct task behavior.","line":141,"path":".imd/reads/protected/evm_project/Token.protected.t.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @dev Reproduces the supplied launch check, not the task's required fee semantics.\ncontract LaunchPolicyConflictProof is Test {\n    function testProtectedTransferRequirementConflictsWithRequiredFee() public {\n        LaunchToken token = new LaunchToken();\n        uint256 supply = token.totalSupply();\n        uint256 gross = supply / 1_000;\n        address recipient = address(0xCAFE);\n\n        assertEq(supply, 100_000_000_000_000);\n        assertTrue(token.transfer(recipient, gross));\n        assertEq(token.balanceOf(address(this)), supply - gross);\n        assertEq(token.totalSupply(), supply);\n        // Token.protected.t.sol:141 requires the full gross amount at the recipient.\n        assertEq(token.balanceOf(recipient), gross, \"recipient received a different amount\");\n    }\n}","reproduction":"Deploy LaunchToken with no constructor arguments. Its deployer holds 100000000000000 minor units. Call transfer(address(0xCAFE), 100000000000) from the deployer. The protected check expects balanceOf(address(0xCAFE)) == 100000000000. Actual: recipient gets 95000000000, the fee recipient gets 5000000000, the deployer retains 99900000000000, and totalSupply remains 100000000000000. The task-required result is that observed 95%/5% split. Save the proof as test/scratch/LaunchPolicyConflictProof.t.sol and run forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path test/scratch/LaunchPolicyConflictProof.t.sol -vvv. Verified exit code 1 with: recipient received a different amount: 95000000000 != 100000000000. The proof is also retained as test/proofs/LaunchPolicyConflictProof.sol.txt.","severity":"medium","title":"Protected fee-free transfer check conflicts with the required 5% transfer fee"}],"hash":"775a9ca64a411b2fdd1f24476ca599371cc7cc4ff535ff0e3889eb1f22c06b59","nodeId":"db4b9bf6-f0a9-4991-af1f-7aaf19ea1eb0","outcome":"completed","summary":"Preserved the accepted tests and added a reproducible conflict proof.\n\nOffline `forge build` and `forge test` pass: 40 tests, including 32,768 invariant calls.\n\nReported one unresolved conflict in `.imd-findings.json`: the protected check requires fee-free receipt, contradicting the required 5% fee. Protected results: 7 passed, 1 failed.","treeHash":"96c0fa7a76f0d9ad25f7447643e4f0b853c109a4","usage":{"cachedInputTokens":886912,"inputTokens":72557,"model":"gpt-6-astra","outputTokens":6697,"runtime":"codex","turns":5,"wallClockMs":275837}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bb0a3bf63233e5e5","findings":[],"hash":"799343ebe19c358240e37df1226adfb7b782898a9be2773aaee4747dc16a6192","nodeId":"5e71ea7d-4efe-4e51-8eb3-5605679b5e73","outcome":"no_change","summary":"Recorded both findings as `disputed` in [.imd-responses.json](/home/imd-worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/5e71ea7d-4efe-4e51-8eb3-5605679b5e73/.imd-responses.json). Both proofs reproduce fee-free expectations that contradict the required 5% fee. Existing implementation and tests remain unchanged.\n\nValidation: `forge build`, all 34 project tests, and `forge fmt --check` pass. Protected checks remain 7 passed, 1 failed; upstream policy reconciliation is still required.","treeHash":null,"usage":{"cachedInputTokens":389760,"inputTokens":52902,"model":"gpt-6-astra","outputTokens":4251,"runtime":"codex","turns":3,"wallClockMs":163185}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bb0a3bf63233e5e5","findings":[],"hash":"852d2b16079c3c3f1e922e7cfc21e27e4b4873fcc8734d9972f61e3f5beed0f9","nodeId":"7f45e8b3-9573-47d4-8b9c-7931725c49ca","outcome":"failed","summary":"the task produced no changes; the agent's last message was: [launch.json](/home/imd-worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/7f45e8b3-9573-47d4-8b9c-7931725c49ca/launch.json) already matches the accepted implementation and validates against the supplied schema. No changes were needed.\n\n- `forge build`: passed.\n- `forge test`: 40 passed.\n- Protected checks: 7 passed, 1 failed because fee-free receipt conflicts with the required 5% transfer fee.\n\nThe manifest already documents this conflict; manifest edits cannot resolve it.","treeHash":null,"usage":{"cachedInputTokens":197632,"inputTokens":32413,"model":"gpt-6-astra","outputTokens":4189,"runtime":"codex","turns":3,"wallClockMs":151994}},{"artifacts":[],"attempt":1,"bundleHash":"6d6b400cb1af6e40813e51b3ed47440d02d958b6dfb1153c962a6f43f4091b31","device":"0256823ae36e7900","findings":[{"description":"Task/check incompatibility, not an implementation violation of the explicit token brief. The task requires 5% of every transfer to reach 0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5. LaunchToken implements this by crediting the fee and then the net amount. However, the supplied TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked requires the recipient to receive the entire gross amount while the sender loses only that gross amount and total supply stays unchanged. Those requirements cannot all hold with the specified fee. Running both supplied protected files unchanged produced 7 passes and this one failure. No pool or distributor integration was available or tested. Reconcile the protected launch policy with the explicit fee requirement upstream; removing the fee or exempting the protected caller would violate the task. The attached proof reproduces the conflicting protected expectation and is deliberately excluded from the delivered passing tests.","line":40,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Reproduces the protected launch check, whose fee-free expectation\n/// conflicts with the assignment's explicit 5% transfer fee.\ncontract ProtectedTransferConflictTest is Test {\n    function testProtectedTransferRequiresFullGrossReceipt() public {\n        LaunchToken token = new LaunchToken();\n        address recipient = address(0xCAFE);\n        uint256 supply = token.totalSupply();\n        uint256 gross = supply / 1_000;\n\n        assertEq(gross, 100_000_000_000);\n        assertTrue(token.transfer(recipient, gross));\n        assertEq(token.balanceOf(address(this)), supply - gross);\n        assertEq(token.totalSupply(), supply);\n        // This is the supplied protected assertion, not the token brief's rule.\n        assertEq(token.balanceOf(recipient), gross, \"recipient received a different amount\");\n    }\n}","reproduction":"Deploy LaunchToken with no arguments and call transfer(address(0xCAFE), 100000000000) from the deployer (totalSupply / 1000). Protected expected: recipient balance 100000000000. Actual: recipient balance 95000000000, fee-recipient balance 5000000000, deployer balance 99900000000000, total supply 100000000000000. Save the proof below as test/scratch/ProtectedTransferConflict.t.sol and run: forge test --offline --out test/scratch/proof-out --cache-path test/scratch/proof-cache --match-path test/scratch/ProtectedTransferConflict.t.sol -vv. Executed locally: 0 passed, 1 failed with \"recipient received a different amount: 95000000000 != 100000000000\". The unchanged protected files reproduce the same failure using the compiled token creation code, decimals 7, expected supply 100000000000000, and zero application contracts.","severity":"medium","title":"Protected launch transfer check conflicts with the required 5% fee"}],"hash":"90a6a6a432c710e41ad33bbb2d67780d2f0a6e97fa171b02ed3b9420f4c602cf","nodeId":"db4b9bf6-f0a9-4991-af1f-7aaf19ea1eb0","outcome":"completed","summary":"Preserved the accepted tests and updated validation notes.\n\n- Offline `forge build` passes.\n- `forge test`: 40 passed, including 32,768 invariant handler calls.\n- Protected checks: 7 passed, 1 failed because fee-free receipt conflicts with the required 5% fee.\n\nRestored `.imd-findings.json` with a reproduced, self-contained failing proof of that conflict.","treeHash":"3fcf8b909f83f60a688b1fe288f26ab50a8b94c5","usage":{"cachedInputTokens":587520,"inputTokens":50734,"model":"gpt-6-astra","outputTokens":5555,"runtime":"codex","turns":5,"wallClockMs":262228}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bb0a3bf63233e5e5","findings":[{"citation":"resolved","description":"The shared transfer path credits only amount minus the 5% fee to an ordinary recipient. This implements the requested token behavior, but the supplied launch boundary requires full gross receipt: TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked asserts recipient balance equals the requested amount. The current implementation therefore cannot pass that protected admission check. The conflict is already documented in launch.json/VALIDATION.md but remains reproducible and unresolved. This is an integration/acceptance blocker, not an authorization exploit or evidence that the requested fee was implemented incorrectly. Resolve the service/protected-check contract for a fee-bearing launch and verify factory, pool and distributor accounting against net receipts while preserving the approved fee; removing the fee or adding exemptions would change the brief. Production service contracts are absent, so no downstream loss or pool exploit is claimed.","line":36,"path":"src/LaunchToken.sol","reproduction":"Deploy a fresh LaunchToken from D with no constructor arguments and zero ETH. D holds 100000000000000 minor units; recipient R = address(0xCAFE) and FEE_RECIPIENT initially hold zero. As D, call transfer(R, 100000000000), the exact totalSupply()/1000 input in the supplied protected test. Actual: returns true, R receives 95000000000, 0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5 receives 5000000000, D retains 99900000000000, totalSupply remains 100000000000000. Protected-check expectation: R receives 100000000000. Observed Foundry failure: recipient received a different amount: 95000000000 != 100000000000. The protected suites were executed offline against the compiled LaunchToken creation code with IMD_TOKEN_DECIMALS=7, IMD_EXPECTED_SUPPLY=100000000000000 and IMD_PROJECT_COUNT=0: 7 passed, 1 failed, 0 skipped. The delegated path has the same boundary mismatch: on fresh state D approves spender S = address(0xB0B) for 100000000000; S calls transferFrom(D,R,100000000000), consuming the gross allowance while crediting R only 95000000000.","severity":"medium","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);\n        if (fee != 0) {\n            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"Required transfer fee conflicts with the protected launch admission check"}],"hash":"9256097e4ba6c079725e2db51ed7d4b0095b08427fee2cea3911e2c8c8ed7917","nodeId":"cf96f6d4-9f76-4ef8-ba44-88336b3efdaa","outcome":"completed","summary":"Recorded findings and coverage in `.imd-findings.json`.\n\nOne medium finding: the required 5% transfer fee conflicts with the protected admission check’s full-receipt requirement.\n\nAll three entry points reviewed. Project tests passed; protected checks: 7 passed, 1 failed. No source or configuration files changed.","treeHash":null,"usage":{"cachedInputTokens":749056,"inputTokens":86586,"model":"gpt-6-astra","outputTokens":6100,"runtime":"codex","turns":5,"wallClockMs":234602}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"35c52a5b502e847c","findings":[],"hash":"9ee511fad38a687024c27ee80e9d8d6e3ab030dfb8434faaae1a4bc2c761aa7a","nodeId":"5e71ea7d-4efe-4e51-8eb3-5605679b5e73","outcome":"no_change","summary":"Recorded both findings as `disputed` in [.imd-responses.json](/home/identitymd5/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/5e71ea7d-4efe-4e51-8eb3-5605679b5e73/.imd-responses.json). Both proofs reproduce, but their gross-receipt assertions contradict the mandatory 5% fee. Token code remains unchanged.\n\nValidation passed: `forge build`, all 34 project tests, and `forge fmt --check`.\n\nProtected checks still report 7 passes and 1 failure. The external launch-policy conflict remains unresolved.","treeHash":null,"usage":{"cachedInputTokens":419072,"inputTokens":63187,"model":"gpt-6-astra","outputTokens":4270,"runtime":"codex","turns":3,"wallClockMs":124436}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ca080fd306399669","findings":[{"citation":"resolved","description":"Status after this revision round: not fixed, and not disputed by the author. src/LaunchToken.sol is byte-identical to the tree I reviewed last round (the last commit touching it is 89aeb74; the two commits since, feabd61 and 9a45725, changed only launch.json notes, test/README.md and a retained copy of the conflict proof under test/proofs/). LaunchToken._update still has two branches: mint (from == address(0)) moves the full amount; every other transfer moves amount/20 to the hard-coded FEE_RECIPIENT 0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5 and amount - amount/20 to the recipient, with no exemption for the ProjectFactory, the Uniswap v4 PoolManager or the MerkleDistributor. Re-run this round against the freshly compiled creation bytecode: the network admission floor .imd/reads/protected/evm_project/Token.protected.t.sol passes 5 of 6 and fails test_transferMovesExactlyWhatItWasAsked with `recipient received a different amount: 95000000000 != 100000000000`; my attached proof fails both of its tests with the same numbers as last round. The author's answer (VALIDATION.md, test/README.md, launch.json notes) agrees the check fails and states that the brief (5% of every transfer, no exemptions) and the launch policy (exact-amount transfers) cannot both hold and that no manifest field changes transfer behaviour. I agree with that characterisation: this is a brief-versus-policy conflict, not an implementation slip, and it cannot be resolved inside this repository without departing from the literal brief. It nevertheless remains blocking for this launch as specified: the factory's LP seed, the distributor funding and every claim payout deliver 95% of what the sender computed; the sum of Merkle leaves can never be paid (the last ~5% of claimants revert ERC20InsufficientBalance); a v4 router that settles the exact delta it computed reverts CurrencyNotSettled; and 5% of every leg of the launch is paid to the fee wallet rather than to the intended party. Needed to close it, and the reason it stays open: a scope decision by the requester or network, either (a) the network admits a fee-on-transfer token and makes the factory, distributor and pool routing fee-aware, or (b) the brief is amended so transfers originating from launch infrastructure are fee-exempt and the code changed accordingly. Until one of those happens the token as shipped cannot pass admission. Severity unchanged from last round.","line":38,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Mirrors TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked from the launch floor\n/// (.imd/reads/protected/evm_project/Token.protected.t.sol) without environment variables: the token\n/// is deployed directly, standing in for the ProjectFactory, and one distribution transfer is made.\n/// The floor requires the recipient to receive exactly the requested amount; LaunchToken._update\n/// routes 5% of it to FEE_RECIPIENT, so the factory's LP seed and MerkleDistributor funding are short.\ncontract LaunchFloorTransferTest is Test {\n    LaunchToken private token;\n    uint256 private supplyAtDeployment;\n\n    function setUp() public {\n        token = new LaunchToken();\n        supplyAtDeployment = token.totalSupply();\n    }\n\n    function test_transferMovesExactlyWhatItWasAsked() public {\n        address recipient = address(0xCAFE);\n        uint256 amount = supplyAtDeployment / 1_000;\n        assertGt(amount, 0);\n\n        uint256 before = token.balanceOf(address(this));\n        assertTrue(token.transfer(recipient, amount), \"transfer returned false\");\n\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n        assertEq(token.balanceOf(address(this)), before - amount, \"sender lost a different amount\");\n        assertEq(token.totalSupply(), supplyAtDeployment, \"a transfer changed the supply\");\n    }\n\n    /// @dev The distribution shortfall in one number: after the deployer hands its whole balance to a\n    /// distributor, the distributor cannot pay out the amount it was funded with.\n    function test_distributorFundedWithGrossCannotPayGross() public {\n        address distributor = address(0xD157);\n        address claimant = address(0xC1A1);\n        uint256 allocation = 1_000_000 * 10 ** 7;\n\n        token.transfer(distributor, allocation);\n        assertEq(token.balanceOf(distributor), allocation, \"distributor holds less than its allocation\");\n\n        vm.prank(distributor);\n        token.transfer(claimant, allocation);\n        assertEq(token.balanceOf(claimant), allocation, \"claimant paid less than the allocation\");\n    }\n}","reproduction":"State: fresh LaunchToken deployed by D (D holds 100000000000000 minor units). Call: D.transfer(0xCAFE, 100000000000). Expected by the launch floor: balanceOf(0xCAFE) == 100000000000. Actual (re-run this round on HEAD 9a45725): balanceOf(0xCAFE) == 95000000000, balanceOf(0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5) == 5000000000. Second sequence: D.transfer(distributor, 10000000000000) then distributor.transfer(claimant, 10000000000000): expected the distributor to hold and pay 10000000000000; actual it holds 9500000000000 and the payout reverts ERC20InsufficientBalance(distributor, 9500000000000, 10000000000000). Commands run this round: `cp .imd/reads/protected/evm_project/Token.protected.t.sol test/scratch/ && IMD_TOKEN_CREATION_CODE=$(forge inspect src/LaunchToken.sol:LaunchToken bytecode) IMD_TOKEN_DECIMALS=7 forge test --offline --match-path test/scratch/Token.protected.t.sol` -> 5 passed, 1 failed (test_transferMovesExactlyWhatItWasAsked: `recipient received a different amount: 95000000000 != 100000000000`); `cp .imd/reads/proofs/Proof_fb4de70061ba.t.sol test/scratch/ && forge test --offline --match-path test/scratch/Proof_fb4de70061ba.t.sol` -> 0 passed, 2 failed (`recipient received a different amount: 95000000000 != 100000000000`, `distributor holds less than its allocation: 9500000000000 != 10000000000000`).","severity":"high","snippet":"            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"NOT FIXED (unchanged source): 5% fee on every transfer still fails the launch floor and shorts every factory distribution leg"},{"citation":"resolved","description":"Status after this revision round: unchanged and still conditional on evidence outside this repository; the author's revision added no such evidence and cannot from here. The constructor mints exactly 10,000,000 DRIM at 7 decimals (100000000000000 minor units) to msg.sender, which is correct against the brief, and I do not ask for a contract change. The project floor .imd/reads/protected/evm_project/Project.protected.t.sol requires token.totalSupply() == IMD_EXPECTED_SUPPLY, a value launch/deploy.ts copies from the validated launch_policies row selected by launch.policyVersion; launch.json has no field through which this launch can set it, and the evm-project-launch reference describes the policy template as 1,000,000,000 tokens at 18 decimals (10^27). Re-run this round under both candidate values: with IMD_EXPECTED_SUPPLY=100000000000000 the floor passes 2/2; with IMD_EXPECTED_SUPPLY=1000000000000000000000000000 it fails in setUp with `policy supply mismatch` before any test runs. Needed evidence to close or drop it: the supply field of the launch_policies row for this launch. If it is 10^14 this finding is moot; if it is 10^27 the fix is a policy row matching the brief, not a change to INITIAL_SUPPLY, which would violate the brief. The aderyn large-numeric-literal lead at this line is this same constant and is not a defect on its own.","line":9,"path":"src/LaunchToken.sol","reproduction":"Copy .imd/reads/protected/evm_project/Project.protected.t.sol into test/scratch/. With CODE=$(forge inspect src/LaunchToken.sol:LaunchToken bytecode), FACTORY=0x00000000000000000000000000000000000000F1, TOKEN=$(cast create2 --deployer $FACTORY --salt 0x0000000000000000000000000000000000000000000000000000000000000001 --init-code-hash $(cast keccak $CODE) | grep -oE '0x[0-9a-fA-F]{40}' | head -1) (this round: 0xcbd12fd3d7D31577BEc68dcB2Ef243DfEE4936E0) and IMD_TOKEN_CREATION_CODE=$CODE IMD_PROJECT_FACTORY=$FACTORY IMD_EXPECTED_TOKEN=$TOKEN IMD_PROJECT_CHAIN_ID=11155111 IMD_PROJECT_COUNT=0: `IMD_EXPECTED_SUPPLY=100000000000000 forge test --offline --match-path test/scratch/Project.protected.t.sol` passes 2/2; `IMD_EXPECTED_SUPPLY=1000000000000000000000000000 forge test --offline --match-path test/scratch/Project.protected.t.sol` fails in setUp with `policy supply mismatch` (token.totalSupply() is 100000000000000). Expected: the policy supply equals the brief's 10^14 so the floor passes; actual: unknown until the policy row is read.","severity":"medium","snippet":"    uint256 public constant INITIAL_SUPPLY = 10_000_000 * 10 ** 7;","title":"UNCHANGED (conditional): fixed supply of 10^14 minor units fails the project floor if the launch policy pins the reference supply of 10^27"}],"hash":"a2e58237e3fb4b1991cbfc4e651a1a6851e97c27c6eb18c1387596738ad196fd","nodeId":"1a818daf-16f2-4a1f-9cb0-342822a06475","outcome":"completed","summary":"The findings file is written and verified, and the scratch directory is removed. The working tree holds only the new `.imd-findings.json`.\n\n**Outcome: neither prior finding is fixed, and both still reproduce on the revised tree.**\n\nThe token source is byte-identical to the last round. The two commits since then changed only the manifest notes, the test README, and a retained copy of the conflict proof. The author does not dispute either finding.\n\n- **High, still open.** The 5% fee on every transfer still fails the network's admission floor. The protected token test passes 5 of 6 and fails the exact-amount transfer check, and my attached proof fails both of its tests with the same numbers as before. The author's validation record agrees this reproduces and calls it a brief-versus-policy conflict. I agree with that reading. It still blocks the launch as specified, because every factory leg, the LP seed, distributor funding and Merkle payouts, delivers 95% of what was sent and the last claimants revert. Closing it needs a scope decision outside this repository: either the network makes its infrastructure fee-aware, or the brief is amended to exempt launch infrastructure from the fee.\n- **Medium, still conditional.** The fixed supply of 10,000,000 DRIM at 7 decimals is correct against the brief. The project floor passes under that supply and fails in setUp under the reference policy supply of 10^27. The needed evidence is the supply field of the launch policy row, which cannot be read from here. No contract change is asked for.\n\nNo new defects. The three entry points are covered: approve holds, and transfer and transferFrom both carry finding 1 through the shared fee branch. The project's own suite passes all 40 tests.","treeHash":null,"usage":{"cachedInputTokens":484876,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":13701,"runtime":"claude","turns":11,"wallClockMs":252447}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"468e82a89b9bfe18","findings":[{"citation":"resolved","description":"Area: Trust Gap (economics x asymmetry) and Asymmetry (branch diff). LaunchToken._update has two branches: the mint branch (from == address(0)) moves the full amount, every other branch moves amount - amount/20 to the recipient and amount/20 to the hard-coded FEE_RECIPIENT. There is no exemption for the ProjectFactory, the Uniswap v4 PoolManager or the MerkleDistributor, so every leg of the launch that the factory performs after the constructor (LP seed, distributor funding, each claim payout) delivers 95% of what the sender computed. The network's own admission floor, .imd/reads/protected/evm_project/Token.protected.t.sol test_transferMovesExactlyWhatItWasAsked, asserts the recipient receives exactly the requested amount and fails against the compiled bytecode (I re-ran it: 5 of 6 pass, this one fails with `recipient received a different amount: 95000000000 != 100000000000`). Consequence beyond the floor: a distributor funded with allocation A holds 0.95A and pays 0.95 of each claim, so the sum of Merkle leaves can never be paid and the last ~5% of claimants revert with ERC20InsufficientBalance; a v4 router that settles the swap input it computed reverts with CurrencyNotSettled because the PoolManager receives 5% less than the delta it expects. This is a conflict between the brief (5% of every transfer, no exemptions) and the launch policy (exact-amount transfers), not an implementation slip: the author already records it in launch.json notes and VALIDATION.md. Resolving it needs a scope decision by the requester/network: either (a) the network admits a fee-on-transfer token and the factory, distributor and pool routing are fee-aware, or (b) the brief is amended so transfers originating from launch infrastructure (factory, PoolManager, MerkleDistributor) are exempt from the fee. Option (b) contradicts the literal brief; option (a) is not something the author can implement in this repository. Until one is chosen the token as shipped cannot pass admission.","line":38,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Mirrors TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked from the launch floor\n/// (.imd/reads/protected/evm_project/Token.protected.t.sol) without environment variables: the token\n/// is deployed directly, standing in for the ProjectFactory, and one distribution transfer is made.\n/// The floor requires the recipient to receive exactly the requested amount; LaunchToken._update\n/// routes 5% of it to FEE_RECIPIENT, so the factory's LP seed and MerkleDistributor funding are short.\ncontract LaunchFloorTransferTest is Test {\n    LaunchToken private token;\n    uint256 private supplyAtDeployment;\n\n    function setUp() public {\n        token = new LaunchToken();\n        supplyAtDeployment = token.totalSupply();\n    }\n\n    function test_transferMovesExactlyWhatItWasAsked() public {\n        address recipient = address(0xCAFE);\n        uint256 amount = supplyAtDeployment / 1_000;\n        assertGt(amount, 0);\n\n        uint256 before = token.balanceOf(address(this));\n        assertTrue(token.transfer(recipient, amount), \"transfer returned false\");\n\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n        assertEq(token.balanceOf(address(this)), before - amount, \"sender lost a different amount\");\n        assertEq(token.totalSupply(), supplyAtDeployment, \"a transfer changed the supply\");\n    }\n\n    /// @dev The distribution shortfall in one number: after the deployer hands its whole balance to a\n    /// distributor, the distributor cannot pay out the amount it was funded with.\n    function test_distributorFundedWithGrossCannotPayGross() public {\n        address distributor = address(0xD157);\n        address claimant = address(0xC1A1);\n        uint256 allocation = 1_000_000 * 10 ** 7;\n\n        token.transfer(distributor, allocation);\n        assertEq(token.balanceOf(distributor), allocation, \"distributor holds less than its allocation\");\n\n        vm.prank(distributor);\n        token.transfer(claimant, allocation);\n        assertEq(token.balanceOf(claimant), allocation, \"claimant paid less than the allocation\");\n    }\n}","reproduction":"State: fresh LaunchToken deployed by D (D holds 100000000000000). Call: D.transfer(0xCAFE, 100000000000 /* supply/1000, the floor's amount */). Expected by the launch floor: balanceOf(0xCAFE) == 100000000000. Actual: balanceOf(0xCAFE) == 95000000000, balanceOf(0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5) == 5000000000. Second sequence: D.transfer(distributor, 10000000000000) then distributor.transfer(claimant, 10000000000000): expected the distributor to hold and pay 10000000000000, actual it holds 9500000000000 and the payout reverts ERC20InsufficientBalance(distributor, 9500000000000, 10000000000000). Commands: copy .imd/reads/protected/evm_project/Token.protected.t.sol into test/scratch/ and run `IMD_TOKEN_CREATION_CODE=$(jq -r .bytecode.object out/LaunchToken.sol/LaunchToken.json) IMD_TOKEN_DECIMALS=7 forge test --offline --match-path test/scratch/Token.protected.t.sol`; or run the attached proof with `forge test --offline --match-path test/scratch/LaunchFloorTransfer.t.sol` (both tests fail on this tree).","severity":"high","snippet":"            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"5% fee on every transfer makes the token fail the launch floor and short every factory distribution leg"},{"citation":"resolved","description":"Area: Trust Gap (access x economics at deployment). The brief fixes supply at 10,000,000 DRIM with 7 decimals (10^14 minor units) and the constructor mints exactly that to msg.sender, which is correct against the brief. The admission floor .imd/reads/protected/evm_project/Project.protected.t.sol does not read the supply from the token or the manifest: its setUp requires token.totalSupply() == IMD_EXPECTED_SUPPLY, a value launch/deploy.ts copies from the validated launch_policies row, and launch.json has no supply or decimals-of-supply field through which this launch could override it. The evm-project-launch reference states the policy template is exactly 1,000,000,000 tokens at 18 decimals (10^27 minor units). I could not read the policy row, so this is conditional: if the policy for this launch carries 10^27, the whole project floor fails in setUp with `policy supply mismatch` before any test runs; if the policy was created with 10^14 for this launch it passes. Needed evidence: the supply field of the launch_policies row selected by launch.policyVersion for this launch. If it is 10^27, the fix is a policy row matching the brief (10^14), not a contract change; changing INITIAL_SUPPLY to 10^27 would violate the brief.","line":9,"path":"src/LaunchToken.sol","reproduction":"Copy .imd/reads/protected/evm_project/{Token,Project}.protected.t.sol into test/scratch/. With CODE=$(jq -r .bytecode.object out/LaunchToken.sol/LaunchToken.json), FACTORY=0x00000000000000000000000000000000000000F1, TOKEN=$(cast create2 --deployer $FACTORY --salt 0x00..01 --init-code-hash $(cast keccak $CODE)) and IMD_TOKEN_CREATION_CODE=$CODE IMD_PROJECT_FACTORY=$FACTORY IMD_EXPECTED_TOKEN=$TOKEN IMD_PROJECT_CHAIN_ID=11155111 IMD_PROJECT_COUNT=0: `IMD_EXPECTED_SUPPLY=100000000000000 forge test --offline --match-path test/scratch/Project.protected.t.sol` passes 2/2; `IMD_EXPECTED_SUPPLY=1000000000000000000000000000 forge test --offline --match-path test/scratch/Project.protected.t.sol` fails in setUp with `policy supply mismatch` (token.totalSupply() is 100000000000000). Expected: the policy supply equals the brief's 10^14 so the floor passes; actual: unknown until the policy row is read.","severity":"medium","snippet":"    uint256 public constant INITIAL_SUPPLY = 10_000_000 * 10 ** 7;","title":"Fixed supply of 10^14 minor units fails the project floor if the launch policy pins the reference supply of 10^27"}],"hash":"b87ee90f640959ae16b3421edc3421be897c9c2252537cc20dbc249674fcbb00","nodeId":"1a818daf-16f2-4a1f-9cb0-342822a06475","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds two findings and ten coverage rows. Nothing outside that file and `test/scratch/` was touched.\n\n**Findings**\n\n- **High. Fee-on-transfer conflicts with the launch floor.** Every non-mint path in `_update` delivers 95% and routes 5% to the fixed recipient, with no exemption for the factory, PoolManager or MerkleDistributor. The network's own protected test fails against the compiled bytecode with `95000000000 != 100000000000`. A distributor funded with an allocation holds 95% of it and cannot pay out the leaves. The author already documents this in the manifest notes and VALIDATION.md. It is a brief-versus-policy conflict, so the fix is a scope decision: admit fee tokens with fee-aware infrastructure, or amend the brief to exempt launch infrastructure. A scratch proof at `test/scratch/LaunchFloorTransfer.t.sol` fails on this tree and is embedded in the finding.\n- **Medium, conditional. Supply may not match the policy row.** The project floor compares total supply with a value copied from the launch policy, and the reference policy template is 10^27 minor units. This token mints 10^14 per the brief. With a policy supply of 10^14 the floor passes 2 of 2. With 10^27 it fails in setUp with `policy supply mismatch`. I could not read the policy row, so the finding names the evidence needed rather than asserting the failure.\n\n**Access control, trust gap and asymmetry coverage**\n\nAll three entry points were traced. The token has no owner, minter, pauser, fee setter, upgrade or blocklist path, and all common admin selectors revert for deployer and holders. The fee-free mint branch is reachable only from the constructor. The transfer and transferFrom paths are symmetric, the gross allowance is spent before the fee split, and the gross balance pre-check stops the fee recipient from sending more than it holds. Routing through the fee recipient gives no fee bypass because entering its balance already costs 5%. The recipient constant matches the brief and resolves on chain to an active wallet with an EIP-7702 delegation on mainnet and no code on Sepolia. The vendored OpenZeppelin files differ from the local 5.5.0 mirror only by version text, consistent with the pinned 5.0.2. The project's 40 tests pass, and the aderyn large-literal lead is the correct 10^14 supply, not a defect.","treeHash":null,"usage":{"cachedInputTokens":975893,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":22544,"runtime":"claude","turns":27,"wallClockMs":397125}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"02ae6543274731ab","findings":[{"citation":"resolved","description":"Both transfer entry points correctly implement the brief's 5% fee, but the supplied TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked requires the ordinary recipient to receive the full gross amount. The implementation cannot satisfy that protected acceptance requirement. This is one unresolved launch compatibility issue, merging the economics, flow, math and permissions reports, rather than an incorrect fee calculation. Production factory, pool and distributor implementations are absent, so actual downstream fund loss or pool settlement failure is not established and does not justify high severity. Preserve the approved fee and reconcile the service's protected receipt requirement and launch accounting with fee-bearing transfers, then verify the actual integrations; removing the fee or adding exemptions would change the brief.","line":40,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Reproduces the supplied protected gross-receipt requirement.\n/// This requirement conflicts with the approved 5% transfer fee. These assertions\n/// demonstrate that conflict; they do not authorize removing the required fee.\ncontract LaunchReceiptConflictTest is Test {\n    function test_protectedGrossReceiptRequirement() public {\n        LaunchToken token = new LaunchToken();\n        uint256 supply = token.totalSupply();\n        uint256 amount = supply / 1_000;\n        address recipient = address(0xCAFE);\n\n        assertEq(supply, 100_000_000_000_000);\n        assertTrue(token.transfer(recipient, amount));\n        assertEq(token.balanceOf(address(this)), supply - amount);\n        assertEq(token.totalSupply(), supply);\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n    }\n\n    function test_delegatedTransferHasTheSameReceiptConflict() public {\n        LaunchToken token = new LaunchToken();\n        uint256 supply = token.totalSupply();\n        uint256 amount = supply / 1_000;\n        address recipient = address(0xCAFE);\n        address spender = address(0xB0B);\n\n        assertEq(supply, 100_000_000_000_000);\n        assertTrue(token.approve(spender, amount));\n        vm.prank(spender);\n        assertTrue(token.transferFrom(address(this), recipient, amount));\n        assertEq(token.allowance(address(this), spender), 0);\n        assertEq(token.balanceOf(address(this)), supply - amount);\n        assertEq(token.totalSupply(), supply);\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n    }\n}","reproduction":"Deploy a fresh LaunchToken with no constructor arguments or ETH from D, giving D 100000000000000 minor units. With recipient R = address(0xCAFE) and the fee address initially empty, D calls transfer(R, 100000000000), exactly totalSupply()/1000 as in the protected check. Source trace: _transfer validates nonzero addresses; _update checks D's gross balance, computes fee = 5000000000, credits that to 0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5, then credits R 95000000000. The call returns true, D retains 99900000000000, and totalSupply remains 100000000000000. The protected assertion expects R to hold 100000000000 and therefore fails. On a fresh deployment, approve(address(0xB0B), 100000000000) followed by that spender's transferFrom(D, R, 100000000000) produces the same balances and reduces the gross allowance to zero. Executed both original specialist proof files unchanged with forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path 'test/scratch/Proof_*.t.sol' -vvv: all four gross-receipt assertions failed at the stated net balances; these tests use stand-in addresses, not production integrations. Executed both supplied protected suites unchanged against the compiled creation bytecode with IMD_TOKEN_DECIMALS=7, IMD_EXPECTED_SUPPLY=100000000000000, IMD_PROJECT_COUNT=0 and a locally predicted CREATE2 deployment: 7 passed, 1 failed, 0 skipped. The sole failure was recipient received a different amount: 95000000000 != 100000000000. The embedded proof isolates this same root cause for direct and delegated transfers. Save it as test/scratch/LaunchReceiptConflict.t.sol and run forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path test/scratch/LaunchReceiptConflict.t.sol -vvv; both tests were run and failed with that exact assertion, after successful sender-balance, supply and delegated-allowance assertions. The proof expresses the current incompatible service requirement; it does not authorize changing the approved fee.","severity":"medium","snippet":"        super._update(from, to, amount - fee);","title":"Required transfer fee conflicts with the protected launch receipt check"}],"hash":"c6f149a6a02804309d15f2a031cc323eb0277cc946b65700685faaa6ff9be4df","nodeId":"2d0d7232-b17b-4cf4-8267-75cbc21e8d1c","outcome":"completed","summary":"Wrote [.imd-findings.json](/home/imd-worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/2d0d7232-b17b-4cf4-8267-75cbc21e8d1c/.imd-findings.json) with one merged medium finding: the required 5% fee conflicts with the protected full-receipt check.\n\nCoverage: 3/3 entry points. Existing tests: 40 passed. Protected checks: 7 passed, 1 reproduced failure.\n\nProduction files unchanged; temporary tests removed.","treeHash":null,"usage":{"cachedInputTokens":1625856,"inputTokens":111193,"model":"gpt-6-astra","outputTokens":11057,"runtime":"codex","turns":6,"wallClockMs":402542}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bb0a3bf63233e5e5","findings":[{"citation":"resolved","description":"Unresolved on re-review of finding 14d426fd69ef246136d67814f8a2afcd16ab97371fe7337cd313594f0150b844. The author correctly documents the incompatibility in VALIDATION.md, launch.json and test/README.md; independently rerunning the supplied protected suites confirms it still occurs. Both transfer entry points correctly implement the approved 5% deduction, but TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked requires the ordinary recipient to receive the entire gross amount. Documentation and the additional passing tests do not reconcile that executable admission requirement. This remains an acceptance/integration blocker, not an authorization exploit or a defect in the requested fee calculation. Resolve the upstream service/protected-check contract for a fee-bearing launch and demonstrate that factory, pool and distributor accounting supports actual net receipts while preserving the approved fee. Removing the fee or adding exemptions would change the brief. Production service implementations are absent, so no downstream loss or pool exploit is asserted.","line":36,"path":"src/LaunchToken.sol","reproduction":"Deploy fresh src/LaunchToken.sol:LaunchToken from D with no constructor arguments and zero ETH. D initially holds 100000000000000 minor units; R=address(0xCAFE) and F=0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5 hold zero. As D call transfer(R,100000000000), exactly totalSupply()/1000 from the supplied protected test. The call returns true, emits fee=5000000000 to F and net=95000000000 to R, leaves D with 99900000000000 and leaves totalSupply at 100000000000000. The protected assertion instead expects R.balanceOf=100000000000 and fails: 'recipient received a different amount: 95000000000 != 100000000000'. Re-executed both original protected files directly with FOUNDRY_TEST pointing to .imd/reads/protected/evm_project and forge test --offline -vvv, using the current compiled creation bytecode as IMD_TOKEN_CREATION_CODE, IMD_TOKEN_DECIMALS=7, IMD_EXPECTED_SUPPLY=100000000000000, IMD_PROJECT_COUNT=0, IMD_PROJECT_FACTORY=0x0000000000000000000000000000000000fac700, IMD_PROJECT_CHAIN_ID=11155111 and IMD_EXPECTED_TOKEN=0x2a4590bdfaed444049ef3c8e69fa8f174599e174 (CREATE2 salt 1). Results: 7 passed, 1 failed, 0 skipped. The failure and fee/net events match the author's reproduction. On fresh state the inherited transferFrom path also reaches this same update: D approves S=address(0xB0B) for 100000000000; S calls transferFrom(D,R,100000000000), consuming that gross allowance and delivering the same fee and net amounts. The regular project suite passes all 40 reported tests, including its grouped invariant campaign of 32768 handler calls; those tests validate the requested fee behavior rather than the incompatible admission requirement.","severity":"medium","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);\n        if (fee != 0) {\n            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"Required transfer fee still conflicts with the protected launch admission check"}],"hash":"cbc81ff59c34b17a8e72178d7f2b3c8b2d15c1bda15b0fc26468a1b12ccdb7e1","nodeId":"cf96f6d4-9f76-4ef8-ba44-88336b3efdaa","outcome":"completed","summary":"Wrote [`.imd-findings.json`](/home/imd-worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/cf96f6d4-9f76-4ef8-ba44-88336b3efdaa/.imd-findings.json).\n\nThe prior medium finding remains reproducible: the required 5% fee conflicts with the protected full-receipt assertion.\n\n- Project tests: 40 passed.\n- Protected checks: 7 passed, 1 failed.\n- All three entry points covered.\n- No new defects substantiated; source and configuration unchanged.","treeHash":null,"usage":{"cachedInputTokens":735104,"inputTokens":95882,"model":"gpt-6-astra","outputTokens":5515,"runtime":"codex","turns":5,"wallClockMs":219828}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"468e82a89b9bfe18","findings":[{"citation":"resolved","description":"Status of prior finding d86af37e53b43051ac50cdec391976e594ee444b190967d88d811cfccb10cad0: NOT FIXED, and not disputed on the facts. The revised tree changes no Solidity: src/LaunchToken.sol is byte-identical in behaviour to the tree I reviewed (fee = amount / 20 deducted from every non-mint _update, no exemptions). The author's answer is documentation only: README.md ('Integrations must account for net received balances... The supplied launch-token floor contains precisely such an assumption'), VALIDATION.md ('7 passed, 1 failed... This is an outstanding acceptance/integration conflict'), and launch.json notes ('Unresolved compatibility issue... requires upstream reconciliation'). I agree with the author on the math: the fee is computed and applied exactly as the brief requires (verified by fuzz over the full supply range: fee == floor(amount*5/100), sender debited gross, supply conserved, rounding boundaries 19/20/39 correct, self-transfer and fee-recipient overlaps consistent, transferFrom consumes gross allowance, no fee leaks on reverted transfers). The conflict is therefore unchanged and still blocks admission: the supplied protected floor TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked (line 141) asserts balanceOf(recipient) == amount after transfer(recipient, supply/1000), and the factory-supplied LP seeding and MerkleDistributor split the supply on the assumption that transfers deliver the gross amount. With this code every one of those receives 95% of what it is credited for. There is no fix inside the token that keeps the brief: making the floor pass requires either removing the fee or exempting the factory/pool/distributor, both of which contradict '5% of every transfer goes to 0x20a2...' with no exemptions. This is a decision for the requester/judge, not the builder: either the brief is amended to exempt launch infrastructure (and the token gains an immutable exemption list), or the fee is dropped, or the launch policy accepts a fee-on-transfer token and its downstream accounting is re-derived. Until one of those happens the token cannot pass the protected floor and should not be deployed against a pool/distributor that assumes gross receipt. The proof attached mirrors the protected check exactly and fails on the current code for that reason; it is a record of the disagreeing input, not a prescription to remove the fee.","line":36,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Mirrors TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked from the supplied\n/// protected launch floor. It fails on the current LaunchToken because the required 5% fee is\n/// deducted from what the recipient receives. It does not prescribe removing the fee: it records\n/// the exact input on which the brief and the protected floor disagree.\ncontract ProtectedReceiptProof is Test {\n    LaunchToken token;\n    uint256 supplyAtDeployment;\n\n    function setUp() public {\n        token = new LaunchToken();\n        supplyAtDeployment = token.totalSupply();\n    }\n\n    function test_transferMovesExactlyWhatItWasAsked() public {\n        address recipient = address(0xCAFE);\n        uint256 amount = supplyAtDeployment / 1_000; // 100000000000 minor units = 10000 DRIM\n        assertGt(amount, 0);\n\n        uint256 before = token.balanceOf(address(this));\n        assertTrue(token.transfer(recipient, amount), \"transfer returned false\");\n\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n        assertEq(token.balanceOf(address(this)), before - amount, \"sender lost a different amount\");\n        assertEq(token.totalSupply(), supplyAtDeployment, \"a transfer changed the supply\");\n    }\n}","reproduction":"State: fresh LaunchToken deployed by account D with no constructor arguments; D holds 100000000000000 minor units (10000000 DRIM, 7 decimals). Call from D: transfer(0x000000000000000000000000000000000000CAFE, 100000000000) (= supplyAtDeployment / 1000, the exact input of the protected test). Expected by the protected floor: balanceOf(0xCAFE) == 100000000000, balanceOf(D) == 99900000000000, totalSupply unchanged. Actual: returns true; balanceOf(0xCAFE) == 95000000000; balanceOf(0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5) == 5000000000; balanceOf(D) == 99900000000000; totalSupply == 100000000000000. Re-run this round: copied .imd/reads/protected/evm_project/Token.protected.t.sol unchanged into test/scratch/, compiled with forge build --offline, then IMD_TOKEN_CREATION_CODE=<out/LaunchToken.sol/LaunchToken.json .bytecode.object> IMD_TOKEN_DECIMALS=7 forge test --offline --match-path test/scratch/Token.protected.t.sol -> 5 passed, 1 failed: [FAIL: recipient received a different amount: 95000000000 != 100000000000] test_transferMovesExactlyWhatItWasAsked(). Same result via transferFrom: D.approve(S, 100000000000); S.transferFrom(D, 0xCAFE, 100000000000) gives identical balances and allowance 0. The attached proof (test/scratch/ProtectedReceiptProof.t.sol) reproduces the same failure without environment variables.","severity":"medium","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);\n        if (fee != 0) {\n            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"Required transfer fee is incompatible with the protected launch receipt invariant (unchanged since last round, still reproduces)"}],"hash":"ea837e95541f4be2bbbb9acb01bab4314fcc003ff96cae03864826192f68fe19","nodeId":"85a8c06c-37cd-4b2b-9317-1da8ad04106d","outcome":"completed","summary":"The review is complete and the report is in `.imd-findings.json`. The tree is untouched apart from that file.\n\n**Outcome of the prior finding: not fixed, still reproduces.** The token source is unchanged from last round. The author answered with documentation only, in README.md, VALIDATION.md and the launch.json notes, stating the conflict needs upstream reconciliation. I re-ran the supplied protected test unchanged against the freshly compiled creation bytecode and it fails on the same input:\n\n```\n[FAIL: recipient received a different amount: 95000000000 != 100000000000] test_transferMovesExactlyWhatItWasAsked()\n```\n\nI kept it at medium with the same id and attached a self-contained proof test that mirrors the protected check and fails on the current code. The description states plainly that no token-side fix preserves the brief, so the requester or judge must choose between exempting launch infrastructure, dropping the fee, or accepting a fee-on-transfer token and re-deriving pool and distributor accounting.\n\n**Assigned area, covered in depth, no new defects.** A scratch fuzz suite over the full supply range confirmed the fee math on the revised tree:\n\n- fee equals floor of five percent for every amount, sender is debited gross, supply is conserved\n- rounding boundaries behave as documented, with no fee below 20 minor units and one unit at 20 and 39\n- self-transfer, transfer to the fee address, and transfer from the fee address all stay consistent\n- delegated transfers spend the gross allowance and revert atomically when underapproved\n- a reverted transfer to the zero address leaves the fee recipient untouched\n\nThe delivered suite passes as the author claims, with 40 tests including the invariant campaign. The dust rounding on sub-20-unit transfers is documented and economically irrelevant, so I recorded it as a coverage note rather than a finding.\n\n**Coverage record** has rows for all three entry points plus four invariants. approve holds, transfer and transferFrom point at finding 1, and the supply, fee, revert-atomicity and constructor invariants hold.","treeHash":null,"usage":{"cachedInputTokens":655170,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":11978,"runtime":"claude","turns":12,"wallClockMs":238016}},{"artifacts":[],"attempt":1,"bundleHash":"a1fcd541cffed9d267fd91803ecda600e0d19f375e5a4bc12dc8eaa3c4a864f2","device":"35c52a5b502e847c","findings":[{"description":"Acceptance-policy conflict, not a defect in the token implementation. The explicit task requires 5% of every transfer to go to 0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5, but the supplied protected test requires the recipient to receive the entire gross transfer amount. The token honors the task. Its fee cannot be removed or exempted for the factory without violating that requirement. The network must reconcile the protected check and any launch integration that assumes fee-free receipt with the specified token economics. Test-only changes cannot satisfy both requirements, and the accepted fee and conservation tests must not be weakened.","line":141,"path":".imd/reads/protected/evm_project/Token.protected.t.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Reproduces the protected launch policy, not the task's 5% fee specification.\n/// @dev Resolving this conflict requires a policy decision; removing the fee violates the task.\ncontract LaunchPolicyConflictProof is Test {\n    function testProtectedPolicyRequiresFeeFreeReceipt() public {\n        LaunchToken token = new LaunchToken();\n        address recipient = address(0xCAFE);\n        uint256 supply = token.totalSupply();\n        uint256 amount = supply / 1_000;\n\n        assertEq(supply, 100_000_000_000_000);\n        assertEq(token.balanceOf(address(this)), supply);\n        assertTrue(token.transfer(recipient, amount));\n        assertEq(token.balanceOf(address(this)), supply - amount);\n        assertEq(token.totalSupply(), supply);\n\n        // Token.protected.t.sol:141 expects the entire gross amount at the recipient.\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n    }\n}","reproduction":"Deploy src/LaunchToken.sol:LaunchToken without arguments. Supply is 100000000000000 minor units (10000000 DRIM with 7 decimals), all held by the deployer. From that deployer, call transfer(address(0xCAFE), 100000000000), matching supply / 1000 in the protected check. Protected expectation: recipient balance equals 100000000000. Actual: recipient balance is 95000000000 and the required fee recipient receives 5000000000; sender loses 100000000000 and total supply is unchanged. Both the unchanged protected test and the embedded proof were run and failed with \"recipient received a different amount: 95000000000 != 100000000000\". The protected suite returned 7 passed, 1 failed, 0 skipped using decimals 7, expected supply 100000000000000, and zero application contracts. To reproduce independently, write proof to test/scratch/LaunchPolicyConflictProof.t.sol and run: forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path test/scratch/LaunchPolicyConflictProof.t.sol -vvv. This proof reproduces the conflicting protected expectation; it is not a recommendation to remove the task-required fee.","severity":"medium","title":"Protected fee-free transfer requirement conflicts with the mandatory 5% fee"}],"hash":"ecced9298138b2ec1f0bb6e617e137e217ac2085527c9eedc7cfdcef31ca5f33","nodeId":"db4b9bf6-f0a9-4991-af1f-7aaf19ea1eb0","outcome":"completed","summary":"Preserved the accepted tests and added reproduction instructions.\n\nOffline `forge build` and `forge test` pass: 40 tests, including 32,768 invariant calls.\n\nReported one conflict in `.imd-findings.json` with an executed failing proof: the protected check requires fee-free transfers, contradicting the required 5% fee. Protected results: 7 passed, 1 failed.","treeHash":"9688e96ec868c7d225afc4c96bee5379b635c701","usage":{"cachedInputTokens":1040000,"inputTokens":62299,"model":"gpt-6-astra","outputTokens":6483,"runtime":"codex","turns":6,"wallClockMs":282725}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"377843575071cdb1","findings":[{"citation":"resolved","description":"Prior finding 0b1292cc210183f2850fb1d4d07a8d01493e615f3098284433b5a1ae8287c1c8 remains unresolved. The author is correct that the implementation follows the approved 5% fee and that satisfying the supplied gross-receipt assertion by removing the fee or adding exemptions would change the brief. Nevertheless, the supplied TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked still requires the ordinary recipient to receive the gross amount, so this token cannot satisfy that launch acceptance check. Documentation acknowledges but does not reconcile the executable conflict. The economics, flow, math and permissions reports are merged here into one medium-severity acceptance-policy conflict. No incorrect fee calculation or authorization bypass is established. Production factory, pool and distributor code is absent; stand-in address transfers do not establish actual claimant losses or pool settlement failure, so the specialist high-severity impact is not retained. Reconcile the upstream protected receipt requirement and launch accounting with the approved fee, then verify the real integrations; no token-only change can meet both contradictory requirements without changing the brief.","line":40,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Reproduces the supplied protected gross-receipt requirement.\n/// This requirement conflicts with the approved 5% transfer fee. These assertions\n/// demonstrate that conflict; they do not authorize removing the required fee.\ncontract LaunchReceiptConflictTest is Test {\n    function test_protectedGrossReceiptRequirement() public {\n        LaunchToken token = new LaunchToken();\n        uint256 supply = token.totalSupply();\n        uint256 amount = supply / 1_000;\n        address recipient = address(0xCAFE);\n\n        assertEq(supply, 100_000_000_000_000);\n        assertTrue(token.transfer(recipient, amount));\n        assertEq(token.balanceOf(address(this)), supply - amount);\n        assertEq(token.totalSupply(), supply);\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n    }\n\n    function test_delegatedTransferHasTheSameReceiptConflict() public {\n        LaunchToken token = new LaunchToken();\n        uint256 supply = token.totalSupply();\n        uint256 amount = supply / 1_000;\n        address recipient = address(0xCAFE);\n        address spender = address(0xB0B);\n\n        assertEq(supply, 100_000_000_000_000);\n        assertTrue(token.approve(spender, amount));\n        vm.prank(spender);\n        assertTrue(token.transferFrom(address(this), recipient, amount));\n        assertEq(token.allowance(address(this), spender), 0);\n        assertEq(token.balanceOf(address(this)), supply - amount);\n        assertEq(token.totalSupply(), supply);\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n    }\n}","reproduction":"Fresh LaunchToken deployed by D with no constructor arguments and no ETH: totalSupply and D balance are 100000000000000 minor units; R=address(0xCAFE) and F=0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5 start empty. D calls transfer(R,100000000000), exactly totalSupply()/1000. Actual: returns true; fee 5000000000 goes to F; R receives 95000000000; D retains 99900000000000; totalSupply stays 100000000000000. Expected by the protected test: R balance 100000000000. On a fresh deployment, D approves S=address(0xB0B) for 100000000000 and S calls transferFrom(D,R,100000000000); balances are identical and the gross allowance becomes zero. This round copied all four supplied proof files unchanged under test/scratch/review/proofs/ and ran forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path 'test/scratch/review/proofs/Proof_*.t.sol' -vvv with Solidity 0.8.26. Six tests failed for net-versus-gross receipt, including both tests in the original Proof_0b1292cc2101.t.sol after their sender-balance, supply and delegated-allowance assertions passed. Five failures were 95000000000 != 100000000000; the permissions stand-in distributor proof failed earlier at 9500000000000 != 10000000000000, before executing its payout. The embedded original proof records the conflicting service requirement and does not authorize removal of the approved fee. Also ran unchanged copies of both supplied protected suites using the compiled LaunchToken creation bytecode, IMD_TOKEN_DECIMALS=7, IMD_EXPECTED_SUPPLY=100000000000000, IMD_PROJECT_COUNT=0, IMD_PROJECT_FACTORY=0x0000000000000000000000000000000000fac700, IMD_PROJECT_CHAIN_ID=11155111, and IMD_EXPECTED_TOKEN=0x2A4590BdfAeD444049EF3C8E69FA8f174599e174 (local CREATE2 salt 1): forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path 'test/scratch/review/protected/*.t.sol' -vvv. Result: 7 passed, 1 failed, 0 skipped; only test_transferMovesExactlyWhatItWasAsked failed with 95000000000 != 100000000000. This independently confirms the author's reproduction and the still-unresolved acceptance conflict. To rerun the embedded self-contained proof after read inputs are removed, save proof as test/scratch/LaunchReceiptConflict.t.sol and run forge test --offline --out test/scratch/out --cache-path test/scratch/cache --match-path test/scratch/LaunchReceiptConflict.t.sol -vvv. The unchanged regular suite was also executed with --match-path 'test/LaunchToken*.t.sol': 40 passed, 0 failed, including 256 invariant sequences and 32768 handler calls; these validate the approved fee semantics.","severity":"medium","snippet":"        super._update(from, to, amount - fee);","title":"Required transfer fee still conflicts with the protected launch receipt check"}],"hash":"ed19b491680f7edaa699720556202e199d37d03a48fbd6bfe539d608736d4e48","nodeId":"2d0d7232-b17b-4cf4-8267-75cbc21e8d1c","outcome":"completed","summary":"Wrote [.imd-findings.json](/home/worker/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/2d0d7232-b17b-4cf4-8267-75cbc21e8d1c/.imd-findings.json) with one merged **medium** finding and coverage for all three entry points.\n\nThe prior conflict remains reproducible: the required 5% fee delivers 95%, while the protected check requires 100%. Resolution requires upstream reconciliation.\n\n- Existing suite: **40 passed**.\n- Protected suites: **7 passed, 1 failed**.\n- Dropped the unverified supply-policy claim and unsupported downstream-loss claims.\n- No new defects substantiated. Source and configuration remain unchanged.","treeHash":null,"usage":{"cachedInputTokens":973696,"inputTokens":106933,"model":"gpt-6-astra","outputTokens":7223,"runtime":"codex","turns":5,"wallClockMs":271285}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"20a3efdc039f2089","findings":[{"citation":"resolved","description":"Revalidation of finding 91a5273ca3c957f7f3735ffc2318cc3f2282ab5fa84b4555c9fc1ea7eef5d5c6: unresolved. The revised README, validation record and manifest acknowledge the conflict, but the supplied TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked still requires full gross receipt. LaunchToken._update correctly applies the explicit brief's 5% fee, so the unchanged admission requirement cannot pass. This is an acceptance-policy incompatibility, not an unauthorized fee or a demonstrated token-accounting defect. Reconcile the upstream protected receipt requirement with the approved fee semantics and validate fee-aware launch integration, or obtain an explicit change to the token requirements. Documentation and manifest notes do not change the failing check. No actual factory, pool or distributor implementation is supplied; claimant losses and specific settlement failures are not established.","line":36,"path":"src/LaunchToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Reproduces the supplied protected admission requirement, which conflicts\n/// with the requested transfer fee. This is not evidence of a deployed integration loss.\ncontract LaunchPolicyConflictProof is Test {\n    function test_protectedAdmissionRequiresGrossReceipt() public {\n        LaunchToken token = new LaunchToken();\n        uint256 supply = token.totalSupply();\n        uint256 amount = supply / 1_000;\n        address recipient = address(0xCAFE);\n        uint256 beforeBalance = token.balanceOf(address(this));\n\n        assertTrue(token.transfer(recipient, amount), \"transfer returned false\");\n        assertEq(token.balanceOf(recipient), amount, \"recipient received a different amount\");\n        assertEq(token.balanceOf(address(this)), beforeBalance - amount, \"sender lost a different amount\");\n        assertEq(token.totalSupply(), supply, \"a transfer changed the supply\");\n    }\n}","reproduction":"Copied .imd/reads/proofs/Proof_91a5273ca3c9.t.sol unchanged to test/scratch/Proof_91a5273ca3c9.t.sol in an isolated /tmp copy containing the current src, lib, test and foundry.toml. Ran forge test --offline --out /tmp/drim-review.gKLqB8/out --cache-path /tmp/drim-review.gKLqB8/cache --match-path test/scratch/Proof_91a5273ca3c9.t.sol -vvv. Result: 0 passed, 1 failed, 0 skipped; recipient received a different amount: 95000000000 != 100000000000. Exact state and call: deploy new LaunchToken from F (F initially holds the full 100000000000000 minor units); F calls transfer(address(0xCAFE), 100000000000). Protected expectation: recipient receives 100000000000. Actual: recipient receives 95000000000 and 0x20a2Fb1bb9e6C1443C11703cCecB3685cd99b7C5 receives 5000000000. F retains 99900000000000 and totalSupply remains 100000000000000. The required fee and the protected full-receipt assertion cannot both hold for this input. Independently ran both supplied protected files unchanged with IMD_TOKEN_CREATION_CODE set to this build's creation bytecode, IMD_TOKEN_DECIMALS=7, IMD_EXPECTED_SUPPLY=100000000000000, IMD_PROJECT_COUNT=0, IMD_PROJECT_CHAIN_ID=11155111, IMD_PROJECT_FACTORY=0x000000000000000000000000000000000000facc, and IMD_EXPECTED_TOKEN computed from CREATE2(factory, salt=bytes32(uint256(1)), keccak256(creationCode)). Command in the isolated copy: forge test --offline --out /tmp/drim-review.gKLqB8/protected-out --cache-path /tmp/drim-review.gKLqB8/protected-cache --match-path \"test/scratch/*.protected.t.sol\" -vvv. Result: 7 passed, 1 failed, 0 skipped; TokenProtectedTest.test_transferMovesExactlyWhatItWasAsked fails with the same expected/actual amounts. The normal project suite separately passes all 40 tests, including the grouped 256-run, 32768-call invariant campaign with zero unexpected reverts.","severity":"medium","snippet":"        uint256 fee = amount / (10_000 / FEE_BPS);\n        if (fee != 0) {\n            super._update(from, FEE_RECIPIENT, fee);\n        }\n        super._update(from, to, amount - fee);","title":"Required 5% transfer fee still conflicts with the protected launch admission check"}],"hash":"f6239101ba2e23b081a720d895b3a296b916d43d9a466c48c1f7b44cda7906a4","nodeId":"8e5cb5a8-6a25-448b-91a2-39ec1f50085b","outcome":"completed","summary":"Wrote [.imd-findings.json](/home/seat/.identitymd/work/198ebf69-e885-4df9-b886-7570a2f78d6d/8e5cb5a8-6a25-448b-91a2-39ec1f50085b/.imd-findings.json).\n\nThe prior medium finding remains reproducible: the required 5% fee conflicts with the protected full-receipt assertion.\n\n- Project tests: 40 passed.\n- Protected checks: 7 passed, 1 failed.\n- All three entry points covered; no new findings.\n- Source, tests, and configuration unchanged.","treeHash":null,"usage":{"cachedInputTokens":666624,"inputTokens":84088,"model":"gpt-6-astra","outputTokens":6173,"runtime":"codex","turns":5,"wallClockMs":252509}}],"verification":[{"checks":[{"durationMs":1371,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.27s\nCompiler run successful!\n","passed":true},{"durationMs":13501,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/LaunchTokenAdversarial.t.sol:LaunchTokenAdversarialTest\n[PASS] testFuzzAllowanceReplacementAndRevocationAreIsolated(uint256,uint256,uint256) (runs: 1000, μ: 429239, ~: 434894)\nLogs:\n  Bound result 211801472\n  Bound result 13750\n  Bound result 8\n\n[PASS] testFuzzDirectAndDelegatedTransfersAgreeForOverlappingAddresses(address,address,address,uint256,uint8) (runs: 1000, μ: 263130, ~: 271615)\nLogs:\n  Bound result 165051762295231826957469778337079637505241802711\n  Bound result 911203350197385903386255174320112316406273870541\n  Bound result 505766291761022427962250541836263735340056262817\n  Bound result 26904012680262\n\n[PASS] testFuzzSpentAllowanceCannotBeReused(uint256,uint256) (runs: 1000, μ: 398571, ~: 404230)\nLogs:\n  Bound result 3034931696153\n  Bound result 2528621516458\n\n[PASS] testMaximumDelegatedAmountRevertsWithoutChangingInfiniteAllowance() (gas: 132655)\n[PASS] testValueAttachedToValidCallsRevertsWithoutChangingTokenState() (gas: 514288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 69.23ms (203.50ms CPU time)\n\nRan 34 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApproveEmitsAndCanReplaceOrRevokeAllowance() (gas: 192280)\n[PASS] testApproveFromZeroReverts() (gas: 30941)\n[PASS] testApproveZeroSpenderReverts() (gas: 37796)\n[PASS] testConstructorMintsWholeSupplyToItsImmediateDeployer() (gas: 36777)\n[PASS] testDelegatedSelfTransferConsumesGrossAllowance() (gas: 138813)\n[PASS] testDelegatedTreasuryTransferConsumesGrossAllowance() (gas: 194317)\n[PASS] testEntireSupplyCanBeTransferred() (gas: 117498)\n[PASS] testFeeRoundingAtSmallestUnitBoundaries() (gas: 296668)\n[PASS] testFuzzInsufficientBalanceRollsBackDelegatedAllowance(uint256,uint256) (runs: 512, μ: 242628, ~: 246474)\nLogs:\n  Bound result 156183077\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007912981266031\n\n[PASS] testFuzzMixedTransfersMatchConservationModel(uint256,uint8) (runs: 512, μ: 1618002, ~: 1301554)\nLogs:\n  Bound result 8\n\n[PASS] testFuzzTransferRoundsFeeDownAndConservesSupply(uint256) (runs: 512, μ: 122920, ~: 126012)\nLogs:\n  Bound result 13631\n\n[PASS] testMaximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 236012)\n[PASS] testMaximumTransferAmountRevertsWithoutArithmeticPanic() (gas: 61580)\n[PASS] testMetadataAndFixedSupply() (gas: 89554)\n[PASS] testNoMintPauseBurnFeeAdminOrUpgradeEntryPoints() (gas: 928671)\n[PASS] testRejectsEther() (gas: 36877)\n[PASS] testSelfTransferChargesFee() (gas: 90293)\n[PASS] testSelfTransferRequiresFullGrossBalance() (gas: 51241)\n[PASS] testTransferByZeroSenderReverts() (gas: 30956)\n[PASS] testTransferDeductsGrossAndEmitsFeeThenNet() (gas: 127653)\n[PASS] testTransferFromConsumesGrossAllowanceAndChargesSameFee() (gas: 191932)\n[PASS] testTransferFromDoesNotBypassAllowanceWhenCallerIsOwner() (gas: 33693)\n[PASS] testTransferFromRejectsMissingAllowance() (gas: 61955)\n[PASS] testTransferFromRequiresGrossAllowanceRatherThanNet() (gas: 119397)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 112018)\n[PASS] testTransferFromZeroSenderReverts() (gas: 33558)\n[PASS] testTransferToTreasuryCreditsBothLegs() (gas: 85246)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 82903)\n[PASS] testTreasurySelfTransferPreservesItsBalance() (gas: 110834)\n[PASS] testTreasurySelfTransferRequiresFullGrossBalance() (gas: 96203)\n[PASS] testTreasuryTransferRequiresFullGrossBalance() (gas: 106453)\n[PASS] testTreasuryTransferRetainsItsOwnFee() (gas: 151108)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmitsOneEvent() (gas: 81318)\n[PASS] testZeroTransferFromRequiresNoAllowance() (gas: 78480)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 102.07ms (206.00ms CPU time)\n\nRan 1 test for test/LaunchTokenInvariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariant_allowancesFollowApprovalsAndGrossSpending\n[PASS] invariant_balancesFollowFivePercentFeeLedger\n[PASS] invariant_fixedSupplyEqualsAllBalances\n LaunchTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------+---------------------+-------+---------+----------╮\n| Contract    | Selector            | Calls | Reverts | Discards |\n+================================================================+\n| DrimHandler | approve             | 4181  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | forbiddenAdminCall  | 4010  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectOverdraw      | 4054  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectUnderapproved | 4216  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroReceiver  | 4068  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroSpender   | 4097  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transfer            | 4061  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transferFrom        | 4081  | 0       | 0        |\n╰-------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 659918\n  Bound result 26737990208309\n  Bound result 115792089237316195423570985008687907853269984665640564039457583949863129641778\n  Bound result 14450720562884073484904221487683828439318279420454170\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129641775\n  Bound result 1\n  Bound result 4911522195972672877570087947458740534\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457584003963129639940\n  Bound result 2081578073356\n  Bound result 38\n  Bound result 46\n  Bound result 7237617799172499166561990289272419376376608994465275127328904\n  Bound result 51966\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129646372\n  Bound result 1943\n  Bound result 659918\n  Bound result 1\n  Bound result 6743\n  Bound result 3507\n  Bound result 0\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457583949863129648391\n  Bound result 190\n  Bound result 17\n  Bound result 19000000000001\n  Bound result 205431788115\n  Bound result 115792089237316195423570985008687907853269984665640564039457584004158289838893\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007717969441256\n  Bound result 115792089237316195423570985008687907853269984665640564039457583949863129639988\n  Bound result 1940\n  Bound result 19582523357352\n  Bound result 1800870798839\n  Bound result 118\n  Bound result 8231\n  Bound result 1062\n  Bound result 86268925349597408608754822631956065300168772\n  Bound result 0\n  Bound result 4263\n  Bound result 4111\n  Bound result 0\n  Bound result 39\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007717969441272\n  Bound result 15\n  Bound result 4925\n  Bound result 19\n  Bound result 1364\n  Bound result 115792089237316195423570985008687907853269984665640564039457583989753510800440\n  Bound result 31592123087838\n  Bound result 18049999995710\n  Bound result 8951\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.41s (13.41s CPU time)\n\nRan 3 test suites in 13.41s (13.58s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":32,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":110,\"VALIDATION.md\":49,\"foundry.toml\":22,\"src/LaunchToken.sol\":42,\"test/LaunchToken.t.sol\":454,\"test/LaunchTokenAdversarial.t.sol\":192,\"test/LaunchTokenInvariant.t.sol\":232,\"test/README.md\":47},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"0fbdb5590b661176c942fa7d1b993e1d3d103052bd350bb963a69bccb4dedd27","verifiedTreeHash":"89fea99e4a438152c7e250f043c2540af782d776","verifierVersion":"0.1.0+4ec1a4b6"},{"checks":[{"durationMs":3224,"exitCode":0,"name":"build","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.82s\nCompiler run successful!\n","passed":true},{"durationMs":428,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 34 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApproveEmitsAndCanReplaceOrRevokeAllowance() (gas: 192280)\n[PASS] testApproveFromZeroReverts() (gas: 30941)\n[PASS] testApproveZeroSpenderReverts() (gas: 37796)\n[PASS] testConstructorMintsWholeSupplyToItsImmediateDeployer() (gas: 36777)\n[PASS] testDelegatedSelfTransferConsumesGrossAllowance() (gas: 138813)\n[PASS] testDelegatedTreasuryTransferConsumesGrossAllowance() (gas: 194317)\n[PASS] testEntireSupplyCanBeTransferred() (gas: 117498)\n[PASS] testFeeRoundingAtSmallestUnitBoundaries() (gas: 296668)\n[PASS] testFuzzInsufficientBalanceRollsBackDelegatedAllowance(uint256,uint256) (runs: 512, μ: 242524, ~: 246515)\nLogs:\n  Bound result 0\n  Bound result 11\n\n[PASS] testFuzzMixedTransfersMatchConservationModel(uint256,uint8) (runs: 512, μ: 1669849, ~: 1360306)\nLogs:\n  Bound result 12\n\n[PASS] testFuzzTransferRoundsFeeDownAndConservesSupply(uint256) (runs: 512, μ: 122841, ~: 126012)\nLogs:\n  Bound result 31724453144856\n\n[PASS] testMaximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 236012)\n[PASS] testMaximumTransferAmountRevertsWithoutArithmeticPanic() (gas: 61580)\n[PASS] testMetadataAndFixedSupply() (gas: 89554)\n[PASS] testNoMintPauseBurnFeeAdminOrUpgradeEntryPoints() (gas: 928671)\n[PASS] testRejectsEther() (gas: 36877)\n[PASS] testSelfTransferChargesFee() (gas: 90293)\n[PASS] testSelfTransferRequiresFullGrossBalance() (gas: 51241)\n[PASS] testTransferByZeroSenderReverts() (gas: 30956)\n[PASS] testTransferDeductsGrossAndEmitsFeeThenNet() (gas: 127653)\n[PASS] testTransferFromConsumesGrossAllowanceAndChargesSameFee() (gas: 191932)\n[PASS] testTransferFromDoesNotBypassAllowanceWhenCallerIsOwner() (gas: 33693)\n[PASS] testTransferFromRejectsMissingAllowance() (gas: 61955)\n[PASS] testTransferFromRequiresGrossAllowanceRatherThanNet() (gas: 119397)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 112018)\n[PASS] testTransferFromZeroSenderReverts() (gas: 33558)\n[PASS] testTransferToTreasuryCreditsBothLegs() (gas: 85246)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 82903)\n[PASS] testTreasurySelfTransferPreservesItsBalance() (gas: 110834)\n[PASS] testTreasurySelfTransferRequiresFullGrossBalance() (gas: 96203)\n[PASS] testTreasuryTransferRequiresFullGrossBalance() (gas: 106453)\n[PASS] testTreasuryTransferRetainsItsOwnFee() (gas: 151108)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmitsOneEvent() (gas: 81318)\n[PASS] testZeroTransferFromRequiresNoAllowance() (gas: 78480)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 190.29ms (327.70ms CPU time)\n\nRan 1 test suite in 193.97ms (190.29ms CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true},{"durationMs":130,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":110,\"VALIDATION.md\":49,\"foundry.toml\":22,\"src/LaunchToken.sol\":42,\"test/LaunchToken.t.sol\":454},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1941,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":624,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/LaunchToken.sol:9: Large Numeric Literal (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"16e35a62c8bbecd7da78c652f392f6c693332df1eceaec7c49d062515c7e347e","verifiedTreeHash":"95b00c8aa1706efc199c3232c01663d8b25219ef","verifierVersion":"0.1.0+4ec1a4b6"},{"checks":[{"durationMs":1435,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.32s\nCompiler run successful!\n","passed":true},{"durationMs":13620,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 34 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApproveEmitsAndCanReplaceOrRevokeAllowance() (gas: 192280)\n[PASS] testApproveFromZeroReverts() (gas: 30941)\n[PASS] testApproveZeroSpenderReverts() (gas: 37796)\n[PASS] testConstructorMintsWholeSupplyToItsImmediateDeployer() (gas: 36777)\n[PASS] testDelegatedSelfTransferConsumesGrossAllowance() (gas: 138813)\n[PASS] testDelegatedTreasuryTransferConsumesGrossAllowance() (gas: 194317)\n[PASS] testEntireSupplyCanBeTransferred() (gas: 117498)\n[PASS] testFeeRoundingAtSmallestUnitBoundaries() (gas: 296668)\n[PASS] testFuzzInsufficientBalanceRollsBackDelegatedAllowance(uint256,uint256) (runs: 512, μ: 243056, ~: 246498)\nLogs:\n  Bound result 86617628565065\n  Bound result 12447917523657207847731020572699194932444486448626619492345286099\n\n[PASS] testFuzzMixedTransfersMatchConservationModel(uint256,uint8) (runs: 512, μ: 1572603, ~: 1205210)\nLogs:\n  Bound result 19\n\n[PASS] testFuzzTransferRoundsFeeDownAndConservesSupply(uint256) (runs: 512, μ: 122991, ~: 126000)\nLogs:\n  Bound result 500000\n\n[PASS] testMaximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 236012)\n[PASS] testMaximumTransferAmountRevertsWithoutArithmeticPanic() (gas: 61580)\n[PASS] testMetadataAndFixedSupply() (gas: 89554)\n[PASS] testNoMintPauseBurnFeeAdminOrUpgradeEntryPoints() (gas: 928671)\n[PASS] testRejectsEther() (gas: 36877)\n[PASS] testSelfTransferChargesFee() (gas: 90293)\n[PASS] testSelfTransferRequiresFullGrossBalance() (gas: 51241)\n[PASS] testTransferByZeroSenderReverts() (gas: 30956)\n[PASS] testTransferDeductsGrossAndEmitsFeeThenNet() (gas: 127653)\n[PASS] testTransferFromConsumesGrossAllowanceAndChargesSameFee() (gas: 191932)\n[PASS] testTransferFromDoesNotBypassAllowanceWhenCallerIsOwner() (gas: 33693)\n[PASS] testTransferFromRejectsMissingAllowance() (gas: 61955)\n[PASS] testTransferFromRequiresGrossAllowanceRatherThanNet() (gas: 119397)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 112018)\n[PASS] testTransferFromZeroSenderReverts() (gas: 33558)\n[PASS] testTransferToTreasuryCreditsBothLegs() (gas: 85246)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 82903)\n[PASS] testTreasurySelfTransferPreservesItsBalance() (gas: 110834)\n[PASS] testTreasurySelfTransferRequiresFullGrossBalance() (gas: 96203)\n[PASS] testTreasuryTransferRequiresFullGrossBalance() (gas: 106453)\n[PASS] testTreasuryTransferRetainsItsOwnFee() (gas: 151108)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmitsOneEvent() (gas: 81318)\n[PASS] testZeroTransferFromRequiresNoAllowance() (gas: 78480)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 101.92ms (266.15ms CPU time)\n\nRan 5 tests for test/LaunchTokenAdversarial.t.sol:LaunchTokenAdversarialTest\n[PASS] testFuzzAllowanceReplacementAndRevocationAreIsolated(uint256,uint256,uint256) (runs: 1000, μ: 428994, ~: 435596)\nLogs:\n  Bound result 4046\n  Bound result 190\n  Bound result 585\n\n[PASS] testFuzzDirectAndDelegatedTransfersAgreeForOverlappingAddresses(address,address,address,uint256,uint8) (runs: 1000, μ: 264521, ~: 271707)\nLogs:\n  Bound result 1070707528049548309380726685400928673201672859386\n  Bound result 109350169461584395249979219943986446538747388688\n  Bound result 1234596976986884287398661865067083319693318618074\n  Bound result 17010799051306\n\n[PASS] testFuzzSpentAllowanceCannotBeReused(uint256,uint256) (runs: 1000, μ: 399027, ~: 404230)\nLogs:\n  Bound result 6431\n  Bound result 1013\n\n[PASS] testMaximumDelegatedAmountRevertsWithoutChangingInfiniteAllowance() (gas: 132655)\n[PASS] testValueAttachedToValidCallsRevertsWithoutChangingTokenState() (gas: 514288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 102.91ms (302.09ms CPU time)\n\nRan 1 test for test/LaunchTokenInvariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariant_allowancesFollowApprovalsAndGrossSpending\n[PASS] invariant_balancesFollowFivePercentFeeLedger\n[PASS] invariant_fixedSupplyEqualsAllBalances\n LaunchTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------+---------------------+-------+---------+----------╮\n| Contract    | Selector            | Calls | Reverts | Discards |\n+================================================================+\n| DrimHandler | approve             | 4032  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | forbiddenAdminCall  | 4124  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectOverdraw      | 4092  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectUnderapproved | 4064  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroReceiver  | 4126  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroSpender   | 4107  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transfer            | 4159  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transferFrom        | 4064  | 0       | 0        |\n╰-------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129639951\n  Bound result 1208375957805\n  Bound result 9723764713930\n  Bound result 8098\n  Bound result 1\n  Bound result 466373638627\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129639964\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129643215\n  Bound result 115792089237316195423570985008687907853269984665640564039457584004913129639971\n  Bound result 115792089237316195423570985008687907853269984665640564039457584004913129640934\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129639925\n  Bound result 12\n  Bound result 7239\n  Bound result 0\n  Bound result 2066114166\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129639958\n  Bound result 40000000000000\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129640057\n  Bound result 4255175530351256394\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988911166840599\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129639951\n  Bound result 0\n  Bound result 11477252158147\n  Bound result 19000000000003\n  Bound result 54493937608890\n  Bound result 157491647522\n  Bound result 115792089237316195423570985008687907853269984665640564039457583970861264973120\n  Bound result 115792089237316195423570985008687907853269984665640564039457583970861264971945\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129640989\n  Bound result 17\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129641954\n  Bound result 110\n  Bound result 500000\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913130139939\n  Bound result 115792089237316195423570985008687907853269984665640564039457584003962928194743\n  Bound result 1\n  Bound result 38\n  Bound result 14\n  Bound result 1\n  Bound result 29476565653983\n  Bound result 6611\n  Bound result 4678\n  Bound result 3149092299276\n  Bound result 110\n  Bound result 115792089237316195423570985008687907853269984665640564039457583997389695300804\n  Bound result 11117157288529\n  Bound result 3395723175\n  Bound result 7276792748394\n  Bound result 115792089237316195423570985008687907853269984665640564039457583997393091017137\n  Bound result 3151273985633\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.53s (13.53s CPU time)\n\nRan 3 test suites in 13.53s (13.73s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":42,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":110,\"VALIDATION.md\":49,\"foundry.toml\":22,\"src/LaunchToken.sol\":42,\"test/LaunchToken.t.sol\":454,\"test/LaunchTokenAdversarial.t.sol\":192,\"test/LaunchTokenInvariant.t.sol\":232,\"test/README.md\":67},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1d00c6b9fc94b7fbf08a57830d79244f966c4db75e3300e64882050af4e232b9","verifiedTreeHash":"e9bd5f00a6997e356d1e666c98713b6cc57754f8","verifierVersion":"0.1.0+4ec1a4b6"},{"checks":[{"durationMs":1347,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.23s\nCompiler run successful!\n","passed":true},{"durationMs":13897,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/LaunchTokenAdversarial.t.sol:LaunchTokenAdversarialTest\n[PASS] testFuzzAllowanceReplacementAndRevocationAreIsolated(uint256,uint256,uint256) (runs: 1000, μ: 429366, ~: 435490)\nLogs:\n  Bound result 2827\n  Bound result 2\n  Bound result 1050\n\n[PASS] testFuzzDirectAndDelegatedTransfersAgreeForOverlappingAddresses(address,address,address,uint256,uint8) (runs: 1000, μ: 265763, ~: 271798)\nLogs:\n  Bound result 937584952025587744210764054848959138621196502204\n  Bound result 790100678584633088272376982436004039012003591647\n  Bound result 1176618147291667260394087865524810722048945355338\n  Bound result 80602825730318\n\n[PASS] testFuzzSpentAllowanceCannotBeReused(uint256,uint256) (runs: 1000, μ: 398444, ~: 404266)\nLogs:\n  Bound result 46449240611454\n  Bound result 31115969074899\n\n[PASS] testMaximumDelegatedAmountRevertsWithoutChangingInfiniteAllowance() (gas: 132655)\n[PASS] testValueAttachedToValidCallsRevertsWithoutChangingTokenState() (gas: 514288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 109.12ms (257.28ms CPU time)\n\nRan 34 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApproveEmitsAndCanReplaceOrRevokeAllowance() (gas: 192280)\n[PASS] testApproveFromZeroReverts() (gas: 30941)\n[PASS] testApproveZeroSpenderReverts() (gas: 37796)\n[PASS] testConstructorMintsWholeSupplyToItsImmediateDeployer() (gas: 36777)\n[PASS] testDelegatedSelfTransferConsumesGrossAllowance() (gas: 138813)\n[PASS] testDelegatedTreasuryTransferConsumesGrossAllowance() (gas: 194317)\n[PASS] testEntireSupplyCanBeTransferred() (gas: 117498)\n[PASS] testFeeRoundingAtSmallestUnitBoundaries() (gas: 296668)\n[PASS] testFuzzInsufficientBalanceRollsBackDelegatedAllowance(uint256,uint256) (runs: 512, μ: 242824, ~: 246515)\nLogs:\n  Bound result 60542671890930\n  Bound result 115792089237316195423570985008687907853269984665640564039457584003486343923260\n\n[PASS] testFuzzMixedTransfersMatchConservationModel(uint256,uint8) (runs: 512, μ: 1442719, ~: 973597)\nLogs:\n  Bound result 15\n\n[PASS] testFuzzTransferRoundsFeeDownAndConservesSupply(uint256) (runs: 512, μ: 123640, ~: 126036)\nLogs:\n  Bound result 1\n\n[PASS] testMaximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 236012)\n[PASS] testMaximumTransferAmountRevertsWithoutArithmeticPanic() (gas: 61580)\n[PASS] testMetadataAndFixedSupply() (gas: 89554)\n[PASS] testNoMintPauseBurnFeeAdminOrUpgradeEntryPoints() (gas: 928671)\n[PASS] testRejectsEther() (gas: 36877)\n[PASS] testSelfTransferChargesFee() (gas: 90293)\n[PASS] testSelfTransferRequiresFullGrossBalance() (gas: 51241)\n[PASS] testTransferByZeroSenderReverts() (gas: 30956)\n[PASS] testTransferDeductsGrossAndEmitsFeeThenNet() (gas: 127653)\n[PASS] testTransferFromConsumesGrossAllowanceAndChargesSameFee() (gas: 191932)\n[PASS] testTransferFromDoesNotBypassAllowanceWhenCallerIsOwner() (gas: 33693)\n[PASS] testTransferFromRejectsMissingAllowance() (gas: 61955)\n[PASS] testTransferFromRequiresGrossAllowanceRatherThanNet() (gas: 119397)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 112018)\n[PASS] testTransferFromZeroSenderReverts() (gas: 33558)\n[PASS] testTransferToTreasuryCreditsBothLegs() (gas: 85246)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 82903)\n[PASS] testTreasurySelfTransferPreservesItsBalance() (gas: 110834)\n[PASS] testTreasurySelfTransferRequiresFullGrossBalance() (gas: 96203)\n[PASS] testTreasuryTransferRequiresFullGrossBalance() (gas: 106453)\n[PASS] testTreasuryTransferRetainsItsOwnFee() (gas: 151108)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmitsOneEvent() (gas: 81318)\n[PASS] testZeroTransferFromRequiresNoAllowance() (gas: 78480)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 109.20ms (293.59ms CPU time)\n\nRan 1 test for test/LaunchTokenInvariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariant_allowancesFollowApprovalsAndGrossSpending\n[PASS] invariant_balancesFollowFivePercentFeeLedger\n[PASS] invariant_fixedSupplyEqualsAllBalances\n LaunchTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------+---------------------+-------+---------+----------╮\n| Contract    | Selector            | Calls | Reverts | Discards |\n+================================================================+\n| DrimHandler | approve             | 4119  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | forbiddenAdminCall  | 4145  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectOverdraw      | 4051  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectUnderapproved | 4110  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroReceiver  | 4172  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroSpender   | 4048  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transfer            | 4114  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transferFrom        | 4009  | 0       | 0        |\n╰-------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129639946\n  Bound result 15\n  Bound result 1\n  Bound result 14\n  Bound result 120209876281281145568259944\n  Bound result 1451\n  Bound result 5\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129644930\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129640003\n  Bound result 7\n  Bound result 15\n  Bound result 88890432868781143588557947089272320914155976560535201396883458002718194022656\n  Bound result 39999999999996\n  Bound result 51966\n  Bound result 3660899073149065141896531644223696799596811674139047011153497054374543\n  Bound result 115792089237316195423570985008687907853269984665640564039457584004913129640589\n  Bound result 118\n  Bound result 39999999999986\n  Bound result 9237265832753279940057713130\n  Bound result 841350\n  Bound result 115792089237316195423570985008687907853269984665640564039457584004913129639913\n  Bound result 51966\n  Bound result 16407193335225\n  Bound result 1147\n  Bound result 0\n  Bound result 2\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129592365\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129691917\n  Bound result 2296\n  Bound result 1001\n  Bound result 115792089237316195423570985008687907853269984665640564039457583969917086003511\n  Bound result 500000\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129648776\n  Bound result 7534\n  Bound result 6604\n  Bound result 471599145202696153846775011318792426147077669983915088891367328\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129639979\n  Bound result 20455470816809\n  Bound result 15727\n  Bound result 255\n  Bound result 38\n  Bound result 1889494498295\n  Bound result 115792089237316195423570985008687907853269984665640564039457583983818655010904\n  Bound result 6\n  Bound result 1990\n  Bound result 5\n  Bound result 580501915325348\n  Bound result 1042779000041052792055317123801488683338659932099665234981778606179489127572\n  Bound result 19000000049592\n  Bound result 2118\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.79s (13.77s CPU time)\n\nRan 3 test suites in 13.79s (14.01s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":35,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":110,\"VALIDATION.md\":49,\"foundry.toml\":22,\"launch.json\":17,\"src/LaunchToken.sol\":42,\"test/LaunchToken.t.sol\":454,\"test/LaunchTokenAdversarial.t.sol\":192,\"test/LaunchTokenInvariant.t.sol\":232,\"test/README.md\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4f3584ee5a7a421468291b3ba3161f571941ea09781a09af394e1ffb11a2231c","verifiedTreeHash":"165cb860760fdc446d4bdbc2adaf6ce3d048080b","verifierVersion":"0.1.0+4ec1a4b6"},{"checks":[{"durationMs":1467,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.35s\nCompiler run successful!\n","passed":true},{"durationMs":13653,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/LaunchTokenAdversarial.t.sol:LaunchTokenAdversarialTest\n[PASS] testFuzzAllowanceReplacementAndRevocationAreIsolated(uint256,uint256,uint256) (runs: 1000, μ: 428897, ~: 434942)\nLogs:\n  Bound result 1027840013096\n  Bound result 1084902\n  Bound result 2\n\n[PASS] testFuzzDirectAndDelegatedTransfersAgreeForOverlappingAddresses(address,address,address,uint256,uint8) (runs: 1000, μ: 265096, ~: 271689)\nLogs:\n  Bound result 51966\n  Bound result 1\n  Bound result 1346\n  Bound result 278\n\n[PASS] testFuzzSpentAllowanceCannotBeReused(uint256,uint256) (runs: 1000, μ: 398245, ~: 404230)\nLogs:\n  Bound result 7055051114846\n  Bound result 6932389605001\n\n[PASS] testMaximumDelegatedAmountRevertsWithoutChangingInfiniteAllowance() (gas: 132655)\n[PASS] testValueAttachedToValidCallsRevertsWithoutChangingTokenState() (gas: 514288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 101.55ms (254.68ms CPU time)\n\nRan 34 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApproveEmitsAndCanReplaceOrRevokeAllowance() (gas: 192280)\n[PASS] testApproveFromZeroReverts() (gas: 30941)\n[PASS] testApproveZeroSpenderReverts() (gas: 37796)\n[PASS] testConstructorMintsWholeSupplyToItsImmediateDeployer() (gas: 36777)\n[PASS] testDelegatedSelfTransferConsumesGrossAllowance() (gas: 138813)\n[PASS] testDelegatedTreasuryTransferConsumesGrossAllowance() (gas: 194317)\n[PASS] testEntireSupplyCanBeTransferred() (gas: 117498)\n[PASS] testFeeRoundingAtSmallestUnitBoundaries() (gas: 296668)\n[PASS] testFuzzInsufficientBalanceRollsBackDelegatedAllowance(uint256,uint256) (runs: 512, μ: 242493, ~: 246415)\nLogs:\n  Bound result 5364491501279\n  Bound result 383081643295389672673130802645311532406\n\n[PASS] testFuzzMixedTransfersMatchConservationModel(uint256,uint8) (runs: 512, μ: 1504877, ~: 1047159)\nLogs:\n  Bound result 3\n\n[PASS] testFuzzTransferRoundsFeeDownAndConservesSupply(uint256) (runs: 512, μ: 123298, ~: 126036)\nLogs:\n  Bound result 54578500251877\n\n[PASS] testMaximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 236012)\n[PASS] testMaximumTransferAmountRevertsWithoutArithmeticPanic() (gas: 61580)\n[PASS] testMetadataAndFixedSupply() (gas: 89554)\n[PASS] testNoMintPauseBurnFeeAdminOrUpgradeEntryPoints() (gas: 928671)\n[PASS] testRejectsEther() (gas: 36877)\n[PASS] testSelfTransferChargesFee() (gas: 90293)\n[PASS] testSelfTransferRequiresFullGrossBalance() (gas: 51241)\n[PASS] testTransferByZeroSenderReverts() (gas: 30956)\n[PASS] testTransferDeductsGrossAndEmitsFeeThenNet() (gas: 127653)\n[PASS] testTransferFromConsumesGrossAllowanceAndChargesSameFee() (gas: 191932)\n[PASS] testTransferFromDoesNotBypassAllowanceWhenCallerIsOwner() (gas: 33693)\n[PASS] testTransferFromRejectsMissingAllowance() (gas: 61955)\n[PASS] testTransferFromRequiresGrossAllowanceRatherThanNet() (gas: 119397)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 112018)\n[PASS] testTransferFromZeroSenderReverts() (gas: 33558)\n[PASS] testTransferToTreasuryCreditsBothLegs() (gas: 85246)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 82903)\n[PASS] testTreasurySelfTransferPreservesItsBalance() (gas: 110834)\n[PASS] testTreasurySelfTransferRequiresFullGrossBalance() (gas: 96203)\n[PASS] testTreasuryTransferRequiresFullGrossBalance() (gas: 106453)\n[PASS] testTreasuryTransferRetainsItsOwnFee() (gas: 151108)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmitsOneEvent() (gas: 81318)\n[PASS] testZeroTransferFromRequiresNoAllowance() (gas: 78480)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 101.69ms (264.62ms CPU time)\n\nRan 1 test for test/LaunchTokenInvariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariant_allowancesFollowApprovalsAndGrossSpending\n[PASS] invariant_balancesFollowFivePercentFeeLedger\n[PASS] invariant_fixedSupplyEqualsAllBalances\n LaunchTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------+---------------------+-------+---------+----------╮\n| Contract    | Selector            | Calls | Reverts | Discards |\n+================================================================+\n| DrimHandler | approve             | 4062  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | forbiddenAdminCall  | 4067  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectOverdraw      | 3982  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectUnderapproved | 4194  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroReceiver  | 4149  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroSpender   | 4138  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transfer            | 4062  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transferFrom        | 4114  | 0       | 0        |\n╰-------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129640051\n  Bound result 0\n  Bound result 18999999999999\n  Bound result 26835360508234831185930\n  Bound result 44982009266793\n  Bound result 0\n  Bound result 40000000000000\n  Bound result 1000000000000000000\n  Bound result 5731\n  Bound result 7\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129640077\n  Bound result 672911658990\n  Bound result 0\n  Bound result 776\n  Bound result 114\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 118\n  Bound result 9\n  Bound result 1264811663\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129643022\n  Bound result 0\n  Bound result 255\n  Bound result 110\n  Bound result 14897816666465\n  Bound result 250\n  Bound result 500\n  Bound result 10\n  Bound result 255\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988916525362978\n  Bound result 115792089237316195423570985008687907853269984665640564039457583969918252666779\n  Bound result 23530521609413\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 1860\n  Bound result 659918\n  Bound result 1\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129013944\n  Bound result 500000\n  Bound result 21141434536116\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.56s (13.55s CPU time)\n\nRan 3 test suites in 13.56s (13.76s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":45,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":110,\"VALIDATION.md\":49,\"foundry.toml\":22,\"launch.json\":17,\"src/LaunchToken.sol\":42,\"test/LaunchToken.t.sol\":454,\"test/LaunchTokenAdversarial.t.sol\":192,\"test/LaunchTokenInvariant.t.sol\":232,\"test/README.md\":67},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4f757ae4fcb229750d89d9a81cda2095287ced1bb173bef9272eee3e2cf601e6","verifiedTreeHash":"9de042cfa0312bf367abe64bb5a915ad2212cbd9","verifierVersion":"0.1.0+4ec1a4b6"},{"checks":[{"durationMs":5122,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 4.64s\nCompiler run successful!\n","passed":true},{"durationMs":34987,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/LaunchTokenAdversarial.t.sol:LaunchTokenAdversarialTest\n[PASS] testFuzzAllowanceReplacementAndRevocationAreIsolated(uint256,uint256,uint256) (runs: 1000, μ: 429789, ~: 434990)\nLogs:\n  Bound result 23429998051618\n  Bound result 12885623727869\n  Bound result 3348149083822\n\n[PASS] testFuzzDirectAndDelegatedTransfersAgreeForOverlappingAddresses(address,address,address,uint256,uint8) (runs: 1000, μ: 263837, ~: 271661)\nLogs:\n  Bound result 53\n  Bound result 10801\n  Bound result 6446\n  Bound result 7\n\n[PASS] testFuzzSpentAllowanceCannotBeReused(uint256,uint256) (runs: 1000, μ: 398158, ~: 404230)\nLogs:\n  Bound result 35323582370857\n  Bound result 6512814918517\n\n[PASS] testMaximumDelegatedAmountRevertsWithoutChangingInfiniteAllowance() (gas: 132655)\n[PASS] testValueAttachedToValidCallsRevertsWithoutChangingTokenState() (gas: 514288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 164.96ms (443.83ms CPU time)\n\nRan 34 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApproveEmitsAndCanReplaceOrRevokeAllowance() (gas: 192280)\n[PASS] testApproveFromZeroReverts() (gas: 30941)\n[PASS] testApproveZeroSpenderReverts() (gas: 37796)\n[PASS] testConstructorMintsWholeSupplyToItsImmediateDeployer() (gas: 36777)\n[PASS] testDelegatedSelfTransferConsumesGrossAllowance() (gas: 138813)\n[PASS] testDelegatedTreasuryTransferConsumesGrossAllowance() (gas: 194317)\n[PASS] testEntireSupplyCanBeTransferred() (gas: 117498)\n[PASS] testFeeRoundingAtSmallestUnitBoundaries() (gas: 296668)\n[PASS] testFuzzInsufficientBalanceRollsBackDelegatedAllowance(uint256,uint256) (runs: 512, μ: 242941, ~: 246468)\nLogs:\n  Bound result 746171914181\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n\n[PASS] testFuzzMixedTransfersMatchConservationModel(uint256,uint8) (runs: 512, μ: 1528520, ~: 1041346)\nLogs:\n  Bound result 3\n\n[PASS] testFuzzTransferRoundsFeeDownAndConservesSupply(uint256) (runs: 512, μ: 123096, ~: 126608)\nLogs:\n  Bound result 18191\n\n[PASS] testMaximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 236012)\n[PASS] testMaximumTransferAmountRevertsWithoutArithmeticPanic() (gas: 61580)\n[PASS] testMetadataAndFixedSupply() (gas: 89554)\n[PASS] testNoMintPauseBurnFeeAdminOrUpgradeEntryPoints() (gas: 928671)\n[PASS] testRejectsEther() (gas: 36877)\n[PASS] testSelfTransferChargesFee() (gas: 90293)\n[PASS] testSelfTransferRequiresFullGrossBalance() (gas: 51241)\n[PASS] testTransferByZeroSenderReverts() (gas: 30956)\n[PASS] testTransferDeductsGrossAndEmitsFeeThenNet() (gas: 127653)\n[PASS] testTransferFromConsumesGrossAllowanceAndChargesSameFee() (gas: 191932)\n[PASS] testTransferFromDoesNotBypassAllowanceWhenCallerIsOwner() (gas: 33693)\n[PASS] testTransferFromRejectsMissingAllowance() (gas: 61955)\n[PASS] testTransferFromRequiresGrossAllowanceRatherThanNet() (gas: 119397)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 112018)\n[PASS] testTransferFromZeroSenderReverts() (gas: 33558)\n[PASS] testTransferToTreasuryCreditsBothLegs() (gas: 85246)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 82903)\n[PASS] testTreasurySelfTransferPreservesItsBalance() (gas: 110834)\n[PASS] testTreasurySelfTransferRequiresFullGrossBalance() (gas: 96203)\n[PASS] testTreasuryTransferRequiresFullGrossBalance() (gas: 106453)\n[PASS] testTreasuryTransferRetainsItsOwnFee() (gas: 151108)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmitsOneEvent() (gas: 81318)\n[PASS] testZeroTransferFromRequiresNoAllowance() (gas: 78480)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 235.49ms (556.35ms CPU time)\n\nRan 1 test for test/LaunchTokenInvariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariant_allowancesFollowApprovalsAndGrossSpending\n[PASS] invariant_balancesFollowFivePercentFeeLedger\n[PASS] invariant_fixedSupplyEqualsAllBalances\n LaunchTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------+---------------------+-------+---------+----------╮\n| Contract    | Selector            | Calls | Reverts | Discards |\n+================================================================+\n| DrimHandler | approve             | 4087  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | forbiddenAdminCall  | 4168  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectOverdraw      | 4107  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectUnderapproved | 4095  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroReceiver  | 4117  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroSpender   | 4079  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transfer            | 4121  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transferFrom        | 3994  | 0       | 0        |\n╰-------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457583989000398431458\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129639949\n  Bound result 838\n  Bound result 100\n  Bound result 0\n  Bound result 1333\n  Bound result 11\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913341441407\n  Bound result 110\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129642770\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129646787\n  Bound result 4288053436\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129639975\n  Bound result 504\n  Bound result 0\n  Bound result 38\n  Bound result 6\n  Bound result 74552370519369\n  Bound result 4999999999995\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129639939\n  Bound result 14932969200260\n  Bound result 115792089237316195423570985008687907853269984665640564039457583989659778106404\n  Bound result 0\n  Bound result 491\n  Bound result 2009425214\n  Bound result 110\n  Bound result 1\n  Bound result 18253351539985\n  Bound result 1\n  Bound result 5882\n  Bound result 115792089237316195423570985008687907853269984665640564039457583950913129640430\n  Bound result 95\n  Bound result 1179\n  Bound result 1\n  Bound result 8\n  Bound result 6094\n  Bound result 190\n  Bound result 1\n  Bound result 9871843595954\n  Bound result 1\n  Bound result 110\n  Bound result 2145708716045\n  Bound result 279\n  Bound result 115792089237316195423570985008687907853269984665640564039457583989863139134379\n  Bound result 15\n  Bound result 11920634441666\n  Bound result 100000000000000\n  Bound result 31366589303714\n  Bound result 115792089237316195423570985008687907853269984665640564039457584001686575001722\n  Bound result 9393\n  Bound result 11700124198991\n  Bound result 19\n  Bound result 115792089237316195423570985008687907853269984665640564039457583980241295671178\n  Bound result 115792089237316195423570985008687907853269984665640564039457583978114869801397\n  Bound result 95\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 34.49s (34.48s CPU time)\n\nRan 3 test suites in 34.50s (34.89s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":138,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":110,\"VALIDATION.md\":49,\"foundry.toml\":22,\"launch.json\":17,\"src/LaunchToken.sol\":42,\"test/LaunchToken.t.sol\":454,\"test/LaunchTokenAdversarial.t.sol\":192,\"test/LaunchTokenInvariant.t.sol\":232,\"test/README.md\":75,\"test/proofs/LaunchPolicyConflictProof.sol.txt\":22},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"52bb395874d366a054f1eb51f1a892d6c6583b0f6ece6a4d3ed0c6a397cc0665","verifiedTreeHash":"01d18c15acd82ca926111cd19f0169a834b89228","verifierVersion":"0.1.0+4ec1a4b6"},{"checks":[{"durationMs":1618,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.47s\nCompiler run successful!\n","passed":true},{"durationMs":15866,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/LaunchTokenAdversarial.t.sol:LaunchTokenAdversarialTest\n[PASS] testFuzzAllowanceReplacementAndRevocationAreIsolated(uint256,uint256,uint256) (runs: 1000, μ: 429156, ~: 434870)\nLogs:\n  Bound result 24999999999997\n  Bound result 502692\n  Bound result 3879\n\n[PASS] testFuzzDirectAndDelegatedTransfersAgreeForOverlappingAddresses(address,address,address,uint256,uint8) (runs: 1000, μ: 266306, ~: 271688)\nLogs:\n  Bound result 186322300007022931820467391498692989247655884741\n  Bound result 1\n  Bound result 8773\n  Bound result 1519\n\n[PASS] testFuzzSpentAllowanceCannotBeReused(uint256,uint256) (runs: 1000, μ: 397654, ~: 404230)\nLogs:\n  Bound result 1\n  Bound result 0\n\n[PASS] testMaximumDelegatedAmountRevertsWithoutChangingInfiniteAllowance() (gas: 132655)\n[PASS] testValueAttachedToValidCallsRevertsWithoutChangingTokenState() (gas: 514288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 108.79ms (238.74ms CPU time)\n\nRan 34 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApproveEmitsAndCanReplaceOrRevokeAllowance() (gas: 192280)\n[PASS] testApproveFromZeroReverts() (gas: 30941)\n[PASS] testApproveZeroSpenderReverts() (gas: 37796)\n[PASS] testConstructorMintsWholeSupplyToItsImmediateDeployer() (gas: 36777)\n[PASS] testDelegatedSelfTransferConsumesGrossAllowance() (gas: 138813)\n[PASS] testDelegatedTreasuryTransferConsumesGrossAllowance() (gas: 194317)\n[PASS] testEntireSupplyCanBeTransferred() (gas: 117498)\n[PASS] testFeeRoundingAtSmallestUnitBoundaries() (gas: 296668)\n[PASS] testFuzzInsufficientBalanceRollsBackDelegatedAllowance(uint256,uint256) (runs: 512, μ: 242631, ~: 246474)\nLogs:\n  Bound result 9500000\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913120668196\n\n[PASS] testFuzzMixedTransfersMatchConservationModel(uint256,uint8) (runs: 512, μ: 1490247, ~: 1064938)\nLogs:\n  Bound result 4\n\n[PASS] testFuzzTransferRoundsFeeDownAndConservesSupply(uint256) (runs: 512, μ: 122781, ~: 126030)\nLogs:\n  Bound result 0\n\n[PASS] testMaximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 236012)\n[PASS] testMaximumTransferAmountRevertsWithoutArithmeticPanic() (gas: 61580)\n[PASS] testMetadataAndFixedSupply() (gas: 89554)\n[PASS] testNoMintPauseBurnFeeAdminOrUpgradeEntryPoints() (gas: 928671)\n[PASS] testRejectsEther() (gas: 36877)\n[PASS] testSelfTransferChargesFee() (gas: 90293)\n[PASS] testSelfTransferRequiresFullGrossBalance() (gas: 51241)\n[PASS] testTransferByZeroSenderReverts() (gas: 30956)\n[PASS] testTransferDeductsGrossAndEmitsFeeThenNet() (gas: 127653)\n[PASS] testTransferFromConsumesGrossAllowanceAndChargesSameFee() (gas: 191932)\n[PASS] testTransferFromDoesNotBypassAllowanceWhenCallerIsOwner() (gas: 33693)\n[PASS] testTransferFromRejectsMissingAllowance() (gas: 61955)\n[PASS] testTransferFromRequiresGrossAllowanceRatherThanNet() (gas: 119397)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 112018)\n[PASS] testTransferFromZeroSenderReverts() (gas: 33558)\n[PASS] testTransferToTreasuryCreditsBothLegs() (gas: 85246)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 82903)\n[PASS] testTreasurySelfTransferPreservesItsBalance() (gas: 110834)\n[PASS] testTreasurySelfTransferRequiresFullGrossBalance() (gas: 96203)\n[PASS] testTreasuryTransferRequiresFullGrossBalance() (gas: 106453)\n[PASS] testTreasuryTransferRetainsItsOwnFee() (gas: 151108)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmitsOneEvent() (gas: 81318)\n[PASS] testZeroTransferFromRequiresNoAllowance() (gas: 78480)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 127.38ms (386.88ms CPU time)\n\nRan 1 test for test/LaunchTokenInvariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariant_allowancesFollowApprovalsAndGrossSpending\n[PASS] invariant_balancesFollowFivePercentFeeLedger\n[PASS] invariant_fixedSupplyEqualsAllBalances\n LaunchTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------+---------------------+-------+---------+----------╮\n| Contract    | Selector            | Calls | Reverts | Discards |\n+================================================================+\n| DrimHandler | approve             | 4084  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | forbiddenAdminCall  | 4053  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectOverdraw      | 4258  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectUnderapproved | 3982  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroReceiver  | 4041  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroSpender   | 4266  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transfer            | 4041  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transferFrom        | 4043  | 0       | 0        |\n╰-------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 39\n  Bound result 947\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913130139937\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129639970\n  Bound result 21\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988915363265684\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913286838217\n  Bound result 10349\n  Bound result 113\n  Bound result 39999999999980\n  Bound result 2118\n  Bound result 39999999999981\n  Bound result 13493159930121\n  Bound result 6302\n  Bound result 115792089237316195423570985008687907853269984665640564039457584004913129640095\n  Bound result 115792089237316195423570985008687907853269984665640564039457584004913129648632\n  Bound result 427092476984079901652745127262760854111966159426071308201720003877868568752\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n  Bound result 4343\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129651101\n  Bound result 9121\n  Bound result 56999999995832\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129640065\n  Bound result 4797\n  Bound result 39\n  Bound result 15850083166485\n  Bound result 1846\n  Bound result 8624\n  Bound result 5169\n  Bound result 1\n  Bound result 1669899611078875831886457\n  Bound result 51966\n  Bound result 8431\n  Bound result 20\n  Bound result 115792089237316195423570985008687907853269984665640564039457583953763139143937\n  Bound result 115792089237316195423570985008687907853269984665640564039457583953763129650015\n  Bound result 54149999995999\n  Bound result 6\n  Bound result 115792089237316195423570985008687907853269984665640564039457584000063129642392\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129644140\n  Bound result 288086609864563274585542206030062650676\n  Bound result 8951266783078425393089939092338842940827619898283965530953593794\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 15.77s (15.77s CPU time)\n\nRan 3 test suites in 15.77s (16.01s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":39,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":110,\"VALIDATION.md\":49,\"foundry.toml\":22,\"src/LaunchToken.sol\":42,\"test/LaunchToken.t.sol\":454,\"test/LaunchTokenAdversarial.t.sol\":192,\"test/LaunchTokenInvariant.t.sol\":232,\"test/README.md\":75,\"test/proofs/LaunchPolicyConflictProof.sol.txt\":22},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"775a9ca64a411b2fdd1f24476ca599371cc7cc4ff535ff0e3889eb1f22c06b59","verifiedTreeHash":"96c0fa7a76f0d9ad25f7447643e4f0b853c109a4","verifierVersion":"0.1.0+4ec1a4b6"},{"checks":[{"durationMs":1343,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.25s\nCompiler run successful!\n","passed":true},{"durationMs":13048,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/LaunchTokenAdversarial.t.sol:LaunchTokenAdversarialTest\n[PASS] testFuzzAllowanceReplacementAndRevocationAreIsolated(uint256,uint256,uint256) (runs: 1000, μ: 429956, ~: 434966)\nLogs:\n  Bound result 4\n  Bound result 9156\n  Bound result 3\n\n[PASS] testFuzzDirectAndDelegatedTransfersAgreeForOverlappingAddresses(address,address,address,uint256,uint8) (runs: 1000, μ: 266041, ~: 271719)\nLogs:\n  Bound result 464670998284551156948214153555865068818795782503\n  Bound result 735666657250047352353417658117876387457048466719\n  Bound result 715369174534442968219456329984502879120509564461\n  Bound result 99999999999997\n\n[PASS] testFuzzSpentAllowanceCannotBeReused(uint256,uint256) (runs: 1000, μ: 398521, ~: 404230)\nLogs:\n  Bound result 8653467622174\n  Bound result 13834\n\n[PASS] testMaximumDelegatedAmountRevertsWithoutChangingInfiniteAllowance() (gas: 132655)\n[PASS] testValueAttachedToValidCallsRevertsWithoutChangingTokenState() (gas: 514288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 76.64ms (194.93ms CPU time)\n\nRan 34 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApproveEmitsAndCanReplaceOrRevokeAllowance() (gas: 192280)\n[PASS] testApproveFromZeroReverts() (gas: 30941)\n[PASS] testApproveZeroSpenderReverts() (gas: 37796)\n[PASS] testConstructorMintsWholeSupplyToItsImmediateDeployer() (gas: 36777)\n[PASS] testDelegatedSelfTransferConsumesGrossAllowance() (gas: 138813)\n[PASS] testDelegatedTreasuryTransferConsumesGrossAllowance() (gas: 194317)\n[PASS] testEntireSupplyCanBeTransferred() (gas: 117498)\n[PASS] testFeeRoundingAtSmallestUnitBoundaries() (gas: 296668)\n[PASS] testFuzzInsufficientBalanceRollsBackDelegatedAllowance(uint256,uint256) (runs: 512, μ: 243025, ~: 246515)\nLogs:\n  Bound result 1000\n  Bound result 13943\n\n[PASS] testFuzzMixedTransfersMatchConservationModel(uint256,uint8) (runs: 512, μ: 1523410, ~: 1037154)\nLogs:\n  Bound result 15\n\n[PASS] testFuzzTransferRoundsFeeDownAndConservesSupply(uint256) (runs: 512, μ: 123443, ~: 126036)\nLogs:\n  Bound result 27700789637470\n\n[PASS] testMaximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 236012)\n[PASS] testMaximumTransferAmountRevertsWithoutArithmeticPanic() (gas: 61580)\n[PASS] testMetadataAndFixedSupply() (gas: 89554)\n[PASS] testNoMintPauseBurnFeeAdminOrUpgradeEntryPoints() (gas: 928671)\n[PASS] testRejectsEther() (gas: 36877)\n[PASS] testSelfTransferChargesFee() (gas: 90293)\n[PASS] testSelfTransferRequiresFullGrossBalance() (gas: 51241)\n[PASS] testTransferByZeroSenderReverts() (gas: 30956)\n[PASS] testTransferDeductsGrossAndEmitsFeeThenNet() (gas: 127653)\n[PASS] testTransferFromConsumesGrossAllowanceAndChargesSameFee() (gas: 191932)\n[PASS] testTransferFromDoesNotBypassAllowanceWhenCallerIsOwner() (gas: 33693)\n[PASS] testTransferFromRejectsMissingAllowance() (gas: 61955)\n[PASS] testTransferFromRequiresGrossAllowanceRatherThanNet() (gas: 119397)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 112018)\n[PASS] testTransferFromZeroSenderReverts() (gas: 33558)\n[PASS] testTransferToTreasuryCreditsBothLegs() (gas: 85246)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 82903)\n[PASS] testTreasurySelfTransferPreservesItsBalance() (gas: 110834)\n[PASS] testTreasurySelfTransferRequiresFullGrossBalance() (gas: 96203)\n[PASS] testTreasuryTransferRequiresFullGrossBalance() (gas: 106453)\n[PASS] testTreasuryTransferRetainsItsOwnFee() (gas: 151108)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmitsOneEvent() (gas: 81318)\n[PASS] testZeroTransferFromRequiresNoAllowance() (gas: 78480)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 87.79ms (241.44ms CPU time)\n\nRan 1 test for test/LaunchTokenInvariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariant_allowancesFollowApprovalsAndGrossSpending\n[PASS] invariant_balancesFollowFivePercentFeeLedger\n[PASS] invariant_fixedSupplyEqualsAllBalances\n LaunchTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------+---------------------+-------+---------+----------╮\n| Contract    | Selector            | Calls | Reverts | Discards |\n+================================================================+\n| DrimHandler | approve             | 4219  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | forbiddenAdminCall  | 4016  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectOverdraw      | 4144  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectUnderapproved | 4153  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroReceiver  | 4062  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroSpender   | 4051  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transfer            | 4136  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transferFrom        | 3987  | 0       | 0        |\n╰-------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 12812645692254976492858658498630923938142391962648449641103\n  Bound result 17\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129641897\n  Bound result 0\n  Bound result 3087\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129643732\n  Bound result 95\n  Bound result 1987\n  Bound result 190\n  Bound result 2478893114\n  Bound result 2004981286265932242795570564411282872634911109570593511689\n  Bound result 118\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129639975\n  Bound result 212\n  Bound result 1001\n  Bound result 3362\n  Bound result 15\n  Bound result 2690\n  Bound result 51966\n  Bound result 115792089237316195423570985008687907853269984665640564039457584003963129647114\n  Bound result 345750933714083806736908924748419502971414905\n  Bound result 12745366798850\n  Bound result 0\n  Bound result 2021045399879\n  Bound result 110\n  Bound result 11\n  Bound result 17286727428330\n  Bound result 500\n  Bound result 255\n  Bound result 0\n  Bound result 5087\n  Bound result 0\n  Bound result 7119165334900\n  Bound result 39999999941727\n  Bound result 1461501637330902918203684832716283019655932542975\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129707156\n  Bound result 1693\n  Bound result 947\n  Bound result 12849642243629\n  Bound result 9935\n  Bound result 4762\n  Bound result 46\n  Bound result 118\n  Bound result 1477546420597505782895666582463\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.97s (12.97s CPU time)\n\nRan 3 test suites in 12.97s (13.14s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":32,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":110,\"VALIDATION.md\":49,\"foundry.toml\":22,\"src/LaunchToken.sol\":42,\"test/LaunchToken.t.sol\":454,\"test/LaunchTokenAdversarial.t.sol\":192,\"test/LaunchTokenInvariant.t.sol\":232,\"test/README.md\":57},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"90a6a6a432c710e41ad33bbb2d67780d2f0a6e97fa171b02ed3b9420f4c602cf","verifiedTreeHash":"3fcf8b909f83f60a688b1fe288f26ab50a8b94c5","verifierVersion":"0.1.0+4ec1a4b6"},{"checks":[{"durationMs":1352,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.25s\nCompiler run successful!\n","passed":true},{"durationMs":13044,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/LaunchTokenAdversarial.t.sol:LaunchTokenAdversarialTest\n[PASS] testFuzzAllowanceReplacementAndRevocationAreIsolated(uint256,uint256,uint256) (runs: 1000, μ: 428988, ~: 434871)\nLogs:\n  Bound result 2180466726634\n  Bound result 7761628406873\n  Bound result 883931071300\n\n[PASS] testFuzzDirectAndDelegatedTransfersAgreeForOverlappingAddresses(address,address,address,uint256,uint8) (runs: 1000, μ: 267502, ~: 271839)\nLogs:\n  Bound result 297235226784912843657808461769003073011033728321\n  Bound result 13938511954234287763554615046813412328663482737\n  Bound result 506614116951361144205492722279129547403817898186\n  Bound result 88004347963549\n\n[PASS] testFuzzSpentAllowanceCannotBeReused(uint256,uint256) (runs: 1000, μ: 397467, ~: 404230)\nLogs:\n  Bound result 12\n  Bound result 1\n\n[PASS] testMaximumDelegatedAmountRevertsWithoutChangingInfiniteAllowance() (gas: 132655)\n[PASS] testValueAttachedToValidCallsRevertsWithoutChangingTokenState() (gas: 514288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 98.33ms (250.00ms CPU time)\n\nRan 34 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testApproveEmitsAndCanReplaceOrRevokeAllowance() (gas: 192280)\n[PASS] testApproveFromZeroReverts() (gas: 30941)\n[PASS] testApproveZeroSpenderReverts() (gas: 37796)\n[PASS] testConstructorMintsWholeSupplyToItsImmediateDeployer() (gas: 36777)\n[PASS] testDelegatedSelfTransferConsumesGrossAllowance() (gas: 138813)\n[PASS] testDelegatedTreasuryTransferConsumesGrossAllowance() (gas: 194317)\n[PASS] testEntireSupplyCanBeTransferred() (gas: 117498)\n[PASS] testFeeRoundingAtSmallestUnitBoundaries() (gas: 296668)\n[PASS] testFuzzInsufficientBalanceRollsBackDelegatedAllowance(uint256,uint256) (runs: 512, μ: 242155, ~: 246414)\nLogs:\n  Bound result 8012\n  Bound result 45433211334271819566122547556099940521847101122959621350218929334577897930763\n\n[PASS] testFuzzMixedTransfersMatchConservationModel(uint256,uint8) (runs: 512, μ: 1660440, ~: 1350787)\nLogs:\n  Bound result 32\n\n[PASS] testFuzzTransferRoundsFeeDownAndConservesSupply(uint256) (runs: 512, μ: 122362, ~: 126012)\nLogs:\n  Bound result 125\n\n[PASS] testMaximumAllowanceRemainsUnchangedAcrossTransfers() (gas: 236012)\n[PASS] testMaximumTransferAmountRevertsWithoutArithmeticPanic() (gas: 61580)\n[PASS] testMetadataAndFixedSupply() (gas: 89554)\n[PASS] testNoMintPauseBurnFeeAdminOrUpgradeEntryPoints() (gas: 928671)\n[PASS] testRejectsEther() (gas: 36877)\n[PASS] testSelfTransferChargesFee() (gas: 90293)\n[PASS] testSelfTransferRequiresFullGrossBalance() (gas: 51241)\n[PASS] testTransferByZeroSenderReverts() (gas: 30956)\n[PASS] testTransferDeductsGrossAndEmitsFeeThenNet() (gas: 127653)\n[PASS] testTransferFromConsumesGrossAllowanceAndChargesSameFee() (gas: 191932)\n[PASS] testTransferFromDoesNotBypassAllowanceWhenCallerIsOwner() (gas: 33693)\n[PASS] testTransferFromRejectsMissingAllowance() (gas: 61955)\n[PASS] testTransferFromRequiresGrossAllowanceRatherThanNet() (gas: 119397)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 112018)\n[PASS] testTransferFromZeroSenderReverts() (gas: 33558)\n[PASS] testTransferToTreasuryCreditsBothLegs() (gas: 85246)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 82903)\n[PASS] testTreasurySelfTransferPreservesItsBalance() (gas: 110834)\n[PASS] testTreasurySelfTransferRequiresFullGrossBalance() (gas: 96203)\n[PASS] testTreasuryTransferRequiresFullGrossBalance() (gas: 106453)\n[PASS] testTreasuryTransferRetainsItsOwnFee() (gas: 151108)\n[PASS] testZeroTransferFromEmptyAccountSucceedsAndEmitsOneEvent() (gas: 81318)\n[PASS] testZeroTransferFromRequiresNoAllowance() (gas: 78480)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 99.39ms (225.95ms CPU time)\n\nRan 1 test for test/LaunchTokenInvariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariant_allowancesFollowApprovalsAndGrossSpending\n[PASS] invariant_balancesFollowFivePercentFeeLedger\n[PASS] invariant_fixedSupplyEqualsAllBalances\n LaunchTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------+---------------------+-------+---------+----------╮\n| Contract    | Selector            | Calls | Reverts | Discards |\n+================================================================+\n| DrimHandler | approve             | 4027  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | forbiddenAdminCall  | 4151  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectOverdraw      | 4078  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectUnderapproved | 4109  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroReceiver  | 4129  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | rejectZeroSpender   | 4156  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transfer            | 4052  | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| DrimHandler | transferFrom        | 4066  | 0       | 0        |\n╰-------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 659918\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129639940\n  Bound result 19000000000003\n  Bound result 115792089237316195423570985008687907853269984665640564039457583967913129640935\n  Bound result 9622\n  Bound result 9932745766170341187912240815513380983224436011\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129640343\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129693217\n  Bound result 899\n  Bound result 60210968887663312129599761285456812491594534543731253913587638280294501\n  Bound result 0\n  Bound result 125813996375599159817140963330240011258305308995328\n  Bound result 4637\n  Bound result 255\n  Bound result 44218732715639929789144682896811657927\n  Bound result 319481992681362346511486203\n  Bound result 1\n  Bound result 0\n  Bound result 13726305696571\n  Bound result 826074472\n  Bound result 0\n  Bound result 0\n  Bound result 20\n  Bound result 2\n  Bound result 3000000000030\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129646216\n  Bound result 39999999999977\n  Bound result 6648\n  Bound result 1\n  Bound result 26441712143765285297310947921318673951989296094766887\n  Bound result 1551\n  Bound result 10000000\n  Bound result 0\n  Bound result 20\n  Bound result 4294967295\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129649934\n  Bound result 0\n  Bound result 18115966315504\n  Bound result 7\n  Bound result 0\n  Bound result 20\n  Bound result 0\n  Bound result 7401\n  Bound result 38\n  Bound result 19\n  Bound result 1242826417\n  Bound result 17563912666344\n  Bound result 59\n  Bound result 439\n  Bound result 18\n  Bound result 100000000000000\n  Bound result 17\n  Bound result 115792089237316195423570985008687907853269984665640564039457583988913129640032\n  Bound result 974\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.97s (12.96s CPU time)\n\nRan 3 test suites in 12.97s (13.16s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":34,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":110,\"VALIDATION.md\":49,\"foundry.toml\":22,\"src/LaunchToken.sol\":42,\"test/LaunchToken.t.sol\":454,\"test/LaunchTokenAdversarial.t.sol\":192,\"test/LaunchTokenInvariant.t.sol\":232,\"test/README.md\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ecced9298138b2ec1f0bb6e617e137e217ac2085527c9eedc7cfdcef31ca5f33","verifiedTreeHash":"9688e96ec868c7d225afc4c96bee5379b635c701","verifierVersion":"0.1.0+4ec1a4b6"}]}