WEB3DEV

Cover image for Interagindo com a API da 0x usando o JavaScript
Paulo Gio
Paulo Gio

Posted on • Atualizado em

Interagindo com a API da 0x usando o JavaScript

Sumário
  1. Visão geral
  2. Pré-requisito:
  3. O que é uma DEX?
  4. Coração da DEX→AMM
  5. Sobre a 0X
  6. Código
  7. Instalação
  8. Escrevendo o código
  9. Saída
  10. Conclusão

Visão geral

Vimos um tremendo crescimento no volume de comércio em exchanges descentralizadas (DEX). Com muitas delas chegando ao mercado, é difícil decidir qual DEX escolher quando você deseja trocar seu token por outro. É aí que a 0x e suas APIs entram em cena. Ela nos ajuda a buscar a DEX com a melhor cotação de preço. Isso dará um valor muito melhor para o número de tokens que queremos trocar, o que você verá no final. Portanto, certifique-se de seguir até o final.

Pré-requisito:

  1. Terminal

  2. Node.js

  3. Editor de Código

  4. Mente curiosa

O que é uma DEX?

Uma Decentralised EXchange (exchange descentralizada), popularmente conhecida como DEX, é uma parte crucial do ecossistema blockchain. É um mercado descentralizado que conecta compradores e vendedores de criptomoedas de uma maneira ponto a ponto, sem envolver nenhuma autoridade controladora/central. Algumas das DEX mais populares no espaço blockchain são UniSwap, SuhiSwap e PancakeSwap. Os contratos inteligentes permitem que cada DEX opere de maneira determinística e imparável. As DEX ganharam popularidade e tiveram um grande aumento nos números porque não são permissionadas. Em qualquer exchange centralizada, você terá que verificar sua identidade por meio do processo KYC (Know Your Customer, ou seja, Conheça Seu Cliente), e a exchange está no controle de sua chave privada. Portanto, se a organização for invadida ou congelar sua conta, seus fundos estarão perdidos para sempre. Mas em uma DEX, um usuário está no controle da chave privada. O único fator limitante é a falha de segurança no contrato. Qualquer DEX decente faria a auditoria de seus contratos através de várias agências para garantir que eles sejam menos propensos a ataques. Portanto, caso você queira trocar seu ETH por algum DAI, você pode fazer isso facilmente usando uma DEX.

Coração da DEX→AMM

Formadores de Mercado Automatizados (AMM, Automated Market Maker) impulsionam as DEX. O AMM, em sua essência, usa uma fórmula matemática que decide o preço de um par de tokens e facilita a negociação de tokens. Ele ajuda na cotação da taxa de câmbio de dois ativos e permite que qualquer pessoa construa o mercado para o par fornecendo liquidez, ou seja, se torne um formador de mercado. Por exemplo, Uniswap usa x*y=k como AMM. Aqui x é a quantidade de um token e y é a quantidade de outro token. Agora, o produto de ambos os tokens deve ser constante, o que é denotado por k. Idealmente, não importa quantos tokens sejam adicionados ou removidos, eles serão equilibrados para manter o produto estável. Outras funcionalidades entram em cena, incluindo troca, mineração de liquidez e muito mais.

Sobre a 0X

Seguindo os documentos oficiais:

0x é um protocolo que facilita a troca ponto a ponto de ativos baseados em Ethereum. O protocolo serve como um padrão aberto e um bloco de construção comum para qualquer desenvolvedor que precise de funcionalidade de troca.

A 0x em sua unicidade permite a negociação ponto a ponto no método tradicional de livro de pedidos. As ofertas de compra e venda feitas neste livro de pedidos pertencem a um método-padrão de negociação que combina compradores e vendedores com base no preço que eles cotam. Embora seja uma opção viável e moderna para uma exchange centralizada, torna-se um modelo muito caro e demorado para uma DEX. Cada transação e interação de contrato inteligente consumiria gás, também conhecido como dinheiro. A 0x promete se livrar desse ponto problemático, retirando alguns dos procedimentos da cadeia. Isso economizaria muito dinheiro para os participantes e o procedimento seria muito mais rápido. Em poucas palavras, uma iniciação comercial ocorre fora da cadeia e a liquidação é feita na cadeia, o que torna realidade o sonho de um livro de pedidos descentralizado e sem atrito.

