Sat1Hook on Ethereum
Uniswap v4 Hook Contract 0x2a0a30dd78af7698e6f40212b8b8324fce2ee888 on Ethereum · Custom pricing · Verified contract
- Volume (24h)
- $0
- Value locked (TVL)
- $0
- All-time volume
- $0
- Pools using this hook
- 1
- Swaps (24h)
- 135 (5 traders)
- Total swaps
- 97,487
What it does
A bonding-curve token hook where swaps against the ETH/SAT1 pool are executed directly on the curve: buys mint SAT1 for ETH and sells burn SAT1 for ETH, with LP deposits disabled.
How it works step by step
- Accepts only the ETH/SAT1 pool with fee 3000 and this hook address during beforeInitialize
- Executes buys on the bonding curve: takes up to 5 ETH, charges 0.3%, mints SAT1 and compounds the full input into ethCum
- Executes sells on the curve: burns SAT1 sized by fair supply, pays ETH minus a 0.3% fee, and removes only the paid-out ETH from ethCum
- Enforces a one-block cooldown between a wallet's last buy and its first sell
- Multiplies early buy mints by a pseudo-random factor between 0.9 and 1.1 for the first 100 blocks
- Permanently disables buys once 99% of the K_SUPPLY cap is minted (selfDeprecated)
- Swap behaviour
- On buys (ETH to SAT1) the hook charges a 0.3% fee, mints SAT1 on the curve (with an entropy multiplier in the first 100 blocks), takes the ETH and returns a before-swap delta. On sells (SAT1 to ETH) the hook enforces a one-block cooldown per address, burns SAT1, pays out ETH minus a 0.3% fee, and returns a before-swap delta. Exact-output swaps revert.
- Liquidity behaviour
- Liquidity additions are forbidden: beforeAddLiquidity always reverts with LiquidityAdditionsForbidden. beforeRemoveLiquidity is a no-op pass-through. The curve reserve is tracked internally as ethCum rather than by pool balances, and direct ETH donations are not counted.
- Fee behaviour
- A fixed 0.3% fee (30/10000) is deducted in code on each buy and sell; the pool's LP fee is 3000 but lpFeeOverride returned is 0. On buys the full ETH input, including the fee, compounds into ethCum. On sells the fee portion stays in ethCum. No fee is shared with LPs or an external recipient.
- Owner & admin controls
- No admin controls found. No owner, pause, upgrade proxy or parameter setter in the hook; the only privileged caller is the PoolManager (onlyPoolManager). The token's minter is set once via setMinter and locked; the deployer cannot change it afterwards.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeAddLiquidity, beforeSwap, beforeSwapReturnDelta
beforeInitialize validates the pool (ETH/SAT1 pair, fee 3000, this hook) and sets poolInitialized. beforeAddLiquidity reverts to block all LP deposits. beforeSwap executes buys (ETH in, SAT1 minted via bonding curve) when zeroForOne and sells (SAT1 in, ETH out) otherwise, using beforeSwapReturnDelta to settle the swap against the curve instead of the AMM.
Security & trust assessment
Risk level: medium (verified source, high confidence).
Who controls it: No privileged key can change fees, pause trading, or move funds. The token minter is fixed to this hook after a one-time setMinter call by the deployer, so the deployer retains no minting power after that call. Trust is placed in the immutable curve math and the PoolManager.
Risk to user funds: The hook holds the entire ETH reserve backing the curve and is the sole minter/burner of SAT1. Users' funds are exposed to bugs in the curve math and reserve accounting, since no admin can rescue or pause funds. The hook cannot arbitrarily seize user balances, and the SAT1 minter cannot be changed after setup.
Security findings
- [info] Buy cap and irreversible self-deprecation: Buys are capped at 5 ETH per transaction and are blocked once selfDeprecated is set (99% of K_SUPPLY minted), so the curve can stop accepting buys permanently.
- [info] Per-address sell cooldown: Sells are blocked for one block after a wallet's last buy (COOLDOWN_BLOCKS = 1), tracked per address in lastBuyBlock. A wallet can still sell via a different address.
- [medium] Manipulable entropy multiplier on early buys: Mint amounts for buys in the first 100 blocks are multiplied by a pseudo-random factor between 0.9x and 1.1x derived from blockhash and swapper address. Block producers can influence this outcome, so the amount of SAT1 a buyer receives is partly manipulable.
- [low] Sell liveness depends on ETH reserve accounting: Sell payouts are computed from actualSupply and ethCum; if the hook's ETH balance is below ethOut the sell reverts. Sells depend on the hook holding enough ETH, which is funded only by buys and the fee retention logic.
- [medium] Hook custodies the ETH reserve: The hook takes ETH and mints SAT1 through PoolManager sync/settle/take calls and holds the ETH reserve (ethCum) itself, so users' ETH sits in the hook contract rather than in pool reserves; the contract has no withdraw function, so the ETH is only recoverable through sells.
Contract details
- Verified source
- Yes (Sat1Hook)
- Compiler
- solc 0.8.26+commit.8a97fa7a
- Bytecode size
- 9,931 bytes
- Upgradeable proxy
- No
- Detected patterns
- erc20, moves-currency, return-delta
Pools using Sat1Hook
- ETH / sat1 (0.30% fee) — 24h volume $0, TVL $0, 135 swaps today