Skip to Content
ConceptsNetwork & Testnet

Network and Testnet

The Solidus testnet is live and producing blocks. This page covers how to connect, the available RPC methods, the block explorer, and the testnet faucet.

Testnet Status

The testnet is running with the following configuration:

ParameterValue
Validators5
ConsensusHotStuff BFT
Block time~2.5 seconds
Finality3-chain (~7.5 seconds)
RPC endpointhttps://rpc.solidus.network
Explorerexplorer.solidus.network
Faucet balance~1.9M SLDS available
Native tokenSLDS

Connecting to the Testnet

Using the SDK

The simplest way to connect is through @solidus-network/sdk:

import { createSdk } from '@solidus-network/sdk' const sdk = createSdk({ mode: 'testnet', rpcUrl: 'https://rpc.solidus.network', signerPrivateKey: privateKeyHex, })

Using curl

You can query the testnet directly via JSON-RPC:

curl -X POST https://rpc.solidus.network \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "solidus_getLatestBlock", "params": [], "id": 1 }'

Using JavaScript

For direct RPC calls without the SDK:

async function rpcCall(method: string, params: unknown[] = []) { const response = await fetch('https://rpc.solidus.network', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', method, params, id: 1, }), }) const data = await response.json() return data.result }

RPC Methods

The testnet exposes 20 solidus_* JSON-RPC methods. There is no solidus_getAccount method — account balance and nonce are two separate calls (solidus_getBalance, solidus_getNonce). All hashes are lowercase hex with no 0x prefix; block timestamps are Unix milliseconds (timestamp_ms), not ISO strings. For the full method-by-method reference see JSON-RPC.

solidus_getLatestBlock

Returns the most recent committed block.

curl -X POST https://rpc.solidus.network \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "solidus_getLatestBlock", "params": [], "id": 1 }'

Response (real, measured):

{ "jsonrpc": "2.0", "id": 1, "result": { "height": 82054, "round": 6495, "hash": "7bdd7ba192080a011f4564bae0d065401e2efa6a257f52df0eeb0ae284e01d02", "parent_hash": "261c0ac7955a5359b653f189a720ddd1358650772e35734003093fb2bc324800", "state_root": "c2a009a8fc5f869aee238febb2e362694bd3828748158d758e52420f5a15c89d", "transactions_root": "0000000000000000000000000000000000000000000000000000000000000000", "timestamp_ms": 1785314852140, "tx_count": 0, "proposer": "KoYahYf66hCp2wqTJFCxrzYpQ5r", "transactions": [] } }

solidus_getBlock

Returns a block by height, or null if it does not exist.

Parameters: [height: number]

curl -X POST https://rpc.solidus.network \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "solidus_getBlock", "params": [82054], "id": 1 }'

Response uses the same shape as solidus_getLatestBlock above.

solidus_didResolve

Resolves a DID and returns its DID Document, or null if not found.

Parameters: [did: string]

curl -X POST https://rpc.solidus.network \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "solidus_didResolve", "params": ["did:solidus:testnet:7Hk3mRtQZvNxP2bK9wYfJ4eD6cA5sLgR"], "id": 1 }'

The result is the DID document itself (not wrapped in a document field), with active, created_ms, and updated_ms alongside the standard W3C fields. See DIDs for the full document shape.

solidus_getValidators

Returns the active validator set as a bare array (not wrapped in {validators: [...]}).

curl -X POST https://rpc.solidus.network \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "solidus_getValidators", "params": [], "id": 1 }'

Response (real, measured — 5 validators currently active):

{ "jsonrpc": "2.0", "id": 1, "result": [ { "address": "3GfjBM7v6LZ1N5zp1b12gfpwCN8j", "staked": 1000000000000, "unbonding": 0, "reputation": 1000, "active": true }, { "address": "28gvczeVVVQjy6MpP4yexmd3xEsm", "staked": 0, "unbonding": 0, "reputation": 0, "active": true }, { "address": "2ddrNYxwr5V42QJmDgpphzGuWrAK", "staked": 0, "unbonding": 0, "reputation": 0, "active": true }, { "address": "2VnFvB9X8BW5QxDAD1wJjjd8AJvT", "staked": 0, "unbonding": 0, "reputation": 0, "active": true }, { "address": "KoYahYf66hCp2wqTJFCxrzYpQ5r", "staked": 0, "unbonding": 0, "reputation": 0, "active": true } ] }

There is no publicKey, isLeader, totalStake, or quorum field. staked, unbonding, and reputation are per-validator.

solidus_getTransaction

Returns the full transaction JSON for a hash, or null if not found (scans blocks backwards from the latest — acceptable on testnet).

Parameters: [txHash: string]

curl -X POST https://rpc.solidus.network \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "solidus_getTransaction", "params": ["<hex tx hash>"], "id": 1 }'

Returns the raw signed transaction (sender_pubkey, nonce, payload, signature) — not a wrapped {hash, type, from, status, data} envelope. Use solidus_getReceipt for execution status.

solidus_sendTransaction

Submits a signed transaction (JSON-encoded string) to the network. Returns the transaction hash as a hex string.

Parameters: [txJson: string]

curl -X POST https://rpc.solidus.network \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "solidus_sendTransaction", "params": ["<JSON-stringified signed transaction>"], "id": 1 }'

In practice, use the SDK rather than constructing raw transactions. The SDK handles nonce management, signing, and serialization.

Other live methods

11 more solidus_* methods are live on the RPC endpoint but not detailed on this page — see the full JSON-RPC reference for parameters and response shapes:

MethodPurpose
solidus_blockNumberLatest committed block height
solidus_chainInfoChain ID, native token metadata, genesis hash, latest height, node version
solidus_nodeInfoNode version, uptime, resident memory
solidus_canonHeadHead of the canonical ledger (seq + hash)
solidus_getBlockBySeqBlock by canonical sequence number
solidus_getValidatorStakeA single validator’s stake record
solidus_credentialVerifyVerify a credential by ID
solidus_credentialsBySubjectCredentials where a DID is the subject
solidus_credentialsByIssuerCredentials where a DID is the issuer
solidus_bbsVerifyProofStateless BBS+ selective-disclosure proof verification
solidus_bbsVerifyCredentialProofBBS+ proof verification against an on-chain credential

solidus_getBalance, solidus_getNonce, and solidus_getReceipt are also live.

Block Explorer

The block explorer at explorer.solidus.network provides a web interface for browsing the testnet. You can:

  • View the latest blocks and their transactions
  • Look up accounts by address
  • Search for transactions by hash
  • Inspect DID Documents
  • Monitor validator activity and network health

Testnet Faucet

The testnet faucet distributes test SLDS tokens for development. Approximately 1.9 million SLDS are available.

To request testnet tokens, use the faucet endpoint:

curl -X POST https://rpc.solidus.network/faucet \ -H "Content-Type: application/json" \ -d '{ "address": "7Hk3mRtQZvNxP2bK9wYfJ4eD6cA5sLgR" }'

Testnet tokens have no monetary value. They are used for paying transaction fees during development.

Mainnet Status

Mainnet has not yet launched. The testnet is the current production network for development and testing. Key differences to expect when mainnet launches:

  • Validator set — mainnet will have a larger, permissionless validator set
  • Token value — mainnet SLDS tokens will have real economic value for staking and fees
  • Credential permanence — credentials issued on testnet will not carry over to mainnet
  • Breaking changes — the protocol may undergo breaking changes before mainnet launch

All SDKs and applications currently target the testnet. When mainnet launches, switching will require changing mode (to 'mainnet') and rpcUrl in the SDK configuration.

Network Health Monitoring

You can check the network status by querying the latest block and comparing its timestamp to the current time. If the latest block is more than 10 seconds old, the network may be experiencing issues. The SDK’s chain namespace doesn’t expose a block-query helper, so use solidus_getLatestBlock directly (the rpcCall helper defined above):

const block = await rpcCall('solidus_getLatestBlock') const age = (Date.now() - block.timestamp_ms) / 1000 if (age > 10) { console.warn('Network may be slow. Latest block is', age, 'seconds old.') } else { console.log('Network healthy. Block height:', block.height) }

Next Steps

  • Getting Started — start building with the SDK
  • Architecture — understand consensus, state model, and transaction types
  • DIDs — create and resolve identifiers on the testnet
  • Credentials — issue and verify credentials on-chain
Last updated on