Розробка системи автоматичного імпорту транзакцій з бірж для обліку

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Розробка системи автоматичного імпорту транзакцій з бірж для обліку
Середній
~3-5 днів
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1122
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    859

Система автоматичного імпорту транзакцій з бірж для обліку

Ручний CSV експорт з кожної біржі — незручний процес: користувачі забувають, біржи змінюють формати, дані втрачаються. Автоматичний імпорт через API вирішує це: транзакції синхронізуються у фоні без участі користувача.

API інтеграції основних бірж

Binance API

class BinanceImporter implements ExchangeImporter {
  private client: Binance;
  
  async importTransactions(apiKey: string, secretKey: string, since: Date): Promise<RawTransaction[]> {
    this.client = new Binance({ apiKey, secretKey });
    
    const results = await Promise.all([
      this.getSpotTrades(since),
      this.getConversions(since),
      this.getStakingHistory(since),
      this.getSavingsInterest(since),
      this.getFlexibleEarnings(since),
      this.getDustConversions(since),
    ]);
    
    return results.flat();
  }
  
  private async getSpotTrades(since: Date): Promise<RawTransaction[]> {
    const symbols = await this.client.exchangeInfo().then(info => 
      info.symbols.map(s => s.symbol)
    );
    
    const trades: RawTransaction[] = [];
    
    // Binance вимагає запит для кожної торгової пари
    for (const symbol of symbols) {
      const symbolTrades = await this.client.myTrades({
        symbol,
        startTime: since.getTime(),
        limit: 1000,
      });
      
      trades.push(...symbolTrades.map(t => this.normalizeBinanceTrade(t)));
      
      // Обмеження швидкості
      await sleep(100);
    }
    
    return trades;
  }
  
  private normalizeBinanceTrade(trade: any): RawTransaction {
    const baseAsset = trade.symbol.replace(/(USDT|BTC|ETH|BNB)$/, "");
    const quoteAsset = trade.symbol.slice(baseAsset.length);
    
    return {
      id: trade.id.toString(),
      timestamp: new Date(trade.time),
      type: trade.isBuyer ? "buy" : "sell",
      assetIn: trade.isBuyer ? baseAsset : quoteAsset,
      amountIn: trade.isBuyer ? parseFloat(trade.qty) : parseFloat(trade.quoteQty),
      assetOut: trade.isBuyer ? quoteAsset : baseAsset,
      amountOut: trade.isBuyer ? parseFloat(trade.quoteQty) : parseFloat(trade.qty),
      fee: parseFloat(trade.commission),
      feeCurrency: trade.commissionAsset,
      exchange: "BINANCE",
      txId: trade.orderId.toString(),
    };
  }
}

Coinbase Advanced Trade API

class CoinbaseImporter implements ExchangeImporter {
  async importTransactions(apiKey: string, secret: string, since: Date): Promise<RawTransaction[]> {
    const results = await Promise.all([
      this.getFills(apiKey, secret, since),
      this.getConversions(apiKey, secret, since),
      this.getRewards(apiKey, secret, since), // staking rewards
    ]);
    
    return results.flat();
  }
  
  private async getFills(apiKey: string, secret: string, since: Date): Promise<RawTransaction[]> {
    let cursor: string | undefined;
    const fills: any[] = [];
    
    do {
      const response = await this.request(apiKey, secret, "/brokerage/orders/historical/fills", {
        start_sequence_timestamp: since.toISOString(),
        cursor,
      });
      
      fills.push(...response.fills);
      cursor = response.cursor;
    } while (cursor);
    
    return fills.map(this.normalizeCoinbaseFill);
  }
}

Планувальник оновлення

@Injectable()
class ExchangeSyncScheduler {
  // Синхронізуємо кожні 4 години для активних користувачів
  @Cron("0 */4 * * *")
  async syncActiveUsers() {
    const users = await this.db.getUsersWithApiKeys({
      lastSyncBefore: new Date(Date.now() - 3 * 60 * 60 * 1000), // > 3 годин назад
      isActive: true,
    });
    
    // Використовуємо чергу для паралельної обробки без перевантаження
    for (const user of users) {
      await this.syncQueue.add("sync-exchange", {
        userId: user.id,
        since: user.lastSyncAt,
      }, {
        attempts: 3,
        backoff: { type: "exponential", delay: 5000 },
      });
    }
  }
}

class ExchangeSyncWorker {
  async processJob(job: Job<SyncJobData>) {
    const { userId, since } = job.data;
    const exchangeConnections = await this.db.getUserExchanges(userId);
    
    for (const connection of exchangeConnections) {
      try {
        const importer = this.importerFactory.create(connection.exchange);
        const transactions = await importer.importTransactions(
          connection.apiKey,
          connection.secretKey,
          since
        );
        
        const normalized = transactions.map(tx => this.normalizer.normalize(tx));
        const classified = await this.classifier.classifyBatch(normalized, userId);
        
        await this.db.upsertTransactions(userId, classified);
        await this.db.updateLastSync(userId, connection.exchange);
        
      } catch (err) {
        if (err instanceof ApiKeyExpiredError) {
          await this.notifyUserApiKeyExpired(userId, connection.exchange);
        }
        throw err;
      }
    }
  }
}

Підтримувані біржі

Біржа Метод Обмеження
Binance REST API (HMAC) Обмеження швидкості, потрібен запит для кожної пари
Coinbase OAuth 2.0 або API Key Обмеження історії
Kraken REST API Історія обмежена
OKX REST API Хороший API
Bybit REST API Потрібні права на історію
KuCoin REST API Користувацька пагінація

Система автоматичного імпорту з 6+ біржами, синхронізація у фоні та обробка обмежень швидкості — 3-4 тижні розробки.