编译器
0.8.11+commit.d7f03943
文件 1 的 4:Governable.sol
pragma solidity 0.8.11;
contract Governable {
address public gov;
constructor() {
gov = msg.sender;
}
modifier onlyGov() {
require(msg.sender == gov, "Governable: forbidden");
_;
}
function setGov(address _gov) external onlyGov {
gov = _gov;
}
}
文件 2 的 4:IERC20.sol
pragma solidity 0.8.11;
interface IERC20 {
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 3 的 4:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
}
文件 4 的 4:Whitlelist.sol
pragma solidity 0.8.11;
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import { Governable } from "./libraries/Governable.sol";
import { IERC20 } from "./interfaces/IERC20.sol";
contract Whitlelist is ReentrancyGuard, Governable {
uint256 constant PRECISION = 1000;
bool public isDeposit;
bool public isClaimWhitelist;
bool public isClaimAirdropToken;
uint256 public minAmountDeposit;
uint256 public rate;
uint256 public totalDeposit;
uint256 public totalClaim;
uint256 public totalAirdrop;
address public tokenDeposit;
address public tokenGov;
mapping (address => uint256) public depositUsers;
mapping (address => bool) public isClaimTokenDeposit;
mapping (address => bool) public isClaimTokenGov;
event Deposit(address indexed account, uint256 amount);
event ClaimWhitlelist(address indexed account, uint256 amount);
event ClaimAirdropToken(address indexed account, uint256 amount);
constructor(address _tokenDeposit, address _tokenGov) {
tokenDeposit = _tokenDeposit;
tokenGov = _tokenGov;
minAmountDeposit = 1 * 10 ** 18;
rate = 1000;
}
function setWhitlelistStatus(bool _isDeposit, bool _isClaimWhitelist, bool _isClaimAirdropToken) external onlyGov {
isDeposit = _isDeposit;
isClaimWhitelist = _isClaimWhitelist;
isClaimAirdropToken = _isClaimAirdropToken;
}
function setTokens(address _tokenDeposit, address _tokenGov) external onlyGov {
tokenDeposit = _tokenDeposit;
tokenGov = _tokenGov;
}
function setMinAmountDeposit(uint256 _minAmountDeposit) external onlyGov {
minAmountDeposit = _minAmountDeposit;
}
function deposit(uint256 _amount) external {
require(isDeposit, "Whitlelist: deposit not active");
require(_amount >= minAmountDeposit, "Whitlelist: amount need >= minAmountDeposit");
IERC20(tokenDeposit).transferFrom(msg.sender, address(this), _amount);
depositUsers[msg.sender] = _amount;
totalDeposit += _amount;
emit Deposit(msg.sender, _amount);
}
function withDrawnFund(uint256 _amount) external onlyGov {
IERC20(tokenDeposit).transfer(msg.sender, _amount);
}
function claimWhitlelist() external {
require(isClaimWhitelist, "Whitlelist: claim token not active");
require(depositUsers[msg.sender] > 0, "Whitlelist: user don't have balance");
require(!isClaimTokenDeposit[msg.sender], "Whitlelist: user already claim token");
uint256 amount = depositUsers[msg.sender];
IERC20(tokenDeposit).transfer(msg.sender, amount);
isClaimTokenDeposit[msg.sender] = true;
totalClaim += amount;
emit ClaimWhitlelist(msg.sender, amount);
}
function claimAirdropToken() external {
require(isClaimAirdropToken, "Whitlelist: claim token not active");
require(depositUsers[msg.sender] > 0, "Whitlelist: user don't have balance");
require(!isClaimTokenGov[msg.sender], "Whitlelist: user already claim token");
uint256 tokenAmount = (depositUsers[msg.sender] * rate) / PRECISION;
IERC20(tokenGov).transfer(msg.sender, tokenAmount);
isClaimTokenGov[msg.sender] = true;
totalAirdrop += tokenAmount;
emit ClaimAirdropToken(msg.sender, tokenAmount);
}
function recoverFungibleTokens(address _token) external onlyGov {
uint256 amountToRecover = IERC20(_token).balanceOf(address(this));
require(amountToRecover != 0, "Operations: No token to recover");
IERC20(_token).transfer(address(msg.sender), amountToRecover);
}
}
{
"compilationTarget": {
"contracts/Whitlelist.sol": "Whitlelist"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 256
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_tokenDeposit","type":"address"},{"internalType":"address","name":"_tokenGov","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimAirdropToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimWhitlelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"inputs":[],"name":"claimAirdropToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimWhitlelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositUsers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimAirdropToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isClaimTokenDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isClaimTokenGov","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverFungibleTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountDeposit","type":"uint256"}],"name":"setMinAmountDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenDeposit","type":"address"},{"internalType":"address","name":"_tokenGov","type":"address"}],"name":"setTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isDeposit","type":"bool"},{"internalType":"bool","name":"_isClaimWhitelist","type":"bool"},{"internalType":"bool","name":"_isClaimAirdropToken","type":"bool"}],"name":"setWhitlelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenDeposit","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenGov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAirdrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withDrawnFund","outputs":[],"stateMutability":"nonpayable","type":"function"}]