Protocol Architecture: How the Contracts Fit Together
stake.link uses the same core contracts for every liquid staking token (stLINK, stPOL, stESP). Each network has its own strategy and vault contracts that connect the core to that networkβs native staking.
Deposit flow
Section titled βDeposit flowβ User deposits LINK / POL / ESP β βΌ βββββββββββββββββββ queue, reSDL priority, liquidity buffer β PriorityPool β ββββββββββ¬βββββββββ βΌ βββββββββββββββββββ mints rebasing LST (stLINK, stPOL, stESP) 1:1 β StakingPool ββββ RebaseController triggers reward rebases ββββββββββ¬βββββββββ βΌ βββββββββββββββββββ OperatorVCS + CommunityVCS (LINK), β Strategies β PolygonStrategy (POL), EspressoStrategy (ESP) ββββββββββ¬ββββββββββββ fund flow controllers manage unbonding βΌ βββββββββββββββββββ hold the staked positions β Vaults β ββββββββββ¬βββββββββ βΌ Native staking contracts (Chainlink Staking, Polygon, Espresso)- Queue. Users deposit tokens into the PriorityPool. When the network has staking capacity, queued tokens are deposited into the StakingPool. Wallets holding reSDL are served first.
- Mint. The StakingPool mints a rebasing liquid staking token at 1:1 and deposits the tokens into one or more strategies.
- Stake. Each strategy spreads deposits across vaults, and each vault stakes in the networkβs native staking contract.
- Earn. The RebaseController triggers rebases that add rewards to every holderβs balance, minus protocol fees.
Withdrawal flow
Section titled βWithdrawal flowβWhen a user redeems an LST, the PriorityPool first swaps it for tokens waiting in the queue. Next, if instant withdrawals are enabled, it pays out tokens that are already withdrawable from the StakingPool. The rest is queued in the WithdrawalPool and paid out as new deposits arrive or as vaults finish unbonding. See How withdrawals work.
Rewards and SDL
Section titled βRewards and SDLβ- Users stake
SDL(StakingAllowance) in the SDLPool and receive reSDL NFTs. The LinearBoostController calculates the boost for locked positions. - The SDL stakersβ share of protocol fees, paid in LSTs, is distributed to reSDL holders through RewardsPool contracts. RewardsPoolWSD handles rebasing reward tokens by wrapping them.
Contracts by role
Section titled βContracts by roleβ| Role | Contracts |
|---|---|
| Core (shared by all LSTs) | StakingPool, PriorityPool, WithdrawalPool, RebaseController |
| Tokens | StakingAllowance (SDL), WrappedSDToken (wstLINK, wstPOL, wstESP) |
| SDL and rewards | SDLPool, LinearBoostController, RewardsPool, RewardsPoolWSD |
| LINK staking | OperatorVCS, OperatorVault, CommunityVCS, CommunityVault, FundFlowController, OperatorStakingPool |
| POL staking | PolygonStrategy, PolygonVault, PolygonFundFlowController |
| ESP staking | EspressoStrategy, EspressoVault, EspressoFundFlowController |
| Rewards splitting | LSTRewardsSplitterController, LSTRewardsSplitter |
LINK staking specifics
Section titled βLINK staking specificsβstake.link stakes LINK in both Chainlink staking pools:
- Node Operator Pool: OperatorVCS manages one OperatorVault per node operator. Node operators stake their own LSTs in the OperatorStakingPool, which keeps their balances separate from community stakers.
- Community Pool: CommunityVCS manages many CommunityVault contracts.
- Unbonding: the FundFlowController decides the order of vault deposits and withdrawals, and unbonds vaults periodically so LINK is always available to withdraw.
Source code and addresses
Section titled βSource code and addressesβ- Source code: github.com/stakedotlink/contracts
- Deployed addresses: Smart contract addresses
- Audits: Security and audits
- On-chain data: Subgraph (GraphQL API)