function withdraw(uint256 amount) public updateReward(msg.sender) checkNextEpoch {
从代码中得知,unfrozenStakeTime 是利用用户的上次抵押时间加上 FROZEN_STAKING_TIME 常量得出锁按时间,只要高出时间,就能通过 withdraw 函数提现收益。整个抵押和领取收益的简化流程如下: yfv.safeTransferFrom(msg.sender, address(this), amount);
function stakeReward() public updateReward(msg.sender) checkNextEpoch {
function stakeOnBehalf(address stakeFor, uint256 amount) public updateReward(stakeFor) checkNextEpoch {
_totalSupply = _totalSupply.add(amount);
通过阐明代码和裂痕细节,针对本次裂痕,修复方案也很简朴,只要在抵押的时候查抄用户的抵押状态是否为已经抵押,假如已经抵押,则不答允再次抵押。可能对每次的抵押举办单独的处理惩罚,不能对先前的抵押状态发生影响。 emit Staked(msg.sender, amount);
_balances[msg.sender] = _balances[msg.sender].add(amount);
前车之鉴
function stake(uint256 amount, address referrer) public updateReward(msg.sender) checkNextEpoch {
if (rewardReferral != address(0) && referrer != address(0)) {
可以看到这里只是简朴的把对应的 token 用 transferFrom 的方法转入到合约中,没有什么出格的逻辑点。到这里整个抵押流程就很清晰了,接下来是收益的进程。计较用户收益的是 stakeReward 函数,领取收益的为 withdraw 函数,代码别离如下:
require(amount > 0, “Cannot stake 0”);
_balances[stakeFor] = _balances[stakeFor].add(amount);
super.tokenStakeOnBehalf(stakeFor, amount);
emit Staked(msg.sender, reward);
}
}
媒介
}
}
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。