Skip to main content

StakingRewards

StakingRewards

Deployment on Ethereum mainnet:

https://etherscan.io/address/0xFD6FF39DA508d281C2d255e9bBBfAb34B6be60c3

LockupPeriod

enum LockupPeriod {
SixMonths,
TwelveMonths,
TwentyFourMonths
}

MULTIPLIER_DECIMALS

uint256 MULTIPLIER_DECIMALS

USDC_MANTISSA

uint256 USDC_MANTISSA

OWNER_ROLE

bytes32 OWNER_ROLE

config

contract GoldfinchConfig config

lastUpdateTime

uint256 lastUpdateTime

The block timestamp when rewards were last checkpointed

accumulatedRewardsPerToken

uint256 accumulatedRewardsPerToken

Accumulated rewards per token at the last checkpoint

rewardsAvailable

uint256 rewardsAvailable

Total rewards available for disbursement at the last checkpoint, denominated in rewardsToken()

positionToAccumulatedRewardsPerToken

mapping(uint256 => uint256) positionToAccumulatedRewardsPerToken

StakedPosition tokenId => accumulatedRewardsPerToken at the position's last checkpoint

targetCapacity

uint256 targetCapacity

Desired supply of staked tokens. The reward rate adjusts in a range around this value to incentivize staking or unstaking to maintain it.

minRate

uint256 minRate

The minimum total disbursed rewards per second, denominated in rewardsToken()

maxRate

uint256 maxRate

The maximum total disbursed rewards per second, denominated in rewardsToken()

maxRateAtPercent

uint256 maxRateAtPercent

The percent of targetCapacity at which the reward rate reaches maxRate. Represented with MULTIPLIER_DECIMALS.

minRateAtPercent

uint256 minRateAtPercent

The percent of targetCapacity at which the reward rate reaches minRate. Represented with MULTIPLIER_DECIMALS.

vestingLength

uint256 vestingLength

The duration in seconds over which legacy rewards vest. New positions have no vesting and earn rewards immediately.

UNUSED (definition kept for storage slot)

totalStakedSupply

uint256 totalStakedSupply

Supply of staked tokens, denominated in stakingToken().decimals() Note that due to the use of unsafeBaseTokenExchangeRate and unsafeEffectiveMultiplier on a StakedPosition, the sum of amount across all staked positions will not necessarily equal this totalStakedSupply value; the purpose of the base token exchange rate and the effective multiplier is to enable calculation of an "effective amount" -- which is what this totalStakedSupply represents the sum of.

totalLeveragedStakedSupply

uint256 totalLeveragedStakedSupply

UNUSED (definition kept for storage slot)

leverageMultipliers

mapping(enum StakingRewards.LockupPeriod => uint256) leverageMultipliers

UNUSED (definition kept for storage slot)

positions

mapping(uint256 => struct StakedPosition) positions

NFT tokenId => staked position

effectiveMultipliers

mapping(enum StakedPositionType => uint256) effectiveMultipliers

A mapping of staked position types to multipliers used to denominate positions in baseStakingToken(). Represented with MULTIPLIER_DECIMALS.

initialize

function __initialize__(address owner, contract GoldfinchConfig _config) external

getPosition

function getPosition(uint256 tokenId) external view returns (struct StakedPosition position)

Get the staking rewards position

Parameters

NameTypeDescription
tokenIduint256id of the position token

Return Values

NameTypeDescription
positionstruct StakedPositionthe position

stakedBalanceOf

function stakedBalanceOf(uint256 tokenId) external view returns (uint256)

Returns the staked balance of a given position token.

The value returned is the bare amount, not the effective amount. The bare amount represents the number of tokens the user has staked for a given position. The effective amount is the bare amount multiplied by the token's underlying asset type multiplier. This multiplier is a crypto- economic parameter determined by governance.

Parameters

NameTypeDescription
tokenIduint256A staking position token ID

Return Values

NameTypeDescription
[0]uint256Amount of staked tokens denominated in stakingToken().decimals()

rewardsToken

function rewardsToken() internal view returns (contract IERC20withDec)

The address of the token being disbursed as rewards

