Ana içeriğe atla

Genel Bakış

getTransactionsForAddress, işlem imzası aramasını ve tam işlem alımını tek bir verimli çağrıda birleştirir. getSignaturesForAddress’e ve ardından her imza için getTransaction’a ayrı istekler yapmak yerine, tek bir istekte her şeyi alırsınız. Bu yöntem şunları destekler:
  • İki yönlü sıralama (en eskiden en yeniye veya en yeniden en eskiye)
  • Zaman ve slot tabanlı filtreleme
  • İşlem durumu filtreleme (başarılı/başarısız)
  • Token hesabı filtreleme
  • İmleç tabanlı sayfalama

Bu Yöntemi Neden Kullanmalısınız

N+1 Problemi

Standart Solana RPC yöntemleriyle işlem geçmişi getirmek birden fazla çağrı gerektirir:
  1. İşlem imzalarının listesini almak için getSignaturesForAddress çağrısı yapın
  2. Tam işlem verisini almak için her imza için getTransaction çağrısı yapın
100 işlemli bir cüzdan için bu 101 API çağrısı demektir. 1.000 işlem için 1.001 çağrı. Bu gecikme, karmaşıklık ve daha yüksek maliyet yaratır. getTransactionsForAddress, tek bir çağrıda tam işlem verisi döndürerek bunu çözer — istek başına 100 tam işlem veya 1.000 imzaya kadar.

Ek Yetenekler

Verimlilik ötesinde bu yöntem, standart RPC’de mevcut olmayan özellikler sunar:
  • İki yönlü sıralama: Bir adresi ilk işleminden takip etmek için en eskiden en yeniye (asc) sorgulama
  • Zaman tabanlı filtreleme: Belirli bir tarih aralığındaki işlemleri alın
  • Slot tabanlı filtreleme: Belirli blok aralıklarından işlem sorgulama
  • Durum filtreleme: Yalnızca başarılı veya yalnızca başarısız işlemleri alın
  • Token hesabı dahil etme: İlgili token hesaplarından işlemleri yakalayın

Token Hesabı Desteği

Standart getSignaturesForAddress yalnızca sorgulanan adrese doğrudan atıfta bulunan işlemleri döndürür. Bu önemli bir kategoriyi kaçırır: token transferleri. Tokenlar bir cüzdana gönderildiğinde, işlem cüzdan adresinin kendisine değil cüzdanın İlgili Token Hesabına (ATA) atıfta bulunur. Bu, standart yöntemlerin size eksik bir tablo sunduğu anlamına gelir. tokenAccounts: "all" ile getTransactionsForAddress, adresin sahip olduğu tüm token hesaplarından işlemleri otomatik olarak dahil ederek eksiksiz işlem geçmişi sağlar.
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransactionsForAddress",
  "params": [
    "WALLET_ADDRESS",
    {
      "filters": {
        "tokenAccounts": "all"
      }
    }
  ]
}'
Yalnızca adrese doğrudan atıfta bulunan işlemleri istiyorsanız tokenAccounts: "none" ayarlayın.

Parametreler

address
string
gerekli
Sorgulanacak Solana adresi (base-58 kodlu genel anahtar)
options
object

Yanıt

Yanıt formatı transactionDetails parametresine bağlıdır.

transactionDetails: "full" ile

result
array
Tam işlem nesneleri dizisi, her biri şunları içerir:

transactionDetails: "signatures" ile

result
array
İmza nesneleri dizisi, her biri şunları içerir:

Kod Örnekleri

Temel İstek

Bir adres için en son işlemleri alın:
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransactionsForAddress",
  "params": [
    "ADDRESS_HERE"
  ]
}'

Yalnızca İmzaları Alın

Tam işlem verisi olmadan 1000’e kadar imza alın:
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransactionsForAddress",
  "params": [
    "ADDRESS_HERE",
    {
      "transactionDetails": "signatures",
      "limit": 1000
    }
  ]
}'

Zaman Filtreli En Eskiden En Yeniye

Belirli bir zaman aralığından en eskiden en yeniye sıralanmış işlemleri alın:
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransactionsForAddress",
  "params": [
    "ADDRESS_HERE",
    {
      "sortOrder": "asc",
      "filters": {
        "afterTime": 1704067200,
        "beforeTime": 1706745600
      }
    }
  ]
}'

