Skip to main content

WebSocket Events

QoreChain provides real-time event streaming through two WebSocket interfaces: the EVM-compatible WebSocket and the QoreChain Consensus Engine RPC WebSocket.

note

The consensus-engine RPC WebSocket is available publicly on both the qorechain-vladi mainnet and the qorechain-diana testnet. The EVM WebSocket is available publicly on the testnet only: there is no public mainnet EVM WebSocket (wss://evm.qore.host and wss://evm-ws.qore.host do not accept WebSocket connections), so on mainnet run your own node for eth_subscribe. The local endpoints below assume a node you run yourself.

InterfaceMainnetTestnet
RPC WebSocketwss://rpc.qore.host/websocketwss://rpc-testnet.qore.host/websocket
EVM WebSocketnone (own node only)wss://evm-ws-testnet.qore.host

EVM WebSocket​

Endpoint: ws://localhost:8546 on your own node; public testnet: wss://evm-ws-testnet.qore.host. There is no public mainnet EVM WebSocket.

The EVM WebSocket supports the standard eth_subscribe method for real-time event streaming compatible with Ethereum tooling.

Subscription Types​

SubscriptionDescription
newHeadsEmits a header each time a new block is appended
logsEmits logs matching an optional filter
newPendingTransactionsEmits transaction hashes entering the mempool

The syncing subscription is not implemented: eth_subscribe with "syncing" returns -32600 syncing subscription is not implemented. Poll eth_syncing over HTTP instead.

Subscribe to New Blocks​

{
"jsonrpc": "2.0",
"method": "eth_subscribe",
"params": ["newHeads"],
"id": 1
}

Subscribe to Logs with Filter​

{
"jsonrpc": "2.0",
"method": "eth_subscribe",
"params": [
"logs",
{
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD28",
"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}
],
"id": 2
}

Unsubscribe​

{
"jsonrpc": "2.0",
"method": "eth_unsubscribe",
"params": ["0x1a2b3c..."],
"id": 3
}

QoreChain RPC WebSocket​

Endpoint: ws://localhost:26657/websocket on your own node; public: wss://rpc.qore.host/websocket (mainnet) and wss://rpc-testnet.qore.host/websocket (testnet).

The RPC WebSocket uses the QoreChain Consensus Engine event subscription system. Clients subscribe with a query string that filters events by type and attributes.

Subscribe to All New Blocks​

{
"jsonrpc": "2.0",
"method": "subscribe",
"params": {
"query": "tm.event='NewBlock'"
},
"id": 1
}

Subscribe to All Transactions​

{
"jsonrpc": "2.0",
"method": "subscribe",
"params": {
"query": "tm.event='Tx'"
},
"id": 2
}

Subscribe to Module-Specific Events​

Filter by event type to receive only events from a specific module:

{
"jsonrpc": "2.0",
"method": "subscribe",
"params": {
"query": "tm.event='Tx' AND bridge_deposit.chain EXISTS"
},
"id": 3
}

Unsubscribe​

{
"jsonrpc": "2.0",
"method": "unsubscribe",
"params": {
"query": "tm.event='NewBlock'"
},
"id": 4
}

Module Events Reference​

Events are emitted as standard consensus-engine events. Subscribe with a tm.event='Tx' query filtered on the event type and attribute (for example tm.event='Tx' AND bridge_deposit.chain EXISTS). Block-level events (those emitted by end-of-block logic, such as the PRISM events below) are delivered with tm.event='NewBlock', not Tx. The names and attributes below are those of chain version v3.2.6 (mainnet since 4 November 2026, testnet since 27 October 2026); events added in v3.2.4 are marked. v3.2.6 added one event, rl_action_proposed, listed with the PRISM events.

Which events you will actually see

Many of these modules are idle on the public networks: the bridge is not live, no multilayer layers or rollups are registered yet, and xQORE is not usable. Their events are defined but do not fire until there is activity. The PRISM observation and reward events (rl_observation_collected, rl_reward_computed) are emitted about every 10 blocks on both networks; from v3.2.6 the agent also emits rl_action_proposed at each step it takes (on mainnet the agent had taken no step as of 4 November 2026).

PQC Module​

Event TypeKey AttributesDescription
pqc_verifyaddress, key_type, algorithm_id, hybrid_mode, statusEmitted on each PQC signature check
pqc_hybrid_verifyaddress, algorithm_id, statusEmitted on each hybrid signature verification
pqc_hybrid_classical_onlyaddress, hybrid_modeEmitted when a classical-only signature is accepted by the current mode
pqc_key_registeredaddress, key_type, algorithm_idEmitted when a PQC key is registered
pqc_key_rotatedaddress, algorithm_idEmitted when a PQC key is rotated
pqc_key_migratedaddress, from_algorithm, to_algorithmEmitted when a key is migrated to a new algorithm
pqc_evm_window_openedaddress, expiry_height, max_txs, max_value; native_only and allowed_targets when the window is scoped (v3.2.3)Emitted when an EVM-lane authorisation window opens
pqc_evm_window_closedaddressEmitted when an EVM-lane authorisation window closes
pqc_evm_delegation_consentaddress, delegate, expiry_heightEmitted when an account records its consent to an EIP-7702 delegation (v3.2.2)
pqc_evm_delegation_clearedaddress, delegateEmitted when an account's EIP-7702 delegation is cleared (v3.2.2)
pqc_algorithm_registered, pqc_algorithm_status_updated, pqc_algorithm_disabledalgorithm_id, and name/category, old_status/new_status or reasonAlgorithm-registry changes made by governance

PQC keys are registered explicitly with a registration transaction; there is no automatic registration event.

Bridge Module​

Event TypeKey AttributesDescription
bridge_depositoperation_id, chain, asset, amount, senderEmitted when an inbound deposit is recorded
bridge_withdrawoperation_id, chain, asset, amount, sender, receiverEmitted when a withdrawal is recorded
bridge_attestationoperation_id, validator, chain, pqc_verified, attestationsEmitted for each validator attestation
bridge_operation_executedoperation_id, statusEmitted when an operation completes
bridge_circuit_breaker_tripchain, status, reasonEmitted when a chain's bridge circuit breaker trips

Cross-VM Module​

Event TypeKey AttributesDescription
crossvm_requestmessage_id, source_vm, target_vm, target_contract, senderEmitted when a cross-VM call is initiated
crossvm_responsemessage_id, statusEmitted when a cross-VM call completes
crossvm_timeoutmessage_idEmitted when a cross-VM message exceeds its queue timeout

Multilayer Module​

Event TypeKey AttributesDescription
state_anchoredlayer_id, layer_height, state_root, main_chain_height, pqc_verified, transaction_countEmitted when a layer state anchor is accepted
anchor_challengedlayer_id, layer_height, challenger, challenge_reason, resolutionEmitted when an anchor is challenged
layer_status_updatedlayer_id, status, reasonEmitted when a layer changes status
sidechain_registered, paychain_registeredlayer_id, layer_type, creator, statusEmitted when a layer is registered
transaction_routedselected_layer, routing_reason, gas_savings, latency_ms, senderEmitted when a transaction is routed to a layer

RDK Module​

Event TypeKey AttributesDescription
rollup_createdrollup_id, creator, profile, settlement_modeEmitted when a new rollup is registered
rollup_paused, rollup_resumed, rollup_stoppedrollup_id and a reason where givenEmitted when a rollup is paused, resumed or stopped
batch_challenged, challenge_resolved, batch_rejectedrollup_id, batch_index (and fraud_upheld on a resolution)Emitted when a batch is challenged, the challenge is resolved, or a batch is rejected
batch_submittedrollup_id, batch_index, tx_countEmitted when a settlement batch is submitted
batch_finalizedrollup_id, batch_indexEmitted when a batch passes its challenge window
da_blob_storedrollup_id, blob_index, backend, sizeEmitted when a DA blob is stored
da_blob_prunedrollup_id, blob_indexEmitted when a DA blob is pruned after retention

Burn Module​

Event TypeKey AttributesDescription
burnsource, amountEmitted when tokens are permanently burned
milestone_burntx_threshold, burn_amount, cumulative_tx_countEmitted when a transaction-count milestone burn runs
burn_stranded_releasedamount, destination, remainingEmitted when governance releases part of the stranded staker share

Inflation, Gas Abstraction, Licence, Light Node and AI Modules​

Event TypeKey AttributesDescription
inflation_params_updatedmode, fixed_epoch_emission, max_total_emissionEmitted when governance changes the emission parameters
gas_abstraction_conversion, gas_abstraction_refillpaid, native_equivalent, rate, price_source, resultEmitted when a fee in another accepted token is converted, and when the float is refilled (none fire while only uqor is accepted)
gas_abstraction_float_funded, gas_abstraction_config_updatedsender, amount; accepted_tokens, block_conversion_capEmitted when the float is funded and when governance updates the configuration
license_granted, license_revoked, license_suspended, license_resumed, license_expiredgrantee and featureLicence lifecycle
license_authority_updatednew_authorityEmitted when governance replaces the licence authority (v3.2.3)
lightnode_register, lightnode_heartbeat, lightnode_claim_rewards, lightnode_deregister, lightnode_status_change, lightnode_reward_distribution, lightnode_reserve_releaseaddress, node_type, status, reward_amount, destinationLight-node lifecycle and reward events
ai_config_updatedmax_tx_per_minute, max_evm_tx_per_minute, anomaly_action, anomaly_thresholdEmitted when governance updates the AI screening configuration

Staking Tiers Module (v3.2.4)​

These events come with the v3.2.4 release: the qorechain-diana testnet has emitted them since 19 October 2026 and mainnet since 23 October 2026 (governance proposal 13, height 3,742,566). A node on an older release has no staking-tiers module and emits none of them.

Event TypeKey AttributesDescription
staking_tier_lock_createdlock_id, delegator, validator, amount, months, end_timeA delegation lock was created
staking_tier_lock_unlocked_early, staking_tier_lock_releasedlock_id, delegator, penalty_burned, bonus_forfeitedA lock was ended early (the penalty is burned under the staking_tier_penalty burn source), or reached its end
staking_tier_bonus_claimed, staking_tier_bonus_settleddelegator, amount; settlement totalsA bonus was claimed; the pool was settled
staking_tier_params_updatedparametersGovernance changed the module parameters

xQORE Module​

These events are not emitted yet: xQORE is not live in any released node build (see xQORE Staking).

Event TypeKey AttributesDescription
xqore_lockowner, amountEmitted when QOR is locked into xQORE
xqore_unlockowner, amount, penalty, burned, redistributed, returnedEmitted when xQORE is unlocked back to QOR

PRISM Consensus (RL Consensus) Module​

These are end-of-block events, delivered on the NewBlock stream.

Event TypeKey AttributesDescription
rl_observation_collectedheightEmitted when a PRISM observation is taken (about every 10 blocks)
rl_reward_computedheight, rewardEmitted when the PRISM reward is computed
rl_action_appliedheight, agent_modeEmitted when the PRISM agent applies a parameter adjustment
rl_action_proposedheight, agent_mode, applied, block_time_delta, gas_price_delta, validator_set_size_delta, pool_weight_rpos_delta, pool_weight_dpos_deltav3.2.6. Emitted at every agent step in every mode, with the proposed action; applied is false in shadow mode. The mainnet agent had taken no step as of 4 November 2026 (total_steps 0), so the event had not fired there
rl_agent_mode_changedheight, agent_modeEmitted when the agent mode changes
rl_circuit_breaker_triggeredheightEmitted when the PRISM circuit breaker blocks an action
rl_circuit_breaker_recoveredheightEmitted when the circuit breaker recovers

AI Module​

Event TypeKey AttributesDescription
ai_anomaly_checkscore_millionths, action, is_anomalousEmitted for each anomaly-scored transaction

JavaScript Client Example​

EVM WebSocket (ethers.js)​

import { ethers } from "ethers";

// Own node: ws://localhost:8546. Public testnet: wss://evm-ws-testnet.qore.host
const provider = new ethers.WebSocketProvider("ws://localhost:8546");

// Subscribe to new blocks
provider.on("block", (blockNumber) => {
console.log("New block:", blockNumber);
});

// Subscribe to contract events
const filter = {
address: "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD28",
topics: [ethers.id("Transfer(address,address,uint256)")],
};
provider.on(filter, (log) => {
console.log("Transfer event:", log);
});

QoreChain RPC WebSocket (Native)​

// Own node: ws://localhost:26657/websocket. Public: wss://rpc.qore.host/websocket
const ws = new WebSocket("ws://localhost:26657/websocket");

ws.onopen = () => {
// Subscribe to bridge deposits
ws.send(JSON.stringify({
jsonrpc: "2.0",
method: "subscribe",
params: { query: "tm.event='Tx' AND bridge_deposit.chain EXISTS" },
id: 1,
}));

// Subscribe to rollup batch submissions
ws.send(JSON.stringify({
jsonrpc: "2.0",
method: "subscribe",
params: { query: "tm.event='Tx' AND batch_submitted.rollup_id EXISTS" },
id: 2,
}));
};

ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.result && data.result.events) {
console.log("Event received:", data.result.events);
}
};

Notes​

  • Connection limits: On a node you run yourself, the default maximum number of WebSocket connections is unlimited (max-open-connections = 0). Set a limit in app.toml for production deployments. The public endpoints apply their own limits.
  • Event buffer: The RPC WebSocket buffers a bounded number of events per subscription (a default of 200 on a self-hosted node). If the client falls behind, older events are dropped.
  • Reconnection: Clients should implement automatic reconnection with exponential backoff, as WebSocket connections may be interrupted during node restarts or upgrades.