Os principais participantes dos protocolos são Makers (Formadores), Takers (Tomadores) e Relayers (Retransmissores). Os Makers são as entidades do mercado que iniciam uma negociação, enquanto os Takers são as entidades que realizam a transação. No meio estão os Relayers que conectam Makers e Takers, que novamente mantêm um registro de todas as negociações fora da cadeia. Digamos que o Maker queira trocar o Token A pelo Token B. Seria assim:

  1. O Maker aprova o contrato da 0x para acessar seu saldo do Token A e inicia um pedido para trocá-lo pelo Token B. O Maker assina a transação com sua chave privada, convertendo o pedido em um *formato de mensagem* que está pronto para ser transmitido para canais fora da cadeia.

  2. O Maker transmite a mensagem pelo Relayer. A 0x tem uma página de explorador que lista os Relayers.

  3. Um Taker, que deseja atender o pedido, aprova o contrato da 0x para acessar seu saldo do Token B.

  4. O Taker efetuou o pedido enviando-o ao contrato da 0x na blockchain Ethereum.

  5. O Relayer recebe taxas na forma de XRZ, que é o token nativo da 0x.

A 0x é uma DEX de próxima geração que permite que os desenvolvedores aproveitem seu software aberto para criar Dapps e projetos em torno dela. A 0x possui recursos amigáveis para desenvolvimento e fornece suporte para quem quiser desenvolver projetos em cima de sua plataforma. Dessa forma, a 0x é uma escolha lucrativa entre empresários e desenvolvedores. A 0x acredita no lema de que qualquer ativo próprio pode ser tokenizado, ou seja, representado como um token na blockchain. Isso significa que, em breve, sua casa poderá ser definida como um token em uma blockchain e poderá ser negociada de forma descentralizada sem envolver um intermediário como um advogado ou uma corretora. A 0x está evoluindo e com o objetivo de cumprir tais necessidades.

Código

Agora, vamos aproveitar as APIs fornecidas pela 0x para construir um aplicativo que nos ajudará a encontrar a melhor DEX para negociar nosso token.

Instalação

  1. Para isso, crie uma pasta chamada ZRX_Swap. Dentro da pasta, abra seu terminal e digite:
npm init -y
Enter fullscreen mode Exit fullscreen mode
  1. Agora abra a pasta em seu editor favorito. Para este artigo, usaremos o editor VS Code. Agora, execute o seguinte comando para abrir a pasta no editor VS:
code .
Enter fullscreen mode Exit fullscreen mode
  1. Precisaremos instalar um pacote chamado qs. Por isso:
npm install qs --save
Enter fullscreen mode Exit fullscreen mode
  1. Agora, também precisamos instalar um pacote chamado axios. Isso nos ajudará a chamar a API da 0x. Para isso:
npm install axios --save
Enter fullscreen mode Exit fullscreen mode

Escrevendo o código

Crie um arquivo chamado index.js que irá abrigar nosso código principal. Neste, iremos buscar a melhor cotação enviada pela 0x, e separadamente tentaremos buscar a mesma do UniSwapV3. Isso destaca que podemos optar por uma exchange específica de nossa escolha ou deixar a 0x decidir a melhor para nós. Copie e cole o seguinte código no arquivo:

const { default: axios } = require('axios')
const qs = require('qs')
const params = {
  buyToken: 'DAI',
  sellToken: 'ETH',
  sellAmount: 0.05 * Math.pow(10, 18).toString(), // Sempre denominado em wei
}
const URL = 'https://api.0x.org/swap/v1/quote?'

