{"workflow":{"id":"3675b9cc-f356-42fd-afc7-23d5be2bae53","objective":"Release Breaker (token symbol CBRK) on Sepolia as a univ4_hook launch. Token: Breaker (CBRK), total supply 1,000,000,000 CBRK with 18 decimals, minted once to the deployer (a separate zero-argument ERC-20, no mint, owner or admin). Hook: CircuitBreakerHook, a Uniswap v4 hook on the token's native-ETH pool that trips on sharp moves within a block. beforeSwap: if refBlock[poolId] != block.number, store refBlock = block.number and refSqrtPrice = the current sqrtPriceX96 (StateLibrary.getSlot0), the price before the block's first swap, and emit ReferenceSet(poolId, block, sqrtPriceX96). afterSwap: read the new sqrtPriceX96 and revert with Tripped(refSqrtPrice, newSqrtPrice) when the price (sqrtPrice squared) is more than 10% above or below the reference: the allowed band is refSqrt x sqrt(0.9) <= newSqrt <= refSqrt x sqrt(1.1), computed with FullMath.mulDiv against Q96 constants for sqrt(0.9) and sqrt(1.1), rounded inward so the band never exceeds 10%. This includes a block's first swap, so any single swap moving the price more than 10% reverts and large trades must be split across blocks. Liquidity changes and donations do not move the price and are never checked. No deltas, fee, funds or admin. Tripped swaps revert, so they leave no event; the site simulates instead. Deploy shape, matching the live Sepolia hook launches 170 and 186 (168 passed the mainnet PoolManager and is not a model): CircuitBreakerHook's only constructor argument is the Sepolia PoolManager 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543; every rate, window and threshold here is a source constant; there is no owner, admin, setter, pause, upgrade or sweep, and no $owner or $token argument. Permissions are exactly beforeSwap, afterSwap (low address bits 0x00C0), all others false; the constructor calls Hooks.validateHookPermissions and the CREATE2 salt is mined for those bits. The factory initializes the pool (currency0 native ETH, currency1 CBRK, fee 3000, tickSpacing 60) and seeds one-sided CBRK liquidity, so nothing in the hook may revert that initialize or that liquidity add (launch 138 was parked when a beforeInitialize gate reverted the factory), and the first buy lands in a pool that holds no ETH. All state is keyed by PoolId; a pool on this hook whose currency0 is not native ETH gets zero deltas and no other effect. Every callback requires msg.sender == PoolManager. Tests (Foundry, a real v4-core PoolManager deployed in the test, hook at a mined address): a launch rehearsal that initializes at the manifest price, seeds one-sided CBRK liquidity like the factory and makes the first buy into the ETH-less pool; exact-in and exact-out in both directions; dust amounts; a pool whose currency0 is not ETH; direct callback calls from a non-PoolManager address revert; fuzzed sizes; and specifically: a 9.9% move passes and 10.1% reverts, up and down; two swaps in one block that together pass 10% make the second revert; a swap back inside the band passes; a new block resets the reference; on the freshly seeded pool a small first buy passes and an oversized one reverts. An independent adversarial review (read-only) must attack: the sqrt constants and rounding direction, overflow in the band maths, that the reference is captured before any swap including the first, any same-block path that moves the price without reaching afterSwap, and griefing (pushing the price to the band edge to block others for a block; document it). It reports each finding with the exact call sequence that triggers it. Website: one static page (dist/index.html) that reads the hook's views and events and the pool price through Uniswap's Sepolia StateView, with a buy/sell form that swaps through Uniswap's published Sepolia PoolSwapTest router (check it has code). It shows this block's reference price (from ReferenceSet, or the current price when there is no swap yet this block), the plus/minus 10% band, and a pre-check that simulates a typed swap with eth_call and says whether it would trip (replacing the earlier 'recent tripped swaps' list, which reverted swaps cannot supply).","status":"completed","brief":"# Approved workflow\n\nRelease Breaker (token symbol CBRK) on Sepolia as a univ4_hook launch. Token: Breaker (CBRK), total supply 1,000,000,000 CBRK with 18 decimals, minted once to the deployer (a separate zero-argument ERC-20, no mint, owner or admin). Hook: CircuitBreakerHook, a Uniswap v4 hook on the token's native-ETH pool that trips on sharp moves within a block. beforeSwap: if refBlock[poolId] != block.number, store refBlock = block.number and refSqrtPrice = the current sqrtPriceX96 (StateLibrary.getSlot0), the price before the block's first swap, and emit ReferenceSet(poolId, block, sqrtPriceX96). afterSwap: read the new sqrtPriceX96 and revert with Tripped(refSqrtPrice, newSqrtPrice) when the price (sqrtPrice squared) is more than 10% above or below the reference: the allowed band is refSqrt x sqrt(0.9) <= newSqrt <= refSqrt x sqrt(1.1), computed with FullMath.mulDiv against Q96 constants for sqrt(0.9) and sqrt(1.1), rounded inward so the band never exceeds 10%. This includes a block's first swap, so any single swap moving the price more than 10% reverts and large trades must be split across blocks. Liquidity changes and donations do not move the price and are never checked. No deltas, fee, funds or admin. Tripped swaps revert, so they leave no event; the site simulates instead. Deploy shape, matching the live Sepolia hook launches 170 and 186 (168 passed the mainnet PoolManager and is not a model): CircuitBreakerHook's only constructor argument is the Sepolia PoolManager 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543; every rate, window and threshold here is a source constant; there is no owner, admin, setter, pause, upgrade or sweep, and no $owner or $token argument. Permissions are exactly beforeSwap, afterSwap (low address bits 0x00C0), all others false; the constructor calls Hooks.validateHookPermissions and the CREATE2 salt is mined for those bits. The factory initializes the pool (currency0 native ETH, currency1 CBRK, fee 3000, tickSpacing 60) and seeds one-sided CBRK liquidity, so nothing in the hook may revert that initialize or that liquidity add (launch 138 was parked when a beforeInitialize gate reverted the factory), and the first buy lands in a pool that holds no ETH. All state is keyed by PoolId; a pool on this hook whose currency0 is not native ETH gets zero deltas and no other effect. Every callback requires msg.sender == PoolManager. Tests (Foundry, a real v4-core PoolManager deployed in the test, hook at a mined address): a launch rehearsal that initializes at the manifest price, seeds one-sided CBRK liquidity like the factory and makes the first buy into the ETH-less pool; exact-in and exact-out in both directions; dust amounts; a pool whose currency0 is not ETH; direct callback calls from a non-PoolManager address revert; fuzzed sizes; and specifically: a 9.9% move passes and 10.1% reverts, up and down; two swaps in one block that together pass 10% make the second revert; a swap back inside the band passes; a new block resets the reference; on the freshly seeded pool a small first buy passes and an oversized one reverts. An independent adversarial review (read-only) must attack: the sqrt constants and rounding direction, overflow in the band maths, that the reference is captured before any swap including the first, any same-block path that moves the price without reaching afterSwap, and griefing (pushing the price to the band edge to block others for a block; document it). It reports each finding with the exact call sequence that triggers it. Website: one static page (dist/index.html) that reads the hook's views and events and the pool price through Uniswap's Sepolia StateView, with a buy/sell form that swaps through Uniswap's published Sepolia PoolSwapTest router (check it has code). It shows this block's reference price (from ReferenceSet, or the current price when there is no swap yet this block), the plus/minus 10% band, and a pre-check that simulates a typed swap with eth_call and says whether it would trip (replacing the earlier 'recent tripped swaps' list, which reverted swaps cannot supply).\n\nSepolia (11155111) only, launched as univ4_hook on the native-ETH pool the factory opens. GitHub publication and IPFS hosting are approved. Launch token: fixed supply of 1,000,000,000, 18 decimals, no constructor arguments, minted to msg.sender, no mint or admin. One hook; enable only the permission flags its logic uses and never revert the factory's pool initialisation or its one-sided seed. Like every hook launch that has gone live, the hook constructor takes exactly one argument, the Sepolia PoolManager 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543; rates, recipients and the token are source constants or learned from the pool key, and there is no owner. Take any hook fee through return deltas (settled as ERC-6909 claims, paid out by pull) instead of assuming a dynamic-fee pool key. Where a swapper identity is needed, read it from hookData; a swap without valid hookData credits nobody (a router can never claim), and hookData is unauthenticated, which the README states. No external oracles or VRF, no proxies, delegatecall or selfdestruct. foundry.toml sets bytecode_hash = \"none\". Any website is a static export with index.html in dist/. Site label lab-circuit-breaker-hook.\n\nBuild CBRK and CircuitBreakerHook (permissions beforeSwap, afterSwap; PoolManager-only constructor) with a launch-rehearsal Foundry suite and an independent adversarial review, deploy them through the factory on Sepolia, then build the one-page site against the live pool.\n","briefDigest":"0848e04ea61b1fe2f5704fc66629f6207eb42ada02e7f1185cc2394d8e951f2d"},"planning":null,"id":"8032cc13-2cfa-4bc0-8766-5f7639be3497","state":"completed","template":"shape:chain","objective":"WORKFLOW CONTRACT STAGE CONTEXT: the stage produces implemented and tested contracts, ABI documentation and an independently reviewed launch.json. Each assignment contributes only within its own role and write scope. Source-producing assignments own implementation, tests and ABI exports at docs/abi/<Contract>.json where their scope permits. The generated manifest assignment writes only launch.json. Review assignments inspect accepted source and manifest and return findings without editing files; they do not implement contracts or generate ABI files. Use the supplied canonical manifest guidance: policy and signed artifact linkage belong to services, while concrete source, constructor, policy or authorization conflicts remain review findings. Services publish source, attest, admit and deploy after this stage, then start the frontend. Read .imd/reads/workflow.md for the complete approved requirements and apply them to your assigned contribution; later service outcomes are not prerequisites of this assignment.","blockedReason":null,"createdAt":"2026-09-27T05:48:10.102Z","updatedAt":"2026-09-27T08:15:28.993Z","paidBy":"0x8a3b860f6dbfbbbb07f21905ed8cb0234538bdc8","via":"api.imd.fun","parentJobId":null,"project":{"id":"8032cc13-2cfa-4bc0-8766-5f7639be3497","head":"8d6fe13e-5704-45df-9bd9-d82f7daa4706","running":null,"versions":[{"jobId":"8032cc13-2cfa-4bc0-8766-5f7639be3497","workflowId":"3675b9cc-f356-42fd-afc7-23d5be2bae53","objective":"Release Breaker (token symbol CBRK) on Sepolia as a univ4_hook launch. Token: Breaker (CBRK), total supply 1,000,000,000 CBRK with 18 decimals, minted once to the deployer (a separate zero-argument ERC-20, no mint, owner or admin). Hook: CircuitBreakerHook, a Uniswap v4 hook on the token's native-ETH pool that trips on sharp moves within a block. beforeSwap: if refBlock[poolId] != block.number, store refBlock = block.number and refSqrtPrice = the current sqrtPriceX96 (StateLibrary.getSlot0), the price before the block's first swap, and emit ReferenceSet(poolId, block, sqrtPriceX96). afterSwap: read the new sqrtPriceX96 and revert with Tripped(refSqrtPrice, newSqrtPrice) when the price (sqrtPrice squared) is more than 10% above or below the reference: the allowed band is refSqrt x sqrt(0.9) <= newSqrt <= refSqrt x sqrt(1.1), computed with FullMath.mulDiv against Q96 constants for sqrt(0.9) and sqrt(1.1), rounded inward so the band never exceeds 10%. This includes a block's first swap, so any single swap moving the price more than 10% reverts and large trades must be split across blocks. Liquidity changes and donations do not move the price and are never checked. No deltas, fee, funds or admin. Tripped swaps revert, so they leave no event; the site simulates instead. Deploy shape, matching the live Sepolia hook launches 170 and 186 (168 passed the mainnet PoolManager and is not a model): CircuitBreakerHook's only constructor argument is the Sepolia PoolManager 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543; every rate, window and threshold here is a source constant; there is no owner, admin, setter, pause, upgrade or sweep, and no $owner or $token argument. Permissions are exactly beforeSwap, afterSwap (low address bits 0x00C0), all others false; the constructor calls Hooks.validateHookPermissions and the CREATE2 salt is mined for those bits. The factory initializes the pool (currency0 native ETH, currency1 CBRK, fee 3000, tickSpacing 60) and seeds one-sided CBRK liquidity, so nothing in the hook may revert that initialize or that liquidity add (launch 138 was parked when a beforeInitialize gate reverted the factory), and the first buy lands in a pool that holds no ETH. All state is keyed by PoolId; a pool on this hook whose currency0 is not native ETH gets zero deltas and no other effect. Every callback requires msg.sender == PoolManager. Tests (Foundry, a real v4-core PoolManager deployed in the test, hook at a mined address): a launch rehearsal that initializes at the manifest price, seeds one-sided CBRK liquidity like the factory and makes the first buy into the ETH-less pool; exact-in and exact-out in both directions; dust amounts; a pool whose currency0 is not ETH; direct callback calls from a non-PoolManager address revert; fuzzed sizes; and specifically: a 9.9% move passes and 10.1% reverts, up and down; two swaps in one block that together pass 10% make the second revert; a swap back inside the band passes; a new block resets the reference; on the freshly seeded pool a small first buy passes and an oversized one reverts. An independent adversarial review (read-only) must attack: the sqrt constants and rounding direction, overflow in the band maths, that the reference is captured before any swap including the first, any same-block path that moves the price without reaching afterSwap, and griefing (pushing the price to the band edge to block others for a block; document it). It reports each finding with the exact call sequence that triggers it. Website: one static page (dist/index.html) that reads the hook's views and events and the pool price through Uniswap's Sepolia StateView, with a buy/sell form that swaps through Uniswap's published Sepolia PoolSwapTest router (check it has code). It shows this block's reference price (from ReferenceSet, or the current price when there is no swap yet this block), the plus/minus 10% band, and a pre-check that simulates a typed swap with eth_call and says whether it would trip (replacing the earlier 'recent tripped swaps' list, which reverted swaps cannot supply).","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-09-27T05:48:10.102Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":true,"kind":"univ4_hook","id":"00b25984-d932-4bf4-a97b-5a725e929c73","status":"live","chainId":11155111},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-301-circuitbreakerhook","pullRequestUrl":null,"commit":"41942e8d9335e3f4e35738eb008e5bb9245baf10","deliveredAt":"2026-09-27T08:17:05.943Z","media":null},"media":null,"nodes":[{"key":"adversarial_review","role":"review","state":"accepted","attempt":2,"revisions":1,"judgeRevisions":0,"dependsOn":["build_contract_project","gas_and_size_report","manifest"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-09-27T08:15:28.993Z","verdict":null,"seat":{"tokenId":"1731","agentId":"50955"},"live":null},{"key":"build_contract_project","role":"implement","state":"accepted","attempt":2,"revisions":1,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-09-27T07:42:09.611Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ff982c0f","verifiedTreeHash":"7a309345dd45db96f94a17aa789d867dbbe268e9","at":"2026-09-27T07:42:09.614Z","failedChecks":[]},"seat":{"tokenId":"2","agentId":"50959"},"live":null},{"key":"gas_and_size_report","role":"tests","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":["test/**",".gas-snapshot","artifacts/**"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-09-27T07:53:02.612Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ff982c0f","verifiedTreeHash":"4d2eab454d4a41423bca65cc9a0e4394fb0a7683","at":"2026-09-27T07:53:02.615Z","failedChecks":[]},"seat":{"tokenId":"2","agentId":"50959"},"live":null},{"key":"manifest","role":"integrate","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":0,"dependsOn":["build_contract_project","gas_and_size_report"],"allowedPaths":["launch.json"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-09-27T08:09:13.574Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ff982c0f","verifiedTreeHash":"ce8bae4346262783d48fd3786c2bf3ade2e7cce8","at":"2026-09-27T08:09:13.576Z","failedChecks":[]},"seat":{"tokenId":"2","agentId":"50959"},"live":null}],"reviews":[{"status":"sent","chainId":1,"txHash":"0x9a9d9c4e496be7b0bfcf5ed987377af464883861563d67832c6b4902857467bc","blockNumber":26115611,"sentAt":"2026-10-04T01:10:38.812Z","entries":[]},{"status":"sent","chainId":1,"txHash":"0x682ae668d32de7efbd46cda0ae53c27060a592ef60d611324038ae3884e4f733","blockNumber":26114434,"sentAt":"2026-10-03T21:14:39.619Z","entries":[{"nodeKey":"adversarial_review","agentId":"50955","value":1,"role":"review:submission"},{"nodeKey":"adversarial_review","agentId":"50959","value":1,"role":"review:submission"},{"nodeKey":"build_contract_project","agentId":"51200","value":1,"role":"verification:checks"},{"nodeKey":"build_contract_project","agentId":"50959","value":1,"role":"verification:checks"},{"nodeKey":"gas_and_size_report","agentId":"50959","value":1,"role":"verification:checks"},{"nodeKey":"gas_and_size_report","agentId":"50976","value":0,"role":"verification:checks"},{"nodeKey":"gas_and_size_report","agentId":"50904","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"50959","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"50904","value":1,"role":"verification:checks"}]}]}