despite all the recent controversy surrounding horses and crypto, uniswap are a key pillar of defi, and paved the way for all other ammâs that we see today
this article tries to explain the workings behind the protocol, from v1 to v3, as well as the uni tokenâââletâs get started!Â
uniswap is an automated market maker launched in on the ethereum network in 2018, used for token exchange on ethereum unlike previous decentralized exchanges (dexs) such as etherdelta and 0x which used a order book model to facilitate trades, uniswap created a new design for trading whereby users traded with a pool of two assets, taking one asset out and putting the other into the pool this was a revolutionary technology, and allowed for deeper liquidity and smoother on-chain trading experience for users
cut out the stinky middleman!
v1 of the uniswap protocol was the proof of conceptâââlaunched at devcon 4 in november 2018 by hayden adams, a mechanical engineer turned developer.
at its core, the protocol was designed around ease-of-use, gas efficiency, censorship resistance, and zero rent extraction
users trade with a liquidity pool, as opposed to other tradersâââuniswap smart contracts hold liquidity reserves of various tokens, and trades are executed directly against these reserves.
each asset has one liquidity pool to ensure that liquidity is deep and not spread outâââasset / eth
how to add pools
each asset on uniswap v1 has a single liquidity pool with eth, to ensure that liquidity isnât fragmented across different pools. anyone can list an erc-20 token that isnât already available on the exchange using the uniswap factory, a smart contract that serves as both a factory and registry for uniswap exchanges.
anyone can also provide liquidity to these pools to earn a percentage of the fees generated!
adding liquidity
to add liquidity, you have to deposit an equivalent value of eth and the erc20 token into the erc-20 tokenâs exchange contract.
this means that if ethâs price is 1000 usdc, you have to deposit eth and usdc in the ratio 1Â : 1000
the first liquidity provider to enter a pool sets the starting exchange rate by depositing what they believe to be an equal value of eth and the erc-20 token.
if this exchange rate is stinky, arbitrage traders will bring the price back to market price at the expense of the lp
if you have multiple liquidity providers in a pool, how do you keep track of their positions?
liquidity provider tokens!
liquidity tokens
liquidity tokens are minted to track the relative proportion of total reserves that each liquidity provider has contributed
they are highly divisible and can be burned at any time to return a proportional share of the markets liquidity to the provide
the number of liquidity tokens minted is determined by the amount of eth sent to the function
it can be calculated using the equation:
amountMinted=totalAmount â (ethDeposited / ethPool)
depositing eth into reserves requires depositing an equivalent value of erc20 tokens as well
this is calculated with the equation:
tokensDeposited = tokenPool â (ethDeposited / ethPool)
anytime liquidity is added to the pool, k increasesâââthis will make sense later
lp tokens are pretty much an IOUâââshows that you have a stake in that specific pool
not only are they helpful for keeping track on different users positions, they also provide liquidity to the ecosystem
instead of having to remove your tokens from the pool, you can simply just sell the lp token to someone else since it is backed by the underlying deposits
further to this, lp tokens can be used elsewhere in defi in various protocols to gain a yield on them e.g. on maker!
removing liquidity
providers can burn their liquidity tokens at any time to withdraw their proportional share of eth and erc20 tokens from the pools
ethWithdrawn = ethPool â (amountBurned / totalAmounteth)
tokensWithdrawn= tokenPool â (amountBurned / totalAmount)
eth and erc20 tokens are withdrawn at the current exchange rate (reserve ratio), not the ratio of their original investment
this means some value can be lost from market fluctuations and arbitrageâââif they go ahead and withdraw IMPERMANENT LOSS made permanentÂ
:âââ(
fees taken during trades are added to total liquidity pools without minting new liquidity tokens Because of this, ethWithdrawn and tokensWithdrawn include a proportional share of all fees collected since the liquidity was first added
how assets are priced the pricing of assets in uniswap v1 is derived from the following function:
x * y = k
x is the amount of token a in the pool
y is the amount of token b in the pool
k is an invariant
AMMs that use this pricing mechanism are referred to as constant product AMMs
the term âconstant productâ refers to the fact that any trade must change the reserves in such a way that the product of those reserves remains unchanged
this function can be be plotted on a graph:

Letâs assume that token A is ETH, and token B is USDC, and that the starting price of ETH is 1000 USDC.
A big whale will create this pool, and they will choose to deposit a ratio of ETHÂ : USDC such that the price on this pool
In this pool, there is 1000 ETH and 1,000,000 USDCâââsubsequently the equation is as follows:
**Â x*y = k**Â
1000*1,000,000 = 1,000,000,000
Lets say we want to purchase ETH from the poolâââto offset us taking ETH out of the pool, we obviously have to pay in some USDC, nothing comes free :âââ(Â
But exactly how much ETH will we receive? Well we need to offset the ETH taken by adding USDC to the pool, such that k remains the same!
We use 10,000 USDC to purchase ETH:
(Amount of ETH in the poolâââamount of ETH taken out) * (Amount of USDC in the pool + 10,000 USDC added) = 1,000,000,000
So the amount of ETH taken out =
1,000âââ(1,000,000,000 / (1,000,000 + 10,000) )
= 9.90 ETH received
So even though ETHâs initial price was $1000, using 10,000 USDC only gives us 9.9 ETH
SLIPPAGEÂ :âââ((((((
okay how much slippage though?
(10â9.9 / 9.9)*100 =Â .999% slippage
After this trade, weâve moved up and to the left along the curve i.e. ETH is now more expensive in USDC terms
The pricing curve favours smaller trades i.e. thereâs less slippage
This is a pretty basic version, letâs take a look at a scenario where we include fees, say 0.3%
The fee is taken out of the asset which is entering the liquidity pool
So of the 10,000 USDC entering, 30 USDC is taken by the protocol in fees.
So amount of ETH:
1,000âââ(1,000,000,000 / (1,000,000 + 9970) )
= 9.87158034397 ETH
So we get less ETH, nice
But what happens to the fee?
This is added to the pool AFTER the transaction has been completed
letâs see what this means for k which is supposedly a constant?
after transaction we now have:
1000â9.87158034397 = 990.128419656 ETH
1,000,000 + 9970 + 30 = 1,010,000 USDC
so k = 990.128419656 * 1,010,000 = 1,000,029,703.85 which is LARGER than BEFORE?????
yes
assuming no liquidity providers are leaving the pool, k increases after every trade
this is because fees are entered back into the pool and spread across LPsâââno rent extraction
uniswap v2 was launched in may 2020, and sought out to address some of the short comings of v1 a lot of the underlying mechanisms were the same, such as how prices are calculated and lp tokens etc
***refinement ****
direct erc-20Â pairs in v1, each pair included eth as one of the currencies in the pool while this made routing simpler, and meant that liquidity wasn't as fragmented there were still issues:
if a user wanted to swap between two different erc20 tokens e.g. moving from link to usdc, they would have to place two separate trades
firstly link into eth, and then eth into usdc they'd be charged a 0.3% fee on both trades, compounding into a fee of 0.5991%
moreover, liquidity providers were forced to have exposure to eth in v1 this meant that they were exposed to impermanent loss as the erc-20 token that they were providing liquidity for changed price relative to eth
in v2, liquidity providers can create pair contracts for any two erc-20 tokens
a proliferation of pairs between arbitrary erc-20s could make it somewhat more difficult to find the best path to trade a particular pair, but routing can be handled at a higher layer
**flash swaps ** in v1 to purchase A using B, you would first have to send B to the contract before you could receive A
this isn't ideal if the user needs A that they are buying, to obtain the B which they are paying with
for example, user may be taking A to purchase Y in some other contract to arb a price difference from uniswap, or unwinding a position on another defi protocol by selling collateral to repay uniswap
this is where flash swaps come in
in v2, flash swaps allow a user to receive an use an asset before paying for it, as long as they make the payment within the same atomic transaction
allows anyone to take advantage of arbitrage opportunities, not just big players
makes market more efficient
this is best explained with an example
say there are two eth / dai poolsâââone on uniswap, and one on sushiswap
the price of eth on uniswap is 1000 dai, and on sushiswap 1100 dai
i am a brokie so have no starting capital, however i want to make use of this arb opportunity
i flash swap 10 eth from uniswap pool, send the coins to sushi, swap for 11000 dai, send the dai back to uniswap and pay the 10000 dai back for the swap (plus 0.3% fees) and net the remaining 10000 dai!
initialisation of lp token supply
we know how lp tokens are minted when lps deposit into an existing pool but what about the first depositor to a pool?
in v1, the initial share supply was equal to the amount of eth deposited, in wei this meant that if initial liquidity was deposited at the 'correct' market price, then 1 lp token would be worth 2 eth
however, this meant that the value of a liquidity pool share was dependent on the ratio at which liquidity was deposited initially, which there is no guarantee that this is the true price
further, v2 supports erc-20 to erc-20 pairs so this wouldn't work to fix this, v2 initially mints shares equal to the geometric mean of the amounts deposited:
sminted =â(x deposited ¡ y deposited)
**fee switch ** v2 also includes a protocol fee of 0.05% which can be turned on and off
this means that LPs get 0.25% should the switch be turned on, and the protocol treasury itself 0.05% uniswap treasury now at ~ $3.2 b, biggest in defi by a very large margin:

**wrapped eth ** eth was created before the erc-20 token standard, and so doesn't have the exact same properties as erc-20 tokens
this makes it more difficult to build protocols using eth as it is
that's why we have wrapped eth (weth) as a result, many protocols do not support eth, and instead support weth
in v1, using eth directly made sense since each pair included eth in the pool however in v2, since we have direct erc-20â-âerc20 it no longer makes sense to support native eth, as it would double the size of the core code base and cause liquidity to be fragmented between eth and weth pairs
**not necessary but kinda interestingâ-âprice oracle ** marginal price at time t can be computed by the ratio of reserve asset A to the ratio of asset B

since arbitrageurs will trade with uniswap if this price is incorrect (by a sufficient amount to make up for the fee), the price offered by uniswap tends to track the relative market price of the assets
in v1 however, not safe to use as an onchain price oracle because it's easy to manipulate
how?â-âexample using eth / dai pool
an attacker who wants to manipulate price can buy eth from the pool, increasing price in eth / dai
trigger on settlement of derivate contract on some other platform (because of inflated price) and then sell the eth back to dai at true price
could even be done in a single atomic transaction, or by a miner who controls the ordering of transactions within a block
v2 tries to improve price oracle functionality by measuring and recording the price before the first trade in each block (or equivalently after the last trade in the previous block)
this price is more difficult to manipulate that prices in the middle of the block
why?
if the attacker submits a transaction that attempts to manipulate the price at the end of a block, some other arbitrageur may be able to submit another transaction to trade back immediately afterward in the same block
a miner could manipulate the price at the end of the block, but unless they mine the next block as well, they may not have a particular advantage in arbitraging the trade back
more specifically, v2 accumulates this price, by keeping track of the cumulative sum of prices at the beginning of each block in which someone interacts with contract
each price is weighted by the amount of time that has passed since the last block in
which it was updated, according to the block timestamp
this means that the accumulator value at any given time (after being updated) should be the sum of the spot price at each second in the history of the contract
uni token was launched in september 2020â-â contract address: 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984
was airdropped to uniswap users
governance token
1 billion supply
60% to uniswap community members
21.266% to team members and future employees with 4-year vesting
18.044% to investors with 4-year vesting
0.69% to advisors with 4-year vesting


