账户
0x68...ab27
0x68...AB27

0x68...AB27

$500
此合同的源代码已经过验证!
合同元数据
编译器
0.8.4+commit.c7e474f2
语言
Solidity
合同源代码
文件 1 的 1:Contract3.sol
/**
 *Submitted for verification at Etherscan.io on 2021-06-08
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

interface contract2{
    function editData(address user, uint256 lockedRewards, uint256 firstBlock) external ;
    function definiteStats(address user) external view returns(uint256 firstBlock, uint256 lockedRewards, uint256 totalLockedRewards);
    function claimRewards(address user) external returns(bool);
    function userStats(address user) external view returns(uint256 firstBlock, uint256 claimedDays, uint256 lockedRewards, uint256 claimableRewards);
    
}

interface IERC20{

  function transfer(address recipient, uint256 amount) external returns (bool);

}

interface MCHstakingInterface {
    
    function showBlackUser(address user) external view returns(bool) ;
}

interface Icontract3{
    function withdrawLockedRewards() external ;
    event WithdrawLockedRewards(address indexed user, uint256 amount);
}
contract contract3 is Icontract3{
    
    IERC20 MCF;
    contract2 SC2;
    
    address _owner;

    mapping(address => uint256) private claimedMonths;
    mapping (address => bool) private _blackListed;
        
    constructor(address contract2Address, address MCFaddress){
        _owner = msg.sender;
        SC2 = contract2(contract2Address);
        MCF = IERC20(MCFaddress);
    }
   
        
    function addToBlackList(address user) external {
        require(_owner == msg.sender);
        _blackListed[user] = true;
    }
    
    function showBlackUser(address user) external view returns(bool){
        return _blackListed[user];
    }
    
    function removeFromBlackList(address user) external {
        require(_owner == msg.sender);
        _blackListed[user] = false;
    } 
    
    function claimedRewards(address user) external view returns(uint256) { 
        (, , uint256 totalLockedRewards) = SC2.definiteStats(user);
        uint256 totalLocked = totalLockedRewards/10;
        return claimedMonths[user] * totalLocked;
    }
    
    function claimableRewards(address user) external view returns(uint256) {
        (, , uint256 totalLockedRewards) = SC2.definiteStats(user);
        (,,uint256 lockedRewards,) = SC2.userStats(user);
        
        if(lockedRewards > totalLockedRewards) {totalLockedRewards = lockedRewards;}
        uint256 rewards;
        uint256 month = (block.number - 12954838) / 199384;
        uint256 _claimMonths = claimedMonths[user];
        while(month > _claimMonths){
        
        if(lockedRewards == 0){break;}
        uint256 totalLocked = totalLockedRewards/10;
        
        if(lockedRewards < totalLocked){rewards += lockedRewards; break;}
        else{rewards += totalLocked; lockedRewards -=totalLocked; }
        
        ++_claimMonths;
        }
        
        return rewards;
    }
    function withdrawLockedRewards() external override {
        require(_blackListed[msg.sender] == false);
     
        SC2.claimRewards(msg.sender);
        (uint256 firstBlock, uint256 lockedRewards, uint256 totalLockedRewards) = SC2.definiteStats(msg.sender);
        require(block.number > 13154223 && lockedRewards > 0);
        ////////////////////////12755454
        uint256 claimedRewards;
        uint256 month = (block.number - 12954838) / 199384;
        uint256 total;
        while(month > claimedMonths[msg.sender]){
        
        if(lockedRewards == 0){break;}
        uint256 totalLocked = totalLockedRewards/10;
        
        if(lockedRewards < totalLocked){total += lockedRewards; claimedRewards += lockedRewards; lockedRewards = 0;}
        else{total += totalLocked; claimedRewards += lockedRewards; lockedRewards -=totalLocked; }
        
        ++claimedMonths[msg.sender];
        }
        
        MCF.transfer(msg.sender, total);
        SC2.editData(msg.sender, lockedRewards, firstBlock);
        
        emit WithdrawLockedRewards(msg.sender, claimedRewards);
    }
    
    function emergencyWithdraw(uint256 amount) external {
        require(msg.sender == _owner);
        MCF.transfer(msg.sender, amount);
    }
}
设置
{
  "compilationTarget": {
    "contracts/Contract3.sol": "contract3"
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"inputs":[{"internalType":"address","name":"contract2Address","type":"address"},{"internalType":"address","name":"MCFaddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawLockedRewards","type":"event"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"addToBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"claimableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"claimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"removeFromBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"showBlackUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawLockedRewards","outputs":[],"stateMutability":"nonpayable","type":"function"}]