update dodomine v2
This commit is contained in:
@@ -26,7 +26,6 @@ contract BaseMine is InitializableOwnable {
|
|||||||
uint256 startBlock;
|
uint256 startBlock;
|
||||||
uint256 endBlock;
|
uint256 endBlock;
|
||||||
address rewardVault;
|
address rewardVault;
|
||||||
address rewardDistributor;
|
|
||||||
|
|
||||||
uint256 rewardPerBlock;
|
uint256 rewardPerBlock;
|
||||||
uint256 accRewardPerShare;
|
uint256 accRewardPerShare;
|
||||||
@@ -46,22 +45,16 @@ contract BaseMine is InitializableOwnable {
|
|||||||
event Claim(uint256 indexed i, address indexed user, uint256 reward);
|
event Claim(uint256 indexed i, address indexed user, uint256 reward);
|
||||||
event UpdateReward(uint256 indexed i, uint256 rewardPerBlock);
|
event UpdateReward(uint256 indexed i, uint256 rewardPerBlock);
|
||||||
event UpdateEndBlock(uint256 indexed i, uint256 endBlock);
|
event UpdateEndBlock(uint256 indexed i, uint256 endBlock);
|
||||||
event RewardDistributorChanged(uint256 indexed i, address rewardDistributor);
|
|
||||||
event NewRewardToken(uint256 indexed i, address rewardToken);
|
event NewRewardToken(uint256 indexed i, address rewardToken);
|
||||||
event RemoveRewardToken(address rewardToken);
|
event RemoveRewardToken(address rewardToken);
|
||||||
|
|
||||||
// ============ Modifier ==========
|
// ============ Modifier ==========
|
||||||
|
|
||||||
modifier onlyRewardDistributor(uint i) {
|
|
||||||
require(msg.sender == rewardTokenInfos[i].rewardDistributor, "DODOMineV2: ACCESS_RESTRICTED");
|
|
||||||
_;
|
|
||||||
}
|
|
||||||
|
|
||||||
modifier updateReward(address user) {
|
modifier updateReward(address user) {
|
||||||
uint256 len = rewardTokenInfos.length;
|
uint256 len = rewardTokenInfos.length;
|
||||||
for (uint i = 0; i < len; i++) {
|
for (uint i = 0; i < len; i++) {
|
||||||
RewardTokenInfo storage rt = rewardTokenInfos[i];
|
RewardTokenInfo storage rt = rewardTokenInfos[i];
|
||||||
rt.accRewardPerShare = rewardPerLpToken(i);
|
rt.accRewardPerShare = rewardPerToken(i);
|
||||||
rt.lastRewardBlock = lastBlockRewardApplicable(i);
|
rt.lastRewardBlock = lastBlockRewardApplicable(i);
|
||||||
if (user != address(0)) {
|
if (user != address(0)) {
|
||||||
rt.userRewards[user] = getPendingReward(i, user);
|
rt.userRewards[user] = getPendingReward(i, user);
|
||||||
@@ -86,7 +79,7 @@ contract BaseMine is InitializableOwnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function rewardPerLpToken(uint i) public view returns (uint256) {
|
function rewardPerToken(uint i) public view returns (uint256) {
|
||||||
RewardTokenInfo memory rt = rewardTokenInfos[i];
|
RewardTokenInfo memory rt = rewardTokenInfos[i];
|
||||||
if (totalSupply() == 0) {
|
if (totalSupply() == 0) {
|
||||||
return rt.accRewardPerShare;
|
return rt.accRewardPerShare;
|
||||||
@@ -103,7 +96,7 @@ contract BaseMine is InitializableOwnable {
|
|||||||
RewardTokenInfo storage rt = rewardTokenInfos[i];
|
RewardTokenInfo storage rt = rewardTokenInfos[i];
|
||||||
return DecimalMath.mulFloor(
|
return DecimalMath.mulFloor(
|
||||||
balanceOf(user),
|
balanceOf(user),
|
||||||
rewardPerLpToken(i).sub(rt.userRewardPerTokenPaid[user])
|
rewardPerToken(i).sub(rt.userRewardPerTokenPaid[user])
|
||||||
).add(rt.userRewards[user]);
|
).add(rt.userRewards[user]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,6 +108,11 @@ contract BaseMine is InitializableOwnable {
|
|||||||
return _balances[user];
|
return _balances[user];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getRewardTokenByIdx(uint i) public view returns (address) {
|
||||||
|
RewardTokenInfo memory rt = rewardTokenInfos[i];
|
||||||
|
return rt.rewardToken;
|
||||||
|
}
|
||||||
|
|
||||||
// ============ Claim ============
|
// ============ Claim ============
|
||||||
|
|
||||||
function getReward(uint i) public updateReward(msg.sender) {
|
function getReward(uint i) public updateReward(msg.sender) {
|
||||||
@@ -136,17 +134,10 @@ contract BaseMine is InitializableOwnable {
|
|||||||
|
|
||||||
// =============== Ownable ================
|
// =============== Ownable ================
|
||||||
|
|
||||||
function setRewardDistribution(uint i, address rewardDistributor) external onlyOwner {
|
function addRewardToken(address rewardToken, uint256 startBlock, uint256 endBlock) external onlyOwner {
|
||||||
RewardTokenInfo storage rt = rewardTokenInfos[i];
|
|
||||||
rt.rewardDistributor = rewardDistributor;
|
|
||||||
emit RewardDistributorChanged(i, rewardDistributor);
|
|
||||||
}
|
|
||||||
|
|
||||||
function addRewardToken(address rewardToken, address rewardDistributor,uint256 startBlock, uint256 endBlock) external onlyOwner {
|
|
||||||
require(rewardToken != address(0),"DODOMineV2: TOKEN_INVALID");
|
require(rewardToken != address(0),"DODOMineV2: TOKEN_INVALID");
|
||||||
require(startBlock > block.number, "DODOMineV2: START_BLOCK_INVALID");
|
require(startBlock > block.number, "DODOMineV2: START_BLOCK_INVALID");
|
||||||
require(endBlock > startBlock ,"DODOMineV2: DURATION_INVALID");
|
require(endBlock > startBlock ,"DODOMineV2: DURATION_INVALID");
|
||||||
require(rewardDistributor != address(0), "DODOMineV2: REWARD_DISTRIBUTOR_INVALID");
|
|
||||||
|
|
||||||
uint256 len = rewardTokenInfos.length;
|
uint256 len = rewardTokenInfos.length;
|
||||||
for (uint i = 0; i < len; i++) {
|
for (uint i = 0; i < len; i++) {
|
||||||
@@ -157,11 +148,9 @@ contract BaseMine is InitializableOwnable {
|
|||||||
rt.rewardToken = rewardToken;
|
rt.rewardToken = rewardToken;
|
||||||
rt.startBlock = startBlock;
|
rt.startBlock = startBlock;
|
||||||
rt.endBlock = endBlock;
|
rt.endBlock = endBlock;
|
||||||
rt.rewardDistributor = rewardDistributor;
|
|
||||||
rt.rewardVault = address(new RewardVault(rewardToken));
|
rt.rewardVault = address(new RewardVault(rewardToken));
|
||||||
|
|
||||||
emit NewRewardToken(len, rewardToken);
|
emit NewRewardToken(len, rewardToken);
|
||||||
emit RewardDistributorChanged(len, rewardDistributor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeRewardToken(address rewardToken) external onlyOwner {
|
function removeRewardToken(address rewardToken) external onlyOwner {
|
||||||
@@ -176,40 +165,20 @@ contract BaseMine is InitializableOwnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setEndBlock(uint i, uint256 newEndBlock) external onlyRewardDistributor(i) updateReward(address(0)) {
|
function setEndBlock(uint i, uint256 newEndBlock) external onlyOwner updateReward(address(0)) {
|
||||||
require(block.number < newEndBlock, "DODOMineV2: END_BLOCK_INVALID");
|
require(block.number < newEndBlock, "DODOMineV2: END_BLOCK_INVALID");
|
||||||
RewardTokenInfo storage rt = rewardTokenInfos[i];
|
RewardTokenInfo storage rt = rewardTokenInfos[i];
|
||||||
require(block.number > rt.startBlock, "DODOMineV2: NOT_START");
|
require(block.number > rt.startBlock, "DODOMineV2: NOT_START");
|
||||||
require(block.number < rt.endBlock, "DODOMineV2: ALREADY_CLOSE");
|
require(block.number < rt.endBlock, "DODOMineV2: ALREADY_CLOSE");
|
||||||
|
|
||||||
//TODO: gas ?需要额外维护 已分发reward变量,总reward 两个storage
|
|
||||||
// uint256 vaultBalance = IERC20(rt.rewardToken).balanceOf(rt.rewardVault);
|
|
||||||
// uint256 preReward = DecimalMath.mulFloor(newEndBlock.sub(block.number), rt.rewardPerBlock);
|
|
||||||
// require(preReward <= vaultBalance, "DODOMineV2: REWARD_NOT_ENOUGH");
|
|
||||||
|
|
||||||
rt.endBlock = newEndBlock;
|
rt.endBlock = newEndBlock;
|
||||||
rt.lastRewardBlock = block.number;
|
rt.lastRewardBlock = block.number;
|
||||||
|
|
||||||
emit UpdateEndBlock(i, newEndBlock);
|
emit UpdateEndBlock(i, newEndBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setReward(uint i, uint256 newRewardPerBlock) external onlyRewardDistributor(i) updateReward(address(0)) {
|
function setReward(uint i, uint256 newRewardPerBlock) external onlyOwner updateReward(address(0)) {
|
||||||
RewardTokenInfo storage rt = rewardTokenInfos[i];
|
RewardTokenInfo storage rt = rewardTokenInfos[i];
|
||||||
uint256 endBlock = rt.endBlock;
|
uint256 endBlock = rt.endBlock;
|
||||||
|
|
||||||
require(block.number < endBlock, "DODOMineV2: ALREADY_FINISHED");
|
require(block.number < endBlock, "DODOMineV2: ALREADY_FINISHED");
|
||||||
|
|
||||||
//TODO:
|
|
||||||
// uint256 vaultBalance = IERC20(rt.rewardToken).balanceOf(rt.rewardVault);
|
|
||||||
// uint256 startBlock = rt.startBlock;
|
|
||||||
// uint256 preReward;
|
|
||||||
// if(startBlock > block.number) {
|
|
||||||
// preReward = DecimalMath.mulFloor(endBlock.sub(startBlock), newRewardPerBlock);
|
|
||||||
// }else {
|
|
||||||
// preReward = DecimalMath.mulFloor(endBlock.sub(block.number), newRewardPerBlock);
|
|
||||||
// }
|
|
||||||
// require(preReward <= vaultBalance, "DODOMineV2: REWARD_NOT_ENOUGH");
|
|
||||||
|
|
||||||
rt.rewardPerBlock = newRewardPerBlock;
|
rt.rewardPerBlock = newRewardPerBlock;
|
||||||
emit UpdateReward(i, newRewardPerBlock);
|
emit UpdateReward(i, newRewardPerBlock);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,22 +10,18 @@ pragma experimental ABIEncoderV2;
|
|||||||
import {SafeERC20} from "../../lib/SafeERC20.sol";
|
import {SafeERC20} from "../../lib/SafeERC20.sol";
|
||||||
import {IERC20} from "../../intf/IERC20.sol";
|
import {IERC20} from "../../intf/IERC20.sol";
|
||||||
import {SafeMath} from "../../lib/SafeMath.sol";
|
import {SafeMath} from "../../lib/SafeMath.sol";
|
||||||
import {IDODOApproveProxy} from "../../intf/IDODOApproveProxy.sol";
|
|
||||||
import {BaseMine} from "./BaseMine.sol";
|
import {BaseMine} from "./BaseMine.sol";
|
||||||
|
|
||||||
|
contract ERC20Mine is BaseMine {
|
||||||
contract LpMine is BaseMine {
|
|
||||||
using SafeERC20 for IERC20;
|
using SafeERC20 for IERC20;
|
||||||
using SafeMath for uint256;
|
using SafeMath for uint256;
|
||||||
|
|
||||||
// ============ Storage ============
|
// ============ Storage ============
|
||||||
|
|
||||||
address public immutable _LP_TOKEN_;
|
address public immutable _TOKEN_;
|
||||||
address public immutable _DODO_APPROVE_PROXY_;
|
|
||||||
|
|
||||||
constructor(address lpToken, address dodoApproveProxy) public {
|
constructor(address token) public {
|
||||||
_LP_TOKEN_ = lpToken;
|
_TOKEN_ = token;
|
||||||
_DODO_APPROVE_PROXY_ = dodoApproveProxy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============ Event ============
|
// ============ Event ============
|
||||||
@@ -39,12 +35,7 @@ contract LpMine is BaseMine {
|
|||||||
require(amount > 0, "DODOMineV2: CANNOT_DEPOSIT_ZERO");
|
require(amount > 0, "DODOMineV2: CANNOT_DEPOSIT_ZERO");
|
||||||
_totalSupply = _totalSupply.add(amount);
|
_totalSupply = _totalSupply.add(amount);
|
||||||
_balances[msg.sender] = _balances[msg.sender].add(amount);
|
_balances[msg.sender] = _balances[msg.sender].add(amount);
|
||||||
IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(
|
IERC20(_TOKEN_).safeTransferFrom(msg.sender, address(this), amount);
|
||||||
_LP_TOKEN_,
|
|
||||||
msg.sender,
|
|
||||||
address(this),
|
|
||||||
amount
|
|
||||||
);
|
|
||||||
emit Deposit(msg.sender, amount);
|
emit Deposit(msg.sender, amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,7 +43,7 @@ contract LpMine is BaseMine {
|
|||||||
require(amount > 0, "DODOMineV2: CANNOT_WITHDRAW_ZERO");
|
require(amount > 0, "DODOMineV2: CANNOT_WITHDRAW_ZERO");
|
||||||
_totalSupply = _totalSupply.sub(amount);
|
_totalSupply = _totalSupply.sub(amount);
|
||||||
_balances[msg.sender] = _balances[msg.sender].sub(amount);
|
_balances[msg.sender] = _balances[msg.sender].sub(amount);
|
||||||
IERC20(_LP_TOKEN_).safeTransfer(msg.sender, amount);
|
IERC20(_TOKEN_).safeTransfer(msg.sender, amount);
|
||||||
emit Withdraw(msg.sender, amount);
|
emit Withdraw(msg.sender, amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ contract vDODOMine is BaseMine {
|
|||||||
event Deposit(address indexed user, uint256 amount);
|
event Deposit(address indexed user, uint256 amount);
|
||||||
event Withdraw(address indexed user, uint256 amount);
|
event Withdraw(address indexed user, uint256 amount);
|
||||||
|
|
||||||
|
// ============ Deposit && Withdraw && Exit ============
|
||||||
|
|
||||||
function deposit(uint256 amount) public {
|
function deposit(uint256 amount) public {
|
||||||
require(amount > 0, "vDODOMineETH: CANNOT_DEPOSIT_ZERO");
|
require(amount > 0, "vDODOMineETH: CANNOT_DEPOSIT_ZERO");
|
||||||
@@ -56,4 +57,26 @@ contract vDODOMine is BaseMine {
|
|||||||
withdraw(balanceOf(msg.sender));
|
withdraw(balanceOf(msg.sender));
|
||||||
getAllRewards();
|
getAllRewards();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ============ View ============
|
||||||
|
|
||||||
|
function getLockedvDODO(address account) external view returns (uint256) {
|
||||||
|
return balanceOf(account);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// =============== Ownable ================
|
||||||
|
|
||||||
|
function syncBalance(address[] calldata accountList, uint256[] calldata amountList) external onlyOwner {
|
||||||
|
require(accountList.length == amountList.length, "DODOMineV2: LENGTH_NOT_MATCH");
|
||||||
|
for (uint256 i = 0; i < accountList.length; ++i) {
|
||||||
|
uint256 curBalance = balanceOf(accountList[i]);
|
||||||
|
if(curBalance > amountList[i]) {
|
||||||
|
uint256 subAmount = curBalance.sub(amountList[i]);
|
||||||
|
_totalSupply = _totalSupply.sub(subAmount);
|
||||||
|
_balances[accountList[i]] = amountList[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user