ArtCoinsHookV2 on Ethereum
Uniswap v4 Hook Contract 0x866f31562dde70d7b989c2529a9deffffd3be8cc on Ethereum · Dynamic fee · Verified contract
- Volume (24h)
- $0
- Value locked (TVL)
- $0
- All-time volume
- $0
- Pools using this hook
- 1
- Swaps (24h)
- 537 (231 traders)
- Total swaps
- 537
What it does
This hook takes a native ETH skim on every swap in the coin pool, starting high during the first 69-180 minutes and decaying to a baseline of at most 10%, so early buyers and sellers pay the most while later trades pay the lower baseline.
How it works step by step
- Charges a skim in native ETH on the ETH side of every swap in a v2 coin pool, which is the pool's only fee (LP fee is 0).
- The skim rate is the pool baseline, or the decaying anti-sniper rate from the pool's MEV module while its window is open, clamped between baseline and MAX_SKIM_BPS (90%).
- Splits each skim into a bounty leg, a protocol leg and an optional referral leg (capped at the pool referral rate, at most 1% of volume), each pushed with a zero-gas-stipend call and credited to the fee escrow on failure.
- Charges quote-specified swaps on the requested amount in beforeSwap and trues up to the realized fill in afterSwap, crediting any over-charge to a refund address from hookData.
- Blocks liquidity additions while the anti-sniper window is open, and grants PoolManager transfer allowances on the coin leg for restricted coins.
- Launch and admin flow: allowlisted launchers create pools, the owner manages launchers, fee escrow and extension allowlist, and the coin admin can set bounty recipient, referral rate, lower the baseline skim, and swap the pool extension until the coin is locked.
- Swap behaviour
- Every swap pays the skim on the ETH side: exact-input sells of the coin take the skim from the ETH output, and buys or exact-output swaps take it from the ETH input. The skim rate is highest during the anti-sniper window (starting near 68.69%, decaying toward the baseline, which is at most 10%) and drops to the baseline afterwards, so early buyers pay the most and later trades pay the baseline. Swaps are permissionless.
- Liquidity behaviour
- Liquidity additions revert with MevWindowActive while the anti-sniper window is open (for at most 180 minutes after creation). Removals and donations are not hooked. Restricted coins get a PoolManager transfer allowance on the coin leg of swaps.
- Fee behaviour
- No LP fee: the pool uses a dynamic fee flag with an initial value of 0. The only fee is the ETH skim described above, set by the MEV module (anti-sniper decay) during the window and by the pool baseline afterwards. The skim is split between the bounty recipient, the protocol recipient and, when named in hookData, a referrer capped at the pool referral rate.
- Owner & admin controls
- Owner (Ownable2Step): sets launchers, the fee escrow (must list this hook as a core depositor), the extension allowlist, and can rescue tokens, ETH and PoolManager claims. Coin admin (per coin, while not locked): sets the bounty recipient, referral rate (up to 1%), lowers the baseline skim (never to zero), and replaces the pool extension. The hook is not upgradeable: it is a plain contract with no proxy, and no pause function was found.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeAddLiquidity, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta
beforeInitialize reverts for foreign initializers so only initializePool can create pools. beforeAddLiquidity blocks additions during the anti-sniper window. beforeSwap computes and charges the skim on quote-specified swaps and records it in transient storage. afterSwap takes the skim from the PoolManager, splits and delivers it, applies restricted-coin transfer allowances and calls the optional pool extension. beforeSwapReturnDelta and afterSwapReturnDelta let the hook take the skim as a return delta on the swap.
Security & trust assessment
Risk level: medium (verified source, medium confidence).
Who controls it: The owner controls launchers, the escrow, the extension allowlist and can rescue hook-held funds. Coin admins control referral rates, baseline skim reductions, bounty recipients and extensions for their coin until it is locked. No upgrade path or pause was found in the decoded interface.
Risk to user funds: The hook holds only transient skim and refund amounts during swaps and credits failed pushes in the escrow. It takes ETH from swaps via return deltas and can route it to the bounty, protocol or referral recipients. The owner can rescue balances held by the hook, and coin admins choose where the bounty leg goes.
Security findings
- [medium] Owner can rescue any token and ETH: The owner can call rescue(token, to, amount) to move arbitrary ERC20 or native balances held by the hook and rescueClaims to move PoolManager claim balances. Balances held by the hook in transit (for example an unpaid skim or refund) could be withdrawn by the owner.
- [medium] Coin admin can redirect the bounty and swap extensions: setBountyRecipient and setPoolExtension let the coin admin choose the bounty recipient and an extension that receives afterSwap calls with the trader's realized delta (gas capped at 2,000,000). A malicious extension, if allowlisted, can observe or interfere with swap settlement, and the bounty leg goes to whatever address the admin chooses within the checks.
- [low] Swap-blocking mechanism during the anti-sniper window: beforeAddLiquidity reverts with MevWindowActive while the window is open, so new liquidity cannot be added for up to 180 minutes after creation, which can affect LPs but not existing swaps.
- [low] Partial quote fills can revert without refund address: If a quote-specified swap fills partially and hookData does not contain a valid refund address, afterSwap reverts RefundAddressRequired, so a trader's swap can fail depending on hookData.
- [info] Failed pushes depend on the fee escrow: Fee legs are pushed with zero gas stipend and fall back to storeFeesNative on the escrow. Swaps revert if the escrow is misconfigured, which the setFeeEscrow check guards against.
Contract details
- Verified source
- Yes (ArtCoinsHookV2)
- Compiler
- solc 0.8.26+commit.8a97fa7a
- Bytecode size
- 17,369 bytes
- Upgradeable proxy
- No
- Detected patterns
- access-control, dynamic-fee, erc20, launchpad, mev-protection, moves-currency, ownable, return-delta, tax