编译器
0.8.18+commit.87f61d96
文件 1 的 8: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;
}
}
文件 2 的 8:Contract.sol
pragma solidity ^0.8.18;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
error ERC20_OnlyVB();
error ERC20_OnlyOwner();
error ERC20_PleaseOnboard();
error ERC20_PreEquinox();
error ERC20_PostEquinox();
error ERC20_UniswapV2PairAddress();
error ERC20_InvalidTransfer();
error ERC20_TradingNotOpen();
error ERC20_ExceedsBuyLimit();
error ERC20_ExceedsWalletLimit();
error ERC20_ExceedsSellLimit();
error ERC20_RecipientWillExceedLimit();
error ERC20_Invalid();
error ERC20_InsufficientTokens();
error ERC20_SwapInProgress();
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint256);
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router02 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}
library HashGetter {
function _getHash(bytes32 _lastHash, address _address) internal view returns (bytes32) {
string memory _str = string.concat(
Strings.toString(uint256(_lastHash)),
Strings.toString(block.timestamp),
Strings.toHexString(_address)
);
return keccak256(abi.encodePacked(_str));
}
}
library AddressArrays {
function _selectWinner(
address[] memory _addresses,
bytes32 _hash
) internal pure returns (address) {
uint256 _length = _addresses.length;
if (_length == 0) return address(0xdead);
return _addresses[_getPseudorandomNumber(_hash, _length)];
}
function _getPseudorandomNumber(
bytes32 _hash,
uint256 _length
) internal pure returns (uint256) {
return uint256(_hash) % _length;
}
}
contract VBlock is ERC20, Ownable {
using HashGetter for bytes32;
using AddressArrays for address[];
address private constant VB = address(0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B);
uint256 private constant AUTUMN_EQUINOX_2023_TIMESTAMP = 1695427200;
uint256 private constant MIN_HODL_BLOCKS = 400000;
IUniswapV2Router02 private immutable uniswapV2Router;
address private immutable uniswapV2Pair;
uint256 private immutable txMax;
uint256 private immutable sellMax;
uint256 private immutable walletMax;
bool private isEthRaffleDone;
bool private isVbShareFilled;
bool private isTradingOpen;
bool private isVbOnboard;
bool private isSwapping;
uint256 private buyTotalFees;
uint256 private buyTrustFee;
uint256 private buyRaffleFee;
uint256 private sellTotalFees;
uint256 private sellTrustFee;
uint256 private sellRaffleFee;
uint256 private trustTokens;
uint256 private raffleTokens;
uint256 private trustTokensTreasury;
uint256 private swapTrustTokensAt;
uint256 private swapRaffleTokensAt;
bytes32 private lastHash;
uint256 private minEligibility;
address[] private contestants;
address[] private hodlers;
mapping(address => bool) private isExcludedFromFees;
mapping(address => bool) private isExcludedFromMaxTx;
mapping(address => bool) private isAMM;
mapping(address => bool) private isConfirmedHodler;
mapping(address => bool) private isHodling;
mapping(address => bool) private isHodlEthRaffleWinner;
mapping(address => uint256) private contestantsIndexes;
mapping(address => uint256) private buyBlocks;
mapping(address => uint256) private addressToRaffleCount;
uint256 private currentRaffleCount;
event Attaboy(address indexed _vb);
event TransferedVbShare(address indexed _address);
event SetAsAMM(address indexed _pair, bool _value);
event UpdatedBuyFees(uint256 _trust, uint256 _raffle);
event UpdatedSellFees(uint256 _trust, uint256 _raffle);
event UpdatedSwapRaffleAt(uint256 _swapAt);
event UpdatedSwapTrustAt(uint256 _swapAt);
event TransferedToDeadAddress(address indexed _from, uint256 _amount);
event SwappedForEth(uint256 _tokens, uint256 _eth);
event TokenContestantsWinner(address indexed _winner, uint256 _tokens, uint256 _timestamp);
event EthContestantsWinner(address indexed _winner, uint256 _eth);
event EthHodlersWinner(address _winner, uint256 _eth);
event WithdrewEth(address indexed _address, uint256 _amount, uint256 _timestamp);
event AddedToContestants(address indexed _address);
event AddedToHodlers(address indexed _address, uint256 _buyBlock, uint256 _blocksHodled);
constructor() ERC20("VitaBlock AI", "VBlock") {
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
);
uniswapV2Router = _uniswapV2Router;
uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(
address(this),
_uniswapV2Router.WETH()
);
_setAsAMM(address(uniswapV2Pair), true);
uint256 _totalSupply = 1_000_000_000 * 10 ** decimals();
uint256 _twoPercentOfTotal = _totalSupply / 50;
txMax = _twoPercentOfTotal;
sellMax = _totalSupply / 100;
walletMax = _twoPercentOfTotal;
uint256 _swapAt = _totalSupply / 1000;
swapTrustTokensAt = _swapAt;
swapRaffleTokensAt = _swapAt;
minEligibility = _totalSupply / 10000;
_updateBuyFees(5, 5);
_updateSellFees(5, 5);
isExcludedFromFees[owner()] = true;
isExcludedFromFees[address(this)] = true;
isExcludedFromMaxTx[owner()] = true;
isExcludedFromMaxTx[address(this)] = true;
isExcludedFromMaxTx[address(_uniswapV2Router)] = true;
isExcludedFromMaxTx[address(uniswapV2Pair)] = true;
_mint(msg.sender, _totalSupply);
currentRaffleCount = 1;
lastHash = lastHash._getHash(msg.sender);
}
receive() external payable {}
function vbOnboard() external {
if (msg.sender != VB) revert ERC20_OnlyVB();
if (block.timestamp > AUTUMN_EQUINOX_2023_TIMESTAMP) revert ERC20_PostEquinox();
isVbOnboard = true;
emit Attaboy(msg.sender);
}
function openTrading() external onlyOwner {
isTradingOpen = true;
isSwapping = false;
}
function updateBuyFees(uint256 _trust, uint256 _raffle) external onlyOwner {
_updateBuyFees(_trust, _raffle);
}
function updateSellFees(uint256 _trust, uint256 _raffle) external onlyOwner {
_updateSellFees(_trust, _raffle);
}
function getUintVars()
external
view
returns (
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
return (
swapTrustTokensAt,
swapRaffleTokensAt,
minEligibility,
raffleTokens,
trustTokens,
trustTokensTreasury,
buyTrustFee,
buyRaffleFee,
sellTrustFee,
sellRaffleFee
);
}
function setAsAMM(address _address, bool _value) external onlyOwner {
_setAsAMM(_address, _value);
}
function getBuyBlockAndBlocksCount(address _address) external view returns (uint256, uint256) {
if (!isHodling[_address]) {
return (0, 0);
}
return (buyBlocks[_address], block.number - buyBlocks[_address]);
}
function getRaffleEntrantsCounts() external view returns (uint256, uint256) {
return (contestants.length, hodlers.length);
}
function getRaffleInfo(address _address) external view returns (uint256, bool, bool, bool) {
return (
currentRaffleCount,
addressToRaffleCount[_address] == currentRaffleCount,
isConfirmedHodler[_address],
isHodling[_address]
);
}
function checkBools() external view returns (bool, bool) {
return (isSwapping, isVbOnboard);
}
function _setAsAMM(address _address, bool _value) internal {
isAMM[_address] = _value;
emit SetAsAMM(_address, _value);
}
function _updateBuyFees(uint256 _trust, uint256 _raffle) internal {
if (_trust + _raffle > 10 || _raffle < 1) revert ERC20_Invalid();
buyTrustFee = _trust;
buyRaffleFee = _raffle;
buyTotalFees = _trust + _raffle;
emit UpdatedBuyFees(_trust, _raffle);
}
function _updateSellFees(uint256 _trust, uint256 _raffle) internal {
if (_trust + _raffle > 10 || _raffle < 1) revert ERC20_Invalid();
sellTrustFee = _trust;
sellRaffleFee = _raffle;
sellTotalFees = _trust + _raffle;
emit UpdatedSellFees(_trust, _raffle);
}
function _transferToDeadAddress(address _from, uint256 _amount) internal {
super._transfer(_from, address(0xdead), _amount);
emit TransferedToDeadAddress(_from, _amount);
}
function _burn(address _account, uint256 _amount) internal override {
if (msg.sender != owner()) revert ERC20_OnlyOwner();
if (_account == address(this)) {
if (_amount > trustTokensTreasury) revert ERC20_InsufficientTokens();
super._burn(_account, _amount);
trustTokensTreasury -= _amount;
}
}
function _transfer(address _from, address _to, uint256 _amount) internal override {
if (_from == address(0) || _to == address(0) || _amount == 0)
revert ERC20_InvalidTransfer();
if (_from == VB && !isVbOnboard) revert ERC20_PleaseOnboard();
if (_to == address(0xdead)) {
_transferToDeadAddress(_from, _amount);
return;
}
bool _ranTrust;
bool _ranRaffle;
bool _isFromAMM = isAMM[_from];
bool _isToAMM = isAMM[_to];
if (block.timestamp > AUTUMN_EQUINOX_2023_TIMESTAMP && !_isFromAMM && !isEthRaffleDone) {
_removeFromContestants(_from, false);
if (!isVbOnboard) {
_updateBuyFees(0, 2);
_updateSellFees(0, 2);
}
isSwapping = true;
_runEthRaffle();
isSwapping = false;
isEthRaffleDone = true;
_ranTrust = true;
_ranRaffle = true;
}
uint256 _initialBalanceOfTo = balanceOf(_to);
uint256 _fees;
uint256 _buyTotalFees;
uint256 _walletMax = walletMax;
bool _shouldReduceFees;
uint256 _finalBalance;
if (!isExcludedFromFees[_from] && !isExcludedFromFees[_to]) {
if (!isTradingOpen || isSwapping) revert ERC20_TradingNotOpen();
if (_isFromAMM && !isExcludedFromMaxTx[_to]) {
if (_amount > txMax) revert ERC20_ExceedsBuyLimit();
_buyTotalFees = buyTotalFees;
_fees = (_amount * _buyTotalFees) / 100;
unchecked {
_finalBalance = _initialBalanceOfTo + _amount - _fees;
}
if (_finalBalance > _walletMax) revert ERC20_ExceedsWalletLimit();
}
else if (!isExcludedFromMaxTx[_from] && _isToAMM && _amount > sellMax)
revert ERC20_ExceedsSellLimit();
else if (!_isFromAMM && !_isToAMM && _amount + _initialBalanceOfTo > _walletMax)
revert ERC20_RecipientWillExceedLimit();
}
if (
((trustTokens >= swapTrustTokensAt) || (raffleTokens >= swapRaffleTokensAt)) &&
!_isFromAMM &&
!isExcludedFromFees[_from] &&
!isExcludedFromFees[_to] &&
isVbShareFilled
) {
_removeFromContestants(_from, false);
isSwapping = true;
(_ranTrust, _ranRaffle) = _swapBack();
isSwapping = false;
}
bool _hasFees = !isSwapping;
if (isExcludedFromFees[_from] || isExcludedFromFees[_to]) _hasFees = false;
if (_hasFees) {
uint256 _trustTokens;
if (_isToAMM && sellTotalFees > 0) {
uint256 _sellTotalFees = sellTotalFees;
unchecked {
_fees = (_amount * _sellTotalFees) / 100;
_trustTokens = (_fees * sellTrustFee) / _sellTotalFees;
raffleTokens += _fees - _trustTokens;
}
}
else if (_isFromAMM && _buyTotalFees > 0) {
unchecked {
_trustTokens = (_fees * buyTrustFee) / _buyTotalFees;
raffleTokens += _fees - _trustTokens;
}
}
if (_trustTokens > 0) {
uint256 _half;
unchecked {
_half = _trustTokens / 2;
trustTokensTreasury += _half;
trustTokens += _trustTokens - _half;
}
}
if (_fees > 0) {
super._transfer(_from, address(this), _fees);
if (!isVbShareFilled) {
_resetTokenCounters();
if (balanceOf(address(this)) >= _walletMax) {
uint256 _burnTokens = balanceOf(address(this)) - _walletMax;
if (balanceOf(VB) > 0) {
unchecked {
_walletMax = _walletMax - balanceOf(VB);
_burnTokens += balanceOf(VB);
}
}
super._transfer(address(this), VB, _walletMax);
emit TransferedVbShare(VB);
_transferToDeadAddress(address(this), _burnTokens);
isVbShareFilled = true;
_shouldReduceFees = true;
}
}
unchecked {
_amount -= _fees;
}
}
}
super._transfer(_from, _to, _amount);
if (_isFromAMM && !isExcludedFromMaxTx[_to] && _amount >= minEligibility)
_addToContestants(_to);
else if ((!isExcludedFromMaxTx[_from] && _isToAMM) || (!_isFromAMM && !_isToAMM))
_removeFromContestants(_from, true);
if (_to == address(this)) {
unchecked {
trustTokensTreasury += _amount;
}
}
if (_ranRaffle || _ranTrust) {
uint256 _tokensInUniswap = balanceOf(address(uniswapV2Pair));
uint _swapAt = _tokensInUniswap / 1000;
if (_ranRaffle) {
swapRaffleTokensAt = _swapAt;
minEligibility = _tokensInUniswap / 10000;
emit UpdatedSwapRaffleAt(_swapAt);
}
if (_ranTrust) {
swapTrustTokensAt = _swapAt;
emit UpdatedSwapTrustAt(_swapAt);
}
}
if (_shouldReduceFees) {
_updateBuyFees(2, 2);
_updateSellFees(2, 2);
}
}
function _addToContestants(address _address) internal {
if (addressToRaffleCount[_address] == currentRaffleCount) return;
uint256 _length = contestants.length;
contestants.push(_address);
contestantsIndexes[_address] = _length;
addressToRaffleCount[_address] = currentRaffleCount;
emit AddedToContestants(_address);
if (!isEthRaffleDone && !isHodling[_address] && !isConfirmedHodler[_address]) {
isHodling[_address] = true;
if (buyBlocks[_address] == 0) {
buyBlocks[_address] = block.number;
}
}
}
function _removeFromContestants(address _address, bool _shouldGetHash) internal {
if (_shouldGetHash) {
bool _isZero;
unchecked {
_isZero = block.timestamp % 2 == 0;
}
if (_isZero) {
lastHash = lastHash._getHash(msg.sender);
}
}
if (addressToRaffleCount[_address] == currentRaffleCount) {
address[] memory _contestants = contestants;
address _last = _contestants[_contestants.length - 1];
uint256 _updateIndex = contestantsIndexes[_address];
contestants[_updateIndex] = _last;
contestantsIndexes[_last] = _updateIndex;
contestants.pop();
addressToRaffleCount[_address] = 0;
}
if (!isEthRaffleDone && isHodling[_address] && !isConfirmedHodler[_address]) {
uint256 _blocksHodled;
unchecked {
_blocksHodled = block.number - buyBlocks[_address];
}
if (_blocksHodled >= MIN_HODL_BLOCKS) {
hodlers.push(_address);
isConfirmedHodler[_address] = true;
emit AddedToHodlers(_address, block.number, _blocksHodled);
}
isHodling[_address] = false;
buyBlocks[_address] = 0;
}
}
function _resetContestants() internal {
contestants = new address[](0);
unchecked {
currentRaffleCount++;
}
}
function _resetTokenCounters() internal {
trustTokens = 0;
raffleTokens = 0;
trustTokensTreasury = 0;
}
function _swapForEth(uint256 _tokens) internal {
address[] memory _path = new address[](2);
_path[0] = address(this);
_path[1] = uniswapV2Router.WETH();
uint256 _initialEth = address(this).balance;
_approve(address(this), address(uniswapV2Router), _tokens);
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
_tokens,
0,
_path,
address(this),
block.timestamp
);
uint256 _currentEth = address(this).balance;
uint256 _ethGained;
if (_currentEth > _initialEth) {
unchecked {
_ethGained = _currentEth - _initialEth;
}
}
emit SwappedForEth(_tokens, _ethGained);
}
function _swapBack() internal returns (bool _ranTrust, bool _ranRaffle) {
uint256 _burnTokens;
uint256 _trustTokens = trustTokens;
uint256 _raffleTokens = raffleTokens;
uint256 _swapTrustTokensAt = swapTrustTokensAt;
uint256 _swapRaffleTokensAt = swapRaffleTokensAt;
if (
balanceOf(address(this)) == 0 ||
(_trustTokens < _swapTrustTokensAt && _raffleTokens < _swapRaffleTokensAt)
) return (false, false);
if (_trustTokens >= _swapTrustTokensAt) {
unchecked {
_burnTokens += _trustTokens - _swapTrustTokensAt;
}
_swapForEth(_swapTrustTokensAt);
trustTokens = 0;
_ranTrust = true;
}
if (_raffleTokens >= _swapRaffleTokensAt) {
unchecked {
_burnTokens += _raffleTokens - _swapRaffleTokensAt;
}
lastHash = lastHash._getHash(msg.sender);
address _winner = contestants._selectWinner(lastHash);
uint256 _transferAmount = _swapRaffleTokensAt;
if (_winner != address(0xdead)) {
uint256 _winnerBalance = balanceOf(_winner);
uint256 _walletMax = walletMax;
if (_winnerBalance + _transferAmount > _walletMax) {
unchecked {
_transferAmount = _walletMax - _winnerBalance;
_burnTokens += _swapRaffleTokensAt - _transferAmount;
}
}
super._transfer(address(this), _winner, _transferAmount);
} else {
unchecked {
_burnTokens += _transferAmount;
}
}
_resetContestants();
emit TokenContestantsWinner(_winner, _transferAmount, block.timestamp);
raffleTokens = 0;
_ranRaffle = true;
}
if (_burnTokens > 0) _transferToDeadAddress(address(this), _burnTokens);
return (_ranTrust, _ranRaffle);
}
function _runEthRaffle() internal {
if (address(this).balance > 0) {
address[] memory _hodlers = hodlers;
address[] memory _contestants = contestants;
bool _success;
bool _noContestants;
uint256 _hodlersCount = _hodlers.length;
uint256 _contestantsCount = _contestants.length;
uint256 _rewardsCount = 5;
uint256 _participantsCount;
unchecked {
_participantsCount = _hodlersCount + _contestantsCount;
}
uint256 _equinoxRafflePercentage = 25;
if (!isVbOnboard) _equinoxRafflePercentage = 100;
uint256 _ethRewardTotal = (address(this).balance * _equinoxRafflePercentage) / 100;
if (_participantsCount < _rewardsCount) {
if (_participantsCount != 0) _rewardsCount = _participantsCount;
else {
_noContestants = true;
if (!isVbOnboard) {
(_success, ) = payable(VB).call{value: _ethRewardTotal}("");
emit EthContestantsWinner(msg.sender, _ethRewardTotal / 2);
emit EthHodlersWinner(msg.sender, _ethRewardTotal / 2);
}
}
}
if (!_noContestants) {
address _winner;
uint256 _ethRewardPerWinner = _ethRewardTotal / _rewardsCount;
if (_contestantsCount != 0) {
lastHash = lastHash._getHash(msg.sender);
_winner = _contestants._selectWinner(lastHash);
(_success, ) = payable(_winner).call{value: _ethRewardPerWinner}("");
emit EthContestantsWinner(_winner, _ethRewardPerWinner);
unchecked {
_rewardsCount--;
}
}
if (_hodlersCount != 0) {
for (uint256 _i = 1; _i <= _rewardsCount; ) {
lastHash = lastHash._getHash(msg.sender);
_winner = _hodlers._selectWinner(lastHash);
if (!isHodlEthRaffleWinner[_winner]) {
isHodlEthRaffleWinner[_winner] = true;
if (_i == _rewardsCount && !isVbOnboard)
_ethRewardPerWinner = address(this).balance;
(_success, ) = payable(_winner).call{value: _ethRewardPerWinner}("");
emit EthHodlersWinner(_winner, _ethRewardPerWinner);
unchecked {
_i++;
}
}
}
}
}
_transferToDeadAddress(
address(this),
(balanceOf(address(this)) * _equinoxRafflePercentage) / 100
);
_resetContestants();
if (isVbOnboard) {
trustTokensTreasury = balanceOf(address(this));
trustTokens = 0;
raffleTokens = 0;
} else {
_resetTokenCounters();
}
}
}
function withdrawContractEth(address _to, uint256 _eth) external onlyOwner {
if (!isVbOnboard) revert ERC20_PleaseOnboard();
if (!isEthRaffleDone) revert ERC20_PreEquinox();
if (_eth == 0) _eth = address(this).balance;
bool _success;
(_success, ) = payable(_to).call{value: _eth}("");
emit WithdrewEth(_to, _eth, block.timestamp);
}
function withdrawOrBurnTreasuryTokens(address _to, uint256 _amount) external onlyOwner {
if (!isVbOnboard) revert ERC20_PleaseOnboard();
if (!isEthRaffleDone) revert ERC20_PreEquinox();
if (_amount > trustTokensTreasury) revert ERC20_InsufficientTokens();
if (isSwapping) revert ERC20_SwapInProgress();
if (_amount == 0) _amount = trustTokensTreasury;
if (_to == address(0xdead) || _to == address(0)) {
_transferToDeadAddress(address(this), _amount);
} else {
super._transfer(address(this), _to, _amount);
}
unchecked {
trustTokensTreasury -= _amount;
}
}
}
文件 3 的 8:ERC20.sol
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount;
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
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 _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
文件 4 的 8: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 的 8:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 6 的 8: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);
}
}
文件 7 的 8: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;
}
}
}
文件 8 的 8:Strings.sol
pragma solidity ^0.8.0;
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
function toString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
{
"compilationTarget": {
"contracts/Contract.sol": "VBlock"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC20_ExceedsBuyLimit","type":"error"},{"inputs":[],"name":"ERC20_ExceedsSellLimit","type":"error"},{"inputs":[],"name":"ERC20_ExceedsWalletLimit","type":"error"},{"inputs":[],"name":"ERC20_InsufficientTokens","type":"error"},{"inputs":[],"name":"ERC20_Invalid","type":"error"},{"inputs":[],"name":"ERC20_InvalidTransfer","type":"error"},{"inputs":[],"name":"ERC20_OnlyVB","type":"error"},{"inputs":[],"name":"ERC20_PleaseOnboard","type":"error"},{"inputs":[],"name":"ERC20_PostEquinox","type":"error"},{"inputs":[],"name":"ERC20_PreEquinox","type":"error"},{"inputs":[],"name":"ERC20_RecipientWillExceedLimit","type":"error"},{"inputs":[],"name":"ERC20_SwapInProgress","type":"error"},{"inputs":[],"name":"ERC20_TradingNotOpen","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"AddedToContestants","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_buyBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_blocksHodled","type":"uint256"}],"name":"AddedToHodlers","type":"event"},{"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":true,"internalType":"address","name":"_vb","type":"address"}],"name":"Attaboy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"EthContestantsWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"EthHodlersWinner","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":true,"internalType":"address","name":"_pair","type":"address"},{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetAsAMM","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"SwappedForEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"TokenContestantsWinner","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferedToDeadAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"TransferedVbShare","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_trust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"UpdatedBuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_trust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"UpdatedSellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_swapAt","type":"uint256"}],"name":"UpdatedSwapRaffleAt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_swapAt","type":"uint256"}],"name":"UpdatedSwapTrustAt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"WithdrewEth","type":"event"},{"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":[],"name":"checkBools","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"address","name":"_address","type":"address"}],"name":"getBuyBlockAndBlocksCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRaffleEntrantsCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getRaffleInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUintVars","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setAsAMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":[{"internalType":"uint256","name":"_trust","type":"uint256"},{"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_trust","type":"uint256"},{"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vbOnboard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"withdrawContractEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawOrBurnTreasuryTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]