{"assessments":[],"deployments":[{"attestationHash":"345ed4350890d8741b5e6f6b1c179141a2aef4c89aeac2ffff231d78bce28692","chainId":4663,"contracts":[{"address":"0x11c23c5c24451eb512855e4031d7ebdd8e818927","blockNumber":108584063,"name":"ConditionalsToken","role":"token","txHash":"0xb240e8b9712b08cf902495e929999d6cbc5b98ab6ff97c263a4f1e88eb25e6f3"},{"address":"0x9a1670a42fc2fac892b2c0a3d73257a6bb48f3e8","blockNumber":108584063,"name":"MerkleDistributor","role":"distributor","txHash":"0xb240e8b9712b08cf902495e929999d6cbc5b98ab6ff97c263a4f1e88eb25e6f3"},{"address":"0x697fa81aff6be07500119941ef941376f7cde000","blockNumber":108584063,"name":"ConditionalsHook","role":"hook","txHash":"0xb240e8b9712b08cf902495e929999d6cbc5b98ab6ff97c263a4f1e88eb25e6f3"}],"id":"ec17b8b4-14e1-416c-866f-58db37d94999","manifestHash":"7addc56e97207259da61d537def31532c7c69a37bf342f464dd0f6e98a8ac6f8","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":"84d52b96-4166-4dd1-bca7-0c6bcf0fe250","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"516dcdcf565328d269551ce3bee111462707702dbfeace00ffc56727f41846b7","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":"5d50c5c0f1f9a3ff2404f451f535fc883bef6d8f76002d5ff63c0936ed9aaaeb","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":"47528b3443a76764361aec7167f569d826b3afeaebaf060cc4f6db23c7d14c8c","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":"15bad5ca1a023d8b623104078f5c217751583900efa7a06aaca6c7a2f6517d15","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":"99cf749327cea842974d3a1fa653fc7a82196074c30fa1e3bb2246fb96f5df01","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":"4bd5a65a2fa79e3197230ff3b874ced7ba03513202d622c4e5819af1d2044503","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":"a3f8a4413a4e49bd21b96092d8cf3f016e7adc697506a09dd8fb702e1ce3bbbc","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"4cc67ea858557b8efa69fc980969f7c34d45f07c8203aa96a59d13ac061da325","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":"Launch Conditionals on Robinhood Chain using the existing v4 hook launch configuration.\n\nThe token name must be exactly Conditionals, and its symbol must be exactly CONDITIONALS (12 characters). Do not shorten, truncate, or substitute the symbol.\n\nKeep every other existing setting unchanged, including the token supply, allocation, paired currency, pool settings, hook behavior, fees, recipient addresses, and permissions. This request changes only the token symbol; it does not authorize any other configuration changes.\n\nIf the launch form or deployment system cannot support the exact symbol CONDITIONALS, stop before payment or deployment and explain the limitation. Do not deploy with a shortened symbol.\n\nShow the final configuration and total cost for confirmation before broadcasting. After confirmation and deployment, return the token address, hook address, pool ID, and transaction links.\n\nToken name: Conditionals\nToken symbol: CONDITIONAL\nToken supply: 1 billion tokens","parentJobId":null,"planHash":"af97a158303ad47aebad6b9ea859c8c7f832d4e9d3dbbaf9c76934cf9609e40e","previousHash":"2473a7544b7550680aa82b3af25bbc7da65d44a48986185b8e6c52335e448ff9","projectId":"84d52b96-4166-4dd1-bca7-0c6bcf0fe250","publication":{"commit":"925835b0bbbd5e3bdefa84dcb89012789c5c3dce","deliveredAt":"2026-11-07T16:49:13.788Z","repoUrl":"https://github.com/identity-md-launches/launch-3111-conditionals"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"8c9265498e9d0b1d1b12ab994710efd719618a283517c886c24a42a4e98fabfd","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"3aba18a0061fbcaaac43dbbdfd9c889fefb67e89598afee87e1e492c639565d4","device":"aefe32dd2527eb68","findings":[],"hash":"02334fba9b366e6fa27367b60c93f72bc7c783c7ce6070e5e76241bdccef8c71","nodeId":"c2b99d1e-94c5-46fa-bc4f-9cca10fc50fd","outcome":"completed","summary":"I wrote `launch.json`, and it's the only file I changed. Nothing has been paid, quoted or deployed: this job only writes the manifest. So I can't give you the total cost, or the token address, hook address, pool ID and transaction links, yet. Those come from later steps.\n\n**The symbol is exactly `CONDITIONALS` (12 characters).** Your brief also has a line saying `Token symbol: CONDITIONAL`, which conflicts with the explicit instruction not to shorten it. I followed the explicit instruction, and the token contract in the repo already uses `CONDITIONALS`. The contract has no length limit on the symbol, but the launch system itself still has to confirm it accepts 12 characters. If it doesn't, the launch should stop rather than shorten it.\n\n**What the manifest says**\n- **Hook:** `ConditionalsHook`. Its only setup input is the chain's pool manager (`\"$poolManager\"`). Its only permission is `beforeInitialize`, which matches what the contract declares. It only accepts calls from the pool manager and doesn't restrict the fee. It has no owner, no fee of its own and holds no funds.\n- **Token:** `ConditionalsToken`, name `Conditionals`, symbol `CONDITIONALS`, 18 decimals. Its constructor takes no arguments and mints 1 billion tokens (`\"1000000000000000000000000000\"` in the smallest unit) once, to the launch factory.\n- **Pool:** paired with IMD at `0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127`, fee 12500 (1.25%), tick spacing 60, initial price `79228162514264337593543950336` (one to one).\n- **Everything else is unchanged:** supply, allocation, hook behaviour, fees, recipients and permissions. The manifest has no allocation or ownership fields; those come from the launch policy.\n\n**Checks:** `forge build` and `forge test` with the required fuzz seed both pass, 22 of 22 tests. I also ran the protected Hook and token tests in a scratch folder, filling in this launch's values myself; all 14 passed. To get the Hook test to compile there, I changed one `fail(...)` call to `revert(...)`, because the repo's version of the test library doesn't support it. The verifier will run these tests with its own setup.\n\n**Still to do before broadcasting:** the launch system must confirm it supports the 12-character symbol and give a current total cost. Then you confirm. Only after deployment will there be addresses, a pool ID and transaction links to send you.","treeHash":"e9f4dc7cda23e74867b84018cd9c522661705c16","usage":{"cachedInputTokens":363467,"cost":{"source":"runtime","usdMicros":491197},"inputTokens":21,"model":"claude-opus-5-5","outputTokens":4876,"runtime":"claude","turns":12,"wallClockMs":73485}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8109087d965ddf6c","findings":[{"citation":"resolved","description":"Merged from audit_flow (its only finding); reproduced. dependencies.json line 4 pins forge-std at commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 and remappings.txt line 1 maps forge-std/ to lib/forge-std/src/. That StdAssertions defines only the zero-argument fail() (line 46; upstream file at that commit checked and identical modulo formatting). The protected floor this launch is judged against calls fail(string): .imd/reads/protected/univ4_hook/Hook.protected.t.sol line 259 inside test_initializesFromTheLaunchFactory, and Owners.protected.t.sol lines 176 and 181 inside test_theFactoryCollectsItsFeesWithTheHookLive. The overload fail(string memory message) exists upstream from forge-std v1.10.0 (StdAssertions.sol line 53 at tag v1.10.0; line 58 on master) and not at the pinned commit. The floor's imports are relative to the repository (../../../src/HookFlags.sol, ../../mocks/MockERC20.sol, ../../mocks/Swapper.sol), so it is compiled inside this tree with this tree's remappings and this forge-std, and solc rejects both hook floor files with error 6160. The hook otherwise satisfies every floor assertion: with fail( replaced by revert( the four hook floor tests, the seven token floor tests and the three own-token floor tests all pass (14 of 14) against ConditionalsHook and ConditionalsToken creation code. Impact: no funds at risk; the launch's mandatory hook checks cannot be executed from this tree, which blocks admission until the dependency is updated. The impact is conditional on the verifier compiling the floor against the project's forge-std rather than supplying its own; nothing in the tree or README establishes the latter. Minimal fix: vendor forge-std at v1.10.0 or later (StdAssertions with fail(string memory)) and update commit, archiveSha256 and file count in dependencies.json. No change to src/ is needed. Token.protected.t.sol and OwnToken.protected.t.sol compile and pass unmodified.","line":46,"path":"lib/forge-std/src/StdAssertions.sol","reproduction":"State: this tree at commit 0d42e69, forge 1.8.3, solc 0.8.26. Steps: mkdir -p test/scratch/univ4_hook && cp .imd/reads/protected/univ4_hook/Hook.protected.t.sol test/scratch/univ4_hook/ && forge build. Expected: the floor compiles and its four tests can run against the hook's creation code. Actual: 'Error (6160): Wrong argument count for function call: 1 arguments given but expected 0. --> test/scratch/univ4_hook/Hook.protected.t.sol:259:13: fail('. Confirming cause: grep -n 'function fail' lib/forge-std/src/StdAssertions.sol prints only line 46 'function fail() internal virtual {'; the same grep on upstream StdAssertions.sol at tag v1.10.0 additionally prints 'function fail(string memory message) internal virtual'. Control showing the hook itself passes the floor: sed -i 's/^            fail($/            revert(/' on the scratch copy, then IMD_HOOK_CREATION_CODE=<ConditionalsHook creation code ++ abi.encode(0x000000000004444c5dc75cB358380D2e3dE08A90)> IMD_HOOK_FLAGS=8192 IMD_POOL_MANAGER=0x000000000004444c5dc75cB358380D2e3dE08A90 IMD_FACTORY_PROBE=0x000000000000000000000000000000000000FaC7 IMD_PAIRED_CURRENCY=0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127 IMD_POOL_FEE=12500 IMD_TICK_SPACING=60 IMD_SQRT_PRICE=79228162514264337593543950336 IMD_TOKEN_CREATION_CODE=<ConditionalsToken creation code> IMD_EXPECTED_SUPPLY=1000000000000000000000000000 IMD_TOKEN_DECIMALS=18 IMD_PROJECT_CHAIN_ID=4663 IMD_CUSTOM_TOKEN=1 forge test --match-path 'test/scratch/univ4_hook/*' passes 4/4 hook, 7/7 token, 3/3 own-token.","severity":"medium","snippet":"    function fail() internal virtual {","title":"Vendored forge-std (pinned commit 77041d2, release 1.9.7) has no fail(string); the pinned hook floor (Hook.protected.t.sol, Owners.protected.t.sol) does not compile in this tree, so the launch's hook "},{"citation":"resolved","description":"Merged from write_foundry_tests; reproduced and kept as information, not a defect. The callback checks the caller is the PoolManager, returns IHooks.beforeInitialize.selector, and ignores the initializer, currencies, fee and tick spacing. This is what the launch policy asks for: the floor requires the hook to accept PoolManager.initialize from the factory on the launch key with the manifest's fee 12500 and spacing 60, and the hook does (floor test_initializesFromTheLaunchFactory passes). While the mined hook address has no code, PoolManager.initialize on a key naming it reverts inside Hooks.callHook, so nobody can open the launch pool before the factory does, provided the factory deploys the hook and initializes in the same transaction as the deployment model states. If the deployer ever split those steps, anyone could initialize the key first at an arbitrary price and the factory's initialize would revert with PoolAlreadyInitialized. No change is implied; recorded so the single-transaction ordering is kept.","line":31,"path":"src/ConditionalsHook.sol","reproduction":"test/ConditionalsLaunch.t.sol::test_strangerCannotOpenTheLaunchPoolBeforeTheHookExists (passes): initialize of the predicted key reverts while the hook address is empty, then the one-call launch opens the pool with the predicted ID. test/ConditionalsLaunch.t.sol::test_poolOperationFailurePaths (passes): a second initialize of the opened key reverts with PoolAlreadyInitialized. Direct call hook.beforeInitialize(addr, key, price) from any address other than the PoolManager reverts OnlyPoolManager (floor test_callbacksRefuseCallersOtherThanThePoolManager passes).","severity":"info","snippet":"        if (msg.sender != address(poolManager)) revert OnlyPoolManager();","title":"beforeInitialize gates only on msg.sender == poolManager; front-run protection for the launch pool rests on the factory deploying the hook and initializing in one transaction"},{"citation":"resolved","description":"Merged from audit_permissions and the second write_foundry_tests note; reproduced as a state of the tree, not a code defect. The request says to reuse the existing v4 hook launch configuration and change only the symbol, but the repository history holds no earlier Conditionals hook, token or saved launch form: config/policy-baseline.json (same commit as the contracts) is the only baseline and carries the old symbol CONDITIONAL. The delivered ConditionalsHook (beforeInitialize only, no owner, no fee) therefore cannot be shown equal to whatever hook the requester's stored configuration carries; the README says so and tells the operator to reconcile against the real baseline before confirmation. Likewise the on-chain symbol is exactly CONDITIONALS (12 bytes, asserted by test/ConditionalsToken.t.sol::test_exactMetadataAndFactorySupply), but whether the launch form accepts 12 characters, the total cost, and the post-deployment addresses are outside what this tree can establish; nothing was paid or broadcast. One small inconsistency: README.md lines 227-228 state 'No launch.json is supplied here because that step owns it', while launch.json exists at the root since commit 0d42e69. The manifest itself was checked and is consistent with the code: hook constructorArgs ['$poolManager'] matches constructor(IPoolManager), permissions ['beforeInitialize'] matches getHookPermissions, token constructorArgs [] matches the no-argument constructor, totalSupply 1000000000000000000000000000 equals INITIAL_SUPPLY, name/symbol/decimals match, pairedCurrency is lowercase, fee 12500 is the policy tier, notes are 1086 characters.","line":19,"path":"README.md","reproduction":"git log --oneline shows 0243d7d 'Empty workspace', 4ad3608 (contracts, README, config), cd0bf47/3f57af7 (tests), 0d42e69 (launch.json only). find src test -name '*.sol' lists only ConditionalsHook.sol, ConditionalsToken.sol, HookFlags.sol, mocks and tests; no earlier hook or form. grep -n 'No `launch.json`' README.md prints line 227 while ls launch.json succeeds. Expected: an existing stored configuration to compare the hook against and a form validation of the 12-character symbol. Actual: neither exists in the repository; the operator must obtain both before confirmation.","severity":"info","snippet":"accounting. This is a documented reconstruction, **not evidence of equivalence to","title":"The brief's 'existing configuration' and the launch form's 12-character symbol support cannot be verified from the tree; the delivered hook is a documented reconstruction and the README's 'no launch.j"}],"hash":"0a8797243f1c622ae45043b2d3ac38716dfb863ca2d568ff8f2323e8c6809bab","nodeId":"8dc5361e-4fce-4db4-a774-1407cd380f32","outcome":"completed","summary":"Review complete. The findings file is written at the repository root, every snippet matches the tree, the scratch directory is removed, and the working tree is clean apart from the findings file.\n\n**Outcome.** The contracts are sound. The one real defect is in the vendored test dependency, not in the Solidity.\n\n**Findings kept (3), from 4 specialist entries:**\n\n1. **Medium, merged from audit_flow.** The vendored forge-std is pinned at release 1.9.7, which defines only the zero-argument `fail()`. The pinned hook floor calls `fail(string)` in two files, so compiling it inside this tree gives solc error 6160. I reproduced this by copying the floor into the tree and building. I also confirmed upstream: the pinned commit lacks the overload, and v1.10.0 and master have it. With the call shimmed to `revert(`, all 14 floor tests pass against the hook and token creation code, so the fix is only to vendor forge-std v1.10.0 or later and update dependencies.json. Impact is conditional on the verifier using the project's forge-std, which nothing in the tree rules out.\n2. **Info, from write_foundry_tests.** The hook's beforeInitialize gates only on the PoolManager caller. That is what the floor requires, and the project tests show the pool cannot be opened before the hook has code. Kept as a note that the deploy-and-initialize ordering must stay atomic.\n3. **Info, merged from audit_permissions and the second tester note.** The brief's \"existing configuration\" has no counterpart in the tree, so the hook is a documented reconstruction, and form support for the 12-character symbol plus cost cannot be checked here. The README's claim that no launch.json is supplied is now stale since the merge commit added one.\n\n**Dropped:** nothing substantive. The two aderyn lows are style only.\n\n**Own pass.** I diffed every vendored Solidity file against upstream at the pinned commits, ignoring whitespace. All are identical except formatting reflow in two v4-core files. OpenZeppelin is release v5.1.0, so the three token entry points are the standard implementation. The manifest matches the code on constructor arguments, permissions, supply, name, symbol, decimals, fee tier and note length.\n\n**Coverage.** All three listed entry points are marked holds, plus five invariant rows covering the hook callback, constructor and flags, the manifest, floor compilation (finding 1) and dependency integrity.","treeHash":null,"usage":{"cachedInputTokens":783589,"cost":{"source":"runtime","usdMicros":3219856},"inputTokens":322,"model":"claude-fable-5-1","outputTokens":22951,"runtime":"claude","turns":34,"wallClockMs":360103}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"be85220723d9ce9d","findings":[],"hash":"15bad5ca1a023d8b623104078f5c217751583900efa7a06aaca6c7a2f6517d15","nodeId":"2433b049-e305-47f1-b60a-5410fdd0ab1e","outcome":"completed","summary":"I found no defects in the math area (Math Precision, Boundary and Numerical Gap), so `.imd-findings.json` has an empty findings list. It also has a coverage row for each of the three listed entry points and for five extra checks. I changed no other files. `forge test` passes all 22 tests.\n\n**What I checked:**\n- **`ConditionalsToken`** is OpenZeppelin's ERC20 with no changes.\n  - `INITIAL_SUPPLY = 1_000_000_000 * 10**18` comes to exactly 1e27. That matches the configured `totalSupply` string and 18 decimals.\n  - The whole supply is minted once, to the deployer (the launch factory). The token has no later mint, burn, fee or rounding.\n  - The math in `transfer` and `transferFrom` can't overflow: balances are checked before they are reduced, and the unchecked additions can never exceed the 1e27 total supply.\n  - `transferFrom` checks the allowance before reducing it, and a maximum allowance is treated as unlimited. A reverted call leaves no partial changes.\n  - The name and symbol are passed through exactly as `Conditionals` / `CONDITIONALS` (12 characters). Nothing in the contract caps or shortens the symbol.\n- **`ConditionalsHook`** does no price, tick or fee math. `beforeInitialize` accepts any opening price and the 12500 pool fee. It only checks that the caller is the PoolManager, then returns the correct selector. Its permission bits (`0x2000`) match what `getHookPermissions` declares.\n- **`HookFlags`** is a plain mask over the 14 low bits, with no casts that could lose bits.\n- **`tools/prepare_launch.py`** (an off-chain helper, outside the Solidity scope) adds cost amounts as exact integers per currency. It rejects mismatched decimals and anything that isn't an unsigned whole number, and formats amounts correctly.\n\n**Not a code defect, but worth knowing:** the brief contradicts itself. It says the symbol must be exactly `CONDITIONALS`, then lists `Token symbol: CONDITIONAL`. The code and `review/conditionals-review.json` use `CONDITIONALS`. `config/policy-baseline.json` deliberately keeps `CONDITIONAL` as the \"before\" value.\n\n**Not covered:** I did not check whether the launch form or deployer accepts a 12-character symbol, or the deployment cost, because no quote or system validation is in the repo. Those sit outside this code.","treeHash":null,"usage":{"cachedInputTokens":318094,"cost":{"source":"runtime","usdMicros":575225},"inputTokens":14,"model":"claude-opus-5-5","outputTokens":3555,"runtime":"claude","turns":7,"wallClockMs":46768}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1b657df861f7b08b","findings":[{"citation":"resolved","description":"Carried over from the earlier advisory finding (id 4116afb0...). The author answered not_reproducible because their node's tree (commit 4ad3608) had no launch.json. That was true of that node, but the tree under review now is the combination of accepted work (commit a5074b3 'imd: combine accepted dependencies'), which includes the manifest step's launch.json at the root. README.md lines 232-233 therefore describe a state that no longer holds. The manifest itself was re-checked and is consistent with the code: hook constructorArgs ['$poolManager'] matches constructor(IPoolManager); permissions ['beforeInitialize'] matches getHookPermissions; token constructorArgs [] matches the no-argument constructor; totalSupply 1000000000000000000000000000 equals INITIAL_SUPPLY; name Conditionals, symbol CONDITIONALS, decimals 18 match; pairedCurrency is lowercase; fee 12500 is the policy tier; tickSpacing 60; notes under 4,000 characters. This is a documentation inconsistency only; no funds, deployment or admission impact. Everything else in the earlier advisory (no stored prior configuration to compare the hook against; 12-character symbol support, quote and total cost outside the tree) is already documented in the README and in launch.json's notes and needs no code change.","line":232,"path":"README.md","reproduction":"State: this tree at commit a5074b3. Steps: `ls launch.json` succeeds; `sed -n 232,233p README.md` prints 'No `launch.json` is supplied here because that step owns it.' Expected: README describes the tree it ships with (launch.json present, written by the manifest step). Actual: README says none is supplied. Fix: reword the sentence to say launch.json is written by the manifest step and is present at the root.","severity":"info","snippet":"owns the separate manifest/attestation step and fork rehearsal. No `launch.json`\nis supplied here because that step owns it.","title":"README still states that no launch.json is supplied, but launch.json exists at the repository root in the combined tree"}],"hash":"47528b3443a76764361aec7167f569d826b3afeaebaf060cc4f6db23c7d14c8c","nodeId":"8dc5361e-4fce-4db4-a774-1407cd380f32","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. The medium finding from the previous round is fixed, and the only item kept is one documentation note.\n\n**Prior medium finding (forge-std lacked fail(string)): fixed.** The vendored library is now byte-identical to upstream forge-std at commit f3dae6e, release v1.17.0. The codeload archive hash matches the value recorded in dependencies.json, and StdAssertions now defines the string overload. Copying the pinned Hook, Token and OwnToken floor files into the tree unmodified, they compile and pass against the real creation code of ConditionalsHook and ConditionalsToken.\n\n| Suite | Result |\n| --- | --- |\n| Protected floor (hook, token, own token) | 14 of 14 pass |\n| Project Solidity suite | 40 of 40 pass |\n\n**Prior advisory on beforeInitialize gating: dropped.** The behaviour is intended, the atomic deploy-and-initialize model is the protection, and the project tests cover it. No defect.\n\n**Prior advisory on unverifiable \"existing configuration\": one residual note kept as info.** The author answered that launch.json did not exist in their tree. That was true of their node, but the combined tree under review now has launch.json at the root, so the README sentence saying none is supplied is out of date. The manifest itself is consistent with the code: constructor arguments, permissions, supply, name, symbol, decimals, paired currency, fee tier and tick spacing all match. The remaining points from that advisory are already documented in the README and the manifest notes and need no code change.\n\n**Specialist findings.** The audit_flow finding was the same forge-std root cause and is settled by the fix. The audit_permissions info note is merged into the kept info finding. No specialist proof was attached, and nothing new reproduced.\n\n**Coverage.** All three token entry points are marked holds. They are unmodified OpenZeppelin v5 ERC20 paths with no override, mint or admin surface in the token. The hook's constructor and callback, and both prior findings, have rows as well.","treeHash":null,"usage":{"cachedInputTokens":690306,"cost":{"source":"runtime","usdMicros":1564146},"inputTokens":388,"model":"claude-fable-5-1","outputTokens":8983,"runtime":"claude","turns":14,"wallClockMs":617716}},{"artifacts":[],"attempt":1,"bundleHash":"48b4a232e147c44eeb91a08ab5d008a8691efcad6b359069ea38c3317a386dd7","device":"4aa8623bfb8d8e5e","findings":[],"hash":"4bd5a65a2fa79e3197230ff3b874ced7ba03513202d622c4e5819af1d2044503","nodeId":"a8c4041a-1e62-472b-acc3-c652e05397cf","outcome":"completed","summary":"The responses file is in place and is excluded from git by the harness's own exclude list, which is expected since it is read directly by the review pipeline rather than committed.\n\n**Outcome:** the reopened finding reproduced and is fixed. The two advisory findings did not require code changes, and every finding is answered in `.imd-responses.json`.\n\n**What I reproduced and changed**\n\n- **forge-std too old for the floor (medium, fixed).** Copying the pinned hook floor into scratch and building failed with solc error 6160 at the one-argument `fail(` call, exactly as reported. The vendored forge-std at v1.9.7 only had the zero-argument form.\n- **Fix.** Re-vendored `lib/forge-std` from the GitHub archive of release v1.17.0, keeping the same subset layout as before. The archive hash method matched the old entry, so dependencies.json now carries the new commit, archive SHA-256 and file count. The README's build section explains why the floor needs forge-std v1.10.0 or later. No source contract changed.\n- **Verification.** With the unmodified Hook, Token and OwnToken floor files in scratch and the reviewer's environment values, all 14 floor tests pass against the built creation code. The Owners floor imports verifier-only helpers that are not in this tree, so it could not be compiled here, but it uses the same overload that now exists.\n\n**Advisory findings**\n\n- **beforeInitialize only gates on the PoolManager** is confirmed, intended behaviour. The existing tests already cover initialization being blocked before the hook has code, duplicate initialization, and forged-sender callbacks. Answered as disputed with no change.\n- **Missing existing configuration and the launch.json inconsistency** does not reproduce in the accepted tree. The commits it cites belong to the rejected attempt, no launch.json exists here, and the README already documents the reconstruction and the open operator checks. Answered as not reproducible.\n\n**Final checks on the clean tree**\n\n| Check | Result |\n| --- | --- |\n| forge build with solc 0.8.26 | passes |\n| forge test with the verifier fuzz seed | 22 passed, 0 failed |\n| forge fmt --check | passes |\n| Python review-tool tests | 15 passed |\n\nNothing was paid, signed or broadcast. Form validation of the 12-character symbol and the total cost quote remain operator steps before confirmation, as the README states.","treeHash":"272666bc991d725ac1d26e99378bc3e46edd31ef","usage":{"cachedInputTokens":910856,"cost":{"source":"runtime","usdMicros":2077439},"inputTokens":482,"model":"claude-fable-5-1","outputTokens":12226,"runtime":"claude","turns":16,"wallClockMs":220064}},{"artifacts":[],"attempt":2,"bundleHash":"97774567a4183922ed43bd0fd38b8f412ae923376f50c303548ffb4b61506e5e","device":"2ab0b432477fde6c","findings":[],"hash":"4cc67ea858557b8efa69fc980969f7c34d45f07c8203aa96a59d13ac061da325","nodeId":"9dfe17d9-a493-4925-82b9-977f07a57d6b","outcome":"completed","summary":"I added one new test file this round, `test/ConditionalsTokenLedgerInvariant.t.sol`. The last attempt was rejected because it changed nothing. The accepted tests are untouched, and with the verifier's fuzz seed `forge build` succeeds and `forge test` passes all 40 tests in 6 suites, with none failing or skipped.\n\n**Why this file:** the token's existing invariant suite only checked that the balances add up to the full supply. Every approval in it was spent in full straight away, so allowances were never really tested, and it never tried a call that should fail.\n\n**What's in it:**\n- **A record kept alongside the token:** a helper drives the token with 5 accounts and keeps its own record of every balance and every allowance. The calls include normal transfers, approvals (sometimes unlimited) and partial `transferFrom`.\n- **Calls that must fail:** the helper also makes calls the token must refuse. Each one must revert with the exact OpenZeppelin error and change nothing:\n  - spending more than the allowance;\n  - moving more than the balance, both directly and through an unlimited allowance;\n  - sending to the zero address;\n  - approving the zero address.\n- **Checks after every call:**\n  - every balance matches the record, and the total is still exactly 1,000,000,000;\n  - nothing ever reaches the zero address, the deployer or the helper;\n  - every allowance between every pair of accounts matches the record;\n  - the name is still `Conditionals`, the symbol `CONDITIONALS` and the decimals 18.\n  \n  These ran 8,192 calls with 0 unexpected reverts.\n- **The symbol as other software reads it:** a test decodes the raw return of `symbol()`. It holds all 12 bytes `CONDITIONALS`, not `CONDITIONAL`, and every byte is a capital letter A to Z, with no hidden spaces or look-alike characters.\n- **Two fuzz tests:**\n  - an unlimited allowance stays unlimited however much is spent through it;\n  - approving again replaces the old allowance rather than adding to it, and spending one more than the new amount is refused.\n\n**Findings:** none, so I didn't write `.imd-findings.json`. Everything above matches correct ERC-20 behaviour.\n\n**Symbol:** the brief lists `CONDITIONAL` in its summary but explicitly says not to shorten `CONDITIONALS`. The contract uses `CONDITIONALS` and the tests require exactly that.\n\nThese are tests only. Nothing was deployed or broadcast, and the cost confirmation and the token, hook and pool addresses fall outside this task.","treeHash":"d07e9e6730fc8a9f05041947f26fd3393dea9a01","usage":{"cachedInputTokens":418364,"cost":{"source":"runtime","usdMicros":760146},"inputTokens":17,"model":"claude-opus-5-5","outputTokens":9487,"runtime":"claude","turns":10,"wallClockMs":133143}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9506ecec995bdbf9","findings":[],"hash":"516dcdcf565328d269551ce3bee111462707702dbfeace00ffc56727f41846b7","nodeId":"10133ee1-867f-4e6d-95ab-693f9b709c68","outcome":"completed","summary":"I found no economic defects that I could reproduce with a failing input, so `.imd-findings.json` has an empty findings list and a coverage record. Nothing was paid, deployed or broadcast, and no repository files were changed; I deleted my scratch test afterwards.\n\n**What I reviewed** (Economic Security, Invariant and Flow Gap guides, after the Mindset section):\n- **`ConditionalsToken`**: it is the standard OpenZeppelin v5 ERC20, and I checked the vendored copy is unmodified. The name is `Conditionals` and the symbol is `CONDITIONALS`, all 12 characters (`src/ConditionalsToken.sol:11`). The constructor mints the whole 1,000,000,000 × 10^18 supply once, to the deployer. Nothing can mint more, charge a transfer tax, rebase, blocklist holders or change the name or symbol later. Because a transfer always delivers the exact amount sent, the factory's 10/80/10 payouts and the pool's settlement can't come up short.\n- **`ConditionalsHook`**: only `beforeInitialize` is turned on. It rejects any caller other than the PoolManager, returns the correct selector, and accepts the 12500 fee and whatever opening price the factory works out. It has no swap fee, no custom accounting, holds no funds and has no admin. Nobody can open the launch pool before the hook exists. Anyone can open other pools that use this hook, but it stores nothing, so there is nothing to take.\n- **Cost tool (`tools/prepare_launch.py`)**: it adds up costs separately for each currency and never adds ETH and IMD into one number. It refuses quotes that are expired, incomplete, or made for a different configuration. It also refuses a returned launch form that changes anything other than the symbol.\n\n**Checks I ran:**\n- The project builds, and all 22 of its tests pass with the pinned fuzz seed.\n- My own fuzz test confirmed that balances always add up to 10^27, the total supply never changes, allowances go down by exactly the amount spent, and the symbol is the full 12 characters.\n\n**Coverage:** there is a `holds` row for each of the three entry points (`approve`, `transfer`, `transferFrom`), plus five rows for the invariants and other code I checked.\n\n**Not settled:**\n- The README says no earlier Conditionals configuration was available, so this setup was rebuilt from the launch policy. I can't confirm that it matches the \"existing\" settings the request says to keep. The launch operator needs to check that before asking you to confirm.\n- There is still no deployment cost quote, and the launch system hasn't confirmed it accepts a 12-character symbol. Until both arrive, the cost tool prints the configuration with no total and exits with a non-zero status.\n- The brief's `Token symbol: CONDITIONAL` line conflicts with the exact-symbol instruction. The code uses `CONDITIONALS`, which is what the instruction requires.\n\nI can't give you a token address, hook address, pool ID or transaction links, because nothing has been deployed.","treeHash":null,"usage":{"cachedInputTokens":532054,"cost":{"source":"runtime","usdMicros":729161},"inputTokens":21,"model":"claude-opus-5-5","outputTokens":6662,"runtime":"claude","turns":12,"wallClockMs":86147}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fb26479062458645","findings":[{"citation":"resolved","description":"The project vendors forge-std at commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 (dependencies.json line 4; upstream commit message 'chore: bump to 1.9.7', 2025-04-28). That release defines only fail() with no arguments. The pinned floor tests this launch is judged against import \"forge-std/Test.sol\", which remappings.txt resolves to lib/forge-std/src/, and they call fail(string): .imd/reads/protected/univ4_hook/Hook.protected.t.sol line 259 (test_initializesFromTheLaunchFactory) and Owners.protected.t.sol lines 176 and 181 (test_theFactoryCollectsItsFeesWithTheHookLive). fail(string memory) was added to StdAssertions in forge-std v1.10.0 and is present on master. Their relative imports (../../../src/HookFlags.sol, ../../mocks/MockERC20.sol) place the floor at test/protected/univ4_hook/ inside this repository, so it is compiled with this repository's remappings and this forge-std. Under that wiring solc rejects the two files with error 6160 and the hook floor cannot run at all, which blocks admission even though the hook itself passes every floor assertion (verified by running the floor with fail(string) shimmed to revert(string): 14 of 14 tests pass). Token.protected.t.sol and OwnToken.protected.t.sol compile and pass unmodified. Impact is conditional on the verifier compiling the floor against the project's forge-std rather than injecting its own; if it injects its own this is a no-op, but nothing in the tree or README establishes that. Minimal fix: vendor forge-std at v1.10.0 or later (StdAssertions with fail(string memory)) and update the commit, archiveSha256 and file count in dependencies.json; no source contract changes are needed.","line":46,"path":"lib/forge-std/src/StdAssertions.sol","reproduction":"State: this tree as committed (4ad3608), forge 1.8.3, solc 0.8.26. Steps: (1) mkdir -p test/protected/univ4_hook && cp .imd/reads/protected/univ4_hook/Hook.protected.t.sol test/protected/univ4_hook/ ; (2) forge build. Expected: the floor compiles so its four tests can run against IMD_HOOK_CREATION_CODE. Actual: 'Error (6160): Wrong argument count for function call: 1 arguments given but expected 0. --> test/protected/univ4_hook/Hook.protected.t.sol:259:13: fail('. Owners.protected.t.sol fails identically at lines 176 and 181 once its toolchain-supplied helpers (test/floor/OwnerChecks.sol, test/mocks/Swapper.sol) are present. Control: sed 's/fail(/revert(/' on the copied Hook floor, then with IMD_HOOK_CREATION_CODE=<ConditionalsHook creation code ++ abi.encode(poolManager)> IMD_HOOK_FLAGS=8192 IMD_POOL_MANAGER=0x000000000004444c5dc75cB358380D2e3dE08A90 IMD_FACTORY_PROBE=0x000000000000000000000000000000000000FaC7 IMD_PAIRED_CURRENCY=0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127 IMD_POOL_FEE=12500 IMD_TICK_SPACING=60 IMD_SQRT_PRICE=79228162514264337593543950336 IMD_TOKEN_CREATION_CODE=<ConditionalsToken creation code> IMD_EXPECTED_SUPPLY=1000000000000000000000000000 IMD_TOKEN_DECIMALS=18 IMD_PROJECT_CHAIN_ID=4663 IMD_CUSTOM_TOKEN=1, forge test --match-path 'test/protected/**' passes 4/4 (hook), 7/7 (token), 3/3 (own token). Confirming the cause: grep -n 'function fail' lib/forge-std/src/StdAssertions.sol prints only line 46 'function fail() internal virtual {'; upstream v1.10.0+ StdAssertions additionally defines 'function fail(string memory message) internal virtual'.","severity":"medium","snippet":"    function fail() internal virtual {\n        vm.store(address(vm), bytes32(\"failed\"), bytes32(uint256(1)));\n        _failed = true;\n    }","title":"Vendored forge-std 1.9.7 lacks fail(string); the pinned protected floor suite (Hook.protected.t.sol, Owners.protected.t.sol) does not compile in this tree"}],"hash":"5d50c5c0f1f9a3ff2404f451f535fc883bef6d8f76002d5ff63c0936ed9aaaeb","nodeId":"fedca65c-3998-40ae-bff3-fc98c8bac8ac","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` with one finding and fourteen coverage rows, and the working tree is unchanged.\n\n**Outcome.** The Solidity under review holds in my area. The one defect I could substantiate is a toolchain compatibility gap, not a contract bug.\n\n**Finding 1 (medium): the pinned floor suite cannot compile against the vendored forge-std.** The project vendors forge-std 1.9.7, whose assertions library defines only `fail()` with no arguments. The protected hook floor and the owners floor both call `fail(string)`, which arrived in forge-std v1.10.0. Their relative imports place them inside this repository, so they compile with this repository's remappings and hit solc error 6160. I reproduced the compile error by copying the hook floor to its intended path, then shimmed the call to `revert(string)` and ran all three available floors against the real creation code. All fourteen floor tests pass, so the hook and token themselves are sound and only the dependency pin blocks the check. The impact depends on whether the verifier injects its own forge-std, which nothing in the tree establishes. The fix is to vendor forge-std v1.10.0 or later and update the pin in the dependencies file.\n\n**What held, by pass:**\n- Execution Trace: `beforeInitialize` accepts only the PoolManager, returns the right selector, and holds no state. The token mints exactly one billion tokens at 18 decimals to the deploying factory. Initialization of the predicted pool before the hook has code reverts. The review tool rewrites only the symbol, enforces type-strict equality on any candidate, and never authorizes broadcast.\n- Periphery: every vendored library file was fetched from its pinned upstream commit. OpenZeppelin and solmate are byte-identical. The seventeen forge-std and v4-core files that differ do so only by line wrapping, confirmed with whitespace stripped. The HookFlags helper the floor consumes aliases the v4 flags correctly.\n- First Principles: no `$factory` gate on initialize is safe only because the factory deploys and initializes atomically. I recorded that as a documented assumption rather than a defect.\n\n**Not reached.** The owners floor needs two toolchain helpers that were not supplied, so I could not execute it. By reading, the hook has no owner function and no remove-liquidity callbacks, so a zero-liquidity fee collect never calls it.\n\n**One note for the judge, not a finding.** The brief asks to reuse an existing hook launch configuration. The README states no prior configuration was found and the minimal hook is a reconstruction. If the launch system does hold an earlier configuration with a different hook, this deliverable would replace rather than preserve it. That is a scope question for the operator, with no failing input I could name.","treeHash":null,"usage":{"cachedInputTokens":1435269,"cost":{"source":"runtime","usdMicros":5267661},"inputTokens":354,"model":"claude-fable-5-1","outputTokens":32053,"runtime":"claude","turns":46,"wallClockMs":517133}},{"artifacts":[],"attempt":2,"bundleHash":"02d0dce7f8af766db22d1ecdc92308475c03472b328914928fa4fd124b94d380","device":"4922f1d77cc1f08d","findings":[],"hash":"8060c2d963ecafc4b647cb21b06897b504ba36880b2a9f72844099b48a351eb8","nodeId":"a8c4041a-1e62-472b-acc3-c652e05397cf","outcome":"completed","summary":"Implemented **Conditionals / CONDITIONALS** with 1 billion tokens and 18 decimals.\n\n- Passed `forge build`, all 22 Solidity tests with the required seed, and `forge fmt --check`.\n- Passed 15 configuration-review tests.\n- [Final configuration](review/conditionals-review.json) rejects truncation and unrelated changes.\n- [README](README.md) documents the missing historical baseline and chosen minimal initialization-only hook, with no additional fees or admin powers.\n\n**Total cost remains unavailable pending a current launch quote.** Nothing was paid or broadcast; confirmation, deployment addresses, pool ID, and transaction links remain pending.","treeHash":"8a18cd8a8e3fbd109c863e49cef37fb26a761d10","usage":{"cachedInputTokens":1430528,"cost":{"source":"estimated","usdMicros":3712488},"inputTokens":87876,"model":"gpt-6-astra","outputTokens":28064,"runtime":"codex","turns":7,"wallClockMs":867286}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7cb215928f3c9473","findings":[],"hash":"86f3e454078582af31c9c0c3e66e0a38347b3de42206ba0524a8f0edc6552b2d","nodeId":"9dfe17d9-a493-4925-82b9-977f07a57d6b","outcome":"failed","summary":"the task produced no changes; the agent's last message was: No test changes were needed this round. The only thing that changed since my accepted tests is another contributor's upgrade of the vendored `forge-std` to v1.17.0, and I checked the suite against it. No findings were given to fix, so I left the accepted tests as they were. The working tree is clean.\n\n**Checks run:**\n- **`forge build`:** compiles with the new `forge-std`.\n- **`forge test`** with the verifier's seed `0xd2d4…bf3be`: all 36 tests pass across 5 suites, with 0 failed and 0 skipped. That includes both invariant suites, which ran 2,560 handler calls with 0 reverts. One checks that the hooked pool behaves exactly like an identical pool without the hook, that value is conserved, and that the hook never holds funds. The other checks that the fixed 1,000,000,000 supply and the symbol never change.\n- **The protected floor suites** (`Hook`, `Owners`, `Token`, `OwnToken`): I put temporary copies at the depth their imports expect and set the `IMD_*` environment variables to this launch's settings. The variables include the hook's creation code with a PoolManager address, `IMD_HOOK_FLAGS=8192` (beforeInitialize only), pool fee 12500 and the token's creation code. Hook passed 4 tests, Owners passed 2 (including the factory's zero-liquidity fee collection with the hook live), and Token passed 7. OwnToken skipped itself in setup, because this launch doesn't set its `IMD_CUSTOM_TOKEN` variable.\n  - `test/floor/OwnerChecks.sol` doesn't exist in this tree; the verifier presumably supplies it. I used a minimal stand-in of my own. So the two Owners tests ran against that stand-in rather than the verifier's real file.\n  - I deleted all the temporary files afterwards.\n- **Python test** (`test/test_prepare_launch.py`, another contributor's file): all 15 tests pass when run as `PYTHONPATH=. python3 test/test_prepare_launch.py`. Running it through `python3 -m unittest` fails to import, because the folder name `test` clashes with Python's built-in `test` package.\n\n**Symbol:** the brief asks for `CONDITIONALS` in its instructions but lists `CONDITIONAL` in its summary fields. The contract uses `Conditionals` / `CONDITIONALS`, and the tests check that it is not `CONDITIONAL`. I followed the explicit instruction not to shorten the symbol.\n\n**Findings:** none. The hook only implements `beforeInitialize`, which accepts calls only from the PoolManager. It has no owner, no fees, no custom deltas and holds no funds. The token mints a fixed supply once. I found no defect to report, so I didn't write `.imd-findings.json`.\n\nDeployment, the cost confirmation and the token, hook and pool addresses are outside this task: it covers only the tests, and nothing was broadcast.","treeHash":null,"usage":{"cachedInputTokens":591689,"cost":{"source":"runtime","usdMicros":631952},"inputTokens":29,"model":"claude-opus-5-5","outputTokens":6882,"runtime":"claude","turns":16,"wallClockMs":113580}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"672c29f92850efe0","findings":[{"citation":"resolved","description":"The request says to launch 'using the existing v4 hook launch configuration' and to keep 'hook behavior, fees, recipient addresses, and permissions' unchanged, authorizing only the symbol change. The working tree contains no earlier Conditionals hook, token, or saved launch form (git history: 'Empty workspace' then one commit adding this project). The contributor therefore wrote a new minimal hook (beforeInitialize only, no admin, no fee) and a reconstructed config/policy-baseline.json, and says so in the README. From the permissions standpoint this is a trust gap, not a code defect: a reviewer cannot confirm that ConditionalsHook has the same permission set, admin surface or fee behavior as whatever hook the requester's existing configuration actually carried. If the launch system holds an existing configuration with a different hook, deploying this one would change hook behavior and permissions, which the request forbids. The README already instructs the operator to reconcile against any existing baseline before confirmation; this entry records that the condition is unverified from inside the repository and must be resolved by the operator with the actual stored configuration. No change to the Solidity is implied unless that comparison shows a different existing hook.","line":19,"path":"README.md","reproduction":"State: `git log --oneline` shows only 0243d7d 'Empty workspace' and 4ad3608 (this project). `find . -path ./lib -prune -o -name '*.sol' -print` lists only src/ConditionalsHook.sol, src/ConditionalsToken.sol, src/HookFlags.sol and tests. There is no launch.json, no earlier hook, and config/policy-baseline.json is authored by the same commit with 'symbol': 'CONDITIONAL' and hook permissions {beforeInitialize: true, all others false}. Expected: an existing configuration whose hook permissions/fee/admin surface the delivered contracts preserve. Actual: nothing to compare against; equivalence to the requester's 'existing' hook cannot be shown or refuted from the repository.","severity":"info","snippet":"accounting. This is a documented reconstruction, **not evidence of equivalence to\nan unavailable historical hook**.","title":"Request premise 'keep existing hook behavior unchanged' is unverifiable: no prior hook source or launch form exists in the tree, so the delivered hook is a reconstruction"}],"hash":"99cf749327cea842974d3a1fa653fc7a82196074c30fa1e3bb2246fb96f5df01","nodeId":"668acc7c-9927-4d50-926c-d7895085dddb","outcome":"completed","summary":"Review complete. The findings file is written and validated, the scratch test is removed, and no project file was changed.\n\n**Outcome: no permission defects in the Solidity.** The assigned area (Access Control, Trust Gap, Asymmetry) is covered in full for both contracts.\n\n**What I checked**\n\n- `ConditionalsToken` is an unmodified OpenZeppelin v5 ERC-20 that mints the full supply once to its deployer. The vendored OpenZeppelin files are byte-identical to the pinned upstream commit. There is no owner, mint, burn, pause, blocklist, or upgrade path. A stranger holding no allowance cannot move or freeze a holder's balance.\n- `ConditionalsHook` takes the PoolManager as its only constructor argument, rejects zero, and validates its own address bits. `beforeInitialize` refuses every caller except that manager and returns the correct selector. I verified this against a second PoolManager instance and direct callers. It has no admin surface and no remove-liquidity callbacks, so the factory's fee collect cannot be blocked.\n- The vendored v4-core files that differ from upstream differ only in line wrapping.\n- The existing 22 Foundry tests and 15 Python tests pass.\n\n**One info-level entry** records that the request's premise cannot be verified from the repository. The brief says to reuse the existing hook configuration and change only the symbol, but the tree holds no prior hook, token, or launch form. The delivered hook is a reconstruction, which the README itself states. The operator must compare against the launch system's stored configuration before confirming. This needs no code change unless that comparison shows a different existing hook.\n\n**Coverage record** has 11 rows: all three listed token entry points hold, plus the two constructors, both hook functions, and four invariants including the pre-code initialization block and the absence of any privileged actor.","treeHash":null,"usage":{"cachedInputTokens":848754,"cost":{"source":"runtime","usdMicros":3777696},"inputTokens":258,"model":"claude-fable-5-1","outputTokens":19115,"runtime":"claude","turns":42,"wallClockMs":298994}},{"artifacts":[],"attempt":1,"bundleHash":"1e69539469045f8077efbe34a1883a5dea35db8990bba27abf3b34960fe450cf","device":"b12a68c6f8a8ce99","findings":[],"hash":"a3f8a4413a4e49bd21b96092d8cf3f016e7adc697506a09dd8fb702e1ce3bbbc","nodeId":"c2b99d1e-94c5-46fa-bc4f-9cca10fc50fd","outcome":"completed","summary":"I didn't change anything: the `launch.json` already in the tree is correct, and the round listed no findings that would call for an edit. Nothing has been paid for or deployed, and no transactions were sent.\n\nThe manifest matches the code it describes:\n\n- **Kind:** the first field is `\"kind\": \"univ4_hook\"`.\n- **Token:** `ConditionalsToken`, name `Conditionals`, symbol exactly `CONDITIONALS` (12 characters), 18 decimals. Its constructor takes no arguments, so `constructorArgs` is `[]`. It mints a fixed 1,000,000,000 × 10^18 once to whoever deploys it, so `totalSupply` is `\"1000000000000000000000000000\"`.\n- **Hook:** `ConditionalsHook`, with `constructorArgs` of `[\"$poolManager\"]`, which is its only constructor parameter. Its `getHookPermissions` turns on only `beforeInitialize`, so the manifest declares only that. The callback accepts calls only from the PoolManager, returns its selector, and doesn't block any fee tier.\n- **Pool:** paired with `0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127`, fee 12500, tick spacing 60, initial price `79228162514264337593543950336`.\n- **Notes:** 1,086 characters, under the 4,000 limit.\n\n**Symbol conflict:** the brief says the symbol must be exactly `CONDITIONALS`, but a later line says \"Token symbol: CONDITIONAL\". The manifest uses `CONDITIONALS`, and the notes say why.\n\n`forge test` passed all 22 tests with the verifier's fuzz seed, including the invariant that supply and token metadata never change.\n\n**Before broadcasting:** two things are still open:\n- The launch system has not yet confirmed that it accepts a 12-character symbol.\n- It has not yet quoted the total cost.\n\nOnce you've confirmed both and the launch is deployed, I can return the token address, hook address, pool ID and transaction links.","treeHash":"0fccd6fb0ea1aaea5675b4fb266257b49c63fc4b","usage":{"cachedInputTokens":109677,"cost":{"source":"runtime","usdMicros":200396},"inputTokens":8,"model":"claude-opus-5-5","outputTokens":1666,"runtime":"claude","turns":5,"wallClockMs":31168}},{"artifacts":[],"attempt":1,"bundleHash":"6f3f42b0ff8b5cf9ff051bc92d5801bade42a57b6093ef91dc84bfd35fd8916d","device":"a800aae85243bc87","findings":[{"description":"The hook only checks msg.sender == poolManager. It does not restrict the initializer (sender), currencies, fee or tick spacing. That is consistent with the brief (no extra gates, factory-derived price) and with the policy that the factory deploys the hook and opens its pool atomically: before the hook has code at its mined address, initialize reverts. If the deployer ever splits hook deployment and pool initialization into separate transactions, anyone could open the launch key (CONDITIONALS/IMD, 12500, 60, hook) first at an arbitrary price, and the factory's initialize would then revert with PoolAlreadyInitialized. Not a defect under the stated launch flow; recorded so the deployer keeps the single-transaction ordering.","line":31,"path":"src/ConditionalsHook.sol","reproduction":"test/ConditionalsLaunch.t.sol::test_strangerCannotOpenTheLaunchPoolBeforeTheHookExists shows that a front-run initialize of the predicted key reverts while the hook has no code, and that the one-call launch then succeeds with the predicted pool ID. test/ConditionalsLaunch.t.sol::test_poolOperationFailurePaths shows a second initialize of the opened key reverting with PoolAlreadyInitialized.","severity":"info","title":"beforeInitialize accepts any sender and any PoolKey; launch-pool front-run protection rests solely on the factory deploying the hook and initializing in one transaction"},{"description":"The token's on-chain symbol is exactly CONDITIONALS (12 bytes) and the tests assert it is not shortened to CONDITIONAL, which is the conflicting 'Token symbol' field in the brief. Whether the real launch form or deployment service accepts a 12-character symbol, the total cost quote, and the post-deployment token address, hook address, pool ID and transaction links are outside what Foundry tests can verify. Nothing was paid, deployed or broadcast. The operator must confirm exact-symbol support and the quote before broadcasting, as the README's confirmation flow requires.","line":11,"path":"src/ConditionalsToken.sol","reproduction":"test/ConditionalsToken.t.sol::test_exactMetadataAndFactorySupply and test/ConditionalsLaunch.t.sol::test_oneCallLaunchOpensTheExactConfiguredPool assert symbol == CONDITIONALS with length 12. No on-chain artefacts exist to report.","severity":"info","title":"Launch-form symbol support, total cost and deployment outputs cannot be established from this repository"}],"hash":"d4e0648eed4ac545ae9843d36673bf08ed695f2a17b2dc21e5bcee336c837b13","nodeId":"9dfe17d9-a493-4925-82b9-977f07a57d6b","outcome":"completed","summary":"I added a launch test file, a pool invariant suite and a trader mock under `test/`. `forge build` succeeds and `forge test` passes with the verifier's seed: 36 tests, 0 failed, 0 skipped (22 already existed, 14 are new). I found no defect in the code to report.\n\n**Not committed.** This machine has no git identity, and I didn't set one. The three new files are staged in the working tree for the harness to commit:\n- `test/ConditionalsLaunch.t.sol`\n- `test/ConditionalsPoolInvariant.t.sol`\n- `test/mocks/Swapper.sol`\n\n**`test/ConditionalsLaunch.t.sol` (13 tests)**\n- **Happy path:** a stand-in factory does the whole launch in one call, as the real one does in one transaction, on chain ID 4663 with the real IMD pair address. It deploys the token, deploys the hook, opens the pool and seeds it with tokens only, then pays out the 10% swarm and 10% payer shares.\n- **What it checks:** name `Conditionals`, symbol exactly `CONDITIONALS` (12 bytes, not `CONDITIONAL`), 18 decimals, 1 billion supply, the 10/80/10 split, the 1.25% LP fee, tick spacing 60, and that the pool ID is the hash of the ordered pool key.\n- **Trading:** a first buy works even though the pool holds no IMD yet; tokens sell back; the factory's fee collect returns 1.25% of a 100 IMD buy and never charges the factory; it then withdraws everything.\n- **Failure paths:**\n  - a hook address mined for the wrong factory or the wrong PoolManager makes the whole launch revert;\n  - nobody can open the launch pool before the hook exists;\n  - swaps of zero or past the price limit are rejected, as are keys that differ from the launch pool, a second initialize, and a trader who can't pay;\n  - the hook refuses ETH sent to it;\n  - every callback it doesn't declare reverts, even when called by the PoolManager;\n  - the hook has no owner or admin functions.\n- **Other checks:** neither contract's code contains `DELEGATECALL`, `CALLCODE` or `SELFDESTRUCT`. Fuzz tests show only the PoolManager can call `beforeInitialize`, and that buying then selling never returns a profit.\n\n**`test/ConditionalsPoolInvariant.t.sol`**\nRandom sequences of adding and removing liquidity, fee collects, swaps (exact input and exact output) and donations run against the hooked pool and against an identical pool with no hook. Each pool has its own identically funded actors. After every step:\n- the two pools agree exactly: price, tick, fees, liquidity and fee growth;\n- the LP fee stays 12500 and the protocol fee stays 0;\n- every position matches what the test expects it to hold, and no fee collect ever charges the LP;\n- token supply and IMD balances are conserved;\n- the hook never holds tokens, ETH or PoolManager claims.\n\nAt the end of each run every LP withdraws everything, and only rounding dust may stay in the PoolManager. I checked that the runs are not empty: a sampled run had 7 successful swaps and 14 liquidity changes out of 40 calls.\n\n**`test/mocks/Swapper.sol`**\nOne of the pinned checks this task is judged against (the hook-ownership check) imports this file, and it didn't exist, so that check couldn't have compiled. My version matches how that check calls it, and my own tests use it too. That same check also imports `test/floor/OwnerChecks.sol`. I didn't write that file because I can't tell what it should do; I assumed your toolchain supplies it.\n\n**Observations in `.imd-findings.json`** (both info level; the file is gitignored, so it is only in the working tree)\n1. The hook accepts pool initialization from any caller, for any pool. Nobody can open the launch pool first only because the factory deploys the hook and opens the pool in the same transaction. If those steps are ever split, anyone could open the pool first at a price of their choosing and the launch would fail.\n2. Tests can't settle the deployment questions:\n   - whether the real launch form accepts the 12-character symbol;\n   - the total cost;\n   - the token address, hook address, pool ID and transaction links.\n\n   Nothing was paid, deployed or broad","treeHash":"db878b11e0f22e9a41d337171d51071e8cf70d43","usage":{"cachedInputTokens":2140466,"cost":{"source":"runtime","usdMicros":2126040},"inputTokens":47,"model":"claude-opus-5-5","outputTokens":38226,"runtime":"claude","turns":27,"wallClockMs":480955}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3c9f46dbc476f8a8","findings":[],"hash":"f7d98264d835f0cc567a6ee28ef5dacdb82b54ba30416a91404c34b0b0605fca","nodeId":"a8c4041a-1e62-472b-acc3-c652e05397cf","outcome":"failed","summary":"needs input: The existing Conditionals v4 hook launch configuration and contract sources are missing. The repository contains only pinned tests and general reference material, which do not specify the existing hook behavior, hook fees, or permissions to preserve. The requested name Conditionals, exact 12-character symbol CONDITIONALS, supply of 1 billion tokens, and supplied launch policy are understood. Selecting a replacement hook or guessing its settings would exceed the authorized symbol-only change. — Can you provide the existing Conditionals v4 hook launch configuration and contract sources, or an exact accessible reference to them, so only the symbol is changed to CONDITIONALS and every other setting is preserved?","treeHash":null,"usage":{"cachedInputTokens":441088,"cost":{"source":"estimated","usdMicros":1296718},"inputTokens":73013,"model":"gpt-6-astra","outputTokens":2510,"runtime":"codex","turns":4,"wallClockMs":94955}}],"verification":[{"checks":[{"durationMs":2090,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.97s\nCompiler run successful!\n","passed":true},{"durationMs":941,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 9 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testFuzz_insufficientBalanceNeverChangesSupply(uint256) (runs: 256, μ: 58417, ~: 58361)\nLogs:\n  Bound result 16571532598495\n\n[PASS] testFuzz_symbolOnlyDifferenceFromPolicyToken(uint256,uint256) (runs: 256, μ: 1026355, ~: 1031325)\nLogs:\n  Bound result 949471917822357771706670403\n  Bound result 12500\n\n[PASS] test_approvedTransferAndAllowanceConsumption() (gas: 204156)\n[PASS] test_exactMetadataAndFactorySupply() (gas: 75996)\n[PASS] test_factoryAllocationAndFeeReturnMoveExactAmounts() (gas: 752098)\n[PASS] test_invalidReceiverAndInsufficientBalanceFail() (gas: 61852)\n[PASS] test_noMintAdminOrMetadataChangeEvenForFactory() (gas: 360602)\n[PASS] test_unauthorizedSpendFailsWithoutMovingBalances() (gas: 110159)\n[PASS] test_zeroAndSelfTransfersPreserveSupply() (gas: 138742)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 21.16ms (28.98ms CPU time)\n\nRan 12 tests for test/ConditionalsHook.t.sol:ConditionalsHookTest\n[PASS] testFuzz_acceptsFactoryDerivedOpeningPrice(uint160) (runs: 256, μ: 84723, ~: 84597)\nLogs:\n  Bound result 5735183881244821995361795503517953\n\n[PASS] testFuzz_buysAndSellsHaveNoExtraFeeOrDelta(bool,bool,uint96) (runs: 256, μ: 967793, ~: 963171)\nLogs:\n  Bound result 99999999999999001090\n\n[PASS] test_disabledCallbacksAndAdminSelectorsAreUnavailable() (gas: 112660)\n[PASS] test_donationsAccrueToLPWithoutHookCustody() (gas: 654103)\n[PASS] test_duplicatePoolInitializationFails() (gas: 103569)\n[PASS] test_factoryCanCollectFeesWithZeroLiquidityChangeAndUnwind() (gas: 935868)\n[PASS] test_initializationFromFactoryPreservesPoolTerms() (gas: 84924)\n[PASS] test_onlyManagerCanCallInitializationEvenWithForgedSender() (gas: 59429)\n[PASS] test_permissionsAndMinedAddressMatchExactly() (gas: 29574)\n[PASS] test_predictedPoolCannotInitializeBeforeHookHasCode() (gas: 17460435)\n[PASS] test_rejectsDeploymentAtWrongPermissionBits() (gas: 9348)\n[PASS] test_rejectsNullManager() (gas: 3880)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 56.69ms (81.95ms CPU time)\n\nRan 1 test for test/ConditionalsInvariant.t.sol:ConditionalsInvariantTest\n[PASS] invariant_supplyAndMetadataNeverChange() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| TokenHandler | move     | 4135  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| TokenHandler | spend    | 4057  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 228162514264337593543950257\n  Bound result 1491\n  Bound result 0\n  Bound result 296580875179214853890235809\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 4\n  Bound result 2\n  Bound result 1\n  Bound result 975136113627137487510095065\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5705\n  Bound result 0\n  Bound result 0\n  Bound result 28752268797029215256912\n  Bound result 7\n  Bound result 3584\n  Bound result 5000000000000000000\n  Bound result 0\n  Bound result 5490\n  Bound result 2\n  Bound result 1000000000000000000000000\n  Bound result 4879\n  Bound result 5490\n  Bound result 24576\n  Bound result 255\n  Bound result 3714247997\n  Bound result 60\n  Bound result 10\n  Bound result 255\n  Bound result 1000000000\n  Bound result 466937675047470549442388823\n  Bound result 1000000000000000000\n  Bound result 8\n  Bound result 239475607\n  Bound result 572669074717052589874838\n  Bound result 60\n  Bound result 36507870322448245788464\n  Bound result 189593471012523697644050572\n  Bound result 1075\n  Bound result 4871\n  Bound result 18\n  Bound result 585816660\n  Bound result 4\n  Bound result 2026\n  Bound result 4484\n  Bound result 111516528\n  Bound result 200000\n  Bound result 3\n  Bound result 57147580284640925457803438\n  Bound result 5646\n  Bound result 7000000000000000000\n  Bound result 376032550818709782949886\n  Bound result 14790504141789381379072\n  Bound result 0\n  Bound result 255\n  Bound result 1313373040\n  Bound result 4771\n  Bound result 3000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 809.62ms (805.48ms CPU time)\n\nRan 3 test suites in 811.01ms (887.47ms CPU time): 22 tests passed, 0 failed, 0 skipped (22 total tests)\n","passed":true},{"durationMs":78,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"LICENSE\":23,\"README.md\":253,\"config/policy-baseline.json\":52,\"dependencies.json\":30,\"foundry.toml\":21,\"launch.json\":27,\"remappings.txt\":4,\"review/conditionals-review.json\":79,\"src/ConditionalsHook.sol\":34,\"src/ConditionalsToken.sol\":14,\"src/HookFlags.sol\":31,\"test/ConditionalsHook.t.sol\":209,\"test/ConditionalsInvariant.t.sol\":64,\"test/ConditionalsToken.t.sol\":157,\"test/mocks/MockERC20.sol\":10,\"test/mocks/PoolActor.sol\":63,\"test/test_prepare_launch.py\":202,\"tools/prepare_launch.py\":211},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"02334fba9b366e6fa27367b60c93f72bc7c783c7ce6070e5e76241bdccef8c71","verifiedTreeHash":"e9f4dc7cda23e74867b84018cd9c522661705c16","verifierVersion":"0.1.0+18543036"},{"checks":[{"durationMs":2051,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.95s\nCompiler run successful!\n","passed":true},{"durationMs":849,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 9 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testFuzz_insufficientBalanceNeverChangesSupply(uint256) (runs: 256, μ: 49546, ~: 49490)\n[PASS] testFuzz_symbolOnlyDifferenceFromPolicyToken(uint256,uint256) (runs: 256, μ: 1000433, ~: 1005418)\n[PASS] test_approvedTransferAndAllowanceConsumption() (gas: 195186)\n[PASS] test_exactMetadataAndFactorySupply() (gas: 64520)\n[PASS] test_factoryAllocationAndFeeReturnMoveExactAmounts() (gas: 727697)\n[PASS] test_invalidReceiverAndInsufficientBalanceFail() (gas: 61852)\n[PASS] test_noMintAdminOrMetadataChangeEvenForFactory() (gas: 349712)\n[PASS] test_unauthorizedSpendFailsWithoutMovingBalances() (gas: 104413)\n[PASS] test_zeroAndSelfTransfersPreserveSupply() (gas: 132275)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 21.01ms (29.20ms CPU time)\n\nRan 12 tests for test/ConditionalsHook.t.sol:ConditionalsHookTest\n[PASS] testFuzz_acceptsFactoryDerivedOpeningPrice(uint160) (runs: 256, μ: 78724, ~: 78592)\n[PASS] testFuzz_buysAndSellsHaveNoExtraFeeOrDelta(bool,bool,uint96) (runs: 256, μ: 938606, ~: 934011)\n[PASS] test_disabledCallbacksAndAdminSelectorsAreUnavailable() (gas: 105880)\n[PASS] test_donationsAccrueToLPWithoutHookCustody() (gas: 648343)\n[PASS] test_duplicatePoolInitializationFails() (gas: 103569)\n[PASS] test_factoryCanCollectFeesWithZeroLiquidityChangeAndUnwind() (gas: 931082)\n[PASS] test_initializationFromFactoryPreservesPoolTerms() (gas: 80138)\n[PASS] test_onlyManagerCanCallInitializationEvenWithForgedSender() (gas: 56560)\n[PASS] test_permissionsAndMinedAddressMatchExactly() (gas: 25952)\n[PASS] test_predictedPoolCannotInitializeBeforeHookHasCode() (gas: 17460055)\n[PASS] test_rejectsDeploymentAtWrongPermissionBits() (gas: 9348)\n[PASS] test_rejectsNullManager() (gas: 3880)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 71.40ms (106.77ms CPU time)\n\nRan 1 test for test/ConditionalsInvariant.t.sol:ConditionalsInvariantTest\n[PASS] invariant_supplyAndMetadataNeverChange() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| TokenHandler | move     | 4135  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| TokenHandler | spend    | 4057  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 738.73ms (737.89ms CPU time)\n\nRan 3 test suites in 739.92ms (831.14ms CPU time): 22 tests passed, 0 failed, 0 skipped (22 total tests)\n","passed":true},{"durationMs":74,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"LICENSE\":23,\"README.md\":258,\"config/policy-baseline.json\":52,\"dependencies.json\":30,\"foundry.toml\":21,\"remappings.txt\":4,\"review/conditionals-review.json\":79,\"src/ConditionalsHook.sol\":34,\"src/ConditionalsToken.sol\":14,\"src/HookFlags.sol\":31,\"test/ConditionalsHook.t.sol\":209,\"test/ConditionalsInvariant.t.sol\":64,\"test/ConditionalsToken.t.sol\":157,\"test/mocks/MockERC20.sol\":10,\"test/mocks/PoolActor.sol\":63,\"test/test_prepare_launch.py\":202,\"tools/prepare_launch.py\":211},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4bd5a65a2fa79e3197230ff3b874ced7ba03513202d622c4e5819af1d2044503","verifiedTreeHash":"272666bc991d725ac1d26e99378bc3e46edd31ef","verifierVersion":"0.1.0+18543036"},{"checks":[{"durationMs":4078,"exitCode":0,"name":"build","output":"Compiling 82 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.94s\nCompiler run successful!\n","passed":true},{"durationMs":4365,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/ConditionalsInvariant.t.sol:ConditionalsInvariantTest\n[PASS] invariant_supplyAndMetadataNeverChange() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| TokenHandler | move     | 4135  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| TokenHandler | spend    | 4057  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.00s (999.08ms CPU time)\n\nRan 12 tests for test/ConditionalsHook.t.sol:ConditionalsHookTest\n[PASS] testFuzz_acceptsFactoryDerivedOpeningPrice(uint160) (runs: 256, μ: 78724, ~: 78592)\n[PASS] testFuzz_buysAndSellsHaveNoExtraFeeOrDelta(bool,bool,uint96) (runs: 256, μ: 938606, ~: 934011)\n[PASS] test_disabledCallbacksAndAdminSelectorsAreUnavailable() (gas: 105880)\n[PASS] test_donationsAccrueToLPWithoutHookCustody() (gas: 648343)\n[PASS] test_duplicatePoolInitializationFails() (gas: 103569)\n[PASS] test_factoryCanCollectFeesWithZeroLiquidityChangeAndUnwind() (gas: 931082)\n[PASS] test_initializationFromFactoryPreservesPoolTerms() (gas: 80138)\n[PASS] test_onlyManagerCanCallInitializationEvenWithForgedSender() (gas: 56560)\n[PASS] test_permissionsAndMinedAddressMatchExactly() (gas: 25952)\n[PASS] test_predictedPoolCannotInitializeBeforeHookHasCode() (gas: 17460055)\n[PASS] test_rejectsDeploymentAtWrongPermissionBits() (gas: 9348)\n[PASS] test_rejectsNullManager() (gas: 3880)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 1.49s (142.14ms CPU time)\n\nRan 9 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testFuzz_insufficientBalanceNeverChangesSupply(uint256) (runs: 256, μ: 49544, ~: 49502)\n[PASS] testFuzz_symbolOnlyDifferenceFromPolicyToken(uint256,uint256) (runs: 256, μ: 999644, ~: 1005418)\n[PASS] test_approvedTransferAndAllowanceConsumption() (gas: 195186)\n[PASS] test_exactMetadataAndFactorySupply() (gas: 64520)\n[PASS] test_factoryAllocationAndFeeReturnMoveExactAmounts() (gas: 727697)\n[PASS] test_invalidReceiverAndInsufficientBalanceFail() (gas: 61852)\n[PASS] test_noMintAdminOrMetadataChangeEvenForFactory() (gas: 349712)\n[PASS] test_unauthorizedSpendFailsWithoutMovingBalances() (gas: 104413)\n[PASS] test_zeroAndSelfTransfersPreserveSupply() (gas: 132275)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.77s (3.40s CPU time)\n\nRan 13 tests for test/ConditionalsLaunch.t.sol:ConditionalsLaunchTest\n[PASS] testFuzz_beforeInitializeRejectsEveryCallerButTheManager(address,address,uint160) (runs: 512, μ: 19575132, ~: 19575132)\n[PASS] testFuzz_buyRoundTripNeverProfitsTheTrader(uint256) (runs: 256, μ: 19793649, ~: 19800017)\n[PASS] test_buyOnFreshTokenOnlyPoolThenSellAndFactoryCollects() (gas: 20149283)\n[PASS] test_hookHoldsNoValueAndRejectsDirectEth() (gas: 19510790)\n[PASS] test_hookIsNotOwnedByFactoryOrLaunchWallet() (gas: 19526665)\n[PASS] test_hookRefusesEveryUndeclaredCallbackEvenFromTheManager() (gas: 19757598)\n[PASS] test_launchFailsWhenHookForAnotherManagerIsMined() (gas: 95363416)\n[PASS] test_launchFailsWhenHookSaltIsMinedForAnotherDeployer() (gas: 72827)\n[PASS] test_oneCallLaunchOpensTheExactConfiguredPool() (gas: 19599457)\n[PASS] test_poolOperationFailurePaths() (gas: 21037514)\n[PASS] test_runtimeCodeOfHookAndTokenHasNoEscapeHatch() (gas: 23127201)\n[PASS] test_sellBeforeAnyBuyFindsNoBidsButDoesNotRevert() (gas: 19962431)\n[PASS] test_strangerCannotOpenTheLaunchPoolBeforeTheHookExists() (gas: 58504333)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.77s (3.90s CPU time)\n\nRan 1 test for test/ConditionalsPoolInvariant.t.sol:ConditionalsPoolInvariantTest\n[PASS]\nConditionalsPoolInvariantTest invariants:\n[PASS] invariant_feeTierAndPositionsMatchTheGhostLedger\n[PASS] invariant_hookedPoolBehavesExactlyLikeItsHooklessTwin\n[PASS] invariant_valueIsConservedAndTheHookHoldsNothing\n ConditionalsPoolInvariantTest invariants (runs: 64, calls: 2560, reverts: 0)\n\n╭-------------+-----------------+-------+---------+----------╮\n| Contract    | Selector        | Calls | Reverts | Discards |\n+============================================================+\n| PoolHandler | addLiquidity    | 515   | 0       | 0        |\n|-------------+-----------------+-------+---------+----------|\n| PoolHandler | collect         | 533   | 0       | 0        |\n|-------------+-----------------+-------+---------+----------|\n| PoolHandler | donate          | 512   | 0       | 0        |\n|-------------+-----------------+-------+---------+----------|\n| PoolHandler | removeLiquidity | 491   | 0       | 0        |\n|-------------+-----------------+-------+---------+----------|\n| PoolHandler | swap            | 509   | 0       | 0        |\n╰-------------+-----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.07s (2.04s CPU time)\n\nRan 4 tests for test/ConditionalsTokenLedgerInvariant.t.sol:ConditionalsTokenLedgerInvariantTest\n[PASS]\nConditionalsTokenLedgerInvariantTest invariants:\n[PASS] invariant_everyAllowanceMatchesTheLedger\n[PASS] invariant_everyBalanceMatchesTheLedgerAndSupplyIsFixed\n[PASS] invariant_metadataIsExactlyTheRequestedSymbol\n ConditionalsTokenLedgerInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------+--------------------+-------+---------+----------╮\n| Contract      | Selector           | Calls | Reverts | Discards |\n+=================================================================+\n| LedgerHandler | approve            | 1195  | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| LedgerHandler | approveZero        | 1149  | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| LedgerHandler | overspendAllowance | 1158  | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| LedgerHandler | overspendBalance   | 1144  | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| LedgerHandler | sendToZero         | 1165  | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| LedgerHandler | transfer           | 1221  | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| LedgerHandler | transferFrom       | 1160  | 0       | 0        |\n╰---------------+--------------------+-------+---------+----------╯\n\n[PASS] testFuzz_reApprovalReplacesRatherThanAdds(uint256,uint256) (runs: 1000, μ: 137943, ~: 138173)\n[PASS] testFuzz_unlimitedAllowanceIsNeverConsumed(uint256,uint256) (runs: 1000, μ: 235417, ~: 225518)\n[PASS] test_symbolRawAbiEncodingCarriesAllTwelveBytes() (gas: 21441)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.17s (7.44s CPU time)\n\nRan 6 test suites in 4.17s (12.26s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":96,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"LICENSE\":23,\"README.md\":258,\"config/policy-baseline.json\":52,\"dependencies.json\":30,\"foundry.toml\":21,\"remappings.txt\":4,\"review/conditionals-review.json\":79,\"src/ConditionalsHook.sol\":34,\"src/ConditionalsToken.sol\":14,\"src/HookFlags.sol\":31,\"test/ConditionalsHook.t.sol\":209,\"test/ConditionalsInvariant.t.sol\":64,\"test/ConditionalsLaunch.t.sol\":435,\"test/ConditionalsPoolInvariant.t.sol\":300,\"test/ConditionalsToken.t.sol\":157,\"test/ConditionalsTokenLedgerInvariant.t.sol\":240,\"test/mocks/MockERC20.sol\":10,\"test/mocks/PoolActor.sol\":63,\"test/mocks/Swapper.sol\":60,\"test/test_prepare_launch.py\":202,\"tools/prepare_launch.py\":211},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4cc67ea858557b8efa69fc980969f7c34d45f07c8203aa96a59d13ac061da325","verifiedTreeHash":"d07e9e6730fc8a9f05041947f26fd3393dea9a01","verifierVersion":"0.1.0+18543036"},{"checks":[{"durationMs":2150,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.03s\nCompiler run successful!\n","passed":true},{"durationMs":970,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 9 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testFuzz_insufficientBalanceNeverChangesSupply(uint256) (runs: 256, μ: 58417, ~: 58361)\nLogs:\n  Bound result 205490512195774384324297514920342285185577681465695561309754\n\n[PASS] testFuzz_symbolOnlyDifferenceFromPolicyToken(uint256,uint256) (runs: 256, μ: 1026355, ~: 1031325)\nLogs:\n  Bound result 964064113069686439796530691\n  Bound result 6920144839830455649\n\n[PASS] test_approvedTransferAndAllowanceConsumption() (gas: 204156)\n[PASS] test_exactMetadataAndFactorySupply() (gas: 75996)\n[PASS] test_factoryAllocationAndFeeReturnMoveExactAmounts() (gas: 752098)\n[PASS] test_invalidReceiverAndInsufficientBalanceFail() (gas: 61852)\n[PASS] test_noMintAdminOrMetadataChangeEvenForFactory() (gas: 360602)\n[PASS] test_unauthorizedSpendFailsWithoutMovingBalances() (gas: 110159)\n[PASS] test_zeroAndSelfTransfersPreserveSupply() (gas: 138742)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 71.03ms (41.90ms CPU time)\n\nRan 12 tests for test/ConditionalsHook.t.sol:ConditionalsHookTest\n[PASS] testFuzz_acceptsFactoryDerivedOpeningPrice(uint160) (runs: 256, μ: 84723, ~: 84597)\nLogs:\n  Bound result 19462573285577096031869441940820844090\n\n[PASS] testFuzz_buysAndSellsHaveNoExtraFeeOrDelta(bool,bool,uint96) (runs: 256, μ: 967793, ~: 963171)\nLogs:\n  Bound result 99999999999999001090\n\n[PASS] test_disabledCallbacksAndAdminSelectorsAreUnavailable() (gas: 112660)\n[PASS] test_donationsAccrueToLPWithoutHookCustody() (gas: 654103)\n[PASS] test_duplicatePoolInitializationFails() (gas: 103569)\n[PASS] test_factoryCanCollectFeesWithZeroLiquidityChangeAndUnwind() (gas: 935868)\n[PASS] test_initializationFromFactoryPreservesPoolTerms() (gas: 84924)\n[PASS] test_onlyManagerCanCallInitializationEvenWithForgedSender() (gas: 59429)\n[PASS] test_permissionsAndMinedAddressMatchExactly() (gas: 29574)\n[PASS] test_predictedPoolCannotInitializeBeforeHookHasCode() (gas: 17460435)\n[PASS] test_rejectsDeploymentAtWrongPermissionBits() (gas: 9348)\n[PASS] test_rejectsNullManager() (gas: 3880)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 72.62ms (103.74ms CPU time)\n\nRan 1 test for test/ConditionalsInvariant.t.sol:ConditionalsInvariantTest\n[PASS] invariant_supplyAndMetadataNeverChange() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| TokenHandler | move     | 4135  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| TokenHandler | spend    | 4057  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 228162514264337593543950257\n  Bound result 1491\n  Bound result 0\n  Bound result 296580875179214853890235809\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 4\n  Bound result 2\n  Bound result 1\n  Bound result 975136113627137487510095065\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5705\n  Bound result 0\n  Bound result 0\n  Bound result 28752268797029215256912\n  Bound result 7\n  Bound result 3584\n  Bound result 5000000000000000000\n  Bound result 0\n  Bound result 5490\n  Bound result 2\n  Bound result 1000000000000000000000000\n  Bound result 4879\n  Bound result 5490\n  Bound result 24576\n  Bound result 255\n  Bound result 3714247997\n  Bound result 60\n  Bound result 10\n  Bound result 255\n  Bound result 1000000000\n  Bound result 466937675047470549442388823\n  Bound result 1000000000000000000\n  Bound result 8\n  Bound result 239475607\n  Bound result 572669074717052589874838\n  Bound result 60\n  Bound result 36507870322448245788464\n  Bound result 189593471012523697644050572\n  Bound result 1075\n  Bound result 4871\n  Bound result 18\n  Bound result 585816660\n  Bound result 4\n  Bound result 2026\n  Bound result 4484\n  Bound result 111516528\n  Bound result 200000\n  Bound result 3\n  Bound result 57147580284640925457803438\n  Bound result 5646\n  Bound result 7000000000000000000\n  Bound result 376032550818709782949886\n  Bound result 14790504141789381379072\n  Bound result 0\n  Bound result 255\n  Bound result 1313373040\n  Bound result 4771\n  Bound result 3000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 820.71ms (819.10ms CPU time)\n\nRan 3 test suites in 822.09ms (964.36ms CPU time): 22 tests passed, 0 failed, 0 skipped (22 total tests)\n","passed":true},{"durationMs":72,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"LICENSE\":23,\"README.md\":253,\"config/policy-baseline.json\":52,\"dependencies.json\":30,\"foundry.toml\":21,\"remappings.txt\":4,\"review/conditionals-review.json\":79,\"src/ConditionalsHook.sol\":34,\"src/ConditionalsToken.sol\":14,\"src/HookFlags.sol\":31,\"test/ConditionalsHook.t.sol\":209,\"test/ConditionalsInvariant.t.sol\":64,\"test/ConditionalsToken.t.sol\":157,\"test/mocks/MockERC20.sol\":10,\"test/mocks/PoolActor.sol\":63,\"test/test_prepare_launch.py\":202,\"tools/prepare_launch.py\":211},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1205,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":406,"exitCode":0,"name":"aderyn","output":"[low] internal-function-used-once at src/HookFlags.sol:24: Internal Function Used Only Once\n[low] large-numeric-literal at src/ConditionalsToken.sol:9: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8060c2d963ecafc4b647cb21b06897b504ba36880b2a9f72844099b48a351eb8","verifiedTreeHash":"8a18cd8a8e3fbd109c863e49cef37fb26a761d10","verifierVersion":"0.1.0+18543036"},{"checks":[{"durationMs":2021,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.91s\nCompiler run successful!\n","passed":true},{"durationMs":984,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 9 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testFuzz_insufficientBalanceNeverChangesSupply(uint256) (runs: 256, μ: 49546, ~: 49490)\n[PASS] testFuzz_symbolOnlyDifferenceFromPolicyToken(uint256,uint256) (runs: 256, μ: 1000433, ~: 1005418)\n[PASS] test_approvedTransferAndAllowanceConsumption() (gas: 195186)\n[PASS] test_exactMetadataAndFactorySupply() (gas: 64520)\n[PASS] test_factoryAllocationAndFeeReturnMoveExactAmounts() (gas: 727697)\n[PASS] test_invalidReceiverAndInsufficientBalanceFail() (gas: 61852)\n[PASS] test_noMintAdminOrMetadataChangeEvenForFactory() (gas: 349712)\n[PASS] test_unauthorizedSpendFailsWithoutMovingBalances() (gas: 104413)\n[PASS] test_zeroAndSelfTransfersPreserveSupply() (gas: 132275)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 19.41ms (26.26ms CPU time)\n\nRan 12 tests for test/ConditionalsHook.t.sol:ConditionalsHookTest\n[PASS] testFuzz_acceptsFactoryDerivedOpeningPrice(uint160) (runs: 256, μ: 78724, ~: 78592)\n[PASS] testFuzz_buysAndSellsHaveNoExtraFeeOrDelta(bool,bool,uint96) (runs: 256, μ: 938606, ~: 934011)\n[PASS] test_disabledCallbacksAndAdminSelectorsAreUnavailable() (gas: 105880)\n[PASS] test_donationsAccrueToLPWithoutHookCustody() (gas: 648343)\n[PASS] test_duplicatePoolInitializationFails() (gas: 103569)\n[PASS] test_factoryCanCollectFeesWithZeroLiquidityChangeAndUnwind() (gas: 931082)\n[PASS] test_initializationFromFactoryPreservesPoolTerms() (gas: 80138)\n[PASS] test_onlyManagerCanCallInitializationEvenWithForgedSender() (gas: 56560)\n[PASS] test_permissionsAndMinedAddressMatchExactly() (gas: 25952)\n[PASS] test_predictedPoolCannotInitializeBeforeHookHasCode() (gas: 17460055)\n[PASS] test_rejectsDeploymentAtWrongPermissionBits() (gas: 9348)\n[PASS] test_rejectsNullManager() (gas: 3880)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 63.48ms (99.23ms CPU time)\n\nRan 1 test for test/ConditionalsInvariant.t.sol:ConditionalsInvariantTest\n[PASS] invariant_supplyAndMetadataNeverChange() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| TokenHandler | move     | 4135  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| TokenHandler | spend    | 4057  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 853.11ms (851.64ms CPU time)\n\nRan 3 test suites in 854.32ms (935.99ms CPU time): 22 tests passed, 0 failed, 0 skipped (22 total tests)\n","passed":true},{"durationMs":57,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"LICENSE\":23,\"README.md\":258,\"config/policy-baseline.json\":52,\"dependencies.json\":30,\"foundry.toml\":21,\"launch.json\":27,\"remappings.txt\":4,\"review/conditionals-review.json\":79,\"src/ConditionalsHook.sol\":34,\"src/ConditionalsToken.sol\":14,\"src/HookFlags.sol\":31,\"test/ConditionalsHook.t.sol\":209,\"test/ConditionalsInvariant.t.sol\":64,\"test/ConditionalsToken.t.sol\":157,\"test/mocks/MockERC20.sol\":10,\"test/mocks/PoolActor.sol\":63,\"test/test_prepare_launch.py\":202,\"tools/prepare_launch.py\":211},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a3f8a4413a4e49bd21b96092d8cf3f016e7adc697506a09dd8fb702e1ce3bbbc","verifiedTreeHash":"0fccd6fb0ea1aaea5675b4fb266257b49c63fc4b","verifierVersion":"0.1.0+18543036"},{"checks":[{"durationMs":3502,"exitCode":0,"name":"build","output":"Compiling 81 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.39s\nCompiler run successful!\n","passed":true},{"durationMs":2566,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 12 tests for test/ConditionalsHook.t.sol:ConditionalsHookTest\n[PASS] testFuzz_acceptsFactoryDerivedOpeningPrice(uint160) (runs: 256, μ: 84723, ~: 84597)\nLogs:\n  Bound result 5735183881244821995361795503517953\n\n[PASS] testFuzz_buysAndSellsHaveNoExtraFeeOrDelta(bool,bool,uint96) (runs: 256, μ: 967793, ~: 963171)\nLogs:\n  Bound result 51616966441076665104\n\n[PASS] test_disabledCallbacksAndAdminSelectorsAreUnavailable() (gas: 112660)\n[PASS] test_donationsAccrueToLPWithoutHookCustody() (gas: 654103)\n[PASS] test_duplicatePoolInitializationFails() (gas: 103569)\n[PASS] test_factoryCanCollectFeesWithZeroLiquidityChangeAndUnwind() (gas: 935868)\n[PASS] test_initializationFromFactoryPreservesPoolTerms() (gas: 84924)\n[PASS] test_onlyManagerCanCallInitializationEvenWithForgedSender() (gas: 59429)\n[PASS] test_permissionsAndMinedAddressMatchExactly() (gas: 29574)\n[PASS] test_predictedPoolCannotInitializeBeforeHookHasCode() (gas: 17460435)\n[PASS] test_rejectsDeploymentAtWrongPermissionBits() (gas: 9348)\n[PASS] test_rejectsNullManager() (gas: 3880)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 89.48ms (196.92ms CPU time)\n\nRan 1 test for test/ConditionalsInvariant.t.sol:ConditionalsInvariantTest\n[PASS] invariant_supplyAndMetadataNeverChange() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| TokenHandler | move     | 4135  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| TokenHandler | spend    | 4057  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1491\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3000\n  Bound result 0\n  Bound result 0\n  Bound result 8\n  Bound result 0\n  Bound result 468780233209425971165609099\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 81008942\n  Bound result 48622302\n  Bound result 0\n  Bound result 5\n  Bound result 28752268797029215256912\n  Bound result 46550770\n  Bound result 3213\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 3\n  Bound result 8\n  Bound result 4\n  Bound result 4741\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 3\n  Bound result 0\n  Bound result 4663\n  Bound result 2\n  Bound result 243\n  Bound result 10\n  Bound result 3745\n  Bound result 18\n  Bound result 49998865871253009202\n  Bound result 17194561966194670882007\n  Bound result 25134851567405\n  Bound result 255\n  Bound result 600\n  Bound result 4303\n  Bound result 979\n  Bound result 2552851540\n  Bound result 887220\n  Bound result 127\n  Bound result 1000\n  Bound result 372\n  Bound result 5509\n  Bound result 600\n  Bound result 1904\n  Bound result 3\n  Bound result 26194055218542607947382\n  Bound result 4603\n  Bound result 1000000000000000000000\n  Bound result 7000000000000000000\n  Bound result 1000001108993975540317\n  Bound result 0\n  Bound result 86\n  Bound result 56\n  Bound result 3987\n  Bound result 800000000000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.04s (1.04s CPU time)\n\nRan 9 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testFuzz_insufficientBalanceNeverChangesSupply(uint256) (runs: 256, μ: 58415, ~: 58373)\nLogs:\n  Bound result 271675116536219302016865293354965894244105896607052033\n\n[PASS] testFuzz_symbolOnlyDifferenceFromPolicyToken(uint256,uint256) (runs: 256, μ: 1026142, ~: 1031325)\nLogs:\n  Bound result 62\n  Bound result 2\n\n[PASS] test_approvedTransferAndAllowanceConsumption() (gas: 204156)\n[PASS] test_exactMetadataAndFactorySupply() (gas: 75996)\n[PASS] test_factoryAllocationAndFeeReturnMoveExactAmounts() (gas: 752098)\n[PASS] test_invalidReceiverAndInsufficientBalanceFail() (gas: 61852)\n[PASS] test_noMintAdminOrMetadataChangeEvenForFactory() (gas: 360602)\n[PASS] test_unauthorizedSpendFailsWithoutMovingBalances() (gas: 110159)\n[PASS] test_zeroAndSelfTransfersPreserveSupply() (gas: 138742)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.57s (1.63s CPU time)\n\nRan 13 tests for test/ConditionalsLaunch.t.sol:ConditionalsLaunchTest\n[PASS] testFuzz_beforeInitializeRejectsEveryCallerButTheManager(address,address,uint160) (runs: 512, μ: 19578012, ~: 19578012)\n[PASS] testFuzz_buyRoundTripNeverProfitsTheTrader(uint256) (runs: 256, μ: 19805323, ~: 19811909)\nLogs:\n  Bound result 11941001793978\n\n[PASS] test_buyOnFreshTokenOnlyPoolThenSellAndFactoryCollects() (gas: 20169044)\n[PASS] test_hookHoldsNoValueAndRejectsDirectEth() (gas: 19513424)\n[PASS] test_hookIsNotOwnedByFactoryOrLaunchWallet() (gas: 19556931)\n[PASS] test_hookRefusesEveryUndeclaredCallbackEvenFromTheManager() (gas: 19760910)\n[PASS] test_launchFailsWhenHookForAnotherManagerIsMined() (gas: 95363416)\n[PASS] test_launchFailsWhenHookSaltIsMinedForAnotherDeployer() (gas: 75698)\n[PASS] test_oneCallLaunchOpensTheExactConfiguredPool() (gas: 19637074)\n[PASS] test_poolOperationFailurePaths() (gas: 21040968)\n[PASS] test_runtimeCodeOfHookAndTokenHasNoEscapeHatch() (gas: 25375373)\n[PASS] test_sellBeforeAnyBuyFindsNoBidsButDoesNotRevert() (gas: 19965691)\n[PASS] test_strangerCannotOpenTheLaunchPoolBeforeTheHookExists() (gas: 58511699)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.80s (4.11s CPU time)\n\nRan 1 test for test/ConditionalsPoolInvariant.t.sol:ConditionalsPoolInvariantTest\n[PASS]\nConditionalsPoolInvariantTest invariants:\n[PASS] invariant_feeTierAndPositionsMatchTheGhostLedger\n[PASS] invariant_hookedPoolBehavesExactlyLikeItsHooklessTwin\n[PASS] invariant_valueIsConservedAndTheHookHoldsNothing\n ConditionalsPoolInvariantTest invariants (runs: 64, calls: 2560, reverts: 0)\n\n╭-------------+-----------------+-------+---------+----------╮\n| Contract    | Selector        | Calls | Reverts | Discards |\n+============================================================+\n| PoolHandler | addLiquidity    | 515   | 0       | 0        |\n|-------------+-----------------+-------+---------+----------|\n| PoolHandler | collect         | 533   | 0       | 0        |\n|-------------+-----------------+-------+---------+----------|\n| PoolHandler | donate          | 512   | 0       | 0        |\n|-------------+-----------------+-------+---------+----------|\n| PoolHandler | removeLiquidity | 491   | 0       | 0        |\n|-------------+-----------------+-------+---------+----------|\n| PoolHandler | swap            | 509   | 0       | 0        |\n╰-------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000000\n  Bound result 1010\n  Bound result 682\n  Bound result 3000000000000000000\n  Bound result 702838852903241605\n  Bound result 404248573229783935\n  Bound result 7000000000000000000\n  Bound result 1000000\n  Bound result 243\n  Bound result 376480679157118090\n  Bound result 562642694024309656\n  Bound result 1250000000000000000\n  Bound result 16861\n  Bound result 232072574240080032082\n  Bound result 172490102197377209\n  Bound result 436666006250410784\n  Bound result 999999999999999991\n  Bound result 999999999300000001\n  Bound result 2000000000000000000\n  Bound result 2163258445\n  Bound result 9850\n  Bound result 999999999000000000096\n  Bound result 999999999000000000060\n  Bound result 999999999000000000008\n  Bound result 5\n  Bound result 12\n  Bound result 1249999999999983139\n  Bound result 501\n  Bound result 156\n  Bound result 781331613414047628835\n  Bound result 1348880\n  Bound result 623643327\n  Bound result 999999999000000006997\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.42s (2.41s CPU time)\n\nRan 5 test suites in 2.42s (6.91s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":60,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"LICENSE\":23,\"README.md\":253,\"config/policy-baseline.json\":52,\"dependencies.json\":30,\"foundry.toml\":21,\"remappings.txt\":4,\"review/conditionals-review.json\":79,\"src/ConditionalsHook.sol\":34,\"src/ConditionalsToken.sol\":14,\"src/HookFlags.sol\":31,\"test/ConditionalsHook.t.sol\":209,\"test/ConditionalsInvariant.t.sol\":64,\"test/ConditionalsLaunch.t.sol\":435,\"test/ConditionalsPoolInvariant.t.sol\":300,\"test/ConditionalsToken.t.sol\":157,\"test/mocks/MockERC20.sol\":10,\"test/mocks/PoolActor.sol\":63,\"test/mocks/Swapper.sol\":60,\"test/test_prepare_launch.py\":202,\"tools/prepare_launch.py\":211},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d4e0648eed4ac545ae9843d36673bf08ed695f2a17b2dc21e5bcee336c837b13","verifiedTreeHash":"db878b11e0f22e9a41d337171d51071e8cf70d43","verifierVersion":"0.1.0+18543036"}]}