BNB staking mechanics
BNB Liquid Staking lets the user stake their funds through the corresponding smart contracts on the Binance network, accumulate rewards, and receive their stake and rewards when unstaking.
The following section explains staking requirements, fees, rewards, validators, smart contracts and function calls to interact with these smart contracts.
Requirements
The requirements when staking are:
-
Minimum value to stake — 0.1 BNB.
-
Maximum value to stake — unlimited, at the user’s discretion.
The requirements when classic-unstaking are:
- Minimum value to unstake — 0.1 BNB.
- Maximum value to unstake — up to the initial stake for ankrBNB.
- Unbond time (before user gets their unstaked funds) — 7–15 days.
- Splitting large unstaked amounts between several unbond times due to limited nodes capacities.
The requirements when flash-unstaking are:
- Minimum value to unstake — 0.1 BNB.
- Maximum value to unstake — up to the flash ustake pool capacity.
- Unbond time (before user gets their unstaked funds) — no unbond time, instant release of funds to the user.
Fees
- Ankr takes a 10% technical service fee from the staking reward.
- Ankr takes a 0.05% flash-unstake fee from the unstaked amount when the user flash-unstakes.
The user must also count in the gas price for outgoing transactions.
Rewards
Validators receive rewards every day, at midnight, UTC.
The APY is calculated from the validators' rewards.
The rewards the user gets are calculated using the exchange ratio explained later in this document.
To understand BNB Liquid Staking, you need to know the entities and understand the workflow under the hood.
The following entities are involved:
- Smart contracts
- Ankr addresses
- Ankr validators
Smart contracts
Smart contracts and addresses involved in BNB Liquid Staking are:
- BNBStakingPool (opens in a new tab) — contract on BNB Chain where the user sends their initial staking or unstaking request.
- Staking (opens in a new tab) — withdraws the rewards and send them to
BNBStakingPool
. - aBNBb Proxy (opens in a new tab) — contract on BNB Chain is an intermediary in the ankrBNB staking and unstaking process.
- ankrBNB Proxy (opens in a new tab) — contract on BNB Chain that mints or burns ankrBNB tokens for the user. All interactions go through the Proxy part.
- TokenHub (opens in a new tab) — contract on BNB Chain that makes cross-chain transfers between BNB Chain and Binance Chain.
- Intermediary address (opens in a new tab) — BNB backend service on Binance Chain that:
- When staking, receives the staked funds from BinancePool to send to the validators.
- When unstaking, receives the unstaked funds to later crosschain-send it to the operator address.
- Operator address (opens in a new tab) — BNB backend service on BNB Chain that:
- When unstaking, receives the unstaked funds+rewards to send to stakers.
Validators
- Ankr validator (opens in a new tab)
- Avengers (opens in a new tab)
- BNB48 Club validator (opens in a new tab)
- CertiK (opens in a new tab)
- MathWallet (opens in a new tab)
- Tranchess (opens in a new tab)
Staking workflow
- User sends a request to the
BNBStakingPool::stakeCerts({value:stake})
on BNB Chain.stake
specifies the staked amount and should meet the requirements described above.BNBStakingPool
verifies the request checking the_minimumStake
and mints ankrBNB in the amount defined by the current exchange ratio, and then issues aStaked()
event with thestaker
,amount
(staked amount),shares
(issued ankrBNB),false
(because ankrBNB is a reward-bearing token) parameters. BNBStakingPool
accumulates minimum 100 BNB and then sends the accumulated amount viaBNBStakingPool:delegate(validator, amount)
to an address of one of the validators from the Ankr set.
Exchange ratio
When staking, the user receives:
- ankrBNB in the amount calculated the following way:
user's_stake * exchange_ratio
.
When unstaking, the user receives their_stake + accumulated_rewards
in BNB.
It is calculated by the following formula: accumulated_amount_ankrBNB / exchange ratio
.
The exchange ratio is calculated by the following formula:
uint256 totalShares = totalSharesSupply(); == ankrBNB.totalSupply();
uint256 denominator = _totalStaked + totalRewards - _totalUnbondedBonds;
_ratio = (totalShares * 1e18) / denominator;
Unstaking workflow
Classic unstake
- User sends a request to the
BNBStakingPool::unstakeCerts(shares)
on BNB Chain.shares
specifies the amount to unstake. You can also unstake to an arbitrarily chosen address viaBNBStakingPool::unstakeCertsFor(receiverAddress, shares)
.BNBStakingPool
verifies the request checking the_minimumUnstake
andbalance_of_user
, to transfer ankrBNB from user to theaBNBb
smart contract address (input amount) thenaBNBb::burn()
executes to decrease total supply of tokens, and then issues aUnstaked()
event with theownerAddress
(message sender),receiverAddress
(user address for receiving unstaked funds and rewards),amount
(amount of BNBs to be send to the user),shares
(amount of ankrBNB to unstake),false
(because ankrBNB is a reward-bearing token) parameters. - BNB backend service waits until
_pendingTotalUnstakes
reaches minimum 100 BNB atBNBStakingPool
, then callsBNBStakingPool:undelegate{value: relayerFee}(validator, amount)
. - After the
UnbondTime
,BNBStakingPool
gets the rewards viaStaking:claimUndelegated()
and distributes unstaked funds and rewards to the users.
Additional information
Additional details To get more information about staking on Binance, read Staking (opens in a new tab), Delegating (opens in a new tab), and Binance cross-chain transfer (opens in a new tab).
To get more information about unstaking on Binance, read Unbond (opens in a new tab) and Binance cross-chain transfer (opens in a new tab).