Arbitragem triangular na Uniswap v3

intermediário5/7/2024, 10:38:35 AM
A arbitragem triangular serve como estratégia na negociação de câmbio de criptomoedas, aproveitando variações nas taxas de câmbio dentro de um único mercado ou entre vários mercados.

Implementado com swaps multi-hop

A arbitragem triangular serve como uma estratégia de negociação de câmbio de criptomoedas, aproveitando variações nas taxas de câmbio dentro de um único mercado ou em vários mercados. Este método compreende três negociações sequenciais: trocar uma criptomoeda inicial por uma segunda, a segunda por uma terceira e, por fim, a terceira criptomoeda de volta para a inicial, todas com o objetivo de gerar lucro. Portanto, o termo "triangular" encapsula seu processo de três etapas.

Imagem gerada por AI

Como funciona?

Na DEX, as oportunidades de arbitragem triangular são geralmente causadas por diferenças de liquidez em várias pools. Elas geralmente são de curta duração, durando apenas alguns segundos ou até menos, à medida que a exchange ajusta rapidamente quaisquer discrepâncias de preços. Consequentemente, algoritmos de negociação automatizados equipados para executar rapidamente operações são empregados para capitalizar sobre essas diferenças passageiras. Para ajudar na compreensão do conceito, aqui está um exemplo:

A transação triangular acima começa a partir de 01 - comprando 1 wBTC com $60.000 USDC, seguido por 02 - comprando 16 WETH com 1 wBTC e termina com 03 - vendendo 16 WETH por $66.000 USDC. No final da jornada, teríamos obtido $6.000 USDC como lucro.

Implementando com Trocas Multifásicas no Uniswap v3

Existem dois estilos de troca multi-hop disponíveis no Uniswap v3: Entrada Exata e Saída Exata. Como os nomes sugerem, o primeiro espera um token com a quantidade exata como entrada da troca, e no final dele, um token com a quantidade de saída será produzido nas taxas de câmbio; O último espera uma quantidade exata especificada como saída, apenas a quantidade suficiente do token como entrada pode realizar a troca nas taxas de câmbio.

Com a natureza comercial da arbitragem triangular, gostaríamos de pegar um token com a quantidade exata como entrada, trocá-lo por outra criptomoeda e depois trocar novamente pelo token original para obter lucro, como desejamos.

endereço constante SWAP_ROUTER_02 = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;

endereço constante WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

constante de endereço USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

endereço constante DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;

contrato MultiHopSwap { usando SafeERC20 para IERC20;ISwapRouter02 private constante ROUTER = ISwapRouter02(SWAP_ROUTER_02);uint256 private constante MAX_INT =   115792089237316195423570985008687907853269984665640564039457584007913129639935;função swapExactInputMultiHop(uint256 amountIn) externo {   IERC20(USDC).safeApprove(address(ROUTER), MAX_INT);   IERC20(WETH).safeApprove(address(ROUTER), MAX_INT);   IERC20(DAI).safeApprove(address(ROUTER), MAX_INT);   bytes memoria path =       abi.encodePacked(USDC, uint24(3000), WETH, uint24(3000), DAI, uint24(3000), USDC) ;   ISwapRouter02.ExactInputParams memoria params = ISwapRouter02       .ExactInputParams({       path: path,       recipient: address(this),       amountIn: amountIn,       amountOutMinimum: 1   });   ROUTER.exactInput(params); }}

Os roteadores desempenham um papel crucial na facilitação da provisão de liquidez. Como eles são sem estado e não possuem saldos de tokens, os roteadores podem ser substituídos com segurança. Por esse motivo, os roteadores têm números de versão, começando em 01. Em nossa implementação, usamos o Roteador02 em 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45na mainnet.

