Skip to content

WebSocket API Reference

The ACDC WebSocket API enables real-time subscriptions to chain events. Use WebSocket connections for live updates on blocks, transactions, and other chain events.

Endpoints

Chain Network WebSocket URL
Alpha Mainnet wss://alpha-ws.ac-dc.network
Alpha Testnet wss://alpha-testnet-ws.ac-dc.network
Delta Mainnet wss://delta-ws.ac-dc.network
Delta Testnet wss://delta-testnet-ws.ac-dc.network

Connection

JavaScript Example

const ws = new WebSocket('wss://delta-ws.ac-dc.network');

ws.onopen = () => {
  console.log('Connected to ACDC WebSocket');

  // Subscribe to new blocks
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'subscribe',
    params: ['newBlocks']
  }));
};

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

ws.onerror = (error) => {
  console.error('WebSocket error:', error);
};

ws.onclose = () => {
  console.log('Disconnected');
};

Using the SDK

import { AcdcClient } from '@acdc/sdk';

const client = new AcdcClient({
  chain: 'delta',
  network: 'mainnet'
});

// Subscribe to new blocks
client.ws.subscribe('newBlocks', (block) => {
  console.log('New block:', block.number);
});

// Subscribe to address activity
client.ws.subscribe('address', {
  address: 'dx1abc123...'
}, (tx) => {
  console.log('Transaction:', tx.hash);
});

Message Format

Request Format

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "<method>",
  "params": [<subscription_type>, <options>]
}

Response Format

Subscription Confirmation:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "subscriptionId": "sub_abc123"
  }
}

Subscription Event:

{
  "jsonrpc": "2.0",
  "method": "subscription",
  "params": {
    "subscriptionId": "sub_abc123",
    "result": { ... }
  }
}

Subscription Types

newBlocks

Subscribe to new block headers.

Subscribe:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "subscribe",
  "params": ["newBlocks"]
}

Event Payload:

{
  "jsonrpc": "2.0",
  "method": "subscription",
  "params": {
    "subscriptionId": "sub_abc123",
    "result": {
      "number": 1234567,
      "hash": "0xabc123...",
      "parentHash": "0xdef456...",
      "timestamp": 1704067200,
      "txCount": 150,
      "validator": "dx1validator..."
    }
  }
}

newTransactions

Subscribe to pending transactions in the mempool.

Subscribe:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "subscribe",
  "params": ["newTransactions"]
}

Event Payload:

{
  "jsonrpc": "2.0",
  "method": "subscription",
  "params": {
    "subscriptionId": "sub_abc123",
    "result": {
      "hash": "0xtx123...",
      "from": "dx1sender...",
      "to": "dx1receiver...",
      "value": "1000000000000000000",
      "nonce": 42
    }
  }
}

address

Subscribe to transactions involving a specific address.

Subscribe:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "subscribe",
  "params": ["address", {
    "address": "dx1abc123...",
    "includeTokenTransfers": true
  }]
}

Options: | Name | Type | Default | Description | |------|------|---------|-------------| | address | string | required | Address to monitor | | includeTokenTransfers | boolean | false | Include token transfers | | direction | string | "all" | "in", "out", or "all" |

Event Payload:

{
  "jsonrpc": "2.0",
  "method": "subscription",
  "params": {
    "subscriptionId": "sub_abc123",
    "result": {
      "hash": "0xtx123...",
      "from": "dx1sender...",
      "to": "dx1abc123...",
      "value": "1000000000000000000",
      "direction": "in",
      "blockNumber": 1234567,
      "status": "confirmed"
    }
  }
}

logs

Subscribe to contract event logs.

Subscribe:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "subscribe",
  "params": ["logs", {
    "address": "dx1contract...",
    "topics": ["0xevent_signature..."]
  }]
}

Options: | Name | Type | Default | Description | |------|------|---------|-------------| | address | string | optional | Contract address filter | | topics | array | optional | Event topic filters |

Event Payload:

{
  "jsonrpc": "2.0",
  "method": "subscription",
  "params": {
    "subscriptionId": "sub_abc123",
    "result": {
      "address": "dx1contract...",
      "topics": ["0xevent..."],
      "data": "0xdata...",
      "blockNumber": 1234567,
      "transactionHash": "0xtx...",
      "logIndex": 0
    }
  }
}

validatorUpdates

Subscribe to validator set changes (Delta chain only).

Subscribe:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "subscribe",
  "params": ["validatorUpdates"]
}

Event Payload:

{
  "jsonrpc": "2.0",
  "method": "subscription",
  "params": {
    "subscriptionId": "sub_abc123",
    "result": {
      "type": "joined",
      "validator": "dx1validator...",
      "stake": "1000000000000000000000000",
      "blockNumber": 1234567
    }
  }
}

governanceEvents

Subscribe to governance proposal events.

Subscribe:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "subscribe",
  "params": ["governanceEvents", {
    "proposalId": 42
  }]
}

Event Payload:

{
  "jsonrpc": "2.0",
  "method": "subscription",
  "params": {
    "subscriptionId": "sub_abc123",
    "result": {
      "type": "vote",
      "proposalId": 42,
      "voter": "dx1voter...",
      "vote": "yes",
      "weight": "1000000000000000000000"
    }
  }
}

Managing Subscriptions

Unsubscribe

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "unsubscribe",
  "params": ["sub_abc123"]
}

Response:

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": true
}

List Subscriptions

{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "listSubscriptions",
  "params": []
}

Response:

{
  "jsonrpc": "2.0",
  "id": 3,
  "result": [
    {
      "subscriptionId": "sub_abc123",
      "type": "newBlocks",
      "created": 1704067200
    },
    {
      "subscriptionId": "sub_def456",
      "type": "address",
      "params": { "address": "dx1abc..." },
      "created": 1704067300
    }
  ]
}

Connection Management

Heartbeat

The server sends periodic ping frames. Clients should respond with pong to maintain the connection. Most WebSocket libraries handle this automatically.

Reconnection

Connections may drop due to network issues. Implement automatic reconnection:

class ReconnectingWebSocket {
  private url: string;
  private ws: WebSocket | null = null;
  private subscriptions: Map<string, object> = new Map();

  constructor(url: string) {
    this.url = url;
    this.connect();
  }

  private connect() {
    this.ws = new WebSocket(this.url);

    this.ws.onopen = () => {
      // Resubscribe to previous subscriptions
      this.subscriptions.forEach((params, type) => {
        this.subscribe(type, params);
      });
    };

    this.ws.onclose = () => {
      // Reconnect after delay
      setTimeout(() => this.connect(), 1000);
    };
  }

  subscribe(type: string, params: object = {}) {
    this.subscriptions.set(type, params);
    if (this.ws?.readyState === WebSocket.OPEN) {
      this.ws.send(JSON.stringify({
        jsonrpc: '2.0',
        id: Date.now(),
        method: 'subscribe',
        params: [type, params]
      }));
    }
  }
}

Rate Limits

Tier Max Subscriptions Max Messages/sec
Public 10 100
Registered 100 1,000
Enterprise Unlimited 10,000

Error Handling

Error Response:

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32000,
    "message": "Subscription limit exceeded"
  }
}

Code Message Description
-32000 Subscription limit exceeded Too many active subscriptions
-32001 Invalid subscription type Unknown subscription type
-32002 Invalid subscription params Invalid options provided
-32003 Subscription not found Unknown subscription ID