{"assessments":[],"deployments":[{"attestationHash":"e960f0164cc8fefe1c33c83a70a3cda5febf79b5c930d043ffb686f7a6b4006b","chainId":4663,"contracts":[{"address":"0x19bec7c2e1b2aadaf67b259744751a9960d66000","blockNumber":110205042,"name":"PoolInitializationGuard","role":"hook","txHash":"0x4b12ccf3e8e60df5ed06bb47b6cc589750dbabce9e4249730a102f32534b6977"},{"address":"0xab707874a23b58cb67f71382111b149f4ba96a9d","blockNumber":110205042,"name":"ConditionToken","role":"token","txHash":"0x4b12ccf3e8e60df5ed06bb47b6cc589750dbabce9e4249730a102f32534b6977"},{"address":"0x5440a94cd9eee4c042435f6617a335d72492e5b5","blockNumber":110205042,"name":"MerkleDistributor","role":"distributor","txHash":"0x4b12ccf3e8e60df5ed06bb47b6cc589750dbabce9e4249730a102f32534b6977"}],"id":"8539a2d9-63fb-4dcf-97af-268f48fb380b","manifestHash":"e68a8451b10123411f98e1fe4cec52b5f441bd4f7ac591b12ed97da468cc8b3e","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":"3e189aae-5adc-41b3-830d-c7f9f7ab8fd3","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"dbc183cf95c6589471736ae8fbce2dcb0da6f6208b1bb5cf2e4797bf0df3b27f","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":"bbffaea0641606cb12add189686a2d7d454140dd3dee7583cf3d48d067532700","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":"09d8871991a975321a16319eba647595e3c69dbac791927e3866a83c2d9a7677","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":"84134c533c64c209559ca513edebd2e14bbf28153156b425d11b227b25928895","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":"1b22043d9e69b50dda42598e412c32a4f9fc3a0037c0d91c5288dd44d76edecc","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":"b76480d5e4d9a4150000e6fbbb4ad8a71d47368cf974a2657ebeaaa91254db68","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"48ed022e75bbd7b8e2d727b70a7e35a97d9fdd18023e4bee660045ff73df39c4","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"27fe67459a28a506446cbb6852d632401de7b444026b71eac13362a4a827e6b7","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"1ddb4d02eb75e52d5f38cfd5c9bb54f332687b81929c68880cf1e8a6ab27254d","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"1ddb4d02eb75e52d5f38cfd5c9bb54f332687b81929c68880cf1e8a6ab27254d","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: CONDITIONALS (CONDITION).\nToken name: CONDITIONALS\nToken symbol: CONDITION\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"5dcf2697afc7fba120f0c5325e7b50382d4a3d76cff23f2fc58f9bc70eb91035","previousHash":"130b4b9ac6b46a8d78eeb19332e4694a34344d6a6aacc85a1f063fbeaffed282","projectId":"3e189aae-5adc-41b3-830d-c7f9f7ab8fd3","publication":{"commit":"266db76a0f56ec4614c70b45259354af6c491a71","deliveredAt":"2026-11-09T16:39:47.171Z","repoUrl":"https://github.com/identity-md-launches/launch-3166-conditionals"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"259470d8642d9af2b817e58bd3156945c2281b1f9e75a6f8c9164e891279bd49","state":"completed","submissions":[{"artifacts":[],"attempt":2,"bundleHash":null,"device":"3516474d8a268bd8","findings":[],"hash":"09d8871991a975321a16319eba647595e3c69dbac791927e3866a83c2d9a7677","nodeId":"480c09d6-e665-4400-b6b4-13e189419570","outcome":"completed","summary":"The review is complete and the findings file is written with an empty findings list and a full coverage record.\n\n**Outcome: no defects found.** All four specialists and the test writer reported nothing, and I could not produce a reproducible defect either.\n\nWhat I verified against the code:\n\n- **Token source** is a 16-line OpenZeppelin ERC-20 with a zero-argument constructor that mints 1e27 base units once to msg.sender. Name, symbol, decimals and supply match the task and launch.json.\n- **Vendored OpenZeppelin** files are byte-identical to the upstream v5.4.0 archive, whose SHA-256 matches DEPENDENCIES.md. The three entry points therefore behave exactly as the standard library does: zero-address checks, exact-amount transfers, finite allowances consumed and max allowance unlimited.\n- **No privileged surface.** The compiled ABI has only approve, transfer and transferFrom as state-changing functions. There is no mint, burn, pause, blacklist, owner, fallback or receive, so supply cannot grow and no one can move or freeze a holder's balance.\n- **Deployability.** Creation code is about 2.7 KB and runtime about 1.8 KB, far under the limits. The opcode listing contains no DELEGATECALL, CALLCODE or SELFDESTRUCT. The constructor makes no external calls.\n- **Tests.** The project's 50 unit, fuzz and invariant tests pass with the pinned seed, and forge fmt is clean.\n- **Manifest.** launch.json uses only schema keys with correct types and lowercase addresses, an empty constructorArgs list matching the constructor, and pool and economics values equal to the launch's own in the reference.\n- **Static analysis.** The single aderyn low-impact line is a stylistic note on the already-underscored supply constant and was dropped.\n\nThe coverage record marks all three entry points as holding, plus rows for the constructor, supply and privilege invariants, deployability, the manifest and the static-analysis leads. No repository files were modified.","treeHash":null,"usage":{"cachedInputTokens":231956,"cost":{"source":"runtime","usdMicros":1132316},"inputTokens":162,"model":"claude-fable-5-1","outputTokens":5634,"runtime":"claude","turns":13,"wallClockMs":81699}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"82692ab5f7f7e54e","findings":[],"hash":"1b22043d9e69b50dda42598e412c32a4f9fc3a0037c0d91c5288dd44d76edecc","nodeId":"e6da1f19-987c-41ab-9119-9cdfd54eefde","outcome":"completed","summary":"The permissions review of the CONDITIONALS token found no defects. The findings file holds an empty findings list and seven coverage rows, all `holds`.\n\n## Scope\n\nFiles read: `src/ConditionToken.sol` (16 lines), the five vendored OpenZeppelin files, both project test files, both protected tests, and the Pashov Mindset plus the Access Control, Trust Gap and Asymmetry guides. Nothing in the assigned area was left unreached.\n\n**Severity counts:** 0 Critical · 0 High · 0 Medium · 0 Low\n\n## What was checked\n\n- **Permission model.** The contract declares one constant and one constructor. No owner, role, modifier, initializer, setter, mint, burn, pause, blacklist, freeze or seize path exists. The compiled ABI exposes only the nine ERC-20 functions plus the supply constant.\n- **Inherited code.** Every vendored OpenZeppelin file was diffed against the upstream v5.4.0 tag and is byte-identical. No override of `_update`, `_approve` or any guard exists. `Context` returns plain `msg.sender`, so no forwarder can spoof a caller.\n- **Entry points.** `transfer` moves only the caller's balance and rejects the zero address. `transferFrom` requires allowance from every caller, including the deployer and the holder itself, and does not decrement an infinite allowance. `approve` writes only the caller's own allowance row. All three were traced through `_transfer`, `_update` and `_spendAllowance` with the revert paths confirmed.\n- **Asymmetry.** Both transfer paths share the same balance writes. The only difference is that spending an allowance emits no `Approval` event, which is documented OpenZeppelin v5 behaviour and stated in the README.\n- **Trust Gap.** With no privileged actor and no economic formula, there is no seam where authorization and economics interact.\n- **Launch floor.** The constructor mints exactly 10^27 base units to `msg.sender`, which is the factory. The runtime bytecode contains no CALL, STATICCALL, DELEGATECALL, CALLCODE, CREATE or SELFDESTRUCT opcode. The existing 29 tests and the invariant suite pass, and `forge fmt --check` is clean.\n- **Static analysis leads.** Slither reported nothing. Aderyn's large-literal warning resolves to the correct supply value and is not a defect.\n\n## Observations (non-blocking)\n\n- A zero-value `transferFrom` succeeds without allowance and emits a `Transfer` event naming any `from` address. This is standard ERC-20 and OpenZeppelin behaviour, so it is not reported as a finding.\n- The standard ERC-20 approve race applies, as the README already documents.\n- No `launch.json` exists yet. When written, the token entry needs an empty `constructorArgs` list and a `totalSupply` of `1000000000000000000000000000`.","treeHash":null,"usage":{"cachedInputTokens":361445,"cost":{"source":"runtime","usdMicros":2216495},"inputTokens":162,"model":"claude-fable-5-1","outputTokens":9727,"runtime":"claude","turns":17,"wallClockMs":149931}},{"artifacts":[],"attempt":1,"bundleHash":"67403420ecadb51b7c3b3e25ac8e1c8f19c3cc0a1d9b31a753b799c0cf1f56ad","device":"c2a2bddd2b92d71e","findings":[],"hash":"27fe67459a28a506446cbb6852d632401de7b444026b71eac13362a4a827e6b7","nodeId":"b02399d9-6c34-4197-9718-34955d1a4829","outcome":"completed","summary":"I added two test files to the existing suite. `forge test` passes with the verifier's fuzz seed: 50 tests across 4 suites, none failing or skipped. I found no defects, so there is no `.imd-findings.json`. I haven't committed anything.\n\nThe token (`src/ConditionToken.sol`) is a plain OpenZeppelin v5 ERC-20. It mints exactly 1,000,000,000 × 10¹⁸ once to `msg.sender` and has no admin, mint, burn or pause functions. The earlier contributor's 29 tests were already sound, so I added to them rather than rewriting.\n\n**`test/ConditionToken.model.invariant.t.sol`** (256 runs, about 16k calls):\n- **Handler:** tests random sequences across six actors: the deployer, a distributor, a pool manager, two users and the token's own address. Unlike the existing handler, it also makes calls that should fail: overdrafts, zero-address recipients and spenders, missing or used-up allowances, and random calldata. Each call is checked against a separate record of expected balances and allowances, including the exact error it should revert with.\n- **Invariants:**\n  - Every balance and allowance matches the expected record.\n  - All balances add up to the fixed supply.\n  - `totalSupply` never changes, even after random calldata.\n  - No spender ever moves more than it was granted.\n  - Name, symbol and decimals never change.\n- **Check that the handler works:** a plain test drives it step by step to confirm it really produces both successful and failing calls, so the invariants aren't passing on nothing.\n\n**`test/ConditionToken.launch.t.sol`** (19 tests):\n- **Launch flow:** a stand-in factory deploys the token with CREATE2 and splits the supply in one call: 10% to the distributor, the pool share, and the rest to the requester. It checks the predicted address and that every amount arrives exact. A fuzz test covers every pool share up to 90%. Equal claims from the distributor arrive whole, an overpaying batch reverts completely, and the same salt can't be deployed twice.\n- **Bytecode and calls:** the reachable runtime code has no DELEGATECALL, CALLCODE or SELFDESTRUCT. The token refuses ETH. Unknown function selectors change nothing. `transfer`, `approve` and `transferFrom` return a proper `true` value.\n- **Edge cases:**\n  - Moving 1 wei and the last wei, and trying to transfer the maximum uint256.\n  - An allowance of max − 1 still counts down; spending an allowance emits no Approval event.\n  - An approval only works for that spender and that owner; an allowance larger than the balance is still limited by the balance.\n  - Fuzzed `approve`, chained transfers, and an unlimited allowance that never goes down.\n\nOne thing to know, which is standard ERC-20 behaviour and not a defect: tokens sent to the token contract's own address are accepted and can never be recovered, though they still count toward the supply. A test documents this.","treeHash":"2a39e6fb200c799fe118dfc670d99547ad80cfc9","usage":{"cachedInputTokens":412366,"cost":{"source":"runtime","usdMicros":856697},"inputTokens":21,"model":"claude-opus-5-5","outputTokens":16351,"runtime":"claude","turns":12,"wallClockMs":201367}},{"artifacts":[],"attempt":1,"bundleHash":"b3d5ba0c29b2019155c791cfa66e52eedd9291bc5fed7e1fe5dfabf9adb393a9","device":"23617eab0c5242d6","findings":[],"hash":"48ed022e75bbd7b8e2d727b70a7e35a97d9fdd18023e4bee660045ff73df39c4","nodeId":"412e6fce-d206-4aaa-a956-04565f242522","outcome":"completed","summary":"I wrote `launch.json` for the CONDITIONALS (CONDITION) launch. The project builds and all 29 existing tests pass with the required fuzz seed. I couldn't commit it, because git has no author name or email set on this machine and I didn't want to change its configuration. So the file is sitting uncommitted in the working tree, and it's the only file I changed.\n\nWhat the manifest says:\n- **Token:** the contract in `src/ConditionToken.sol` is named `ConditionToken`. Its constructor takes no arguments, so `constructorArgs` is `[]`. It returns the name CONDITIONALS, symbol CONDITION and 18 decimals.\n- **Supply:** `totalSupply` is `\"1000000000000000000000000000\"`, which is exactly what the constructor mints once to the deployer (`1_000_000_000 * 10**18`).\n- **Application contracts:** `contracts` is `[]`, because the accepted code contains only the token.\n- **Pool and economics:** both are copied exactly from the brief: the IMD pair token address, fee 12500, tick spacing 60, the one-to-one `initialPrice`, and the requester's economics object.\n- **Notes:** a short description of the token. It has no owner, no admin functions, cannot mint more, and charges no fee or burn on transfer.\n\nThe file is valid JSON and has only the fields the schema allows. I couldn't run the two protected check files (`Owners.protected.t.sol` and `Token.protected.t.sol`) here: they import `src/LaunchLiquidity.sol`, which isn't in this repository, and they read values from environment variables that the verifier sets.","treeHash":"2e9559cba5723016667265841a5cac95927b9283","usage":{"cachedInputTokens":104897,"cost":{"source":"runtime","usdMicros":161035},"inputTokens":12,"model":"claude-opus-5-5","outputTokens":2294,"runtime":"claude","turns":6,"wallClockMs":30566}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7c748c02cd2ee98f","findings":[],"hash":"84134c533c64c209559ca513edebd2e14bbf28153156b425d11b227b25928895","nodeId":"05c1fa21-b853-4da8-baab-d049d50c12de","outcome":"completed","summary":"The review is complete. The findings file is written and validated, and the working tree holds no changes of mine beyond it.\n\n**Result: no defects found in the math area.** The token at `src/ConditionToken.sol` is a 16-line fixed-supply wrapper over the unmodified OpenZeppelin v5.4.0 ERC-20. It has no fee, tax, burn, mint, scaling, division, cast, or external call, so most failure modes in the Math Precision, Boundary and Numerical Gap guides have no surface to attach to. What remained, I checked directly:\n\n- **Supply constant.** The literal aderyn flagged folds at compile time to exactly 10^27, and that constant appears in the deployed bytecode. It matches the task's 1,000,000,000 tokens at 18 decimals with no truncation or overflow.\n- **Transfer arithmetic.** The balance check precedes every unchecked subtraction, and receiver additions are bounded by the fixed supply. Probed inputs were 0, 1 wei, the full balance, supply plus one, and max uint, each giving the exact expected revert or result.\n- **Allowance boundaries.** Max is infinite, max minus one is finite and decremented, an allowance equal to the amount goes to zero, and a failed transfer leaves the allowance intact.\n- **Launch split arithmetic.** The 10/80/10 percent splits of 10^27 have zero remainder and the intermediate product cannot overflow, so every launch flow arrives whole.\n- **Boundaries.** No payable, receive or fallback exists. ETH and unknown selectors revert. Reachable runtime code contains no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n\nVerification run on this machine: forge build succeeded, the project's 29 tests passed including the stateful invariant suite, formatting check passed, and my 17 scratch probes passed before I removed them. The vendored OpenZeppelin files match the upstream v5.4.0 text.\n\nThe coverage record answers all three listed entry points as holding, plus rows for the constructor and three invariants. Nothing in my area was left unreached. Out of my area, I noted no severe issue either. The static-analysis lead was style only.","treeHash":null,"usage":{"cachedInputTokens":562976,"cost":{"source":"runtime","usdMicros":2395998},"inputTokens":258,"model":"claude-fable-5-1","outputTokens":12432,"runtime":"claude","turns":28,"wallClockMs":168071}},{"artifacts":[],"attempt":1,"bundleHash":"c2ee83f6b6a6962311fd38f03478917e0dd73d33d799f42b9c71e05f34cb1e69","device":"8632d45e6a022317","findings":[],"hash":"b76480d5e4d9a4150000e6fbbb4ad8a71d47368cf974a2657ebeaaa91254db68","nodeId":"8c534be7-ca02-4bea-9549-f0adbeb2ebdb","outcome":"completed","summary":"Implemented CONDITIONALS (`CONDITION`) with 18 decimals and exactly 1,000,000,000 tokens minted once to the deployer.\n\nIncluded vendored dependencies, deployment and operations documentation, and success, failure, fuzz, and invariant tests.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passed.\n- `forge test` passed: 29 tests using the requested fuzz seed.\n- `forge fmt --check` passed.","treeHash":"b28b9425e0cc29184a142528bb6580ba1f4d0703","usage":{"cachedInputTokens":444544,"cost":{"source":"estimated","usdMicros":313211},"inputTokens":48781,"model":"gpt-6.1-sol","outputTokens":12674,"runtime":"codex","turns":4,"wallClockMs":297912}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5c1e4764d4e20ef5","findings":[],"hash":"bbffaea0641606cb12add189686a2d7d454140dd3dee7583cf3d48d067532700","nodeId":"5405ae97-6c9a-4cc1-939c-e12a9fc13a84","outcome":"completed","summary":"The findings file is in place and excluded from git by the repository's own exclude list, which is the intended arrangement. The scratch directory is gone and the source tree is unchanged.\n\n## Result\n\n**No defects found.** The review of the control-flow area is written to `.imd-findings.json` with an empty findings list and nine coverage rows, all `holds`.\n\n**What the token is.** A 16-line contract inheriting OpenZeppelin ERC-20 v5.4.0 with no overrides. The constructor takes no arguments and mints one billion tokens at 18 decimals to the deploying address once. It exposes only the three standard state-changing functions and the standard views.\n\n**What I checked, by guide:**\n\n- **Execution Trace.** Traced approve, transfer and transferFrom through OpenZeppelin's internal functions to the storage writes and events. Zero-address sentinels revert on every path, the infinite allowance is left untouched, failed delegated transfers revert atomically, and no function makes an external call or has a reentrancy surface. The zero-value transferFrom that needs no allowance only emits an event with no balance effect, which is standard behaviour.\n- **Periphery.** Hashed the five vendored OpenZeppelin files against the upstream v5.4.0 tag archive downloaded from GitHub. All match byte for byte, and the archive hash matches DEPENDENCIES.md. Message sender resolution never uses tx.origin.\n- **First Principles.** The mint amount equals the stated supply exactly. Storage holds only the five ERC-20 slots, so no owner, pause, blacklist or minter state exists anywhere. The compiled ABI has no mint, burn, initializer, receive or fallback. A reachable-opcode scan of the runtime found no DELEGATECALL, CALLCODE, SELFDESTRUCT, CALL, CREATE, PUSH0 or transient storage, so the protected floor tests should pass on this artifact.\n\n**Checks run.** Build, the full project suite with the README's fuzz seed, and formatting check all passed. A temporary scratch test replaying the launch distribution flows, the opcode scan and ETH rejection also passed and was then deleted.\n\n**Not reached.** No live Uniswap v4 pool seed or swap, since the protected harness depends on v4-core which is not vendored here. The token has no pool-specific code, so nothing in this area depends on that result.\n\nThe aderyn large-numeric-literal lead is a style note on a compile-time constant and was not reported.","treeHash":null,"usage":{"cachedInputTokens":487660,"cost":{"source":"runtime","usdMicros":2048819},"inputTokens":258,"model":"claude-fable-5-1","outputTokens":11017,"runtime":"claude","turns":25,"wallClockMs":172064}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7236faf97e42979a","findings":[],"hash":"dbc183cf95c6589471736ae8fbce2dcb0da6f6208b1bb5cf2e4797bf0df3b27f","nodeId":"d5468197-1982-4162-8d34-85752dfa1dd4","outcome":"completed","summary":"The review is complete and the findings file is in place with a clean result.\n\n**Outcome: no defects found in the economics area.** The file `.imd-findings.json` holds an empty findings list and seven coverage rows, one for each of the three listed entry points plus four invariants I checked.\n\n**What the token is.** ConditionToken is a plain OpenZeppelin v5.4.0 ERC-20 with one constructor that mints 10^27 base units to msg.sender. There is no `_update` override, no owner, no mint, burn, pause, blacklist, hook, receive or fallback. The compiled ABI is exactly the standard ERC-20 surface plus the `INITIAL_SUPPLY` getter.\n\n**How I checked it against the three guides:**\n\n- **Economic Security.** No external dependencies, oracles or sentinel paths exist beyond the standard zero-address reverts. ERC-20 compliance holds: all three state-changing functions return true or revert, never return false. The approval-replacement race is the standard ERC-20 property, documented in the README, and is not a defect.\n- **Invariant.** Supply conservation and the fixed 10^27 total hold through every path. I fuzzed launch flows and allowance pulls with 1000 runs each, and tried eight mint-like selectors from both the factory address and a stranger, all of which revert.\n- **Flow Gap.** With pool-manager style balance-delta accounting, every flow credits exactly what was sent: factory to distributor, distributor to claimant, factory to pool, trader buy and sell, and transferFrom under finite and unlimited allowance. Transfers to a contract recipient trigger no callback. The reachable runtime contains no DELEGATECALL, CALLCODE, SELFDESTRUCT or CREATE.\n\n**Supporting evidence.** The five vendored OpenZeppelin files are byte-identical to the upstream v5.4.0 tags. The project's own 29 tests pass with the pinned fuzz seed. The aderyn large-literal lead is stylistic only, since the literal equals 10^27 exactly.\n\n**Nothing left unreached.** My scratch tests were removed since there is no finding to carry a proof, and the tree has no file changes beyond the findings file, which the repository's exclude list already covers.","treeHash":null,"usage":{"cachedInputTokens":613478,"cost":{"source":"runtime","usdMicros":2370811},"inputTokens":290,"model":"claude-fable-5-1","outputTokens":12203,"runtime":"claude","turns":28,"wallClockMs":308221}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1da032f42d59f73b","findings":[],"hash":"e5064dbcc5a57b966f0a39b78d12af50b7d377d831201ab3ec1b0148a99fceca","nodeId":"480c09d6-e665-4400-b6b4-13e189419570","outcome":"failed","summary":"fetch failed","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"claude","turns":0,"wallClockMs":10635}}],"verification":[{"checks":[{"durationMs":2187,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.11s\nCompiler run successful!\n","passed":true},{"durationMs":19051,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 28 tests for test/ConditionToken.t.sol:ConditionTokenTest\n[PASS] testFuzz_OverspendingAlwaysReverts(uint256) (runs: 1000, μ: 59216, ~: 59558)\nLogs:\n  Bound result 3236802296944403574588141743\n\n[PASS] testFuzz_TransferFromEnforcesAllowanceAndBalance(uint256,uint256) (runs: 1000, μ: 148732, ~: 135196)\nLogs:\n  Bound result 12320\n  Bound result 32\n\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 1000, μ: 92979, ~: 93369)\nLogs:\n  Bound result 7\n\n[PASS] test_ApprovalDoesNotRequireTokensAndIsScopedToSpender() (gas: 106378)\n[PASS] test_ApproveEmitsEventOverwritesAndRevokes() (gas: 157926)\n[PASS] test_ApproveRejectsZeroSpender() (gas: 37843)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 593985)\n[PASS] test_ContractDeployerReceivesSupplyInsteadOfTransactionOrigin() (gas: 706602)\n[PASS] test_HolderTransferFromRequiresApprovalToo() (gas: 35999)\n[PASS] test_InfiniteAllowanceRemainsUnchanged() (gas: 207173)\n[PASS] test_LaunchDistributionAndTradingTransfersAreExact() (gas: 405063)\n[PASS] test_MetadataAndEntireInitialSupply() (gas: 108442)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 719831)\n[PASS] test_RevokedSpenderCannotTransfer() (gas: 110792)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51483)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 93571)\n[PASS] test_TransferEntireSupplyAndTransferBack() (gas: 146988)\n[PASS] test_TransferFromInsufficientBalanceRestoresAllowance() (gas: 126492)\n[PASS] test_TransferFromRejectsInsufficientAllowance() (gas: 116085)\n[PASS] test_TransferFromRejectsUnapprovedSpender() (gas: 120210)\n[PASS] test_TransferFromRejectsZeroSender() (gas: 35534)\n[PASS] test_TransferFromSelfStillConsumesAllowance() (gas: 162399)\n[PASS] test_TransferFromSpendsOnlyApprovedAmount() (gas: 242131)\n[PASS] test_TransferFromZeroRecipientRestoresAllowance() (gas: 104016)\n[PASS] test_TransferRejectsInsufficientBalance() (gas: 57755)\n[PASS] test_TransferRejectsZeroRecipientEvenForZeroAmount() (gas: 72340)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73426)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 66235)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 67.39ms (205.10ms CPU time)\n\nRan 19 tests for test/ConditionToken.launch.t.sol:ConditionTokenLaunchTest\n[PASS] testFuzz_ApproveSetsExactValue(address,address,uint256) (runs: 1000, μ: 67023, ~: 72347)\n[PASS] testFuzz_ChainedTransfersConserve(uint256,uint256,uint256) (runs: 1000, μ: 238221, ~: 240527)\nLogs:\n  Bound result 1534381156660376065460780\n  Bound result 1534381156660376065460779\n  Bound result 405\n\n[PASS] testFuzz_DistributorClaimsArriveWhole(uint8) (runs: 500, μ: 871360, ~: 584408)\nLogs:\n  Bound result 5\n\n[PASS] testFuzz_InfiniteAllowanceNeverDecrements(uint256) (runs: 1000, μ: 136579, ~: 136745)\nLogs:\n  Bound result 6732\n\n[PASS] testFuzz_LaunchSplitsAreExactForAnyPoolShare(uint256,bytes32) (runs: 1000, μ: 1037749, ~: 1038623)\nLogs:\n  Bound result 8254\n\n[PASS] testFuzz_UnknownSelectorsRevertAndChangeNothing(bytes4,bytes) (runs: 1000, μ: 114078, ~: 113791)\n[PASS] test_AllowanceExceedingBalanceStillLimitedByBalance() (gas: 218287)\n[PASS] test_ApprovalForOneSpenderCannotBeUsedByAnother() (gas: 114201)\n[PASS] test_DistributorCannotOverpay() (gas: 383628)\n[PASS] test_FactoryDeploysAndDistributesExactlyInOneCall() (gas: 1053748)\n[PASS] test_RejectsEther() (gas: 73075)\n[PASS] test_ReturnsTrueAsAbiEncodedWord() (gas: 170028)\n[PASS] test_RuntimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2721246)\n[PASS] test_SameSaltCannotRedeploy() (gas: 1040463912)\n[PASS] test_SpendingAllowanceDoesNotEmitApproval() (gas: 120652)\n[PASS] test_TokensSentToTokenAddressAreLockedButCounted() (gas: 115107)\n[PASS] test_TransferFromWithFiniteAllowanceOfMaxMinusOneDecrements() (gas: 123992)\n[PASS] test_TransferOfMaxUintReverts() (gas: 35813)\n[PASS] test_TransferOneWeiAndLastWei() (gas: 163050)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 75.65ms (449.42ms CPU time)\n\nRan 1 test for test/ConditionToken.invariant.t.sol:ConditionTokenInvariantTest\n[PASS]\nConditionTokenInvariantTest invariants:\n[PASS] invariant_MetadataNeverChanges\n[PASS] invariant_SupplyIsFixedAndAllTokensAreAccountedFor\n ConditionTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2707  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2782  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2703  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 249999999999999999999999998\n  Bound result 4351\n  Bound result 4000000000000000000\n  Bound result 2\n  Bound result 6123\n  Bound result 1000000000000000000000000000\n  Bound result 991\n  Bound result 77657483920295702470808639\n  Bound result 133233374658747480484432998\n  Bound result 64\n  Bound result 4519\n  Bound result 254\n  Bound result 32587566997978047332831890\n  Bound result 3230\n  Bound result 11430595488745019994\n  Bound result 258\n  Bound result 5000000000000000000\n  Bound result 96\n  Bound result 244\n  Bound result 5435\n  Bound result 4000000000000000000\n  Bound result 2199\n  Bound result 65536\n  Bound result 48073087757183726045699748\n  Bound result 0\n  Bound result 594485250125250637942002907\n  Bound result 5464\n  Bound result 940969920538130874509147326\n  Bound result 300\n  Bound result 126163066900824045091863141\n  Bound result 2287400826\n  Bound result 1000000000000000000000000000\n  Bound result 90815032556440964284883146\n  Bound result 3219\n  Bound result 177028076\n  Bound result 1000000000000000000\n  Bound result 96\n  Bound result 999999999999999999999998002\n  Bound result 65536\n  Bound result 1\n  Bound result 1000\n  Bound result 2\n  Bound result 0\n  Bound result 7963\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.19s (1.19s CPU time)\n\nRan 2 tests for test/ConditionToken.model.invariant.t.sol:ConditionTokenModelInvariantTest\n[PASS]\nConditionTokenModelInvariantTest invariants:\n[PASS] invariant_AllowancesMatchLedgerAndNoSpenderOverspends\n[PASS] invariant_BalancesMatchGhostLedger\n[PASS] invariant_MetadataIsConstant\n[PASS] invariant_TotalSupplyIsFixed\n ConditionTokenModelInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| ModelHandler | approve      | 4214  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ModelHandler | randomCall   | 4006  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ModelHandler | transfer     | 4212  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ModelHandler | transferFrom | 3952  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 24\n  Bound result 0\n  Bound result 8540\n  Bound result 0\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 3101\n  Bound result 1808153979\n  Bound result 104097235976778596524570353\n  Bound result 12\n  Bound result 0\n  Bound result 616916630679986458115285712\n  Bound result 1183\n  Bound result 1\n  Bound result 253\n  Bound result 1\n  Bound result 999999999999999999999999546\n  Bound result 242\n  Bound result 9609\n  Bound result 7446\n  Bound result 242\n  Bound result 11\n  Bound result 2000000000000000001\n  Bound result 9259\n  Bound result 1\n  Bound result 253\n  Bound result 7863\n  Bound result 185\n  Bound result 1\n  Bound result 242\n\n[PASS] test_HandlerModelsBothOutcomes() (gas: 2714546)\nLogs:\n  Bound result 100\n  Bound result 1\n  Bound result 1\n  Bound result 50\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 18.95s (18.95s CPU time)\n\nRan 4 test suites in 18.95s (20.29s CPU time): 50 tests passed, 0 failed, 0 skipped (50 total tests)\n","passed":true},{"durationMs":41,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionToken.approve(address,uint256)\",\"ConditionToken.transfer(address,uint256)\",\"ConditionToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":2,\"DEPENDENCIES.md\":23,\"LICENSE\":21,\"README.md\":88,\"foundry.toml\":18,\"remappings.txt\":2,\"src/ConditionToken.sol\":16,\"test/ConditionToken.invariant.t.sol\":110,\"test/ConditionToken.launch.t.sol\":307,\"test/ConditionToken.model.invariant.t.sol\":246,\"test/ConditionToken.t.sol\":346},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"27fe67459a28a506446cbb6852d632401de7b444026b71eac13362a4a827e6b7","verifiedTreeHash":"2a39e6fb200c799fe118dfc670d99547ad80cfc9","verifierVersion":"0.1.0+5472ff12"},{"checks":[{"durationMs":1237,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.16s\nCompiler run successful!\n","passed":true},{"durationMs":1319,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 28 tests for test/ConditionToken.t.sol:ConditionTokenTest\n[PASS] testFuzz_OverspendingAlwaysReverts(uint256) (runs: 1000, μ: 59210, ~: 59558)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913265772136\n\n[PASS] testFuzz_TransferFromEnforcesAllowanceAndBalance(uint256,uint256) (runs: 1000, μ: 148686, ~: 135412)\nLogs:\n  Bound result 12320\n  Bound result 8\n\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 1000, μ: 92790, ~: 93369)\nLogs:\n  Bound result 3891297666785036088\n\n[PASS] test_ApprovalDoesNotRequireTokensAndIsScopedToSpender() (gas: 106378)\n[PASS] test_ApproveEmitsEventOverwritesAndRevokes() (gas: 157926)\n[PASS] test_ApproveRejectsZeroSpender() (gas: 37843)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 593985)\n[PASS] test_ContractDeployerReceivesSupplyInsteadOfTransactionOrigin() (gas: 706602)\n[PASS] test_HolderTransferFromRequiresApprovalToo() (gas: 35999)\n[PASS] test_InfiniteAllowanceRemainsUnchanged() (gas: 207173)\n[PASS] test_LaunchDistributionAndTradingTransfersAreExact() (gas: 405063)\n[PASS] test_MetadataAndEntireInitialSupply() (gas: 108442)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 719831)\n[PASS] test_RevokedSpenderCannotTransfer() (gas: 110792)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51483)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 93571)\n[PASS] test_TransferEntireSupplyAndTransferBack() (gas: 146988)\n[PASS] test_TransferFromInsufficientBalanceRestoresAllowance() (gas: 126492)\n[PASS] test_TransferFromRejectsInsufficientAllowance() (gas: 116085)\n[PASS] test_TransferFromRejectsUnapprovedSpender() (gas: 120210)\n[PASS] test_TransferFromRejectsZeroSender() (gas: 35534)\n[PASS] test_TransferFromSelfStillConsumesAllowance() (gas: 162399)\n[PASS] test_TransferFromSpendsOnlyApprovedAmount() (gas: 242131)\n[PASS] test_TransferFromZeroRecipientRestoresAllowance() (gas: 104016)\n[PASS] test_TransferRejectsInsufficientBalance() (gas: 57755)\n[PASS] test_TransferRejectsZeroRecipientEvenForZeroAmount() (gas: 72340)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73426)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 66235)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 26.23ms (82.13ms CPU time)\n\nRan 1 test for test/ConditionToken.invariant.t.sol:ConditionTokenInvariantTest\n[PASS]\nConditionTokenInvariantTest invariants:\n[PASS] invariant_MetadataNeverChanges\n[PASS] invariant_SupplyIsFixedAndAllTokensAreAccountedFor\n ConditionTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2707  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2782  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2703  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 249999999999999999999999998\n  Bound result 4351\n  Bound result 100000000000000000000\n  Bound result 2\n  Bound result 6122\n  Bound result 23000000000000000000\n  Bound result 991\n  Bound result 77657483920295702470808639\n  Bound result 4594637\n  Bound result 64\n  Bound result 5030\n  Bound result 23000000000000000000\n  Bound result 154414210949799862691150303\n  Bound result 2694\n  Bound result 11430595488745019994\n  Bound result 289\n  Bound result 23000000000000000000\n  Bound result 1\n  Bound result 3\n  Bound result 5355\n  Bound result 100000000000000000000\n  Bound result 6733\n  Bound result 0\n  Bound result 48073087757183726045699748\n  Bound result 1000000000000000000\n  Bound result 594485250125250637942002907\n  Bound result 4913\n  Bound result 940969920538130874509147326\n  Bound result 300\n  Bound result 842561177588220172191044392\n  Bound result 2287400826\n  Bound result 1000000000000000000000000000\n  Bound result 66132720815110043284987672\n  Bound result 3218\n  Bound result 177028076\n  Bound result 191171378100400278829274238\n  Bound result 1\n  Bound result 6000000000000000000\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 10\n  Bound result 1000000000000000000\n  Bound result 374\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.21s (1.21s CPU time)\n\nRan 2 test suites in 1.21s (1.24s CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionToken.approve(address,uint256)\",\"ConditionToken.transfer(address,uint256)\",\"ConditionToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":2,\"DEPENDENCIES.md\":23,\"LICENSE\":21,\"README.md\":88,\"foundry.toml\":18,\"launch.json\":24,\"remappings.txt\":2,\"src/ConditionToken.sol\":16,\"test/ConditionToken.invariant.t.sol\":110,\"test/ConditionToken.t.sol\":346},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"48ed022e75bbd7b8e2d727b70a7e35a97d9fdd18023e4bee660045ff73df39c4","verifiedTreeHash":"2e9559cba5723016667265841a5cac95927b9283","verifierVersion":"0.1.0+5472ff12"},{"checks":[{"durationMs":1532,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.36s\nCompiler run successful!\n","passed":true},{"durationMs":1392,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 28 tests for test/ConditionToken.t.sol:ConditionTokenTest\n[PASS] testFuzz_OverspendingAlwaysReverts(uint256) (runs: 1000, μ: 59210, ~: 59558)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129639945\n\n[PASS] testFuzz_TransferFromEnforcesAllowanceAndBalance(uint256,uint256) (runs: 1000, μ: 148686, ~: 135412)\nLogs:\n  Bound result 4000000000000000000\n  Bound result 4000000000000000000\n\n[PASS] testFuzz_TransfersConserveSupply(address,uint256) (runs: 1000, μ: 92790, ~: 93369)\nLogs:\n  Bound result 4\n\n[PASS] test_ApprovalDoesNotRequireTokensAndIsScopedToSpender() (gas: 106378)\n[PASS] test_ApproveEmitsEventOverwritesAndRevokes() (gas: 157926)\n[PASS] test_ApproveRejectsZeroSpender() (gas: 37843)\n[PASS] test_ConstructorEmitsOneMintEvent() (gas: 593985)\n[PASS] test_ContractDeployerReceivesSupplyInsteadOfTransactionOrigin() (gas: 706602)\n[PASS] test_HolderTransferFromRequiresApprovalToo() (gas: 35999)\n[PASS] test_InfiniteAllowanceRemainsUnchanged() (gas: 207173)\n[PASS] test_LaunchDistributionAndTradingTransfersAreExact() (gas: 405063)\n[PASS] test_MetadataAndEntireInitialSupply() (gas: 108442)\n[PASS] test_NoMintBurnOrAdministrativeEntryPoints() (gas: 719831)\n[PASS] test_RevokedSpenderCannotTransfer() (gas: 110792)\n[PASS] test_SelfTransferPreservesBalance() (gas: 51483)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 93571)\n[PASS] test_TransferEntireSupplyAndTransferBack() (gas: 146988)\n[PASS] test_TransferFromInsufficientBalanceRestoresAllowance() (gas: 126492)\n[PASS] test_TransferFromRejectsInsufficientAllowance() (gas: 116085)\n[PASS] test_TransferFromRejectsUnapprovedSpender() (gas: 120210)\n[PASS] test_TransferFromRejectsZeroSender() (gas: 35534)\n[PASS] test_TransferFromSelfStillConsumesAllowance() (gas: 162399)\n[PASS] test_TransferFromSpendsOnlyApprovedAmount() (gas: 242131)\n[PASS] test_TransferFromZeroRecipientRestoresAllowance() (gas: 104016)\n[PASS] test_TransferRejectsInsufficientBalance() (gas: 57755)\n[PASS] test_TransferRejectsZeroRecipientEvenForZeroAmount() (gas: 72340)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73426)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 66235)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 43.25ms (129.09ms CPU time)\n\nRan 1 test for test/ConditionToken.invariant.t.sol:ConditionTokenInvariantTest\n[PASS]\nConditionTokenInvariantTest invariants:\n[PASS] invariant_MetadataNeverChanges\n[PASS] invariant_SupplyIsFixedAndAllTokensAreAccountedFor\n ConditionTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2707  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2782  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2703  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 249999999999999999999999998\n  Bound result 4351\n  Bound result 100000000000000000000\n  Bound result 2\n  Bound result 6122\n  Bound result 23000000000000000000\n  Bound result 991\n  Bound result 77657483920295702470808639\n  Bound result 4594637\n  Bound result 64\n  Bound result 5030\n  Bound result 23000000000000000000\n  Bound result 154414210949799862691150303\n  Bound result 2694\n  Bound result 11430595488745019994\n  Bound result 289\n  Bound result 23000000000000000000\n  Bound result 1\n  Bound result 3\n  Bound result 5355\n  Bound result 100000000000000000000\n  Bound result 6733\n  Bound result 0\n  Bound result 48073087757183726045699748\n  Bound result 1000000000000000000\n  Bound result 594485250125250637942002907\n  Bound result 4913\n  Bound result 940969920538130874509147326\n  Bound result 300\n  Bound result 842561177588220172191044392\n  Bound result 2287400826\n  Bound result 1000000000000000000000000000\n  Bound result 66132720815110043284987672\n  Bound result 3218\n  Bound result 177028076\n  Bound result 191171378100400278829274238\n  Bound result 1\n  Bound result 6000000000000000000\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 10\n  Bound result 1000000000000000000\n  Bound result 374\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.20s (1.19s CPU time)\n\nRan 2 test suites in 1.21s (1.24s CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionToken.approve(address,uint256)\",\"ConditionToken.transfer(address,uint256)\",\"ConditionToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":2,\"DEPENDENCIES.md\":23,\"LICENSE\":21,\"README.md\":88,\"foundry.toml\":18,\"remappings.txt\":2,\"src/ConditionToken.sol\":16,\"test/ConditionToken.invariant.t.sol\":110,\"test/ConditionToken.t.sol\":346},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1029,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":546,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/ConditionToken.sol:11: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b76480d5e4d9a4150000e6fbbb4ad8a71d47368cf974a2657ebeaaa91254db68","verifiedTreeHash":"b28b9425e0cc29184a142528bb6580ba1f4d0703","verifierVersion":"0.1.0+5472ff12"}]}