SatoHook on Avalanche
Uniswap v4 Hook Contract 0x0e310fe6f4a3b9d40c0f661870ede978a2002888 on Avalanche · Custom pricing · Verified contract
- Volume (24h)
- $0
- Value locked (TVL)
- $0
- All-time volume
- $0
- Pools using this hook
- 1
- Swaps (24h)
- 0 (0 traders)
- Total swaps
- 1
What it does
A bonding-curve hook that sells SATO against ETH reserves held by the contract, with buys minting new tokens and sells burning them, and no external liquidity accepted.
This read was written for the hook 0x12a8…6888 on BNB Chain and reused here: the two share a code shape, so constants such as fees, owners and addresses can differ.
How it works step by step
- Prices buys on a forward bonding curve toward a 21,000,000 SATO asymptotic cap with a 500 ETH scale factor
- Mints SATO to the PoolManager on buys and settles the buyer's ETH from the pre-settled input
- Burns SATO and pays ETH from contract reserves on sells using the inverse curve
- Skims a 0.3% fee on each side into feesAccrued
- Applies a 9000-11000 bps entropy multiplier to buys during the first 100 blocks
- Blocks all liquidity additions and self-deprecates (no more buys) at 99% of the cap
- Swap behaviour
- beforeSwap routes all swaps into the bonding curve: buys (ETH in) mint SATO to the buyer with a 0.3% fee and optional entropy multiplier, capped at 5 ETH per buy; sells (SATO in) burn tokens and pay ETH from reserves on the inverse curve after a 0.3% fee, subject to a one-block cooldown after the seller's last buy. Exact-output swaps revert.
- Liquidity behaviour
- beforeAddLiquidity always reverts, so no external liquidity can ever be added to the pool; liquidity is instead the hook's own ETH balance used as sell-side reserves.
- Fee behaviour
- Fixed 0.3% fee (30/10000) skimmed by the hook on both buys and sells and accumulated in feesAccrued; the pool itself uses static POOL_FEE 3000 and lpFeeOverride is always zero.
- Owner & admin controls
- No admin controls found. No owner, pause, upgrade or parameter-setter functions; SatoToken minter is set once and locked, and the hook's constants are immutable. Only the PoolManager can invoke hook entrypoints.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeAddLiquidity, beforeSwap, beforeSwapReturnDelta
beforeInitialize validates the pool is ETH/SATO with fee 3000 and this hook and marks it initialized. beforeAddLiquidity reverts to block all LP deposits. beforeSwap executes buys and sells entirely via the bonding curve. beforeSwapReturnDelta lets the hook return a BeforeSwapDelta that replaces the AMM leg with its own mint/burn and ETH settlement.
Security & trust assessment
Risk level: medium, estimated (decoded bytecode, high confidence).
Who controls it: No privileged key can move funds or change parameters after deployment; the deployer's only power was to set the minter once. Risk is concentrated in contract logic rather than in a controllable admin.
Risk to user funds: Users' ETH and SATO flow through the hook, which holds the ETH reserves and can block trades via reverts (InsufficientEthReserves, SelfDeprecatedNoBuys, CooldownActive) but has no mechanism to freely withdraw user funds. Liquidity providers cannot deposit, so pool funds are limited to the hook's reserves.
Security findings
- [medium] Hook holds and pays ETH reserves: The hook is the counterparty to every trade: sells are paid from the contract's ETH balance (address(this).balance minus feesAccrued) using the inverse curve, so solvency depends on the curve accounting being correct.
- [medium] Swaps bypass AMM and rely on return deltas: The hook takes over swaps via beforeSwapReturnDelta and settles mints and burns directly with PoolManager, so routers must pre-settle input currency; the swap is not priced by any AMM liquidity in the pool.
- [low] Entropy multiplier is manipulable: Sell size is converted using actual totalSupply and totalMintedFair, and entropy multipliers at buy time (9000-11000 bps for the first 100 blocks) use blockhash and the swapper address, which are predictable or manipulable by block producers and can shift minted amounts by up to 10%.
- [low] Cooldown identity taken from unverified hookData: Cooldown is keyed by the address in hookData, which is caller-supplied and not verified against msg.sender, so a router can pass any address; the cooldown can be bypassed and only applies to one block.
- [info] No upgradeability or admin pause: Immutable, non-upgradeable contracts with no owner, pause or blacklist; the minter lock is enforced in SatoToken.setMinter.
Contract details
- Verified source
- Yes (SatoHook)
- Compiler
- solc 0.8.26+commit.8a97fa7a
- Bytecode size
- 9,920 bytes
- Upgradeable proxy
- No
- Detected patterns
- erc20, moves-currency, return-delta
Pools using SatoHook
- AVAX / redacted (0.30% fee) — 24h volume $0, TVL $0, 0 swaps today