WEB3DEV

Cover image for Aprenda Como Integrar a UniswapV3 em Seus Contratos Inteligentes
Isabela Curado Nehme
Isabela Curado Nehme

Posted on

Aprenda Como Integrar a UniswapV3 em Seus Contratos Inteligentes

https://miro.medium.com/v2/resize:fit:720/format:webp/1*K_-9b0LE67MEllL0mBj6sw.png

O que é a Uniswap?

A Uniswap foi o primeiro protocolo a levar a DEX para o próximo nível com um formador de mercado automatizado (AMM). O AMM elimina a necessidade de um par fazer uma negociação, como é o caso das carteiras de pedidos tradicionais no mercado de ações atual. Em vez disso, o algoritmo AMM reúne a liquidez depositada pelos fornecedores de liquidez, que colocam os seus ativos e permitem que os traders a utilizem.

Como funciona o protocolo Uniswap?

Com a Uniswap, um trader pode negociar seus tokens ERC-20 por meio de pools. Esses pools consistem em pares de tokens (por exemplo, USDC/WETH) e uma taxa de pool (0,05%, 0,30% ou 1%). Um pool recolhe uma pequena quantia dessa taxa para dar suporte ao sistema. Você pode criar e implantar seus próprios pools, que consistem nos pares escolhidos e na taxa de pool escolhida.

Vamos analisar os três principais contratos envolvidos na Uniswap V3: UniswapV3Factory, UniswapV3Pool e SmartRouter.

UniswapV3Factory:

  • O contrato UniswapV3Factory é responsável por criar instâncias do contrato UniswapV3Pool.
  • Mantém o registro do proprietário do contrato e controla a propriedade e o controle sobre as taxas de protocolo do pool.
  • Mantém um mapeamento dos valores das taxas para os espaçamentos dos ticks - a faixa de preço de um pool de liquidez é dividida em diversos "ticks", que são essencialmente marcos de preços. O "tick spacing" é o espaçamento entre esses ticks, ou seja, a diferença de preço entre um tick e outro - o que determina a granularidade das faixas de preços.
  • A função createPool é usada para implantar um novo contrato UniswapV3Pool. Ela recebe dois endereços de token e um valor de taxa como entradas e implanta um novo contrato de pool para o par de tokens especificado.
  • Impõe certas condições, como garantir que os endereços dos tokens não sejam os mesmos e que o espaçamento dos ticks para o valor da taxa seja válido.
  • Atualiza o mapeamento getPool para associar o novo contrato de pool ao par de tokens e ao valor da taxa correspondente.

UniswapV3Pool:

  • O contrato UniswapV3Pool representa um pool de liquidez individual para um par de tokens e valor de taxa específicos.
  • Implementa funcionalidades básicas relacionadas ao fornecimento de liquidez, cálculo de taxas e negociação.
  • Os provedores de liquidez podem depositar seus tokens no pool e receber tokens de provedor de liquidez (LP) em troca. Esses tokens LP representam sua parcela do pool de liquidez.
  • O contrato UniswapV3Pool utiliza o conceito de posições de liquidez, que definem uma faixa de preço específica e a quantidade correspondente de liquidez fornecida.
  • As posições de liquidez são representadas por valores de tick únicos, que definem os limites inferior e superior do preço. O contrato calcula taxas com base nessas posições e as distribui aos provedores de liquidez.
  • A negociação na Uniswap V3 envolve a troca de tokens entre diferentes faixas de preços, otimizando a derrapagem (splippage) e reduzindo os requisitos de capital.
  • O contrato implementa funções para realização de swap, cunhagem/queima de tokens LP e retirada de tokens do pool.

SmartRouter:

  • O contrato SmartRouter é responsável por lidar com trocas (swaps) de tokens e gerenciamento de liquidez. Ele interage com o contrato UniswapV3Pool para realizar essas ações.
  • O contrato calcula os valores ideais para o swap usando o mecanismo de precificação da Uniswap V3 e encaminha o swap por meio de um ou mais contratos UniswapV3Pool.

Ao integrar o protocolo Uniswap em nosso contrato, temos a opção de integrá-lo a partir de vários contratos UniswapV3Pool, SmartRouter e UniswapV3Factory. No entanto, para simplificar e lidar com a complexidade do cálculo dos valores ideais de swap, usaremos o SmartRouter.

Exemplo de Implementação

https://miro.medium.com/v2/resize:fit:720/format:webp/1*MIPjTccwFrD0S5d-DccFVw.png