SafeERC20 é uma camada de proteção construída em torno das transações ERC20, garantindo interações seguras com tokens ERC20 dentro do nosso contrato. Ao contrário das funções ERC20 regulares, o SafeERC20 aprimora a segurança verificando os valores de retorno booleanos das operações ERC20. Se alguma operação falhar, a transação é revertida, minimizando os riscos. Além disso, o SafeERC20 acomoda tokens ERC20 não padronizados que não possuem valores de retorno booleanos, proporcionando flexibilidade e robustez na gestão de tokens. Ao aprovar a quantidade máxima, permitimos que o Router02 transfira tokens em nosso nome. Sem fazer isso, você esperaria ver uma mensagem de erro STF na qual STF significa que a execução é revertida pela declaração require na função TransferHelper.safeTransferFrom.

Em seguida, vamos ver como um caminho triangular é definido:

bytes memory path = abi.encodePacked(USDC, uint24(3000),

WETH, uint24(3000), DAI, uint24(3000), USDC) ;

Através de abi.encodePacked, o Solidity empacota firmemente múltiplos valores sem adicionar nenhum preenchimento. Ele concatena os dados binários brutos de cada parâmetro. Não é difícil entender que os parâmetros sequencializaram as trocas com taxas entre os pares de criptomoedas. O caminho começa a partir de USDC e para em USDC esperando um lucro. Em seguida, é envolto por ExactInputParams com outros parâmetros obrigatórios e inserido no roteador para trocas multi-hop.

Testando

Nós usamos a mesma técnica porbifurcando a mainnet com impessoalidade. Uma vez que 10 USDC forem verificados como creditados no contrato, as trocas multi-hop podem ser acionadas da seguinte forma:

it("realiza troca de vários saltos", async () => {balance = await swap.tokenBalance(USDC);console.log(`Saldo atual de USDC = ${balance}`);console.log(`Trocando ${initialFundingHuman} USDC`);const tx = await swap.swapExactInputMultiHop(ethers.parseUnits(initialFundingHuman, DECIMALS));receipt = await tx.wait();balance = await swap.tokenBalance(USDC);console.log(`Saldo atual de USDC = ${balance}`);expect(balance).not.equal(0);});

O resultado do teste deve se parecer com o seguinte:

Saldo USDC da baleia: 170961218210457n

Impersonation Started.

Falsificação de identidade concluída.

Saldo atual de USDC = 100000000

Trocar 100 USDC

Saldo atual de USDC = 91677417

Depois de pular pelos aros, perdemos dinheiro - Obviamente, o caminho com taxas de mercado não estava a nosso favor, mas você entende como a arbitragem triangular deve ser feita usando trocas de várias etapas no Uniswap v3.

Empréstimo rápido financiou arbitragem triangular

Não lhe dissea fonte de financiamento mais poderosa no ecossistema DeFi é Flash loan? Não será necessário muita criatividade para você construir uma estratégia de negociação de arbitragem triangular financiada por empréstimo Flash usando tanto empréstimo Flash quanto trocas multihop que eu ensinei. Uma lógica combinada pode ser explicada pelo diagrama de sequência atualizado conforme abaixo:

Diagrama de sequência para arbitragem triangular financiada por empréstimo Flash na Uniswap v3 (Ignorou algumas operações para simplificar)

Confira meu código fonte para empréstimo Flash e trocas Multihop implementadas na Uniswap v3 —https://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255, digira o diagrama de sequência e faça sua própria lição de casa para concluir os contratos inteligentes combinados.

Considerações de rentabilidade

A primeira coisa que queremos olhar é o caminho que é composto pela sequência dos 3 trades: Para ser lucrativo, eles devem ser os 3 pares certos de criptomoedas nas taxas corretas. Para encontrar toda essa corretude, você precisa desenvolver um programa que permuta pares negociáveis no padrão de arbitragem triangular e simula as trocas para verificar a lucratividade. A recuperação de taxas da blockchain pode ser lenta e isso ainda mais vai retardar o processo se houver muitos caminhos aguardando verificação de lucratividade. Você pode querer reduzir a lista de caminhos triangulares calculando Lucro e Perda com base nos preços de superfície fornecidos pelos pontos finais de preços do GraphQL de uma DEX, se houveraqui vem o Uniswap v3) Como as APIs do GraphQL são muito mais rápidas do que o blockchain para fornecer dados de cotação. Uma vez que os caminhos são selecionados, execute-os com as cotações obtidas da cadeia para um cálculo mais preciso de Lucro e Perda.

