质押合约

允许质押 Uniswap 交易对流动性池代币以换取 FXS 奖励。

⚠️ 本页面仅适用于非常早期的流动性挖矿池,尽管许多新农场共享功能和名称 ⚠️

基于 Synthetix 的质押合约:

https://docs.synthetix.io/incentives/

描述

Frax 用户能够在选定的 Uniswap 流动性池代币中质押,以换取 FXS 奖励。未来的池和激励措施可以由治理添加。

部署

流动性池代币(LP)

Uniswap FRAX/WETH LP: 0xFD0A40Bc83C5faE4203DEc7e5929B446b07d1C76

Uniswap FRAX/USDC LP: 0x97C4adc5d28A86f9470C70DD91Dc6CC2f20d2d4D

Uniswap FRAX/FXS LP: 0xE1573B9D29e2183B1AF0e743Dc2754979A40D237

Uniswap FXS/WETH LP: 0xecBa967D84fCF0405F6b32Bc45F4d36BfDBB2E81

质押合约

Uniswap FRAX/WETH staking: 0xD875628B942f8970De3CcEaf6417005F68540d4f

Uniswap FRAX/USDC staking: 0xa29367a3f057F3191b62bd4055845a33411892b6

Uniswap FRAX/FXS staking: 0xda2c338350a0E59Ce71CDCED9679A3A590Dd9BEC

Uniswap FXS/WETH staking (deprecated): 0xDc65f3514725206Dd83A8843AAE2aC3D99771C88

状态变量

FRAXStablecoin private FRAX

FRAX合约的实例。

ERC20 public rewardsToken

奖励代币的实例。

ERC20 public stakingToken

质押代币的实例。

uint256 public periodFinish

质押周期结束的区块。

uint256 public rewardRate

每秒最大奖励。

uint256 public rewardsDuration

奖励周期,以秒为单位。

uint256 public lastUpdateTime

合约最后一次更新或状态改变的时间戳。

uint256 public rewardPerTokenStored

当前周期内每个代币的实际奖励。

uint256 public locked_stake_max_multiplier

锁定质押的最大提升/权重倍增器。

uint256 public locked_stake_time_for_max_multiplier

达到 locked_stake_max_multiplier 的时间(以秒为单位)。

uint256 public locked_stake_min_time

锁定质押的最低质押时间(以秒为单位)。

string public locked_stake_min_time_str

字符串版本为 locked_stake_min_time_str

uint256 public cr_boost_max_multiplier

来自抵押比例(CR)的最大提升/权重乘数。这适用于锁定和未锁定的质押。

mapping(address => uint256) public userRewardPerTokenPaid

记录某个地址上次领取奖励的时间。如果他们在之后的某个时间领取奖励,他们将获得正确的奖励金额,因为 rewardPerTokenStored 是在不断变化的。

mapping(address => uint256) public rewards

给定地址的当前奖励余额。

uint256 private _staking_token_supply

质押的池代币总量。

uint256 private _staking_token_boosted_supply

考虑了时间和CR加成的 _staking_token_supply。这不是实际的池代币数量,而是一个“加权分母”。

mapping(address => uint256) private _balances

给定地址质押的池代币余额。

mapping(address => uint256) private _boosted_balances

考虑了时间和CR加成的 _balances,类似于 _staking_token_boosted_supply

mapping(address => LockedStake[]) private lockedStakes

提供给定地址的锁定质押批次列表。

struct LockedStake {
        bytes32 kek_id;
        uint256 start_timestamp;
        uint256 amount;
        uint256 ending_timestamp;
        uint256 multiplier; // 6 decimals of precision. 1x = 1000000
    }

一个锁定的质押“批次”。

查看函数

totalSupply

totalSupply() external override view returns (uint256)

获取质押的流动性池代币总数。

stakingMultiplier

stakingMultiplier(uint256 secs) public view returns (uint256)

根据质押的秒数获取基于时间的质押倍增器。

crBoostMultiplier

crBoostMultiplier() public view returns (uint256)

获取基于抵押比率(CR)的质押倍增器。

stakingTokenSupply

stakingTokenSupply() external view returns (uint256)

totalSupply() 相同。

balanceOf

balanceOf(address account) external override view returns (uint256)

获取给定账户质押的流动性池代币数量。

boostedBalanceOf

boostedBalanceOf(address account) external view returns (uint256)

获取给定账户质押的流动性池代币的加成数量。加成考虑了抵押比率(CR)和基于时间的倍增器。

lockedBalanceOf

