{"workflow":{"id":"8aed08d3-d3fa-419a-8eb7-c9b67fa5ae7a","objective":"Release Takeprofit (token symbol TKPF) on Sepolia as a univ4_hook launch. Token: Takeprofit (TKPF), total supply 1,000,000,000 TKPF with 18 decimals, minted once to the deployer. Hook: TakeProfitHook, a Uniswap v4 hook on the token's native-ETH pool. (Named TakeProfitHook, not LimitOrderHook, so its artifact name does not collide with the OpenZeppelin base contract it extends.) Deployment: the constructor takes one argument, the Sepolia PoolManager 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543, passed as a literal in launch.json constructorArgs; getHookPermissions() returns exactly afterInitialize and afterSwap and every other flag false (address bits 0x1040 under mask 0x3FFF), validated in the constructor; the factory mines the CREATE2 salt. The factory's pool is currency0 = native ETH, currency1 = TKPF, LP fee 3000, tickSpacing 60, seeded with TKPF only, so the first buy lands in a pool holding no ETH and must work. State is keyed by PoolId; the base bookkeeping runs on any pool, but placeTakeProfit and the overridden placeOrder accept only pools whose currency0 is native ETH. Callbacks are PoolManager-only (override BaseHook's internal _before/_after functions). No owner, admin, pause or upgrade path. Tests swap through a real PoolManager; the Identity-md/univ4hook-start-template harness (BaseHookTest) provides the launch pool. Behaviour: TakeProfitHook extends OpenZeppelin uniswap-hooks' LimitOrderHook (in the template's lib/uniswap-hooks) and only allows take-profit orders that sell TKPF for ETH. placeTakeProfit(PoolKey key, int24 tick, uint256 amount): tick must be a multiple of 60 strictly below the pool's current tick range (a range made only of TKPF); the hook computes the liquidity for `amount` TKPF over [tick, tick + 60] and calls the base placeOrder with zeroForOne = false, pulling TKPF from the caller (approve the hook first). Orders that would sell ETH (zeroForOne = true) revert, because the base settles native ETH from the hook's own balance and placeOrder is not payable. Buys push the tick down; when a swap fully crosses an order's range, the base afterSwap removes that tick's pooled liquidity, marks the order filled and holds the proceeds as ERC-6909 claims; each owner withdraws its pro-rata ETH (and any fees) with withdraw(orderId, to). A range the price is still inside is not filled. cancelOrder returns the owner's share of an unfilled order (TKPF, plus ETH if partly crossed). Orders placed at one tick share an order id until it fills; later orders there get a new id. Gas: afterSwap walks every 60-tick step the swap crossed, and the launch pool is one-sided, so a big buy can cross hundreds of steps; measure it and document the largest swap that fits comfortably in a block. Views: the base getOrderId, getOrderInfo, getOrderLiquidity and getTickLowerLast, plus liquidityForAmount(tick, amount). Tests must show: valid and invalid ticks (in range, wrong side, not a multiple of 60), ETH-side orders refused, a partial cross not filling, a full cross filling and paying about the expected ETH, two owners at one tick paid pro rata, cancel before and after a partial cross, double withdraw reverting, and gas for a buy crossing 100 steps. The independent adversarial review must attack: assumptions inherited from the base (fee attribution on cancel, rounding in withdraw), the ETH-side restriction, unbounded afterSwap gas, and whether a manipulator can fill orders and swap back at the owners' expense. Then a small website that shows the current price (TKPF per ETH and ETH per TKPF), lets a wallet place a take-profit order from a target price (rounded to the nearest valid tick below, approve TKPF first), lists its orders from Place, Fill and Cancel events with status, and offers cancel and withdraw. Read state from hook views and events via a public Sepolia RPC with no backend; keep it to one small page; the static export has index.html in dist/.","status":"completed","brief":"# Approved workflow\n\nRelease Takeprofit (token symbol TKPF) on Sepolia as a univ4_hook launch. Token: Takeprofit (TKPF), total supply 1,000,000,000 TKPF with 18 decimals, minted once to the deployer. Hook: TakeProfitHook, a Uniswap v4 hook on the token's native-ETH pool. (Named TakeProfitHook, not LimitOrderHook, so its artifact name does not collide with the OpenZeppelin base contract it extends.) Deployment: the constructor takes one argument, the Sepolia PoolManager 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543, passed as a literal in launch.json constructorArgs; getHookPermissions() returns exactly afterInitialize and afterSwap and every other flag false (address bits 0x1040 under mask 0x3FFF), validated in the constructor; the factory mines the CREATE2 salt. The factory's pool is currency0 = native ETH, currency1 = TKPF, LP fee 3000, tickSpacing 60, seeded with TKPF only, so the first buy lands in a pool holding no ETH and must work. State is keyed by PoolId; the base bookkeeping runs on any pool, but placeTakeProfit and the overridden placeOrder accept only pools whose currency0 is native ETH. Callbacks are PoolManager-only (override BaseHook's internal _before/_after functions). No owner, admin, pause or upgrade path. Tests swap through a real PoolManager; the Identity-md/univ4hook-start-template harness (BaseHookTest) provides the launch pool. Behaviour: TakeProfitHook extends OpenZeppelin uniswap-hooks' LimitOrderHook (in the template's lib/uniswap-hooks) and only allows take-profit orders that sell TKPF for ETH. placeTakeProfit(PoolKey key, int24 tick, uint256 amount): tick must be a multiple of 60 strictly below the pool's current tick range (a range made only of TKPF); the hook computes the liquidity for `amount` TKPF over [tick, tick + 60] and calls the base placeOrder with zeroForOne = false, pulling TKPF from the caller (approve the hook first). Orders that would sell ETH (zeroForOne = true) revert, because the base settles native ETH from the hook's own balance and placeOrder is not payable. Buys push the tick down; when a swap fully crosses an order's range, the base afterSwap removes that tick's pooled liquidity, marks the order filled and holds the proceeds as ERC-6909 claims; each owner withdraws its pro-rata ETH (and any fees) with withdraw(orderId, to). A range the price is still inside is not filled. cancelOrder returns the owner's share of an unfilled order (TKPF, plus ETH if partly crossed). Orders placed at one tick share an order id until it fills; later orders there get a new id. Gas: afterSwap walks every 60-tick step the swap crossed, and the launch pool is one-sided, so a big buy can cross hundreds of steps; measure it and document the largest swap that fits comfortably in a block. Views: the base getOrderId, getOrderInfo, getOrderLiquidity and getTickLowerLast, plus liquidityForAmount(tick, amount). Tests must show: valid and invalid ticks (in range, wrong side, not a multiple of 60), ETH-side orders refused, a partial cross not filling, a full cross filling and paying about the expected ETH, two owners at one tick paid pro rata, cancel before and after a partial cross, double withdraw reverting, and gas for a buy crossing 100 steps. The independent adversarial review must attack: assumptions inherited from the base (fee attribution on cancel, rounding in withdraw), the ETH-side restriction, unbounded afterSwap gas, and whether a manipulator can fill orders and swap back at the owners' expense. Then a small website that shows the current price (TKPF per ETH and ETH per TKPF), lets a wallet place a take-profit order from a target price (rounded to the nearest valid tick below, approve TKPF first), lists its orders from Place, Fill and Cancel events with status, and offers cancel and withdraw. Read state from hook views and events via a public Sepolia RPC with no backend; keep it to one small page; the static export has index.html in dist/.\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-limit-order-hook.\n\nBuild TKPF and TakeProfitHook (extends OpenZeppelin LimitOrderHook; TKPF->ETH take-profit orders only; afterInitialize + afterSwap) with tests against a real PoolManager and an independent review, deploy them, then build the website against the live pool.\n","briefDigest":"f31202143be149cf8ff167947cade238d668ced4ac2b0b35216186f43b064b9a"},"planning":null,"id":"5afb7004-881c-4f89-a399-62db9889b9e3","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:19:37.398Z","updatedAt":"2026-09-27T06:30:45.420Z","paidBy":"0x8a3b860f6dbfbbbb07f21905ed8cb0234538bdc8","via":"api.imdnotdead.fun","parentJobId":null,"project":{"id":"5afb7004-881c-4f89-a399-62db9889b9e3","head":"0ce29d57-fdfa-433e-85e7-1037d3910743","running":null,"versions":[{"jobId":"5afb7004-881c-4f89-a399-62db9889b9e3","workflowId":"8aed08d3-d3fa-419a-8eb7-c9b67fa5ae7a","objective":"Release Takeprofit (token symbol TKPF) on Sepolia as a univ4_hook launch. Token: Takeprofit (TKPF), total supply 1,000,000,000 TKPF with 18 decimals, minted once to the deployer. Hook: TakeProfitHook, a Uniswap v4 hook on the token's native-ETH pool. (Named TakeProfitHook, not LimitOrderHook, so its artifact name does not collide with the OpenZeppelin base contract it extends.) Deployment: the constructor takes one argument, the Sepolia PoolManager 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543, passed as a literal in launch.json constructorArgs; getHookPermissions() returns exactly afterInitialize and afterSwap and every other flag false (address bits 0x1040 under mask 0x3FFF), validated in the constructor; the factory mines the CREATE2 salt. The factory's pool is currency0 = native ETH, currency1 = TKPF, LP fee 3000, tickSpacing 60, seeded with TKPF only, so the first buy lands in a pool holding no ETH and must work. State is keyed by PoolId; the base bookkeeping runs on any pool, but placeTakeProfit and the overridden placeOrder accept only pools whose currency0 is native ETH. Callbacks are PoolManager-only (override BaseHook's internal _before/_after functions). No owner, admin, pause or upgrade path. Tests swap through a real PoolManager; the Identity-md/univ4hook-start-template harness (BaseHookTest) provides the launch pool. Behaviour: TakeProfitHook extends OpenZeppelin uniswap-hooks' LimitOrderHook (in the template's lib/uniswap-hooks) and only allows take-profit orders that sell TKPF for ETH. placeTakeProfit(PoolKey key, int24 tick, uint256 amount): tick must be a multiple of 60 strictly below the pool's current tick range (a range made only of TKPF); the hook computes the liquidity for `amount` TKPF over [tick, tick + 60] and calls the base placeOrder with zeroForOne = false, pulling TKPF from the caller (approve the hook first). Orders that would sell ETH (zeroForOne = true) revert, because the base settles native ETH from the hook's own balance and placeOrder is not payable. Buys push the tick down; when a swap fully crosses an order's range, the base afterSwap removes that tick's pooled liquidity, marks the order filled and holds the proceeds as ERC-6909 claims; each owner withdraws its pro-rata ETH (and any fees) with withdraw(orderId, to). A range the price is still inside is not filled. cancelOrder returns the owner's share of an unfilled order (TKPF, plus ETH if partly crossed). Orders placed at one tick share an order id until it fills; later orders there get a new id. Gas: afterSwap walks every 60-tick step the swap crossed, and the launch pool is one-sided, so a big buy can cross hundreds of steps; measure it and document the largest swap that fits comfortably in a block. Views: the base getOrderId, getOrderInfo, getOrderLiquidity and getTickLowerLast, plus liquidityForAmount(tick, amount). Tests must show: valid and invalid ticks (in range, wrong side, not a multiple of 60), ETH-side orders refused, a partial cross not filling, a full cross filling and paying about the expected ETH, two owners at one tick paid pro rata, cancel before and after a partial cross, double withdraw reverting, and gas for a buy crossing 100 steps. The independent adversarial review must attack: assumptions inherited from the base (fee attribution on cancel, rounding in withdraw), the ETH-side restriction, unbounded afterSwap gas, and whether a manipulator can fill orders and swap back at the owners' expense. Then a small website that shows the current price (TKPF per ETH and ETH per TKPF), lets a wallet place a take-profit order from a target price (rounded to the nearest valid tick below, approve TKPF first), lists its orders from Place, Fill and Cancel events with status, and offers cancel and withdraw. Read state from hook views and events via a public Sepolia RPC with no backend; keep it to one small page; the static export has index.html in dist/.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-09-27T05:19:37.398Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":true,"kind":"univ4_hook","id":"06be26db-a8ac-44fd-89a0-3be8532d8ee0","status":"live","chainId":11155111},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-247-takeprofithook","pullRequestUrl":null,"commit":"6c0d7149c62681b3b8616e4d0dc13d7d255f33a7","deliveredAt":"2026-09-27T06:46:55.085Z","media":null},"media":null,"nodes":[{"key":"adversarial_review","role":"review","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":0,"dependsOn":["build_contract_project","manifest"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-09-27T06:30:45.420Z","verdict":null,"seat":{"tokenId":"420","agentId":"50939"},"live":null},{"key":"build_contract_project","role":"implement","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-09-27T06:16:53.312Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ff982c0f","verifiedTreeHash":"ae3a623d0734e49abb39476aa923a68fa2aeabbe","at":"2026-09-27T06:16:53.315Z","failedChecks":[]},"seat":{"tokenId":"1846","agentId":"51297"},"live":null},{"key":"manifest","role":"integrate","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":["launch.json"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-09-27T06:21:58.578Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ff982c0f","verifiedTreeHash":"9ec1e90765def9af0d0c58acf5876183221d651f","at":"2026-09-27T06:21:58.581Z","failedChecks":[]},"seat":{"tokenId":"165","agentId":"50991"},"live":null}],"reviews":[{"status":"sent","chainId":1,"txHash":"0x79fc3ed25e0cfb76d48d5622db8c565e1bad3664e50140bc52882f2ec369c5a4","blockNumber":26115445,"sentAt":"2026-10-04T00:37:15.976Z","entries":[]},{"status":"sent","chainId":1,"txHash":"0x040fee53de1df4b7db29ecb3ec5a3522e8013a248e1193eb80306c0e04861995","blockNumber":26114254,"sentAt":"2026-10-03T20:38:38.975Z","entries":[{"nodeKey":"adversarial_review","agentId":"50939","value":1,"role":"review:submission"},{"nodeKey":"adversarial_review","agentId":"50952","value":1,"role":"review:submission"},{"nodeKey":"build_contract_project","agentId":"51105","value":1,"role":"verification:checks"},{"nodeKey":"build_contract_project","agentId":"51297","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"51105","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"50991","value":1,"role":"verification:checks"}]}]}