JavaScript'te Kripto İşlemi Gönderme: ChainGate ile Bitcoin, Ethereum, Litecoin, Dogecoin ve Daha Fazlası

Tek bir SDK'dan Bitcoin, Ethereum, Avalanche, Litecoin, Dogecoin ve Bitcoin Cash göndermek için pratik bir JavaScript rehberi — yazan: ChainGate.

Bitcoin, Ethereum, Avalanche, Litecoin, Dogecoin and Bitcoin Cash — +6 chains, one JavaScript transfer() call

JavaScript'ten on-chain veri okumak hep işin tatsız tarafı oldu. Temiz bir Bitcoin bakiyesi çekmek — bir explorer'ın gösterdiği gibi onaylanmış ve onaylanmamış birlikte — genelde kendi indexer'ını çalıştırmak ya da sallantılı bir public API'ye yüklenmek demek. Bir Ethereum veya EVM adresinin tuttuğu NFT ve token'ları listelemek ise her biri kendi schema'sına, rate limit'ine ve eksik alanlarına sahip üç dört explorer endpoint'ini bir araya dikmek demek. Bir işlemi gerçekten broadcast etmek istediğinde de yine Bitcoin için bitcoinjs-lib, EVM tarafında ethers ya da viem ve Dogecoin ile Litecoin için yarı bakımlı bir fork ile karşı karşıyasın. ChainGate tüm bunu tek bir SDK'dan kapsar.

ChainGate bu işi tek bir JavaScript SDK'sında topluyor. Multi-chain bir wallet SDK'sı olarak tasarlanmış, aynı çağrı şekli Bitcoin, Ethereum, Avalanche (ve her EVM zinciri), Litecoin, Dogecoin ve Bitcoin Cash gönderir, adres bakiyelerini okur ve herhangi bir adresteki asset'leri listeler. Aynı paket Node.js'te ve tarayıcıda kod değiştirmeden çalışır — her crypto primitive'i native şekilde gelir, polyfill gerekmez.

Aşağıda temel beş satırlık gönderim. Rehberin geri kalanı aynı pattern'i her zincirde dolaşıyor, sonra broadcast'ten önce fee tahmini ve bakiye kontrolü ekliyor:

import { ChainGate, importWallet } from 'chaingate';

const cg = new ChainGate({ apiKey: 'your-api-key' });
const wallet = importWallet({ phrase: process.env.MNEMONIC });
const btc = cg.connect(cg.networks.bitcoin, wallet);

const tx = await btc.transfer(cg.networks.bitcoin.amount('0.001'), 'bc1qRecipient...');
await tx.signAndBroadcast();

Kısa özet

  • Tek SDK, tüm zincirler. Aynı transfer() API'si Bitcoin, Ethereum, Avalanche, Litecoin, Dogecoin, Bitcoin Cash ve EVM uyumlu her ağı kapsar.
  • Node.js 22+ ve modern tarayıcılarda hiç değiştirmeden çalışır — Buffer ya da crypto polyfill kurulumu gerekmez.
  • Fee, bakiye ve broadcast hepsi içeride — hiçbiri için ikinci bir kütüphane gerekmez.
  • İmzalama her zaman yerel olarak yapılır. Private key'in SDK sınırını terk etmez.

1. Setup: ChainGate'i kurma ve başlatma

Paket yöneticini seç. SDK tek bir npm paketi olarak yayınlanıyor — bir kez kur, aynı import'tan Bitcoin, Ethereum ve gerisini gönderebilirsin, tipler dahil:

# pick your package manager
npm install chaingate
pnpm add chaingate
yarn add chaingate

Sonra ücretsiz API key'i ChainGate dashboard'undan al. Kayıt yaklaşık bir dakika sürer ve ücretsiz plan bir prototipi ürüne taşımak için yeter. Client'ı bu key ile bir kez başlat ve her zincir için tekrar kullan:

import { ChainGate } from 'chaingate';

const cg = new ChainGate({ apiKey: process.env.CHAINGATE_API_KEY });

