Skip to content

Commit

Permalink
Update BEP153's design
Browse files Browse the repository at this point in the history
  • Loading branch information
pythonberg1997 committed Jul 1, 2022
1 parent 95cca1e commit 82d9968
Showing 1 changed file with 13 additions and 20 deletions.
33 changes: 13 additions & 20 deletions assets/bep-153/SampleStakingContract.sol
Original file line number Diff line number Diff line change
Expand Up @@ -177,22 +177,15 @@ contract Sample {
address public constant STAKING_CONTRACT_ADDR = 0x0000000000000000000000000000000000002001;

// data struct
struct UserInfo {
uint256 amount; // total BNB delegated
uint256 rewardDebt; // reward debt
// pending reward = (user.amount * pool.rewardPerShare) - user.rewardDebt
//
// Whenever a user deposits or withdraws BNBs to a pool. Here's what happens:
// 1. The pool's `rewardPerShare` (and `lastRewardBlock`) gets updated.
// 2. User receives the pending reward sent to his/her address.
// 3. User's `amount` gets updated.
// 4. User's `rewardDebt` gets updated.
struct PoolInfo {
uint256 rewardPerShare;
uint256 lastRewardBlock;
uint256 lastTotalReward;
}

struct PoolInfo {
uint256 rewardPerShare; // Accumulated reward per share
uint256 lastRewardBlock; // Last block number that reward distribution occurs
uint256 lastTotalReward; // Last total reward at lastRewardBlock
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
}

// global variables
Expand All @@ -218,7 +211,7 @@ contract Sample {
}

modifier noReentrant() {
require(!locked, "No re-entrance");
require(!locked, "No re-entrancy");
locked = true;
_;
locked = false;
Expand Down Expand Up @@ -250,15 +243,15 @@ contract Sample {
/*********************** Design for user **************************/
// This function will not submit delegation request to the staking system contract.
// The real delegation process should be finished by the operator periodically or in other desirable way.
function delegate(uint256 amount) external payable {
require(msg.value > oracleRelayerFee, "received BNB amount should be no less than the oracleRelayerFee");
function delegate() external payable noReentrant {
uint256 amount = msg.value;

// claim reward first
UserInfo storage user = userInfo[msg.sender];
_updatePool();
if (user.amount > 0) {
uint256 pendingReward = user.amount.mul(poolInfo.rewardPerShare).sub(user.rewardDebt);
msg.sender.transfer(pendingReward);
payable(msg.sender).transfer(pendingReward);
emit rewardClaimed(msg.sender, pendingReward);
}
user.amount = user.amount.add(amount);
Expand All @@ -276,7 +269,7 @@ contract Sample {
require(address(this).balance >= amount, "insufficient balance, please try again later");
_updatePool();
uint256 pendingReward = user.amount.mul(poolInfo.rewardPerShare).sub(user.rewardDebt);
msg.sender.transfer(amount.add(pendingReward));
payable(msg.sender).transfer(amount.add(pendingReward));
user.amount = user.amount.sub(amount);
user.rewardDebt = user.amount.mul(poolInfo.rewardPerShare);

Expand All @@ -292,7 +285,7 @@ contract Sample {
}
_updatePool();
uint256 pendingReward = user.amount.mul(poolInfo.rewardPerShare).sub(user.rewardDebt);
msg.sender.transfer(pendingReward);
payable(msg.sender).transfer(pendingReward);
user.rewardDebt = user.amount.mul(poolInfo.rewardPerShare);
emit rewardClaimed(msg.sender, pendingReward);
}
Expand Down

0 comments on commit 82d9968

Please sign in to comment.