
Bu blogda, Next.js ve ShadcnUI ile oluşturulmuş mevcut bir biletleme dApp'ine MetaMask Gas API'nin nasıl entegre edileceğini inceledik.

Blok zinciri tabanlı etkinlik biletleri satın almadan önce gas fiyatını anlamak, hem maliyet şeffaflığı hem de etkili finansal planlama açısından kritik öneme sahiptir. Blok zinciri işlemleri bağlamında "gas", blok zincirinde bir işlemi başarıyla gerçekleştirmek veya bir sözleşmeyi yürütmek için gereken ücreti ifade eder.
Bu ücret, ağ talebine bağlı olarak dalgalanır. Gas fiyatını önceden bilerek bilet alıcıları, satın alma işlemlerinin toplam maliyeti hakkında daha bilinçli kararlar verebilir. Bu durum, özellikle ağ yoğunluğunun yüksek olduğu dönemlerde gas ücretinin bilet toplam maliyetine önemli ölçüde eklenebildiği göz önüne alındığında büyük önem taşır.
Bu eğitimde, kullanıcıların etkinlik biletleri satın alırken gas fiyatlarını görebilmesini sağlamak amacıyla MetaMask Gas API'sini mevcut bir etkinlik biletleme dapp'ine entegre edeceğiz.
Geçerli bir Web3 API anahtarı ve API anahtarı gizli bilgisi.
Node.js ve npm ya da yarn kurulu olmalıdır.
Next.js ve React konusunda temel bilgi.
Frontend framework olarak Next.js, kullanıcı arayüzü için ise ShadcnUI kullanacağız. Aşağıdaki ShadcnUI bileşenlerini yükleyelim:
Yukarıdaki kod, gas fiyatlarını görüntülemek için kullanacağımız hover-card bileşenini ekleyecek ve SWR React hooks kütüphanesini kuracaktır. Stale-While-Revalidate (SWR) kütüphanesi, internetten veri çekme işlemini kolaylaştırır. Önce kaydettiği eski verileri kullanır, ardından yeni veri talep eder ve son olarak eski verileri bu yeni bilgilerle değiştirir. Bu sayede web siteleri hem daha hızlı hem de daha güncel hale gelir.
Ardından, web uygulamalarında görevlerin ilerleme durumunu veya yükleme hallerini göstermek için kullanışlı olan dairesel ilerleme göstergelerini görüntülemek amacıyla react-circular-progressbar bileşenini yükleyeceğiz. Bu bileşen özelleştirilebilir yapıda olup yüksek kaliteli grafikler için SVG kullanılarak uygulanmıştır.
npm i react-circular-progressbarapp/web dizininde şu klasörü oluşturalım: app/api/gas. İçine bir route.ts dosyası oluşturup aşağıdaki kodu ekleyelim:
Burada neler yaptığımıza bakalım:
Sorgu Parametrelerinin Çıkarılması:- const { searchParams } = new URL(request.url);: İstek URL'sinden arama parametrelerini çıkarır.
const chainId = searchParams.get("chainId");: Ethereum ağını belirtmek için kullanılan chainId parametresini URL'den alır.
Yetkilendirmenin Ayarlanması:- INFURA_API_KEY ve INFURA_API_SECRET ortam değişkenleri bir Buffer içinde birleştirilerek Base64 dizesine dönüştürülür. Bu dize, Infura API'sine istek gönderilirken temel HTTP kimlik doğrulaması için kullanılır.
Gas Fiyatları ve Temel Ücret Yüzdelik Dilim Verilerinin Çekilmesi:- Infura API'sine iki eş zamansız fetch isteği gönderilir:- gasPricesResp, belirtilen Ethereum ağı (chainId) için önerilen gas ücretlerini çeker.
baseFeePercentileRes, aynı ağ için temel ücret yüzdelik dilimini çeker.
Authorization başlığı, Base64 ile kodlanmış kimlik bilgileriyle ayarlanır.
Verilerin Ayrıştırılması ve Döndürülmesi:- Her iki fetch isteğinden gelen yanıtlar JSON'a dönüştürülür.
NextResponse.json({...}) aşağıdaki verileri içeren bir JSON yanıtı oluşturur ve döndürür:- estimatedBaseFee: İşlemler için tahmini temel ücret.
baseFeeTrend: Temel ücretin eğilimi (örneğin artış veya azalış).
baseFeePercentile: Temel ücretlerin yüzdelik dilim dağılımı.
GasFeeCard.tsx adında bir bileşen oluşturup içine aşağıdaki kodu ekleyeceğiz:
Burada neler yaptığımıza göz atalım:
Sabitler:- REFETCH_INTERVAL, STEP_INTERVAL, NETWORK_LATENCY: Veri çekme aralığını, geri sayım güncellemeleri için adım aralığını ve tahmini ağ gecikmesini yönetmeye yönelik sabitler.
Yardımcı Fonksiyon:- formatGweiValues: Gas fiyatı değerlerini okunabilir bir biçime dönüştüren fonksiyon; küçük değerler için üstel gösterim, büyük değerler için ise sabit noktalı gösterim kullanır.
GasFeeCard Bileşeni:- Mevcut Ethereum chainId'sini almak için useSDK kullanır.
countdown ve currentChainId durum değişkenleri başlatılır.
İlk useEffect kancası, zincir kimliği değiştiğinde mevcut zincir kimliğini günceller, veri yeniden çekmeyi (mutate) tetikler ve geri sayım zamanlayıcısını sıfırlar.
İkinci useEffect, geri sayımı azaltan ve geri sayım sıfıra ulaştığında veri yeniden çekmeyi tetikleyen bir aralık kurar. Bileşen kaldırıldığında aralığı temizler.
fetcher: Mevcut zincir kimliğini sorgu parametresi olarak ileterek sunucu taraflı bir API uç noktasından gas verisi çeken fonksiyon.
useSWR: fetcher fonksiyonunu kullanarak gas verisi çeken ve veri, yükleme ile hata durumlarını sağlayan kanca.
Render Mantığı:- Bileşen, yükleme ve hata durumlarını koşullu olarak render eder.
trendingUp ve trendingDown, çekilen gas verisindeki baseFeeTrend değerine göre belirlenen boolean değişkenlerdir.
Ana kullanıcı arayüzü; geri sayım ilerleme durumunu gösteren CircularProgressbarWithChildren ve gas fiyatı eğilimini gösteren bir ok simgesiyle birlikte HoverCard'dan oluşur. Tahmini temel ücreti Gwei cinsinden görüntüler.
HoverCardContent, tahmini temel ücret ve geçmiş temel ücret yüzdelik dilimi hakkında daha ayrıntılı bilgi gösterir.
Stil:- Kod, stil için Tailwind CSS sınıflarını kullanır (örneğin text-red-500, cursor-pointer).
CircularProgressbarWithChildren, gas fiyatı eğilimine göre renk değiştirecek şekilde stillendirilmiştir (artış için kırmızı, azalış için yeşil).
Ayrıca lucide-react kütüphanesinden ArrowUp, ArrowDown ve InfoIcon simgelerini kullandık. Geriye kalan tek şey, bu bileşeni GetTicket.tsx bileşenine aktarmak; böylece toplam bilet fiyatlarının altında görüntülenecektir.
Gas fiyatının farkında olmak, alıcıların satın alma işlemleri için en uygun maliyetli zamanı seçmelerine olanak tanır; düşük gas fiyatı dönemlerinde işlem yaparak tasarruf etmelerini sağlar. Bir etkinlik biletleme platformu için bu bilgiyi sunmak, şeffaflığı ve müşteri memnuniyetini artırır; kullanıcılar harcamaları üzerinde daha fazla kontrol sahibi olduklarını hisseder ve beklenmedik ücretlerden kaçınabilirler.
Gas API'sini mevcut bir etkinlik biletleme dapp'ine entegre ettik. Bu eğitime ait kodu buradan bulabilirsiniz.
Ayrıca aşağıdaki kaynakları incelemenizi öneririm:
Gas API Belgeleri: https://docs.infura.io/infura-expansion-apis/gas-api
Gas API Şablonu: https://github.com/meowyx/GasAPI-Template
Keyifli Geliştirmeler 🚀
Yapay zeka tarafından çevrildi. Hatalar içerebilir. Lütfen her zaman bilgileri doğrulayın.