Skip to content

emin-karadag/BackpackExchange

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🚀 BackpackExchange (.NET) Kütüphanesi

.NET C# License NuGet

BackpackExchange, Backpack Exchange borsasının REST API’leri için geliştirilmiş, resmi olmayan bir .NET istemci kütüphanesidir.

SPOT piyasa için public ve authenticated endpoint’ler altında tip güvenli modeller, async/await tabanlı servisler ve ED25519 imzalama altyapısı sunar.

Uyarı: Bu kütüphane Backpack Exchange tarafından resmi olarak yayınlanmamıştır.
Gerçek para ile işlem yapmadan önce mutlaka kendi testlerinizi yapın ve Backpack Exchange’in
resmi API dokümantasyonunu inceleyin.


✨ Desteklenen Özellikler (Özet Tablo)

Alan Açıklama
System Ping, sistem zamanı, sistem durumu (/api/v1/system/*)
Assets Varlıklar ve teminat bilgisi (/api/v1/assets, /api/v1/collateral)
Markets Piyasalar, ticker, derinlik, K-Line, mark prices, open interest (/api/v1/markets, /api/v1/depth vb.)
Trades (Public) Son işlemler ve geçmiş işlemler (/api/v1/trades, /api/v1/trades/history)
Account Hesap özeti, hesap ayarları, max order quantity, max withdrawal quantity (/api/v1/account/*)
Capital Bakiyeler, collateral, yatırma/çekme geçmişi, dust conversion (/api/v1/capital, /wapi/v1/capital/*)
History Fill history, order history, settlement history, dust history (/wapi/v1/history/*)
Orders (SPOT) SPOT emir açma, güncelleme, iptal, tüm emirler, batch emir (/api/v1/orders)
HTTP İmzalama ED25519 anahtar çifti ile imzalama (X-API-KEY, X-SIGNATURE, X-TIMESTAMP, X-WINDOW)
Async & Cancel Tüm servis metotlarında Task<T> ve CancellationToken kullanımı
DI Entegrasyonu AddBackpackExchangeClient(...) ile IServiceCollection üzerinden kolay kayıt
Tip Güvenliği Enum tabanlı modeller (order türleri, zaman aralıkları, durumlar, blockchain, sort direction, vs.)

Not: Bu kütüphane yalnızca SPOT piyasa işlemlerine odaklanır. Futures / Margin / Leverage entegrasyonları bilerek eklenmemiştir.


📦 Kurulum

🧰 .NET CLI

dotnet add package BackpackExchange --version 1.0.0

📄 PackageReference

<PackageReference Include="BackpackExchange" Version="1.0.0" />

🔑 API Key Alma (Backpack Exchange)

Private (kimlik doğrulama gerektiren) API uç noktalarını kullanmak için Backpack Exchange hesabınızdan bir API Key oluşturmanız gerekir.

Ekteki ekran görüntülerine göre özet akış:

  1. Backpack hesabınızda sağ üstten Settings ekranına gidin.
  2. Üst sekmelerden API Keys sekmesini açın.
    Burada mevcut anahtarlarınızı ve izinlerini görebilirsiniz.
  3. Sağ taraftaki New API key butonuna tıklayın.
  4. Açılan Create API key penceresinde:
    • Name alanına, örneğin Backpack API Test gibi açıklayıcı bir isim yazın.
    • Subaccount alanında ana hesap (Main) veya ister seniz belirli bir alt hesabı seçin.
    • Sadece okuma için kullanacaksanız Read only anahtar oluşturabilirsiniz; emir açma/iptal gibi işlemler için bu seçeneği kapatıp Read / Write izinli bir anahtar oluşturmalısınız.
  5. Anahtarı onayladıktan sonra ekranda:
    • API Key (Backpack Exchange tarafında gördüğünüz base64 ED25519 public key),
    • API Secret (gizli anahtar / seed),
    • İzinler (ör. Read / Write) ve IP kısıtlaması (IP/CIDR) bilgileri gösterilir.
  6. API Key ve API Secret değerlerini güvenli bir yerde saklayın; bu değerler bir daha tam hâliyle gösterilmeyebilir.

Bu kütüphanede, Backpack’in verdiği ED25519 API key (public) ve secret (private seed) değerlerini doğrudan kullanıyoruz.

Güvenlik için önerilen kullanım:

var apiKey    = Environment.GetEnvironmentVariable("BACKPACK_API_KEY");
var secretKey = Environment.GetEnvironmentVariable("BACKPACK_SECRET_KEY");

Bu değerleri asla kaynak koda gömmeyin; üretimde environment değişkenleri, secret manager veya benzeri mekanizmalar kullanın.


📊 Hızlı Başlangıç: Public API (Kimlik Doğrulama Gerektirmez)

Public endpoint’ler için sadece HttpClient yeterlidir.

using BackpackExchange.Services;

// 🌐 Sadece public API uç noktaları için
using var httpClient = new HttpClient { BaseAddress = new Uri("https://api.backpack.exchange") };
var marketService = new MarketService(httpClient);

// Tüm spot piyasaları getir
var markets = await marketService.GetMarketsAsync();
if (markets is not null)
{
    foreach (var m in markets)
    {
        Console.WriteLine($"{m.Symbol} - {m.BaseSymbol}/{m.QuoteSymbol} - Tip:{m.MarketType}");
    }
}

// Belirli bir sembol için ticker getir
var ticker = await marketService.GetTickerAsync("SOL_USDC");
if (ticker is not null)
{
    Console.WriteLine($"SOL_USDC Son Fiyat: {ticker.LastPrice} | 24h Hacim: {ticker.Volume}");
}

// Derinlik
var depth = await marketService.GetDepthAsync("SOL_USDC", Enums.DepthLimit.Twenty);
Console.WriteLine($"Asks: {depth?.Asks.Count}, Bids: {depth?.Bids.Count}");

🔐 Hızlı Başlangıç: Private API + Örnek Emir Akışı

Aşağıdaki örnek, BackpackExchange_Test/Program.cs içinde kurguladığımız akışın sadeleştirilmiş hâlidir:

  1. API anahtarları ile BackpackExchangeClient oluştur
  2. Hesap bilgilerini getir
  3. Limit alış emri ver
  4. Emri sorgula
  5. Emri güncelle
  6. Emri iptal et
  7. Açık emirleri, geçmiş emirleri ve diğer order/history servislerini kullan
using BackpackExchange;
using BackpackExchange.Enums;
using BackpackExchange.Models.Order;
using BackpackExchange.Services;

// 1) Kimlik bilgilerini ortam değişkenlerinden al
var apiKey    = Environment.GetEnvironmentVariable("BACKPACK_API_KEY");
var secretKey = Environment.GetEnvironmentVariable("BACKPACK_SECRET_KEY");

if (string.IsNullOrWhiteSpace(apiKey) || string.IsNullOrWhiteSpace(secretKey))
{
    Console.WriteLine("Lütfen BACKPACK_API_KEY ve BACKPACK_SECRET_KEY değişkenlerini ayarlayın.");
    return;
}

// 2) HttpClient + BackpackExchangeClient oluştur
using var httpClient = new HttpClient { BaseAddress = new Uri("https://api.backpack.exchange") };
using var client = new BackpackExchangeClient(httpClient, new BackpackExchange.Models.Common.BackpackOptions
{
    ApiKey    = apiKey,
    SecretKey = secretKey,
});

// Servislere erişim
var account = client.AccountService;
var orders  = client.OrderService;

// 3) Hesap özetini getir
var accountSummary = await account.GetAccountAsync();
if (accountSummary is not null)
{
    Console.WriteLine($"Spot Maker Fee: {accountSummary.SpotMakerFee} | Spot Taker Fee: {accountSummary.SpotTakerFee}");
}

// 4) SOL_USDC için örnek limit alış emri ver
var newOrder = new ExecuteOrderRequest
{
    Symbol      = "SOL_USDC",
    Side        = OrderSide.Bid,
    OrderType   = OrderType.Limit,
    TimeInForce = TimeInForce.Gtc,
    Quantity    = "0.1",
    Price       = "50",
};

var createdOrder = await orders.ExecuteOrderAsync(newOrder);
if (createdOrder is null)
{
    Console.WriteLine("Emir oluşturulamadı.");
    return;
}

Console.WriteLine($"Yeni emir oluşturuldu. Id: {createdOrder.Id}, Durum: {createdOrder.Status}");

// 5) Emri detaylarıyla tekrar sorgula
var fetched = await orders.GetOrderAsync(createdOrder.Id);
if (fetched is not null)
{
    Console.WriteLine($"Emir durumu: {fetched.Status}, Gerçekleşen Miktar: {fetched.ExecutedQuantity}");
}

// 6) Emri güncelle (örnek: fiyat değiştir)
var updateRequest = new ExecuteOrderRequest
{
    Symbol      = newOrder.Symbol,
    Side        = newOrder.Side,
    OrderType   = newOrder.OrderType,
    TimeInForce = newOrder.TimeInForce,
    Quantity    = newOrder.Quantity,
    Price       = "55",              // Yeni fiyat
    ClientId    = createdOrder.Id,   // Orijinal emir ile ilişkilendirme
};

var updated = await orders.ExecuteOrderAsync(updateRequest);
Console.WriteLine($"Emir güncelleme isteği gönderildi. Yeni fiyat: {updateRequest.Price}");

// 7) Emri iptal et
var cancelled = await orders.CancelOrderAsync(new CancelOrderRequest
{
    Symbol = newOrder.Symbol,
    OrderId = createdOrder.Id,
});

if (cancelled is not null)
{
    Console.WriteLine($"Emir iptal edildi. Id: {cancelled.Id}, Durum: {cancelled.Status}");
}

// 8) Açık emirler ve geçmiş emirler
var openOrders = await orders.GetOpenOrdersAsync(symbol: "SOL_USDC");
Console.WriteLine($"Açık emir sayısı: {openOrders?.Count ?? 0}");

var history = await client.HistoryService.GetOrderHistoryAsync(symbol: "SOL_USDC", limit: 10);
Console.WriteLine($"Son 10 emir geçmişi kaydı: {history?.Count ?? 0}");

Detaylı ve tam akış için BackpackExchange_Test/Program.cs dosyasını inceleyebilirsiniz; orada tüm OrderService metotları (tekli emir, batch emir, cancel, cancel all, history) sırasıyla denenmektedir.


🧩 DI Entegrasyonu: AddBackpackExchangeClient Kullanımı

BackpackExchangeServiceCollectionExtensions ile IBackpackExchangeClient’ı ASP.NET Core veya worker servislerinde kolayca kullanabilirsiniz.

using BackpackExchange;
using BackpackExchange.Interfaces;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddBackpackExchangeClient(options =>
{
    options.BaseUrl   = builder.Configuration["Backpack:BaseUrl"] ?? "https://api.backpack.exchange";
    options.ApiKey    = builder.Configuration["Backpack:ApiKey"];
    options.SecretKey = builder.Configuration["Backpack:SecretKey"];
});

var app = builder.Build();

app.MapGet("/sol-ticker", async (IBackpackExchangeClient bpClient, CancellationToken ct) =>
{
    var ticker = await bpClient.MarketService.GetTickerAsync("SOL_USDC", ct);
    return ticker is null
        ? Results.Problem("Ticker alınamadı.", statusCode: 502)
        : Results.Ok(ticker);
});

app.Run();

appsettings.json örneği:

{
  "Backpack": {
    "BaseUrl": "https://api.backpack.exchange",
    "ApiKey": "BASE64_ENCODED_PUBLIC_KEY",
    "SecretKey": "BASE64_ENCODED_PRIVATE_KEY_SEED"
  }
}

⚠️ Hata Yönetimi

HTTP 2xx dışındaki tüm yanıtlar için kütüphane BackpackHttpException fırlatır.
Bu exception üzerinden:

  • HTTP status code,
  • Backpack API code ve message,
  • Ham response body

gibi bilgilere erişebilirsiniz.

using BackpackExchange.Core.Exceptions;

try
{
    var balances = await client.CapitalService.GetBalancesAsync();
}
catch (BackpackHttpException ex)
{
    Console.WriteLine($"HTTP Hatası: {(int)ex.StatusCode} - {ex.StatusCode}");
    Console.WriteLine($"API Kodu   : {ex.ErrorCode}");
    Console.WriteLine($"Mesaj      : {ex.Message}");
    Console.WriteLine($"Body       : {ex.ResponseContent}");
}
catch (InvalidOperationException ex)
{
    // Kimlik bilgileri eksik vb.
    Console.WriteLine(ex.Message);
}

📄 API Kapsamı (Özet)

Public Endpointler (Kimlik doğrulama gerektirmez)

Servis Metot Açıklama
SystemService GetStatusAsync Sistem durumu
SystemService PingAsync Ping
SystemService GetTimeAsync Sistem zamanı
SystemService GetWalletsAsync Cüzdan bilgileri
AssetService GetAssetsAsync Tüm varlıklar
AssetService GetCollateralInfoAsync Teminat parametreleri
MarketService GetMarketsAsync Tüm piyasalar
MarketService GetMarketAsync Tekil piyasa
MarketService GetTickerAsync Tekil ticker
MarketService GetTickersAsync Tüm ticker'lar
MarketService GetDepthAsync Emir defteri derinliği
MarketService GetKlinesAsync Mum verileri (K-Line)
TradeService GetRecentTradesAsync Son işlemler
TradeService GetHistoricalTradesAsync Geçmiş işlemler

Authenticated Endpointler (Kimlik doğrulama gerektirir)

Servis Metot Açıklama
AccountService GetAccountAsync Hesap bilgileri
AccountService UpdateAccountAsync Hesap ayarlarını güncelle
AccountService GetMaxOrderQuantityAsync Maks. emir miktarı
AccountService GetMaxWithdrawalQuantityAsync Maks. çekim miktarı
CapitalService GetBalancesAsync Bakiyeler
CapitalService GetCollateralAsync Teminat durumu
CapitalService GetDepositsAsync Yatırma işlemleri
CapitalService GetDepositAddressAsync Yatırma adresi
CapitalService GetWithdrawalsAsync Çekim işlemleri
CapitalService RequestWithdrawalAsync Çekim talebi
CapitalService ConvertDustAsync Dust dönüşümü
CapitalService GetDustHistoryAsync Dust geçmişi
OrderService GetOrderAsync Tekil emir sorgula
OrderService ExecuteOrderAsync Emir ver
OrderService ExecuteOrdersAsync Toplu emir
OrderService CancelOrderAsync Emir iptal
OrderService GetOpenOrdersAsync Açık emirler
OrderService CancelAllOrdersAsync Tüm emirleri iptal
HistoryService GetFillHistoryAsync Eşleşme (fill) geçmişi
HistoryService GetOrderHistoryAsync Emir geçmişi
HistoryService GetSettlementHistoryAsync Uzlaşma geçmişi

🔐 ED25519 Anahtar Oluşturma

Backpack Exchange, kimlik doğrulama için ED25519 anahtar çifti kullanır. Örneğin Python ile anahtar oluşturabilirsiniz:

python3 -c "
from cryptography.hazmat.primitives.asymmetric import ed25519
import base64

key = ed25519.Ed25519PrivateKey.generate()
seed = key.private_bytes_raw()
pub = key.public_key().public_bytes_raw()

print(f'Secret Key (Seed): {base64.b64encode(seed).decode()}')
print(f'Public Key (API Key): {base64.b64encode(pub).decode()}')
"

📄 Lisans

Bu proje MIT Lisansı ile lisanslanmıştır.


⚠️ Sorumluluk Reddi

Bu kütüphane resmi olmayan bir üçüncü parti projesidir ve Backpack Exchange ile herhangi bir kurumsal bağlantısı yoktur.
Kripto para işlemleri yüksek risk içerir; kullanım riski tamamen kullanıcıya aittir. Üretim ortamında kullanmadan önce mutlaka kendi testlerinizi yapın ve ilgili tüm yasal/mevzuat gerekliliklerini göz önünde bulundurun.


💰 Bağış

Bu kütüphaneyi faydalı bulduysanız ve geliştirilmesine katkıda bulunmak istiyorsanız, kripto para bağışı yapabilirsiniz:

Tüm Ağlar İçin Cüzdan Adresi:

0x21bc1e50042708a30275c151e43f7b1c1be99f2f

Desteklenen tokenlar: Tüm ERC-20/BEP-20 tokenları

About

Backpack Exchange kripto borsası için geliştirilmiş .NET kütüphanesidir.

Resources

License

Stars

2 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages