메인 콘텐츠로 건너뛰기

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에서 데이터를 필터링하는 방법은 두 가지입니다:
  1. Selector shortcutstokenAddress 같은 최상위 인자로, 흔한 필터를 간편히 쓰는 약칭
  2. where 인자 — 연산자 전 범위와 임의 차원 필터를 지원하는 중첩 필터 객체
권장: 항상 시간 필터를 넣으세요. DEXTrades, Transfers, BalanceUpdates 같은 DWD(상세) Cube에서 Block.Time 필터 없이 쿼리하면 매우 큰 테이블 파티션을 스캔할 수 있습니다. 스캔 범위를 제한하려면 항상 where: {Block: {Time: {after: "..."}}} 를 포함하고, OLAP 엔진의 메모리 한계를 피하세요.
같은 쿼리에서 둘을 함께 사용할 수 있습니다.

Selector shortcuts

Selector는 Cube 필드의 편의 인자로, 흔한 where 필터 패턴에 매핑됩니다. 단순 문자열이 아니라 where 필드와 동일한 필터 입력 타입(예: is, in, like 가 있는 StringFilter)을 받습니다.
Selector매핑 대상사용 가능 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
아래 두 쿼리는 동일합니다:
query {
  Solana {
    DEXTrades(
      tokenAddress: {is: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"}
      limit: { count: 10 }
    ) {
      Block { Time }
      Trade { Buy { Amount PriceInUSD } }
    }
  }
}
Selector는 정확 일치만이 아니라 모든 필터 연산자를 지원합니다. 예: 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!]두 시각 사이(양끝 포함)
where: {
  Block: {
    Time: { since: "2025-03-01T00:00:00Z", till: "2025-03-31T23:59:59Z" }
  }
}
after/before배타(엄격한 부등호)입니다. since/till포함입니다. between은 두 요소 배열이며 양끝 모두 포함입니다.

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 거래 제외
의심(suspect) 거래를 포함하려면 필터를 명시하세요:
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 } }
  ]
}

Selector와 where 결합

Selector와 where 는 AND로 결합됩니다. 주요 엔티티는 Selector로, 추가 조건은 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에서 매수 금액이 100을 넘는 USDC 거래 중 최근 50건을 시간 내림차순으로 가져옵니다.

다음 단계

정렬 및 페이지네이션

orderBylimit 으로 결과를 정렬하고 페이지를 넘깁니다.

메트릭 및 집계

count, sum, avg, min, max, uniq 로 필터된 데이터를 집계합니다.