stakingToken

function stakingToken(enum StakedPositionType positionType) internal view returns (contract IERC20)

The address of the token that is staked for a given position type

_additionalRewardsPerTokenSinceLastUpdate

function _additionalRewardsPerTokenSinceLastUpdate(uint256 time) internal view returns (uint256)

The additional rewards earned per token, between the provided time and the last time rewards were checkpointed, given the prevailing rewardRate(). This amount is limited by the amount of rewards that are available for distribution; if there aren't enough rewards in the balance of this contract, then we shouldn't be giving them out.

Return Values

NameTypeDescription
[0]uint256Amount of rewards denominated in rewardsToken().decimals().

rewardPerToken

function rewardPerToken() public view returns (uint256)

Returns accumulated rewards per token up to the current block timestamp

Return Values

NameTypeDescription
[0]uint256Amount of rewards denominated in rewardsToken().decimals()

earnedSinceLastCheckpoint

function earnedSinceLastCheckpoint(uint256 tokenId) public view returns (uint256)

Returns rewards earned by a given position token from its last checkpoint up to the current block timestamp.

Parameters

NameTypeDescription
tokenIduint256A staking position token ID

Return Values

NameTypeDescription
[0]uint256Amount of rewards denominated in rewardsToken().decimals()

totalOptimisticClaimable

function totalOptimisticClaimable(address owner) external view returns (uint256)

optimisticClaimable

function optimisticClaimable(uint256 tokenId) public view returns (uint256)

claimableRewards

function claimableRewards(uint256 tokenId) public view returns (uint256 rewards)

Returns the rewards claimable by a given position token at the most recent checkpoint, taking into account vesting schedule for legacy positions.

Return Values

NameTypeDescription
rewardsuint256Amount of rewards denominated in rewardsToken()

totalVestedAt

function totalVestedAt(uint256 start, uint256 end, uint256 time, uint256 grantedAmount) external pure returns (uint256 rewards)

Returns the rewards that will have vested for some position with the given params.

Return Values

NameTypeDescription
rewardsuint256Amount of rewards denominated in rewardsToken()

rewardRate

function rewardRate() internal view returns (uint256)

Number of rewards, in rewardsToken().decimals(), to disburse each second

_positionToEffectiveAmount

function _positionToEffectiveAmount(struct StakedPosition position) internal view returns (uint256)

toEffectiveAmount

function toEffectiveAmount(uint256 amount, uint256 safeBaseTokenExchangeRate, uint256 safeEffectiveMultiplier) internal pure returns (uint256)

Calculates the effective amount given the amount, (safe) base token exchange rate, and (safe) effective multiplier for a position

Do NOT pass in the unsafeBaseTokenExchangeRate or unsafeEffectiveMultiplier in storage. Convert it to safe values using safeBaseTokenExchangeRate() and safeEffectiveMultiplier()

Parameters

NameTypeDescription
amountuint256The amount of staked tokens
safeBaseTokenExchangeRateuint256The (safe) base token exchange rate. See @dev comment below.
safeEffectiveMultiplieruint256The (safe) effective multiplier. See @dev comment below.

stakingAndRewardsTokenMantissa

function stakingAndRewardsTokenMantissa() internal pure returns (uint256)

We overload the responsibility of this function -- i.e. returning a value that can be used for both the stakingToken() mantissa and the rewardsToken() mantissa --, rather than have multiple distinct functions for that purpose, in order to reduce contract size. We rely on a unit test to ensure that the tokens' mantissas are indeed 1e18 and therefore that this approach works.

currentEarnRatePerToken

function currentEarnRatePerToken() public view returns (uint256)

The amount of rewards currently being earned per token per second. This amount takes into account how many rewards are actually available for disbursal -- unlike rewardRate() which does not. This function is intended for public consumption, to know the rate at which rewards are being earned, and not as an input to the mutative calculations in this contract.

Return Values

NameTypeDescription
[0]uint256Amount of rewards denominated in rewardsToken().decimals().

positionCurrentEarnRate

function positionCurrentEarnRate(uint256 tokenId) external view returns (uint256)

