# Asymmetric liquidity add
The Sifchain Liquidity Provider system supports asymmmetric liquidity addition and removal. Liquidity Providers will be able to add $s$ Rowan to an exisiting liquidity pool without requiring any M-tokens or add $m$ M-tokens to an exisiting liquidity pool without requiring any Rowan. Likewise, they would be able to remove $s$ Rowan without M-tokens or remove $m$ M-tokens without Rowan.
To support this process, we propose a composite mechanism that utilizes two existing primary mechanisms - **Add or Remove Liquidity** and **Swap**.
The **Add or Remove Liquidity** mechanism supports symmetric additions and removals, i.e the Liquidity Provider would need to send both $s$ Rowan and $m$ M-tokens in a specific ratio in order to add liquidity. Similarly, the liquidity provider would receive both $s$ Rowan and $m$ M-tokens in a specific ratio when removing liquidity.
We compose a composite **Asymmetric Liquidity Add or Remove** mechanism that first performs a **Swap** to obtain the complementary token and uses it to **Add or Remove Liquidity** in a symmetric fashion. To the user, this would appear to be an **Asymmetric Liquidity Add or Remove** as all the intermediate steps are executed in the back end.
## Asymmetric Liquidity Add
A liqudity provider wants to add $s= {\Delta \mathbf S}$ Rowan to an exisiting liquidity pool.
The liquidity provider does not provide any M-token to perform this action, thus making it an asymmetric liquidity add.
$$
m = {\Delta \mathbf M} =0
$$
The next state after this $s$ Rowan has been added should be:
$$
\mathbf S^+ = \mathbf S+s\\
\mathbf M^+ = \mathbf M
$$
To accomplish the asymmetric liqudity add usign the symmetric **Add Liquidity** and **Swap** methods, we partition $s$ as follows:
$$
s = s_{swap} + s_{add} + dust \\
s_{swap} = \mu s\\
s_{add} = (1-\mu) s
$$
where $\mu$ is the curvature
such that
$$m_{swap} = f(s_{swap}, \mathbf S, \mathbf M)\\
m_{add} = (\mathbf M-m_{swap}) \frac{s_{add}}{\mathbf S+s_{swap}}$$
We know that
$$ \mathbf M^+ = \mathbf M - m_{swap} + m_{add} = \mathbf M$$
For this to hold true,
$$m_{swap} = m_{add}$$
Substituting $m_{swap} = f_{swap}(s_{swap}, \mathbf S, \mathbf M)$ and $m_{add} = (\mathbf M-m_{swap}) \frac{s_{add}}{S+s_{swap}}$ to represent all references to $m$ in terms to $s$, we get
$$m_{swap} = f_{swap}(s_{swap}, \mathbf S,\mathbf M) = (M-f_{swap}(s_{swap}, \mathbf S, \mathbf M)) \frac{s_{add}}{\mathbf S+s_{swap}}$$
Next, we solve for $s_{swap}$ in terms of the parametrized swap fee $f_{swap}$. The general form of the parametrized swap fee is given by
$$y = f_{swap}(x, \mathbf X,\mathbf Y) = \lambda_l\frac{\mathbf x \mathbf{Y}}{x +\mathbf{X}}\left(1 - \frac{\mathbf{X}}{(x+\mathbf{X})} \right) $$
Plugging in
- $m_{swap} = f_{swap}(s_{swap}, \mathbf S,\mathbf M) = \lambda_l\frac{s_{swap} \mathbf{M_L}}{s_{swap}+\mathbf{S_L}}\left(1 - \frac{\mathbf{S_L}}{(s_{swap}+\mathbf{S_L})} \right)$
- $m_{add} = (\mathbf M-m_{swap}) \frac{s_{add}}{S+s_{swap}}$ we get
$$
\lambda_l\frac{s_{swap} \mathbf{M_L}}{s_{swap}+\mathbf{S_L}}\left(1 - \frac{\mathbf{S_L}}{(s_{swap}+\mathbf{S_L})} \right) = \left\{\mathbf M-\left[\lambda_l\frac{s_{swap} \mathbf{M_L}}{s_{swap}+\mathbf{S_L}}\left(1 - \frac{\mathbf{S_L}}{(s_{swap}+\mathbf{S_L})} \right)\right]\right\} \frac{s_{add}}{\mathbf S+s_{swap}}
$$
We have solved for $s_{swap}$ using the Wolfram Solvers below.
[Wolfram Solver 1](https://www.wolframalpha.com/input/?i=solve+for+x+in+L*%28%28x*M%29%2F%28x%2BS%29%29*%281-%28S%2F%28x%2BS%29%29%29+%3D+%7BM+-+%5BL*%28x*M%2F%28x%2BS%29%29*%281-%28S%2F%28x%2BS%29%29%29%5D%7D*%5By%2F%28x%2BS%29%5D) where $x = s_{swap}, y = s_{add}, M = \mathbf M_L, S = \mathbf S_L$ and $L = \lambda_l$
[Wolfram Solver 2](https://www.wolframalpha.com/input/?i=solve+for+x+in+L*%28%28x*M%29%2F%28x%2BS%29%29*%281-%28S%2F%28x%2BS%29%29%29*%281%2B%28y%2F%28x%2BS%29%29%29+%3D+%7BM*%5By%2F%28x%2BS%29%5D%7D) where $x = s_{swap}, y = s_{add}, M = \mathbf M_L, S = \mathbf S_L$ and $L = \lambda_l$
Thus we have decomposed $s = s_{swap} + s_{add}$.
The resulting composition also satisifies $m_{swap} = m_{add}$.
This gives the next state:
$$
\mathbf S^+ = \mathbf S+\mu s+(1-\mu)s = \mathbf S+s_{swap}+s_{add}\\
\mathbf M^+ = \mathbf M - m_{swap} + m_{add} = \mathbf M
$$
where
$$\mu = \frac{s_{swap}}{s}$$
Psuedo-code:
```
def asymmetric_liquidy_add(s):
Step 1: Solve for pre_s_swap = s_swap + dust
Step 2: Swap s_swap for m_swap
Step 3: Symmetric liquidity add (s-s_swap, m_swap)
```
## Asymmetric Liquidity Remove
A liqudity provider wants to remove $s= {\Delta \mathbf S}$ Rowan from an exisiting liquidity pool.
The liquidity provider does not provide any M-token to perform this action, thus making it an asymmetric liquidity remove.
$$
m = {\Delta \mathbf M} =0
$$
The next state after this $s$ Rowan has been removed should be:
$$
\mathbf S^+ = \mathbf S-s\\
\mathbf M^+ = \mathbf M
$$
To accomplish the asymmetric liqudity remove using the symmetric **Remove Liquidity** and **Swap** methods, we partition $s$ as follows:
$$
s_{swap} = \omega s\\
s_{rem} = (1-\omega) s
$$
where $\omega$ is the fraction of the liquidity stake being burned.
$$\omega = s_{rem}/\mathbf S$$
In the case of a symmetric liquidity remove, the liquidity provider would get $s_{rem}$ and $m_{rem}$ after the remove
$$
s_{rem}=\omega \mathbf S\\
m_{rem}=\omega \mathbf M
$$
making the next state
$$
\mathbf S^+ = (1-\omega)\mathbf S\\
\mathbf M^+ = (1-\omega)\mathbf M
$$
For the remove to be assymetric, we need to satisfy the condition $$\mathbf M^+ = \mathbf M$$ For this, we require $m_{swap} = m_{rem}$, so that $$\mathbf M^+ = \mathbf M - m_{rem} + m_{swap} = \mathbf M$$
So we define $$m_{swap} = m_{rem} = \omega M$$
Therefore, the liquidity provider receives $s$ Rowan after the asymmetric liquidity remove
$$s = s_{rem} + s_{swap}$$
where
$$s_{swap} = f(m_{swap}, \mathbf S^+, \mathbf M^+) = f(m_{swap}, (1-\omega)\mathbf S, (1-\omega)\mathbf M)$$
We know that the parametrized swap fee $f_{swap}$ is
$$s_{swap} = f_{swap}(m, \mathbf {M_L},\mathbf {S_L}) = \lambda_l\frac{ m \mathbf{S_L}}{ m+\mathbf{M_L}}\left(1 - \frac{\mathbf{M_L}}{{m}+\mathbf{M_L}} \right) $$
Expressing the parametrized swap fee as a function of $m$ being $m_{swap}$ with
- $\mathbf {S_L}$ being $(1-\omega)\mathbf S$
- $\mathbf {M_L}$ being $(1-\omega)\mathbf M$
we have
$$
f(m_{swap}, (1-\omega)\mathbf S, (1-\omega)\mathbf M) = \lambda_l\frac{m_{swap} (1-\omega)\mathbf S}{m_{swap}+(1-\omega)\mathbf M}\left(1 - \frac{(1-\omega)\mathbf M}{{m_{swap}}+(1-\omega)\mathbf M} \right)
$$
This is $s_{swap}$, since $s_{swap} = f(m_{swap}, (1-\omega)\mathbf S, (1-\omega)\mathbf M)$
$$
s_{swap} = \lambda_l\frac{m_{swap} (1-\omega)\mathbf S}{m_{swap}+(1-\omega)\mathbf M}\left(1 - \frac{(1-\omega)\mathbf M}{{m_{swap}}+(1-\omega)\mathbf M} \right)
$$
But since the liquidity provider has put $m_{swap} = m_{rem}$ back into the pool via the Swap mechanism the total state change is actually
$$
\mathbf S^{++} = \mathbf S - s_{rem} - s_{swap} = = \mathbf S-\omega \mathbf S - f(m_{swap}, \mathbf S^+, \mathbf M^+)\\
\mathbf M^{++} = \mathbf M - m_{rem} + m_{swap} = \mathbf M
$$
Psuedo-code:
```
def asym_liquidy_rem(w):
Step 1: Symmetric liquidity remove of w => (s_rem,m_rem)
Step 2: Then Swap m_rem for s_swap
Step 3: total liqudity removed = s_rem + s_swap
```
---------
---------
---------
NOTES
---------
Quantity of tokens to add to the Liquidity $s=\Delta S$, with $m = \Delta M =0$. This 'net' state change:
$$
S^+ = S+s\\
M^+ = M
$$
how can we accomplish this with the swamp and existing symmetric liquidity add method?
Partition $s$ as follows:
$$
s_{swap} = \mu s\\
s_{add} = (1-\mu) s
$$
such that
$m_{swap} = f(s_{swap}, S, M)$
and
$m_{add} = (M-m_{swap}) \frac{s_{add}}{S+s_{swap}}$
recalling that
$M^+ = M - m_{swap} + m_{add} = M$
we require that
$m_{swap} = m_{add}$
therefore
$f(s_{swap}, S, M) = (M-f(s_{swap}, S, M)) \frac{s_{add}}{S+s_{swap}}$
---
$f(s_{swap}, S, M) = (M-f(s_{swap}, S, M)) \frac{S-s_{swap}}{S+s_{swap}}$
ATTN: we need to solve for $s_{swap}$
---
if we were to plug in our specific fee rule we could knock out $f(\cdot, S, M)$ abstraction and simplify analytically.
What is that we have decomposed $s = s_{swap} + s_{add}$ and the resulting composition also satisifies $m_{swap} = m_{add}$.
clarify
$\mu = \frac{s_{swap}}{s}$
Psuedo-code:
```
def asym_liquidy_add(s):
solve for s_swap
swap s_swap for m_swap
symmetric liquidity add (s-s_swap, m_swap)
```
## consider asymmetric liquidity removal
$$
S^+ = S-s\\
M^+ = M
$$
there some fraction of the LP stake being burned $\omega$
as the liquidity remover I would get
$s_{rem}= \omega S$
$m_{rem}= \omega M$
and the systems posterior state would be
$S^+ = (1-\omega)S$
$M^+ = (1-\omega)M$
BUT we need to compose with a swap in order to receive only tokens of type s.
so define $m_{swap} = m_{rem} = \omega M$ and therefore my actually take is:
$s = s_{rem} + s_{swap}$
where
$s_{swap} = f(m_{swap}, (1-\omega)S, (1-\omega)M)$
but since i've put $m_{swap} = m_{rem}$ back into the pool via the swap mechanism the total state change is actually
$$
S^{++} = S - \omega s - s_{swap} = S-\omega s - f(m_{swap}, S^+, M^+)\\
M^{++} = M = M - m_{rem} + m_{swap}
$$
Psuedo-code:
```
def asym_liquidy_rem(w):
symmetric liquidity remove of w => (s_rem,m_rem)
then swap m_rem for s_swap
total out = s_rem + s_swap
```