{"assessments":[],"deployments":[{"attestationHash":"a593271eeb6deac77d464e3628ffc2d64859fc8b4b2459388f282aa759be1da9","chainId":1,"contracts":[{"address":"0xe6c225f592da267e917385f6251efb05f7e3808c","blockNumber":26280147,"name":"MerkleDistributor","role":"distributor","txHash":"0xaf3dc907e76e07e9a1d7755aaa24d39c33fa30e70b013b8f4eb6c51bd8c647f6"},{"address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","blockNumber":26280147,"name":"PoolInitializationGuard","role":"hook","txHash":"0xaf3dc907e76e07e9a1d7755aaa24d39c33fa30e70b013b8f4eb6c51bd8c647f6"},{"address":"0x679dd1f8005d9d418af3a8faedf87cbf5ccef015","blockNumber":26280147,"name":"TorchToken","role":"token","txHash":"0xaf3dc907e76e07e9a1d7755aaa24d39c33fa30e70b013b8f4eb6c51bd8c647f6"}],"id":"b1a9b031-f3ce-4681-86bd-4706c0ec3e0e","manifestHash":"2c649c6c4b608fb84a440735a9b1f520c9f97ddb83777a2910b59928649fa49f","status":"live"}],"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":"a8744711-f2e3-4d42-8362-77babc11f494","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"871d92e2f3cd3fcd187813f7ad10026c3285376a1ea1ec5052e83649b35d8b67","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"ac7b5898a6064c5a344683b8c9cf93891b912757bf91543279ec105f757efd36","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"89f001e0555e8f728ce2d47c1d080d0ff936b708db3f95ce5d893c6c057481df","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","subagents":4,"tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"c673d6a528e860b253fd967c23eea50138fb32bd4b212fa431822bfb914dda3c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"a41c09e4f5b68559ee36b7d279411aa3602ce7e6698baf61157afd8f92e00253","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"ef5024bb49fa0e028ff03d3dce2ee09887383444da9f7f41e2e65a3db432321e","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"816fe39c7efd64504a19175b0f4dd9186d61069f37a22684c90358a18c60bddc","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"816fe39c7efd64504a19175b0f4dd9186d61069f37a22684c90358a18c60bddc","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"35b4bd71e84c4513cfb64395f03d06cb1538232f882fa9367e4ed8936a2c3f05","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"d81ef9366316d03351ffc9d1d7bc7999a794687b3663dfde7a9132879c27625e","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Torch (TORCH).\nToken name: Torch\nToken symbol: TORCH\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"eaba5816c637928f4ca2ba8092b4e3869073f4d6404b595d50154fc8b47efb76","previousHash":"b85aea9f6dfc3a8af254be799b387b8af7034ff208f841daa5f7a6b40134b4a0","projectId":"a8744711-f2e3-4d42-8362-77babc11f494","publication":{"commit":"72806c396096160991378207b8b4a8ff014cd9ce","deliveredAt":"2026-10-26T23:25:42.358Z","repoUrl":"https://github.com/identity-md-launches/launch-2601-torch"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"739bb9502c21e5baff1df762faf25e4db5c6f869d60c62af4594f952d8435e91","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"e11e59c8821a650c314435dcec16f911ae7ed9b4f9720ecca8491f14d35c985c","device":"dfa08759ca0424de","findings":[],"hash":"35b4bd71e84c4513cfb64395f03d06cb1538232f882fa9367e4ed8936a2c3f05","nodeId":"260f3ceb-ff32-4e48-b53e-69f61edaac06","outcome":"completed","summary":"I wrote launch.json for the Torch launch and verified it against the accepted tree.\n\n**What the manifest says**\n\n- Token contract is TorchToken with name Torch, symbol TORCH, 18 decimals.\n- The constructor takes no parameters, so constructorArgs is an empty list.\n- totalSupply is the constant the constructor mints to msg.sender, 1,000,000,000 tokens in minor units.\n- There are no application contracts in the accepted tree, so contracts is empty.\n- pool and economics are copied exactly as the task gives them, with IMD as the paired currency and fee 12500.\n- notes describe only TorchToken and its behaviour, at 882 characters.\n\n**Verification**\n\n- A script check confirmed the key order, kind, supply, note length, contract name length, and that economics matches the job's object byte for byte.\n- `forge build` compiles cleanly.\n- `forge test` with the verifier's fuzz seed passed all 37 tests across both suites.\n- `git status` shows launch.json as the only new file. Nothing else was changed.","treeHash":"0193b702c7173f2fc5407a2290c2d1adcf7b05ae","usage":{"cachedInputTokens":141511,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":2432,"runtime":"claude","turns":8,"wallClockMs":39215}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7eaf1cd0fb3df712","findings":[],"hash":"871d92e2f3cd3fcd187813f7ad10026c3285376a1ea1ec5052e83649b35d8b67","nodeId":"2b7610ad-22e0-4e1d-b5e8-4e8052fa7f41","outcome":"completed","summary":"I found no defects in the economics of `src/TorchToken.sol`. `.imd-findings.json` has an empty findings list and a coverage row for each of the three entry points, all marked `holds`. The project's 37 existing tests pass. I wrote no proof test, since none of the findings would need one, and changed no other files.\n\n**What I covered** (Economic Security, Invariant and Flow Gap guides):\n- **Supply:** the only place tokens are created is the constructor, which mints 1,000,000,000 × 10¹⁸ to `msg.sender` (the factory). `totalSupply()` returns a fixed constant. There is no mint, burn, owner, upgrade, pause, blocklist or seize function, so neither a stranger nor the factory can grow the supply or freeze a holder.\n- **Balances add up:** a transfer checks the sender's balance first, then takes exactly `value` from one account and adds exactly `value` to the other. Its `unchecked` block cannot underflow because of that check, or overflow because all balances together never exceed the total supply. A transfer to yourself leaves your balance unchanged, so the balances always total the supply.\n- **Launch flows:** there is no fee, burn or exemption on transfer. So the 10% to the distributor, each claim, the pool seed, and buys and sells through the PoolManager all move exactly the amount asked.\n- **Allowances:** `transferFrom` spends only the allowance the holder gave `msg.sender`, and checks it before subtracting. An unlimited allowance (`type(uint256).max`) is never reduced. `approve` refuses the zero address as spender and can only change the caller's own allowances.\n- **Static analysis:** the one aderyn lead (\"large numeric literal\" at `src/TorchToken.sol:27`) is the `1_000_000_000 * 10 ** 18` supply constant. It is correct as written and not a defect.\n\n**What I didn't reach:**\n- I did not run the protected floor test, because it needs environment variables and contracts that aren't in this tree. I traced its checks against the code by hand instead.\n- One edge I did not report: `transferFrom(address(0), to, 0)` succeeds and logs a zero-value transfer that looks like a mint, but it moves no tokens and changes no balance.","treeHash":null,"usage":{"cachedInputTokens":140806,"inputTokens":10,"model":"claude-opus-5-5","outputTokens":2398,"runtime":"claude","turns":5,"wallClockMs":31171}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3baa2091028c32c1","findings":[{"citation":"resolved","description":"Merged from audit_flow (info) and audit_permissions (low): same root cause, one finding. _transfer validates the receiver but never the sender. In transferFrom (lines 131-141) the allowance _allowances[address(0)][msg.sender] is 0, which is not type(uint256).max, and the check at line 134 is `current < value`, so value == 0 passes and the allowance is rewritten to 0 - 0. _transfer then runs with from == address(0): line 148 passes (to is non-zero), line 150 passes (balance 0 >= 0), the unchecked block writes 0 to _balances[0] and adds 0 to _balances[to], and line 156 emits Transfer(address(0), to, 0). No balance, allowance or supply changes, and any non-zero value from address(0) reverts ERC20InsufficientAllowance at line 134, so no tokens can ever be moved this way. Impact: the NatSpec at lines 9-10 claims OpenZeppelin-compatible semantics and the README states nothing mints after the constructor, yet any caller can at any time emit an event with the exact shape of a mint to an arbitrary recipient. Off-chain indexers and supply trackers keyed on Transfer-from-zero may record spurious zero-value mints. OpenZeppelin v5 reverts this call with ERC20InvalidSender(address(0)). Recalibrated to low: no on-chain loss or breakage, only an off-chain accounting/spoofing vector and a documented-semantics deviation. Minimal fix preserving intended behaviour: declare `error ERC20InvalidSender(address sender);` and add `if (from == address(0)) revert ERC20InvalidSender(address(0));` as the first line of _transfer (line 148 region). This does not affect the factory, distributor, pool or any ordinary transfer, since none of them use address(0) as a sender.","line":148,"path":"src/TorchToken.sol","reproduction":"State: fresh TorchToken deployment; caller alice = 0xA11CE holds no balance and has no allowance from anyone. Call: vm.prank(alice); token.transferFrom(address(0), 0xB0B, 0). Expected (per the contract's OZ-compatibility claim): revert ERC20InvalidSender(0x0). Actual: returns true and emits exactly one log, Transfer(from=0x0, to=0xB0B, value=0); balanceOf(0xB0B) == 0; totalSupply() == 1e27 unchanged. Reproduced with test_zeroSenderZeroValueEmitsMintShapedTransfer in test/scratch/Judge.t.sol (vm.recordLogs shows one log with topics[0]=keccak256('Transfer(address,address,uint256)'), topics[1]=address(0), topics[2]=0xB0B, data=0). Control: vm.prank(alice); token.transferFrom(address(0), 0xB0B, 1) reverts ERC20InsufficientAllowance(alice, 0, 1), confirming no value can move (test_zeroSenderNonZeroValueReverts in the same file).","severity":"low","snippet":"        if (to == address(0)) revert ERC20InvalidReceiver(address(0));","title":"transferFrom accepts address(0) as sender for zero-value calls and emits a mint-shaped Transfer(0x0, to, 0)"}],"hash":"89f001e0555e8f728ce2d47c1d080d0ff936b708db3f95ce5d893c6c057481df","nodeId":"c248cc44-5a03-42ec-864b-1a90faa4e888","outcome":"completed","summary":"The review is complete and the findings file is written and valid.\n\n**Outcome:** one low-severity finding, no critical, high or medium defects. The token is a plain fixed-supply ERC-20 with no owner, no external calls, no fee and no mint path. All three entry points were traced, the existing suite of 69 tests passes, and my scratch tests under test/scratch/Judge.t.sol confirm the behaviours below.\n\n**Specialist findings judged**\n- audit_flow (info) and audit_permissions (low) reported the same root cause, so they are merged into one finding at low. Reproduced: a call from any address of `transferFrom(address(0), to, 0)` succeeds and emits a Transfer from the zero address with value zero. No balance, allowance or supply changes, and any non-zero value reverts on allowance, so impact is confined to off-chain indexers that treat Transfer-from-zero as a mint. It also contradicts the contract's stated OpenZeppelin-compatible semantics. Minimal fix is a zero-sender check at the top of the internal transfer.\n- audit_math, audit_economics and the test writer reported nothing, and my own pass agrees.\n\n**My own pass**\n- approve and transfer hold. Self-transfer preserves balance, unchecked arithmetic is guarded by the preceding comparison and bounded by the fixed supply.\n- The deployer cannot pull from a holder without approval, unlimited allowance is not decremented, finite allowance is.\n- Supply is a constant, minted whole to the deployer, no admin or privileged selector exists, runtime is about 1.4 KB with no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- launch.json uses only schema keys, the empty constructorArgs matches the no-argument constructor, and totalSupply equals one billion times ten to the eighteenth.\n- The static-analysis lead about a large numeric literal is the supply constant and is not a defect.\n\n**Coverage:** all three entry points answered, two holds and one finding, plus three invariant and manifest rows. One stale sentence in the README claims no launch.json exists while one is present. That is noted in the coverage record, not raised as a finding.","treeHash":null,"usage":{"cachedInputTokens":325432,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":9907,"runtime":"claude","turns":21,"wallClockMs":134787}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c872aaeb2e58b080","findings":[{"citation":"resolved","description":"Asymmetric validation: _transfer rejects a zero receiver but not a zero sender. Allowance _allowances[0][caller] is 0 and _balances[0] is 0, so transferFrom(address(0), to, 0) passes both checks and emits Transfer(address(0), to, 0). The contract documents that nothing mints after the constructor, yet any stranger can emit an event indistinguishable in shape from a mint, which can confuse indexers and supply trackers keyed on Transfer-from-zero. No balance or supply changes, so impact is limited to off-chain accounting/spoofing. OpenZeppelin ERC20 reverts with ERC20InvalidSender(address(0)) here.","line":151,"path":"src/TorchToken.sol","reproduction":"Deploy TorchToken. From any address 0xBEEF call transferFrom(address(0), 0xBEEF, 0). Expected: revert (invalid sender), as for a zero receiver. Actual: succeeds and emits Transfer(from=0x0, to=0xBEEF, value=0) (verified with a local forge test). Fix: add `if (from == address(0)) revert ERC20InvalidSender(address(0));` in _transfer.","severity":"low","snippet":"    function _transfer(address from, address to, uint256 value) private {\n        if (to == address(0)) revert ERC20InvalidReceiver(address(0));","title":"transferFrom accepts from == address(0) for zero value, emitting a Transfer that looks like a mint after construction"}],"hash":"a41c09e4f5b68559ee36b7d279411aa3602ce7e6698baf61157afd8f92e00253","nodeId":"257de406-2aac-4f09-95ec-6c14bb253dd3","outcome":"completed","summary":"The permissions audit of `src/TorchToken.sol` found one low-severity issue and nothing worse. The results are in `.imd-findings.json`.\n\n**The token:** a self-contained fixed-supply ERC-20 with no owner, admin role, mint, pause, blocklist, fee or burn. The constructor mints all 1,000,000,000 × 10¹⁸ TORCH once to `msg.sender`, which is the factory.\n\n**Access Control:** nothing privileged exists. A caller can only spend their own balance, through `transfer`, or an allowance someone granted them, through `transferFrom`. `approve` only writes the caller's own allowance. A stranger's `transferFrom` on another holder's tokens reverts; I checked this with a scratch test.\n\n**Trust Gap:** there are no exemptions and no external calls. That means the launch flows (factory to distributor, the distributor's claims, the seed through the PoolManager, and trading) all move exactly the amounts asked for.\n\n**Asymmetry:** this is where the finding is.\n- **Finding 1 (low), `src/TorchToken.sol:151`:** `_transfer` rejects a zero-address receiver but not a zero-address sender. So any address can call `transferFrom(address(0), x, 0)` and it succeeds, emitting `Transfer(0x0, x, 0)`. That event has the same shape as a mint, even though the contract says nothing mints after deployment, so off-chain indexers and supply trackers could be misled. No balance or supply changes. I confirmed it with a local forge test. The fix is one line: add `if (from == address(0)) revert ERC20InvalidSender(address(0));` in `_transfer`, which is what OpenZeppelin does.\n\n**Coverage:**\n- `approve` and `transfer`: holds.\n- `transferFrom`: finding 1.\n- Two invariants I added rows for: no privileged power exists, and the launch flows are exact. Both hold.\n\n**Checks run:**\n- The project's own test suite passes: 39 tests.\n- The aderyn \"large numeric literal\" warning is just the supply constant, so it isn't a defect.\n- My scratch tests went under `test/scratch/` and I deleted them afterwards. `.imd-findings.json` is the only file I wrote; no source file changed.\n- The protected floor tests need the launch environment variables, so I read them but did not run them on their own.","treeHash":null,"usage":{"cachedInputTokens":112863,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":3272,"runtime":"claude","turns":4,"wallClockMs":52669}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"cd8076510aad8b8e","findings":[{"citation":"resolved","description":"_transfer validates the receiver but not the sender. Because allowance[address(0)][caller] is 0 and the check at line 134 is `current < value`, a value of 0 passes, and _transfer then runs with from == address(0): balance 0 >= 0, no state change, but a Transfer(address(0), to, 0) event is emitted. The NatSpec at lines 9-10 claims OpenZeppelin-compatible semantics; OpenZeppelin v5 reverts this call with ERC20InvalidSender. Impact is limited to event noise: indexers that classify any Transfer from the zero address as a mint will record a zero-value mint for an arbitrary recipient at any time, by any caller. No balance, allowance or supply changes, so this is informational. Minimal fix that preserves intended behaviour: add `if (from == address(0)) revert ERC20InvalidSender(address(0));` at the top of _transfer (declaring that error).","line":148,"path":"src/TorchToken.sol","reproduction":"State: fresh deployment, any caller `alice` with no balance or allowance. Call: vm.prank(alice); token.transferFrom(address(0), bob, 0). Expected (OZ-compatible): revert ERC20InvalidSender(0x0). Actual: returns true and emits Transfer(from=0x0, to=bob, value=0); balanceOf(bob)=0, totalSupply=1e27 unchanged. Verified by test_zeroFromZeroValueEmitsMintShapedEvent in test/scratch/Probe.t.sol (recordLogs shows exactly one Transfer log with topics[1]=address(0), topics[2]=bob, data=0). Any non-zero value from address(0) reverts ERC20InsufficientAllowance, so no tokens can ever be moved this way.","severity":"info","snippet":"        if (to == address(0)) revert ERC20InvalidReceiver(address(0));","title":"transferFrom accepts address(0) as `from` for zero-value calls and emits a mint-shaped Transfer(0x0, to, 0) without allowance"}],"hash":"ac7b5898a6064c5a344683b8c9cf93891b912757bf91543279ec105f757efd36","nodeId":"697e7410-b160-425e-beac-d0e3d5df7f35","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. No source files were changed; the only file I wrote besides the findings is a probe under `test/scratch/`, which is ignored.\n\n**Outcome: no defects of low severity or above.** TorchToken is a plain, ownerless ERC-20 whose only mutating entry points are approve, transfer and transferFrom. I traced each through my three guides and found the control flow sound.\n\n- **Execution Trace.** Every guard sits before its unchecked arithmetic: the balance check at line 150 guards the subtraction, and the bounded supply makes the addition safe. Allowance is read and written in one function with no external call between, so there is no stale read. The max-allowance sentinel is exact, and max-minus-one is decremented. transferFrom reverts atomically when the balance check fails after the allowance write.\n- **Periphery.** There is nothing peripheral: no libraries, no assembly, no external calls, no receive or fallback. The runtime bytecode contains zero CALL-family, CREATE, SELFDESTRUCT or transient-storage opcodes. Return values are `true`, so SafeERC20 callers and the Uniswap v4 settle and take paths work.\n- **First Principles.** The constructor takes no arguments and mints exactly 1e27 to msg.sender once. Supply conservation held under a fuzzed random walk mixing transfer, transferFrom and self-transfers. The launch flows move exactly what they say because no fee, burn or exemption path exists.\n\n**One informational note recorded.** A zero-value `transferFrom` with the zero address as sender succeeds and emits a mint-shaped Transfer event, where OpenZeppelin v5 would revert. No balance, allowance or supply can change through it, so it is event noise only. The reproduction is in the findings file.\n\n**Coverage.** All three listed entry points have rows, plus six invariant rows covering supply conservation, no post-launch mint, constructor minting, exact launch flows, forbidden opcodes and metadata. Nothing in the assigned area was left unreached. Tools run: forge build, the project's 37 tests, a 7-test scratch probe with 256 fuzz runs, and an opcode scan. Slither and aderyn output from the verifier reported nothing above the large-literal note, which I checked and confirmed as a compile-time constant equal to 1e27.","treeHash":null,"usage":{"cachedInputTokens":501198,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":14143,"runtime":"claude","turns":23,"wallClockMs":199530}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"63c29c49a249ab7e","findings":[],"hash":"c673d6a528e860b253fd967c23eea50138fb32bd4b212fa431822bfb914dda3c","nodeId":"ea61cfaa-9674-46c5-ab7c-e6fa297ba6cd","outcome":"completed","summary":"I found no math defects in `src/TorchToken.sol`, so `.imd-findings.json` holds `{\"findings\":[]}` plus a coverage record.\n\n**Coverage, one row per entry point:**\n- **`approve(address,uint256)`: holds.** It stores the value as given, with no arithmetic, and rejects a zero spender.\n- **`transfer(address,uint256)`: holds.** The balance is checked before the unchecked subtraction. The addition can't overflow, because all balances always add up to the fixed supply of 1e27.\n- **`transferFrom(address,address,uint256)`: holds.** The allowance is checked before its unchecked subtraction. Only exactly 2^256−1 counts as unlimited; an allowance of 2^256−2 still goes down normally.\n- **Supply rule (supply = sum of balances = 1e27): holds.** `1_000_000_000 * 10**18` is exactly 1e27, minted once to the deployer, and no path mints, burns or takes a fee.\n\n**What I checked, using the Math Precision, Boundary and Numerical Gap guides:**\n- Every unchecked block and its guard.\n- Overflow at the edges: moving the full supply works, and the full supply plus one reverts.\n- Sending tokens to yourself, directly and through `transferFrom` (same sender and receiver), keeps the balance unchanged.\n- Zero-value transfers succeed; sending to the zero address reverts.\n- The \"unlimited allowance\" value only applies at exactly the maximum.\n\nThe contract has no division, rounding, narrowing casts, shifts or fees, so most of the precision checklist doesn't apply here.\n\n**Tests:** a fuzz test (5,000 runs) checking that balances and allowances add up, and a boundary test, both pass. They were temporary files under `test/scratch/` and I deleted them; nothing else changed. The existing suite passes, 37 of 37. The static-analysis tool's large-number warning at line 27 is just the intended supply constant. The other analyzer reported nothing.\n\n**Not covered:** the supplied protected tests import launch-harness contracts (`src/LaunchLiquidity.sol` and others) that aren't in this tree, so I didn't run them. That's outside the math area.","treeHash":null,"usage":{"cachedInputTokens":158046,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":3926,"runtime":"claude","turns":6,"wallClockMs":62733}},{"artifacts":[],"attempt":1,"bundleHash":"7b1cbda5354bff6bbec1f5b55df3120b5e4bb305f01ae8267bac469a529b0986","device":"dc176559ff153c37","findings":[],"hash":"d81ef9366316d03351ffc9d1d7bc7999a794687b3663dfde7a9132879c27625e","nodeId":"8e08a681-94ff-42e2-8226-e77ec65d5def","outcome":"completed","summary":"I added two test files for Torch (TORCH). The full suite now passes: `forge build` is clean and `forge test` with the verifier's fuzz seed gives 62 passed, 0 failed. I found no defects in `src/TorchToken.sol`, so there is no `.imd-findings.json`.\n\nThe token is a plain fixed-supply ERC-20. It has no owner, mint, burn, fee, pause or blocklist, and it mints exactly 1e27 to the deployer. The two test files that were already there covered the main paths well but had no invariant tests, which the acceptance criteria ask for.\n\n**`test/TorchToken.invariant.t.sol`** runs random sequences of calls across five holders:\n- **What it calls:** transfers, approvals (normal and unlimited) and `transferFrom`, plus the calls that must fail: sending more than the balance, spending more than the allowance, sending to the zero address, and approving the zero address. Each failing call is also checked for the exact error the contract defines.\n- **How it checks:** the handler keeps its own record of every balance and allowance, so the token is compared against independent bookkeeping rather than against itself.\n- **What must always hold:** total supply never changes; balances add up to the supply; balances and allowances match the handler's record; nothing ends up at the zero address, the token contract or the handler; every call succeeded or failed as specified; name, symbol and decimals never change.\n- **Run size:** 256 runs × 64 calls, set in the test file. In my run that made 16,384 calls with nothing discarded.\n- **Sanity check:** I ran a copy with a deliberately broken record. The balance and call-behaviour invariants failed straight away, so they aren't passing trivially.\n\n**`test/TorchToken.edges.t.sol`** has 24 tests for edge cases:\n- **Amounts:** the full supply out and back, one wei, one wei over the supply, and `type(uint256).max`.\n- **Self-transfers:** sending to yourself, an owner needing an allowance from themselves to use `transferFrom`, and `transferFrom` where sender and recipient are the same.\n- **Unusual but allowed:** a zero-value `transferFrom` with no allowance succeeds, and an allowance one below the maximum is still reduced as it's spent.\n- **Unlimited allowance:** it never decreases, but can't move more than the holder has.\n- **Rejected calls:** sending 0 to the zero address, approving the zero address for 0, and pulling from the zero address without an allowance all revert. A reverted call changes nothing.\n- **Events:** `transferFrom` emits only a `Transfer` event.\n- **Unexpected calls:** sending ETH to the token and calling a function it doesn't have both revert.\n- **Fuzz tests (1,000 runs each):** transfers round-trip back to the start, partial spends add up correctly, and an address without an allowance can't move anyone's tokens.\n\nA note on behaviour, not a defect: tokens sent to the token contract's own address are accepted and can never be recovered. That is normal for a plain ERC-20, and a test records it.\n\nI haven't committed the two new files; they are in the working tree.","treeHash":"0602e5d183fd67ca0d551afd72aacebbfaaccf5c","usage":{"cachedInputTokens":305041,"inputTokens":18,"model":"claude-opus-5-5","outputTokens":11339,"runtime":"claude","turns":10,"wallClockMs":139295}},{"artifacts":[],"attempt":1,"bundleHash":"471aa5c2f2dc87d5ebdf12e6af029b40688fe56c259210db83185eac8280fb89","device":"b97527597dd934a0","findings":[],"hash":"ef5024bb49fa0e028ff03d3dce2ee09887383444da9f7f41e2e65a3db432321e","nodeId":"47e394ca-16b9-455b-a1ca-90958164d20b","outcome":"completed","summary":"Done. The Torch token project is built, tested, documented and committed.\n\n**What was delivered**\n\n- `src/TorchToken.sol`: a self-contained fixed-supply ERC-20 named Torch, symbol TORCH, 18 decimals. The constructor takes no arguments and mints the full 1,000,000,000 × 10^18 to the deployer. There is no owner, mint, burn, pause, blocklist, fee or exemption list, and no external calls, so every launch flow moves exactly what it says.\n- `foundry.toml` at the repository root pins solc 0.8.26, sets bytecode_hash to none and cbor_metadata off, disables ffi and grants no filesystem permissions. forge-std v1.11.0 is vendored under lib/ as ordinary files with no submodule entry.\n- `README.md` documents behaviour, deployment parameters, launch values, assumptions, operational responsibilities and test coverage. It states there is nothing to configure after launch.\n\n**Tests** in `test/`, all passing with the verifier's fuzz seed, formatted with forge fmt:\n\n| Suite | Count | Covers |\n| --- | --- | --- |\n| TorchTokenTest | 32 | metadata, supply, mint-to-deployer, transfer and transferFrom success and revert paths, allowance semantics, absence of admin selectors, launch flow shape, five fuzz properties |\n| TorchTokenBytecodeTest | 5 | CREATE2 deployment through a factory stand-in, address prediction, EIP-170 size, no DELEGATECALL, CALLCODE or SELFDESTRUCT in reachable code |\n\nThe protected floor tests were read and designed against: the supply lands whole on the factory, transfers are exact, nothing increases supply, and no privileged call touches a holder.\n\n**Notes**\n\n- Slither was not available on this machine and did not run. The contract avoids all six rejecting detectors by construction.\n- The commit was made with the user's email for authorship since the repository had no identity configured. Only the project paths were staged; the sandbox's device-node dotfiles were left untracked.","treeHash":"ae3ae497e13a5e1d82d715009c646b13ac8d9612","usage":{"cachedInputTokens":497265,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":19552,"runtime":"claude","turns":20,"wallClockMs":286008}}],"verification":[{"checks":[{"durationMs":1139,"exitCode":0,"name":"build","output":"Compiling 22 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.05s\nCompiler run successful!\n","passed":true},{"durationMs":235,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/TorchToken.bytecode.t.sol:TorchTokenBytecodeTest\n[PASS] test_constructorTakesNoArguments() (gas: 399527)\n[PASS] test_create2AddressIsPredictable() (gas: 8911)\n[PASS] test_create2DeploymentMintsToFactory() (gas: 15149)\n[PASS] test_runtimeFitsEip170() (gas: 5004)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 759215)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 112.57ms (2.63ms CPU time)\n\nRan 32 tests for test/TorchToken.t.sol:TorchTokenTest\n[PASS] testFuzz_approveThenTransferFrom(uint256,uint256,uint256) (runs: 256, μ: 183003, ~: 163547)\nLogs:\n  Bound result 6770\n  Bound result 19073\n  Bound result 50000000000000000000\n\n[PASS] testFuzz_randomTransfersNeverChangeTotalSupply(uint8,bytes32) (runs: 256, μ: 3117734, ~: 880717)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 102336, ~: 102767)\nLogs:\n  Bound result 127\n  Bound result 161\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 86759, ~: 87040)\nLogs:\n  Bound result 1000000000000000000000000000\n\n[PASS] testFuzz_unlimitedAllowanceStaysUnlimited(uint256,uint256) (runs: 256, μ: 183584, ~: 184819)\nLogs:\n  Bound result 127\n  Bound result 33\n\n[PASS] test_allowanceIsPerSpender() (gas: 145218)\n[PASS] test_approveDoesNotRequireBalance() (gas: 62336)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 132283)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32798)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 76786)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8490)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 25177)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 97932)\n[PASS] test_hasNoMintBurnOrAdminEntryPoints() (gas: 349515)\n[PASS] test_launchFlowsMoveExactAmounts() (gas: 275981)\n[PASS] test_metadata() (gas: 47185)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 16023)\n[PASS] test_transferBetweenOrdinaryHolders() (gas: 134129)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 175403)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 149674)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 154996)\n[PASS] test_transferFromRevertsToZeroAddress() (gas: 145595)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 101856)\n[PASS] test_transferFromSpendsAllowance() (gas: 213873)\n[PASS] test_transferFromUnlimitedAllowanceIsNotDecremented() (gas: 187126)\n[PASS] test_transferMovesExactAmount() (gas: 87410)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37735)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 108913)\n[PASS] test_transferRevertsToZeroAddress() (gas: 90205)\n[PASS] test_transferToSelfKeepsBalance() (gas: 97668)\n[PASS] test_transferWholeBalance() (gas: 129296)\n[PASS] test_transferZeroSucceedsAndEmits() (gas: 46835)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 112.70ms (157.63ms CPU time)\n\nRan 2 test suites in 113.58ms (225.27ms CPU time): 37 tests passed, 0 failed, 0 skipped (37 total tests)\n","passed":true},{"durationMs":50,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"TorchToken.approve(address,uint256)\",\"TorchToken.transfer(address,uint256)\",\"TorchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":128,\"foundry.toml\":23,\"launch.json\":24,\"remappings.txt\":1,\"src/TorchToken.sol\":158,\"test/TorchToken.bytecode.t.sol\":73,\"test/TorchToken.t.sol\":406},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"35b4bd71e84c4513cfb64395f03d06cb1538232f882fa9367e4ed8936a2c3f05","verifiedTreeHash":"0193b702c7173f2fc5407a2290c2d1adcf7b05ae","verifierVersion":"0.1.0+260efc41"},{"checks":[{"durationMs":1855,"exitCode":0,"name":"build","output":"Compiling 24 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.74s\nCompiler run successful!\n","passed":true},{"durationMs":6277,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/TorchToken.bytecode.t.sol:TorchTokenBytecodeTest\n[PASS] test_constructorTakesNoArguments() (gas: 399527)\n[PASS] test_create2AddressIsPredictable() (gas: 8911)\n[PASS] test_create2DeploymentMintsToFactory() (gas: 15149)\n[PASS] test_runtimeFitsEip170() (gas: 5004)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 759215)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 27.82ms (3.08ms CPU time)\n\nRan 24 tests for test/TorchToken.edges.t.sol:TorchTokenEdgesTest\n[PASS] testFuzz_allowanceSpendsAddUp(uint256,uint256,uint256) (runs: 1000, μ: 182790, ~: 185321)\nLogs:\n  Bound result 1775167771\n  Bound result 1109475499\n  Bound result 143403018\n\n[PASS] testFuzz_selfTransferIsNoOp(uint256) (runs: 1000, μ: 44057, ~: 43790)\nLogs:\n  Bound result 546232504595820301885184808\n\n[PASS] testFuzz_thirdPartyCannotMoveFunds(address,uint256) (runs: 1000, μ: 49391, ~: 49474)\nLogs:\n  Bound result 132739\n\n[PASS] testFuzz_transferRoundTrip(address,uint256) (runs: 1000, μ: 112077, ~: 112132)\nLogs:\n  Bound result 1160603342939700693591623131486337411840264677838\n  Bound result 132739\n\n[PASS] test_allowanceOneBelowMaxIsDecremented() (gas: 123127)\n[PASS] test_approveMaxEmitsMax() (gas: 61401)\n[PASS] test_approveZeroSpenderRevertsEvenForZeroValue() (gas: 32837)\n[PASS] test_ownerNeedsOwnAllowanceForTransferFrom() (gas: 153407)\n[PASS] test_rejectsEther() (gas: 38744)\n[PASS] test_revertedTransferFromLeavesNoLogsAndNoState() (gas: 102314)\n[PASS] test_selfTransferAboveBalanceReverts() (gas: 35744)\n[PASS] test_transferFromEmitsOnlyTransfer() (gas: 122772)\n[PASS] test_transferFromToSameAccountSpendsAllowanceKeepsBalance() (gas: 103281)\n[PASS] test_transferFromZeroOwnerNeedsAllowance() (gas: 38043)\n[PASS] test_transferFromZeroValueWithoutAllowanceSucceeds() (gas: 61538)\n[PASS] test_transferMaxUintReverts() (gas: 38073)\n[PASS] test_transferOneWei() (gas: 76706)\n[PASS] test_transferOneWeiAboveSupplyReverts() (gas: 42066)\n[PASS] test_transferToTokenContractIsAcceptedAndStuck() (gas: 70091)\n[PASS] test_transferWholeSupplyAndBack() (gas: 143724)\n[PASS] test_unknownSelectorReverts() (gas: 26545)\n[PASS] test_unlimitedAllowanceCanDrainWholeSupply() (gas: 126940)\n[PASS] test_unlimitedAllowanceStillBoundByBalance() (gas: 88330)\n[PASS] test_zeroTransferToZeroAddressReverts() (gas: 32827)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 94.56ms (178.84ms CPU time)\n\nRan 32 tests for test/TorchToken.t.sol:TorchTokenTest\n[PASS] testFuzz_approveThenTransferFrom(uint256,uint256,uint256) (runs: 256, μ: 182308, ~: 163457)\nLogs:\n  Bound result 3741\n  Bound result 10000\n  Bound result 200000000000000000000\n\n[PASS] testFuzz_randomTransfersNeverChangeTotalSupply(uint8,bytes32) (runs: 256, μ: 3131776, ~: 853900)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 102347, ~: 102767)\nLogs:\n  Bound result 100000000000000000001\n  Bound result 999999939999999999999999999\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 86705, ~: 87040)\nLogs:\n  Bound result 888435364330630013165214734\n\n[PASS] testFuzz_unlimitedAllowanceStaysUnlimited(uint256,uint256) (runs: 256, μ: 183348, ~: 184811)\nLogs:\n  Bound result 100000000000000000001\n  Bound result 40000000000000000000\n\n[PASS] test_allowanceIsPerSpender() (gas: 145218)\n[PASS] test_approveDoesNotRequireBalance() (gas: 62336)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 132283)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32798)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 76786)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8490)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 25177)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 97932)\n[PASS] test_hasNoMintBurnOrAdminEntryPoints() (gas: 349515)\n[PASS] test_launchFlowsMoveExactAmounts() (gas: 275981)\n[PASS] test_metadata() (gas: 47185)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 16023)\n[PASS] test_transferBetweenOrdinaryHolders() (gas: 134129)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 175403)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 149674)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 154996)\n[PASS] test_transferFromRevertsToZeroAddress() (gas: 145595)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 101856)\n[PASS] test_transferFromSpendsAllowance() (gas: 213873)\n[PASS] test_transferFromUnlimitedAllowanceIsNotDecremented() (gas: 187126)\n[PASS] test_transferMovesExactAmount() (gas: 87410)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37735)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 108913)\n[PASS] test_transferRevertsToZeroAddress() (gas: 90205)\n[PASS] test_transferToSelfKeepsBalance() (gas: 97668)\n[PASS] test_transferWholeBalance() (gas: 129296)\n[PASS] test_transferZeroSucceedsAndEmits() (gas: 46835)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 132.84ms (307.22ms CPU time)\n\nRan 1 test for test/TorchToken.invariant.t.sol:TorchTokenInvariantTest\n[PASS]\nTorchTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_balancesMatchModel\n[PASS] invariant_balancesSumToSupply\n[PASS] invariant_everyCallBehavedAsSpecified\n[PASS] invariant_metadataNeverChanges\n[PASS] invariant_nothingLeaksOutsideTheActors\n[PASS] invariant_totalSupplyIsFixed\n TorchTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+---------------------------+-------+---------+----------╮\n| Contract     | Selector                  | Calls | Reverts | Discards |\n+=======================================================================+\n| TorchHandler | approve                   | 1972  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| TorchHandler | approveZeroSpender        | 2086  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| TorchHandler | transfer                  | 2100  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| TorchHandler | transferFrom              | 2034  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| TorchHandler | transferFromOverAllowance | 2019  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| TorchHandler | transferFromOverBalance   | 2030  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| TorchHandler | transferToZero            | 2060  | 0       | 0        |\n|--------------+---------------------------+-------+---------+----------|\n| TorchHandler | transferTooMuch           | 2083  | 0       | 0        |\n╰--------------+---------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 7993\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n  Bound result 10000\n  Bound result 0\n  Bound result 0\n  Bound result 96\n  Bound result 3374\n  Bound result 0\n  Bound result 294\n  Bound result 0\n  Bound result 4839\n  Bound result 127815120898833271084401535\n  Bound result 7\n  Bound result 1\n  Bound result 10\n  Bound result 1000000000\n  Bound result 945398527137029341434187\n  Bound result 180395999768882\n  Bound result 168\n  Bound result 0\n  Bound result 0\n  Bound result 100000000000000000001\n  Bound result 42000000000000000000\n  Bound result 0\n  Bound result 42000000000000000000\n  Bound result 91840440644823661920095974\n  Bound result 0\n  Bound result 321\n  Bound result 243\n  Bound result 1\n  Bound result 0\n  Bound result 82\n  Bound result 0\n  Bound result 0\n  Bound result 118674151513520190027484107\n  Bound result 43225668244699733248654446\n  Bound result 649999957999999999999999998\n  Bound result 200000000000000000000\n  Bound result 0\n  Bound result 772744740\n  Bound result 3516\n  Bound result 3184\n  Bound result 242047286940026187778773589014424610068089731319278368558905424\n  Bound result 889\n  Bound result 11591566411820199908423\n  Bound result 42000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.16s (6.16s CPU time)\n\nRan 4 test suites in 6.16s (6.42s CPU time): 62 tests passed, 0 failed, 0 skipped (62 total tests)\n","passed":true},{"durationMs":42,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"TorchToken.approve(address,uint256)\",\"TorchToken.transfer(address,uint256)\",\"TorchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":128,\"foundry.toml\":23,\"remappings.txt\":1,\"src/TorchToken.sol\":158,\"test/TorchToken.bytecode.t.sol\":73,\"test/TorchToken.edges.t.sol\":235,\"test/TorchToken.invariant.t.sol\":259,\"test/TorchToken.t.sol\":406},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d81ef9366316d03351ffc9d1d7bc7999a794687b3663dfde7a9132879c27625e","verifiedTreeHash":"0602e5d183fd67ca0d551afd72aacebbfaaccf5c","verifierVersion":"0.1.0+260efc41"},{"checks":[{"durationMs":1097,"exitCode":0,"name":"build","output":"Compiling 22 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.01s\nCompiler run successful!\n","passed":true},{"durationMs":213,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/TorchToken.bytecode.t.sol:TorchTokenBytecodeTest\n[PASS] test_constructorTakesNoArguments() (gas: 399527)\n[PASS] test_create2AddressIsPredictable() (gas: 8911)\n[PASS] test_create2DeploymentMintsToFactory() (gas: 15149)\n[PASS] test_runtimeFitsEip170() (gas: 5004)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 759215)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 13.34ms (2.25ms CPU time)\n\nRan 32 tests for test/TorchToken.t.sol:TorchTokenTest\n[PASS] testFuzz_approveThenTransferFrom(uint256,uint256,uint256) (runs: 256, μ: 183003, ~: 163547)\nLogs:\n  Bound result 16188\n  Bound result 5000000000000000000\n  Bound result 96\n\n[PASS] testFuzz_randomTransfersNeverChangeTotalSupply(uint8,bytes32) (runs: 256, μ: 3117734, ~: 880717)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 102336, ~: 102767)\nLogs:\n  Bound result 943388597575268485213146019\n  Bound result 962525470959648657137654574\n\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 86759, ~: 87040)\nLogs:\n  Bound result 952304451322871058490718272\n\n[PASS] testFuzz_unlimitedAllowanceStaysUnlimited(uint256,uint256) (runs: 256, μ: 183584, ~: 184819)\nLogs:\n  Bound result 572510744889736289805704112\n  Bound result 68535330237555\n\n[PASS] test_allowanceIsPerSpender() (gas: 145218)\n[PASS] test_approveDoesNotRequireBalance() (gas: 62336)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 132283)\n[PASS] test_approveRevertsForZeroSpender() (gas: 32798)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 76786)\n[PASS] test_constructorEmitsMintTransfer() (gas: 8490)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 25177)\n[PASS] test_deployerCannotPullFromHolderWithoutAllowance() (gas: 97932)\n[PASS] test_hasNoMintBurnOrAdminEntryPoints() (gas: 349515)\n[PASS] test_launchFlowsMoveExactAmounts() (gas: 275981)\n[PASS] test_metadata() (gas: 47185)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 16023)\n[PASS] test_transferBetweenOrdinaryHolders() (gas: 134129)\n[PASS] test_transferFromExactAllowanceLeavesZero() (gas: 175403)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 149674)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 154996)\n[PASS] test_transferFromRevertsToZeroAddress() (gas: 145595)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 101856)\n[PASS] test_transferFromSpendsAllowance() (gas: 213873)\n[PASS] test_transferFromUnlimitedAllowanceIsNotDecremented() (gas: 187126)\n[PASS] test_transferMovesExactAmount() (gas: 87410)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 37735)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 108913)\n[PASS] test_transferRevertsToZeroAddress() (gas: 90205)\n[PASS] test_transferToSelfKeepsBalance() (gas: 97668)\n[PASS] test_transferWholeBalance() (gas: 129296)\n[PASS] test_transferZeroSucceedsAndEmits() (gas: 46835)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 97.03ms (144.82ms CPU time)\n\nRan 2 test suites in 97.95ms (110.37ms CPU time): 37 tests passed, 0 failed, 0 skipped (37 total tests)\n","passed":true},{"durationMs":46,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"TorchToken.approve(address,uint256)\",\"TorchToken.transfer(address,uint256)\",\"TorchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":128,\"foundry.toml\":23,\"remappings.txt\":1,\"src/TorchToken.sol\":158,\"test/TorchToken.bytecode.t.sol\":73,\"test/TorchToken.t.sol\":406},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":510,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":346,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/TorchToken.sol:27: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ef5024bb49fa0e028ff03d3dce2ee09887383444da9f7f41e2e65a3db432321e","verifiedTreeHash":"ae3ae497e13a5e1d82d715009c646b13ac8d9612","verifierVersion":"0.1.0+260efc41"}]}