Yalnızca Başarılı İşlemler

Yalnızca başarılı işlemleri döndürmek için filtreleyin:
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransactionsForAddress",
  "params": [
    "ADDRESS_HERE",
    {
      "filters": {
        "status": "success"
      }
    }
  ]
}'

Sayfalanmış İstek

Daha fazla sonuç getirmek için imleç tabanlı sayfalama kullanın:
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransactionsForAddress",
  "params": [
    "ADDRESS_HERE",
    {
      "limit": 100,
      "before": "LAST_SIGNATURE_FROM_PREVIOUS_RESPONSE"
    }
  ]
}'

TypeScript Örneği

import { Connection } from '@solana/web3.js';

const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');

interface GetTransactionsOptions {
  transactionDetails?: 'full' | 'signatures';
  limit?: number;
  sortOrder?: 'asc' | 'desc';
  before?: string;
  after?: string;
  filters?: {
    tokenAccounts?: 'all' | 'none';
    beforeTime?: number;
    afterTime?: number;
    beforeSlot?: number;
    afterSlot?: number;
    status?: 'success' | 'failed';
  };
}

async function getTransactionsForAddress(
  address: string,
  options: GetTransactionsOptions = {}
) {
  const response = await fetch('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 1,
      method: 'getTransactionsForAddress',
      params: [address, options],
    }),
  });

  const data = await response.json();
  return data.result;
}

// Son işlemleri al
const recent = await getTransactionsForAddress('ADDRESS_HERE');

// Zaman filtreliyle en eskiden en yeniye işlemleri al
const historical = await getTransactionsForAddress('ADDRESS_HERE', {
  sortOrder: 'asc',
  filters: {
    afterTime: Math.floor(Date.now() / 1000) - 86400 * 30, // Son 30 gün
  },
});

// Tüm işlemlerde sayfalama yap
async function getAllTransactions(address: string) {
  const allTransactions = [];
  let before: string | undefined;

  while (true) {
    const batch = await getTransactionsForAddress(address, {
      limit: 100,
      before,
    });

    if (!batch || batch.length === 0) break;

    allTransactions.push(...batch);
    before = batch[batch.length - 1].signature;
  }

  return allTransactions;
}

Kullanım Senaryoları

Token Lansmanı Analizi

İlk basıcıları ve erken sahipleri belirlemek için bir token mint’inin en erken işlemlerini bulun. Başlangıçtan itibaren başlamak için sortOrder: "asc" kullanın:
const earlyActivity = await getTransactionsForAddress(tokenMintAddress, {
  sortOrder: 'asc',
  limit: 100,
  filters: {
    tokenAccounts: 'all',
  },
});

Cüzdan Finansman Geçmişi

Eksiksiz işlem geçmişini sorgulayarak bir cüzdanın fonlarının kaynağını izleyin:
const fundingHistory = await getTransactionsForAddress(walletAddress, {
  sortOrder: 'asc',
  filters: {
    tokenAccounts: 'all',
  },
  transactionDetails: 'full',
});

// İlk işlemler genellikle finansman kaynaklarını ortaya çıkarır
const firstTransactions = fundingHistory.slice(0, 10);

Başarısız İşlem Analizi

Yalnızca başarısız işlemleri filtreleyerek işlem hatalarını hata ayıklayın:
const failedTxs = await getTransactionsForAddress(walletAddress, {
  filters: {
    status: 'failed',
  },
  transactionDetails: 'full',
});

// Hata nedenlerini anlamak için hata günlüklerini analiz et
failedTxs.forEach(tx => {
  console.log(tx.signature, tx.meta?.err, tx.meta?.logMessages);
});

Cüzdan İşlem Akışı Oluşturun

Cüzdan arayüzü için sayfalanmış işlem geçmişi oluşturun:
async function getWalletFeed(wallet: string, cursor?: string) {
  return getTransactionsForAddress(wallet, {
    limit: 20,
    before: cursor,
    transactionDetails: 'full',
    filters: {
      tokenAccounts: 'all',
    },
  });
}

Alım Satım Deseni Analizi

Belirli bir zaman penceresinde başarılı alım satımları filtreleyin:
const trades = await getTransactionsForAddress(traderWallet, {
  filters: {
    status: 'success',
    afterTime: startOfMonth,
    beforeTime: endOfMonth,
  },
  transactionDetails: 'full',
});