Node.js'te de tarayıcıda da aynı kod. Paket Node 22+, modern tarayıcılar (Vite, Next.js, Webpack 5+) ve Bun'da kutudan çıkar çıkmaz çalışır, böylece sunucuda import ettiğin Node.js blockchain kütüphanesi, kullanıcının tarayıcısında da aynı şekilde çalışır. Buffer ve randomBytes gibi crypto primitive'leri SDK'nın içinde native olarak geliyor — polyfill'lemek için bir şey yok, yapılandıracak bir şey yok.

TypeScript tipleri pakette geliyor. @types/chaingate paketi yok çünkü ihtiyaç yok — her public class, method ve event kaynağında tam tipli.

2. Bitcoin, Litecoin, Dogecoin ve Bitcoin Cash gönderme

Bitcoin, Litecoin, Dogecoin ve Bitcoin Cash aynı muhasebe modelini paylaşır — UTXO'lar. Bir wallet'ın bakiyesi, adreslerine kilitli unspent transaction output'ların toplamıdır. Fon göndermek için wallet, miktarı karşılayacak kadar UTXO seçer; bunları input olarak tüketen yeni bir işlem oluşturur; alıcıya bir output yollar; kalanı kendisine change output olarak geri gönderir; kilobayt başına satoshi (ya da zincir karşılığı) cinsinden bir fee öder.

ChainGate her adımı — UTXO seçimi, change output, fee tier'ı ve imza — tek bir transfer() çağrısının arkasında halleder. Hedef adres ve miktar verirsin, broadcast'e hazır imzalı bir işlem alırsın.

Node.js veya tarayıcıda Bitcoin gönderme

Temel örnek. Wallet'ı Bitcoin ağına bağla, transfer'i oluştur, bir fee tier'ı seç ve broadcast et:

import { ChainGate, importWallet, NotEnoughFundsError } from 'chaingate';

const cg = new ChainGate({ apiKey: process.env.CHAINGATE_API_KEY });
const wallet = importWallet({ phrase: process.env.MNEMONIC });

const btc = cg.connect(cg.networks.bitcoin, wallet);
const amount = cg.networks.bitcoin.amount('0.001'); // 0.001 BTC

try {
  const tx = await btc.transfer(amount, 'bc1qRecipient...');
  tx.setFee(tx.recommendedFees().normal);

  const broadcast = await tx.signAndBroadcast();
  console.log('BTC txid:', broadcast.transactionId);
} catch (err) {
  if (err instanceof NotEnoughFundsError) {
    console.error('Not enough BTC for this transfer + fee');
  }
  throw err;
}

Geliştirmede testnet'i hedeflemek için cg.networks.bitcoin yerine cg.networks.bitcoinTestnet koy — kodun geri kalanı aynı kalır.

Node.js veya tarayıcıda Litecoin gönderme

Aynı kod, farklı ağ. Bitcoin snippet'ine göre diff tam anlamıyla bir tanımlayıcıdan ibaret:

const ltc = cg.connect(cg.networks.litecoin, wallet);
const amount = cg.networks.litecoin.amount('0.1'); // 0.1 LTC

const tx = await ltc.transfer(amount, 'ltc1qRecipient...');
tx.setFee(tx.recommendedFees().normal);
await tx.signAndBroadcast();

Litecoin varsayılanda ltc1q… SegWit adreslerini kullanır ve blokları her iki buçuk dakikada bir onaylar — Bitcoin'in yaklaşık dört katı hızda — bu yüzden settlement hızının güvenlik derinliğinden daha önemli olduğu düşük tutarlı ödemeler için popüler bir tercihtir.

Node.js veya tarayıcıda Dogecoin gönderme

Aynı diff, farklı zincir:

const doge = cg.connect(cg.networks.dogecoin, wallet);
const amount = cg.networks.dogecoin.amount('100'); // 100 DOGE

const tx = await doge.transfer(amount, 'DRecipientAddress...');
tx.setFee(tx.recommendedFees().normal);
await tx.signAndBroadcast();

Dogecoin'in JavaScript ekosistemi UTXO ailesinin geri kalanının gerisinde kaldı. bitcoinjs-lib'in popüler fork'larının çoğu yıllardır güncellenmiyor ve bakımı yapılan birkaç alternatif özel. ChainGate, bugün JavaScript'te üretim kalitesinde Dogecoin desteği sunan birkaç seçenekten biri.

