概述

ChainStream DEX WebSocket API 提供实时数据订阅服务,支持以下数据类型:

  • K线数据 (Candles)
  • 代币统计 (Token Stats)
  • 交易事件 (Trade Events)
  • 钱包交易事件 (Wallet Trade Event)
  • 钱包余额 (Wallet Balance)
  • 代币持有者 (Token Holders)

基础 URL

wss://realtime-dex.chainstream.io/connection/websocket

快速开始

1. 建立连接

首先需要创建 WebSocket 连接并进行认证:

const ws = new WebSocket("wss://realtime-dex.chainstream.io/connection/websocket");

ws.onopen = () => {
  // 发送认证消息
  ws.send(JSON.stringify({
    type: "auth",
    token: "YOUR_ACCESS_TOKEN"
  }));
};

2. 订阅数据

选择需要的数据类型进行订阅:

// 订阅K线数据示例
ws.send(JSON.stringify({
  type: "subscribe",
  channel: "dex-candle:sol_6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN_1m"
}));

3. 处理数据

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('收到数据:', data);
};

数据订阅

K线数据

实时获取代币价格走势的K线图数据。

订阅格式

dex-candle:{chain}_{tokenAddress}_{resolution}

参数说明

chain
string
required

区块链名称,例如:sol

tokenAddress
string
required

代币合约地址,例如:6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN

resolution
string
required

K线周期,支持:1m, 5m, 15m, 1h, 4h, 1d

响应数据格式

WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。

{
  "o": number,    // 开盘价
  "c": number,    // 收盘价
  "h": number,    // 最高价
  "l": number,    // 最低价
  "v": number,    // 交易量
  "r": string,    // 周期
  "t": number     // 时间戳
}

代币统计

实时获取代币的市场统计数据。

订阅格式

dex-token-stats:{chain}_{tokenAddress}

参数说明

chain
string
required

区块链名称,例如:sol

tokenAddress
string
required

代币合约地址,例如:6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN

响应数据格式

WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。

{
  "a": string,      // 代币地址
  "t": number,      // 时间戳
  "b1m": number,    // 1分钟内买入次数
  "s1m": number,    // 1分钟内卖出次数
  "be1m": number,   // 1分钟内买入人数
  "se1m": number,   // 1分钟内卖出人数
  "bviu1m": number, // 1分钟内买入美元金额
  "sviu1m": number, // 1分钟内卖出美元金额
  "p1m": number,    // 1分钟价格
  "b5m": number,    // 5分钟内买入次数
  "s5m": number,    // 5分钟内卖出次数
  "be5m": number,   // 5分钟内买入人数
  "se5m": number,   // 5分钟内卖出人数
  "bviu5m": number, // 5分钟内买入美元金额
  "sviu5m": number, // 5分钟内卖出美元金额
  "p5m": number,    // 5分钟价格
  "b15m": number,   // 15分钟内买入次数
  "s15m": number,   // 15分钟内卖出次数
  "be15m": number,  // 15分钟内买入人数
  "se15m": number,  // 15分钟内卖出人数
  "bviu15m": number,// 15分钟内买入美元金额
  "sviu15m": number,// 15分钟内卖出美元金额
  "p15m": number,   // 15分钟价格
  "b30m": number,   // 30分钟内买入次数
  "s30m": number,   // 30分钟内卖出次数
  "be30m": number,  // 30分钟内买入人数
  "se30m": number,  // 30分钟内卖出人数
  "bviu30m": number,// 30分钟内买入美元金额
  "sviu30m": number,// 30分钟内卖出美元金额
  "p30m": number,   // 30分钟价格
  "b1h": number,    // 1小时内买入次数
  "s1h": number,    // 1小时内卖出次数
  "be1h": number,   // 1小时内买入人数
  "se1h": number,   // 1小时内卖出人数
  "bviu1h": number, // 1小时内买入美元金额
  "sviu1h": number, // 1小时内卖出美元金额
  "p1h": number,    // 1小时价格
  "b4h": number,    // 4小时内买入次数
  "s4h": number,    // 4小时内卖出次数
  "be4h": number,   // 4小时内买入人数
  "se4h": number,   // 4小时内卖出人数
  "bviu4h": number, // 4小时内买入美元金额
  "sviu4h": number, // 4小时内卖出美元金额
  "p4h": number,    // 4小时价格
  "b24h": number,   // 24小时内买入次数
  "s24h": number,   // 24小时内卖出次数
  "be24h": number,  // 24小时内买入人数
  "se24h": number,  // 24小时内卖出人数
  "bviu24h": number,// 24小时内买入美元金额
  "sviu24h": number,// 24小时内卖出美元金额
  "p24h": number,   // 24小时价格
  "p": number       // 当前价格
}

交易事件

实时获取代币的交易事件。

订阅格式

dex-trades:{chain}_{tokenAddress}

参数说明

chain
string
required

区块链名称,例如:sol

tokenAddress
string
required

