{"id":"1198001b-6d86-4de4-b8eb-44dd394636eb","objective":"Release Whale Tax (token symbol WHAL) on Sepolia as a univ4_hook launch. Token: Whale Tax (WHAL), total supply 1,000,000,000 WHAL with 18 decimals, minted once to the deployer (a separate zero-argument ERC-20, no mint, owner or admin). Hook: WhaleTaxHook, a Uniswap v4 hook on the token's native-ETH pool whose fee grows with the swap's price impact. beforeSwap stores the pre-swap sqrtPriceX96 in transient storage keyed by PoolId. afterSwap reads the post-swap sqrtPriceX96 and computes the price move m in bps, m = |P_after / P_before - 1| x 10,000 with P = sqrtPrice squared, using FullMath.mulDiv so nothing overflows, then clears the transient slot (Solidity 0.8.26, foundry.toml evm_version = \"cancun\", which Sepolia supports). Fee bps = 30 + floor(470 x min(m, 500) / 500): 0.3% for a swap that barely moves the price, rising linearly to 5% at a 5% move and capped there. The fee is taken from the swap's unspecified leg as a positive unspecified afterSwap delta: exact-in pays it out of the output, exact-out on top of the input, in whichever currency that is. The hook settles it by minting itself ERC-6909 claims (never take() in a callback) and permissionless burnFees(currency) sends accrued claims to 0x000000000000000000000000000000000000dEaD inside the hook's unlockCallback, their only destination. Events: WhaleTax(poolId, moveBps, feeBps, currency, fee). README: the tax is per swap, so splitting a trade across swaps or blocks lowers it; that is the design, not a bug. Deploy shape, matching the live Sepolia hook launches 170 and 186 (168 passed the mainnet PoolManager and is not a model): WhaleTaxHook'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, afterSwapReturnDelta (low address bits 0x00C4), 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 WHAL, fee 3000, tickSpacing 60) and seeds one-sided WHAL 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 WHAL 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 tiny swap pays 30 bps; a 2.5% move pays 265 bps; any move of 5% or more pays 500 bps; exact-in and exact-out in both directions; two swaps in one transaction each use their own pre-swap price; burnFees; the hook's claims equal unburned fees (fuzzed). An independent adversarial review (read-only) must attack: impact maths (overflow, rounding, direction), the transient slot across several swaps in one transaction, the fee never exceeding the unspecified leg, the zero-liquidity case where the price jumps to the limit, and burnFees accounting. 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 a fee preview for a typed swap size (simulated with eth_call, showing the price move and fee) and the fee curve.","status":"blocked","waitingForHosting":false,"failure":"The published deployment configuration's extra key \"integrations\" names 0x000000000000000000000000000000000000c0de, which is neither a deployed contract, an address in the attested manifest, nor one the chain table vets. Remove it, or keep only the exact version 1 keys.","chainId":11155111,"createdAt":"2026-09-27T05:54:30.130Z","updatedAt":"2026-09-27T18:08:48.587Z","contracts":{"id":"035dfaac-976b-4e98-894a-71e3f4b2fe1a","state":"completed","failure":null,"repoUrl":"https://github.com/identity-md-launches/launch-310-whaletaxhook","commit":"07a9d5d68a4e1416289e4c168a4761ec627078a9"},"frontend":{"id":"6e186da6-d29f-43dd-8a95-cf9220929aee","state":"completed","failure":null,"repoUrl":"https://github.com/identity-md-launches/launch-389-workflow-frontend-stage-context","commit":"5137692861f85679ed7b98fdabb54ff7598d3c08"},"frontendPlan":{"skill":"frontend-for-contract","objective":"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 a fee preview for a typed swap size (simulated with eth_call, showing the price move and fee) and the fee curve.","acceptanceCriteria":[]},"launch":{"id":"543763e2-628b-4091-93d9-2fb043124609","status":"live"},"validation":{"status":"failed","attempts":3,"startedAt":"2026-09-27T17:27:12.851Z","deadlineAt":"2026-09-28T17:27:12.851Z","nextAttemptAt":null,"report":{"scope":"Read-only HTTP checks of the named and immutable entrypoints, declared static asset hashes and HTML references, published deployment configuration and ABI hashes, and operator-RPC chain/code existence. Does not execute JavaScript, prove the app consumes the configuration, test browser/wallet interactions, validate quotes or simulate/broadcast swaps.","checks":[{"id":"deployment-config","detail":"The published deployment configuration's extra key \"integrations\" names 0x000000000000000000000000000000000000c0de, which is neither a deployed contract, an address in the attested manifest, nor one the chain table vets. Remove it, or keep only the exact version 1 keys.","status":"failed"}],"status":"failed","summary":"The published deployment configuration's extra key \"integrations\" names 0x000000000000000000000000000000000000c0de, which is neither a deployed contract, an address in the attested manifest, nor one the chain table vets. Remove it, or keep only the exact version 1 keys.","version":1,"checkedAt":"2026-09-27T18:08:48.564Z","retryable":false}},"brief":"# Approved workflow\n\nRelease Whale Tax (token symbol WHAL) on Sepolia as a univ4_hook launch. Token: Whale Tax (WHAL), total supply 1,000,000,000 WHAL with 18 decimals, minted once to the deployer (a separate zero-argument ERC-20, no mint, owner or admin). Hook: WhaleTaxHook, a Uniswap v4 hook on the token's native-ETH pool whose fee grows with the swap's price impact. beforeSwap stores the pre-swap sqrtPriceX96 in transient storage keyed by PoolId. afterSwap reads the post-swap sqrtPriceX96 and computes the price move m in bps, m = |P_after / P_before - 1| x 10,000 with P = sqrtPrice squared, using FullMath.mulDiv so nothing overflows, then clears the transient slot (Solidity 0.8.26, foundry.toml evm_version = \"cancun\", which Sepolia supports). Fee bps = 30 + floor(470 x min(m, 500) / 500): 0.3% for a swap that barely moves the price, rising linearly to 5% at a 5% move and capped there. The fee is taken from the swap's unspecified leg as a positive unspecified afterSwap delta: exact-in pays it out of the output, exact-out on top of the input, in whichever currency that is. The hook settles it by minting itself ERC-6909 claims (never take() in a callback) and permissionless burnFees(currency) sends accrued claims to 0x000000000000000000000000000000000000dEaD inside the hook's unlockCallback, their only destination. Events: WhaleTax(poolId, moveBps, feeBps, currency, fee). README: the tax is per swap, so splitting a trade across swaps or blocks lowers it; that is the design, not a bug. Deploy shape, matching the live Sepolia hook launches 170 and 186 (168 passed the mainnet PoolManager and is not a model): WhaleTaxHook'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, afterSwapReturnDelta (low address bits 0x00C4), 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 WHAL, fee 3000, tickSpacing 60) and seeds one-sided WHAL 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 WHAL 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 tiny swap pays 30 bps; a 2.5% move pays 265 bps; any move of 5% or more pays 500 bps; exact-in and exact-out in both directions; two swaps in one transaction each use their own pre-swap price; burnFees; the hook's claims equal unburned fees (fuzzed). An independent adversarial review (read-only) must attack: impact maths (overflow, rounding, direction), the transient slot across several swaps in one transaction, the fee never exceeding the unspecified leg, the zero-liquidity case where the price jumps to the limit, and burnFees accounting. 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 a fee preview for a typed swap size (simulated with eth_call, showing the price move and fee) and the fee curve.\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-whale-tax-hook.\n\nBuild WHAL and WhaleTaxHook (permissions beforeSwap, afterSwap, afterSwapReturnDelta; 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","handoff":{"chainId":11155111,"repoUrl":"https://github.com/identity-md-launches/launch-310-whaletaxhook","version":1,"launchId":"543763e2-628b-4091-93d9-2fb043124609","manifest":{"hook":{"contract":"WhaleTaxHook","permissions":["beforeSwap","afterSwap","afterSwapReturnDelta"],"constructorArgs":["0xE03A1074c86CFeDd5C142C4F04F1a1536e203543"]},"kind":"univ4_hook","pool":{"fee":3000,"tickSpacing":60,"initialPrice":"176653655955546853378467418172841","pairedCurrency":"0x0000000000000000000000000000000000000000"},"notes":"Technical description of src/WhaleTaxHook.sol and src/WhaleToken.sol; ABI exports are docs/abi/WhaleTaxHook.json and docs/abi/WhaleToken.json. The hook takes only the approved Sepolia PoolManager address; the token constructor takes no arguments. Hook permissions are exactly beforeSwap, afterSwap and afterSwapReturnDelta, with address bits 0x00C4 validated in the constructor; deployment requires a matching CREATE2 address. The intended pool has currency0 native ETH and currency1 WHAL. The initialPrice adopts the existing launch rehearsal's tick 154200: TickMath.getSqrtPriceAtTick(154200), encoded as decimal sqrtPriceX96, approximately 4,971,484.53 WHAL per ETH. This price supports the rehearsed one-sided WHAL liquidity range below the initial tick and a first buy into an ETH-less pool. The pool's static LP fee is 3000 (0.30%), separate from the hook tax. beforeSwap records the pre-swap sqrt price in transient storage keyed by PoolId; afterSwap clears it and computes the price move m in bps from the squared price ratio using FullMath. The tax rate is 30 + floor(470 * min(m, 500) / 500) bps, capped at 500 bps. A positive afterSwap delta charges the unspecified leg: output for exact-in, additional input for exact-out. Fees round down and settle as ERC-6909 claims minted to the hook. Permissionless burnFees(currency) transfers accrued claims to 0x000000000000000000000000000000000000dEaD inside unlockCallback; it does not withdraw underlying currency or reduce token supply. Active callbacks accept only the PoolManager. There are no initialize or liquidity permissions. Pools with non-native currency0 receive zero swap deltas and no accounting changes; other native-ETH pools attached to this hook are taxed too. Fee balances are aggregated per currency. The tax is per swap, so splitting a trade can lower it; hookData is ignored. This manifest describes constructor and pool inputs, not launch policy or authorization. Source publication, signed artifact linkage, admission and deployment are later service responsibilities; no service outcome is asserted here.","token":{"name":"Whale Tax","symbol":"WHAL","contract":"WhaleToken","decimals":18}},"contracts":[{"name":"WhaleToken","txHash":"0xf1f6b25c254c5654fcff5193c1024af9330e9cf60294fd81291176b51dc0ccad","abiHash":"f36d2fe28b62f817a4fba0b78bb501b41895eada3982280273c063ad8183f577","address":"0xfe00cb1154a70ddc6276de8b8f16fd5d747248ae","blockNumber":11791653,"creationCodeHash":"4f3f2e50702c745f4db6962ed84cecd5e7632bdfe002974ba21a5ada23903e94"},{"name":"WhaleTaxHook","txHash":"0xf1f6b25c254c5654fcff5193c1024af9330e9cf60294fd81291176b51dc0ccad","abiHash":"f6bd1a285ecb9094ac13d9151214bbdcddfc1b10f09b0348b084663238a12621","address":"0x8e587e7fb490084f3a5a2117224abed72a8cc0c4","blockNumber":11791653,"creationCodeHash":"9ba68d521571ec964da642b65cd1ced30a2906f5236a9fa999159f229eb918f0"}],"sourceCommit":"07a9d5d68a4e1416289e4c168a4761ec627078a9","abiInstructions":"Build ABIs from this exact source commit; compare canonicalKeccak(abi) with abiHash. Verify deployed code on the stated chain before enabling transactions.","attestationHash":"f507fd65b2e10da6a1f9a2937ae72fc8377743d7349a55618810994c0b1b4457"},"site":{"status":"named","cid":"bafybeigbspx4jrlllnucjxhp4zg26e7b5ls65fywqlx3o5ycmrnlvi4qs4","ensName":"lab-whale-tax-hook.site.identitymd.eth","ensParent":null,"failure":null}}