Node.js veya tarayıcıda Bitcoin Cash gönderme

Bitcoin Cash varsayılan olarak CashAddr adreslerini kullanır ama SDK legacy formatını da kabul eder — ikisini de transfer() içine yapıştırabilirsin, ağ yine onaylayacaktır:

const bch = cg.connect(cg.networks.bitcoincash, wallet);
const amount = cg.networks.bitcoincash.amount('0.05'); // 0.05 BCH

// CashAddr or legacy — both work
const tx = await bch.transfer(amount, 'bitcoincash:qpRecipient...');
tx.setFee(tx.recommendedFees().normal);
await tx.signAndBroadcast();

Adres doğrulama çift yönlü: cg.networks.bitcoincash.isValidAddress() her iki format için de true döner, dolayısıyla göndermeden önce kullanıcı girdisini normalize etmen gerekmiyor.

Tarayıcıdan UTXO gönderme

Yukarıdaki dört UTXO snippet'i Vite, Next.js veya Webpack 5 bundle'ında değişiklik olmadan çalışır — aynı import client tarafında çalışır ve aynı wallet API ile konuşmadan yerel olarak imza atar.

Bir güvenlik notu: üretim private key'lerini doğrudan bir frontend'e yükleme. Ya imzalamayı sunucuda tut ve tarayıcıdan sadece broadcast'i çağır, ya da kullanıcının kontrolündeki wallet tarzı bir akış üzerinden anahtarı kullanıcıdan al.

3. Ethereum ve EVM zincirlerini gönderme

Ethereum'un hesap modeli farklı — UTXO yok, sadece bakiyeye ve monoton artan bir nonce'a sahip bir adres var. ChainGate bu farkı, Bitcoin'de kullandığın aynı transfer() çağrısının arkasında saklar. Farklar (nonce yönetimi, EIP-1559 base fee + tip, gas limit) senin için hesaplanır:

const eth = cg.connect(cg.networks.ethereum, wallet);
const amount = cg.networks.ethereum.amount('0.01'); // 0.01 ETH

const tx = await eth.transfer(amount, '0xRecipient...');
tx.setFee(tx.recommendedFees().normal);

const broadcast = await tx.signAndBroadcast();
console.log('ETH txHash:', broadcast.transactionId);

Avalanche'ı Node.js veya tarayıcıdan gönderme

Avalanche'ın C-Chain'i Ethereum'un yanında birinci sınıf ağ olarak bağlıdır — aynı çağrı şekli, aynı wallet, AVAX cinsinden tutarlar. Ethereum snippet'iyle aradaki diff tek bir tanımlayıcıdan ibaret:

const avax = cg.connect(cg.networks.avalanche, wallet);
const amount = cg.networks.avalanche.amount('1'); // 1 AVAX

const tx = await avax.transfer(amount, '0xRecipient...');
tx.setFee(tx.recommendedFees().normal);
await tx.signAndBroadcast();

C-Chain blokları yaklaşık iki saniyede sonlandırır ve Ethereum'la aynı EIP-1559 fee modelinde çalışır, dolayısıyla AVAX transferleri hızla yerine oturur ve recommendedFees() çıktısı aynı biçimdedir. Bu da Ethereum gas'inin kullanıcıyı fiyat olarak dışarıda bıraktığı yüksek hacimli ödemelerde Avalanche'ı popüler bir tercih yapar.

Aynı wallet, aynı SDK, her EVM zinciri. Hosted RPC URL'leri Polygon, Arbitrum, Base, BNB Chain ve Sonic'i kutudan çıkar çıkmaz kapsar; başka herhangi bir EVM ağı için — Optimism, Linea, Scroll, Gnosis, kendi node'un, bir testnet — JSON-RPC URL'sini doğrudan evmRpc()'ye geçir. Polygon'da POL göndermek tek satırlık bir diff:

const polygon = cg.networks.evmRpc({
  rpcUrl: cg.rpcUrls.polygon,
  chainId: 137,
  name: 'Polygon',
  symbol: 'POL',
});