代币合约地址,例如:6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN

响应数据格式

WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。

{
  "bwa": string,     // maker地址
  "ba": number,      // 基础代币数量
  "sa": number,      // 报价代币数量
  "swa": string,     // 报价代币地址
  "bais": number,    // 美元金额
  "t": number,       // 时间戳
  "k": string,       // 事件类型
  "h": string,       // 交易哈希
  "a": string        // 代币地址
}

钱包交易事件

实时获取指定钱包的交易事件。

订阅格式

dex-wallet-trade:{chain}_{walletAddress}

参数说明

chain
string
required

区块链名称,例如:sol

walletAddress
string
required

钱包地址,例如:GDekof7TtgeBKJtoVpkvzPin5mvhxSDyoUY2c1FK1T3i

响应数据格式

WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。

{
  "bwa": string,     // maker地址
  "ba": number,      // 基础代币数量
  "sa": number,      // 报价代币数量
  "swa": string,     // 报价代币地址
  "bais": number,    // 美元金额
  "t": number,       // 时间戳
  "k": string,       // 事件类型
  "h": string,       // 交易哈希
  "a": string        // 代币地址
}

钱包余额

实时获取钱包的余额信息。

订阅格式

dex-wallet-balance:{chain}_{walletAddress}

参数说明

chain
string
required

区块链名称,例如:sol

walletAddress
string
required

钱包地址,例如:HN7cABqLq46Es1jh92dQQisAq662SmxELLLsHHe4YWrH

响应数据格式

WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。

{
  "a": string,      // 钱包地址
  "ta": string,     // 代币地址
  "tpiu": number,   // 代币美元价格
  "t": number,      // 时间戳
  "ba": number,     // 买入数量
  "baiu": number,   // 买入美元金额
  "bs": number,     // 买入次数
  "sa": number,     // 卖出数量
  "saiu": number,   // 卖出美元金额
  "ss": number,     // 卖出次数
  "abp": number,    // 平均买入价格
  "asp": number,    // 平均卖出价格
  "upiu": number,   // 未实现盈亏(USD)
  "upr": number,    // 未实现盈亏率
  "rpiu": number,   // 已实现盈亏(USD)
  "rpr": number,    // 已实现盈亏率
  "trpiu": number,  // 总实现盈亏(USD)
  "trr": number     // 总实现盈亏率
}

代币持有者统计

实时获取代币持有者统计信息。

订阅格式

dex-token-general-stat-num:{chain}_{tokenAddress}

参数说明

chain
string
required

区块链名称,例如:sol

tokenAddress
string
required

代币合约地址,例如:6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN

响应数据格式

WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。

{
  "a": string,    // 代币地址
  "v": number,    // 持有者数量
  "ts": number    // 时间戳
}

使用示例

const streamApi = new StreamApi(context);

// 订阅K线数据
streamApi.subscribeTokenCandles({
  chain: "sol",
  tokenAddress: "6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN",
  resolution: "1m",
  callback: (data) => {
    console.log("K线数据:", data);
  }
});

// 订阅钱包余额
streamApi.subscribeWalletBalance({
  chain: "sol",
  walletAddress: "YOUR_WALLET_ADDRESS",
  callback: (data) => {
    console.log("钱包余额:", data);
  }
});

重连策略

推荐使用指数退避算法进行重连:

function reconnect(attempt) {
  const delay = Math.min(1000 * Math.pow(2, attempt), 10000);
  setTimeout(() => {
    connect();
  }, delay);
}

使用限制

限制项限制值说明
最大订阅数100个/连接超出将被拒绝
消息大小100KB超出将被截断
心跳间隔30秒需定期发送

最佳实践

  1. 连接管理

    • 保持单个WebSocket连接
    • 实现自动重连机制
    • 定期发送心跳
  2. 错误处理

    • 实现完整的错误处理流程
    • 记录详细的错误日志
    • 使用指数退避重连
  3. 性能优化

    • 合理控制订阅数量
    • 实现消息队列机制
    • 及时清理无用订阅

完整示例

class DexWebSocket {
  private ws: WebSocket;
  private reconnectAttempts = 0;
  private maxReconnectAttempts = 5;
  private messageHandlers = new Map<string, Set<(data: any) => void>>();

  constructor(
    private url: string,
    private accessToken: string
  ) {
    this.connect();
  }

  private connect() {
    this.ws = new WebSocket(this.url);
    
    this.ws.onopen = () => {
      // 发送认证
      this.authenticate();
      // 重新订阅
      this.resubscribe();
    };

    this.ws.onmessage = (event) => {
      this.handleMessage(JSON.parse(event.data));
    };

    this.ws.onclose = () => {
      this.reconnect();
    };
  }

  private authenticate() {
    this.send({
      type: "auth",
      token: this.accessToken
    });
  }

  public subscribe(channel: string, handler: (data: any) => void) {
    // 订阅实现
  }

  public unsubscribe(channel: string) {
    // 取消订阅实现
  }
}