//Obter cotação-padrão
const getDefaultQuote = async () => {
  let response
  try {
    response = await axios.get(`${URL}${qs.stringify(params)}`)
  } catch (err) {
    console.error(err)
  }
  console.log("Cotação-Padrão")
  console.log("%O",response.data)
  console.log("%O",response.data.sources)

}

//Obter Cotação de uma DEX específica
const getUniSwapV3Quote = async (inputToken, outputToken, value) => {
  const exchangeList = 'Uniswap_V3'
  const params = {
    buyToken: 'DAI',
    sellToken: 'ETH',
    sellAmount: 0.05 * Math.pow(10, 18).toString(), // Sempre denominado em wei
    includedSources: exchangeList,
  }
  let response
  try {
    response = await axios.get(
    `${URL}${qs.stringify(params)}`,
    )
  } catch (err) {
    console.error(err)
  }
  console.log("Cotação da Uniswap",)
  console.log("%O",response.data)
  console.log("%O",response.data.sources)
}

getDefaultQuote()
getUniSwapV3Quote()
Enter fullscreen mode Exit fullscreen mode

Linha 1: Estamos importando axios, um módulo popular do Node para fazer solicitação HTTPS.

Linha 2: Em seguida, estamos importando qs, que é usado principalmente para formatar nossa string de consulta para que nossa API funcione.

Linha 3-7: Estamos criando um objeto que contém detalhes sobre:

  1. O token que queremos vender. Neste caso, o ETH.

  2. O token que queremos comprar. Então, vamos comprar algum DAI.

  3. A quantidade de token que você deseja vender. Neste caso, estamos vendendo 0,005 Ether ou 0,005 * 10^8 Wei.

Linha 8: Estamos armazenando o URL-base em uma variável.

Linha 11: Definimos uma função que nos traria a melhor cotação de preço pela 0x para o par dado.

Linha 12: Estamos definindo uma variável para armazenar a resposta que recebemos da API.

Linha 13: Início do bloco try.

Linha 14: Estamos chamando a API usando axios. No parâmetro get, estamos passando o URL-base e o objeto de consulta formatado. Estamos armazenando a saída na variável de resposta.

Linha 15-17: Fim do bloco try. Temos um bloco catch para registrar qualquer erro da API.

Linha 18-21: Estamos exibindo a cotação do par de tokens e a fonte de onde os estamos obtendo.

Linha 24-41: Estamos seguindo o mesmo procedimento acima, exceto que estamos passando um campo adicional, ou seja, includedSources no objeto params, que contém o nome da DEX da qual queremos buscar a cotação. Neste caso, queremos buscar a cotação da UniSwapV3.

Linha 43-44: Estamos chamando as funções acima para ver sua saída.

Agora, no terminal, execute:

node index
Enter fullscreen mode Exit fullscreen mode

Saída

Você deve ver uma saída semelhante às abaixo:

  1. Para cotação-padrão