The amount of rewards currently being earned per second, for a given position. This function is intended for public consumption, to know the rate at which rewards are being earned for a given position, and not as an input to the mutative calculations in this contract.

Return Values

NameTypeDescription
[0]uint256Amount of rewards denominated in rewardsToken().decimals().

setBaseURI

function setBaseURI(string baseURI_) external

stake

function stake(uint256 amount, enum StakedPositionType positionType) external returns (uint256)

Stake stakingToken() to earn rewards. When you call this function, you'll receive an an NFT representing your staked position. You can present your NFT to getReward or unstake to claim rewards or unstake your tokens respectively.

This function checkpoints rewards.

Parameters

NameTypeDescription
amountuint256The amount of stakingToken() to stake
positionTypeenum StakedPositionTypeThe type of the staked position

Return Values

NameTypeDescription
[0]uint256Id of the NFT representing the staked position

depositAndStake

function depositAndStake(uint256 usdcAmount) public returns (uint256)

Deposit to SeniorPool and stake your shares in the same transaction.

Parameters

NameTypeDescription
usdcAmountuint256The amount of USDC to deposit into the senior pool. All shares from deposit will be staked.

depositWithPermitAndStake

function depositWithPermitAndStake(uint256 usdcAmount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external returns (uint256)

Identical to depositAndStake, except it allows for a signature to be passed that permits this contract to move funds on behalf of the user.

Parameters

NameTypeDescription
usdcAmountuint256The amount of USDC to deposit
deadlineuint256
vuint8secp256k1 signature component
rbytes32secp256k1 signature component
sbytes32secp256k1 signature component

depositToCurve

function depositToCurve(uint256 fiduAmount, uint256 usdcAmount) external

Deposits FIDU and USDC to Curve on behalf of the user. The Curve LP tokens will be minted directly to the user's address

Parameters

NameTypeDescription
fiduAmountuint256The amount of FIDU to deposit
usdcAmountuint256The amount of USDC to deposit

depositToCurveAndStake

function depositToCurveAndStake(uint256 fiduAmount, uint256 usdcAmount) external

depositToCurveAndStakeFrom

function depositToCurveAndStakeFrom(address nftRecipient, uint256 fiduAmount, uint256 usdcAmount) public

Deposit to FIDU and USDC into the Curve LP, and stake your Curve LP tokens in the same transaction.

Parameters

NameTypeDescription
nftRecipientaddress
fiduAmountuint256The amount of FIDU to deposit
usdcAmountuint256The amount of USDC to deposit

_depositToCurve

function _depositToCurve(address depositor, address lpTokensRecipient, uint256 fiduAmount, uint256 usdcAmount) internal returns (uint256)

Deposit to FIDU and USDC into the Curve LP. Returns the amount of Curve LP tokens minted, which is denominated in 1e18.

Parameters

NameTypeDescription
depositoraddressThe address of the depositor (i.e. the current owner of the FIDU and USDC to deposit)
lpTokensRecipientaddressThe receipient of the resulting LP tokens
fiduAmountuint256The amount of FIDU to deposit
usdcAmountuint256The amount of USDC to deposit

safeEffectiveMultiplier

function safeEffectiveMultiplier(struct StakedPosition position) internal view returns (uint256)

Returns the effective multiplier for a given position. Defaults to 1 for all staked positions created prior to GIP-1 (before the unsafeEffectiveMultiplier field was added).

Always use this method to get the effective multiplier to ensure proper handling of old staked positions.

safeBaseTokenExchangeRate

function safeBaseTokenExchangeRate(struct StakedPosition position) internal view returns (uint256)

Returns the base token exchange rate for a given position. Defaults to 1 for all staked positions created prior to GIP-1 (before the unsafeBaseTokenExchangeRate field was added).

Always use this method to get the base token exchange rate to ensure proper handling of old staked positions.

getEffectiveMultiplierForPositionType

function getEffectiveMultiplierForPositionType(enum StakedPositionType positionType) public view returns (uint256)

The effective multiplier to use with new staked positions of the provided positionType, for denominating them in terms of baseStakingToken(). This value is denominated in MULTIPLIER_DECIMALS.

getBaseTokenExchangeRate

function getBaseTokenExchangeRate(enum StakedPositionType positionType) public view virtual returns (uint256)

Calculate the exchange rate that will be used to convert the original staked token amount to the baseStakingToken() amount. The exchange rate is denominated in MULTIPLIER_DECIMALS.

Parameters

NameTypeDescription
positionTypeenum StakedPositionTypeType of the staked postion

_stake

function _stake(address staker, address nftRecipient, uint256 amount, enum StakedPositionType positionType) internal returns (uint256 tokenId)

unstake

function unstake(uint256 tokenId, uint256 amount) public

Unstake an amount of stakingToken() (FIDU, FiduUSDCCurveLP, etc) associated with a given position and transfer to msg.sender. Any remaining staked amount will continue to accrue rewards.

This function checkpoints rewards

Parameters

NameTypeDescription
tokenIduint256A staking position token ID
amountuint256Amount of stakingToken() to be unstaked from the position

unstakeMultiple

function unstakeMultiple(uint256[] tokenIds, uint256[] amounts) external

Unstake multiple positions and transfer to msg.sender.

This function checkpoints rewards

Parameters

NameTypeDescription
tokenIdsuint256[]A list of position token IDs
amountsuint256[]A list of amounts of stakingToken() to be unstaked from the position

_unstake

function _unstake(uint256 tokenId, uint256 amount) internal

Unstake an amount from a single position

This function does NOT checkpoint rewards; the caller of this function is responsible for ensuring that rewards are properly checkpointed before invocation. This function does NOT transfer staked tokens back to the user; the caller of this function is responsible for ensuring that tokens are transferred back to the owner if necessary.

Parameters

NameTypeDescription
tokenIduint256The token ID
amountuint256The amount of of stakingToken() to be unstaked from the position

kick

function kick(uint256 tokenId) external

"Kick" a user's reward multiplier. If they are past their lock-up period, their reward multiplier will be reset to 1x.

This will also checkpoint their rewards up to the current time.

updatePositionEffectiveMultiplier

function updatePositionEffectiveMultiplier(uint256 tokenId) external

Updates a user's effective multiplier to the prevailing multiplier. This function gives users an option to get on a higher multiplier without needing to unstake.

This will also checkpoint their rewards up to the current time.

getReward

function getReward(uint256 tokenId) external returns (uint256)

Claim rewards for a given staked position

Parameters

NameTypeDescription
tokenIduint256A staking position token ID

Return Values

NameTypeDescription
[0]uint256amount of rewards claimed

addToStake

function addToStake(uint256 tokenId, uint256 amount) external

Add amount to an existing FIDU position (tokenId)

Parameters

NameTypeDescription
tokenIduint256A staking position token ID
amountuint256Amount of stakingToken() to be added to tokenId's position

loadRewards

function loadRewards(uint256 rewards) external

Transfer rewards from msg.sender, to be used for reward distribution

removeRewards

function removeRewards(uint256 amount) external

Transfer rewards from staking rewards, to the caller

setRewardsParameters

function setRewardsParameters(uint256 _targetCapacity, uint256 _minRate, uint256 _maxRate, uint256 _minRateAtPercent, uint256 _maxRateAtPercent) external

setEffectiveMultiplier

function setEffectiveMultiplier(uint256 multiplier, enum StakedPositionType positionType) external

Set the effective multiplier for a given staked position type. The effective multipler is used to denominate a staked position to baseStakingToken(). The multiplier is represented in MULTIPLIER_DECIMALS

Parameters

NameTypeDescription
multiplieruint256the new multiplier, denominated in MULTIPLIER_DECIMALS
positionTypeenum StakedPositionTypethe type of the position

updateReward

modifier updateReward(uint256 tokenId)

_updateReward

function _updateReward(uint256 tokenId) internal

isAdmin

function isAdmin() internal view returns (bool)

onlyAdmin

modifier onlyAdmin()

isGoListed

function isGoListed() internal view returns (bool)

canWithdraw

function canWithdraw(uint256 tokenId) internal view returns (bool)