WEB3DEV

Cover image for Dia 90/100: Arbitragem de Troca Relâmpago na DeFi Uniswap V3
Panegali
Panegali

Posted on

Dia 90/100: Arbitragem de Troca Relâmpago na DeFi Uniswap V3

#100DiasDeSolidity 090 DeFi: Arbitragem de Troca Relâmpago (Flash Swap) da Uniswap V3

Bem-vindo de volta à série 100 Dias de Solidity, onde mergulhamos profundamente no mundo dos contratos inteligentes e finanças descentralizadas (DeFi).

#100DiasDeSolidity 090 DeFi: Arbitragem de Troca Relâmpago da Uniswap V3

Na edição de hoje, vamos explorar um tópico interessante: "Arbitragem de Troca Relâmpago Uniswap V3."

Me compre um café

Compreendendo a Troca Relâmpago

As trocas relâmpago são uma inovação fascinante no mundo DeFi. Elas permitem que os usuários emprestem ativos de um pool de empréstimos sem fornecer garantias, desde que paguem a quantia emprestada de volta dentro da mesma transação. Isso abre um mundo de possibilidades para pessoas que fazem arbitragens e traders que procuram explorar discrepâncias de preços em diferentes bolsas descentralizadas.

Neste artigo, vamos nos concentrar da Uniswap V3, uma das bolsas descentralizadas mais populares, e explorar como você pode usar trocas relâmpago para realizar arbitragem. Mas lembre-se de que este é um guia técnico, então vamos nos aprofundar nos detalhes essenciais.

Pré-requisitos

Antes de entrarmos no código, aqui estão alguns pré-requisitos:

  • Compreensão básica de Solidity e contratos inteligentes Ethereum.

  • Familiaridade com a Uniswap V3.

  • Acesso a um ambiente de desenvolvimento (por exemplo, Remix, Truffle ou Hardhat).

Como Funcionam as Trocas Relâmpago

As trocas relâmpago são impulsionadas por contratos inteligentes que permitem aos usuários emprestar ativos sem fornecer garantias antecipadamente. Para usar trocas relâmpago da Uniswap V3, você precisará interagir com o contrato SwapRouter. Este contrato facilita as trocas relâmpago e roteamento entre pools de liquidez.

Aqui está uma visão simplificada de como funciona uma troca relâmpago:

  1. Você inicia uma transação que interage com o contrato SwapRouter e especifica o ativo que deseja emprestar.
  2. O contrato SwapRouter verifica se você pode pagar o ativo emprestado dentro da mesma transação.
  3. Se puder, o contrato SwapRouter empresta o ativo para você, e você pode usá-lo dentro da transação.
  4. Você realiza arbitragem ou qualquer outra operação com o ativo emprestado.
  5. Você paga o ativo emprestado com uma taxa para o contrato SwapRouter antes que a transação seja concluída.
  6. Se você não puder pagar o ativo emprestado, a transação inteira é revertida, garantindo que o pool de empréstimos permaneça seguro.

Implementação do Código

Vamos mergulhar no código para ver como as trocas relâmpago podem ser implementadas da Uniswap V3. Vamos usar o Solidity para o desenvolvimento do nosso contrato inteligente.

Estrutura do Contrato Solidity

Aqui está a estrutura básica do nosso contrato de arbitragem de trocas relâmpago:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import '@uniswap/v3-core/contracts/interfaces/INonfungiblePositionManager.sol';
import '@uniswap/v3-periphery/contracts/interfaces/IUniswapV3Pool.sol';
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';

contract FlashSwapArbitrage {
    INonfungiblePositionManager public positionManager;
    IUniswapV3Pool public pool;

    constructor(address _positionManager, address _pool) {
        positionManager = INonfungiblePositionManager(_positionManager);
        pool = IUniswapV3Pool(_pool);
    }

    // Implemente sua lógica de arbitragem de troca relâmpago aqui
    function executeFlashSwap(uint256 amountToBorrow) external {
        // 1. Iniciar troca relâmpago
        // 2. Realizar arbitragem
        // 3. Pagar o empréstimo relâmpago
    }
}
Enter fullscreen mode Exit fullscreen mode

