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
Vamos explicar:
-
Declarações de importação: o contrato importa os contratos externos necessários da periferia Uniswap V3, incluindo
TransferHelper
e a interface paraISwapRouter
. Esses contratos externos são usados para transferir tokens com segurança e interagir com a exchange Uniswap V3. -
Variáveis de estado:
swapRouter
é uma variável de estado do tipoISwapRouter
, que é definida como pública e imutável. Armazena uma referência ao contrato UniswapV3Router, que é usado para realizar swaps de tokens. -
Construtor: o contrato possui um construtor que recebe uma instância
ISwapRouter
como parâmetro e inicializa a variável de estadoswapRouter
com ela. Isso garante que o contrato interaja com o UniswapV3Router especificado. -
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) eamountIn
(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.
-
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) eamountInMaximum
(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
- Instale dependências:
cd UniSwap
npm install
- 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
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
Você pode trocar tokens usando o script fornecido Swap-token.js
.
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
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)