Current status
The testnet has been running stably since the 2026-01-23 update with sub-second mode active.| Network | Block interval | Blocks per second (BPS) | Pending lag | Finalization lag |
|---|---|---|---|---|
| Current mainnet | ~2.5 s | ~0.4 BPS | ~30–100 ms | ~10 s |
| Current testnet | ~450 ms | ~2.2 BPS | ~30–100 ms | ~4 s |
| Target mainnet | 200–400 ms | ~2.5–5 BPS | ~30–100 ms | ~1 s |
Wallets and apps
A faster chain alone does not improve user experience if the application continues to use HTTP polling. In this case, users still observe delays of 10+ seconds. To support sub-second UX, transaction updates must be delivered in real time.Transaction flow in sub-second mode
Applications that rely on polling typically behave as follows:- 0s – user initiates a transaction;
- ~0.4s – transaction included in a shard block;
- ~0.8s – shard block committed to masterchain;
- ~10s – UI updates on the next polling request.
- 0s – user initiates a transaction;
- ~0.1s –
pendingstatus is displayed; - ~0.4s – transaction included in a shard block and
confirmedstatus is displayed; - ~0.8s – shard block committed to masterchain and
finalizedstatus is displayed.
Use Streaming API v2
Switch to TON Center Streaming API v2 or TonAPI Streaming API to receive transaction status updates with 30–100 ms latency. MyTonWallet and tonscan.org have already switched to Streaming API v2 on both mainnet and testnet. This improves how quickly transaction updates appear in the UI by delivering events in real time, even though sub-second mode is not yet enabled on mainnet. If Streaming API cannot be used, reduce polling intervals and adjust assumptions about transaction timing. Interfaces should be designed to expect results in under 1 second.Handle transaction status flow
Handle all transaction statuses:"pending"– show a processing state immediately"confirmed"– optionally show optimistic success"finalized"– confirm success and update state"trace_invalidated"– discard cached data and re-check transaction status
Subscribe to transaction events
Subscribe to the sender or recipient address before or immediately after sending a transaction.Configure min_finality
The min_finality parameter controls which transaction status events are delivered. The default value is "finalized". If not set, only "finalized" events are received.
- Use
"pending"for send flows to receive all status updates. - Use
"finalized"for balances and transaction history to work only with settled data.
Recommended stack
For projects building on TON:- Data layer: TON Center Streaming API v2 with 30–100 ms latency.
-
SDK: AppKit for balances, tokens, NFTs, and contract interactions. For frontend applications, AppKit reduces integration complexity and removes the need for custom logic. It handles out of the box:
- TON balance for any address;
- Jetton balances and metadata;
- NFT holdings;
- Contract state reads;
- Transaction sending, including jetton transfers.
-
Finality: wait
"finalized"status for critical flows.
Test on testnet
To ensure correct UX and wallet behavior, perform the following tests.- For UX and app teams:
- Connect to testnet endpoints.
- Initiate a TON transfer.
- Observe all four statuses in sequence:
"pending"→"confirmed"→"finalized". - Measure time from transaction send to
"finalized". It should be under 1 second on testnet. - Test
"trace_invalidated"path: intentionally send a malformed transaction and confirm that UI handles it correctly.
- For wallet teams:
- Verify balance updates reflect within 1 second of
"finalized"status. - Verify transaction history updates in real time.
Indexers
Indexers must process up to 10x more blocks per second without accumulating lag. If the indexer is tuned for 2.5s block intervals, it will fall behind under 200–400ms intervals.Test on testnet
- Connect the indexer to testnet.
- Run for at least 30 minutes under normal conditions.
-
Measure lag continuously as the time between block production and indexer processing.
Target:
- lag < 500ms
- no growing backlog
- database writes
- network
- parsing
- After that generate the typical mainnet load profile on testnet.
Node, liteserver, or self-hosted TON Center
Connect to a liteserver
Public liteservers are available for both mainnet and testnet. Use global config files to discover and connect to them:- Mainnet:
ton.org/global.config.json - Testnet:
ton.org/testnet-global.config.json
Update components
All self-hosted components must be updated to versions that support Catchain 2.0.- TON node and liteserver – update to the latest release before mainnet activation.
- Self-hosted TON Center – update to a version with Streaming API v2 support.
Self-hosted liteserver updates
- If a liteserver node is self-hosted, ensure it is updated before mainnet rollout.
- Confirm that the node version supports the new consensus.
Test on testnet
After updating, connect each component to testnet and verify that it operates correctly under increased block rate. Do not wait for mainnet activation; issues identified on mainnet are harder to resolve.TON Center Streaming API v2
TON Center Streaming API v2 provides:- Real-time push of transaction status changes.
- Four statuses:
"pending","confirmed","finalized","trace_invalidated". - Latency: 30–100 ms from chain event to the client.
API token
- For testing purposes, any valid token for TON Center allows for 2 concurrent streaming connections.
- For production usage only enterprise plan allows for higher connection limits.
Endpoints
SSE and WebSocket are available. Choose based on the stack:- SSE – browser-friendly, server-to-client only (unidirectional).
- WebSocket – bidirectional, allows dynamic subscribe and unsubscribe after connection.
| Protocol | Testnet URL | Mainnet URL |
|---|---|---|
| SSE | https://testnet.toncenter.com/api/streaming/v2/sse | https://toncenter.com/api/streaming/v2/sse |
| WebSocket | wss://testnet.toncenter.com/api/streaming/v2/ws | wss://toncenter.com/api/streaming/v2/ws |
SSE known limitations
- Rate limit on reconnect (429 error). If a client reconnects immediately after a disconnect, the previous connection may still be open for ~1 minute. The reconnect attempt receives a 429 error. Use exponential backoff or an enterprise API key.
-
POST-only subscription.
Despite SSE typically using
GET, this endpoint requires aPOSTwith the subscription JSON in the request body.GETis not supported yet. -
No invalidation signal for
account_state_change/jettons_change. If aconfirmedaccount state or jetton balance update is later rolled back, no"trace_invalidated"notification is sent for these event types. Teams usingaccount_state_changeorjettons_changeat"confirmed"finality should be aware of this gap and consider waiting for"finalized"for balance-critical flows.
WebSocket keepalive
- Send a
pingevery 15 seconds to keep the connection alive. - SSE connections receive automatic server-side keepalive (
: keepalive) every 15 seconds; no client action required.