Impulsionando seu investimento com empréstimo Flashpode estender ainda mais o lucro - empréstimo de tokens a juros baixos e investi-los com estratégia lucrativa sempre será uma boa ideia. Teoricamente, desde que o lucro bruto seja suficiente para cobrir as taxas de empréstimo rápido e de troca, a estratégia de arbitragem triangular será considerada lucrativa. Um truque crítico para proteger seu lucro e mitigar o risco geral de negociação é ter uma lógica em seu contrato de negociação para falhar na transação de empréstimo rápido se a verificação de lucratividade bruta falhar, pois quando a transação falha, todas as operações serão desfeitas e você não precisará arcar com a perda e nem mesmo com as taxas da transação. Esta peça de lógica funcionará como um guardião geral para evitar deslizes ou movimentos na taxa de câmbio que não nos favoreçam.

Dito isso, independentemente do sucesso ou fracasso da transação, as taxas de gás são algo de que você nunca pode escapar e podem ser a principal causa de perda de dinheiro na arbitragem triangular. Sempre avalie as taxas de gás para a transação de sua estratégia e leve isso em consideração no cálculo da lucratividade líquida. Por favor, consulte os casos de teste de estimativa de taxa de gás em meu código-fonte.

Aviso Legal:

  1. Este artigo é reproduzido a partir de [Scripts de criptomoeda], Todos os direitos autorais pertencem ao autor original [Aaron Li]. Se houver objeções a esta reimpressão, entre em contato com o Gate Aprenderequipe e eles lidarão com isso prontamente.
  2. Aviso de Responsabilidade: As opiniões expressas neste artigo são exclusivamente do autor e não constituem nenhum conselho de investimento.
  3. As traduções do artigo para outros idiomas são feitas pela equipe Gate Learn. Salvo indicação em contrário, copiar, distribuir ou plagiar os artigos traduzidos é proibido.

Arbitragem triangular na Uniswap v3

intermediário5/7/2024, 10:38:35 AM
A arbitragem triangular serve como estratégia na negociação de câmbio de criptomoedas, aproveitando variações nas taxas de câmbio dentro de um único mercado ou entre vários mercados.

Implementado com swaps multi-hop

A arbitragem triangular serve como uma estratégia de negociação de câmbio de criptomoedas, aproveitando variações nas taxas de câmbio dentro de um único mercado ou em vários mercados. Este método compreende três negociações sequenciais: trocar uma criptomoeda inicial por uma segunda, a segunda por uma terceira e, por fim, a terceira criptomoeda de volta para a inicial, todas com o objetivo de gerar lucro. Portanto, o termo "triangular" encapsula seu processo de três etapas.

Imagem gerada por AI

Como funciona?

Na DEX, as oportunidades de arbitragem triangular são geralmente causadas por diferenças de liquidez em várias pools. Elas geralmente são de curta duração, durando apenas alguns segundos ou até menos, à medida que a exchange ajusta rapidamente quaisquer discrepâncias de preços. Consequentemente, algoritmos de negociação automatizados equipados para executar rapidamente operações são empregados para capitalizar sobre essas diferenças passageiras. Para ajudar na compreensão do conceito, aqui está um exemplo:

A transação triangular acima começa a partir de 01 - comprando 1 wBTC com $60.000 USDC, seguido por 02 - comprando 16 WETH com 1 wBTC e termina com 03 - vendendo 16 WETH por $66.000 USDC. No final da jornada, teríamos obtido $6.000 USDC como lucro.

Implementando com Trocas Multifásicas no Uniswap v3

Existem dois estilos de troca multi-hop disponíveis no Uniswap v3: Entrada Exata e Saída Exata. Como os nomes sugerem, o primeiro espera um token com a quantidade exata como entrada da troca, e no final dele, um token com a quantidade de saída será produzido nas taxas de câmbio; O último espera uma quantidade exata especificada como saída, apenas a quantidade suficiente do token como entrada pode realizar a troca nas taxas de câmbio.