Default Quote
{
  chainId: 1,
  price: '1813.2127887520304968',
  guaranteedPrice: '1795.0806608645101918',
  to: '0xdef1c0ded9bec7f1a1670819833240f027b25eff',
  data: '0xd9627aa400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000007c8f09c066034caf00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f869584cd0000000000000000000000001000000000000000000000000000000000000011000000000000000000000000000000000000000000000083951146f160f5b444',
  value: '5000000000000000',
  gas: '136000',
  estimatedGas: '136000',
  gasPrice: '59000000000',
  protocolFee: '0',
  minimumProtocolFee: '0',
  buyTokenAddress: '0x6b175474e89094c44da98b954eedeac495271d0f',
  sellTokenAddress: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
  buyAmount: '9066063943760152484',
  sellAmount: '5000000000000000',
  sources: [
    { name: '0x', proportion: '0' },
    { name: 'Uniswap', proportion: '0' },
    { name: 'Uniswap_V2', proportion: '0' },
    { name: 'Eth2Dai', proportion: '0' },
    { name: 'Kyber', proportion: '0' },
    { name: 'Curve', proportion: '0' },
    { name: 'Balancer', proportion: '0' },
    { name: 'Balancer_V2', proportion: '0' },
    { name: 'Bancor', proportion: '0' },
    { name: 'mStable', proportion: '0' },
    { name: 'Mooniswap', proportion: '0' },
    { name: 'Swerve', proportion: '0' },
    { name: 'SnowSwap', proportion: '0' },
    { name: 'SuiSwap', proportion: '1' },
    { name: 'Shell', proportion: '0' },
    { name: 'MultiHop', proportion: '0' },
    { name: 'DODO', proportion: '0' },
    { name: 'DODO_V2', proportion: '0' },
    { name: 'CREAM', proportion: '0' },
    { name: 'LiquidityProvider', proportion: '0' },
    { name: 'CryptoCom', proportion: '0' },
    { name: 'Linkswap', proportion: '0' },
    { name: 'Lido', proportion: '0' },
    { name: 'MakerPsm', proportion: '0' },
    { name: 'KyberDMM', proportion: '0' },
    { name: 'Smoothy', proportion: '0' },
    { name: 'Component', proportion: '0' },
    { name: 'Saddle', proportion: '0' },
    { name: 'xSigma', proportion: '0' },
    { name: 'Uniswap_V3', proportion: '0' },
    { name: 'Curve_V2', proportion: '0' },
    { name: 'ShibaSwap', proportion: '0' }
  ],
  orders: [
    {
    makerToken: '0x6b175474e89094c44da98b954eedeac495271d0f',
    takerToken: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
    makerAmount: '9066063943760152484',
    takerAmount: '5000000000000000',
    fillData: [Object],
    source: 'SuiSwap',
    sourcePathId: '0x2ea41c4f046aa0e743deb854fb95d19a4c011243a12d190f8a22cf14e974c86b',
    type: 0
    }
  ],
  allowanceTarget: '0x0000000000000000000000000000000000000000',
  sellTokenToEthRate: '1',
  buyTokenToEthRate: '1813.2096453862199738'
}
[
  { name: '0x', proportion: '0' },
  { name: 'Uniswap', proportion: '0' },
  { name: 'Uniswap_V2', proportion: '0' },
  { name: 'Eth2Dai', proportion: '0' },
  { name: 'Kyber', proportion: '0' },
  { name: 'Curve', proportion: '0' },
  { name: 'Balancer', proportion: '0' },
  { name: 'Balancer_V2', proportion: '0' },
  { name: 'Bancor', proportion: '0' },
  { name: 'mStable', proportion: '0' },
  { name: 'Mooniswap', proportion: '0' },
  { name: 'Swerve', proportion: '0' },
  { name: 'SnowSwap', proportion: '0' },
  { name: 'SuiSwap', proportion: '1' },
  { name: 'Shell', proportion: '0' },
  { name: 'MultiHop', proportion: '0' },
  { name: 'DODO', proportion: '0' },
  { name: 'DODO_V2', proportion: '0' },
  { name: 'CREAM', proportion: '0' },
  { name: 'LiquidityProvider', proportion: '0' },
  { name: 'CryptoCom', proportion: '0' },
  { name: 'Linkswap', proportion: '0' },
  { name: 'Lido', proportion: '0' },
  { name: 'MakerPsm', proportion: '0' },
  { name: 'KyberDMM', proportion: '0' },
  { name: 'Smoothy', proportion: '0' },
  { name: 'Component', proportion: '0' },
  { name: 'Saddle', proportion: '0' },
  { name: 'xSigma', proportion: '0' },
  { name: 'Uniswap_V3', proportion: '0' },
  { name: 'Curve_V2', proportion: '0' },
  { name: 'ShibaSwap', proportion: '0' }
]
Enter fullscreen mode Exit fullscreen mode
  1. Para Cotação UniSwapV3
