WEB3DEV

Cover image for O que são oráculos Uniswap V2?
Fatima Lima
Fatima Lima

Posted on

O que são oráculos Uniswap V2?

Image description

O que são Oráculos?

No mundo EVM, você pode interagir com outros contratos inteligentes implantados com bastante facilidade. No entanto, e se você precisar ter acesso aos dados que não existem on-chain? Exemplo: aplicativos com utilidades da vida real muitas vezes dependem de coisas como alimentação de dados ao vivo de eventos do mundo real, como esportes, preços de commodities etc. É aí que os oráculos te ajudam. Os oráculos são uma ponte entre os dados externos e seu contrato inteligente on-chain. O interessante é que você pode construir oráculos usando a Uniswap V2.

Mas, a Uniswap não é uma exchange?

Sim, correto! A Uniswap é uma DEX (exchange). É destinada a funcionar como criadores de mercado automatizados. Mas essa não é a única utilidade. O contrato "par" da Uniswap pode ser usado como fonte de taxa de câmbio entre os tokens do respectivo par. Agora, vamos ver como a Uniswap pode ser usada como um oráculo. Antes disso, precisamos entender alguns conceitos.

A Uniswap V2 e preços médios ponderados pelo tempo (TWAP)

Sim, isso é o que a TWAP significa. Preço médio ponderado pelo tempo. Como você calcula o TWAP usando o contrato Uniswap V2?

Cada contrato de par tem as duas variáveis públicas a seguir:

  • price0CumulatveLast
  • price1CumulativeLast

Estas duas variáveis armazenam a soma de todos os preços históricos ponderados pelo tempo para o Token0 e o Token1 para cada segundo passado após o contrato ter sido implantado. Digamos que o tempo atual seja "t". Agora, se você quiser calcular o TWAP para Token0 para 8 Horas:

TWAP para 8 hours = (P t -P t-8 ) / ( blocktimestamp t -blocktimestamp t-8 )

É isso! Isso é tudo o que existe de matemática por trás do preço médio ponderado pelo tempo. Este diagrama, diretamente dos documentos da Uniswap, reflete isso perfeitamente.

Image description

Integrando os Oráculos Uniswap V2

É aqui que as coisas ficam um pouco complicadas. Mas, não se preocupe, vamos quebrar esta parte muito sistematicamente, de forma que fique muito fácil de interpretar. Sem jargão, eu prometo.

Como se vê no exemplo acima, para calcular o TWAP, precisamos de dois preços e dois _timestamps _(carimbos de tempo). Em outras palavras, precisamos de um preço e um timestamp de referência, juntamente com o preço e o timestamp atual. Entretanto, não podemos buscar o preço de referência diretamente do contrato de par. Precisamos de um contrato "Oracle" (Oráculo) separado que trate desta lógica para nós.

O contrato simples: Oráculo de Janela Fixa.

Eu sei que eu disse sem jargão. Mas é muito simples. Digamos que você queira o TWAP de 1 hora para um determinado token. Você simplesmente escreve um contrato inteligente que tenha a lógica de armazenar o valor de "preço0CumulativoLast" (assumindo que o token seja token0 no contrato de par). E você atualiza o valor dessa variável a cada hora, expondo uma função de update. Agora é sua responsabilidade certificar-se de que este contrato seja atualizado a cada hora para que possa retornar o preço médio na última hora. E, claro, você precisará de uma função que retorne o preço médio calculado no formato exigido para ser utilizado posteriormente.

Aqui está o exemplo completo deste contrato:

https://github.com/ashwinYardi/uniswap-v2-oracles/blob/afbd493530b73fd3fe58ae174e584f5454d5f899/contracts/SimpleFixedWindowOracle.sol

É desnecessário dizer que atualizar um contrato inteligente a cada hora fixa pode ser um trabalho caro e entediante e pode derrubar suas outras dependências, se não for atualizado corretamente. Além disso, como tem uma janela fixa, muitas vezes não reflete as flutuações de preços a curto prazo. Além disso, os preços históricos e os preços mais recentes são tratados igualmente. O ideal seria dar mais peso aos preços mais recentes para que seu oráculo seja sensível às flutuações de preços.

Oráculo de Janela Móvel

Em oráculos de janela móvel, há duas variáveis que você pode ajustar de acordo com a necessidade e suas preferências:

  1. Tamanho da janela, isto é, 2 meses, 1 hora, 1 dia.
  2. Granularidade: quantas observações devem ser registradas dentro de uma janela correspondente.

O preço é sempre calculado sobre a janela mais recente. A granularidade dita a exatidão do preço retornado pelo oráculo. Quanto maior a granularidade, maior a exatidão do preço médio. Entretanto, você precisará de mais atualizações em seu contrato de oráculo.

Aqui está o contrato para o oráculo de janela móvel:

https://github.com/ashwinYardi/uniswap-v2-oracles/blob/afbd493530b73fd3fe58ae174e584f5454d5f899/contracts/MovingWindowOracle.sol

Este contrato é um oráculo de janela móvel genérico que pode ser usado para múltiplos pares Uniswap V2. Basta informar ao contrato os detalhes, como qual o endereço de fábrica Uniswap a ser usado, qual o tamanho da janela e qual é a granularidade e pronto! Agora você pode usar este contrato para qualquer par Uniswap criado pela fábrica.

Mesmo sendo difícil de manipular, os oráculos Uniswap V2 ainda são passíveis de manipulação se houver condições favoráveis que compensem o custo da manipulação do oráculo. Além disso, se a chain travar por um tempo significativo, os Dapps baseados em oráculo podem ser explorados. Escreverei um artigo separado sobre como estes oráculos descentralizados podem ser manipulados. Fique atento e siga as redes sociais para manter-se em contato!

Publicado originalmente em https://bitsbyblocks.com em 12 de dezembro de 2022.

Esse artigo foi escrito por Ashwin Yardi e traduzido por Fátima Lima. O original pode ser lido aqui.

Top comments (0)