The news is by your side.

探索 BitTorrent 链 (BTTC) 上的 StakeRewards 合约

31


阿尔文·朗
2024 年 9 月 26 日 10:31

了解 BTTC 上 StakeRewards 合约的功能,实现代币质押和奖励。深入研究其关键组件,包括状态变量、事件和函数。




据 BitTorrent Inc. 称,BitTorrent 链(BTTC)上的 StakeRewards 合约为用户提供了质押代币并赚取奖励的机会,为激励参与提供了去中心化和自动化的机制。

StakeRewards 合约:您获得被动收入的门户

StakeRewards 合约使用户能够在指定期限内质押其代币并获得奖励。该智能合约旨在创建激励机制并鼓励长期参与 BTTC 代币生态系统。

状态变量和结构:基础

IERC20 public immutable stakingToken;
IERC20 public immutable rewardsToken;

向公共所有者致辞;

// 支付奖励的持续时间(以秒为单位)
uint 公共持续时间;
// 奖励结束的时间戳
uint public finishAt;
// 最后更新时间和奖励完成时间的最小值
uint public updateAt;
// 每秒支付的奖励
uint 公共奖励率;
// (奖励率 * dt * 1e18 / 总供应量) 之和
uint 公共奖励PerTokenStored;
// 用户地址 =>rewardPerTokenStored
映射(地址=> uint)公共userRewardPerTokenPaid;
// 用户地址 => 领取奖励
映射(地址=> uint)公共奖励;

// 质押总额
uint 公共总供应量;
// 用户地址 => 质押金额
映射(地址=> uint)公共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 != 地址(0)) {
奖励(_account)=赚取(_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 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, “奖励率 = 0”);
要求(
奖励率*持续时间“奖励金额>余额”
);

finishAt = 区块.时间戳 + 持续时间;
updateAt = 块.timestamp;
发出 RewardNotified(_amount);
}

这些功能允许所有者设置奖励期限并向合约通知奖励金额。

实用功能

function _min(uint x, uint y) private pure returns (uint) {
return x }

超越基础:去中心化质押的力量

StakeRewards 合约具有多项优势,包括:

  • 透明度: 所有交易和奖励计算都在区块链上可见。
  • 安全: 智能合约逻辑确保资金得到正确处理。
  • 奖励措施: 鼓励长期参与和忠诚度。
  • 自动化: 根据质押活动自动计算和分配奖励。

结论:开启 Stake 的未来

BTTC 上的 StakeRewards 智能合约不仅仅是代码,它还是通往被动收入和去中心化金融的门户。通过利用区块链技术,创建一个更加透明、高效、可访问的质押生态系统。

当用户在 BTTC 上探索该合约的潜力时,它不仅代表着质押代币,而且开创了去中心化金融和社区参与的新时代。

图片来源:Shutterstock




关键词:人工智能,加密,区块链,新闻