メインコンテンツへスキップ

Documentation Index

Fetch the complete documentation index at: https://docs.chainstream.io/llms.txt

Use this file to discover all available pages before exploring further.

ChainStream GraphQL でデータを絞り込む方法は 2 つあります。
  1. セレクター省略形tokenAddress のようなトップレベル引数で、よく使うフィルターを簡潔に書く
  2. where 引数 — ネストしたフィルターオブジェクトで、すべての演算子と任意のディメンションによる絞り込みが可能
ベストプラクティス: 必ず時間フィルターを付ける。 DWD(明細)Cube(DEXTrades、Transfers、BalanceUpdates など)では、Block.Time フィルターなしのクエリは非常に大きなテーブルパーティションをスキャンする可能性があります。where: {Block: {Time: {after: "..."}}} でスキャン範囲を限定し、OLAP エンジン上のメモリ制限を避けてください。
同じクエリで両方を組み合わせられます。

セレクター省略形

セレクターは Cube フィールド上の利便性のための引数で、よく使う where パターンにマップされます。プレーン文字列ではなく、where のフィールドと同じフィルター入力型(例: isinlike などを持つ StringFilter)を受け取ります。
セレクターマップ先利用可能な Cube
tokenAddress各 Cube の主トークンアドレス列DEXTrades, Transfers, BalanceUpdates, DEXPools, TokenSupplyUpdates, Pairs, Tokens, DEXPoolEvents, TokenHolders
walletAddressウォレット/アカウント所有者アドレスDEXTrades, WalletTokenPnL
poolAddressプールコントラクトアドレスDEXTrades, DEXPools
senderAddress転送の送信元アドレスTransfers
receiverAddress転送の受信先アドレスTransfers
ownerAddressトークンアカウント所有者アドレスBalanceUpdates
dexProgramDEX プログラム/コントラクトアドレスDEXTrades
dateブロックタイムスタンプ(DateTime フィルター)DEXTrades, Transfers, BalanceUpdates, DEXPools
次の 2 つのクエリは等価です。
query {
  Solana {
    DEXTrades(
      tokenAddress: {is: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"}
      limit: { count: 10 }
    ) {
      Block { Time }
      Trade { Buy { Amount PriceInUSD } }
    }
  }
}
セレクターは完全一致だけでなく、すべてのフィルター演算子をサポートします。例: tokenAddress: {in: ["ADDR_1", "ADDR_2"]} で複数トークンにマッチし、date: {after: "2025-01-01T00:00:00Z"} で時間で絞れます。

where 引数

where 引数は、Cube のディメンション階層を反映したネストした入力オブジェクトを受け取ります。各リーフフィールドは、型付き演算子を持つフィルタープリミティブにマップされます。

構造

where: {
  DimensionGroup: {
    DimensionField: {
      operator: value
    }
  }
}
— ブロック時刻が指定日より後で、かつ買い数量が 1000 超の DEXTrades に絞る:
query {
  Solana {
    DEXTrades(
      where: {
        Block: { Time: { after: "2025-01-01T00:00:00Z" } }
        Trade: { Buy: { Amount: { gt: 1000 } } }
      }
      limit: { count: 20 }
    ) {
      Block { Time }
      Trade { Buy { Amount PriceInUSD } }
    }
  }
}
where の同一レベルに複数フィールドがある場合、AND で結合されます。

フィルタープリミティブの型

各リーフディメンションは、次のいずれかのフィルター入力型にマップされます。

StringFilter

アドレス、ハッシュ、プロトコル名などのテキストフィールド向け。
演算子説明
isString完全一致
notString不一致
in[String!]リスト内のいずれかに一致
notIn[String!]リスト内の値をすべて除外
likeStringSQL LIKE パターン(% ワイルドカード)
where: {
  Trade: {
    Dex: {
      ProtocolName: { in: ["Raydium", "Orca"] }
    }
  }
}

IntFilter / FloatFilter

数量、価格、件数などの数値フィールド向け。
演算子説明
eqNumber等しい
neNumber等しくない
gtNumberより大きい
gteNumber以上
ltNumberより小さい
lteNumber以下
in[Number!]リスト内のいずれかに一致
notIn[Number!]リスト内の値をすべて除外
where: {
  Trade: {
    Buy: {
      PriceInUSD: { gte: 0.001, lte: 1.0 }
    }
  }
}

DateTimeFilter

タイムスタンプフィールド向け。値は ISO 8601 文字列です。
演算子説明
afterDateTimeこの時刻より後(排他的)
beforeDateTimeこの時刻より前(排他的)
sinceDateTimeこの時刻以降(包含)
tillDateTimeこの時刻まで(包含)
between[DateTime!, DateTime!]2 つの時刻の間(両端包含)
where: {
  Block: {
    Time: { since: "2025-03-01T00:00:00Z", till: "2025-03-31T23:59:59Z" }
  }
}
after / before排他的(狭義の不等号)。since / till包含です。between は 2 要素の配列で、両端とも包含です。

BoolFilter

真偽フィールド向け。
演算子説明
eqBooleantrue または false と等しい
where: {
  IsSuspect: { eq: true }
}

any による OR ロジック

既定では where 内の条件はすべて AND で結合されます。OR を表すには any 配列フィールドを使います — 各要素は完全なフィルターオブジェクトで、いずれかに一致する行が返されます。
query {
  Solana {
    DEXTrades(
      where: {
        any: [
          { Trade: { Buy: { Currency: { MintAddress: { is: "TOKEN_A" } } } } }
          { Trade: { Buy: { Currency: { MintAddress: { is: "TOKEN_B" } } } } }
        ]
      }
      limit: { count: 20 }
    ) {
      Trade {
        Buy { Currency { MintAddress } Amount }
      }
    }
  }
}
any は他のトップレベル where フィールドと併用できます。any 内の条件同士は OR で結合され、その結果が兄弟条件と AND で結合されます。

既定フィルター

一部の Cube では既定フィルターが自動適用されます。where で明示的に設定すると上書きできます。
Cube既定フィルター効果
DEXTradesIsSuspect = false既定でボット/MEV 取引を除外
疑わしい取引を含めるには、フィルターを明示します:
query {
  Solana {
    DEXTrades(
      where: { IsSuspect: { eq: true } }
      limit: { count: 10 }
    ) {
      Block { Time }
      Trade { Buy { Amount } }
      IsSuspect
    }
  }
}
whereIsSuspect を書かないと、既定の false のままです。疑わしさに関係なくすべての取引を取得するには OR を使います:
where: {
  any: [
    { IsSuspect: { eq: true } }
    { IsSuspect: { eq: false } }
  ]
}

セレクターと where の併用

セレクターと where は AND で結合されます。主エンティティはセレクター、追加の絞り込みは where に書けます:
query {
  Solana {
    DEXTrades(
      tokenAddress: {is: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"}
      where: {
        Block: { Time: { after: "2025-03-01T00:00:00Z" } }
        Trade: { Buy: { Amount: { gt: 100 } } }
      }
      orderBy: {descending: Block_Time}
      limit: { count: 50 }
    ) {
      Block { Time }
      Transaction { Hash }
      Trade {
        Buy { Amount PriceInUSD }
        Sell { Currency { MintAddress } Amount }
        Dex { ProtocolName }
      }
    }
  }
}
このクエリは、Solana 上の USDC で買い数量が 100 を超える直近 50 件の取引を、時刻の降順で取得します。

次のステップ

並び順とページネーション

orderBylimit で結果を並べ替え、ページングします。

メトリクスと集計

count、sum、avg、min、max、uniq でフィルター済みデータを集計します。