Back in February I wrote about a relatively under-researched phenomenon: just-in-time (JIT) liquidity. I recommend reading that first for more context on this subject, as this will build upon the concepts in that piece and dive a bit deeper. For those in a rush, below is a brief explanation of how JIT works.
Imagine there is $1,000 of liquidity concentrated in a $0.01 price range. As a liquidity provider (LP), I see that someone has submitted a swap of $100 worth of token x for token y, which will incur a fee of $1. Within the same block, I add $9,000 of liquidity ($4,500 of each token) in that small range, which now represents 90% of liquidity in the range. This means I will receive 90% of the $1 fee, leaving the passive LPs with just 10 cents compared to my 90 cents. I then remove my deposited liquidity, albeit with a slightly different token makeup; now I have $4,501 of token x and $4,499 of token y (this breakdown depends on how much price moved), plus fees earned, less gas fees and MEV cost.
Below is how it looks in practice, showing a few hours of liquidity events in the largest Uniswap V3 wETH-USDC pool:
JIT transactions are colored in orange, while regular transactions are in blue. The crosshairs represent a mint and burn of the same USD value in the same block. It’s immediately clear that JIT transactions are significantly larger than regular transactions, generally with a minimum size of $10mn. Note the small orange dot just a bit after 3pm; this was an unusual JIT transaction because it is both much smaller and uses a wider price range (2 ticks instead of 1), allowing for more impermanent loss. Having looked at some of these smaller transactions, it appears that many of them are tests of new JIT strategies.
impermanent loss
Despite JIT transactions necessarily occurring in a single block, they are still subject to impermanent loss, albeit on a much shorter timeframe than we’re used to. An interesting pattern also emerges when looking at how the wallets are conducting transactions; all of the top wallets have opted to use strategies that prioritize ending a transaction with more ETH at the expense of USDC.
The top wallet – which I’ll detail more in the next section – net 50k ETH and lost 100mn USDC in the span of five months, not including the swap fees it earned. Essentially, JIT LPs strongly prefer to receive more of the volatile asset at the expense of the stable asset, meaning they also prefer to operate in blocks where ETH’s price is decreasing; as ETH’s price falls LPs receive relatively more ETH and less USDC.
Using this we can estimate the wallet’s non-fee profits by taking the difference between the amount a wallet mints and burns (for example, minting 100 USDC and 0.1 ETH and burning 90 USDC and 0.11 ETH, netting -10 USDC and 0.01 ETH) and then applying cross prices to the returns. Below is the distribution of JIT transactions in the main Uniswap V3 wETH-USDC pool by quarter.
The vast majority of JIT transactions are clustered between $20mn and $40mn (there are also the small test transactions I mentioned earlier), earning very minimal non-fee profits; it’s quite rare for a JIT transaction to profit more than $5k. However, as another paper found, for JIT LPs these “portfolio change” profits often contribute more to JIT LP income than fees do.
Thus JIT LPs are only able to effectively manage risk and operate in pools that contain a stablecoin like USDC. I had assumed that JIT LPs would be extremely active during USDC’s depeg, one of the highest volume days of the year with plenty of opportunities to earn swap fees. Instead, it was the one of lowest JIT volume days of the year at under $75mn, compared to $3.5bn just the day before. It was also one of the few days of the year when non-JIT volume was higher than JIT volume as regular LPs rushed to cut their exposure to USDC.