const pol = cg.connect(polygon, wallet);
const amount = polygon.amount('5'); // 5 POL

const tx = await pol.transfer(amount, '0xRecipient...');
tx.setFee(tx.recommendedFees().normal);
await tx.signAndBroadcast();

Nonce yönetimi otomatik. SDK imzalamadan önce seçilen RPC'den son pending nonce'u okur, dolayısıyla kendin takip etmek zorunda değilsin. Fee yapımı destekleyen zincirlerde varsayılanda EIP-1559 (maxFeePerGas + maxPriorityFeePerGas) kullanır ve desteklemeyen zincirlerde legacy gas pricing'e döner.

evmRpc()'ye geçirdiğin chainId, RPC uç noktasının kendi bildirdiği değer olmalı; yoksa SDK yanlış ağ için imzalar. EVM chain ID listesi Polygon, Arbitrum, Base, Optimism ve 35 başka ağ ile testnet'in numarasını verir ve numarayı herhangi bir RPC URL'sinden doğrudan nasıl okuyacağını gösterir.

Düğüm bir broadcast'e "nonce too low", "replacement transaction underpriced" ya da "insufficient funds for gas * price + value" ile cevap verirse Ethereum işlem hataları rehberi her mesajın ne anlama geldiğini ve hangilerinin gas'a mal olduğunu açıklar.

Tarayıcı desteği UTXO zincirleriyle aynı. Bu kod tam olarak bir dApp'te 'Send' butonunun arkasına koyacağın kod.

4. Göndermeden önce fee tahmini

Broadcast'ten önce her zaman fee'yi göster. Kullanıcılar sürprizleri sevmez, sıkışan işlemler vakit harcar ve bir 'gözden geçir ve onayla' adımı tek vuruşluk bir UI akışını kullanıcının gerçekten güvendiği bir şeye dönüştürür.

ChainGate her zincirde aynı recommendedFees() methodunu sunar — dört tier (low, normal, high, maximum) ve her tier için gereken sayıları döndürür. Bitcoin'de feePerKbSat oranı ve satoshi cinsinden tahmini toplam alırsın; Ethereum ve diğer EVM zincirlerinde EIP-1559 maxFeePerGas ve maxPriorityFeePerGas'ı bigint wei değerleri olarak ve bir tahmini onay penceresi alırsın:

// Bitcoin — fee rate in sat/kB, plus the total estimated fee in satoshis
const btcTx = await btc.transfer(cg.networks.bitcoin.amount('0.01'), 'bc1q...');
const btcFees = btcTx.recommendedFees();

console.table({
  low:    { satPerKb: btcFees.low.feePerKbSat,    feeSat: btcFees.low.estimatedFeeSat,    enough: btcFees.low.enoughFunds },
  normal: { satPerKb: btcFees.normal.feePerKbSat, feeSat: btcFees.normal.estimatedFeeSat, enough: btcFees.normal.enoughFunds },
  high:   { satPerKb: btcFees.high.feePerKbSat,   feeSat: btcFees.high.estimatedFeeSat,   enough: btcFees.high.enoughFunds },
});

// Ethereum — EIP-1559 numbers in gwei
const ethTx = await eth.transfer(cg.networks.ethereum.amount('0.1'), '0x...');
const ethFees = ethTx.recommendedFees();
const toGwei = (wei) => Number(wei) / 1e9;

console.table({
  low:     { gwei: toGwei(ethFees.low.maxFeePerGas),     sec: ethFees.low.estimatedConfirmationSecs },
  normal:  { gwei: toGwei(ethFees.normal.maxFeePerGas),  sec: ethFees.normal.estimatedConfirmationSecs },
  high:    { gwei: toGwei(ethFees.high.maxFeePerGas),    sec: ethFees.high.estimatedConfirmationSecs },
  maximum: { gwei: toGwei(ethFees.maximum.maxFeePerGas), sec: ethFees.maximum.estimatedConfirmationSecs },
});

