
En este blog, exploramos cómo implementar la MetaMask Gas API en una dApp de ticketing existente creada con Next.js y ShadcnUI.

Comprender el precio del gas antes de comprar entradas para eventos basados en blockchain es fundamental tanto para la transparencia de costos como para una planificación financiera eficaz. En el contexto de las transacciones en blockchain, el término "gas" hace referencia a la tarifa necesaria para ejecutar con éxito una transacción o un contrato en la blockchain.
Esta tarifa varía según la demanda de la red. Al conocer el precio del gas con antelación, los compradores de entradas pueden tomar decisiones más informadas sobre el costo total de su compra. Esto es especialmente importante, ya que la tarifa de gas puede incrementar considerablemente el costo total de la entrada, en particular durante períodos de alta congestión en la red.
En este tutorial, implementaremos la API de Gas de MetaMask en una dapp de venta de entradas para eventos ya existente, lo que permitirá a los usuarios ver los precios del gas mientras compran entradas.
Una clave de API Web3 y un secreto de clave de API válidos.
Node.js y npm o yarn instalados.
Familiaridad con Next.js y React.
Para el framework de frontend utilizaremos Next.js y, para la interfaz de usuario, ShadcnUI. Instalemos los siguientes componentes de ShadcnUI:
El código anterior añadirá el componente hover-card que usaremos para mostrar los precios del gas e instalará la biblioteca de hooks de React SWR. La biblioteca Stale-While-Revalidate (SWR) facilita la obtención de datos desde internet. Funciona utilizando primero los datos guardados anteriormente, luego solicitando datos nuevos y, finalmente, reemplazando los datos antiguos con la información actualizada. Esto hace que los sitios web sean más rápidos y estén más actualizados.
A continuación, instalaremos el componente react-circular-progressbar para mostrar indicadores de progreso circulares, útiles para visualizar el avance de tareas o estados de carga en aplicaciones web. Es personalizable y está implementado con SVG para gráficos de alta calidad.
npm i react-circular-progressbarEn el directorio app/web, crearemos la siguiente carpeta: app/api/gas. Dentro de ella, crearemos un archivo route.ts y añadiremos el siguiente código:
Veamos qué hicimos aquí:
Extracción de parámetros de consulta:- const { searchParams } = new URL(request.url);: Extrae los parámetros de búsqueda de la URL de la solicitud.
const chainId = searchParams.get("chainId");: Recupera el parámetro chainId de la URL, que se utiliza para especificar la red de Ethereum.
Configuración de la autorización:- Las variables de entorno INFURA_API_KEY e INFURA_API_SECRET se combinan en un Buffer y luego se codifican en una cadena Base64. Esta cadena se utiliza para la autenticación HTTP básica al realizar solicitudes a la API de Infura.
Obtención de precios de gas y datos de percentil de tarifa base:- Se realizan dos solicitudes fetch asíncronas a la API de Infura:- gasPricesResp obtiene las tarifas de gas sugeridas para la red de Ethereum especificada (chainId).
baseFeePercentileRes obtiene el percentil de la tarifa base para la misma red.
El encabezado Authorization se establece con las credenciales codificadas en Base64.
Análisis y devolución de datos:- Las respuestas de ambas solicitudes fetch se convierten a JSON.
NextResponse.json({...}) crea y devuelve una respuesta JSON con los siguientes datos:- estimatedBaseFee: La tarifa base estimada para las transacciones.
baseFeeTrend: La tendencia de la tarifa base (por ejemplo, en aumento o en descenso).
baseFeePercentile: La distribución por percentiles de las tarifas base.
Crearemos un componente llamado GasFeeCard.tsx y añadiremos el siguiente código:
Veamos qué hicimos aquí:
Constantes:- REFETCH_INTERVAL, STEP_INTERVAL, NETWORK_LATENCY: Constantes para gestionar el intervalo de obtención de datos, el intervalo de paso para las actualizaciones de la cuenta regresiva y la latencia estimada de la red.
Función utilitaria:- formatGweiValues: Una función para formatear los valores del precio del gas en un formato legible, utilizando notación exponencial para valores pequeños o notación de punto fijo para valores más grandes.
Componente GasFeeCard:- Usa useSDK para obtener el chainId actual de Ethereum.
Se inicializan las variables de estado countdown y currentChainId.
El primer hook useEffect actualiza el ID de cadena actual y activa la nueva obtención de datos (mutate) cuando el ID de cadena cambia. También reinicia el temporizador de cuenta regresiva.
El segundo useEffect configura un intervalo que decrementa la cuenta regresiva y activa una nueva obtención de datos cuando esta llega a cero. Limpia el intervalo al desmontar el componente.
fetcher: Una función que obtiene datos de gas desde un endpoint de API del lado del servidor, pasando el ID de cadena actual como parámetro de consulta.
useSWR: Este hook se utiliza para obtener datos de gas mediante la función fetcher y proporciona los estados de datos, carga y error.
Lógica de renderizado:- El componente renderiza condicionalmente los estados de carga y error.
trendingUp y trendingDown son valores booleanos determinados por el baseFeeTrend de los datos de gas obtenidos.
La interfaz principal consiste en un HoverCard con un CircularProgressbarWithChildren que indica el progreso de la cuenta regresiva y un ícono de flecha que muestra la tendencia del precio del gas. Muestra la tarifa base estimada en Gwei.
El HoverCardContent muestra información más detallada sobre la tarifa base estimada y el percentil histórico de la tarifa base.
Estilos:- El código utiliza clases de Tailwind CSS para los estilos (por ejemplo, text-red-500, cursor-pointer).
El CircularProgressbarWithChildren cambia de color según la tendencia del precio del gas (rojo para valores en aumento, verde para valores en descenso).
También utilizamos los íconos ArrowUp, ArrowDown e InfoIcon de lucide-react. Ahora solo queda importar este componente en el componente GetTicket.tsx para que se muestre debajo del precio total de las entradas.
Conocer el precio del gas permite a los compradores elegir el momento más rentable para realizar su compra, pudiendo ahorrar dinero al realizar transacciones durante períodos de precios de gas más bajos. Para una plataforma de venta de entradas para eventos, ofrecer esta información mejora la transparencia y la satisfacción del cliente, ya que los usuarios sienten mayor control sobre su gasto y pueden evitar cargos inesperados.
Hemos implementado la API de Gas en una dapp de venta de entradas para eventos ya existente. Puedes encontrar el código de este tutorial aquí.
También te recomiendo consultar los siguientes recursos:
Documentación de la API de Gas: https://docs.infura.io/infura-expansion-apis/gas-api
Plantilla de la API de Gas: https://github.com/meowyx/GasAPI-Template
¡Feliz desarrollo! 🚀
Traducido por IA. Puede contener errores. Por favor, verifique siempre la información.