Uyumluluk Denetimi

Düzenleyici uyumluluk için eksiksiz işlem geçmişi oluşturun:
async function auditAddress(address: string) {
  const allTxs = await getAllTransactions(address);

  return {
    totalTransactions: allTxs.length,
    successful: allTxs.filter(tx => !tx.err).length,
    failed: allTxs.filter(tx => tx.err).length,
    firstTransaction: allTxs[allTxs.length - 1],
    lastTransaction: allTxs[0],
  };
}

Sayfalama

Çok sayıda işlemi olan adresler için sonuçlar arasında sayfalama yapmanız gerekir. Yöntem, before ve after parametrelerini kullanan imleç tabanlı sayfalamayı destekler.

Daha Yeni İşlemleri Getirme (Varsayılan)

sortOrder: "desc" (varsayılan) ile işlemler en yeniden eskiye döndürülür. Daha eski işlemler almak için before kullanın:
// İlk istek
const page1 = await getTransactionsForAddress(address, { limit: 100 });

// Son imzayı imleç olarak kullanarak sonraki sayfayı alın
const lastSignature = page1[page1.length - 1].signature;
const page2 = await getTransactionsForAddress(address, {
  limit: 100,
  before: lastSignature,
});

Daha Eski İşlemleri Önce Getirme

sortOrder: "asc" ile işlemler en eskiden yeniye döndürülür. Daha yeni işlemler almak için after kullanın:
// En eski işlemleri önce alın
const page1 = await getTransactionsForAddress(address, {
  sortOrder: 'asc',
  limit: 100,
});

// Zaman içinde ilerlemeye devam edin
const lastSignature = page1[page1.length - 1].signature;
const page2 = await getTransactionsForAddress(address, {
  sortOrder: 'asc',
  limit: 100,
  after: lastSignature,
});

Eksiksiz Sayfalama Örneği

Bir adres için tüm işlemleri getirin:
async function getAllTransactions(address: string) {
  const allTransactions = [];
  let cursor: string | undefined;

  while (true) {
    const batch = await getTransactionsForAddress(address, {
      limit: 100,
      before: cursor,
      transactionDetails: 'full',
    });

    if (!batch || batch.length === 0) break;

    allTransactions.push(...batch);
    cursor = batch[batch.length - 1].signature;

    // İsteğe bağlı: Hız sınırlarına uymak için gecikme ekleyin
    await new Promise(resolve => setTimeout(resolve, 100));
  }

  return allTransactions;
}

En İyi Uygulamalar

  1. Sayım için signatures modunu kullanın: Yalnızca işlemleri saymak veya listelemek istediğinizde daha iyi performans ve daha yüksek limitler için transactionDetails: "signatures" kullanın.
  2. Erken filtreleyin: Döndürülen veri miktarını azaltmak ve yanıt sürelerini iyileştirmek için zaman, slot veya durum filtrelerini uygulayın.
  3. Sayfalama uygulayın: Çok sayıda işlemi olan adresler için her zaman before imlecini kullanarak sayfalama yapın.
  4. Sonuçları önbelleğe alın: İşlem verisi onaylandıktan sonra değişmez. Gereksiz isteklerden kaçınmak için geçmiş sonuçları önbelleğe alın.
  5. Hız sınırlarını yönetin: Çok sayıda ardışık istek yaparken üstel geri çekilme uygulayın.

Yaygın Hatalar

KodMesajÇözüm
-32600Invalid requestJSON-RPC formatını ve gerekli alanları kontrol edin
-32602Invalid paramsAdres formatını ve seçenek değerlerini doğrulayın
-32005Request limit exceededLimiti azaltın veya hız sınırlaması uygulayın

Standart Yöntemlerle Karşılaştırma

ÖzellikgetSignaturesForAddress + getTransactiongetTransactionsForAddress
API çağrılarıBirden fazla (1 + N)Tek
SıralamaYalnızca en yeniden eskiyeİki yönlü
Zaman filtrelemeDesteklenmiyorDestekleniyor
Durum filtrelemeDesteklenmiyorDestekleniyor
Maks. imzaÇağrı başına 1000Çağrı başına 1000
Maks. tam işlemÇağrı sayısıyla sınırlıÇağrı başına 100