Price Pools¶
Price Pools operate in a similar manner to a Bidirectional Automated Market Maker.
- If the market wants ETH, the pool takes DAI and increases the ETH to DAI price.
- If the market wants DAI, the pool takes ETH and decreases the ETH to DAI price.
The main difference is that there is a split buy-side and sell-side.
The best priced liquidity for each respective trading direction is accessed first.
This enables Price Pools to enforce price priority
.
Price Pools therefore allow users to undercut the current market price and receive priority for doing so.
In offloading a large position before a large market move, it would be ideal to slightly undercut the market price.
Price Pool Use Cases¶
Use Case #1: Quick Entry Alice wants to sell ETH from 2000 to 1980 DAI per ETH. The current price of ETH is 2000 DAI per ETH.
For this Price
position:
lower
bound would be 1980upper
bound would be 2000
The user would start offering up DAI to the market when the price of ETH is at 1980.
If this is the best price on the market, traders will naturally gravitate towards the Price Pool in order to source their liquidity.
This is great for large traders who are unwilling to accept slippage on the market, as they can wait until their liquidity is prioritized in order to capture the exact execution price they desire.
Mechanism to understand:
Choosing a Range Bound¶
Taking Profit¶
If you are seeking to take profit over some price range, Price Pools are ideal given all the liquidity traded into your position will be retained. The lower
and upper
bound will mark the starting and ending price across which your position will trade from the input token to the output token.
Seeking Entry¶
For users looking to fish entry points within some range, Price Pools can be utilized to set a range in which to enter your position. Due to the buy-and-hold nature of directional liquidity, users can retain any filled liquidity within their set range bounds.
Claiming Position Rewards¶
The way in which directional liquidity
tracks how much of the user's position has been filled is by using the value feeGrowthGlobalIn
. That is to say that we know the highest tick at which the user got filled at based on this value. If the accumEpochLast
of a given tick is higher than when the user minted their Position
, we know that tick has been reached since the user's position got opened. This is the crux of how Directional AMMs (DAMMs) work.