UniswapV3 Quote
{
  chainId: 1,
  price: '1819.24780097598123892',
  guaranteedPrice: '1801.05532296622142652',
  to: '0xdef1c0ded9bec7f1a1670819833240f027b25eff',
  data: '0x3598d8ab0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000004e1bbb1b11f673a5e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f46b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000869584cd00000000000000000000000010000000000000000000000000000000000000110000000000000000000000000000000000000000000000c2bfe11f3560f5b443',
  value: '50000000000000000',
  gas: '151000',
  estimatedGas: '151000',
  gasPrice: '59000000000',
  protocolFee: '0',
  minimumProtocolFee: '0',
  buyTokenAddress: '0x6b175474e89094c44da98b954eedeac495271d0f',
  sellTokenAddress: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
  buyAmount: '90962390048799061946',
  sellAmount: '50000000000000000',
  sources: [
    { name: '0x', proportion: '0' },
    { name: 'Uniswap', proportion: '0' },
    { name: 'Uniswap_V2', proportion: '0' },
    { name: 'Eth2Dai', proportion: '0' },
    { name: 'Kyber', proportion: '0' },
    { name: 'Curve', proportion: '0' },
    { name: 'Balancer', proportion: '0' },
    { name: 'Balancer_V2', proportion: '0' },
    { name: 'Bancor', proportion: '0' },
    { name: 'mStable', proportion: '0' },
    { name: 'Mooniswap', proportion: '0' },
    { name: 'Swerve', proportion: '0' },
    { name: 'SnowSwap', proportion: '0' },
    { name: 'SuiSwap', proportion: '0' },
    { name: 'Shell', proportion: '0' },
    { name: 'MultiHop', proportion: '0' },
    { name: 'DODO', proportion: '0' },
    { name: 'DODO_V2', proportion: '0' },
    { name: 'CREAM', proportion: '0' },
    { name: 'LiquidityProvider', proportion: '0' },
    { name: 'CryptoCom', proportion: '0' },
    { name: 'Linkswap', proportion: '0' },
    { name: 'Lido', proportion: '0' },
    { name: 'MakerPsm', proportion: '0' },
    { name: 'KyberDMM', proportion: '0' },
    { name: 'Smoothy', proportion: '0' },
    { name: 'Component', proportion: '0' },
    { name: 'Saddle', proportion: '0' },
    { name: 'xSigma', proportion: '0' },
    { name: 'Uniswap_V3', proportion: '1' },
    { name: 'Curve_V2', proportion: '0' },
    { name: 'ShibaSwap', proportion: '0' }
  ],
  orders: [
    {
    makerToken: '0x6b175474e89094c44da98b954eedeac495271d0f',
    takerToken: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
    makerAmount: '90962390048799061946',
    takerAmount: '50000000000000000',
    fillData: [Object],
    source: 'Uniswap_V3',
    sourcePathId: '0xfe215f0d81d8367ed86f2044b4b354d556f564f8bcb5bfec85fa07c54f31015c',
    type: 0
    }
  ],
  allowanceTarget: '0x0000000000000000000000000000000000000000',
  sellTokenToEthRate: '1',
  buyTokenToEthRate: '1813.2096453862199738'
}
[
  { name: '0x', proportion: '0' },
  { name: 'Uniswap', proportion: '0' },
  { name: 'Uniswap_V2', proportion: '0' },
  { name: 'Eth2Dai', proportion: '0' },
  { name: 'Kyber', proportion: '0' },
  { name: 'Curve', proportion: '0' },
  { name: 'Balancer', proportion: '0' },
  { name: 'Balancer_V2', proportion: '0' },
  { name: 'Bancor', proportion: '0' },
  { name: 'mStable', proportion: '0' },
  { name: 'Mooniswap', proportion: '0' },
  { name: 'Swerve', proportion: '0' },
  { name: 'SnowSwap', proportion: '0' },
  { name: 'SuiSwap', proportion: '0' },
  { name: 'Shell', proportion: '0' },
  { name: 'MultiHop', proportion: '0' },
  { name: 'DODO', proportion: '0' },
  { name: 'DODO_V2', proportion: '0' },
  { name: 'CREAM', proportion: '0' },
  { name: 'LiquidityProvider', proportion: '0' },
  { name: 'CryptoCom', proportion: '0' },
  { name: 'Linkswap', proportion: '0' },
  { name: 'Lido', proportion: '0' },
  { name: 'MakerPsm', proportion: '0' },
  { name: 'KyberDMM', proportion: '0' },
  { name: 'Smoothy', proportion: '0' },
  { name: 'Component', proportion: '0' },
  { name: 'Saddle', proportion: '0' },
  { name: 'xSigma', proportion: '0' },
  { name: 'Uniswap_V3', proportion: '1' },
  { name: 'Curve_V2', proportion: '0' },
  { name: 'ShibaSwap', proportion: '0' }
]
Enter fullscreen mode Exit fullscreen mode