Com a natureza comercial da arbitragem triangular, gostaríamos de pegar um token com a quantidade exata como entrada, trocá-lo por outra criptomoeda e depois trocar novamente pelo token original para obter lucro, como desejamos.

endereço constante SWAP_ROUTER_02 = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;

endereço constante WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

constante de endereço USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

endereço constante DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;

contrato MultiHopSwap { usando SafeERC20 para IERC20;ISwapRouter02 private constante ROUTER = ISwapRouter02(SWAP_ROUTER_02);uint256 private constante MAX_INT =   115792089237316195423570985008687907853269984665640564039457584007913129639935;função swapExactInputMultiHop(uint256 amountIn) externo {   IERC20(USDC).safeApprove(address(ROUTER), MAX_INT);   IERC20(WETH).safeApprove(address(ROUTER), MAX_INT);   IERC20(DAI).safeApprove(address(ROUTER), MAX_INT);   bytes memoria path =       abi.encodePacked(USDC, uint24(3000), WETH, uint24(3000), DAI, uint24(3000), USDC) ;   ISwapRouter02.ExactInputParams memoria params = ISwapRouter02       .ExactInputParams({       path: path,       recipient: address(this),       amountIn: amountIn,       amountOutMinimum: 1   });   ROUTER.exactInput(params); }}

Os roteadores desempenham um papel crucial na facilitação da provisão de liquidez. Como eles são sem estado e não possuem saldos de tokens, os roteadores podem ser substituídos com segurança. Por esse motivo, os roteadores têm números de versão, começando em 01. Em nossa implementação, usamos o Roteador02 em 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45na mainnet.

SafeERC20 é uma camada de proteção construída em torno das transações ERC20, garantindo interações seguras com tokens ERC20 dentro do nosso contrato. Ao contrário das funções ERC20 regulares, o SafeERC20 aprimora a segurança verificando os valores de retorno booleanos das operações ERC20. Se alguma operação falhar, a transação é revertida, minimizando os riscos. Além disso, o SafeERC20 acomoda tokens ERC20 não padronizados que não possuem valores de retorno booleanos, proporcionando flexibilidade e robustez na gestão de tokens. Ao aprovar a quantidade máxima, permitimos que o Router02 transfira tokens em nosso nome. Sem fazer isso, você esperaria ver uma mensagem de erro STF na qual STF significa que a execução é revertida pela declaração require na função TransferHelper.safeTransferFrom.

Em seguida, vamos ver como um caminho triangular é definido:

bytes memory path = abi.encodePacked(USDC, uint24(3000),

WETH, uint24(3000), DAI, uint24(3000), USDC) ;

Através de abi.encodePacked, o Solidity empacota firmemente múltiplos valores sem adicionar nenhum preenchimento. Ele concatena os dados binários brutos de cada parâmetro. Não é difícil entender que os parâmetros sequencializaram as trocas com taxas entre os pares de criptomoedas. O caminho começa a partir de USDC e para em USDC esperando um lucro. Em seguida, é envolto por ExactInputParams com outros parâmetros obrigatórios e inserido no roteador para trocas multi-hop.

Testando

Nós usamos a mesma técnica porbifurcando a mainnet com impessoalidade. Uma vez que 10 USDC forem verificados como creditados no contrato, as trocas multi-hop podem ser acionadas da seguinte forma:

it("realiza troca de vários saltos", async () => {balance = await swap.tokenBalance(USDC);console.log(`Saldo atual de USDC = ${balance}`);console.log(`Trocando ${initialFundingHuman} USDC`);const tx = await swap.swapExactInputMultiHop(ethers.parseUnits(initialFundingHuman, DECIMALS));receipt = await tx.wait();balance = await swap.tokenBalance(USDC);console.log(`Saldo atual de USDC = ${balance}`);expect(balance).not.equal(0);});

O resultado do teste deve se parecer com o seguinte:

Saldo USDC da baleia: 170961218210457n

Impersonation Started.

Falsificação de identidade concluída.

Saldo atual de USDC = 100000000

