Skip to main content

Harbor Yield

Status: In progress (not live mainnet UX)
Repos: baofinance/harbor-yield (+ foundation on harbor PR #33)
Product overview: Harbor Yield (hyTOKENS)
Integrator standards: hy / ERC-7575

Harbor Yield is the mid-term yield stack on top of stability pools. Product framing uses three participation levels; this page tracks the contract surface. Authoritative design: doc/design.md on branch multi-asset (checked 2 Nov 2026, 1e9ce4c). main on that repo is an older scaffold. Integrations: doc/integrations.md.

Deposit and rebalance rules (shared with product)​

These rules apply at every level that touches a stability pool (or its Compounder):

RuleDetail
Mint / acquireUsers can mint haTokens and/or hsTokens, or acquire them via a market
Pool deposit (live mainnet v1/v2)Only haTokens into the collateral or Sail pool → compounding internal balance (no ERC-20 pool share)
Pool deposit (SP_v3 / pre-prod)Same ha-only rule; receive rebasing hp… ERC-20 shares — not live UX yet
Compounder depositERC-4626 deposit() takes haXXX (asset() = pegged token). Optional depositStabilityPool wraps an existing pool position — pre-prod
Pool yieldBoth pools accrue concentrated collateral yield / harvest + revenue share on haToken deposits
Rebalance payoutCollateral pool → wrapped collateral (e.g. fxSAVE / wstETH); Sail pool → hsTokens (deposited haTokens are burned). hsTokens do not earn concentrated yield on their own

Product UX: Harbor Yield. Live pool behaviour: Stability pool.

Three participation levels​

This docs site uses product-facing Levels 1–3. The design doc numbers the same stack 0–2. Mapping:

Product (this site)Design docComponent
Level 1Level 0Raw stability pool
Level 2Level 1Compounder (Compounder_v1, hc…) — ERC-4626
Level 3Level 2HarborYield / hyTOKEN — ERC-7575 share + doors
LevelUser flowContracts / shares
1Mint/buy ha/hs → deposit haTokens into collateral or Sail stability pool → claim rewards yourselfLive: SP v1/v2 compounding balances. SP_v3 hp… shares = yield branch only
2Deposit haXXX via ERC-4626 → hc…Compounder_v1 per pool
3Deposit via ERC-7575 door (wrappedCollateral or equivalent asset) → hyXXXHarborYield_v1 + HarborYieldEntry_v1
  • Level 1 (stability pools) is live on Ethereum mainnet. Levels 2 and 3 ship with Harbor Yield.
  • Compounder and HarborYield are siblings. Neither holds the other. HY holds collateral-pool positions directly, plus peg-equivalent ERC-4626 vaults.
  • One Compounder_v1 serves both pool kinds. Deploy ships two per market: collateral share hcXXX.COLn and Sail share hcXXX.hsCOLn. The Sail Compounder stays at level 2. HY does not register it (design doc §6.4).

Layer model (contracts)​

LevelComponentShare / assetRole
1Stability pools (live v1/v2; → v3 on yield branch)Live: compounding balances. hp… ERC-20 shares = v3-only / pre-prodBase yield / rebalance; manual claim
2CompounderNon-rebasing ERC-4626 hc…; asset = haXXXUsable per-pool compounding
3HarborYieldERC-7575 share hy… + per-holding doorsMulti-holding basket; doors reuse ERC-4626 mutations without a separate door ERC-20
—Harbor Swap—Routing support for level 3 (compound / redistribute), not a yield tier

Three levels, two sibling automation products.

Foundation contracts (harbor yield branch)​

PR #33 widens the data envelope and adds yield-facing hooks on the core stack:

ContractVersion on branchNotes
StabilityPoolv3ERC-20 pool shares (Solady + EIP-2612); floor clamps; clamp-then-fee withdrawals; still haToken deposits. Views drop the get prefix: earlyWithdrawalFeeRatio(), withdrawalWindow(), feeReceiver(). Live v2 keeps getEarlyWithdrawalFee() / getWithdrawalWindow()
StabilityPoolManagerv2Calls IYieldVault.compound() after harvest and rebalance. Branch config: rebalance bounty 0.5% and cut 0.5%, ceiling 200× aboutADollar; harvest bounty 0.5%, cut 99.5%. Live v1 is bounty-only at 1%
Minterv3MAX_LEVERAGE_RATIO = 100 (minimum CR ≈ 101.01%). A Sail-leg redeem below that floor reverts. Live Minter_v2 cap stays 20× at ≈ 105.3%

Upgrade path (mainnet)​

FieldValue
Scriptsscript/Upgrade_MarketsToV3_mainnet.s.sol, script/UpgradeStabilityPool_v2_v3/
StateContinues to use BaoFactory CREATE3 + harbor_v1.state.json patterns
Live statusTreat as pre-production until upgrades are executed

Level 2 / 3 product contracts (harbor-yield)​

ContractStandardRole
Compounder_v1ERC-4626One pool per deployment (collateral or Sail). compound() converts pending wrapped collateral into more of that pool. Extra rewards, including hs on a Sail pool, stay on claim()
HarborYield_v1ERC-7575 share (+ ERC-20)Peg basket; holds pools directly + equivalent vaults; vault(asset), redeemProportional, compound
HarborYieldEntry_v1ERC-7575 vault (ERC-4626 minus ERC-20)One door per holding; share() → hyXXX; door asset = wrappedCollateral or equivalent asset
WstETH_ERC4626_v1ERC-4626 adapterThin wrap so non-vault yield sources can be HY holdings
FieldValue
Collateral Compounder compound()Claims wCOLn (harvest and rebalance) → mint ha when the fee cap allows → redeposit
Sail Compounder compound()Same function, harvest wCOLn only. hs rebalance receipts stay per-holder and are taken with claim()
HY compound()Prices destinations it can read, end to end (swap + take); cheapest wins; water-fills. An unpriceable source pool sits the pass out with its yield still claimable. An unpriceable destination drops out of the round (1e9ce4c)
hy entry/exitERC-7575 doors — not a single ERC-4626 asset() on hyXXX
Harbor Swap useDirect routes on the hot path (minAmountOut, whole order). Velora (primary, on harbor-swap main) / 1inch (optional) on redistribute
Early-withdrawal fee (branch config)ConfigStabilityPool returns 5% (5e16), 1 hour delay, 25 hour window. Live main config is 1%. The v3 upgrade applies the branch figure

Deploy phasing still tracks Swap’s consumer/yield vault phase after Minter_v3 / SP_v3 / oracles / swap registry.

See also​

ResourceUse for
Harbor Yield (product)Three levels, UX
hy / ERC-7575Integrator standards surface
Harbor SwapRegistry, DEX executors, Velora
Stability poolLive v1/v2 pool behaviour (level 1)
Coverage auditPR / branch checklist
Zap contractsSeparate Maiden Voyage convenience (not HY)