The PriorityPool allows users to queue asset tokens which are eventually deposited into a StakingPool when deposit room becomes available. The liquid staking tokens (LSTs) minted by the StakingPool are then distributed using a merkle tree.
Each user will continuously receive LSTs as more depositd are made into the StakingPool until they have received an amount equal to the amount of asset tokens they deposited into the PriorityPool. The rate at which each user receives LSTs is dependent on the user's reSDL balance in the SDLPool. A higher reSDL balance entitles the user to receive LSTs at a faster rate than a user with a smaller reSDL balance. Users that hold no reSDL can also deposit into the PriorityPool but they will receive no LSTs as long as there are users with deposits in the PriorityPool that also hold reSDL.
The secondary function of the PriorityPool is to act as a liquidity buffer for the StakingPool it deposits into. When a user redeems LSTs for the underlying asset token, these LSTs will be swapped with queued asset tokens from the PriorityPool if possible before queuing tokens in the WithdrawalPool. This both reduces gas costs for the user and ensures that the StakingPool earns the most yield possible as yield earning asset tokens remain in the pool instead of being withdrawn.
View Functions
token
Returns the address of the token this pool handles
functiontoken() externalviewreturns (address)
Return Values
Name
Type
Description
token
address
address of token
stakingPool
Returns the address of the staking pool that this pool deposits into
Returns the merkle root for the latest distribution tree
Return Values
Name
Type
Description
merkleRoot
bytes32
current merkle root
ipfsHash
Returns the ipfs hash of the balance data for the latest distribution tree
Return Values
Name
Type
Description
ipfsHash
bytes32
current ipfsHash
merkleTreeSize
Returns the number of unique addresses contained in the latest distribution tree
Return Values
Name
Type
Description
merkleTreeSize
uint256
current merkle tree size
totalQueued
Returns the total amount of token deposits in the pool waiting to be deposited into the staking pool
Return Values
Name
Type
Description
totalQueued
uint256
total deposits in the pool
getAccounts
Returns a list of all accounts that have deposited into the pool in the order that they appear in the distribution tree
Return Values
Name
Type
Description
accounts
address[]
list of accounts
getAccountIndex
Returns the index of an account representing it's position in the distribution tree
Parameters
Name
Type
Description
_account
address
account address
Return Values
Name
Type
Description
index
uint256
account index
getQueuedTokens
Returns an account's current amount of deposits in the pool (_distributionAmount is stored on IPFS)
Parameters
Name
Type
Description
_account
address
account address
_distributionAmount
uint256
account's distribution amount from the latest distribution tree
Return Values
Name
Type
Description
queuedTokens
uint256
amount of queued tokens for account
getLSDTokens
Returns an account's current amount of withdrawable liquid staking tokens (_distributionShareAmount is stored on IPFS)
Parameters
Name
Type
Description
_account
address
account address
_distributionShareAmount
uint256
account's distribution share amounts from the latest distribution tree
Return Values
Name
Type
Description
lsdTokens
uint256
withdrawable LSD tokens for account
getLSDTokensBatch
Returns the current amount of withdrawable LSD tokens for multiple accounts.
Parameters
Name
Type
Description
_accounts
address[]
List of account addresses
_distributionShareAmounts
uint256[]
Distribution share amounts for each account
Return Values
Name
Type
Description
lsdTokens
uint256[]
Withdrawable LSD tokens for accounts
canWithdraw
Returns the total amount of asset tokens that an account can withdraw (includes account's queued tokens and stLINK balance and takes into account both priority pool and staking pool liquidity)
Parameters
Name
Type
Description
_account
address
account address
_distributionAmount
uint256
account's distribution amount from the latest distribution tree
Return Values
Name
Type
Description
canWithdraw
uint256
amount of withrawable tokens
checkUpkeep
Returns whether a call should be made to performUpkeep to deposit queued/unused tokens
into staking pool strategies
Return Values
Name
Type
Description
upkeepNeeded
bool
whether a call should be made to performUpkeep
upkeepNeeded
bytes
encoded amount of tokens to be deposited
getDepositsSinceLastUpdate
Returns the amount of new deposits into the staking pool since the last call to updateDistribution and the amount of shares received for those deposits
Return Values
Name
Type
Description
deposits
uint256
amount of deposits
shares
uint256
amount of shares
getAccountData
Returns account data used for calculating a new merkle tree
A new merkle tree is calculated based on users' reSDL balance and the number of tokens they have queuedAccounts are returned in the same order as they are in the merkle tree
Return Values
Name
Type
Description
accounts
address[]
list of all accounts that have ever queued tokens
sdlBalances
uint256[]
list of SDL balances for each account
queuedBalances
uint256[]
list of queued token amounts for each account (ignores distributed LSD tokens)
Write Functions
onTokenTransfer
ERC677 implementation to receive a token deposit or withdrawal
Can receive both asset tokens (deposit) and liquid staking tokens (withdrawal)
Parameters
Name
Type
Description
_sender
address
sender of the transfer
_value
uint256
value of the transfer
_calldata
bytes
encoded shouldQueue (bool) and deposit data to pass to staking pool strategies (bytes[])
deposit
Deposits asset tokens into the staking pool and/or queues them
Parameters
Name
Type
Description
_amount
uint256
amount to deposit
_shouldQueue
bool
whether tokens should be queued if there's no room in the staking pool
_data
bytes
deposit data passed to staking pool strategies
withdraw
Withdraws asset tokens
Will unqueue sender's asset tokens before swapping liquid staking tokens if there is sufficient liquidity and _shouldUnqueue is set to true
Parameters
Name
Type
Description
_amountToWithdraw
uint256
amount of tokens to withdraw
_amount
uint256
amount as recorded in sender's merkle tree (stored on IPFS)entry
_sharesAmount
uint256
shares amount as recorded in sender's merkle tree (stored on IPFS)entry
_merkleProof
bytes32[]
merkle proof for sender's merkle tree entry (generated from IPFS data)
_shouldUnqueue
bool
whether tokens should be unqueued before taking LSD tokens
_shouldQueueWithdrawal
bool
whether a withdrawal should be queued if the full withdrawal amountcannot be satisfied
unqueueTokens
Withdraws queued deposits from the priority pool
Parameters
Name
Type
Description
_amountToUnqueue
uint256
amount of tokens to unqueue
_amount
uint256
amount as recorded in sender's merkle tree entry (stored on IPFS)
_sharesAmount
uint256
shares amount as recorded in sender's merkle tree entry (stored on IPFS)
_merkleProof
bytes32[]
merkle proof for sender's merkle tree entry (generated from IPFS data)
claimLSDTokens
Claims withdrawable liquid staking tokens
Parameters
Name
Type
Description
_amount
uint256
amount as recorded in sender's merkle tree entry
_sharesAmount
uint256
shares amount as recorded in sender's merkle tree entry
_merkleProof
bytes32[]
merkle proof for sender's merkle tree entry
depositQueuedTokens
Deposits queued tokens and/or unused tokens sitting in staking pool
Parameters
Name
Type
Description
_queueDepositMin
uint256
min amount of tokens required for deposit into staking pool strategies
_queueDepositMax
uint256
max amount of tokens that can be deposited into staking pool strategies at once
_data
bytes[]
list of deposit data passed to staking pool strategies
performUpkeep
Deposits queued and/or unused tokens
Parameters
Name
Type
Description
_performData
bytes[]
encoded list of deposit data to be passed to staking pool strategies (bytes[])
updateDistribution
Distributes a new batch of liquid staking tokens to users that have queued deposits
Parameters
Name
Type
Description
_merkleRoot
bytes32
new merkle root for the distribution tree
_ipfsHash
bytes32
new ipfs hash for the distribution tree (CIDv0, no prefix - only hash)
_amountDistributed
uint256
amount of LSD tokens distributed in this distribution
_sharesAmountDistributed
uint256
amount of LSD shares distributed in this distribution
executeQueuedWithdrawals
Executes a batch of withdrawals that have been queued in the withdrawal pool
Withdraws tokens from the staking pool and sends them to the withdrawal pool
Parameters
Name
Type
Description
_amount
uint256
total amount to withdraw
_data
bytes
list of withdrawal data passed to staking pool strategies
pauseForUpdate
Pauses queueing and unqueueing so a new merkle tree can be generated
setPoolStatus
Sets the pool's status
Parameters
Name
Type
Description
_status
PoolStatus
pool status
setQueueDepositParams
Sets the minimum and maximum amount that can be deposited into strategies at once
Parameters
Name
Type
Description
_queueDepositMin
uint128
minimum amount of tokens required for deposit into staking pool strategies
_queueDepositMax
uint128
maximum amount of tokens that can be deposited into staking pool strategies at once
setDistributionOracle
Sets the distribution oracle
Parameters
Name
Type
Description
_distributionOracle
address
address of oracle
setRebaseController
Sets the rebase controller
This address has authorization to close the pool in case of emergency