Skip to content

Manage Stakes with BNB Staking dApp

Leverage the BNB staking dApp for streamlined management of your stakes. This guide provides a step-by-step walkthrough for using the dApp on both BSC testnet and mainnet.

Connect Wallet

To interact with the dApp, first connect your web3 wallet. Currently, TrustWallet (mainnet only) and MetaMask are supported, along with any wallets compatible with WalletConnect.

Delegate Stakes

  1. Select a validator to delegate your stakes to. Detailed information about each validator is available on their respective pages.
  2. Click the Delegate button to initiate a new delegation.

  3. Enter the amount of BNB you wish to delegate.

  4. After confirming the delegation, your connected wallet will prompt you to sign the transaction. Successful transactions will be visible in the My Staking page, complete with transaction hash.

Redelegate Stakes

On the My Staking page, you can manage your existing delegations.

Note: A redelegation fee of 0.002% applies to discourage frequent switching between validators.

  1. Click Redelegate to shift your stake to a different validator.

  2. In the ensuing popup, select your new validator and specify the amount to redelegate. You can opt to move the entire amount or just a portion.

Undelegate Stakes

To claim your stakes and rewards, you need to undelegate.

  1. Click the Undelegate button next to the relevant delegation.

  2. You can choose to undelegate the entire amount or a portion. Note that undelegated stakes are subject to a 7-day unbonding period before they are returned to your account.

Claim Stakes

After the unbonding period, you can claim your stakes by clicking the Claim button.

FAQs

Q1: Which wallet can be used to delegate to validators?

Currently, MetaMask and TrustWallet are supported, along with any wallets compatible with WalletConnect.

Q2: Can I delegate/undelegate/redelegate/claim stakes on explorers?

If you want to do the aforementioned delegate/undelegate/redelegate/claim operations on BscScan or BscTrace, you should call the staking hub contract in the following URLs: * BscScan Stake Hub * BscTrace Stake Hub

Q3: What is staking credit (stBNB)?

When you delegate BNB to a validator, you receive staking credit tokens as proof of your stake. Each validator issues its own unique credit token:

Token Naming: - Name: Stake{{validator moniker}}Credit - Symbol: st{{validator moniker}} - Example: Staking with “BNB48Club” → receive “stBNB48Club”

Key Properties:

  • ✅ Represents your staked BNB + accumulated rewards
  • ✅ Auto-compounding: value increases as validators earn rewards
  • ✅ Rewards automatically distributed when you undelegate
  • ❌ Non-transferable between addresses and each validator’s credit is unique

Q4: How to calculate my staking balance?

Your staking credit value in BNB can be calculated using:

Your BNB Value = (stCreditAmount × totalPooledBNB) ÷ totalSupply()

Where:

  • stCreditAmount: Your staking credit balance
  • totalPooledBNB: Total BNB in validator’s pool (stakes + rewards)
  • totalSupply(): Total supply of the validator’s staking credit

Example:

Time totalPooledBNB totalSupply Your stCredit Your Value Profit
Day 1 10,000 BNB 10,000 100 100 BNB -
Day 30 11,000 BNB 10,000 100 110 BNB +10 BNB (10%)

Your staking credit automatically appreciates as the validator earns block rewards!

Q5: How to query total pooled BNB programmatically?

Use this JavaScript example to query a validator’s total pooled BNB:

import { ethers } from 'ethers';

const provider = new ethers.JsonRpcProvider('https://bsc-dataseed.binance.org');
const OPERATOR = '0x...'; // validator operator address

const hub = new ethers.Contract('0x0000000000000000000000000000000000002002',
  ['function getValidatorCreditContract(address) view returns (address)'], provider);

const creditAddr = await hub.getValidatorCreditContract(OPERATOR);
const credit = new ethers.Contract(creditAddr,
  ['function getPooledBNB(address) view returns (uint256)'], provider);

const bnb = await credit.getPooledBNB(OPERATOR);
console.log('Pooled BNB:', ethers.formatEther(bnb));