Gully Core

Build

Vaults

Put both tokens of a pool in a vault and it keeps your liquidity concentrated around the price for you. It follows the pool's average price, never the spot price.

What a vault is

A managed vault holds one concentrated-liquidity position, in one Gully Core CL pool, for everyone who deposits in it. You deposit both tokens of the pool and receive shares. Your shares are your part of everything the vault holds, in both tokens. The trading fees the position earns are added back to it, so they grow with your shares.

  • A strategy frozen at creation. The range width, how far the price may stray before the vault re-centres, the averaging window and the minimum time between moves are written once when the vault is created. Nobody can change them afterwards, not even its creator.
  • No admin path to your tokens. A vault has no owner, no pause and no upgrade. Its creator (the curator) can only claim its own fee and hand that role on.
  • Native or ERC-20. Either token may be the chain's native coin. On Anubis the gas coin cannot be sent as a value, so pools there quote in DAI.

How it follows the price

The range is centred on the pool's price oracle: a time-weighted average that one trade cannot move. The spot price never decides where liquidity goes. Two calls keep a vault running. Anyone may make them. Each does only what the vault's own rules allow, so whoever calls gets the same result.

CallWhat it doesWhen it is refused
rebalance()Takes the liquidity out and places it again, centred on the average price, in one step. The vault never swaps.Before the cooldown has passed. When the oracle does not answer. When the spot price is further from the average than the vault's deviation guard allows. When the average has not moved far enough from the centre.
harvest()Collects the trading fees, takes the performance fees from them, and adds the rest back to the current range.Never for an oracle reason. If the oracle or the deviation guard says no, the fees wait in the vault until the next harvest or rebalance.

Bounds every vault's strategy must fit:

SettingBounds
Averaging window10 minutes to 24 hours (and never under the oracle's own minimum)
Deviation guard (spot against the average)at most 2,000 ticks (about 20%) and at most half the range's half-width
Cooldown between rebalances10 minutes to 7 days
Range half-widthone tick spacing to 400,000 ticks

Withdraw at any time

A withdrawal burns your shares and pays your part of the position and of the tokens waiting in the vault, in both tokens. It does not read the oracle, does not wait for the cooldown and cannot be paused. A vault refuses, at creation, any pool whose hook could act when liquidity is removed, so no hook can stand between you and your withdrawal.

Deposits and withdrawals are pro rata. You buy or redeem the same fraction of everything the vault holds, so no price enters the share calculation and moving the pool's price cannot mint you more shares. You set the most you will pay on a deposit and the least you will accept on a withdrawal.

Fees

FeeHow muchPaid from
Deposit or withdrawalNonenone
Management fee on your tokensNonenone
Protocol performance feeset on the vault factory and read from the contract (performanceFeeBps()). It can never exceed 20%the trading fees a harvest collects, never your deposit
Curator fee0 to 20%, chosen by the vault's creatorthe trading fees a harvest collects, never your deposit
Creating a vaultone flat fee in the native coin (about $5-equivalent), read from the factory (feeWei())the creator, once

Both performance fees are frozen into a vault when it is created. A later change to the protocol fee applies only to new vaults. An increase takes effect only after a 7-day notice, a decrease at once. The protocol's share is paid only to the governance Safe.

Risks

  • Impermanent loss. A concentrated position earns more fees while the price stays in range and loses against simply holding the two tokens when the price moves away. A vault re-centres, but it cannot undo a move. This is the product, not a fault.
  • Only pools with an oracle. A vault needs a pool born on an oracle hook, its own pool or another pool of the same pair. A thin pool's average is still a thin pool's price.
  • Not audited. No independent audit has reviewed the vault contracts yet.
  • Token behaviour. Fee-on-transfer tokens are refused and rebasing tokens are not supported. A token that blocks the vault's address would block that token's withdrawals, and no contract can prevent that.
  • The first deposit. 1,000 shares of the first deposit are locked forever (at most 0.1% of it), which stops anyone inflating the share price.

Create a vault

  1. Pick a CL pool whose average price Gully Core's price oracle records: a pool born on an oracle hook, or any pool of the same pair next to one, naming that pool as its oracle (see which pools have an oracle). A pool whose hook could act when liquidity is removed is refused.
  2. Choose the strategy: range width, deviation guard, the change in the average that triggers a rebalance, averaging window, cooldown, and your curator fee. The SDK's vaults.defaultVaultConfig gives a starting point and vaults.validateVaultConfig checks it against the contract's bounds.
  3. Send vaults.buildCreateVault with the creation fee. You become the curator. Anything above the fee is refunded.
  4. Make the first deposit, which places the first range around the average price.

Where vaults are

The vault factory (GullyCoreVaultFactory) address for each chain is in Contracts. A chain shows no address until a vault factory is deployed there. See Chains.

Wrong or missing? Tell us at @Gully_Labs.