lockedBalanceOf(address account) public view returns (uint256)

获取给定账户锁定的质押流动性池代币数量。

unlockedBalanceOf

unlockedBalanceOf(address account) external view returns (uint256)

获取给定账户解锁的/自由的质押流动性池代币数量。

lockedStakesOf

lockedStakesOf(address account) external view returns (LockedStake[] memory)

返回给定账户的所有锁定质押“批次”的数组。

stakingDecimals

stakingDecimals() external view returns (uint256)

返回 stakingToken 的小数位数 (decimals())。

rewardsFor

rewardsFor(address account) external view returns (uint256)

获取给定账户的 FXS 奖励数量。

lastTimeRewardApplicable

lastTimeRewardApplicable() public override view returns (uint256)

在内部用于跟踪 rewardPerTokenStored

rewardPerToken

rewardPerToken() public override view returns (uint256)

当前质押流动性池代币的 FXS 奖励数量。

earned

earned(address account) public override view returns (uint256)

返回给定账户的未领取 FXS 奖励数量。

getRewardForDuration

getRewardForDuration() external override view returns (uint256)

计算给定奖励持续时间(rewardsDuration)内的 FXS 奖励。

变更函数

stake

stake(uint256 amount) external override nonReentrant notPaused updateReward(msg.sender)

质押一些 Uniswap 流动性池代币。这些代币可以自由提取,仅受 crBoostMultiplier() 的加成。

stakeLocked

stakeLocked(uint256 amount, uint256 secs) external nonReentrant notPaused updateReward(msg.sender)

质押一些 Uniswap 流动性池代币,并将其锁定指定的秒数。作为锁定代币的回报,质押者的基础金额将通过线性时间倍增器进行乘法计算,该倍增器在 secs = 0 时为 1,在 locked_stake_time_for_max_multiplier 时为 locked_stake_max_multiplier。质押的价值还会乘以 crBoostMultiplier()。这个乘积值会被加到 _boosted_balances 中,并在计算质押者在给定奖励周期中的份额时作为加权金额。

withdraw

withdraw(uint256 amount) public override nonReentrant updateReward(msg.sender)

提取解锁的 Uniswap 流动性池代币。

withdrawLocked

withdrawLocked(bytes32 kek_id) public nonReentrant updateReward(msg.sender)

提取锁定的 Uniswap 流动性池代币。如果特定 kek_id 质押批次的质押时间尚未到期,则会失败。

getReward

getReward() public override nonReentrant updateReward(msg.sender)

零取 FXS 奖励。

exit

exit() external override

提取所有解锁的池代币并领取奖励。

renewIfApplicable

renewIfApplicable() external

如果奖励周期的结束时间已到,则续期奖励周期。调用 retroCatchUp()

retroCatchUp

retroCatchUp() internal

续期并更新 periodFinishrewardPerTokenStoredlastUpdateTime

受限函数

notifyRewardAmount

notifyRewardAmount(uint256 reward) external override onlyRewardsDistribution updateReward(address(0))

通过事件 RewardAdded 通知人们奖励正在被更改。

recoverERC20

recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner

添加此功能以支持从其他系统恢复流动性池奖励,并将其分发给持有者。

setRewardsDuration

setRewardsDuration(uint256 _rewardsDuration) external onlyOwner

设置奖励周期的持续时间。

setLockedStakeMaxMultiplierUpdated

setLockedStakeMaxMultiplierUpdated(uint256 _locked_stake_max_multiplier) external onlyOwner

设置锁定质押的最大倍增器。

setLockedStakeTimeForMaxMultiplier

setLockedStakeTimeForMaxMultiplier(uint256 _locked_stake_time_for_max_multiplier) external onlyOwner

设置锁定质押倍增器达到 locked_stake_max_multiplier 的时间(以秒为单位)。

setLockedStakeMinTime

setLockedStakeMinTime(uint256 _locked_stake_min_time) external onlyOwner

设置锁定质押的最短时间(以秒为单位)。

setMaxCRBoostMultiplier

setMaxCRBoostMultiplier(uint256 _max_boost_multiplier) external onlyOwner

initializeDefault

initializeDefault() external onlyOwner

仅在合约生命周期中调用一次。初始化 lastUpdateTimeperiodFinish

修饰符

updateReward

updateReward(address account)

调用 retroCatchUp()(如果适用),否则同步 rewardPerTokenStoredlastUpdateTime。此外,还会同步提供账户的奖励和 userRewardPerTokenPaid

Last updated