Neste contrato:

  • Importamos as interfaces necessárias dos contratos Uniswap V3 e a interface ERC20 para interações com tokens.
  • Definimos o contrato FlashSwapArbitrage, que nos permitirá interagir com a funcionalidade de troca relâmpago.
  • O construtor define os endereços para os contratos INonfungiblePositionManager e IUniswapV3Pool.
  • Deixamos um espaço reservado para a lógica da sua arbitragem de troca relâmpago dentro da função executeFlashSwap.

Lógica da Arbitragem de Trocas Relâmpago

Agora, vamos nos aprofundar na lógica da arbitragem de trocas relâmpago. Aqui é onde a singularidade da sua estratégia entra em jogo. Lembre-se, uma arbitragem de troca relâmpago bem-sucedida requer timing preciso e uma compreensão profunda das dinâmicas do mercado.

function executeFlashSwap(uint256 amountToBorrow) external {
    // 1. Iniciar troca relâmpago
    INonfungiblePositionManager.CollectParams memory params = INonfungiblePositionManager.CollectParams({
        tokenId: tokenId,
        recipient: address(this),
        amount0Max: uint256(-1),
        amount1Max: uint256(-1)
    });
    (uint256 collectedAmount0, uint256 collectedAmount1) = positionManager.collect(params);

    // 2. Realizar arbitragem
    // Sua lógica de arbitragem vai aqui

    // 3. Pagar o empréstimo relâmpago
    require(collectedAmount0 >= amountToBorrow, "Fundos insuficientes coletados");
    IERC20(pool.token0()).approve(address(pool), collectedAmount0);
    pool.swap(
        false,
        int256(collectedAmount0),
        int256(0),
        address(this),
        block.timestamp
    );

    // Sua lógica de pagamento do empréstimo relâmpago vai aqui
}
Enter fullscreen mode Exit fullscreen mode

Nessa função:

  • Iniciamos a troca relâmpago usando a função INonfungiblePositionManager.collect para tomar emprestada a quantidade desejada de ativos.
  • Você deve inserir sua lógica de arbitragem onde for indicado. É aqui que você analisa as condições do mercado e executa negociações lucrativas.
  • Por fim, pagamos o empréstimo relâmpago trocando o ativo emprestado de volta para o token original e garantindo que retornemos pelo menos o valor emprestado.

Relatório da Troca Relâmpago da Uniswap V3

No mundo em constante evolução das finanças descentralizadas (DeFi), a inovação nunca dorme. Hoje, estamos nos aprofundando no empolgante mundo das trocas relâmpago da Uniswap V3, onde os traders exercem o poder da arbitragem com precisão e velocidade.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract UniswapV3FlashSwap {
ISwapRouter constant router =
ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564);

uint160 internal constant MIN_SQRT_RATIO = 4295128739;
uint160 internal constant MAX_SQRT_RATIO =
1461446703485210103287273052203988822378723970342;

// Examplo WETH/USDC
// Vender WETH alto -> Comprar WETH baixo -> Lucro WETH
// Entrada em WETH -> Saída em USDC -> Entrada em USDC -> Saída em WETH -> lucro em WETH
function flashSwap(
address pool0,
uint24 fee1,
address tokenIn,
address tokenOut,
uint amountIn
) external {
bool zeroForOne = tokenIn < tokenOut;
uint160 sqrtPriceLimitX96 = zeroForOne
? MIN_SQRT_RATIO + 1
: MAX_SQRT_RATIO - 1;
bytes memory data = abi.encode(
msg.sender,
pool0,
fee1,
tokenIn,
tokenOut,
amountIn,
zeroForOne
);

IUniswapV3Pool(pool0).swap(
address(this),
zeroForOne,
int(amountIn),
sqrtPriceLimitX96,
data
);
}

