Summary
Klaytn (now branded Kaia) uses a delegated proof-of-stake model where KLAY holders can stake through governance councils, public node operators, or liquid staking services rather than running a validator directly. Before you stake, you need to understand the unstaking delay, reward mechanics, and which RPC methods let your app read stake state and validator data reliably.
This page covers the Klaytn staking model, the JSON-RPC calls that matter for staking dashboards and wallets, and how to choose RPC infrastructure that keeps reward tracking and transaction submission responsive. It is written for developers integrating staking features, not for casual holders following a click-through tutorial.
Klaytn rebranded to Kaia, but the staking mechanics developers ask about are the same: KLAY (now KAIA) holders delegate stake to governance councils or node operators, and applications need reliable RPC access to read stake state, track rewards, and submit staking transactions. This page is aimed at developers building staking dashboards, wallets, or reward trackers, and at teams deciding what RPC infrastructure to run behind them.
What you actually need before you stake
Before writing any code, confirm three things. First, the staking path you are targeting: governance council delegation, a public node operator, or a liquid staking service. Each has a different contract surface and different data you need to read. Second, the unstaking delay, because it determines how you present withdrawal timelines in your UI. Third, whether your RPC endpoint can handle the read-heavy pattern staking apps produce, since reward tracking means frequent eth_call and log queries rather than occasional transfers.
If you are building on Klaytn and want a managed endpoint instead of running your own node, OnFinality's Klaytn (Kaia) RPC exposes a public endpoint you can test against immediately:
curl -X POST https://klaytn.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
A correct response returns 0x2019, which is chain ID 8217 for Kaia Mainnet. If you get a different chain ID, you are pointed at the wrong network.
Klaytn staking model in plain terms
Klaytn runs a delegated proof-of-stake consensus. A limited set of governance council nodes produce blocks, and KLAY holders can stake toward those nodes. Staking is not a free-for-all validator set like some networks; the council structure means the set of entities you can delegate to is constrained, and governance decisions affect who participates.
For developers, the practical consequences are:
- Staking operations often route through specific staking contracts rather than a generic precompile.
- Reward accrual is tied to block production, so you read rewards by scanning blocks or querying contract state, not by calling a single "get rewards" method.
- Unstaking is not instant. You need to model a delay in your UI and in any accounting logic.
Because the network is now branded Kaia, some documentation and block explorers use Kaia naming while older contracts and tooling still say Klaytn. Expect both terms in the wild and do not assume a contract is deprecated just because it uses the older name.
RPC methods that matter for staking apps
Staking front-ends and backends lean on a small set of JSON-RPC methods. The table below maps the job to the method you will call most often.
| Job in your staking app | Primary method | Notes |
|---|---|---|
| Confirm you are on Kaia Mainnet | eth_chainId | Expect 0x2019 (8217) |
| Read a staking contract's state | eth_call | Encode function selectors for the staking contract |
| Track reward or staking events | eth_getLogs | Bound block ranges; wide ranges are expensive |
| Check a user's KLAY balance | eth_getBalance | Returns wei; format to 18 decimals |
| Submit a stake or unstake transaction | eth_sendRawTransaction | Sign locally, then broadcast |
| Estimate gas before submitting | eth_estimateGas | Do this before every staking write |
| Confirm a transaction landed | eth_getTransactionReceipt | Poll until status is 0x1 or 0x0 |
| Read current block for reward windows | eth_blockNumber | Use as the upper bound for log queries |
A minimal reward-tracking loop in JavaScript looks like this:
import { createPublicClient, http, parseAbi } from 'viem';
const client = createPublicClient({
transport: http('https://klaytn.api.onfinality.io/public'),
});
const stakingAbi = parseAbi([
'function getReward(address account) view returns (uint256)',
]);
async function readReward(contractAddress, account) {
const latest = await client.getBlockNumber();
const reward = await client.readContract({
address: contractAddress,
abi: stakingAbi,
functionName: 'getReward',
args: [account],
});
return { reward, block: latest };
}
Replace the ABI and contract address with the actual staking contract you integrate. The point is the pattern: read state with eth_call, anchor it to a block number, and store that block number so you can reconcile later.
Choosing RPC infrastructure for a staking product
Staking apps have a read-heavy, latency-sensitive profile. Users expect reward numbers to update quickly, and they expect stake and unstake transactions to land without retries. That makes endpoint choice a product decision, not just an infrastructure detail.
When you evaluate providers for a Klaytn staking app, compare on the dimensions that actually affect staking UX:
| Evaluation area | What to look for | Why it affects staking |
|---|---|---|
| Read throughput | Ability to serve frequent eth_call and eth_getLogs | Reward dashboards poll constantly |
| Log query limits | Clear guidance on block-range caps | Wide ranges silently fail or time out |
| Write path reliability | Stable eth_sendRawTransaction behavior | Failed broadcasts strand user funds in pending state |
| Failover | Multiple endpoints or automatic routing | A single endpoint outage freezes staking UI |
| Archive access | Historical state if you reconcile old rewards | Without it, backfills are impossible |
| Support model | Who you contact when a staking tx misbehaves | Staking bugs are time-sensitive |
OnFinality provides managed Klaytn (Kaia) RPC through its API service, and teams that need isolated capacity, custom rate limits, or private networking can move to a dedicated node. For most staking dashboards, a managed endpoint with a failover plan is enough to start; dedicated infrastructure becomes worthwhile when your read volume or compliance needs outgrow shared capacity. You can compare tiers on the RPC pricing page and see the full set of supported RPC networks.
If you are still deciding between providers, the RPC provider selection guide walks through the same criteria in more depth.
Common failure modes and how to debug them
Staking integrations fail in predictable ways. Here is a symptom-to-fix table you can keep next to your logs.
| Symptom | Likely cause | Fix |
|---|---|---|
| Reward numbers jump or reset | Reading from a different block each poll | Pin reads to a block number and store it |
eth_getLogs returns nothing | Block range too wide or wrong address | Narrow the range; verify the contract address |
| Stake transaction stuck pending | Gas price too low or nonce gap | Re-estimate gas; check nonce sequence |
| Wrong chain data | Endpoint pointed at a testnet | Re-check eth_chainId returns 0x2019 |
| Intermittent timeouts | Single endpoint under load | Add a second endpoint and retry logic |
| Unstake never completes | UI ignores the unstaking delay | Model the delay explicitly in your state machine |
The nonce gap problem is the one that bites hardest. If a staking transaction fails silently and you submit another without resyncing the nonce, every subsequent transaction queues behind the stuck one. Always read eth_getTransactionCount with the pending tag before broadcasting a new staking write.
A practical integration checklist
Work through this list before you ship a staking feature:
- Confirm chain ID 8217 and the correct staking contract addresses for your target path.
- Decide how you will read rewards: contract
eth_call, event logs, or both. - Pin every read to a block number and persist it for reconciliation.
- Implement gas estimation and nonce management for stake and unstake writes.
- Model the unstaking delay in your UI and in any accounting.
- Add a second RPC endpoint and retry logic for read failures.
- Log the endpoint and block number with every staking error so you can reproduce it.
- Test the full stake, reward, and unstake cycle on a testnet before mainnet.
If your team would rather not operate nodes at all, a managed endpoint removes steps 6 and 7 from your plate because failover and endpoint health become the provider's responsibility.
Key Takeaways
- Klaytn is now branded Kaia, but staking mechanics and contract addresses still use both names.
- Staking apps are read-heavy:
eth_callandeth_getLogsdominate, not transfers. - Pin reward reads to a block number or your numbers will drift.
- Nonce and gas management are the most common sources of stuck staking transactions.
- Endpoint choice directly affects staking UX; compare read throughput, log limits, and failover.
- OnFinality offers managed Klaytn (Kaia) RPC and dedicated nodes when shared capacity is not enough.
Frequently Asked Questions
Can I run my own Klaytn validator to stake? Governance council participation is limited and not open to arbitrary operators. Most KLAY holders stake through delegation or a liquid staking service rather than running a validator directly.
How long does unstaking take on Klaytn? There is a delay between requesting an unstake and receiving funds. Check the current staking contract documentation for the exact period, and model it in your UI rather than assuming instant withdrawal.
Which RPC method do I use to read staking rewards?
Usually eth_call against the staking contract, or eth_getLogs if rewards are emitted as events. There is no single global "get staking rewards" method.
Do I need an archive node for staking? Only if you reconcile historical rewards or backfill data from old blocks. For live dashboards, a standard full node is typically sufficient.
Can I use the public OnFinality endpoint in production? Public endpoints are useful for testing and low-volume reads. For production staking apps, evaluate a managed plan or dedicated node so you have predictable capacity and failover.
What chain ID should I expect?
Kaia Mainnet returns 0x2019, which is 8217 in decimal. If you see anything else, you are on the wrong network.