StakedToken
Inherits: IStakedToken, ERC20Permit, IncreAccessControl, Pausable
Author: webthethird
Based on Aave's StakedToken, but with reward management outsourced to the SafetyModule
State Variables
_UNDERLYING_TOKEN
Address of the underlying token to stake
_COOLDOWN_SECONDS
Seconds that user must wait between calling cooldown and redeem
_UNSTAKE_WINDOW
Seconds available to redeem once the cooldown period is fullfilled
safetyModule
Address of the SafetyModule contract
smRewardDistributor
Address of the SafetyModule's SMRewardDistributor contract
isInPostSlashingState
Whether the StakedToken is in a post-slashing state
Post-slashing state disables staking and further slashing, and allows users to redeem their staked tokens without waiting for the cooldown period
maxStakeAmount
Max amount of staked tokens allowed per user
exchangeRate
Exchange rate between the underlying token and the staked token, normalized to 1e18
Rate is the amount of underlying tokens held in this contract per staked token issued, so it should be 1e18 in normal conditions, when all staked tokens are backed 1:1 by underlying tokens, but it can be lower if users' stakes have been slashed for an auction by the SafetyModule
_underlyingBalance
Internal accounting of total underlying token balance
_stakersCooldowns
Timestamp of the start of the current cooldown period for each user
Functions
onlySafetyModule
Modifier for functions that can only be called by the SafetyModule contract
constructor
StakedToken constructor
Parameters
getUnderlyingToken
Returns the underlying ERC20 token
Returns
getCooldownSeconds
Returns the length of the cooldown period
Returns
getUnstakeWindowSeconds
Returns the length of the unstake window
Returns
getCooldownStartTime
Returns the start time of the latest cooldown period for a given user
Parameters
Returns
previewStake
Returns the amount of staked tokens one would receive for staking an amount of underlying tokens
Parameters
Returns
previewRedeem
Returns the amount of underlying tokens one would receive for redeeming an amount of staked tokens
Parameters
Returns
stake
Stakes tokens from the sender and starts earning rewards
Parameters
stakeOnBehalfOf
Stakes tokens on behalf of the given address, and starts earning rewards
Tokens are transferred from the transaction sender, not from the onBehalfOf
address
Parameters
redeem
Redeems staked tokens, and stop earning rewards
Parameters
redeemTo
Redeems staked tokens, and stop earning rewards
Staked tokens are redeemed from the sender, and underlying tokens are sent to the to
address
Parameters
cooldown
Activates the cooldown period to unstake
Can't be called if the user is not staking
getNextCooldownTimestamp
Calculates a new cooldown timestamp
Calculation depends on the sender/receiver situation, as follows:
If the timestamp of the sender is "better" or the timestamp of the recipient is 0, we take the one of the recipient
Weighted average of from/to cooldown timestamps if:
The sender doesn't have the cooldown activated (timestamp 0).
The sender timestamp is expired
The sender has a "worse" timestamp
If the receiver's cooldown timestamp expired (too old), the next is 0*
Parameters
Returns
paused
Indicates whether staking and transferring are currently paused
Contract is paused if either this contract or the SafetyModule has been paused
Returns
slash
Sends underlying tokens to the given address, lowers the exchange rate accordingly, and changes the contract's state to POST_SLASHING
, which disables staking, cooldown period and further slashing until the state is returned to RUNNING
Parameters
Returns
returnFunds
Transfers underlying tokens from the given address to this contract and increases the exchange rate accordingly
Only callable by the SafetyModule contract
Parameters
settleSlashing
Sets isInPostSlashingState
to false, which re-enables staking, slashing and cooldown period
Only callable by the SafetyModule contract
setRewardDistributor
Updates the stored SMRewardDistributor contract
Only callable by the SafetyModule contract in SafetyModule.setRewardDistributor
Parameters
setSafetyModule
Changes the SafetyModule contract used for reward management
Only callable by governance
Parameters
setMaxStakeAmount
Sets the max amount of staked tokens allowed per user
Only callable by governance
Parameters
pause
Pauses staking and transferring of staked tokens
Only callable by governance
unpause
Unpauses staking and transferring of staked tokens
Only callable by governance
_updateExchangeRate
Updates the exchange rate of the staked token,
Based on this contract's current underlying token balance and the total supply of the staked token
_transfer
Internal ERC20 _transfer
of the tokenized staked tokens
Updates the cooldown timestamps if necessary, and updates the staking positions of both users in the SafetyModule, accruing rewards in the process
Parameters
_stake
Internal staking function, accrues rewards after updating user's position
Transfers underlying tokens from the from
address and mints staked tokens to the to
address
Reverts if any of the following conditions are met:
The contract is paused
The amount to stake is zero
The current exchange rate is zero (i.e., all underlying tokens have been slashed)
The contract is in a post-slashing state
The user's stake balance would exceed the max stake amount
The user's underlying token balance is insufficient
The user has not approved this contract to transfer the amount of underlying tokens
Parameters
_redeem
Internal redeeming function, accrues rewards after updating user's position
Burns staked tokens from the from
address and transfers underlying tokens to the to
address
Reverts if any of the following conditions are met:
The user's staked token balance is zero
The amount to redeem is zero
The current exchange rate is zero (i.e., all underlying tokens have been slashed)
The user's cooldown period is not over
The unstake window has passed*
Parameters
Last updated