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
_underlyingToken
IERC20
The underlying token to stake
_safetyModule
ISafetyModule
The SafetyModule contract to use for reward management
_cooldownSeconds
uint256
The number of seconds that users must wait between calling cooldown
and redeem
_unstakeWindow
uint256
The number of seconds available to redeem once the cooldown period is fullfilled
_maxStakeAmount
uint256
The maximum amount of staked tokens allowed per user
_name
string
The name of the token
_symbol
string
The symbol of the token
getUnderlyingToken
Returns the underlying ERC20 token
Returns
<none>
IERC20
Underlying ERC20 token
getCooldownSeconds
Returns the length of the cooldown period
Returns
<none>
uint256
Number of seconds in the cooldown period
getUnstakeWindowSeconds
Returns the length of the unstake window
Returns
<none>
uint256
Number of seconds in the unstake window
getCooldownStartTime
Returns the start time of the latest cooldown period for a given user
Parameters
user
address
Address of the user
Returns
<none>
uint256
Timestamp when the user's latest cooldown period started
previewStake
Returns the amount of staked tokens one would receive for staking an amount of underlying tokens
Parameters
amountToStake
uint256
Amount of underlying tokens to stake
Returns
<none>
uint256
Amount of staked tokens that would be received at the current exchange rate
previewRedeem
Returns the amount of underlying tokens one would receive for redeeming an amount of staked tokens
Parameters
amountToRedeem
uint256
Amount of staked tokens to redeem
Returns
<none>
uint256
Amount of underlying tokens that would be received at the current exchange rate
stake
Stakes tokens from the sender and starts earning rewards
Parameters
amount
uint256
Amount of underlying tokens to stake
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
onBehalfOf
address
Address to stake on behalf of
amount
uint256
Amount of underlying tokens to stake
redeem
Redeems staked tokens, and stop earning rewards
Parameters
amount
uint256
Amount of staked tokens to redeem for underlying tokens
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
to
address
Address to redeem to
amount
uint256
Amount of staked tokens to redeem for underlying tokens
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
fromCooldownTimestamp
uint256
Cooldown timestamp of the sender
amountToReceive
uint256
Amount of staked tokens to receive
toAddress
address
Address of the recipient
toBalance
uint256
Current balance of the receiver
Returns
<none>
uint256
The new cooldown timestamp
paused
Indicates whether staking and transferring are currently paused
Contract is paused if either this contract or the SafetyModule has been paused
Returns
<none>
bool
True if paused, false otherwise
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
destination
address
Address to send the slashed underlying tokens to
amount
uint256
Amount of staked tokens to slash
Returns
<none>
uint256
Amount of underlying tokens slashed
returnFunds
Transfers underlying tokens from the given address to this contract and increases the exchange rate accordingly
Only callable by the SafetyModule contract
Parameters
from
address
Address to transfer tokens from
amount
uint256
Amount of underlying tokens to transfer
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
_newRewardDistributor
ISMRewardDistributor
Address of the new SMRewardDistributor contract
setSafetyModule
Changes the SafetyModule contract used for reward management
Only callable by governance
Parameters
_newSafetyModule
address
Address of the new SafetyModule contract
setMaxStakeAmount
Sets the max amount of staked tokens allowed per user
Only callable by governance
Parameters
_newMaxStakeAmount
uint256
New max amount of staked tokens allowed per user
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
from
address
Address to transfer from
to
address
Address to transfer to
amount
uint256
Amount to transfer
_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
from
address
Address to transfer underlying tokens from
to
address
Address to mint staked tokens to
amount
uint256
Amount of underlying tokens to stake
_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
from
address
Address to burn staked tokens from
to
address
Address to transfer underlying tokens to
amount
uint256
Amount of staked tokens to redeem
Last updated