Vamos explicar:

  1. Declarações de importação: o contrato importa os contratos externos necessários da periferia Uniswap V3, incluindo TransferHelper e a interface para ISwapRouter. Esses contratos externos são usados ​​para transferir tokens com segurança e interagir com a exchange Uniswap V3.
  2. Variáveis ​​de estado: swapRouter é uma variável de estado do tipo ISwapRouter, que é definida como pública e imutável. Armazena uma referência ao contrato UniswapV3Router, que é usado para realizar swaps de tokens.
  3. Construtor: o contrato possui um construtor que recebe uma instância ISwapRouter como parâmetro e inicializa a variável de estado swapRouter com ela. Isso garante que o contrato interaja com o UniswapV3Router especificado.
  4. Função swapExactInputSingle:
    • Esta função é usada para realização de swap em uma quantidade exata de token de entrada por um token de saída.
    • Recebe três parâmetros: token0 (endereço do token de entrada), token1 (endereço do token de saída) e amountIn (a quantidade exata de tokens de entrada).
    • Dentro da função, transfere os tokens de entrada do chamador para o contrato, aprova o roteador (router) para gastar esses tokens e define os parâmetros para o swap.
    • Em seguida, chama a função swapRouter.exactInputSingle para realizar o swap e retorna o valor da saída.
  5. Função swapExactOutputSingle:
    • Esta função é usada para trocar uma quantidade exata de token de saída com uma quantidade máxima de tokens de entrada.
    • Recebe quatro parâmetros: token0 (endereço do token de entrada), token1 (endereço do token de saída), amountOut (a quantidade exata de tokens de saída) e amountInMaximum (a quantidade máxima de tokens de entrada).
    • Semelhante à função anterior, transfere tokens de entrada, aprova o roteador e define parâmetros de troca.
    • Em seguida, chama a função swapRouter.exactOutputSingle para realizar o swap. Se a quantidade de tokens de entrada usados ​​for menor que o máximo permitido, reembolsará os tokens de entrada não utilizados ao chamador.

Para que você possa começar rapidamente, configuramos tudo no BuildBear Labs Uniswap:

  • Clone/bifurque (fork) Uniswap:
git clone https://github.com/BuildBearLabs/UniswapV3.git
Enter fullscreen mode Exit fullscreen mode
  • Instale dependências:
cd UniSwap
npm install
Enter fullscreen mode Exit fullscreen mode
  • Crie sua rede de teste privada (bifurcada da rede principal da Ethereum). Estamos bifurcando a Ethereum porque usaremos o protocolo Aave V3
npm run createTestnet
Enter fullscreen mode Exit fullscreen mode

Assim que a rede de teste estiver ativa, seus detalhes de RPC, Explorer e Torneira (Faucet) serão adicionados ao arquivo testnet.json.

  • Para implantar o contrato inteligente Swapexample.sol, execute o seguinte comando:
npx hardhat run scripts/deploy-Swapexample.js
Enter fullscreen mode Exit fullscreen mode

https://miro.medium.com/v2/resize:fit:720/format:webp/1*RnghfrlncgkO4vsNhrqsqg.png

https://miro.medium.com/v2/resize:fit:720/format:webp/1*Nvkms7hWMtkMBz2lAIsfrw.png

Você pode trocar tokens usando o script fornecido Swap-token.js.

https://miro.medium.com/v2/resize:fit:720/format:webp/1*fJJb8aQSELG7NgRQ-PB0wA.png

Para executar os scripts, execute o seguinte comando e, quando a troca for bem-sucedida, navegue até a página do explorador de contratos. Clique na transação superior para visualizar a transação de swap e o valor de USDC recebido, conforme mostrado na imagem abaixo:

npx hardhat run scripts/Swap-tokens.js
Enter fullscreen mode Exit fullscreen mode

https://miro.medium.com/v2/resize:fit:720/format:webp/1*SpBCyKHoMJdfge-PRdl9CA.png

https://miro.medium.com/v2/resize:fit:720/format:webp/1*UdhLrybvHFjw3c3aUP6CrA.png

Concluindo, aprendemos os papéis dos diferentes contratos na Uniswap V3 e a melhor maneira de integrar a Uniswap V3 em nosso protocolo, e como trocar tokens usando scripts, eliminando a necessidade de uma interface de front-end.

Sobre a BuildBear:

BuildBear é uma plataforma feita sob medida para o desenvolvimento e teste de DApp. Os desenvolvedores ganham a liberdade de construir uma rede de teste privada Sandbox personalizada em uma variedade de redes blockchain. A liberdade de cunhar tokens Nativos e ERC20 ilimitados, juntamente com tempos de transação rápidos na BuildBear (menos de 3 segundos!), aprimora a variedade de ciclo de vida de desenvolvimento do DApp. A plataforma vem equipada com ferramentas projetadas para testes e depuração em tempo real, garantindo que os desenvolvedores possam acompanhar as complexas transações da blockchain com uma facilidade incomparável.

Conecte-se conosco em Twitter | LinkedIn | Telegram | GitHub

Este artigo foi escrito pela equipe BuildBear e traduzido por Isabela Curado Nehme. Seu original pode ser lido aqui.

Latest comments (0)