Trocar 100 USDC

Saldo atual de USDC = 91677417

Depois de pular pelos aros, perdemos dinheiro - Obviamente, o caminho com taxas de mercado não estava a nosso favor, mas você entende como a arbitragem triangular deve ser feita usando trocas de várias etapas no Uniswap v3.

Empréstimo rápido financiou arbitragem triangular

Não lhe dissea fonte de financiamento mais poderosa no ecossistema DeFi é Flash loan? Não será necessário muita criatividade para você construir uma estratégia de negociação de arbitragem triangular financiada por empréstimo Flash usando tanto empréstimo Flash quanto trocas multihop que eu ensinei. Uma lógica combinada pode ser explicada pelo diagrama de sequência atualizado conforme abaixo:

Diagrama de sequência para arbitragem triangular financiada por empréstimo Flash na Uniswap v3 (Ignorou algumas operações para simplificar)

Confira meu código fonte para empréstimo Flash e trocas Multihop implementadas na Uniswap v3 —https://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255, digira o diagrama de sequência e faça sua própria lição de casa para concluir os contratos inteligentes combinados.

Considerações de rentabilidade

A primeira coisa que queremos olhar é o caminho que é composto pela sequência dos 3 trades: Para ser lucrativo, eles devem ser os 3 pares certos de criptomoedas nas taxas corretas. Para encontrar toda essa corretude, você precisa desenvolver um programa que permuta pares negociáveis no padrão de arbitragem triangular e simula as trocas para verificar a lucratividade. A recuperação de taxas da blockchain pode ser lenta e isso ainda mais vai retardar o processo se houver muitos caminhos aguardando verificação de lucratividade. Você pode querer reduzir a lista de caminhos triangulares calculando Lucro e Perda com base nos preços de superfície fornecidos pelos pontos finais de preços do GraphQL de uma DEX, se houveraqui vem o Uniswap v3) Como as APIs do GraphQL são muito mais rápidas do que o blockchain para fornecer dados de cotação. Uma vez que os caminhos são selecionados, execute-os com as cotações obtidas da cadeia para um cálculo mais preciso de Lucro e Perda.

Impulsionando seu investimento com empréstimo Flashpode estender ainda mais o lucro - empréstimo de tokens a juros baixos e investi-los com estratégia lucrativa sempre será uma boa ideia. Teoricamente, desde que o lucro bruto seja suficiente para cobrir as taxas de empréstimo rápido e de troca, a estratégia de arbitragem triangular será considerada lucrativa. Um truque crítico para proteger seu lucro e mitigar o risco geral de negociação é ter uma lógica em seu contrato de negociação para falhar na transação de empréstimo rápido se a verificação de lucratividade bruta falhar, pois quando a transação falha, todas as operações serão desfeitas e você não precisará arcar com a perda e nem mesmo com as taxas da transação. Esta peça de lógica funcionará como um guardião geral para evitar deslizes ou movimentos na taxa de câmbio que não nos favoreçam.

Dito isso, independentemente do sucesso ou fracasso da transação, as taxas de gás são algo de que você nunca pode escapar e podem ser a principal causa de perda de dinheiro na arbitragem triangular. Sempre avalie as taxas de gás para a transação de sua estratégia e leve isso em consideração no cálculo da lucratividade líquida. Por favor, consulte os casos de teste de estimativa de taxa de gás em meu código-fonte.

Aviso Legal:

  1. Este artigo é reproduzido a partir de [Scripts de criptomoeda], Todos os direitos autorais pertencem ao autor original [Aaron Li]. Se houver objeções a esta reimpressão, entre em contato com o Gate Aprenderequipe e eles lidarão com isso prontamente.
  2. Aviso de Responsabilidade: As opiniões expressas neste artigo são exclusivamente do autor e não constituem nenhum conselho de investimento.
  3. As traduções do artigo para outros idiomas são feitas pela equipe Gate Learn. Salvo indicação em contrário, copiar, distribuir ou plagiar os artigos traduzidos é proibido.
Lancez-vous
Inscrivez-vous et obtenez un bon de
100$
!