文件 1 的 10:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 10:Communism.sol
pragma solidity 0.8.9;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "./interfaces/IUniswapV2Factory.sol";
import "./interfaces/IUniswapV2Router.sol";
import "./libraries/Utils.sol";
contract Communism is Context, IERC20, Ownable, ReentrancyGuard {
using SafeMath for uint256;
using Address for address payable;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => bool) private _isExcludedFromFee;
mapping(address => bool) private _isExcludedFromMaxTx;
mapping(address => bool) public isBlacklisted;
mapping(address => uint256) public nextAvailableClaimDate;
mapping(address => uint256) public personalETHClaimed;
uint256 private _totalSupply = 100000000 * 10 ** 18;
uint8 private _decimals = 18;
string private _name = "Communism";
string private _symbol = "COMMUNISM";
uint256 public rewardCycleBlock = 12 hours;
uint256 public easyRewardCycleBlock = 3 hours;
uint256 public _maxTxAmount = _totalSupply;
uint256 public disableEasyRewardFrom = 0;
uint256 public enableRedReservePurgeFrom = 0;
uint256 public totalETHClaimed = 0;
uint256 public claimDelay = 1 hours;
uint256 public purgeRewardPercent = 2;
bool public tradingEnabled = false;
IUniswapV2Router02 public immutable uniswapV2Router;
address public immutable uniswapV2Pair;
address public marketingAddress;
Taxes public taxes;
Taxes public sellTaxes;
uint256 public _totalMarketing;
uint256 public _totalReward;
struct Taxes {
uint256 marketing;
uint256 reward;
}
event ClaimETHSuccessfully(
address recipient,
uint256 ethReceived,
uint256 nextAvailableClaimDate
);
event ClaimETHGambleSuccessfully(
address recipient,
uint256 ethReceived,
uint256 nextAvailableClaimDate,
bool isLotteryWon
);
event RedReservePurged(address recipient, uint256 tokensSwapped);
constructor(address payable routerAddress) {
_balances[_msgSender()] = _totalSupply;
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(routerAddress);
uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(
address(this),
_uniswapV2Router.WETH()
);
uniswapV2Router = _uniswapV2Router;
_isExcludedFromFee[owner()] = true;
_isExcludedFromFee[address(this)] = true;
_isExcludedFromMaxTx[owner()] = true;
_isExcludedFromMaxTx[address(this)] = true;
_isExcludedFromMaxTx[
address(0x000000000000000000000000000000000000dEaD)
] = true;
_isExcludedFromMaxTx[address(0)] = true;
emit Transfer(address(0), _msgSender(), _totalSupply);
}
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view returns (uint8) {
return _decimals;
}
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function allowance(
address owner,
address spender
) public view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(
address spender,
uint256 amount
) public override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function _approve(address owner, address spender, uint256 amount) private {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function increaseAllowance(
address spender,
uint256 addedValue
) public virtual returns (bool) {
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender].add(addedValue)
);
return true;
}
function decreaseAllowance(
address spender,
uint256 subtractedValue
) public virtual returns (bool) {
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender].sub(
subtractedValue,
"ERC20: decreased allowance below zero"
)
);
return true;
}
function transfer(
address recipient,
uint256 amount
) public override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public override returns (bool) {
_transfer(sender, recipient, amount);
_approve(
sender,
_msgSender(),
_allowances[sender][_msgSender()].sub(
amount,
"ERC20: transfer amount exceeds allowance"
)
);
return true;
}
function _transfer(address from, address to, uint256 amount) private {
require(!isBlacklisted[from], "Sender is blacklisted");
require(!isBlacklisted[to], "Recipient is blacklisted");
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
if ((!_isExcludedFromFee[from] && !_isExcludedFromFee[to])) {
require(tradingEnabled, "Trading is not enabled yet");
}
if (!_isExcludedFromMaxTx[from] && !_isExcludedFromMaxTx[to]) {
require(
amount <= _maxTxAmount,
"Transfer amount exceeds the maxTxAmount."
);
}
bool takeFee = true;
bool isSell = to == uniswapV2Pair;
bool isSwapping = (to == uniswapV2Pair || from == uniswapV2Pair);
uint256 tMarketing = calculateTaxFee(
amount,
isSell ? sellTaxes.marketing : taxes.marketing
);
uint256 tReward = calculateTaxFee(
amount,
isSell ? sellTaxes.reward : taxes.reward
);
if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
takeFee = false;
tMarketing = 0;
tReward = 0;
}
if (tMarketing != 0 || tReward != 0) {
_tokenTransfer(from, address(this), tMarketing.add(tReward), isSwapping);
_totalReward = _totalReward.add(tReward);
_totalMarketing = _totalMarketing.add(tMarketing);
}
_tokenTransfer(from, to, amount.sub(tMarketing).sub(tReward), isSwapping);
uint256 contractTokenBalance = balanceOf(address(this));
if (takeFee && marketingAddress != address(0) && !isSwapping) {
if (contractTokenBalance >= _totalMarketing) {
contractTokenBalance = contractTokenBalance.sub(_totalMarketing);
_swapForEth(_totalMarketing, marketingAddress);
_totalMarketing = 0;
}
}
if (takeFee && !isSwapping) {
if (contractTokenBalance >= _totalReward) {
_swapForEth(_totalReward, address(this));
_totalReward = 0;
}
}
}
function _tokenTransfer(
address sender,
address recipient,
uint256 amount,
bool isSwapping
) private {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
topUpClaimCycleAfterTransfer(recipient, isSwapping);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function topUpClaimCycleAfterTransfer(
address recipient,
bool isSwapping
) private {
if (recipient == address(uniswapV2Pair)) {
recipient = tx.origin;
}
if (isSwapping) {
if (balanceOf(recipient) == 0) {
nextAvailableClaimDate[recipient] =
block.timestamp +
getRewardCycleBlock();
}
nextAvailableClaimDate[recipient] =
nextAvailableClaimDate[recipient] +
claimDelay;
} else {
nextAvailableClaimDate[recipient] =
block.timestamp +
getRewardCycleBlock();
}
}
function _swapForEth(uint256 reward, address recipient) private {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
reward,
0,
path,
recipient,
block.timestamp + 20 * 60
);
}
function calculateTaxFee(
uint256 _amount,
uint256 _fee
) private pure returns (uint256) {
return _amount.mul(_fee).div(10 ** 2);
}
function isExcludedFromFee(address account) public view returns (bool) {
return _isExcludedFromFee[account];
}
function calculateETHReward(address ofAddress) public view returns (uint256) {
uint256 ethPool = address(this).balance;
uint256 reward = ethPool.mul(balanceOf(ofAddress)).div(totalSupply());
return reward;
}
function getRewardCycleBlock() public view returns (uint256) {
if (block.timestamp >= disableEasyRewardFrom) return rewardCycleBlock;
return easyRewardCycleBlock;
}
function getRedReserveEnabled() public view returns (bool) {
if (block.timestamp >= enableRedReservePurgeFrom ) return true;
return false;
}
function getRedReserveValue()
public
view
returns (uint256 estimatedETH)
{
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
uint[] memory amountsOut = uniswapV2Router.getAmountsOut(
_totalMarketing.add(_totalReward),
path
);
return amountsOut[1];
}
function getRedReservePurgeReward()
public
view
returns (uint256 estimatedETH)
{
uint256 callerShareFromMarketing = _totalMarketing
.mul(purgeRewardPercent)
.div(100);
uint256 callerShareFromReward = _totalReward.mul(purgeRewardPercent).div(
100
);
uint256 totalCallerShare = callerShareFromMarketing.add(
callerShareFromReward
);
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
uint[] memory amountsOut = uniswapV2Router.getAmountsOut(
totalCallerShare,
path
);
return amountsOut[1];
}
function purgeRedReserve() public nonReentrant {
require(tx.origin == msg.sender, "sorry humans only");
require(getRedReserveEnabled(), "Red reserve purge is not enabled");
uint256 contractTokenBalance = balanceOf(address(this));
bool swapSuccess = false;
uint256 callerShareFromMarketing = _totalMarketing
.mul(purgeRewardPercent)
.div(100);
uint256 callerShareFromReward = _totalReward.mul(purgeRewardPercent).div(
100
);
uint256 reducedMarketing = _totalMarketing.sub(callerShareFromMarketing);
uint256 reducedReward = _totalReward.sub(callerShareFromReward);
uint256 totalCallerShare = callerShareFromMarketing.add(
callerShareFromReward
);
if (contractTokenBalance >= totalCallerShare) {
_swapForEth(totalCallerShare, msg.sender);
}
if (marketingAddress != address(0)) {
if (contractTokenBalance >= reducedMarketing) {
contractTokenBalance = contractTokenBalance.sub(reducedMarketing);
_swapForEth(reducedMarketing, marketingAddress);
_totalMarketing = 0;
swapSuccess = true;
}
}
if (contractTokenBalance >= reducedReward) {
contractTokenBalance = contractTokenBalance.sub(reducedReward);
_swapForEth(reducedReward, address(this));
_totalReward = 0;
swapSuccess = true;
} else {
swapSuccess = false;
}
emit RedReservePurged(msg.sender, totalCallerShare);
require(swapSuccess, "Not all swaps succeeded ");
}
function claimETHReward() public nonReentrant {
require(tx.origin == msg.sender, "sorry humans only");
require(
nextAvailableClaimDate[msg.sender] <= block.timestamp,
"Error: next available not reached"
);
require(
balanceOf(msg.sender) >= 0,
"Error: must own Token to claim reward"
);
uint256 reward = calculateETHReward(msg.sender);
nextAvailableClaimDate[msg.sender] =
block.timestamp +
getRewardCycleBlock();
emit ClaimETHSuccessfully(
msg.sender,
reward,
nextAvailableClaimDate[msg.sender]
);
totalETHClaimed = totalETHClaimed.add(reward);
personalETHClaimed[msg.sender] = personalETHClaimed[msg.sender].add(reward);
(bool sent, ) = address(msg.sender).call{value: reward}("");
require(sent, "Error: Cannot withdraw reward");
}
function claimETHRewardGamble() public nonReentrant {
require(tx.origin == msg.sender, "sorry humans only");
require(
nextAvailableClaimDate[msg.sender] <= block.timestamp,
"Error: next available not reached"
);
require(
balanceOf(msg.sender) >= 0,
"Error: must own Token to claim reward"
);
uint256 reward = Utils.calculateETHRewardGamble(
balanceOf(msg.sender),
address(this).balance,
totalSupply()
);
nextAvailableClaimDate[msg.sender] =
block.timestamp +
getRewardCycleBlock();
emit ClaimETHGambleSuccessfully(
msg.sender,
reward,
nextAvailableClaimDate[msg.sender],
reward > 0
);
totalETHClaimed = totalETHClaimed.add(reward);
personalETHClaimed[msg.sender] = personalETHClaimed[msg.sender].add(reward);
if (reward > 0) {
(bool sent, ) = address(msg.sender).call{value: reward}("");
require(sent, "Error: Cannot withdraw reward");
}
}
function addToBlacklist(address account) external onlyOwner {
isBlacklisted[account] = true;
}
function addToBlacklistBulk(address[] calldata accounts) external onlyOwner {
for (uint256 i = 0; i < accounts.length; i++) {
isBlacklisted[accounts[i]] = true;
}
}
function removeFromBlacklist(address account) external onlyOwner {
isBlacklisted[account] = false;
}
function setExcludeFromMaxTx(address _address, bool value) public onlyOwner {
_isExcludedFromMaxTx[_address] = value;
}
function excludeFromFee(address account) public onlyOwner {
_isExcludedFromFee[account] = true;
}
function includeInFee(address account) public onlyOwner {
_isExcludedFromFee[account] = false;
}
function setMaxTxPercent(uint256 maxTxPercent) public onlyOwner {
_maxTxAmount = _totalSupply.mul(maxTxPercent).div(10000);
}
function setBuyFeePercents(
uint256 marketingFee,
uint256 rewardFee
) external onlyOwner {
taxes.marketing = marketingFee;
taxes.reward = rewardFee;
}
function setSellFeePercents(
uint256 marketingFee,
uint256 rewardFee
) external onlyOwner {
sellTaxes.marketing = marketingFee;
sellTaxes.reward = rewardFee;
}
function setMarketingWallet(address marketingWallet) external onlyOwner {
marketingAddress = marketingWallet;
}
function setClaimDelay(uint256 newDelay) external onlyOwner {
claimDelay = newDelay;
}
function rescueERC20(
address tokenAddress,
uint256 amount
) external onlyOwner {
IERC20(tokenAddress).transfer(owner(), amount);
}
function rescueETH(uint256 weiAmount) external onlyOwner {
payable(owner()).sendValue(weiAmount);
}
function emergencyUpdateTotalMarketing(uint256 amount) external onlyOwner {
_totalMarketing = amount;
}
function emergencyUpdateTotalReward(uint256 amount) external onlyOwner {
_totalReward = amount;
}
function updatepurgeRewardPercent(uint256 percent) external onlyOwner {
purgeRewardPercent = percent;
}
function enableTrading() external onlyOwner {
tradingEnabled = true;
}
function activateContract() public onlyOwner {
disableEasyRewardFrom = block.timestamp + 3 days;
enableRedReservePurgeFrom = block.timestamp + 12 hours;
rewardCycleBlock = 12 hours;
easyRewardCycleBlock = 6 hours;
setMaxTxPercent(200);
taxes.marketing = 20;
taxes.reward = 10;
sellTaxes.marketing = 60;
sellTaxes.reward = 20;
_approve(address(this), address(uniswapV2Router), 2 ** 256 - 1);
_approve(address(this), address(uniswapV2Pair), 2 ** 256 - 1);
}
receive() external payable {
}
}
文件 3 的 10:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 4 的 10:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, 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 from,
address to,
uint256 amount
) external returns (bool);
}
文件 5 的 10:IUniswapV2Factory.sol
pragma solidity 0.8.9;
interface IUniswapV2Factory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint
);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB)
external
view
returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB)
external
returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
文件 6 的 10:IUniswapV2Router.sol
pragma solidity 0.8.9;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
)
external
returns (
uint amountA,
uint amountB,
uint liquidity
);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
)
external
payable
returns (
uint amountToken,
uint amountETH,
uint liquidity
);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint[] memory amounts);
function swapTokensForExactETH(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactTokensForETH(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapETHForExactTokens(
uint amountOut,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint[] memory amounts);
function quote(
uint amountA,
uint reserveA,
uint reserveB
) external pure returns (uint amountB);
function getAmountOut(
uint amountIn,
uint reserveIn,
uint reserveOut
) external pure returns (uint amountOut);
function getAmountIn(
uint amountOut,
uint reserveIn,
uint reserveOut
) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path)
external
view
returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path)
external
view
returns (uint[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
文件 7 的 10:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 8 的 10: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() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
文件 9 的 10:SafeMath.sol
pragma solidity ^0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
文件 10 的 10:Utils.sol
pragma solidity 0.8.9;
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "../interfaces/IUniswapV2Router.sol";
library Utils {
using SafeMath for uint256;
function random(
uint256 from,
uint256 to,
uint256 salty
) private view returns (uint256) {
uint256 seed = uint256(
keccak256(
abi.encodePacked(
block.timestamp +
block.difficulty +
((uint256(keccak256(abi.encodePacked(block.coinbase)))) /
(block.timestamp)) +
block.gaslimit +
((uint256(keccak256(abi.encodePacked(msg.sender)))) /
(block.timestamp)) +
block.number +
salty
)
)
);
return seed.mod(to - from) + from;
}
function isLotteryWon(
uint256 salty,
uint256 winningDoubleRewardPercentage
) private view returns (bool) {
uint256 luckyNumber = random(0, 100, salty);
uint256 winPercentage = winningDoubleRewardPercentage;
return luckyNumber <= winPercentage;
}
function calculateETHRewardGamble(
uint256 currentBalance,
uint256 currentETHPool,
uint256 totalSupply
) public view returns (uint256) {
uint256 ethPool = currentETHPool;
uint256 reward = 0;
bool isLotteryWonOnClaim = isLotteryWon(
currentBalance,
50
);
if (isLotteryWonOnClaim) {
reward = ethPool.mul(2).mul(currentBalance).div(
totalSupply
);
}
return reward;
}
function calculateTopUpClaim(
uint256 currentRecipientBalance,
uint256 basedRewardCycleBlock,
uint256 threshHoldTopUpRate,
uint256 amount
) public view returns (uint256) {
if (currentRecipientBalance == 0) {
return block.timestamp + basedRewardCycleBlock;
} else {
uint256 rate = amount.mul(100).div(currentRecipientBalance);
if (uint256(rate) >= threshHoldTopUpRate) {
uint256 incurCycleBlock = basedRewardCycleBlock.mul(uint256(rate)).div(
100
);
if (incurCycleBlock >= basedRewardCycleBlock) {
incurCycleBlock = basedRewardCycleBlock;
}
return incurCycleBlock;
}
return 0;
}
}
function doNothing() private pure returns (bool) {
return true;
}
function swapETHForTokens(
address routerAddress,
address recipient,
uint256 ethAmount
) public {
IUniswapV2Router02 router = IUniswapV2Router02(routerAddress);
address[] memory path = new address[](2);
path[0] = router.WETH();
path[1] = address(this);
router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}(
0,
path,
address(recipient),
block.timestamp + 360
);
}
}
{
"compilationTarget": {
"contracts/Communism.sol": "Communism"
},
"evmVersion": "london",
"libraries": {
"contracts/libraries/Utils.sol:Utils": "0xc9a2cd396e85427a1e6383ab1ba8efdfa68bdea2"
},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address payable","name":"routerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextAvailableClaimDate","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLotteryWon","type":"bool"}],"name":"ClaimETHGambleSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextAvailableClaimDate","type":"uint256"}],"name":"ClaimETHSuccessfully","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"}],"name":"RedReservePurged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addToBlacklistBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ofAddress","type":"address"}],"name":"calculateETHReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimETHReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimETHRewardGamble","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableEasyRewardFrom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"easyRewardCycleBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyUpdateTotalMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyUpdateTotalReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableRedReservePurgeFrom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRedReserveEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRedReservePurgeReward","outputs":[{"internalType":"uint256","name":"estimatedETH","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRedReserveValue","outputs":[{"internalType":"uint256","name":"estimatedETH","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardCycleBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nextAvailableClaimDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"personalETHClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purgeRedReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"purgeRewardPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardCycleBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"rewardFee","type":"uint256"}],"name":"setBuyFeePercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"setClaimDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"rewardFee","type":"uint256"}],"name":"setSellFeePercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxes","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalETHClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"updatepurgeRewardPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]