Aqui estão algumas coisas a se observar:

  1. price: nos dá o melhor preço para o par de tokens, que não envolve taxa de derrapagem.

  2. guaranteedPrice: nos dá o preço do par caso haja uma grande taxa de derrapagem. A API reverterá a chamada se esse preço não for atingido.

  3. buyAmount: A quantidade de token que obteremos em Wei.

  4. sellAmount: A quantidade de token que vendemos em Wei.

  5. sources: Nos dá a proporção da qual o valor é dividido entre diferentes DEX. Estamos obtendo o valor total de uma única DEX, então temos uma proporção de 1 para ambos os casos.

Se você observar de perto, poderá ver que está obtendo um buyAmount mais alto do SushiSwap em comparação com o UniswapV3. Agora, você pode trocar ETH por DAI no SushiSwap por uma quantidade maior de DAI. É recomendável que você experimente diferentes pares de tokens e compare as cotações-padrão na sua DEX favorita. Aqui está uma lista de DEX que você pode passar em params:

0x
Uniswap
Uniswap_V2
Eth2Dai
Kyber
Curve
Balancer
Balancer_V2
Bancor
mStable
Mooniswap
Swerve
SnowSwap
SushiSwap
Shell
MultiHop
DODO
DODO_V2
CREAM
LiquidityProvider
CryptoCom
Linkswap
Lido
MakerPsm
KyberDMM
Smoothy
Component
Saddle
xSigma
Uniswap_V3
Curve_V2
ShibaSwap

Se você deseja obter cotações de várias DEX, pode especificá-las em includedSources separadas por vírgulas. Portanto, se você deseja buscar SushiSwap e UniSwapV3, pode especificá-las como:

const exchangeList = 'Uniswap_V3,SushiSwap'
  const params = {
    buyToken: 'DAI',
    sellToken: 'ETH',
    sellAmount: 0.05 * Math.pow(10, 18).toString(), // Sempre denominado em wei
    includedSources: exchangeList,
  }
Enter fullscreen mode Exit fullscreen mode

Conclusão

Conseguimos obter a melhor cotação de preço para um par de tokens usando a API da 0x. Não tivemos que passar por todas as DEX, comparar a cotação para buscar a melhor cotação e fazer uma negociação. Em vez disso, aproveitamos a API para obter a melhor cotação de preço. Isso pode ser uma base sobre a qual você pode construir um bot de arbitragem. Você pode consultar a documentação oficial para criar seu próximo projeto inovador.

Artigo original publicado no site do Quicknode. Traduzido por Paulinho Giovannini.


Abrace a oportunidade de elevar sua jornada de desenvolvimento para um nível superior. A interação com APIs é apenas o começo; os builds incríveis da WEB3DEV representam a chave de entrada para o emocionante cenário web3. 🚀🧑‍💻

Não perca tempo, 👉inscreva-se👈 agora mesmo e comece a desbravar o universo Blockchain!

Seja também WEB3DEV!

Top comments (0)