# eth_getLogs ile Token Transfers API Karşılaştırması: ERC-20 transfer geçmişi

> Source: https://docs.blockvectra.com/tr/guides/logs-vs-transfers/

Cüzdan geçmişi veya ERC-20 transfer mutabakatı için [Token Transfers API](https://blockvectra.com/tr/data/transfers/) ile başlayın. Sözleşme olay loglarına ihtiyaç duyduğunuzda `eth_getLogs` kullanın. Geliştiriciler ve AI Agent'lar aynı blokzincir veri API'si aracılığıyla indekslenmiş adres transferlerini sorgulayabilir. [Cüzdan varlıkları rehberi](https://docs.blockvectra.com/tr/guides/wallet-assets/) token bakiyelerini, transfer geçmişini ve meta verileri birleştirir; [Data API referansı](https://docs.blockvectra.com/tr/api/data/) istek parametrelerini ve yanıt şemalarını tanımlar.

## Bu rehberin tamamlamanıza yardımcı olduğu görevler

* İzleme veya log geriye dönük doldurma için sınırlı blok aralıklarında kimlik doğrulamalı RPC aracılığıyla [sözleşme olay loglarını sorgulayın](#querying-logs-with-eth_getlogs).
* İmleç sayfalaması ve kapsam kontrolleri ile blokzincir veri API'si aracılığıyla adres veya token sözleşmesine göre [indekslenmiş ERC-20 transfer geçmişini sorgulayın](#querying-transfers-with-the-data-api).

## Logları ve transferleri okumanın iki yolu

`eth_getLogs` bir JSON-RPC yöntemidir: JSON-RPC uç noktası aracılığıyla blok loglarını döndürür. Data API, token transfer geçmişini zincir kapsamlı iki uç nokta aracılığıyla sunar:

* `GET /{chain}/addresses/{address}/transfers` — bir adresi içeren transferler.
* `GET /{chain}/tokens/{token}/transfers` — tek bir token sözleşmesi için transferler.

Her ikisi de aynı API anahtarını kullanır ve yöntem ağırlığına göre CU cinsinden ölçülür (aşağıdaki ağırlıklara bakın). Hangisinin uygun olduğu verilerin ne kadar yeni olduğuna, bir blok penceresine ihtiyacınız olup olmadığına ve nasıl sayfalandırdığınıza bağlıdır.

## eth\_getLogs için geçerli olan sınırlar

`eth_getLogs`, genel `GET /v1/chains` yanıtının yayınladığı zincir başına sınırlarla sınırlandırılmıştır:

* **Blok aralığı**: `max_logs_block_range`, tek bir `eth_getLogs` isteğinin kapsayabileceği maksimum blok sayısıdır. Zincire göre farklılık gösterir — bunu sabit kodlamak yerine `GET /v1/chains` üzerinden okuyun (zincirler [Desteklenen Zincirler](https://docs.blockvectra.com/tr/chains/) sayfasında listelenmiştir). Daha geniş bir aralık, `-32602 eth_getLogs block range too large` JSON-RPC hatasıyla reddedilir (faturalandırılmaz).
* **Düğüm senkronizasyonu**: bir zincirin düğümü senkronize değilken, `eth_getLogs` `-32010` döndürür (faturalandırılmaz).
* **Durum penceresi**: `GET /v1/chains` uç noktasının `state_window_blocks` olarak bildirdiği durum penceresi, `eth_call` ve `eth_getBalance` gibi durum okuma yöntemleri için geçerlidir, `eth_getLogs` için geçerli değildir.
* **Düğüm budaması**: blok ve log okumaları durum penceresiyle sınırlı değildir, ancak düğümün saklanan geçmişiyle sınırlıdır. Budanmış veriler `4444 pruned history unavailable` döndürür (faturalandırılmaz).

`fromBlock` ve `toBlock` filtre alanları atlandığında veya `null` olduğunda, varsayılan olarak `latest` değerini alır.

HTTP üzerinden `eth_subscribe` çağırmak `-32601 method not available` döndürür. `/v1/chains` içinde `ws` değerinin `true` olduğu zincirlerde `eth_subscribe` WebSocket üzerinden kullanılabilir (bkz. [Desteklenen Zincirler](https://docs.blockvectra.com/tr/chains/)); aksi takdirde, en yeni bloklar üzerinde `eth_getLogs` yoklaması yapın.

## Data API transfer uç noktalarının sağladıkları

İki uç nokta farklı parametreler gerektirir:

| Uç nokta                                     | `standard`                                                            | Blok penceresi                                                                                                                                                                                                                                                                       |
| -------------------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `GET /{chain}/addresses/{address}/transfers` | Zorunlu: `erc20` veya `erc721`. `erc1155`, `422 no_coverage` döndürür | `from_block` ve `to_block` alanlarının her ikisi de zorunludur. Sonuçlar azalan sırada `(block_number, log_index)` göre sıralanır. `direction` (`in`, `out` veya `any`; varsayılan `any`) yöne göre filtreler ve `token` isteğe bağlı olarak sonuçları tek bir sözleşmeyle kısıtlar. |
| `GET /{chain}/tokens/{token}/transfers`      | Zorunlu: `erc20`, `erc721` veya `erc1155`                             | `from_block` ve `to_block` isteğe bağlıdır. Eksik bir `to_block` varsayılan olarak `as_of_block` değerini alır; bunun üzerindeki açık bir `to_block` veya `from_block`, `clamp` kaçışı olmaksızın kesin bir `409 not_indexed_yet` döndürür.                                          |

### Sayfalama

Her iki uç nokta da keyset ile sayfalandırılır:

* `limit` varsayılan olarak 50'dir; 500'ün üzerindeki değerler 500'e kırpılır ve `0` veya tamsayı olmayan bir değer `400 bad_request` döndürür.
* `next_cursor` yalnızca başka bir sayfa olduğunda görünür. Son sayfada bu anahtar tamamen yoktur, asla `null` olmaz.
* Sonraki sayfayı almak için döndürülen değeri değiştirmeden `cursor` olarak geri iletin. Bir imleç yalnızca onu oluşturan zincir, uç nokta ve sorgu parametreleri için geçerlidir.

### Kapsam ve kesinlik

Data API transferleri, her zincirin `coverage.from_block` değerinden `meta.as_of_block` değerine kadar geçmiş token transferlerini indeksler. Hangi zincirlerin bunu sağladığını görmek için [Desteklenen Zincirler](https://docs.blockvectra.com/tr/chains/) sayfasına bakın.

Her transfer öğesi `token`, `standard`, `from`, `to`, `block_number`, `block_timestamp`, `tx_hash`, `tx_index` ve `log_index` içerir. ERC-20 öğeleri `amount` ekler; ERC-721 öğeleri `token_id` ekler; ERC-1155 öğeleri `operator`, `token_id`, `value` ve `batch_index` ekler.

## Hangisi kullanılmalı

| Tipik görev                        | Daha uygun olan                                                  | Neden                                                                                                                                                                     |
| ---------------------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| En son birkaç yüz bloktaki olaylar | `eth_getLogs`                                                    | O zincirin `max_logs_block_range` sınırını aşmadığı sürece tek bir istek yakın tarihli bir aralığı kapsayabilir.                                                          |
| Bir adresin geçmiş transferleri    | `GET /{chain}/addresses/{address}/transfers`                     | Bir `from_block`/`to_block` penceresi, `direction` ve `token` filtreleri ve imleç sayfalaması içeren adres kapsamlı sorgu; sonuçlar `as_of_block` değerine kadar sunulur. |
| Bir tokenın tüm transferleri       | `GET /{chain}/tokens/{token}/transfers`                          | Tam sonuç seti için isteğe bağlı bir pencere ve imleç sayfalaması ile `erc20`, `erc721` ve `erc1155` kapsamına sahip token sözleşmesi odaklı sorgu.                       |
| Yeni olayların canlı izlenmesi     | `eth_subscribe` (WebSocket zincirleri) / `eth_getLogs` (yoklama) | Desteklenen yerlerde WebSocket üzerinden yeni tepe bloklara veya loglara abone olun ya da yakın tarihli blok aralıklarını yoklayın.                                       |

## eth\_getLogs ile logları sorgulama

**cURL**

```bash
export BLOCKVECTRA_API_KEY=rgw_your_api_key

# fromBlock / toBlock varsayılan olarak latest değerini alır. Yeni olayları takip etmek
# için açık bir yakın tarihli aralık belirleyin ve aralığı zincirin max_logs_block_range sınırı içinde tutun.
curl -s "https://api.blockvectra.com/v1/robinhood_mainnet" \
  -H 'Content-Type: application/json' \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "eth_getLogs",
    "params": [{
      "address": "0x1111111111111111111111111111111111111111",
      "fromBlock": "latest",
      "toBlock": "latest"
    }]
  }'
```


  **TypeScript**

```ts
const res = await fetch("https://api.blockvectra.com/v1/robinhood_mainnet", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": process.env.BLOCKVECTRA_API_KEY!,
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "eth_getLogs",
    params: [{
      address: "0x1111111111111111111111111111111111111111",
      fromBlock: "latest",
      toBlock: "latest",
    }],
  }),
});

const { result } = await res.json();
console.log(result);

// npx tsx example.mts
```


  **Python**

```python
import os
import requests

res = requests.post(
    "https://api.blockvectra.com/v1/robinhood_mainnet",
    headers={
        "Content-Type": "application/json",
        "x-api-key": os.environ["BLOCKVECTRA_API_KEY"],
    },
    json={
        "jsonrpc": "2.0",
        "id": 1,
        "method": "eth_getLogs",
        "params": [{
            "address": "0x1111111111111111111111111111111111111111",
            "fromBlock": "latest",
            "toBlock": "latest",
        }],
    },
)
res.raise_for_status()
print(res.json())
```


## Data API ile transferleri sorgulama

**cURL**

```bash
export BLOCKVECTRA_API_KEY=rgw_your_api_key

# from_block / to_block burada isteğe bağlıdır; to_block atlandığında varsayılan olarak as_of_block alınır.
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/tokens/0x1111111111111111111111111111111111111111/transfers?standard=erc20" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
```


  **TypeScript**

```ts
let cursor: string | undefined;

do {
  const url = new URL(
    "https://api.blockvectra.com/v1/data/robinhood_mainnet/tokens/0x1111111111111111111111111111111111111111/transfers",
  );
  url.searchParams.set("standard", "erc20");
  if (cursor) url.searchParams.set("cursor", cursor);

  const res = await fetch(url, {
    headers: { "x-api-key": process.env.BLOCKVECTRA_API_KEY! },
  });
  const body = await res.json();
  console.log(body.data);
  cursor = body.next_cursor; // son sayfada yoktur
} while (cursor);

// npx tsx example.mts
```


  **Python**

```python
import os
import requests

url = "https://api.blockvectra.com/v1/data/robinhood_mainnet/tokens/0x1111111111111111111111111111111111111111/transfers"
cursor = None

while True:
    params = {"standard": "erc20"}
    if cursor:
        params["cursor"] = cursor
    res = requests.get(
        url,
        params=params,
        headers={"x-api-key": os.environ["BLOCKVECTRA_API_KEY"]},
    )
    res.raise_for_status()
    body = res.json()
    print(body["data"])
    cursor = body.get("next_cursor")  # son sayfada yoktur
    if not cursor:
        break
```


Bunun yerine adrese göre sorgulamak için `from_block` ve `to_block` zorunludur:

```bash
# clamp=true, 409 döndürmek yerine çok geniş bir pencereyi veya as_of_block üzerindeki
# bir to_block değerini kırpar.
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/addresses/0x1111111111111111111111111111111111111111/transfers?standard=erc20&from_block=0&to_block=73000000&direction=any&clamp=true" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
```

## Çağrı başına CU

Her yöntem CU ağırlığına göre faturalandırılır. Aşağıdaki ağırlıklar platform planları API'sinden okunur:

**Çağrı başına CU ağırlığı**

| Metot | Çağrı başına CU |
| --- | --- |
| `eth_getLogs` | 30 |
| `data.address_transfers` | 25 |
| `data.token_transfers` | 25 |

Güncel fiyatlar ve bakiye yükleme seçenekleri için [Fiyatlandırma sayfasına](https://blockvectra.com/tr/pricing/) bakın.

## Sonraki adımlar

* [BlockVectra'nın indekslediği her veri setini görmek için veri setleri dizinine göz atın](https://blockvectra.com/tr/data/).
* [Hesabınızın neleri içerdiğini kontrol etmek için ücretsiz planı ve fiyatlandırmayı inceleyin](https://blockvectra.com/tr/pricing/#free).
* [Bir API anahtarı oluşturmak için konsola giriş yapın](https://console.blockvectra.com/login/?next=%2Fkeys%2F).
