-
Notifications
You must be signed in to change notification settings - Fork 0
/
stakingPool.sol
73 lines (58 loc) · 2.23 KB
/
stakingPool.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import "./lpSusuToken.sol";
import "./SusuToken.sol";
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
}
struct PoolInfo {
ERC20 lpToken;
uint256 allocPoint;
uint256 lastRewardBlock;
uint256 accRewardPerShare;
}
contract StakingPool {
SusuToken public rewardToken;
PoolInfo[] public poolInfo;
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
uint256 totalAllocPoint = 0;
uint256 startBlock = 0;
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
constructor(SusuToken _token) { rewardToken = _token; }
function add(ERC20 _lpToken) public {
uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
uint256 allocPoint = 100;
totalAllocPoint += allocPoint;
poolInfo.push(PoolInfo({
lpToken: _lpToken,
allocPoint: allocPoint,
lastRewardBlock: lastRewardBlock,
accRewardPerShare: 0
}));
}
function deposit(uint256 _pid, uint256 _amount) public {
PoolInfo memory pool = poolInfo[_pid];
UserInfo memory user = userInfo[_pid][msg.sender];
if (user.amount > 0) {
uint256 reward = user.amount * pool.accRewardPerShare - user.rewardDebt;
rewardToken.transfer(msg.sender, reward);
}
pool.lpToken.transferFrom(msg.sender, address(this), _amount);
user.amount += _amount;
user.rewardDebt = user.amount * pool.accRewardPerShare;
emit Deposit(msg.sender, _pid, _amount);
}
function withdraw(uint256 _pid, uint256 _amount) public {
PoolInfo memory pool = poolInfo[_pid];
UserInfo memory user = userInfo[_pid][msg.sender];
require(user.amount > _amount, "No sufficient fund");
uint256 reward = user.amount * pool.accRewardPerShare - user.rewardDebt;
rewardToken.transfer(msg.sender, reward);
rewardToken.transfer(msg.sender, _amount);
user.amount -= _amount;
user.rewardDebt = user.amount * pool.accRewardPerShare;
emit Withdraw(msg.sender, _pid, _amount);
}
}