function uniswapV3SwapCallback(
int amount0,
int amount1,
bytes calldata data
) external {
(
address caller,
address pool0,
uint24 fee1,
address tokenIn,
address tokenOut,
uint amountIn,
bool zeroForOne
) = abi.decode(data, (address, address, uint24, address, address, uint, bool));

require(msg.sender == address(pool0), "nao autorizado");

uint amountOut;
if (zeroForOne) {
amountOut = uint(-amount1);
} else {
amountOut = uint(-amount0);
}

uint buyBackAmount = _swap(tokenOut, tokenIn, fee1, amountOut);

if (buyBackAmount >= amountIn) {
uint profit = buyBackAmount - amountIn;
IERC20(tokenIn).transfer(address(pool0), amountIn);
IERC20(tokenIn).transfer(caller, profit);
} else {
uint loss = amountIn - buyBackAmount;
IERC20(tokenIn).transferFrom(caller, address(this), loss);
IERC20(tokenIn).transfer(address(pool0), amountIn);
}
}

function _swap(
address tokenIn,
address tokenOut,
uint24 fee,
uint amountIn
) private returns (uint amountOut) {
IERC20(tokenIn).approve(address(router), amountIn);

ISwapRouter.ExactInputSingleParams memory params = ISwapRouter
.ExactInputSingleParams({
tokenIn: tokenIn,
tokenOut: tokenOut,
fee: fee,
recipient: address(this),
deadline: block.timestamp,
amountIn: amountIn,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
});

amountOut = router.exactInputSingle(params);
}
}

interface ISwapRouter {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint deadline;
uint amountIn;
uint amountOutMinimum;
uint160 sqrtPriceLimitX96;
}

function exactInputSingle(
ExactInputSingleParams calldata params
) external payable returns (uint amountOut);
}

interface IUniswapV3Pool {
function swap(
address recipient,
bool zeroForOne,
int amountSpecified,
uint160 sqrtPriceLimitX96,
bytes calldata data
) external returns (int amount0, int amount1);
}

interface IERC20 {
function totalSupply() external view returns (uint);

function balanceOf(address account) external view returns (uint);

function transfer(address recipient, uint amount) external returns (bool);

function allowance(address owner, address spender) external view returns (uint);

function approve(address spender, uint amount) external returns (bool);

function transferFrom(
address sender,
address recipient,
uint amount
) external returns (bool);

event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
}

interface IWETH is IERC20 {
function deposit() external payable;

function withdraw(uint amount) external;
}
Enter fullscreen mode Exit fullscreen mode

Compreensão das trocas relâmpago da Uniswap V3

As trocas relâmpago da Uniswap V3 são uma ferramenta inovadora do DeFi que permite aos usuários emprestar ativos de um pool de liquidez sem fornecer garantias, desde que paguem o empréstimo dentro da mesma transação. Esse mecanismo desbloqueia um mundo de oportunidades para pessoas que fazem arbitragens e traders que buscam capitalizar as disparidades de preço em várias bolsas descentralizadas.

Como Funciona: as trocas relâmpago são possíveis através da interação com o contrato SwapRouter, que facilita as trocas relâmpago e roteamento entre pools de liquidez. O processo pode ser dividido nas seguintes etapas:

  1. Inicialização: você inicia uma transação que interage com o contrato SwapRouter e especifica o ativo que deseja emprestar.
  2. Verificação: o contrato SwapRouter verifica se você pode pagar o ativo emprestado dentro da mesma transação.
  3. Empréstimo: se você puder, o contrato SwapRouter empresta o ativo para você, que pode então usar na transação.
  4. Arbitragem: você executa sua estratégia de arbitragem ou negociação com o ativo emprestado.
  5. Reembolso: antes que a transação seja concluída, você deve reembolsar o ativo emprestado junto com uma taxa para o contrato SwapRouter.
  6. Segurança: se você não puder pagar o ativo emprestado, a transação inteira é revertida para garantir a segurança do pool de empréstimos.

Implementação do Código

Agora, vamos explorar o código que torna as trocas relâmpago da Uniswap V3 uma realidade. Abaixo está um contrato inteligente em Solidity que demonstra como interagir com a Uniswap V3 para trocas relâmpago:

