Dev docs
Search
K

The math behind sPMM

Synthetic Proactive Market Making (sPMM)

sPMM is the core algorithm powering the WOOFi Swap, which provides the best way to simulate a CEX order book in a DEX liquidity pool.
The sPMM works as follows:
WOOFi Swap gets the order book data from the centralized exchange and estimates a trade price using mid-price, spread and slippage. Define mid-price 
p0p_0
and spread 
ss
:

p0=(pbid+pask)/2p_0=(p_{bid}+p_{ask})/2
s=(paskpbid)/p0s=(p_{ask}-p_{bid})/p_0
If a user wants to buy the minimum amount of base tokens, the executed price will be:

p=pask=p0(1+s/2)p=p_{ask}=p_0*(1+s/2)
We defien
ΔQ\Delta Q
as the amount of quote token and
ΔB\Delta B
as the amount of base token. If a user wants to buy more base tokens, slippage will be applied and the average buy price will be:

p=ΔQ/ΔB=pask(1+slippage)p=\Delta Q/\Delta B=p_{ask}*(1+slippage)
Slippage is determined by overall market liquidity across centralized exchanges. Generally speaking, if a user trades two orders of one pair with the same USD notional value, they should have similar slippage. Assuming that quote token is a USD stable coin, we can define the liquidity coefficient
kk
:

k=slippage/ΔQk=slippage/\Delta Q
The average buy price is:

p=ΔQ/ΔB=pask(1+kΔQ)p=\Delta Q/\Delta B=p_{ask}*(1+k*\Delta Q)
We can get the sell price in the same way. The final formula is:
  • Basic sell function:

sellBase(ΔB)=ΔQ=ΔBp/(1+kΔBp)sellBase(ΔB) = ΔQ = ΔB * p / (1+k*ΔB*p)
  • Basic buy function:

sellQuote(ΔQ)=ΔB=ΔQp1/(1+kΔQ)sellQuote(ΔQ) = ΔB = ΔQ * p^{-1} / (1 + k*ΔQ)
In the situation that one user sells some base tokens and another user wants to take the other side of the trade, AMMs apply the inverse of the sell base function to calculate how many quote tokens to be sent to the user, which means the liquidity provider has to pay negative slippage to the arbitrageur to bring the balance of the pool back. WOOFi Swap provides more flexibility in the rebalance strategy by adjusting the rebalance coefficient 
r(0r1)r (0\leq r\leq 1)
. When
r=1r=1
 the full slippage will be paid to the arbitrageur, and when 
r=0r=0
no slippage will be paid:
  • Reverse sell function:

reverseSellBase(ΔB)=ΔBp/(1kΔBpr)reverseSellBase(\Delta B) = \Delta B * p / (1-k*\Delta B*p*r)
  • Basic buy function:
reverseSellQuote(ΔQ)=ΔQp1/(1kΔQr)reverseSellQuote(\Delta Q) = \Delta Q * p^{-1} / (1 - k * \Delta Q * r)

Custom On-chain Price Feed

Oracle providers, such as Chainlink, have become key infrastructure of the DeFi ecosystem by pushing off-chain price data on-chain. However, in order to simulate the order book from centralized exchanges without sacrificing capital efficiency, more data than just price are needed. Along with the sPMM algorithm, WOOFi Swap uses a custom on-chain price feed that contains multiple parameters i.e. mid-price
pp
, spread
ss
, and liquidity coefficient
kk
. This allows WOOFi Swap to accurately reflect the order book of the centralized liquidity source and provide competitive price quotes for traders.
The mid-price
pp
is updated at 0.1% price deviation to provide a much more granular price quote on-chain. The spread
ss
and liquidity coefficient
kk
are time-weighted average values using historical data, so they are updated less frequently but can be updated immediately if market volatility rises.