{"assessments":[],"deployments":[{"attestationHash":"a647dafb9494d311e7a0f486a4676126abc76773e54fb9771962e4886bef8f24","chainId":1,"contracts":[{"address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","blockNumber":26363558,"name":"PoolInitializationGuard","role":"hook","txHash":"0xc1aa2e949559a4a90c549e7e144b4de14e9ab5fce0a8e629c6acc150657095f2"},{"address":"0x21e0a0b92d6f585235959d2d81ae9a9d8ff2784b","blockNumber":26363558,"name":"ConditionalsToken","role":"token","txHash":"0xc1aa2e949559a4a90c549e7e144b4de14e9ab5fce0a8e629c6acc150657095f2"},{"address":"0xf6d73684a28a613a1846b68c7a3f1779bd596c07","blockNumber":26363558,"name":"MerkleDistributor","role":"distributor","txHash":"0xc1aa2e949559a4a90c549e7e144b4de14e9ab5fce0a8e629c6acc150657095f2"}],"id":"ac08c706-efba-4f50-84e2-4b535313da50","manifestHash":"f9f801e90f34bb58fa1a443d0b35cc0992c91e03a9b4b5869943c2e5c82fff9f","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":"15821893-4450-44ed-a82d-870ae312d345","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"c4a60e829fa70b910403797e2a14dfbc2854463041112d393e0d27f182df0113","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":"7ac21d5d9d7083738a8c78a8646882566305ff8311d65e320f338810ede19f84","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":"b322767d0f3df8aea932375c576f2454c91ddf591ed41b8821657d248afda276","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":"7849c8700a6b74e74734add5e1e3a9f998943b0671ad190cb0ede4744449cc4d","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":"02d55441b46e70c646d63d82bf63a8cf03154a40c8062ca56adc82554c855b43","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":"11e166d4d1783d34d01ce99e626704ef44d1ffba291ab340ec553453d92dffba","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":"b89fb95738ae66de87e8be4bbe7b313cf66cbe63ee329819c3bf890a70787c32","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"6d87133f082ffc9d5de34a75bda2bb4cd00fdad2a154041bec3dd5e7786cd512","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"68506fdcd4ed07ed9dcf40cddecfe9a7d7282e399586d1d75a902eca2f5d692b","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"68506fdcd4ed07ed9dcf40cddecfe9a7d7282e399586d1d75a902eca2f5d692b","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: CONDITIONALS (COND).\nToken name: CONDITIONALS\nToken symbol: COND\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: conditionals.xyz","parentJobId":null,"planHash":"039b1fd8427114fe49e5b6d7ee17c4f510795d78b006d809e47778012c8e8b42","previousHash":"0fcaef76083a04ae0434e1e3e410e8ba82ba55ab8952666c51dc822abfe8a3b0","projectId":"15821893-4450-44ed-a82d-870ae312d345","publication":{"commit":"7fe762acb82508c18620256ff05c4c9832b38aa3","deliveredAt":"2026-11-07T14:24:28.051Z","repoUrl":"https://github.com/identity-md-launches/launch-3110-conditionals"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"de611e0b4fad7300d0d00df56a0d8ee9303ed86a7b4a1e1c7235367d388144d4","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d03fc84904b54d9e","findings":[{"citation":"resolved","description":"Provenance note, not a token defect. The README states both vendored dependencies are unchanged and that each directory's SHA256SUMS attests this. All six OpenZeppelin files verify against lib/openzeppelin-contracts/SHA256SUMS. In lib/forge-std, seven files (src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol) do NOT match the hashes recorded in lib/forge-std/SHA256SUMS (for example line 18: `9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1  src/Vm.sol`). I fetched each file from the pinned upstream commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 and compared: after stripping whitespace the contents are byte-identical, so the only change is a `forge fmt` line-reflow (multi-line function signatures joined onto one line). forge-std is used only by tests and is not part of the deployed token's bytecode, so this has no effect on permissions, supply or transfers. It only means the SHA256SUMS file cannot be used as-is to attest the vendored forge-std, and the README sentence is inaccurate. Fix: regenerate lib/forge-std/SHA256SUMS from the files as vendored (or restore the upstream formatting), and soften the README wording to say forge-std was reformatted.","line":127,"path":"README.md","reproduction":"From the repository root run: `cd lib/openzeppelin-contracts && sha256sum -c SHA256SUMS` -> all 6 lines OK. Then `cd ../forge-std && sha256sum -c SHA256SUMS` -> expected: every line OK (README: 'vendored unchanged'); actual: 'WARNING: 7 computed checksums did NOT match' for src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol. Whitespace-insensitive comparison (`tr -d ' \\n\\t' | sha256sum`) against https://raw.githubusercontent.com/foundry-rs/forge-std/77041d2ce690e692d6e03cc812b57d1ddaa4d505/<file> gives identical digests for all seven, so the difference is formatting only.","severity":"info","snippet":"The required OpenZeppelin Contracts v5.0.2 files and forge-std v1.9.7 sources are\nvendored unchanged. `DEPENDENCIES.json` records upstream URLs, tags, and exact\ncommits. Each dependency directory contains its upstream license and `SHA256SUMS`.","title":"README claims forge-std is vendored unchanged, but seven forge-std files fail their recorded SHA256SUMS (formatting-only reflow; test-only dependency)"}],"hash":"02d55441b46e70c646d63d82bf63a8cf03154a40c8062ca56adc82554c855b43","nodeId":"26e58552-2588-4a32-a41b-b3b474278f9b","outcome":"completed","summary":"Review complete. The findings file is written and validated against the tree.\n\n**Outcome: no permission defects in the CONDITIONALS token.** The contract at `src/ConditionalsToken.sol` is a bare OpenZeppelin 5.0.2 ERC-20 with a single constructor mint of 10^27 base units to the immediate deployer. The compiled ABI has exactly three state-changing entry points, no constructor arguments, no receive or fallback, and no privileged function of any kind.\n\nWhat I checked, per the three assigned guides:\n\n- **Access Control.** There is no role, modifier, initializer, proxy, delegatecall or external call. Each storage slot has a single writer path gated by the caller's own identity. The mint credits msg.sender, not tx.origin, so under the factory launch the factory holds the supply. Deployer, origin and strangers all fail to move or approve a holder's balance.\n- **Trust Gap.** No privileged actor, fee recipient, setter, oracle or in-flight value exists, so no access-times-economics seam can form.\n- **Asymmetry.** The approve and spend paths mirror exactly except the omitted Approval event on spend, which the README documents. Both transfer paths share the same validation and writes. Every revert path leaves balances and allowances untouched. The existing invariant suite ran 8192 calls with zero model mismatches, and my scratch tests under `test/scratch/` all pass.\n\n**One info-level note recorded.** The README says forge-std is vendored unchanged with checksums, but seven forge-std files fail the recorded SHA256SUMS. I diffed them against the pinned upstream commit: the differences are formatting reflow only, and forge-std is test-only, so this does not touch the token. The fix is to regenerate the checksum file or restore upstream formatting.\n\nCoverage has nine rows: all three entry points hold, plus rows for the constructor role handout, the absent payable surface, each of the three guides, and the fixed-supply invariant. Nothing was left unreached. The OpenZeppelin files verify against their checksums, the build is clean on Solidity 0.8.26 with bytecode_hash none, and `forge fmt --check` passes on the delivered sources.","treeHash":null,"usage":{"cachedInputTokens":769234,"cost":{"source":"runtime","usdMicros":2435588},"inputTokens":354,"model":"claude-fable-5-1","outputTokens":14821,"runtime":"claude","turns":27,"wallClockMs":258799}},{"artifacts":[],"attempt":1,"bundleHash":"13fb373fa78511d83c91b160d0b5c02251453714fbeb8597495f372c18cdab8e","device":"10f059866e111f84","findings":[],"hash":"11e166d4d1783d34d01ce99e626704ef44d1ffba291ab340ec553453d92dffba","nodeId":"40ea1743-af3b-49ca-ae91-5ed269a04c61","outcome":"completed","summary":"Implemented CONDITIONALS (COND): 1 billion tokens, 18 decimals, minted once to the deployer.\n\nDependencies are vendored for offline builds. Deployment assumptions and responsibilities are documented in `README.md`.\n\nPassed `forge build`, all 31 local tests—including fuzz and invariant tests—and `forge fmt --check`.","treeHash":"56539048edad4c4eddad07b5736cdbd36eca2f8a","usage":{"cachedInputTokens":361984,"cost":{"source":"estimated","usdMicros":1560034},"inputTokens":45410,"model":"gpt-6-astra","outputTokens":14879,"runtime":"codex","turns":4,"wallClockMs":368202}},{"artifacts":[],"attempt":1,"bundleHash":"818ca7d7aeb527da9e825f425c04341017d715fa7b94dffb0f66043a4583e5db","device":"96ece23c63b791a1","findings":[],"hash":"6d87133f082ffc9d5de34a75bda2bb4cd00fdad2a154041bec3dd5e7786cd512","nodeId":"6aa6bcab-1491-42e4-b9c7-d742d389b4f0","outcome":"completed","summary":"I added 2 new test files to the existing suite and found no defects in the token. The full suite passes with the verifier's fuzz seed: 51 tests across 4 suites, none failing or skipped, and the invariant runs had no reverts.\n\n**What the token is:** `src/ConditionalsToken.sol` is a plain OpenZeppelin ERC-20 named CONDITIONALS (COND) with 18 decimals. It mints 1,000,000,000 tokens once, to whoever deploys it. It has no owner, no mint or burn, no pause or blacklist, no fee on transfer and no special behaviour.\n\n**What was already there and still passes:** 30 unit and fuzz tests in `test/ConditionalsToken.t.sol` and one invariant suite in `test/ConditionalsToken.invariant.t.sol`. I didn't change either file.\n\n**New: `test/ConditionalsToken.launch.t.sol` (19 tests)**\n- **Deployment:**\n  - The supply goes to the address that deploys the token, not to whoever signed the transaction (fuzzed over both addresses).\n  - Two deployments don't share balances, and the same address can't be deployed twice.\n- **One-transaction launch:** a helper contract deploys the token and hands out the launch shares in a single call: 10% to the distributor, a fuzzed pool share, and the rest to the remainder address. Every amount arrives exactly, and a claim out of the distributor arrives whole.\n- **Bytecode:** the deployed code contains no DELEGATECALL, CALLCODE or SELFDESTRUCT (checked the same way the protected test checks it) and is within the 24,576-byte size limit.\n- **Admin functions:** 16 more admin-style calls are rejected whether the deployer or a stranger sends them. These include `mint`, `unpause`, `setBlacklist`, `grantRole`, `permit`, `increaseAllowance` and `upgradeToAndCall`. Afterwards the supply hasn't changed and holders can still transfer.\n- **Call format:** `transfer`, `approve` and `transferFrom` each return exactly one 32-byte `true`. Calls with missing arguments or a malformed address are rejected.\n- **Edge cases:**\n  - A transfer one unit over the balance fails.\n  - An allowance one below the maximum still goes down when spent, and a spent allowance can't be used again.\n  - Approving yourself, and allowances being separate per spender.\n  - Tokens sent to the token's own address can't be pulled back out by the deployer.\n- **Fuzzed:** transfers between any two addresses, approvals overwriting earlier ones, and `transferFrom` failing with the correct error when either the allowance or the balance is short.\n\n**New: `test/ConditionalsToken.openInvariant.t.sol` (invariant tests)**\n- A handler contract makes random sequences of calls. Recipients include brand-new addresses, the token's own address and the handler. The sequences mix in calls that must fail: overspending, sending to the zero address, and mint, burn, `burnFrom` and `pause` attempts.\n- Each call is checked against its expected outcome: it must succeed or fail as predicted.\n- After every sequence, these must hold:\n  - The total supply never changes.\n  - Every tracked balance matches a separately kept tally.\n  - Those balances add up to the full supply.\n  - The zero address holds nothing.\n  - Every allowance matches the tally.\n  - The token contract holds no ETH.\n\nBecause nothing failed, I didn't write `.imd-findings.json`. I installed nothing and changed nothing outside `test/`. The two new files are in the working tree but not committed.","treeHash":"6e08a6947e8c405f9e681c77a2d34ed1b3a2d301","usage":{"cachedInputTokens":268492,"cost":{"source":"runtime","usdMicros":673723},"inputTokens":16,"model":"claude-opus-5-5","outputTokens":14214,"runtime":"claude","turns":9,"wallClockMs":156713}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"707624586655cf74","findings":[],"hash":"7849c8700a6b74e74734add5e1e3a9f998943b0671ad190cb0ede4744449cc4d","nodeId":"d1da260b-8eed-446a-82a0-871ac0e0b8a2","outcome":"completed","summary":"The review is complete. The math audit of the CONDITIONALS token found no defects, and the findings file records an empty list with full coverage.\n\n**What was reviewed.** The token at `src/ConditionalsToken.sol` is 16 lines: it inherits OpenZeppelin ERC20 v5.0.2 unchanged and mints a constant supply to the deployer in the constructor. I checked it against every failure mode in the Math Precision, Boundary and Numerical Gap guides, plus the Senior Auditor's Mindset.\n\n**Why it holds.**\n- **No arithmetic of its own.** The only math is the compile-time constant for the supply, which is exactly 10^27 and matches the README and manifest supply in minor units. Decimals are the OpenZeppelin default of 18.\n- **Inherited math is sound.** Every unchecked subtraction in the vendored ERC20 is guarded by a strict comparison just before it, and every unchecked addition is bounded by total supply. I traced the infinite-allowance sentinel, allowance one below the sentinel, self-transfer, self-transferFrom, 1 wei, full supply and maximum uint256 inputs, and drove them in a scratch Foundry test. All behaved as the standard specifies.\n- **No boundaries to break.** The disassembled runtime has no external call, delegatecall, callcode, create or selfdestruct, no payable path, no bytes decoding, and only zero-address sentinel checks that revert.\n- **No numerical seams.** There is no division anywhere, so the sum of balances equals total supply exactly. The launch's 10/70/20 split of 10^27 divides without remainder.\n- **Dependencies verified.** All five vendored OpenZeppelin files are byte-identical to upstream commit dbb6104 and match the recorded checksums.\n\n**Leads dismissed.** The aderyn large-numeric-literal line points at the intended supply constant and is not a defect. Slither reported nothing. The repository's own 31 tests, including the stateful invariant suite, pass under the pinned fuzz seed.\n\n**Outside my area.** The pool price derived from the launch economics lands inside Uniswap v4's valid sqrt-price range for either currency ordering. No privileged or supply-growing entry point exists in the compiled ABI.\n\nThe findings file holds ten coverage rows, one for each of the three entry points and seven for invariants and boundaries checked. The scratch test and build artifacts were removed, and no reviewed file was changed.","treeHash":null,"usage":{"cachedInputTokens":483270,"cost":{"source":"runtime","usdMicros":2261595},"inputTokens":226,"model":"claude-fable-5-1","outputTokens":13694,"runtime":"claude","turns":21,"wallClockMs":196538}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1a7ecd03bd365366","findings":[{"citation":"resolved","description":"README.md lines 127-129 state that forge-std v1.9.7 is 'vendored unchanged' and that each dependency directory 'contains its upstream license and SHA256SUMS'. The recorded hashes are the upstream hashes (the upstream src/Vm.sol at commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 hashes to 9068805b...), but the vendored copies of src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol and src/interfaces/IMulticall3.sol were re-wrapped (whitespace-only changes, token-identical to upstream), so the integrity check the README points a verifier at fails. No production code is affected: forge-std is used only by tests, and the OpenZeppelin files under lib/openzeppelin-contracts are byte-identical to upstream dbb6104ce834628e473d2173bbc9d47f81a9eec3 and pass their SHA256SUMS. This is a documentation/provenance defect, not a token defect: a reviewer who follows the README's integrity instruction gets a failure and cannot tell from the tree alone whether the differences are benign.","line":18,"path":"lib/forge-std/SHA256SUMS","reproduction":"State: the tree as delivered. Input: `cd lib/forge-std && sha256sum -c SHA256SUMS`. Expected (per README 'vendored unchanged'): every line reports OK. Actual: 23 OK and 7 FAILED (src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol); `sha256sum lib/forge-std/src/Vm.sol` gives a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15 while line 18 records 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1. Fix: either re-vendor the seven files byte-for-byte from the pinned commit, or regenerate SHA256SUMS from the files actually shipped and drop the 'unchanged' claim.","severity":"info","snippet":"9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1  src/Vm.sol","title":"Vendored forge-std SHA256SUMS does not match the vendored files (seven test-only files were reformatted)"}],"hash":"7ac21d5d9d7083738a8c78a8646882566305ff8311d65e320f338810ede19f84","nodeId":"e860e89d-0902-468c-b78e-6dcd135f7c94","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with one informational finding and nine coverage rows. No files in the tree were changed, and the scratch test I used was removed.\n\n**What I reviewed.** The token is a 16-line wrapper over the vendored OpenZeppelin v5.0.2 ERC-20 that mints the whole supply to the deployer in the constructor. I checked it against the Execution Trace, Periphery and First Principles guides, plus the Mindset and the protected floor tests, and ran the project's unit, fuzz and invariant suites, which all pass.\n\n**Result for the token itself: no defects.** All three entry points hold.\n\n- `approve` rejects the zero spender, overwrites the allowance, moves no value, and only ever touches the caller's own allowances.\n- `transfer` rejects the zero receiver and insufficient balance before any write, delivers the exact amount with no fee, burn, hook or callback, and is atomic on every revert path.\n- `transferFrom` spends allowance before moving tokens, never decrements an unlimited allowance, and no holder, including the deployer or factory, can pull from another without allowance.\n- The constructor mints exactly 10^27 base units to msg.sender with 18 decimals, so a factory deploy credits the factory the whole supply. There is no mint, burn, pause, blacklist, owner, proxy, receive or fallback. A replay of the floor's opcode scan found no reachable DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- The production library is byte-identical to the pinned upstream OpenZeppelin commit, so the launch flows through the distributor and the PoolManager move exactly what they say.\n\n**One informational finding.** The vendored forge-std SHA256SUMS does not match seven of the shipped files. The differences are whitespace only and forge-std is test-only, so no deployed bytecode is affected. It contradicts the README's \"vendored unchanged\" claim and makes the integrity check it describes fail. The fix is to re-vendor those files byte for byte or regenerate the checksum file.\n\n**Not reached.** The Uniswap v4 seed and swap were not executed locally because v4-core is not vendored; the token-side invariant they depend on, exact transfer amounts, was verified instead. The aderyn large-literal lead was checked and is style only.","treeHash":null,"usage":{"cachedInputTokens":672368,"cost":{"source":"runtime","usdMicros":2558081},"inputTokens":290,"model":"claude-fable-5-1","outputTokens":13075,"runtime":"claude","turns":27,"wallClockMs":199919}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a0f4c3f900dedd4a","findings":[{"citation":"resolved","description":"Merged from audit_permissions and audit_flow, which report the same root cause. README.md lines 127-129 state that the OpenZeppelin v5.0.2 files and forge-std v1.9.7 sources are 'vendored unchanged' and that each dependency directory's SHA256SUMS attests this. The OpenZeppelin claim holds: all six files pass lib/openzeppelin-contracts/SHA256SUMS, and I additionally fetched each from upstream commit dbb6104ce834628e473d2173bbc9d47f81a9eec3 and found them byte-identical (ERC20.sol sha256 2d874da1c1478ed2... both sides). The forge-std claim does not hold: lib/forge-std/SHA256SUMS records the upstream hashes at commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 (I fetched each file and its raw sha256 equals the recorded line), but the vendored copies of src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol and src/interfaces/IMulticall3.sol differ from upstream. After stripping spaces, tabs, CR and LF, the vendored and upstream contents hash identically for all seven, so the difference is a formatting reflow only. forge-std is imported only by test/ files and contributes nothing to src/ConditionalsToken.sol's creation or runtime bytecode, so supply, transfers, allowances and the launch flows are unaffected. This is a provenance/documentation defect: a reviewer following the README's integrity instruction gets a failure. Fix: either re-vendor the seven files byte-for-byte from the pinned commit, or regenerate lib/forge-std/SHA256SUMS from the shipped files and change the README wording to say forge-std was reformatted.","line":18,"path":"lib/forge-std/SHA256SUMS","reproduction":"State: the tree as delivered. Run `cd lib/openzeppelin-contracts && sha256sum -c SHA256SUMS` -> all 6 lines OK. Run `cd lib/forge-std && sha256sum -c SHA256SUMS`. Expected per README line 127-128 ('vendored unchanged'): every line OK. Actual: 23 OK, 7 FAILED (src/StdAssertions.sol, src/StdJson.sol, src/StdToml.sol, src/Vm.sol, src/console.sol, src/interfaces/IERC7540.sol, src/interfaces/IMulticall3.sol), 'WARNING: 7 computed checksums did NOT match'. `sha256sum lib/forge-std/src/Vm.sol` = a1b1c82924aecf0f38b53192fd1e801cccc1e1fd2ecd6b2301e4f4c4ab102a15 while SHA256SUMS line 18 records 9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1, which is the sha256 of upstream src/Vm.sol at 77041d2ce690e692d6e03cc812b57d1ddaa4d505. `tr -d ' \\n\\t\\r' < file | sha256sum` gives the same digest for the vendored and upstream copy of each of the seven files (e.g. Vm.sol fe772424ec5d5c1b...), proving whitespace-only differences.","severity":"info","snippet":"9068805b59ac1d0ea03a8fa1f15ae49c094e0c6c852a2500e0dd112f264b2cb1  src/Vm.sol","title":"Vendored forge-std SHA256SUMS records upstream hashes but seven vendored files were reformatted, so the README's 'vendored unchanged' integrity check fails (test-only dependency; no token impact)"}],"hash":"b322767d0f3df8aea932375c576f2454c91ddf591ed41b8821657d248afda276","nodeId":"49ee867e-576e-49f3-bf67-9a2bbd821102","outcome":"completed","summary":"Review complete. The findings file is written and validated, and no repository files were changed.\n\n**Outcome:** the token is a plain, unmodified OpenZeppelin v5.0.2 ERC-20 and I found no defect in it. One info-level provenance note is kept, merged from the two specialists who reported the same root cause.\n\n**What I verified**\n- The vendored OpenZeppelin ERC20 and its four dependencies are byte-identical to the pinned upstream commit, so the token's transfer, approve and allowance logic is exactly upstream's.\n- The constructor mints exactly the manifest supply to the deployer, there are no owner, mint, burn, pause or blocklist paths, and the runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT. Creation and runtime code are far below the size limits.\n- All 51 project tests pass, including two invariant suites, and `forge fmt --check` is clean. The manifest's constructor arguments, supply, decimals, name and symbol match the source.\n- The aderyn large-literal lead evaluates to exactly 1e27 and is not a defect.\n\n**Kept finding (info):** the forge-std SHA256SUMS file records upstream hashes, but seven vendored forge-std files were reformatted, so the integrity check the README points to fails. I reproduced it by running the checksum file and by confirming the files are whitespace-identical to upstream. forge-std is test-only and does not affect the deployed token.\n\n**Coverage:** all three entry points are marked holds with traced reasons, plus two invariant rows. No proof file was needed since nothing reached medium or above.","treeHash":null,"usage":{"cachedInputTokens":349304,"cost":{"source":"runtime","usdMicros":1617356},"inputTokens":194,"model":"claude-fable-5-1","outputTokens":7905,"runtime":"claude","turns":14,"wallClockMs":121785}},{"artifacts":[],"attempt":1,"bundleHash":"0f289ebf8f8c80c6de4ce309b782f44d0dd24029fe01afb09fb4f7ee5e64d925","device":"91d3f9816008ce9f","findings":[],"hash":"b89fb95738ae66de87e8be4bbe7b313cf66cbe63ee329819c3bf890a70787c32","nodeId":"e5f26341-c5e5-45b7-8d03-09eb37fcb93d","outcome":"completed","summary":"I wrote `launch.json` for the CONDITIONALS (COND) launch. `forge build` succeeds and `forge test` passes 31 of 31 tests with the pinned fuzz seed. Those are the existing token tests, though, so they don't check the manifest. I checked the manifest by reading it against the source and the brief.\n\nWhat it contains, based on `src/ConditionalsToken.sol`, the only contract in the tree:\n- **Token:** contract `ConditionalsToken`, name \"CONDITIONALS\", symbol \"COND\", 18 decimals. Its constructor takes no arguments, so `constructorArgs` is `[]`.\n- **Supply:** the constructor mints 1,000,000,000 × 10^18 to msg.sender once, so `totalSupply` is `\"1000000000000000000000000000\"`.\n- **Application contracts:** `contracts` is `[]`, because the tree has none.\n- **Pool:** paired with IMD at `0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7`, fee 12500, tickSpacing 60, initialPrice `79228162514264337593543950336` (one to one, recorded but not used to set the price).\n- **Economics:** copied verbatim from the brief.\n- **Notes:** 470 characters (the limit is 4,000) describing the plain fixed-supply ERC-20, which has no owner, admin roles, mint, fees or pause, and stating that the launch deploys no other contracts.\n\nOnly the schema's keys are used, and addresses are lowercase.\n\n`launch.json` is the only change, and it is not committed. The commit failed because git has no author name or email set on this machine, and I didn't change the git config. The file is in the working tree for the upload; if the submission needs a commit, someone will have to set a git identity first.","treeHash":"6ae5eb9a9a095040655fa07128168c0265b1d0a7","usage":{"cachedInputTokens":119327,"cost":{"source":"runtime","usdMicros":195935},"inputTokens":12,"model":"claude-opus-5-5","outputTokens":2200,"runtime":"claude","turns":7,"wallClockMs":38317}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9e51ef2afd7c2af8","findings":[],"hash":"c4a60e829fa70b910403797e2a14dfbc2854463041112d393e0d27f182df0113","nodeId":"ba947f61-ff08-40ef-8752-5d6842768934","outcome":"completed","summary":"The review is complete and the findings file is written. The economics audit of the CONDITIONALS (COND) token found no defects.\n\n**What was reviewed.** The token at `src/ConditionalsToken.sol` is a 16-line contract inheriting OpenZeppelin v5.0.2 ERC-20 with one constructor mint of 1e27 base units to msg.sender. It adds no overrides, roles, fees, hooks or external calls. I confirmed the five vendored OpenZeppelin files are byte-identical to upstream at the pinned commit, so the inherited transfer and allowance logic is the canonical one.\n\n**Checks performed against the three guides:**\n- Economic Security: no external dependency, oracle, price or fee path exists. ERC-20 behaviour verified at the boundaries the guide names (zero amount, full balance, uint256 max, self-transfer, zero-address sender, receiver and spender). The missing `Approval` event on `transferFrom` is OpenZeppelin v5 behaviour the EIP permits and the README documents.\n- Invariant: supply is fixed at deployment with no mint or burn selector in the ABI. Balance conservation, allowance coupling and atomic rollback hold under the project's 31 unit and invariant tests plus my own scratch test, which also probed eight admin-style selectors from the factory address with no effect.\n- Flow Gap: the launch flows from factory to distributor, pool manager and remainder address, then claims and buy/sell against the pool manager, move exact amounts. The deployed runtime contains no DELEGATECALL, CALLCODE or SELFDESTRUCT and rejects ETH.\n\n**Coverage.** All three listed entry points are marked `holds`, with three additional invariant rows. The full Uniswap v4 seed and swap was not run locally since v4-core is not vendored, but the token has no code path that could tax or revert it. Slither reported nothing and the aderyn large-literal lead is the intended supply constant.\n\nThe scratch test directory was removed, leaving the tree unchanged apart from `.imd-findings.json`.","treeHash":null,"usage":{"cachedInputTokens":617634,"cost":{"source":"runtime","usdMicros":2229372},"inputTokens":290,"model":"claude-fable-5-1","outputTokens":10273,"runtime":"claude","turns":24,"wallClockMs":155833}}],"verification":[{"checks":[{"durationMs":1257,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.17s\nCompiler run successful!\n","passed":true},{"durationMs":2181,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 30 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testApprovalBelongsOnlyToCallerAndDoesNotMoveTokens() (gas: 116510)\n[PASS] testApproveEmitsEventAndCanBeReplacedAndRevoked() (gas: 199365)\n[PASS] testApproveZeroSpenderReverts() (gas: 40165)\n[PASS] testConstructorEmitsSingleMintEvent() (gas: 12304)\n[PASS] testCreate2MintsToFactoryAndLaunchTransfersAreExact() (gas: 667637)\n[PASS] testDeployerCannotSeizeHolderTokensWithoutAllowance() (gas: 161284)\n[PASS] testFuzzInsufficientAllowanceReverts(uint256,uint256) (runs: 512, μ: 126603, ~: 128040)\nLogs:\n  Bound result 3\n  Bound result 1\n\n[PASS] testFuzzOverspendReverts(uint256) (runs: 512, μ: 61548, ~: 61858)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039458584007913129639935\n\n[PASS] testFuzzTransferConservesSupply(uint256,address) (runs: 512, μ: 95711, ~: 96537)\nLogs:\n  Bound result 654718616421453820595606726\n\n[PASS] testFuzzTransferFromTracksAllowance(uint256,uint256) (runs: 512, μ: 169107, ~: 169957)\nLogs:\n  Bound result 3\n  Bound result 13967788187045962441705\n\n[PASS] testInfiniteAllowanceIsNotDecremented() (gas: 144184)\n[PASS] testMaximumTransferRevertsWithoutOverflow() (gas: 45111)\n[PASS] testMetadataAndEntireSupplyAtDeployment() (gas: 109738)\n[PASS] testNoMintBurnAdminOrUpgradeEntryPoints() (gas: 853328)\n[PASS] testRejectsNativeEtherAndUnknownCalls() (gas: 62264)\n[PASS] testSelfTransferPreservesBalance() (gas: 54220)\n[PASS] testTransferDoesNotCallRecipient() (gas: 174172)\n[PASS] testTransferEmitsEventAndDeliversExactAmount() (gas: 96163)\n[PASS] testTransferEntireBalance() (gas: 78391)\n[PASS] testTransferFromByHolderStillRequiresAllowance() (gas: 45404)\n[PASS] testTransferFromDecrementsFiniteAllowanceAndEmitsTransfer() (gas: 221749)\n[PASS] testTransferFromInsufficientAllowanceRevertsWithoutMutation() (gas: 120572)\n[PASS] testTransferFromInsufficientBalanceRollsBackAllowance() (gas: 126144)\n[PASS] testTransferFromToSelfConsumesAllowanceButPreservesBalance() (gas: 108144)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 119047)\n[PASS] testTransferFromZeroAmountNeedsNoAllowance() (gas: 78781)\n[PASS] testTransferFromZeroSenderReverts() (gas: 37903)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 74955)\n[PASS] testTransferWithInsufficientBalanceRevertsWithoutMutation() (gas: 70039)\n[PASS] testZeroTransferFromEmptyAccountEmitsEvent() (gas: 63100)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 18.90ms (66.44ms CPU time)\n\nRan 1 test for test/ConditionalsToken.invariant.t.sol:ConditionalsTokenInvariantTest\n[PASS] invariantSupplyBalancesAndAllowancesMatchModel() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2808  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2728  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2656  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 56153\n  Bound result 6720\n  Bound result 11\n  Bound result 0\n  Bound result 8\n  Bound result 386\n  Bound result 0\n  Bound result 2235936992360011776971\n  Bound result 5\n  Bound result 2220\n  Bound result 6309\n  Bound result 5\n  Bound result 192\n  Bound result 42803933392323437457503974\n  Bound result 0\n  Bound result 446073561986137730964361807\n  Bound result 999999999999999999999993275\n  Bound result 10\n  Bound result 0\n  Bound result 2\n  Bound result 5310\n  Bound result 3000000000000000000\n  Bound result 165\n  Bound result 3\n  Bound result 208962766769850459410504223\n  Bound result 5953\n  Bound result 9\n  Bound result 0\n  Bound result 5436\n  Bound result 10000000000000000000\n  Bound result 9\n  Bound result 6463659837210360265262\n  Bound result 5213\n  Bound result 134399175498850165857243667\n  Bound result 6715\n  Bound result 0\n  Bound result 11\n  Bound result 5\n  Bound result 716982359782964304649958517\n  Bound result 13\n  Bound result 5\n  Bound result 3809\n  Bound result 5667\n  Bound result 664097727263782395305898925\n  Bound result 1000000000\n  Bound result 3700\n  Bound result 0\n  Bound result 534\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.07s (2.07s CPU time)\n\nRan 2 test suites in 2.07s (2.09s CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":51,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":16,\"README.md\":138,\"foundry.toml\":23,\"remappings.txt\":2,\"src/ConditionalsToken.sol\":16,\"test/ConditionalsToken.invariant.t.sol\":114,\"test/ConditionalsToken.t.sol\":412},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":642,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":216,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/ConditionalsToken.sol:11: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"11e166d4d1783d34d01ce99e626704ef44d1ffba291ab340ec553453d92dffba","verifiedTreeHash":"56539048edad4c4eddad07b5736cdbd36eca2f8a","verifierVersion":"0.1.0+18543036"},{"checks":[{"durationMs":1957,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.86s\nCompiler run successful!\n","passed":true},{"durationMs":10407,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 30 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testApprovalBelongsOnlyToCallerAndDoesNotMoveTokens() (gas: 116510)\n[PASS] testApproveEmitsEventAndCanBeReplacedAndRevoked() (gas: 199365)\n[PASS] testApproveZeroSpenderReverts() (gas: 40165)\n[PASS] testConstructorEmitsSingleMintEvent() (gas: 12304)\n[PASS] testCreate2MintsToFactoryAndLaunchTransfersAreExact() (gas: 667637)\n[PASS] testDeployerCannotSeizeHolderTokensWithoutAllowance() (gas: 161284)\n[PASS] testFuzzInsufficientAllowanceReverts(uint256,uint256) (runs: 512, μ: 127083, ~: 128040)\nLogs:\n  Bound result 3796\n  Bound result 1630\n\n[PASS] testFuzzOverspendReverts(uint256) (runs: 512, μ: 61544, ~: 61858)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129647085\n\n[PASS] testFuzzTransferConservesSupply(uint256,address) (runs: 512, μ: 95825, ~: 96537)\nLogs:\n  Bound result 8489\n\n[PASS] testFuzzTransferFromTracksAllowance(uint256,uint256) (runs: 512, μ: 169171, ~: 169969)\nLogs:\n  Bound result 15488016172196478315742\n  Bound result 415546620724220434840923669319904060886075378719255787634978143226091052750\n\n[PASS] testInfiniteAllowanceIsNotDecremented() (gas: 144184)\n[PASS] testMaximumTransferRevertsWithoutOverflow() (gas: 45111)\n[PASS] testMetadataAndEntireSupplyAtDeployment() (gas: 109738)\n[PASS] testNoMintBurnAdminOrUpgradeEntryPoints() (gas: 853328)\n[PASS] testRejectsNativeEtherAndUnknownCalls() (gas: 62264)\n[PASS] testSelfTransferPreservesBalance() (gas: 54220)\n[PASS] testTransferDoesNotCallRecipient() (gas: 174172)\n[PASS] testTransferEmitsEventAndDeliversExactAmount() (gas: 96163)\n[PASS] testTransferEntireBalance() (gas: 78391)\n[PASS] testTransferFromByHolderStillRequiresAllowance() (gas: 45404)\n[PASS] testTransferFromDecrementsFiniteAllowanceAndEmitsTransfer() (gas: 221749)\n[PASS] testTransferFromInsufficientAllowanceRevertsWithoutMutation() (gas: 120572)\n[PASS] testTransferFromInsufficientBalanceRollsBackAllowance() (gas: 126144)\n[PASS] testTransferFromToSelfConsumesAllowanceButPreservesBalance() (gas: 108144)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 119047)\n[PASS] testTransferFromZeroAmountNeedsNoAllowance() (gas: 78781)\n[PASS] testTransferFromZeroSenderReverts() (gas: 37903)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 74955)\n[PASS] testTransferWithInsufficientBalanceRevertsWithoutMutation() (gas: 70039)\n[PASS] testZeroTransferFromEmptyAccountEmitsEvent() (gas: 63100)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 30.94ms (106.97ms CPU time)\n\nRan 19 tests for test/ConditionalsToken.launch.t.sol:ConditionalsTokenLaunchTest\n[PASS] testAllowanceIsPerSpender() (gas: 95350)\n[PASS] testAllowanceOneBelowMaxIsDecremented() (gas: 126687)\n[PASS] testDirtyAddressUpperBitsRejected() (gas: 40964)\n[PASS] testFuzzApproveOverwritesRegardlessOfPrevious(address,address,uint256,uint256) (runs: 512, μ: 113010, ~: 113140)\n[PASS] testFuzzOneTransactionLaunchFlowsAreExact(uint256,bytes32) (runs: 256, μ: 771874, ~: 773036)\nLogs:\n  Bound result 9000\n\n[PASS] testFuzzSupplyGoesToImmediateDeployerNotOrigin(address,address) (runs: 256, μ: 30790, ~: 30790)\n[PASS] testFuzzTransferBetweenAnyHolders(address,address,uint256,uint256) (runs: 512, μ: 175755, ~: 177455)\nLogs:\n  Bound result 694045765556224219028412978\n  Bound result 559684630227829927492435575\n\n[PASS] testFuzzTransferFromBalanceOrAllowanceShortReverts(uint256,uint256,uint256) (runs: 512, μ: 189827, ~: 185627)\nLogs:\n  Bound result 1000000000000000000000\n  Bound result 100\n  Bound result 254\n\n[PASS] testNoSupplyIncreasingOrFreezingCallFromDeployerOrStranger() (gas: 927882)\n[PASS] testOneWeiShortOfBalanceReverts() (gas: 160533)\n[PASS] testRuntimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 2473682)\n[PASS] testSameSaltCannotBeRedeployed() (gas: 696754)\n[PASS] testSelfApprovalIsSeparateFromBalance() (gas: 146889)\n[PASS] testSpentAllowanceCannotBeReused() (gas: 148975)\n[PASS] testSupplyConstantIsExactlyOneBillionWithEighteenDecimals() (gas: 24457)\n[PASS] testTokensSentToTokenAddressAreNotRecoverableByDeployer() (gas: 108138)\n[PASS] testTransferAndApproveReturnExactlyOneWordTrue() (gas: 167486)\n[PASS] testTruncatedCalldataReverts() (gas: 53194)\n[PASS] testTwoDeploymentsAreIndependent() (gas: 96040)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 33.52ms (140.24ms CPU time)\n\nRan 1 test for test/ConditionalsToken.invariant.t.sol:ConditionalsTokenInvariantTest\n[PASS] invariantSupplyBalancesAndAllowancesMatchModel() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2808  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2728  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2656  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 3\n  Bound result 415955170\n  Bound result 56153\n  Bound result 6721\n  Bound result 15\n  Bound result 0\n  Bound result 6000000000000000000\n  Bound result 385\n  Bound result 0\n  Bound result 2235936992360011776971\n  Bound result 0\n  Bound result 2221\n  Bound result 467\n  Bound result 15000000000000000000\n  Bound result 192\n  Bound result 42803933392323437457503974\n  Bound result 0\n  Bound result 446073561986137730964361807\n  Bound result 9000\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 254\n  Bound result 0\n  Bound result 91\n  Bound result 208962766769850459410504223\n  Bound result 5847\n  Bound result 100\n  Bound result 42803933392323437457503974\n  Bound result 5438\n  Bound result 253\n  Bound result 100\n  Bound result 6463659837210360265262\n  Bound result 5212\n  Bound result 134399175498850165857243667\n  Bound result 6715\n  Bound result 356\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 8\n  Bound result 10000000000000000000\n  Bound result 3767\n  Bound result 6858\n  Bound result 664097727263782395305898925\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 16518540\n  Bound result 6359\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.23s (2.23s CPU time)\n\nRan 1 test for test/ConditionalsToken.openInvariant.t.sol:ConditionalsTokenOpenInvariantTest\n[PASS]\nConditionalsTokenOpenInvariantTest invariants:\n[PASS] invariant_allowancesMatchGhost\n[PASS] invariant_fixedSupplyAndConservation\n[PASS] invariant_tokenHoldsNoEther\n ConditionalsTokenOpenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------+----------------+-------+---------+----------╮\n| Contract    | Selector       | Calls | Reverts | Discards |\n+===========================================================+\n| OpenHandler | approve        | 1663  | 0       | 0        |\n|-------------+----------------+-------+---------+----------|\n| OpenHandler | transfer       | 1624  | 0       | 0        |\n|-------------+----------------+-------+---------+----------|\n| OpenHandler | transferFrom   | 1656  | 0       | 0        |\n|-------------+----------------+-------+---------+----------|\n| OpenHandler | transferToZero | 1578  | 0       | 0        |\n|-------------+----------------+-------+---------+----------|\n| OpenHandler | tryPrivileged  | 1671  | 0       | 0        |\n╰-------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1330\n  Bound result 447767761175032472531876627\n  Bound result 1000000000000000000000\n  Bound result 255\n  Bound result 0\n  Bound result 7\n  Bound result 100000000000000000000\n  Bound result 2308\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 100\n  Bound result 403366593053206086794376816\n  Bound result 713153881304827390490071\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 216429380696932\n  Bound result 18\n  Bound result 0\n  Bound result 4010\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3079\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3175\n  Bound result 0\n  Bound result 2000000000000000000\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.30s (10.30s CPU time)\n\nRan 4 test suites in 10.30s (12.60s CPU time): 51 tests passed, 0 failed, 0 skipped (51 total tests)\n","passed":true},{"durationMs":61,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":16,\"README.md\":138,\"foundry.toml\":23,\"remappings.txt\":2,\"src/ConditionalsToken.sol\":16,\"test/ConditionalsToken.invariant.t.sol\":114,\"test/ConditionalsToken.launch.t.sol\":351,\"test/ConditionalsToken.openInvariant.t.sol\":188,\"test/ConditionalsToken.t.sol\":412},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6d87133f082ffc9d5de34a75bda2bb4cd00fdad2a154041bec3dd5e7786cd512","verifiedTreeHash":"6e08a6947e8c405f9e681c77a2d34ed1b3a2d301","verifierVersion":"0.1.0+18543036"},{"checks":[{"durationMs":1183,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.11s\nCompiler run successful!\n","passed":true},{"durationMs":2137,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 30 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testApprovalBelongsOnlyToCallerAndDoesNotMoveTokens() (gas: 116510)\n[PASS] testApproveEmitsEventAndCanBeReplacedAndRevoked() (gas: 199365)\n[PASS] testApproveZeroSpenderReverts() (gas: 40165)\n[PASS] testConstructorEmitsSingleMintEvent() (gas: 12304)\n[PASS] testCreate2MintsToFactoryAndLaunchTransfersAreExact() (gas: 667637)\n[PASS] testDeployerCannotSeizeHolderTokensWithoutAllowance() (gas: 161284)\n[PASS] testFuzzInsufficientAllowanceReverts(uint256,uint256) (runs: 512, μ: 126603, ~: 128040)\nLogs:\n  Bound result 15488016172196478315742\n  Bound result 6438369130888039227086\n\n[PASS] testFuzzOverspendReverts(uint256) (runs: 512, μ: 61548, ~: 61858)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639601496647383014294614453915\n\n[PASS] testFuzzTransferConservesSupply(uint256,address) (runs: 512, μ: 95711, ~: 96537)\nLogs:\n  Bound result 2\n\n[PASS] testFuzzTransferFromTracksAllowance(uint256,uint256) (runs: 512, μ: 169107, ~: 169957)\nLogs:\n  Bound result 1\n  Bound result 33574990845693024085755845450047559504322603083325022\n\n[PASS] testInfiniteAllowanceIsNotDecremented() (gas: 144184)\n[PASS] testMaximumTransferRevertsWithoutOverflow() (gas: 45111)\n[PASS] testMetadataAndEntireSupplyAtDeployment() (gas: 109738)\n[PASS] testNoMintBurnAdminOrUpgradeEntryPoints() (gas: 853328)\n[PASS] testRejectsNativeEtherAndUnknownCalls() (gas: 62264)\n[PASS] testSelfTransferPreservesBalance() (gas: 54220)\n[PASS] testTransferDoesNotCallRecipient() (gas: 174172)\n[PASS] testTransferEmitsEventAndDeliversExactAmount() (gas: 96163)\n[PASS] testTransferEntireBalance() (gas: 78391)\n[PASS] testTransferFromByHolderStillRequiresAllowance() (gas: 45404)\n[PASS] testTransferFromDecrementsFiniteAllowanceAndEmitsTransfer() (gas: 221749)\n[PASS] testTransferFromInsufficientAllowanceRevertsWithoutMutation() (gas: 120572)\n[PASS] testTransferFromInsufficientBalanceRollsBackAllowance() (gas: 126144)\n[PASS] testTransferFromToSelfConsumesAllowanceButPreservesBalance() (gas: 108144)\n[PASS] testTransferFromToZeroRollsBackAllowance() (gas: 119047)\n[PASS] testTransferFromZeroAmountNeedsNoAllowance() (gas: 78781)\n[PASS] testTransferFromZeroSenderReverts() (gas: 37903)\n[PASS] testTransferToZeroRevertsEvenForZeroAmount() (gas: 74955)\n[PASS] testTransferWithInsufficientBalanceRevertsWithoutMutation() (gas: 70039)\n[PASS] testZeroTransferFromEmptyAccountEmitsEvent() (gas: 63100)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 16.43ms (55.83ms CPU time)\n\nRan 1 test for test/ConditionalsToken.invariant.t.sol:ConditionalsTokenInvariantTest\n[PASS] invariantSupplyBalancesAndAllowancesMatchModel() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| TokenHandler | approve      | 2808  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transfer     | 2728  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| TokenHandler | transferFrom | 2656  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 56153\n  Bound result 6720\n  Bound result 11\n  Bound result 0\n  Bound result 8\n  Bound result 386\n  Bound result 0\n  Bound result 2235936992360011776971\n  Bound result 5\n  Bound result 2210\n  Bound result 467\n  Bound result 5\n  Bound result 254\n  Bound result 42803933392323437457503974\n  Bound result 0\n  Bound result 446073561986137730964361807\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 10\n  Bound result 5288\n  Bound result 3000000000000000000\n  Bound result 165\n  Bound result 3\n  Bound result 208962766769850459410504223\n  Bound result 5953\n  Bound result 9\n  Bound result 0\n  Bound result 5436\n  Bound result 10000000000000000000\n  Bound result 9\n  Bound result 6463659837210360265262\n  Bound result 5213\n  Bound result 134399175498850165857243667\n  Bound result 963\n  Bound result 0\n  Bound result 11\n  Bound result 5\n  Bound result 716982359782964304649958517\n  Bound result 13\n  Bound result 5\n  Bound result 3809\n  Bound result 5667\n  Bound result 664097727263782395305898925\n  Bound result 1000000000\n  Bound result 0\n  Bound result 0\n  Bound result 592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.03s (2.03s CPU time)\n\nRan 2 test suites in 2.03s (2.05s CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":35,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":16,\"README.md\":138,\"foundry.toml\":23,\"launch.json\":24,\"remappings.txt\":2,\"src/ConditionalsToken.sol\":16,\"test/ConditionalsToken.invariant.t.sol\":114,\"test/ConditionalsToken.t.sol\":412},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b89fb95738ae66de87e8be4bbe7b313cf66cbe63ee329819c3bf890a70787c32","verifiedTreeHash":"6ae5eb9a9a095040655fa07128168c0265b1d0a7","verifierVersion":"0.1.0+18543036"}]}