根据 BitTorrent Inc. 的说法,BitTorrent 链 (BTTC) 上的 StakingRewards 合约为用户提供了质押代币和获得奖励的机会,提供了一种去中心化和自动化的机制来激励参与。
StakingRewards 合约:您获取被动收入的门户
StakingRewards 合约允许用户在指定的时间内质押代币并获得奖励。该智能合约旨在建立激励机制并鼓励长期参与 BTTC 代币生态系统。
状态变量和结构体:基础
IERC20 public immutable stakingToken;
IERC20 public immutable rewardsToken;
address public owner;
// 奖励支付的持续时间(以秒为单位)
uint public duration;
// 奖励结束时间的时间戳
uint public finishAt;
// 上次更新时间和奖励结束时间的最小值
uint public updatedAt;
// 每秒支付的奖励
uint public rewardRate;
// (reward rate * dt * 1e18 / total supply) 的总和
uint public rewardPerTokenStored;
// 用户地址 => rewardPerTokenStored
mapping(address => uint) public userRewardPerTokenPaid;
// 用户地址 => 待领取的奖励
mapping(address => uint) public rewards;
// 总质押量
uint public totalSupply;
// 用户地址 => 质押量
mapping(address => uint) public balanceOf;
这些变量构成了合约的骨干,定义了质押和奖励机制。
事件:保持所有人知情
在合约中包含事件是一种良好的做法,有助于透明度和链下跟踪。建议的事件包括:
event Staked(address indexed user, uint amount);
event Withdrawn(address indexed user, uint amount);
event RewardPaid(address indexed user, uint reward);
event RewardDurationUpdated(uint newDuration);
event RewardNotified(uint amount);
关键函数:质押和奖励的核心
构造函数
constructor(address _stakingToken, address _rewardToken) {
owner = msg.sender;
stakingToken = IERC20(_stakingToken);
rewardsToken = IERC20(_rewardToken);
}
构造函数用质押和奖励代币的地址初始化合约,并将合约部署者设为所有者。
修饰符
modifier onlyOwner() {
require(msg.sender == owner, "not authorized");
_;
}
modifier updateReward(address _account) {
rewardPerTokenStored = rewardPerToken();
updatedAt = lastTimeRewardApplicable();
if (_account != address(0)) {
rewards[_account] = earned(_account);
userRewardPerTokenPaid[_account] = rewardPerTokenStored;
}
_;
}
这些修饰符确保只有所有者可以执行某些操作,并在任何状态更改之前更新奖励。
奖励计算函数
function lastTimeRewardApplicable() public view returns (uint) {
return _min(finishAt, block.timestamp);
}
function rewardPerToken() public view returns (uint) {
if (totalSupply == 0) {
return rewardPerTokenStored;
}
return
rewardPerTokenStored +
(rewardRate * (lastTimeRewardApplicable() - updatedAt) * 1e18) /
totalSupply;
}
这些函数计算最后一次适用奖励的时间和每个代币的奖励率。
质押和提现代币
function stake(uint _amount) external updateReward(msg.sender) {
require(_amount > 0, "amount = 0");
stakingToken.transferFrom(msg.sender, address(this), _amount);
balanceOf[msg.sender] += _amount;
totalSupply += _amount;
emit Staked(msg.sender, _amount);
}
function withdraw(uint _amount) external updateReward(msg.sender) {
require(_amount > 0, "amount = 0");
balanceOf[msg.sender] -= _amount;
totalSupply -= _amount;
stakingToken.transfer(msg.sender, _amount);
emit Withdrawn(msg.sender, _amount);
}
这些函数允许用户质押和提现代币,并相应地更新他们的奖励。
赚取和领取奖励
function earned(address _account) public view returns (uint) {
return
((balanceOf[_account] *
(rewardPerToken() - userRewardPerTokenPaid[_account])) / 1e18) +
rewards[_account];
}
function getReward() external updateReward(msg.sender) {
uint reward = rewards[msg.sender];
if (reward > 0) {
rewards[msg.sender] = 0;
rewardsToken.transfer(msg.sender, reward);
emit RewardPaid(msg.sender, reward);
}
}
这些函数计算用户赚取的奖励并允许他们领取奖励。
设置奖励参数
function setRewardsDuration(uint _duration) external onlyOwner {
require(finishAt < block.timestamp, "reward duration not finished");
duration = _duration;
emit RewardDurationUpdated(_duration);
}
function notifyRewardAmount(uint _amount) external onlyOwner updateReward(address(0)) {
if (block.timestamp >= finishAt) {
rewardRate = _amount / duration;
} else {
uint remainingRewards = (finishAt - block.timestamp) * rewardRate;
rewardRate = (_amount + remainingRewards) / duration;
}
require(rewardRate > 0, "reward rate = 0");
require(
rewardRate * duration <= rewardsToken.balanceOf(address(this)),
"reward amount > balance"
);
finishAt = block.timestamp + duration;
updatedAt = block.timestamp;
emit RewardNotified(_amount);
}
这些函数允许所有者设置奖励持续时间并通知合约奖励金额。
实用函数
function _min(uint x, uint y) private pure returns (uint) {
return x <= y ? x : y;
}
超越基础:去中心化质押的力量
StakingRewards 合约提供了几个优势,包括:
- 透明性:所有交易和奖励计算都在区块链上可见。
- 安全性:智能合约逻辑确保资金正确处理。
- 激励:鼓励长期参与和忠诚度。
- 自动化:根据质押活动自动计算和分配奖励。
总结:解锁质押的未来
BTTC 上的 StakingRewards 智能合约不仅仅是代码——它是通向被动收入和去中心化金融的门户。通过利用区块链技术,创建了一个更透明、高效和可访问的质押生态系统。
当用户探索这个合约在 BTTC 上的潜力时,这不仅代表着质押代币,也意味着开创了去中心化金融和社区参与的新纪元。
Image source: Shutterstock