contrato UniswapV3FlashSwap {
 // Endereços de contratos e constantes
function flashSwap(
 address pool0,
 uint24 taxa1,
 address tokenEntrada,
 address tokenSaida,
 uint quantiaEntrada
 ) externo {
 // Lógica da troca relâmpago aqui
 }
function uniswapV3SwapCallback(
 int quantia0,
 int quantia1,
 bytes calldata dados
 ) externo {
 // Lógica da função de retorno de chamada
 }
function _swap(
 address tokenEntrada,
 address tokenSaida,
 uint24 taxa,
 uint quantiaEntrada
 ) privado retorna (uint quantiaSaida) {
 // Lógica da função de troca
 }
}
Enter fullscreen mode Exit fullscreen mode

Este contrato permite que os usuários realizem trocas relâmpago da Uniswap V3. Aqui está uma breve visão geral das funções críticas:

  • flashSwap: esta função inicia a troca relâmpago, especificando o pool, a taxa, os tokens e a quantia a ser emprestada.
  • uniswapV3SwapCallback: esta função de retorno de chamada é invocada pela Uniswap V3 para lidar com os resultados da troca relâmpago.
  • _swap: esta função privada realiza a troca real de tokens usando a Uniswap V3.

Estratégias Únicas de Arbitragem

O verdadeiro poder das trocas relâmpago reside nas estratégias únicas de arbitragem que os traders podem empregar. Para maximizar os lucros, os traders devem analisar as condições do mercado, identificar disparidades de preço e executar trades rápidos e precisos. O sucesso na arbitragem de trocas relâmpago requer uma compreensão profunda da dinâmica do mercado e a capacidade de reagir a condições em constante mudança em tempo real.

Gerenciamento de Riscos: trocas relâmpago são uma espada de dois gumes. Os traders devem ter cuidado e conduzir testes extensivos antes de implantar contratos inteligentes na rede principal da Ethereum. Uma estratégia sólida de gerenciamento de riscos é essencial para mitigar possíveis perdas.

Neste relatório, exploramos o código e os mecanismos por trás das trocas relâmpago da Uniswap V3, mas o sucesso na arbitragem de trocas relâmpago vai além do código. Isso requer uma estratégia de negociação única e adaptativa e uma compreensão aguçada do mercado.

À medida que o espaço DeFi continua a evoluir, as trocas relâmpago provavelmente desempenharão um papel crucial ao fornecer liquidez e possibilitar oportunidades de arbitragem. Continue de olho neste espaço para mais inovações e estratégias únicas que os traders desenvolverão para aproveitar todo o potencial das trocas relâmpago.

Relatório de Teste de Troca Relâmpago da Uniswap V3

Bem-vindo ao mundo único das trocas relâmpago da Uniswap V3, onde não estamos apenas testando o código; estamos mergulhando no emocionante reino das finanças descentralizadas com estilo!

Este trecho de código é um teste em Solidity para um contrato chamado UniswapV3FlashSwapTest. O contrato realiza uma operação de flash swap usando a interface Uniswap V3 para trocar WETH (Wrapped Ether) por USDC (US Dollar Coin) em uma determinada taxa de câmbio. Aqui está uma tradução para português:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "forge-std/Test.sol";
import "forge-std/console.sol";

import "../src/UniswapV3FlashSwap.sol";

