Skip to main content

Zaps

Zaps wrap ETH / stETH / USDC / fxUSD into the market’s wrapped collateral, then deposit into Genesis or the Minter. They are convenience only — prefer calling the minter with wrapped collateral when you already hold it. See Mint and redeem.

Full address table: Zap contracts. Per-market rows: genesisZap, peggedTokenZap, leveragedTokenZap on each market page.

Convenience in. Canonical collateral out.

When to use them​

Use zapUse minter directly
User wallet has native ETH, stETH, USDC, or fxUSDYour protocol already holds fxSAVE / wstETH (or that market’s wrapped collateral)
Maiden Voyage deposits (genesis still open)Production mint/redeem of ha/hs with known wrapped balances
App-style one-click UXFewer contracts, no zap upgrade surface

Zaps are out of Sherlock audit scope (see FAQ). Treat them as optional helpers.

Families​

FamilyTypical inputsDestination
GenesisETHZapETH, stETH (permit where supported)Market genesis
MinterETHZapETH, stETHMint ha / hs (and some stability-pool paths)
GenesisUSDCZapUSDC, fxUSDGenesis
MinterUSDCZapUSDC, fxUSDMint ha / hs

Versions differ by market (v1 CREATE3 on haUSD/stETH; v2–v4 elsewhere). Always use the proxy on the market page.

ETH-family entrypoints commonly include zapNativeAsset, zapCollateral, and zapCollateralWithPermit (stETH has EIP-2612). Confirm the ABI on the zap implementation behind that proxy — harbor-zap-contracts.

Integrator path​

  1. Read genesisZap / peggedTokenZap / leveragedTokenZap from the market page (or app config). Empty / “none” means no zap — deposit wrapped collateral.
  2. Approve the input token to the zap (except native ETH msg.value paths).
  3. Set slippage / min-out per leg. Prefer a zap-specific preview. If the zap exposes none, use the minter *DryRun for the minter leg only (after converting to wrapped units), and set a separate conservative minimum for the wrap leg — see SDK helpers.
  4. Pegged and leveraged minter zaps are often the same contract (peggedTokenZap = leveragedTokenZap).

SDK helpers​

@harbor/sdk encodeZap.* builds calldata for common genesis / minter paths once the market lists zap addresses. Do not treat a minter *DryRun alone as the zap’s end-to-end preview: prefer a zap-specific preview when the zap exposes one; otherwise set a conservative lower bound and separate minimums for the zap wrap leg and the minter leg (minWrappedCollateralOut / minTokenOut).