Üretimde işe yarayan pattern: işlemi oluştur, recommendedFees() çağır, dört tier'ı kullanıcıya göster, seçmesine izin ver ve sonra signAndBroadcast()'i çağır. İşlem nesnesi tahmin ile broadcast arasında bellekte kalır — yeniden inşa etmeye gerek yok.

5. Göndermeden önce bakiye kontrolü

Bakiye kontrolü her gönderim akışının en üstüne aittir. Yazım hatalarını yakalar, başarısız olacak bir işlem için boşa gas yakmayı engeller ve kullanıcıya doğrulayabileceği bir sayı verir. Her zincir aynı one-liner'ı sunar — bir adres geçir (ya da bağlı wallet'ı kullan) ve onaylanmış bakiyeyi, destekleyen zincirlerde de onaylanmamış kısmı al:

// Ethereum — confirmed balance + live USD price
const eth = cg.connect(cg.networks.ethereum, wallet);
const ethBalance = await eth.addressBalance();
const ethUsd = await ethBalance.confirmed.toCurrency('usd');
console.log(`${ethBalance.confirmed.base()} ETH ($${ethUsd})`);

// Bitcoin — confirmed and unconfirmed split
const btc = cg.connect(cg.networks.bitcoin, wallet);
const btcBalance = await btc.addressBalance();
console.log(`Confirmed:   ${btcBalance.confirmed.base()} BTC`);
console.log(`Unconfirmed: ${btcBalance.unconfirmed.base()} BTC`);

Fee tahmini ile birleştirildiğinde tam pre-flight üç çağrı — bakiye, fee, sonra gönder. Bunları bir kez bağla, uygulamandaki her gönderim akışı aynı pre-send doğrulamayı bedava alır; ister sunucuda Node.js'te ister tarayıcıda kripto bakiyesini kontrol et.

6. ChainGate ile bitcoinjs-lib, ethers ve diğer alternatifler

ChainGate kendinden önceki her low-level kütüphaneyi yerinden etmeye çalışmıyor. Her birinin net bir görevi var. Birden fazla zincirde işlem göndermen gerektiğinde trade-off'lar şöyle:

YetenekChainGatebitcoinjs-libethers / viemKendi yazılımı
Desteklenen zincirlerBTC, ETH, AVAX+EVM, LTC, DOGE, BCHSadece BitcoinSadece EVMKütüphane başına 1
BTC göndermek için satır~5~40+yokdeğişken
Tarayıcıya hazırEvet — kutudan çıkar çıkmazPolyfill gerekirEvetDeğişken
Dahili fee tahminiEvetHayırKısmenHayır
TypeScript tipleriFirst-classToplulukEvetDeğişken

İşlem şekli üzerinde byte düzeyinde kontrol istediğinde ya da uygulaman tek bir zincirle konuşuyor ve bundle boyutu belirleyici faktörse bitcoinjs-lib veya ethers'la kal. Birden fazla zincirle aynı anda jonglörlük yapıyorsan, bir deadline'a karşı yarışıyorsan ya da blok zinciri başına uzmanlaşmayı kaldıramayacak küçük bir takım yönetiyorsan ChainGate'e geç.

7. Fiyatlandırma ve ücretsiz plan

Ücretsiz plan kasıtlı olarak cömert — ücretsiz dahil her plan, desteklediğimiz her zincir için SDK'nın tamamı ile geliyor: bakiyeler, asset listingleri, fee tahmini, imzalama ve broadcast. Bir prototipi yayına almak, kişisel bir projeyi sürdürmek ya da bir iç aracı üretime taşımak için yeter. Kayıtta kredi kartı istenmiyor.

Ücretli tier'lar rate limit'leri yükseltir, priority support ve burst kapasitesi ekler. Yükseltme dashboard içinde tek tıklık bir akıştır.

Güncel rakamlar ve yükseltme yolu için fiyatlandırma sayfasına bak.

8. Buradan nereye gidebilirsin

