Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.raze.bot/llms.txt

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

The same composable funding primitives that power the REST /api/sol/funding/* endpoints, exposed over GraphQL. GraphQL is the preferred surface for large wallet sets: REST caps at 150 wallets per request to fit under proxy URL-length limits, while GraphQL takes the same [String!]! list in the JSON body with no URL-length constraint. The same per-request work cap (150) still applies inside the resolver. All five fields share two side effects with their REST twins:
  • enrichmentEnqueued: any wallet without an observed funding row is queued for an async RPC backfill. The next request returns the resolved event (or a terminal rpc_unresolved row).
  • CEX noise filter (fundingCluster only): a “cluster” covering more than 50% of the input wallets is treated as a CEX/exchange hot wallet, dropped, and its members demoted to unclustered.

fundingLookup

For each wallet, returns the first observed inbound SOL funding event.

Arguments

NameTypeRequiredDescription
wallets[String!]!yes1–150 wallet addresses. Duplicates collapsed.

Return type

type FundingLookupResult {
  fundings: [FundingLookupEntry!]!
  missing: [String!]!
  enrichmentEnqueued: [String!]!
}

type FundingLookupEntry {
  wallet: String!
  funding: Funding
}

type Funding {
  funder: String!
  fundedAt: String!     # RFC-3339
  signature: String!
  slot: Int!
  lamports: String!     # u64 as string to avoid JS precision loss
  solAmount: Float!
  source: String!       # "observed" | "rpc_backfilled" | "rpc_unresolved"
}

Example

query {
  fundingLookup(wallets: ["3ixtZX...", "4wuudp..."]) {
    fundings {
      wallet
      funding { funder fundedAt solAmount source }
    }
    missing
    enrichmentEnqueued
  }
}

fundedBy

Reverse lookup — for each funder, the wallets it has funded, ordered by fundedAt DESC.

Arguments

NameTypeRequiredDescription
funders[String!]!yes1–150 funder addresses.
limitIntnoPer-funder cap. Default 100, max 1000.
beforeStringnoPagination cursor — millisecond timestamp from previous page (passed as a string to avoid Int overflow).

Return type

type FundedByResult {
  funded: [FundedByGroup!]!
}

type FundedByGroup {
  funder: String!
  wallets: [FundedByEdge!]!
  nextCursor: String
  more: Boolean!
}

type FundedByEdge {
  wallet: String!
  fundedAt: String!
  signature: String!
  slot: Int!
  lamports: String!
  solAmount: Float!
  source: String!
}

Example

query {
  fundedBy(funders: ["FuNdR..."], limit: 200) {
    funded {
      funder
      more
      nextCursor
      wallets { wallet fundedAt solAmount }
    }
  }
}

fundingChain

Walks funding ancestry up to depth levels for each input wallet. One ClickHouse round trip per level (batched across all chain heads).

Arguments

NameTypeRequiredDescription
wallets[String!]!yes1–150 wallet addresses.
depthIntno1–10. Default 5.

Return type

type FundingChainResult {
  chains: [FundingChainEntry!]!
  enrichmentEnqueued: [String!]!
}

type FundingChainEntry {
  wallet: String!
  steps: [FundingChainStep!]!
}

type FundingChainStep {
  wallet: String!       # this hop's wallet (closest funder first)
  fundedBy: String!
  fundedAt: String!
  signature: String!
  slot: Int!
  lamports: String!
  solAmount: Float!
  source: String!
}
The chain stops at a wallet with no observed funder or when depth is exceeded.

fundingCluster

Groups wallets that share a common funding ancestor within depth levels. The single most useful primitive — bubblemap clustering, sniper-farm detection, and “wallets bought from the same dispenser” all reduce to this.

Arguments

NameTypeRequiredDescription
wallets[String!]!yes1–150 wallet addresses.
depthIntno1–5. Default 2.

Return type

type FundingClusterResult {
  clusters: [FundingCluster!]!
  unclustered: [String!]!
  enrichmentEnqueued: [String!]!
  noiseDropped: Int!     # count of wallets demoted by the CEX noise filter
}

type FundingCluster {
  rootFunder: String!
  depth: Int!
  wallets: [String!]!
}

holderEdges

Direct user-to-user transfer edges among a wallet set, scoped to one mint. Edges are canonical (a < b lex), undirected, and aggregated — repeated transfers between the same pair collapse to one row with a transfers count.

Arguments

NameTypeRequiredDescription
mintString!yesToken mint to scope edges to.
wallets[String!]!yes1–150 wallet addresses.

Return type

type HolderEdgesResult {
  mint: String!
  edges: [HolderEdge!]!
}

type HolderEdge {
  a: String!            # canonical: a < b lex
  b: String!
  kind: String!         # "token" (SPL transfer) | "sol" (native SOL)
  transfers: String!    # u64 as string
  firstSeen: String!
  lastSeen: String!
}

Example: bubblemap one-shot

query Bubblemap($mint: String!, $wallets: [String!]!) {
  fundingCluster(wallets: $wallets, depth: 3) {
    clusters { rootFunder depth wallets }
    unclustered
  }
  fundingChain(wallets: $wallets, depth: 5) {
    chains { wallet steps { fundedBy solAmount } }
  }
  holderEdges(mint: $mint, wallets: $wallets) {
    edges { a b kind transfers }
  }
}
A single round trip pulls every primitive the bubblemap renders.