contract UniswapV3FlashSwapTest is Test {
    address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address private constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

    IWETH private weth = IWETH(WETH);

    UniswapV3FlashSwap private uni = new UniswapV3FlashSwap();

    function setUp() public {}

    function testFlashSwap() public {
        // Pool de USDC / WETH
        address pool0 = 0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8;
        uint24 fee0 = 3000;
        address pool1 = 0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640;
        uint24 fee1 = 500;

        // Aprovar taxa de WETH
        uint wethMaxFee = 1e18;
        weth.deposit{value: wethMaxFee}();
        weth.approve(address(uni), wethMaxFee);

        uint balAntes = weth.balanceOf(address(this));
        uni.flashSwap(pool0, fee1, WETH, USDC, 10 * 1e18);
        uint balDepois = weth.balanceOf(address(this));

        if (balDepois >= balAntes) {
            console.log("Lucro em WETH", balDepois - balAntes);
        } else {
            console.log("Perda em WETH", balAntes - balDepois);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Configuração de Teste

Antes de embarcarmos em nossa aventura, vamos preparar o cenário. Temos um contrato inteligente em Solidity chamado UniswapV3FlashSwapTest que foi projetado para testar trocas relâmpago da Uniswap V3. Este contrato interage com o contrato de Troca Relâmpago da Uniswap V3 para realizar trocas relâmpago.

Endereços de Contratos

  • WETH (Ether embrulhado): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

  • USDC (Moeda Dólar Americano): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48

Componentes Chave

  • weth: Uma instância de Ether Embrulhado (WETH).

  • uni: Uma instância do contrato de Troca Relâmpago da Uniswap V3.

O Teste da Troca Relâmpago

Neste teste único, estamos mergulhando em uma Troca Relâmpago entre os pools de liquidez USDC/WETH da Uniswap V3. Vamos detalhar:

  • Seleção do Pool: escolhemos dois pools da Uniswap V3:

pool0: pool USDC/WETH com uma taxa de 0,3% (3000).

pool1: outro pool para variedade, com uma taxa de 0,05% (500).

  • Aprovação do WETH: para realizar nossa troca relâmpago, precisamos aprovar o WETH para a troca. Então, depositamos algum WETH como taxa e o aprovamos para o contrato uni.

  • Execução da Troca Relâmpago: iniciamos a Troca Relâmpago usando a função uni.flashSwap, especificando o pool, a taxa, os tokens e a quantia a ser emprestada (neste caso, 10 ETH).

  • Lucro ou Prejuízo: rastreamos as alterações no saldo de WETH antes e depois da troca relâmpago. Se o saldo após a troca for maior, é lucro; se for menor, é prejuízo.

Resultados do Teste

O momento da verdade! Após executar a troca relâmpago, analisamos os resultados:

  • Se o saldo de WETH aumentou, registramos como "Lucro em WETH".

  • Se o saldo diminuiu, registramos como "Prejuízo em WETH".

Mas lembre-se, trocas relâmpago são um jogo de alto risco. O lucro não é garantido e perdas são possíveis. O gerenciamento de riscos e testes rigorosos são essenciais no mundo DeFi.

Neste teste único e empolgante, exploramos o mundo das trocas relâmpago da Uniswap V3. Essas ferramentas financeiras inovadoras capacitam os traders a aproveitar oportunidades e obter lucros, mas também trazem riscos inerentes.

Este relatório é um testemunho da natureza dinâmica do DeFi e é apresentado como parte de nosso compromisso em expandir os limites dos testes de contratos inteligentes. Mantenha a curiosidade, mantenha-se seguro e continue inovando!

Conclusão

As trocas relâmpago da Uniswap V3 oferecem uma ferramenta poderosa para os traders de DeFi lucrarem com discrepâncias de preço no mercado. No entanto, é essencial abordar as trocas relâmpago com cautela e ter uma compreensão sólida dos riscos envolvidos. O sucesso na arbitragem de trocas relâmpago requer não apenas conhecimento técnico, mas também um aguçado senso de dinâmica de mercado.

Neste artigo, fornecemos a você uma estrutura básica para implementar a arbitragem de trocas relâmpago da Uniswap V3. Para criar uma estratégia única e lucrativa, você precisará realizar uma pesquisa aprofundada, estar atualizado com as últimas tendências de mercado e refinar continuamente seu contrato inteligente.

Lembre-se de que as trocas relâmpago são uma espada de dois gumes e o uso inadequado pode levar a perdas significativas. Sempre proceda com cautela e conduza testes extensivos antes de implantar qualquer contrato inteligente na rede principal da Ethereum.

Boas trocas relâmpago e que suas oportunidades de arbitragem estejam sempre a seu favor!

Este artigo faz parte da série #100DiasDeSolidity por @solidity101 no MEDIUM. Certifique-se de nos seguir para mais conteúdo empolgante sobre Solidity e DeFi!

📚 Recursos 📚

🔗 Solidity101 Link Collection

📝 Medium Article Source

📚 Web3 Library

📖 Amazon Book Source

📑 Solidity Documentation

💰 Donate US


Artigo escrito por Solidity Academy. Traduzido por Marcelo Panegali.

Top comments (0)