{"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":"d0e674d5-d905-40db-96ba-3629b5e917b6","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"712f6b8e42acaa97c22f65234f44555eb5fa4f61e27f777b864c3340b93cb2dc","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"c42c001dbbf2201c3ef60cedd9c3b753b3f5d4a9290fe7c6b0bb57c91da589cf","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"f2d0f9635d13eaa29fea704b599f5c31f16e5c62099a8b313abc6d282c9db76d","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"ad44a2fdbdcdf16f5e60d71df57774a8b1326b1ef2ab1febe13486e4781ccef2","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"272ae0cf9a7b1a809ebc657d767e11e41d0676b5733911d5276c4f4eeb758d53","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"8cf1383ed7a5d2c82e8342e22943771482cda6979a0d1f497e0652eb315ec81d","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"493ae51f31bbf70a71f84314f3615501bba698806569cca6b7bd293cef025b77","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"9a58eb5e63f2564cb7607a403b52516fa699277416544aad546e778e4e71d160","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: BIT (BIT).\nToken name: BIT\nToken symbol: BIT\nToken supply: 100,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"0d67b14e67d96bc26bfefe513e8090fa06078eba426cd31fa911432ea75a4505","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"d0e674d5-d905-40db-96ba-3629b5e917b6","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1839-bit"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52222","feedbackHash":"27e6050e8b2f760c7320585b08df94aa4db6717fd735a793beb36558e12a5c3f","nodeKey":"audit_economics","submissionHash":"712f6b8e42acaa97c22f65234f44555eb5fa4f61e27f777b864c3340b93cb2dc","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52419","feedbackHash":"971215e9d06452d934a28f52f7ad48477643ba4822f3086cf547d83400f4080d","nodeKey":"audit_flow","submissionHash":"c42c001dbbf2201c3ef60cedd9c3b753b3f5d4a9290fe7c6b0bb57c91da589cf","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52165","feedbackHash":"31bc98792e4b4a681bdf21f1b172183185ca1eb4cf5104e43778dba6fbbb6040","nodeKey":"audit_judge","submissionHash":"f2d0f9635d13eaa29fea704b599f5c31f16e5c62099a8b313abc6d282c9db76d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51881","feedbackHash":"a85788294e9a28cd0a0a61fa92c4a4358bd360db607f0339b4c6ff843c124f89","nodeKey":"audit_math","submissionHash":"ad44a2fdbdcdf16f5e60d71df57774a8b1326b1ef2ab1febe13486e4781ccef2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52598","feedbackHash":"a31f5e5ea3a17d18f9690b590778e4cb26dafc023e526c5e662191e7ff0b7aa0","nodeKey":"audit_permissions","submissionHash":"272ae0cf9a7b1a809ebc657d767e11e41d0676b5733911d5276c4f4eeb758d53","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52206","feedbackHash":"10e13c289dc2bc34aad1ca5a5b7451d2e99cab9c42e11fbcffe6923455ab019d","nodeKey":"build_contract_project","submissionHash":"8cf1383ed7a5d2c82e8342e22943771482cda6979a0d1f497e0652eb315ec81d","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51882","feedbackHash":"1cbb0c82db0a4fcb3263ea92186b66587fe617e636d98546c7aa1eaf1b7b38e9","nodeKey":"manifest","submissionHash":"493ae51f31bbf70a71f84314f3615501bba698806569cca6b7bd293cef025b77","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51878","feedbackHash":"2f62b574c60b7303bbd441c73e86236697cb05f3ae2627e26a50ed328e7db9cc","nodeKey":"write_foundry_tests","submissionHash":"9a58eb5e63f2564cb7607a403b52516fa699277416544aad546e778e4e71d160","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"4683b42581fd6c0cb4a46d210e4476704c7c5c86d87e2655674af737c4c72f75","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2b170a76e3d9adca","findings":[],"hash":"272ae0cf9a7b1a809ebc657d767e11e41d0676b5733911d5276c4f4eeb758d53","nodeId":"8e672212-5ee1-4a93-aff7-6a1f2b93cd54","outcome":"completed","summary":"The review is complete with no defects found. The findings file is written and the tree is otherwise unchanged.\n\n**Result: no findings.** The token is a 15-line fixed-supply ERC-20 with no privileged role, so the Access Control, Trust Gap and Asymmetry guides have nothing to bite on. Every failure mode in those guides was checked against the code and none is reachable.\n\nWhat I verified:\n\n- **Permission model.** The compiled ABI has exactly three state-changing entry points, approve, transfer and transferFrom, all scoped to msg.sender. There is no owner, minter, pauser, blacklist, burn, upgrade, receive or fallback. Twenty probed admin selectors revert identically for the deployer and a stranger.\n- **Trust gap.** The deployer holds the whole supply after construction, which is the factory under launchCustom. It has no power over any other holder: a transferFrom from the deployer with zero allowance reverts and the holder's balance is unchanged.\n- **Asymmetry.** transfer and transferFrom write the same storage in mirror directions, move exactly the requested value, and share one revert path. Finite allowances decrement exactly and the max allowance is untouched.\n- **Supply.** totalSupply is written only when from or to is the zero address, which the public transfer paths reject, so it is fixed after the constructor.\n- **Library provenance.** All five vendored OpenZeppelin files are byte-identical to the pinned v5.0.2 commit in DEPENDENCIES.json.\n- **Tests.** The full suite passes with the README seed, 34 unit and fuzz tests plus 2 invariants over 8,192 handler calls with zero reverts. My scratch test of the access surface passed 5 of 5 and was removed afterwards.\n\nStatic-analysis leads were both dead ends. Slither reported nothing. Aderyn's large-literal note at line 10 of the token is a style remark on an expression that evaluates to exactly the stated supply.\n\nThe findings file holds an empty findings list, nine coverage rows marked holds for the three entry points, the constructor and five invariants, and a notes field recording scope, methods and the one thing I could not check. That gap is launch.json, which does not exist yet in this tree, so manifest consistency was checked only against the README's stated values, all of which match the compiled artifact.","treeHash":null,"usage":{"cachedInputTokens":580498,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":9579,"runtime":"claude","turns":25,"wallClockMs":150399}},{"artifacts":[],"attempt":1,"bundleHash":"3d02943396cf2eb08213f292e32a2322caaecc7983129348ce7a582934325dad","device":"5c1e4764d4e20ef5","findings":[],"hash":"493ae51f31bbf70a71f84314f3615501bba698806569cca6b7bd293cef025b77","nodeId":"e40d6d3c-42f8-4253-a697-98f336004d11","outcome":"completed","summary":"I wrote launch.json for the BIT custom token launch. It is the only new file in the tree, and nothing else was changed.\n\n**What the manifest describes.** The accepted tree contains one contract, BIT in `src/BIT.sol`, which is a plain OpenZeppelin v5 ERC-20. Its constructor takes no arguments and mints the whole supply once to msg.sender. There are no application contracts. The manifest reflects that exactly:\n\n- kind is \"custom_token\", token.contract is BIT, name and symbol are BIT, decimals is 18.\n- constructorArgs is empty, matching the argument-free constructor.\n- totalSupply is the constructor's mint in minor units.\n- contracts is an empty list.\n- pool and economics are copied verbatim from the launch terms, with IMD as the paired currency, fee 12500, tick spacing 60 and the one-to-one provenance price.\n- notes describe the token's behaviour in about 1,300 characters, well under the limit.\n\n| Value | Written |\n| --- | --- |\n| totalSupply | 100000000000000000000000000 |\n| economics.poolBps | 8800 |\n| economics.initialMarketCapWei | 1000000000000000000000 |\n| economics.remainderTo | 0x0007b73c85c6b6e8a05fb612df6550219acb6946 |\n\n**Checks run.** A script parsed the file and asserted the exact key set, the supply arithmetic, the verbatim economics and pool objects, and the notes length. The build compiled cleanly. The full test suite with the verifier's fuzz seed passed all 35 tests. Git status shows launch.json as the only addition.","treeHash":"1477275407fdb7dcb56a6d1ab7a21a1fca59ea3a","usage":{"cachedInputTokens":182569,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3027,"runtime":"claude","turns":8,"wallClockMs":69284}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"357c46e3781993d4","findings":[{"citation":"resolved","description":"BIT inherits OpenZeppelin v5.0.2 ERC20 unchanged (vendored copy verified byte-identical to upstream commit dbb6104). approve() overwrites the allowance (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:291 `_allowances[owner][spender] = value;`) with no compare-and-set, and OZ v5 ships no increaseAllowance/decreaseAllowance or permit. A holder who 'lowers' a nonzero allowance to a new nonzero value can therefore lose old + new if the spender front-runs the second approve. This is the well-known ERC-20 standard property, not a defect introduced by this token, and README.md section 'After launch' already documents the approve(0)-first mitigation. Reported as informational trust note only; it is not a launch-floor blocker and no change to the agreed design is required. If the author wants to remove the hazard, the minimal preserving option is to add ERC20Permit (ERC-2612) so integrations use signed, nonce-bound approvals, or to add increase/decreaseAllowance helpers; neither changes supply, transfer rules or ownership.","line":9,"path":"src/BIT.sol","reproduction":"State: holder H owns >=150 BIT. 1) H calls approve(S, 100e18). 2) H broadcasts approve(S, 50e18) intending to reduce. 3) S observes the pending tx and first calls transferFrom(H, S, 100e18) -> succeeds (allowance 100e18 consumed). 4) H's approve(S, 50e18) mines. 5) S calls transferFrom(H, S, 50e18) -> succeeds. Actual: S moved 150e18 BIT. Expected by the holder: at most 100e18 (the larger of old/new). Confirmed with a scratch Foundry test (test_SpenderMovesOldPlusNew) that asserts balanceOf(sink) == 150e18 after this sequence; it passes on the current code, i.e. the behavior is present.","severity":"info","snippet":"contract BIT is ERC20 {","title":"Standard ERC-20 approve race: a spender acting between two approve() calls can move old + new allowance"}],"hash":"712f6b8e42acaa97c22f65234f44555eb5fa4f61e27f777b864c3340b93cb2dc","nodeId":"a60ade75-f883-458d-84c4-1505e8c0b658","outcome":"completed","summary":"The review is complete and the findings file is written. The tree is otherwise untouched.\n\n**Outcome: no economic, invariant or flow-gap defects found.** BIT is an unmodified OpenZeppelin v5.0.2 ERC-20 with a single constructor mint of 100,000,000 tokens at 18 decimals to the deployer. The file `.imd-findings.json` holds one informational note and nine coverage rows.\n\nWhat I verified:\n- **Vendored library integrity.** The five files under `lib/openzeppelin-contracts` were diffed byte-for-byte against the upstream commit pinned in DEPENDENCIES.json. They are identical, so there is no tampered accounting hidden in the dependency.\n- **Supply invariant.** The only mint is in the constructor. The compiled ABI exposes only approve, transfer and transferFrom as state-changing entry points. Total supply cannot grow or shrink after deployment.\n- **Conservation.** Every transfer debits and credits the same amount with no fee, burn or rebase. Transfers to the zero address revert, so no path reduces supply.\n- **Launch flows.** The factory, distributor, claimant and Uniswap v4 PoolManager legs all move exactly the requested amount. No exemption list is needed because nothing is taxed.\n- **Manifest agreement.** The constant equals the manifest supply in minor units, decimals are 18, and the constructor takes no arguments and makes no external calls.\n- **Build and tests.** The project compiles and all 35 tests plus both stateful invariants pass with the documented seed.\n\nThe one informational item is the standard ERC-20 approve race, where a spender acting between two approve calls can move the old plus the new allowance. I confirmed it with a scratch test and recorded the exact call sequence. It is inherent to the standard, is already documented in the README, and is not a launch-floor blocker. The note suggests ERC-2612 permit as an optional design-preserving mitigation.\n\nCoverage: all three listed entry points are marked `holds`, with six additional rows for the invariants, launch flows, dependency integrity and constructor parameters I checked. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":447102,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":10336,"runtime":"claude","turns":23,"wallClockMs":174012}},{"artifacts":[],"attempt":1,"bundleHash":"4bfaad2505bae48a77e15e98ade0e3504b8e441f36fa4bd51de106d4d33b3297","device":"cf3b0a0c089b1430","findings":[],"hash":"8cf1383ed7a5d2c82e8342e22943771482cda6979a0d1f497e0652eb315ec81d","nodeId":"6f2222fe-adfe-4be4-b950-12695598cdf0","outcome":"completed","summary":"Implemented BIT with 100,000,000 tokens, 18 decimals, minted once to the deployer. Included vendored dependencies, deployment documentation, and security notes.\n\nPassed `forge build`, seeded `forge test`, and `forge fmt --check`, including offline verification: 34 unit/fuzz tests and both invariants passed.\n\nProtected platform integration checks remain for the network verifier.","treeHash":"c33393ea899a4b55f5697d21d37f93a0d39ae84d","usage":{"cachedInputTokens":744704,"inputTokens":52008,"model":"gpt-6-astra","outputTokens":14961,"runtime":"codex","turns":5,"wallClockMs":474449}},{"artifacts":[],"attempt":1,"bundleHash":"eb3f8ac946f87425c85aeb34d0faa446417e59ccf5627e4a57253c5e2756d56b","device":"2a6239e0c1b8c774","findings":[],"hash":"9a58eb5e63f2564cb7607a403b52516fa699277416544aad546e778e4e71d160","nodeId":"c2cfa70d-37f9-4f6e-9799-4a5886418d9f","outcome":"completed","summary":"Done. The full suite passes with the verifier's seed and without it, and no defect was found in the token, so there is no findings file to write.\n\n**What I found.** The token in `src/BIT.sol` is an unmodified OpenZeppelin v5.0.2 ERC-20 with one constructor mint of 100,000,000 BIT to the deployer, no owner, and no mint, burn, pause or upgrade path. I read it adversarially and against the protected floor test. It meets every check the floor applies: manifest supply to the factory, 18 decimals, no privileged selector that grows supply or moves a holder, no DELEGATECALL, CALLCODE or SELFDESTRUCT. Nothing to report.\n\n**What I added**, building on the existing unit and invariant files rather than rewriting them. All four files are under `test/` only; no config, library or source file was touched and no dependency was installed.\n\n- `test/BIT.launchFloor.t.sol` mirrors the protected floor locally. A probe etched at the factory address deploys the token through CREATE2 in one call, salted with the launch number, and checks the address prediction. It tries the floor's exact admin and privileged selector lists from both a stranger and the factory, and asserts each call reverts and moves nothing. It also covers the complete swarm, pool and remainder flow that empties the factory to zero, the factory failing to spend a holder's allowance it was not given, the constructor rejecting ether, the token rejecting ether and unknown selectors, a reused salt, a manifest supply that disagrees, and a scan for unlinked library placeholders.\n- `test/BIT.properties.t.sol` holds 22 stateless fuzz properties at the edges: the supply mints to whoever deploys, round trips restore balances, split transfers equal one transfer, the boundary between an allowance of max minus one and max, exact allowance spends to zero and one wei further fails, last-write-wins approvals, and every failure path leaving balances and allowances untouched.\n- `test/BIT.adversarial.invariant.t.sol` is a second invariant suite that mixes valid operations with attacks in random order: overdrawn transfers, spends past an allowance, transfers to and from the zero address, 22 privileged selectors from the deployer and strangers, and ether sends. Every rejected call is checked for its exact ERC-6093 error and for unchanged state. Recipients include fresh fuzzed addresses and the token contract itself as a sink. Six invariants compare the whole touched ledger and allowances against the chain after every call.\n- `test/helpers/LaunchProbe.sol` is the factory stand-in those tests drive.\n\n**Verification.** 72 tests pass across 5 suites, including 8 invariants over 24,576 handler calls with zero reverts. The new files pass `forge fmt --check`. In scratch I pointed the adversarial handler at two mutant copies of the token, one with a one percent burn on transfer and one with a public mint, and the invariants failed on both within the first run, so the properties are not vacuous. The one failure during development was my own oracle: with a zero amount, OpenZeppelin rejects spending from the zero address with `ERC20InvalidApprover` rather than `ERC20InvalidSender`. I corrected the expected error, since the behaviour is correct.\n\nThe new files are left uncommitted in the working tree for the submission step to pick up.","treeHash":"3b7f6c1d33b235023ef536cad965b75092d3b2d2","usage":{"cachedInputTokens":1170208,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":42533,"runtime":"claude","turns":30,"wallClockMs":681919}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1a7ecd03bd365366","findings":[],"hash":"ad44a2fdbdcdf16f5e60d71df57774a8b1326b1ef2ab1febe13486e4781ccef2","nodeId":"1a77fb48-2cf1-45f9-b150-7d45b12fd4d3","outcome":"completed","summary":"The review is complete. The findings file is written, the working tree is unchanged, and the scratch tests are removed.\n\n**Result: no defects found in the math, boundary or numerical-gap areas.** `.imd-findings.json` holds an empty findings list and six coverage rows, all `holds`.\n\nWhat I checked, against the Pashov Math Precision, Boundary and Numerical Gap guides:\n\n- **Math Precision.** The token has no division, fee, fixed-point scale, cast, shift or mixed-decimal arithmetic. The only arithmetic is OpenZeppelin's balance and allowance updates. The checked `fromBalance < value` guard precedes the unchecked subtraction, and the unchecked recipient addition cannot wrap because the sum of balances is fixed at 1e26. The aderyn large-literal lead is a compile-time constant that equals exactly 1e26 and `100_000_000 ether`, so it is not a defect.\n- **Boundary.** No payable function, receive, fallback, external call, sentinel branch or bytes decoding exists. Sending ETH or an unknown selector reverts and the contract balance stays zero. Zero-address sender, receiver and spender are rejected even at zero value.\n- **Numerical Gap.** The invariant `totalSupply == sum(balances)` holds exactly, with no rounding anywhere to drift it. Zero-amount transfers take the same path as nonzero ones and skip no state update. The launch split of 1000, 8800 and 200 basis points divides the supply with zero remainder.\n- **Dependency integrity.** All five vendored OpenZeppelin files are byte-identical to upstream commit dbb6104 (v5.0.2), so the inherited arithmetic is the audited library code.\n\nVerification run locally:\n\n| Suite | Result |\n|---|---|\n| Existing unit and invariant tests | 35 passed, invariant 128 runs x 64 depth, 0 reverts |\n| Scratch boundary probes (max uint, supply+1, max-1 allowance, 1 wei, zero value, split/merge fuzz) | 11 passed |\n\nNot reached: nothing in the assigned area. The Uniswap v4 seed and swap flow from the protected test was not executed here because its v4-core dependency is not in this tree, but since the token applies no transfer tax, the amounts it moves are exact by construction.","treeHash":null,"usage":{"cachedInputTokens":698305,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":10081,"runtime":"claude","turns":16,"wallClockMs":150855}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7e50667f872c7f5e","findings":[{"citation":"resolved","description":"BIT inherits OpenZeppelin v5.0.2 ERC20.approve unchanged (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol, approve sets _allowances[owner][spender] = value with no read of the prior value). This is the standard ERC-20 approve ordering property, not a defect introduced by this contract: a holder who replaces a nonzero allowance with a smaller one can be front-run by the spender, who spends the old allowance and then the new one. OpenZeppelin v5 removed increaseAllowance/decreaseAllowance, so there is no built-in mitigation in the vendored code. The README (lines 37-38 and 68) already documents this and tells holders to revoke to zero first. Reported at info so the judge has the complete trace for the Execution Trace 'approval residuals' item; no code change is required to meet the brief, and adding non-standard allowance helpers would change the agreed design of a plain fixed-supply ERC-20. Trust assumption for holders: an allowance is a grant of the full approved amount until a zero-reset confirms.","line":9,"path":"src/BIT.sol","reproduction":"State: alice holds 100e18 BIT. 1) alice calls approve(spender, 50e18). 2) alice later submits approve(spender, 7e18) intending to reduce. 3) spender sees it pending and lands transferFrom(alice, spender, 50e18) first; succeeds, allowance becomes 0. 4) alice's approve(spender, 7e18) executes, allowance becomes 7e18. 5) spender calls transferFrom(alice, spender, 7e18); succeeds. Expected by a naive holder: spender can move at most 7e18 after the reduction. Actual: spender holds 57e18, alice 43e18. Verified with a scratch Foundry test (test_ApproveRaceSpends57) that passes on the current code, confirming the behaviour. This is ERC-20 standard behaviour and is documented in README.md, so it is not a blocking defect.","severity":"info","snippet":"contract BIT is ERC20 {","title":"Inherited ERC-20 approve race: lowering a nonzero allowance can be front-run so the spender moves old plus new amount"}],"hash":"c42c001dbbf2201c3ef60cedd9c3b753b3f5d4a9290fe7c6b0bb57c91da589cf","nodeId":"243c9b0f-7046-4b22-9762-438c3f8ad9d2","outcome":"completed","summary":"The review is complete. The findings file is in place, the working tree has no tracked changes, and the scratch tests are removed.\n\n**Outcome: no defects found in BIT.** The token is a 15-line wrapper over an unmodified OpenZeppelin v5.0.2 ERC-20 with a single constructor mint of 1e26 base units to msg.sender, no constructor arguments, no admin, mint, burn, pause, fallback or receive paths.\n\n**What I checked, in my assigned area:**\n- **Execution Trace.** Traced approve, transfer and transferFrom from entry to storage. Zero-address sentinels revert, balances and allowances are checked before subtraction, self-transfers preserve balance, a failed delegated transfer reverts the allowance update, and no external call or callback exists. The one \"approval residual\" is the inherent ERC-20 approve ordering race, reported at info since the README already documents it and no code change is required for the agreed design.\n- **Periphery.** All five vendored OpenZeppelin files hash byte-identical to the pinned upstream commit, so the base contract is untampered. Context returns plain msg.sender.\n- **First Principles.** The constructor is non-payable, the creation code carries no arguments so a manifest constructorArgs of `[]` is correct, decimals are 18, and the runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n\n**Verification run:** forge build, the full 35-test suite with the README's seed, forge fmt --check, and six scratch probes covering the approve race, zero-value delegated transfers, raw CREATE with value, self-transferFrom at max allowance, and unknown selectors. All passed as the standard specifies.\n\n**Coverage record:** all three listed entry points plus the constructor and four invariants are marked `holds`. The aderyn large-literal lead is the 1e26 constant and matches the spec exactly. Nothing in my area was left unreached. Launch-side items outside this repository, such as the manifest and chain selection, were not reviewable here because no launch.json exists yet.","treeHash":null,"usage":{"cachedInputTokens":707824,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":13426,"runtime":"claude","turns":29,"wallClockMs":198356}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e12f98dda6acc55f","findings":[{"citation":"resolved","description":"BIT inherits OpenZeppelin Contracts v5.0.2 ERC20 unchanged (vendored files diffed byte-identical against upstream commit dbb6104ce834628e473d2173bbc9d47f81a9eec3). ERC20.approve calls _approve, which overwrites the slot (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:291 `_allowances[owner][spender] = value;`) without reading the prior value, and v5 ships no increaseAllowance/decreaseAllowance or permit. A holder who lowers a nonzero allowance directly to another nonzero value can therefore be front-run by the spender, who spends the old allowance and then the new one. This is the standard ERC-20 approve race, present in every unmodified ERC-20, not a defect introduced by this contract; README.md 'After launch' already documents the approve(0)-first mitigation. Both specialist reports (audit_flow 99f0c582..., audit_economics a10be6ed...) describe the same root cause and are merged here at the same severity. Recorded as an informational trust assumption for holders; no code change is required to meet the brief, and adding non-standard allowance helpers or ERC-2612 would widen the agreed design of a plain fixed-supply ERC-20. Not a launch-floor blocker and does not open a revision.","line":9,"path":"src/BIT.sol","reproduction":"Reproduced with a scratch Foundry test (removed after running; passed on this code, confirming the behaviour). State: deploy BIT, transfer 100e18 to alice. 1) vm.prank(alice); token.approve(spender, 50e18). 2) alice intends to reduce to 7e18, but before her approve lands: vm.prank(spender); token.transferFrom(alice, spender, 50e18) succeeds, allowance 0. 3) vm.prank(alice); token.approve(spender, 7e18) sets allowance 7e18. 4) vm.prank(spender); token.transferFrom(alice, spender, 7e18) succeeds. Expected by a naive holder: spender moves at most 50e18 total. Actual: balanceOf(spender) == 57e18, balanceOf(alice) == 43e18, totalSupply unchanged at 100_000_000e18. Mitigation in README: approve(spender, 0), wait for confirmation, then approve the new amount.","severity":"info","snippet":"contract BIT is ERC20 {","title":"Inherited ERC-20 approve ordering property: replacing a nonzero allowance lets a front-running spender move old plus new (merged from audit_flow and audit_economics)"}],"hash":"f2d0f9635d13eaa29fea704b599f5c31f16e5c62099a8b313abc6d282c9db76d","nodeId":"71dac480-356a-4f28-96d9-60ab5ad2807c","outcome":"completed","summary":"The review is complete and the findings file is written. The tree is otherwise unchanged (git status is clean apart from the ignored findings file; the scratch test was removed after running).\n\n**Outcome:** no blocking defects. The token is an unmodified OpenZeppelin v5.0.2 fixed-supply ERC-20, and the one specialist lead reduces to a documented standard-ERC-20 property.\n\n**What I verified**\n\n- **Code and library.** All five vendored OpenZeppelin files diff byte-identical to upstream commit dbb6104 (v5.0.2). The constructor mints 1e26 units once to msg.sender, and the ABI exposes only approve, transfer and transferFrom as state-changing, with no receive, fallback, owner, mint or burn paths.\n- **Tests.** The project suite passes with the pinned seed (72 tests, including ledger invariants with zero handler reverts).\n- **Deployability.** Creation code is 2,614 bytes and runtime 1,751 bytes. The runtime contains no DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL or CREATE opcodes, and metadata is limited to the solc version tag.\n- **Manifest.** launch.json uses only schema keys, empty constructorArgs matching the argument-less constructor, the exact minted supply, 18 decimals, lowercase addresses, and the pool and economics values given for this launch.\n- **Static-analysis leads.** Slither reported nothing. The aderyn large-literal note is a style lint on a compile-time constant and was dropped.\n\n**Findings reported**\n\n1. **Info, merged from audit_flow and audit_economics:** the inherited approve ordering race. I reproduced it with a scratch Foundry test: after approve(50e18), a front-running transferFrom, approve(7e18) and a second transferFrom, the spender holds 57e18. This is standard ERC-20 behaviour, already documented in the README with the approve-to-zero-first mitigation, so it is recorded as a trust assumption and does not open a revision.\n\n**Coverage record:** all three entry points answered, plus rows for the constructor and supply, privileged entry points, bytecode floor, dependency integrity, the manifest and the static-analysis leads.","treeHash":null,"usage":{"cachedInputTokens":542765,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":9138,"runtime":"claude","turns":11,"wallClockMs":133350}}],"verification":[{"checks":[{"durationMs":1174,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.10s\nCompiler run successful!\n","passed":true},{"durationMs":2058,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 34 tests for test/BIT.t.sol:BITTest\n[PASS] testFuzz_DelegatedTransfersSpendExactFiniteAllowance(uint256,uint256) (runs: 1024, μ: 166683, ~: 167645)\nLogs:\n  Bound result 2\n  Bound result 89\n\n[PASS] testFuzz_RevertWhenSpenderExceedsAllowance(uint256,uint256) (runs: 1024, μ: 123423, ~: 123813)\nLogs:\n  Bound result 277\n  Bound result 113357812367\n\n[PASS] testFuzz_RevertWhenTransferExceedsEntireSupply(uint256) (runs: 1024, μ: 69104, ~: 69449)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640464039457584007913525994440\n\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 1024, μ: 92978, ~: 93181)\nLogs:\n  Bound result 18750\n\n[PASS] test_ApprovalDoesNotRequireBalance() (gas: 78613)\n[PASS] test_ApprovalReplacesPreviousValue() (gas: 93490)\n[PASS] test_ApproveReturnsTrueAndEmitsEvent() (gas: 86490)\n[PASS] test_ConstructorEmitsExactlyOneMint() (gas: 9664)\n[PASS] test_Create2MintsOnlyToImmediateDeployer() (gas: 284400)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenBalanceTooLow() (gas: 136886)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenRecipientIsZero() (gas: 114668)\n[PASS] test_LaunchDistributionAndTradingTransfersArriveWhole() (gas: 632001)\n[PASS] test_MetadataAndInitialSupply() (gas: 107719)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1464308)\n[PASS] test_RevertWhenApproveFromZeroSender() (gas: 33075)\n[PASS] test_RevertWhenApproveZeroSpender() (gas: 37561)\n[PASS] test_RevertWhenDeployerTriesToSeizeHolderBalance() (gas: 95445)\n[PASS] test_RevertWhenSelfTransferExceedsBalance() (gas: 35930)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 67775)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 116223)\n[PASS] test_RevertWhenTransferFromZeroSender() (gas: 33144)\n[PASS] test_RevertWhenTransferToZero() (gas: 47672)\n[PASS] test_RevertWhenUnapprovedSpenderTriesAnotherSpendersAllowance() (gas: 103671)\n[PASS] test_RevertWhenZeroTransferToZero() (gas: 30368)\n[PASS] test_RevokedApprovalCannotBeSpent() (gas: 129073)\n[PASS] test_RuntimeFitsDeploymentLimitAndContainsNoForbiddenOpcodes() (gas: 784913)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51498)\n[PASS] test_TransferEntireSupply() (gas: 149174)\n[PASS] test_TransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 244829)\n[PASS] test_TransferFromPreservesInfiniteAllowance() (gas: 139836)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103690)\n[PASS] test_TransferReturnsTrueAndEmitsEvent() (gas: 91592)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73447)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81500)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 26.77ms (115.77ms CPU time)\n\nRan 1 test for test/BIT.invariant.t.sol:BITInvariantTest\n[PASS]\nBITInvariantTest invariants:\n[PASS] invariant_AllowancesMatchLedger\n[PASS] invariant_FixedSupplyAndBalancesMatchLedger\n BITInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+--------------+-------+---------+----------╮\n| Contract   | Selector     | Calls | Reverts | Discards |\n+========================================================+\n| BITHandler | approve      | 2743  | 0       | 0        |\n|------------+--------------+-------+---------+----------|\n| BITHandler | transfer     | 2646  | 0       | 0        |\n|------------+--------------+-------+---------+----------|\n| BITHandler | transferFrom | 2803  | 0       | 0        |\n╰------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 1727\n  Bound result 776\n  Bound result 1726\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2619\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 16\n  Bound result 0\n  Bound result 50000000000000000000\n  Bound result 14773810961637876343544617\n  Bound result 2\n  Bound result 1\n  Bound result 0\n  Bound result 244\n  Bound result 0\n  Bound result 18\n  Bound result 1\n  Bound result 48362480399243482555264911\n  Bound result 21906428506498961999209196\n  Bound result 8\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.97s (1.97s CPU time)\n\nRan 2 test suites in 1.97s (2.00s CPU time): 35 tests passed, 0 failed, 0 skipped (35 total tests)\n","passed":true},{"durationMs":40,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BIT.approve(address,uint256)\",\"BIT.transfer(address,uint256)\",\"BIT.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":20,\"LICENSE\":21,\"README.md\":72,\"SECURITY.md\":20,\"foundry.toml\":21,\"launch.json\":24,\"remappings.txt\":2,\"src/BIT.sol\":15,\"test/BIT.invariant.t.sol\":99,\"test/BIT.t.sol\":421,\"test/helpers/FactoryHarness.sol\":15},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"493ae51f31bbf70a71f84314f3615501bba698806569cca6b7bd293cef025b77","verifiedTreeHash":"1477275407fdb7dcb56a6d1ab7a21a1fca59ea3a","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":1090,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.01s\nCompiler run successful!\n","passed":true},{"durationMs":1997,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 34 tests for test/BIT.t.sol:BITTest\n[PASS] testFuzz_DelegatedTransfersSpendExactFiniteAllowance(uint256,uint256) (runs: 1024, μ: 166683, ~: 167645)\nLogs:\n  Bound result 46603306098372378376261897\n  Bound result 115792089237316195423570985008687907853269984665640518613476331640779144105445\n\n[PASS] testFuzz_RevertWhenSpenderExceedsAllowance(uint256,uint256) (runs: 1024, μ: 123423, ~: 123813)\nLogs:\n  Bound result 11525858828508620167913\n  Bound result 99988474141237748928745445\n\n[PASS] testFuzz_RevertWhenTransferExceedsEntireSupply(uint256) (runs: 1024, μ: 69104, ~: 69449)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640464039457584007913129665844\n\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 1024, μ: 92978, ~: 93181)\nLogs:\n  Bound result 76304876412165814700019096\n\n[PASS] test_ApprovalDoesNotRequireBalance() (gas: 78613)\n[PASS] test_ApprovalReplacesPreviousValue() (gas: 93490)\n[PASS] test_ApproveReturnsTrueAndEmitsEvent() (gas: 86490)\n[PASS] test_ConstructorEmitsExactlyOneMint() (gas: 9664)\n[PASS] test_Create2MintsOnlyToImmediateDeployer() (gas: 284400)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenBalanceTooLow() (gas: 136886)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenRecipientIsZero() (gas: 114668)\n[PASS] test_LaunchDistributionAndTradingTransfersArriveWhole() (gas: 632001)\n[PASS] test_MetadataAndInitialSupply() (gas: 107719)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1464308)\n[PASS] test_RevertWhenApproveFromZeroSender() (gas: 33075)\n[PASS] test_RevertWhenApproveZeroSpender() (gas: 37561)\n[PASS] test_RevertWhenDeployerTriesToSeizeHolderBalance() (gas: 95445)\n[PASS] test_RevertWhenSelfTransferExceedsBalance() (gas: 35930)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 67775)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 116223)\n[PASS] test_RevertWhenTransferFromZeroSender() (gas: 33144)\n[PASS] test_RevertWhenTransferToZero() (gas: 47672)\n[PASS] test_RevertWhenUnapprovedSpenderTriesAnotherSpendersAllowance() (gas: 103671)\n[PASS] test_RevertWhenZeroTransferToZero() (gas: 30368)\n[PASS] test_RevokedApprovalCannotBeSpent() (gas: 129073)\n[PASS] test_RuntimeFitsDeploymentLimitAndContainsNoForbiddenOpcodes() (gas: 784913)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51498)\n[PASS] test_TransferEntireSupply() (gas: 149174)\n[PASS] test_TransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 244829)\n[PASS] test_TransferFromPreservesInfiniteAllowance() (gas: 139836)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103690)\n[PASS] test_TransferReturnsTrueAndEmitsEvent() (gas: 91592)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73447)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81500)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 29.03ms (122.16ms CPU time)\n\nRan 1 test for test/BIT.invariant.t.sol:BITInvariantTest\n[PASS]\nBITInvariantTest invariants:\n[PASS] invariant_AllowancesMatchLedger\n[PASS] invariant_FixedSupplyAndBalancesMatchLedger\n BITInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+--------------+-------+---------+----------╮\n| Contract   | Selector     | Calls | Reverts | Discards |\n+========================================================+\n| BITHandler | approve      | 2743  | 0       | 0        |\n|------------+--------------+-------+---------+----------|\n| BITHandler | transfer     | 2646  | 0       | 0        |\n|------------+--------------+-------+---------+----------|\n| BITHandler | transferFrom | 2803  | 0       | 0        |\n╰------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 1727\n  Bound result 776\n  Bound result 1726\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2619\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 16\n  Bound result 0\n  Bound result 50000000000000000000\n  Bound result 14773810961637876343544617\n  Bound result 2\n  Bound result 1\n  Bound result 0\n  Bound result 244\n  Bound result 0\n  Bound result 18\n  Bound result 1\n  Bound result 48362480399243482555264911\n  Bound result 21906428506498961999209196\n  Bound result 8\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.90s (1.89s CPU time)\n\nRan 2 test suites in 1.90s (1.93s CPU time): 35 tests passed, 0 failed, 0 skipped (35 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BIT.approve(address,uint256)\",\"BIT.transfer(address,uint256)\",\"BIT.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":20,\"LICENSE\":21,\"README.md\":72,\"SECURITY.md\":20,\"foundry.toml\":21,\"remappings.txt\":2,\"src/BIT.sol\":15,\"test/BIT.invariant.t.sol\":99,\"test/BIT.t.sol\":421,\"test/helpers/FactoryHarness.sol\":15},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":657,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":388,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/BIT.sol:10: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8cf1383ed7a5d2c82e8342e22943771482cda6979a0d1f497e0652eb315ec81d","verifiedTreeHash":"c33393ea899a4b55f5697d21d37f93a0d39ae84d","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":2264,"exitCode":0,"name":"build","output":"Compiling 32 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.17s\nCompiler run successful!\n","passed":true},{"durationMs":10494,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 14 tests for test/BIT.launchFloor.t.sol:BITLaunchFloorTest\n[PASS] test_ConstructorRejectsEther() (gas: 665882)\n[PASS] test_CreationCodeHasNoUnlinkedLibraryPlaceholders() (gas: 2736387)\n[PASS] test_DeployAllRejectsAManifestSupplyThatDisagrees() (gas: 1650718)\n[PASS] test_DeploysAtThePredictedAddressForTheLaunchSalt() (gas: 14097)\n[PASS] test_FactoryHasNoRightsOverAnAllowanceItWasNotGiven() (gas: 164021)\n[PASS] test_MetadataMatchesTheManifest() (gas: 40794)\n[PASS] test_MintsTheManifestSupplyToTheFactory() (gas: 44821)\n[PASS] test_NoCommonAdminCallIncreasesSupply() (gas: 1014224)\n[PASS] test_NoPrivilegedHandMovesOrFreezesAHolder() (gas: 1011469)\n[PASS] test_RedeployingAtTheSameSaltFails() (gas: 1040518708)\n[PASS] test_RuntimeCodeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2310499)\n[PASS] test_TheFullLaunchFlowEmptiesTheFactoryExactly() (gas: 458832)\n[PASS] test_TheSwarmShareArrivesWholeAndIsClaimableWhole() (gas: 205444)\n[PASS] test_TokenRejectsEtherAndUnknownSelectors() (gas: 123303)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 63.15ms (27.00ms CPU time)\n\nRan 22 tests for test/BIT.properties.t.sol:BITPropertiesTest\n[PASS] testFuzz_AllowanceDoesNotCreateBalance(uint256,uint256) (runs: 1024, μ: 185570, ~: 186179)\nLogs:\n  Bound result 98955809672385500571832652\n  Bound result 795933790822399411072034\n\n[PASS] testFuzz_ApprovalsAreIndependentPerSpenderAndOwner(uint256,uint256) (runs: 1024, μ: 153412, ~: 154063)\n[PASS] testFuzz_ApproveIsLastWriteWinsNotAdditive(uint256,uint256) (runs: 1024, μ: 173640, ~: 173721)\n[PASS] testFuzz_ApproveZeroSpenderRevertsForAnyAmount(uint256,uint256) (runs: 1024, μ: 44830, ~: 44775)\n[PASS] testFuzz_ChainedTransfersConserveSupplyAcrossActors(uint256,uint256,uint256,uint256,uint256) (runs: 1024, μ: 226768, ~: 232720)\nLogs:\n  Bound result 854\n  Bound result 20\n  Bound result 20000000000000000854\n\n[PASS] testFuzz_EmptyAccountCannotSendAnyPositiveAmount(address,uint256) (runs: 1024, μ: 71654, ~: 71574)\nLogs:\n  Bound result 1251814508702497125666937002033900828315300315675\n  Bound result 3320750282534483\n\n[PASS] testFuzz_EveryDeploymentIsIndependent(uint256) (runs: 1024, μ: 106425, ~: 106207)\nLogs:\n  Bound result 396354505\n\n[PASS] testFuzz_ExactAllowanceSpendsToZeroAndNoFurther(uint256) (runs: 1024, μ: 178260, ~: 178040)\nLogs:\n  Bound result 396354505\n\n[PASS] testFuzz_FailedTransferLeavesEveryoneUntouched(uint256,uint256,uint256) (runs: 1024, μ: 158004, ~: 158047)\nLogs:\n  Bound result 10471\n  Bound result 12\n\n[PASS] testFuzz_InfiniteAllowanceBoundary(uint256) (runs: 1024, μ: 232003, ~: 231788)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_InfiniteAllowanceSurvivesRepeatedSpends(uint256,uint256) (runs: 1024, μ: 210700, ~: 212158)\nLogs:\n  Bound result 98904938752868302473128177\n  Bound result 684792154370780405723906\n\n[PASS] testFuzz_MetadataIsConstantAcrossActivity(uint256) (runs: 1024, μ: 159947, ~: 160649)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_NobodyCanSpendFromTheZeroAddress(uint256,uint256) (runs: 1024, μ: 47407, ~: 47355)\n[PASS] testFuzz_OnlyTheOwnerCanRaiseAnAllowance(address,uint256) (runs: 1024, μ: 122324, ~: 122251)\nLogs:\n  Bound result 637024264646276166803994278427815393724494340122\n  Bound result 1019047334919183805376141598008303778012409489\n\n[PASS] testFuzz_PartialSpendsNeverExceedTheOriginalAllowance(uint256,uint256,uint256) (runs: 1024, μ: 258327, ~: 262613)\nLogs:\n  Bound result 39720180056090144880338145\n  Bound result 39720180056090144880338144\n  Bound result 1\n\n[PASS] testFuzz_RoundTripRestoresBothBalances(address,uint256) (runs: 1024, μ: 136267, ~: 136466)\nLogs:\n  Bound result 1251814508702497125666937002033900828315300315675\n  Bound result 3320750282534483\n\n[PASS] testFuzz_SelfTransferAboveBalanceReverts(uint256,uint256) (runs: 1024, μ: 102442, ~: 102729)\nLogs:\n  Bound result 98904938752868302473128177\n  Bound result 3824365595032168750452616781567782826887007476423834071170\n\n[PASS] testFuzz_SelfTransferOfAnyAffordableAmountIsANoOp(uint256,uint256) (runs: 1024, μ: 114068, ~: 114500)\nLogs:\n  Bound result 46603306098372378376261897\n  Bound result 1177324846005244390727407\n\n[PASS] testFuzz_SplitTransfersEqualOneTransfer(uint256,uint256) (runs: 1024, μ: 207266, ~: 207996)\nLogs:\n  Bound result 98904938752868302473128177\n  Bound result 684792154370780405723906\n\n[PASS] testFuzz_SupplyMintsToWhoeverDeploys(address) (runs: 1024, μ: 49478, ~: 49232)\nLogs:\n  Bound result 4294967294\n\n[PASS] testFuzz_TransferToZeroRevertsForAnyAmount(uint256) (runs: 1024, μ: 125495, ~: 125383)\n[PASS] testFuzz_TransfersToAnyNonZeroAddressSucceedIncludingContracts(uint256,uint256) (runs: 1024, μ: 81490, ~: 89906)\nLogs:\n  Bound result 98904938752868302473128177\n\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 176.37ms (3.54s CPU time)\n\nRan 34 tests for test/BIT.t.sol:BITTest\n[PASS] testFuzz_DelegatedTransfersSpendExactFiniteAllowance(uint256,uint256) (runs: 1024, μ: 166718, ~: 167629)\nLogs:\n  Bound result 46603306098372378376261897\n  Bound result 115792089237316195423570985008687907853269984665640518613476331640779144105445\n\n[PASS] testFuzz_RevertWhenSpenderExceedsAllowance(uint256,uint256) (runs: 1024, μ: 123430, ~: 123803)\nLogs:\n  Bound result 98955809672385500571832652\n  Bound result 99994014914199845086970094\n\n[PASS] testFuzz_RevertWhenTransferExceedsEntireSupply(uint256) (runs: 1024, μ: 69106, ~: 69449)\nLogs:\n  Bound result 100000000000000000000000001\n\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 1024, μ: 93071, ~: 93121)\nLogs:\n  Bound result 95598468834774837559370113\n\n[PASS] test_ApprovalDoesNotRequireBalance() (gas: 78613)\n[PASS] test_ApprovalReplacesPreviousValue() (gas: 93490)\n[PASS] test_ApproveReturnsTrueAndEmitsEvent() (gas: 86490)\n[PASS] test_ConstructorEmitsExactlyOneMint() (gas: 9664)\n[PASS] test_Create2MintsOnlyToImmediateDeployer() (gas: 284400)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenBalanceTooLow() (gas: 136886)\n[PASS] test_FailedTransferFromRestoresAllowanceWhenRecipientIsZero() (gas: 114668)\n[PASS] test_LaunchDistributionAndTradingTransfersArriveWhole() (gas: 632001)\n[PASS] test_MetadataAndInitialSupply() (gas: 107719)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 1464308)\n[PASS] test_RevertWhenApproveFromZeroSender() (gas: 33075)\n[PASS] test_RevertWhenApproveZeroSpender() (gas: 37561)\n[PASS] test_RevertWhenDeployerTriesToSeizeHolderBalance() (gas: 95445)\n[PASS] test_RevertWhenSelfTransferExceedsBalance() (gas: 35930)\n[PASS] test_RevertWhenTransferExceedsBalance() (gas: 67775)\n[PASS] test_RevertWhenTransferFromExceedsAllowance() (gas: 116223)\n[PASS] test_RevertWhenTransferFromZeroSender() (gas: 33144)\n[PASS] test_RevertWhenTransferToZero() (gas: 47672)\n[PASS] test_RevertWhenUnapprovedSpenderTriesAnotherSpendersAllowance() (gas: 103671)\n[PASS] test_RevertWhenZeroTransferToZero() (gas: 30368)\n[PASS] test_RevokedApprovalCannotBeSpent() (gas: 129073)\n[PASS] test_RuntimeFitsDeploymentLimitAndContainsNoForbiddenOpcodes() (gas: 784913)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51498)\n[PASS] test_TransferEntireSupply() (gas: 149174)\n[PASS] test_TransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 244829)\n[PASS] test_TransferFromPreservesInfiniteAllowance() (gas: 139836)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 103690)\n[PASS] test_TransferReturnsTrueAndEmitsEvent() (gas: 91592)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73447)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81500)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 176.38ms (290.78ms CPU time)\n\nRan 1 test for test/BIT.invariant.t.sol:BITInvariantTest\n[PASS]\nBITInvariantTest invariants:\n[PASS] invariant_AllowancesMatchLedger\n[PASS] invariant_FixedSupplyAndBalancesMatchLedger\n BITInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+--------------+-------+---------+----------╮\n| Contract   | Selector     | Calls | Reverts | Discards |\n+========================================================+\n| BITHandler | approve      | 2743  | 0       | 0        |\n|------------+--------------+-------+---------+----------|\n| BITHandler | transfer     | 2646  | 0       | 0        |\n|------------+--------------+-------+---------+----------|\n| BITHandler | transferFrom | 2803  | 0       | 0        |\n╰------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1727\n  Bound result 776\n  Bound result 1726\n  Bound result 0\n  Bound result 4466\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 2815\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 48021565\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 2\n  Bound result 1\n  Bound result 57231584049520291415342385\n  Bound result 14505882394190413141016474\n  Bound result 242\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.06s (2.05s CPU time)\n\nRan 1 test for test/BIT.adversarial.invariant.t.sol:BITAdversarialInvariantTest\n[PASS]\nBITAdversarialInvariantTest invariants:\n[PASS] invariant_AllowancesMatchLedger\n[PASS] invariant_DeployerHoldsOnlyWhatItKept\n[PASS] invariant_SupplyNeverChanges\n[PASS] invariant_TokenContractIsASink\n[PASS] invariant_TouchedBalancesMatchLedgerAndSumToSupply\n[PASS] invariant_UntouchedAddressesHoldNothing\n BITAdversarialInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+---------------------------+-------+---------+----------╮\n| Contract            | Selector                  | Calls | Reverts | Discards |\n+==============================================================================+\n| BITAdversaryHandler | approve                   | 1617  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| BITAdversaryHandler | approveZeroSpender        | 1686  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| BITAdversaryHandler | privilegedCall            | 1639  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| BITAdversaryHandler | sendEther                 | 1636  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| BITAdversaryHandler | transfer                  | 1637  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| BITAdversaryHandler | transferFrom              | 1635  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| BITAdversaryHandler | transferFromOverAllowance | 1624  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| BITAdversaryHandler | transferFromZeroHolder    | 1599  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| BITAdversaryHandler | transferOverBalance       | 1673  | 0       | 0        |\n|---------------------+---------------------------+-------+---------+----------|\n| BITAdversaryHandler | transferToZero            | 1638  | 0       | 0        |\n╰---------------------+---------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 11628\n  Bound result 3242720925428177701620292365\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 342112374571618862558\n  Bound result 833128635637841264659\n  Bound result 0\n  Bound result 33336763561811758\n  Bound result 353239213121043809239\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 7492\n  Bound result 1\n  Bound result 0\n  Bound result 22\n  Bound result 242\n  Bound result 9872625560352752707568781609\n  Bound result 13\n  Bound result 24801652016546354736610067\n  Bound result 0\n  Bound result 2081\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.38s (10.38s CPU time)\n\nRan 5 test suites in 10.39s (12.86s CPU time): 72 tests passed, 0 failed, 0 skipped (72 total tests)\n","passed":true},{"durationMs":59,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BIT.approve(address,uint256)\",\"BIT.transfer(address,uint256)\",\"BIT.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":20,\"LICENSE\":21,\"README.md\":72,\"SECURITY.md\":20,\"foundry.toml\":21,\"remappings.txt\":2,\"src/BIT.sol\":15,\"test/BIT.adversarial.invariant.t.sol\":370,\"test/BIT.invariant.t.sol\":99,\"test/BIT.launchFloor.t.sol\":290,\"test/BIT.properties.t.sol\":351,\"test/BIT.t.sol\":421,\"test/helpers/FactoryHarness.sol\":15,\"test/helpers/LaunchProbe.sol\":85},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9a58eb5e63f2564cb7607a403b52516fa699277416544aad546e778e4e71d160","verifiedTreeHash":"3b7f6c1d33b235023ef536cad965b75092d3b2d2","verifierVersion":"0.1.0+8fbf00a5"}]}