Modeli aldın: tek bir SDK, birden fazla zincir ve her birinde aynı beş satırlık şekil. Buradan sonra dokümantasyon yüzeyin geri kalanını kapsar — mesaj imzalama, ERC-20 transferleri, NFT hareketleri, decoded işlem geçmişi. GitHub'daki örnekler kopyalayabileceğin uçtan uca tarifler için iyi bir başlangıç noktası. Ve API dashboard'u bir key alıp bir şeyi yayına almak istediğinde tek tık uzaklıkta. Bir fee'nin arkasındaki mekaniğe daha derinden inmek istersen Ethereum gas üzerine olan tamamlayıcı rehber, recommendedFees() içindeki sayıların gerçekten nereden geldiğini açıyor. Buna ek olarak işlem hash'leri rehberi, signAndBroadcast()'ten dönen transactionId'nin her zincirde nasıl göründüğünü ve bir blok gezgininde nasıl sorgulanacağını anlatıyor.

Sıkça sorulan sorular

ChainGate private key'lerimi tutuyor mu?
Hayır. Wallet inşası, key derivation ve imzalama hepsi cihazında yerel olarak çalışır. ChainGate API yalnızca okuma çağrılarını üstlenir ve önceden imzalanmış raw işlemleri broadcast eder — seed phrase'in ve private key'in SDK sınırını terk etmez.
ChainGate'i tarayıcıda kullanabilir miyim?

Evet — bu rehberdeki her örnek Vite, Next.js ya da Webpack 5 bundle'ında değişiklik olmadan çalışır. SDK kendi tarayıcı uyumlu crypto'sunu içerir, dolayısıyla ekstra yüklenecek bir şey yok.

Hangi ağlar destekleniyor?

ChainGate; Bitcoin, Bitcoin Testnet, Litecoin, Dogecoin, Bitcoin Cash, Ethereum ve Avalanche için tam API desteği, Polygon, Arbitrum, Base, BNB Chain ve Sonic için hosted JSON-RPC endpoint'leri ve diğer her EVM zinciri için bring-your-own-RPC desteği sunar — Optimism, Linea, Scroll, Gnosis, testnet'ler ve self-hosted node'lar dahil. Tam matris dokümantasyonda.

Testnet işlemleri gönderebilir miyim?

Evet — özel bir testnet flag'i yok. Mainnet'te kullandığın aynı cg.connect() çağrısına testnet ağını geçir: Bitcoin için bu cg.networks.bitcoinTestnet; EVM testnet'i için testnet'in JSON-RPC URL'sini ve chain ID'sini cg.networks.evmRpc({ rpcUrl, chainId, name, symbol })'ye geçir. Kodun geri kalanı bu rehberdeki mainnet örnekleriyle aynıdır.

Bir işlem başarısız olursa ne olur?

SDK yakalayıp işleyebileceğin tipli bir hata sunar. Broadcast öncesi sorunların çoğu kurtarılabilirdir — işlem nesnesi yeniden denemede taze bir nonce ya da yeni bir UTXO seçimiyle yeniden inşa edilir, bu yüzden ikinci deneme genelde geçer.

ChainGate açık kaynak mı?

Makinende imzalayan ve broadcast eden JavaScript SDK GitHub'da MIT lisansıyla yayınlandı — kaynağı oku, vendor et, fork'la. Arkasındaki ChainGate API, geri kalan her şeyi senin için halleden yönetilen bir hizmet. Çoğu takım açık kaynak SDK'yı hosted API ile birlikte kullanıyor, ancak kendi altyapını barındırmayı tercih edersen SDK'yı kontrolündeki herhangi bir RPC URL'sine yönlendirebilirsin.

ChainGate neden API key ister?
API key, ChainGate backend'ine yapılan çağrıları doğrular ve backend tam olarak SDK'nın tek başına yapamayacağı kısımları üstlenir — kullandığın zincire JSON-RPC isteklerini işlemek, UTXO ve bakiyeleri okumak ve imzalanmış işlemleri broadcast etmek. İmzalama yine cihazında, cüzdanınla yapılır; key sadece ChainGate altyapısından geçen okuma ve broadcast trafiğini yetkilendirir. Ücretsiz planda key'i kredi kartı gerekmeden dashboard'dan alırsın.

ChainGate ile geliştir

Bu fikirleri koda dök — ChainGate, Ethereum ve 20’den fazla blockchain için tek bir kütüphanede wallet, transaction ve yönetilen RPC sağlıyor.