Flash Swaps

ETC Swap flash swaps allow you to withdraw up to the full reserves of any ERC20 token on ETC Swap and execute arbitrary logic at no upfront cost, provided that by the end of the transaction you either:
  • pay for the withdrawn ERC20 tokens with the corresponding pair tokens
  • return the withdrawn ERC20 tokens along with a small fee
Flash swaps are incredibly useful because they obviate upfront capital requirements and unnecessary order-of-operations constraints for multi-step transactions involving ETC Swap.


Capital Free Arbitrage

One particularly interesting use case for flash swaps is capital-free arbitrage. It's well-known that an integral part of ETC Swap's design is to create incentives for arbitrageurs to trade the ETC Swap price to a "fair" market price. While game-theoretically sound, this strategy is accessible only to those with sufficient capital to take advantage of arbitrage opportunities. Flash swaps remove this barrier entirely, effectively democratizing arbitrage.
Imagine a scenario where the cost of buying 1 ETC on ETC Swap is 200 USDC (which is calculated by calling getAmountIn with 1 ETC specified as an exact output), and on Hebe Swap (or any other trading venue), 1 ETC buys 220 USDC. To anyone with 200 USDC available, this situation represents a risk-free profit of 20 USDC. Unfortunately, you may not have 200 USDC lying around. With flash swaps, however, this risk-free profit is available for anyone to take as long as they're able to pay gas fees.

Withdrawing ETC from ETC Swap

The first step is to optimistically withdraw 1 ETC from ETC Swap via a flash swap. This will serve as the capital that we use to execute our arbitrage. Note that in this scenario, we're assuming that:
  • 1 ETC is the pre-calculated profit-maximizing trade
  • The price has not changed on ETC Swap or Hebe Swap since our calculation
It may be the case that we'd like to calculate the profit-maximizing trade on-chain at the moment of execution, which is robust to price movements. This can be somewhat complex, depending on the strategy being executed. However, one common strategy is trading as profitably as possible against a fixed external price. (This price may be e.g., the average execution price of one or more orders on Hebe Swap.) If the ETC Swap market price is far enough above or below this external price, the following example contains code that calculates the amount to trade over ETC Swap for maximum profit: ExampleSwapToPrice.sol.

Trade at External Venue

Once we've obtained our temporary capital of 1 ETC from ETC Swap, we now can trade this for 220 USDC on Hebe Swap. Once we've received the USDC, we need to pay ETC Swap back. We've mentioned that the amount required to cover 1 ETC is 200 USDC, calculated via getAmountIn. So, after sending 200 of the USDC back to the ETC Swap pair, you're left with 20 USDC of profit!

Instant Leverage

Flash swaps can be used to improve the efficiency of levering up using lending protocols and ETC Swap.
Consider Maker Classic in its simplest form: a system which accepts ETC as collateral and allows cDAI to be minted against it while ensuring that the value of the ETC never drops below 150% of the value of the cDAI.
Say we use this system to deposit a principal amount of 3 ETC, and mint the maximum amount of cDAI. At a price of 1 ETC / 200 cDAI, we receive 400 cDAI. In theory, we could lever this position up by selling the cDAI for more ETC, depositing this ETC, minting the maximum amount of cDAI (which would be less this time), and repeating until we've reached our desired leverage level.
It's quite simple to use ETC Swap as a liquidity source for the cDAI-to-ETC component of this process. However, looping through protocols in this way isn't particularly elegant, and can be gas-intensive.
Luckily, flash swaps enable us to withdraw the full ETC amount upfront. If we wanted 2x leverage against our 3 ETC principal, we could simply request 3 ETC in a flash swap and deposit 6 ETC into Maker Classic. This gives us the ability to mint 800 cDAI. If we mint as much as we need to cover our flash swap (say 605), the remainder serves as a safety margin against price movements.

Developer resources

Last modified 9mo ago