Single-side Staking

# Context

One of the key adjustments made was to support single-sided staking as opposed to the commonly utilized pair-based staking popularized by Uniswap. In most AMMs currently deployed, liquidity provision has to be done by providing equal value of liquidity on both sides. As an example, in the case of adding liquidity to a pool of Token A and ETH, if the price of Token A is half of ETH’s then liquidity providers will have to put up twice as much Token A as compared to ETH to ensure that the pool remains balanced and token pricings are unchanged.

# Challenges

The requirement to stake both tokens in a pair increases exposure for the liquidity provider, who now has to manage two different assets as opposed to just Token A. This also doubles the capital requirement or halves the position for Token A.
Even if the protocol does not strictly require staking in both sides of a pair, such as in the pool-based structure of Curve, liquidity providers will inevitably be exposed to risk of failures of the other tokens in a pool. As an example, a stablecoin losing its peg in a Curve pool will result in the entire pool being under-collateralised. This is not the case in a true single-side staking model where the risk is isolated to a single token.

# Approach

Centaur Swap proposes a structure where pools represent individual assets as opposed to pairs and would enable liquidity providers to stake their assets without requiring a counter-balance of equivalent value. The total amount of assets staked by all liquidity providers (the "Target Balance") will be recorded and used as a target for each asset pool. As traders exchange from one token to another, the balance of the pools will adjust over time (the "Current Balance") and result in a surplus or deficit of each pool.
Token prices are derived upon trade execution by aggregating the value of each asset in USDT, ETH or any other pairs they have in common (the "External Price") against external data sources such as market data oracles and routing it through a function that accounts for the Target Balance and Current Balance, which encourages users to trade in the direction that helps to re-balance the different pools.
The above curve is plotted for the function:
$y=-kx^3 + i$
Where y refers to the price of the token on Centaur Swap (the "Internal Price"), k refers to a coefficient that impacts the steepness of the curve, x refers to the Current Balance and i refers to the External Price provided by oracles.
Based on the function above, when traders sell tokens, the Current Balance of the pool increases which results in a Surplus of tokens. A discount would then be applied to incentivise traders/arbitrageurs to buy more of those tokens and help to re-balance the pool to its Target Balance. If traders are buying up tokens, the pool will instead enter into a Deficit of tokens and a premium would be applied instead, which encourages selling of the tokens. The amount of discount or premium would vary according to the degree of Surplus or Deficit.