
Neste blog, exploramos a implementação da MetaMask Gas API em um dApp de ingressos existente, desenvolvido com Next.js e ShadcnUI.

Entender o preço do gas antes de comprar ingressos para eventos baseados em blockchain é essencial tanto para a transparência de custos quanto para um planejamento financeiro eficaz. No contexto de transações em blockchain, "gas" refere-se à taxa necessária para realizar com sucesso uma transação ou executar um contrato na blockchain.
Essa taxa varia de acordo com a demanda da rede. Ao conhecer o preço do gas com antecedência, os compradores de ingressos podem tomar decisões mais informadas sobre o custo total de sua compra. Isso é especialmente importante porque a taxa de gas pode aumentar significativamente o custo total do ingresso, principalmente em períodos de alta congestionamento da rede.
Neste tutorial, vamos implementar a Gas API da MetaMask em um dapp de venda de ingressos para eventos já existente, permitindo que os usuários visualizem os preços do gas ao comprar ingressos para eventos.
Uma chave de API Web3 e um segredo de chave de API válidos.
Node.js e npm ou yarn instalados.
Familiaridade com Next.js e React.
Para o framework de frontend, utilizaremos o Next.js, e para a interface, usaremos o ShadcnUI. Vamos instalar os seguintes componentes do ShadcnUI:
O código acima adicionará o componente hover-card, que usaremos para exibir os preços do gas, e instalará a biblioteca de hooks React SWR. A biblioteca Stale-While-Revalidate (SWR) facilita a busca de dados na internet. Ela funciona utilizando primeiro os dados salvos anteriormente, depois solicitando novos dados e, por fim, substituindo os dados antigos pelas novas informações. Isso torna os sites mais rápidos e atualizados.
Em seguida, instalaremos o componente react-circular-progressbar para exibir indicadores de progresso circulares, úteis para mostrar o andamento de tarefas ou estados de carregamento em aplicações web. É personalizável e implementado com SVG para gráficos de alta qualidade.
npm i react-circular-progressbarNo diretório app/web, vamos criar a seguinte pasta: app/api/gas. Dentro dela, vamos criar um arquivo route.ts e adicionar o seguinte código:
Veja o que fizemos aqui:
Extração dos Parâmetros de Consulta:- const { searchParams } = new URL(request.url);: Extrai os parâmetros de busca da URL da requisição.
const chainId = searchParams.get("chainId");: Recupera o parâmetro chainId da URL, utilizado para especificar a rede Ethereum.
Configuração da Autorização:- As variáveis de ambiente INFURA_API_KEY e INFURA_API_SECRET são combinadas em um Buffer e, em seguida, codificadas em uma string Base64. Essa string é usada para autenticação HTTP básica ao fazer requisições à API da Infura.
Busca de Preços de Gas e Dados de Percentil da Taxa Base:- Duas requisições fetch assíncronas são feitas à API da Infura:- gasPricesResp busca as taxas de gas sugeridas para a rede Ethereum especificada (chainId).
baseFeePercentileRes busca o percentil da taxa base para a mesma rede.
O cabeçalho Authorization é definido com as credenciais codificadas em Base64.
Análise e Retorno dos Dados:- As respostas de ambas as requisições fetch são convertidas para JSON.
NextResponse.json({...}) cria e retorna uma resposta JSON contendo os seguintes dados:- estimatedBaseFee: A taxa base estimada para transações.
baseFeeTrend: A tendência da taxa base (por exemplo, em alta ou em queda).
baseFeePercentile: A distribuição percentual das taxas base.
Vamos criar um componente chamado GasFeeCard.tsx e adicionar o seguinte código:
Veja o que fizemos aqui:
Constantes:- REFETCH_INTERVAL, STEP_INTERVAL, NETWORK_LATENCY: Constantes para gerenciar o intervalo de busca de dados, o intervalo de etapas para atualizações de contagem regressiva e a latência estimada da rede.
Função Utilitária:- formatGweiValues: Uma função para formatar os valores de preço do gas em um formato legível, usando notação exponencial para valores pequenos ou notação de ponto fixo para valores maiores.
Componente GasFeeCard:- Usa useSDK para obter o chainId atual do Ethereum.
As variáveis de estado countdown e currentChainId são inicializadas.
O primeiro hook useEffect atualiza o ID da chain atual e aciona a nova busca de dados (mutate) quando o ID da chain muda. Ele também reinicia o temporizador de contagem regressiva.
O segundo useEffect configura um intervalo que decrementa a contagem regressiva e aciona uma nova busca de dados quando ela chega a zero. O intervalo é limpo ao desmontar o componente.
fetcher: Uma função que busca dados de gas em um endpoint de API do lado do servidor, passando o ID da chain atual como parâmetro de consulta.
useSWR: Este hook é usado para buscar dados de gas com a função fetcher e fornece os estados de dados, carregamento e erro.
Lógica de Renderização:- O componente renderiza condicionalmente os estados de carregamento e erro.
trendingUp e trendingDown são booleanos determinados pelo baseFeeTrend dos dados de gas obtidos.
A interface principal consiste em um HoverCard com um CircularProgressbarWithChildren indicando o progresso da contagem regressiva e um ícone de seta mostrando a tendência do preço do gas. Ele exibe a taxa base estimada em Gwei.
O HoverCardContent exibe informações mais detalhadas sobre a taxa base estimada e o percentil histórico da taxa base.
Estilização:- O código usa classes do Tailwind CSS para estilização (por exemplo, text-red-500, cursor-pointer).
O CircularProgressbarWithChildren é estilizado para mudar de cor com base na tendência do preço do gas (vermelho para alta, verde para queda).
Também utilizamos os ícones ArrowUp, ArrowDown e InfoIcon do lucide-react. Agora, basta importar este componente no componente GetTicket.tsx para que ele seja exibido abaixo do preço total dos ingressos.
Conhecer o preço do gas permite que os compradores escolham o momento mais econômico para realizar sua compra, podendo economizar dinheiro ao transacionar em períodos de gas mais baixo. Para uma plataforma de venda de ingressos para eventos, fornecer essa informação aumenta a transparência e a satisfação dos clientes, pois os usuários se sentem mais no controle de seus gastos e podem evitar taxas inesperadas.
Implementamos a Gas API em um dapp de venda de ingressos para eventos já existente. Você pode encontrar o código deste tutorial aqui
Também recomendo conferir os seguintes recursos:
Documentação da Gas API: https://docs.infura.io/infura-expansion-apis/gas-api
Template da Gas API: https://github.com/meowyx/GasAPI-Template
Bons projetos! 🚀
Traduzido por IA. Pode conter erros. Por favor, verifique sempre as informações.