编译器
0.8.20+commit.a1b79de6
文件 1 的 9:Context.sol
pragma solidity ^0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 2 的 9:ERC20.sol
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => 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 returns (string memory) {
return _name;
}
function symbol() public view virtual returns (string memory) {
return _symbol;
}
function decimals() public view virtual returns (uint8) {
return 18;
}
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
_totalSupply -= value;
}
} else {
unchecked {
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
文件 3 的 9:IERC20.sol
pragma solidity ^0.8.20;
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 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 4 的 9:IERC20Metadata.sol
pragma solidity ^0.8.20;
import {IERC20} from "../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);
}
文件 5 的 9:Interfaces.sol
pragma solidity 0.8.20;
interface IUniswapV2Factory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);
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(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
interface IUniswapV2Pair {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(
address owner,
address spender
) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Burn(
address indexed sender,
uint256 amount0,
uint256 amount1,
address indexed to
);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves()
external
view
returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint256);
function price1CumulativeLast() external view returns (uint256);
function kLast() external view returns (uint256);
function mint(address to) external returns (uint256 liquidity);
function burn(
address to
) external returns (uint256 amount0, uint256 amount1);
function swap(
uint256 amount0Out,
uint256 amount1Out,
address to,
bytes calldata data
) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
interface IUniswapV2Router02 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
}
文件 6 的 9:Ownable.sol
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
error OwnableUnauthorizedAccount(address account);
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 7 的 9:PVP.sol
pragma solidity 0.8.20;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "./Interfaces.sol";
contract PVP is ERC20, Ownable, ReentrancyGuard {
error LiquidityAlreadyLoaded();
error InsufficientTokenBalanceForLiquidity();
error MustSendETHToAddLiquidity();
error CannotPlaceRaidOnSelf();
error ThisWalletIsExcludedFromRaids();
error ThisWalletIsOnCooldown();
error TheWalletMustBeATokenHolder();
error TooManyTokensPurchased();
error RaidCannotBeClaimedYet();
error ThereIsNoRaidOnThisWallet();
error NoTrappedETHToClaim();
error FailedToSendTrappedETH();
error TransferNotAllowedSendingWalletIsUnderRaid();
error TransferNotAllowedReceivingWalletIsUnderRaid();
error InsufficientETHSent();
error RaidMustBeGreaterThanMinimumRaidAmount();
error RaidHasAlreadyBeenSuccessful();
error YouMustMatchTheRaidBid();
error CannotOutbidYourOwnRaid();
error ThereIsNoRaidOnYourWallet();
error RaidMustBeGreaterThanWalletMinimumRaidAmount();
error NewRaidMustBeGreaterThanCurrentRaidByAtLeast10Percent();
uint public liquidityLoadedBlock;
uint256 public constant MAX_SUPPLY = 1_000_000_000 * 10 ** 18;
uint256 constant MAX_BUY = 10_000_000 * 10 ** 18;
IUniswapV2Router02 public immutable uniswapV2Router;
address public immutable uniswapV2Pair;
struct Raid {
address creator_address;
uint256 raid_price;
uint256 eth_locked;
uint256 block_expiry;
}
mapping(address => Raid) public currentRaidByAddress;
mapping(address => Raid[]) public lostRaidsByPotAddress;
mapping(address => bool) public walletsExcludedFromRaids;
mapping(address => uint256) public blockCooldownByAddress;
mapping(address => uint256) public minimumRaidAmountByWallet;
mapping(address => uint256) public ethClaimableByWallet;
address constant burnAddress = address(0);
uint256 public minimumRaidAmount;
uint256 raidBlockReset;
uint256 raidCooldown;
uint256 ethEarnedByContract;
uint256 ethForBuyback;
uint256 buybackMinimum;
event TokensTransferred(
address indexed from,
address indexed to,
uint256 amount
);
event PairCreated(address indexed pair);
event InitialLiquidityLoaded(uint256 ethAmount, uint256 tokenAmount);
event TokensBoughtAndBurned(uint256 ethAmount, uint256 tokenAmount);
event WalletExclusionUpdated(
address indexed walletAddress,
bool exclusionStatus
);
event NewRaidCreated(
address indexed walletUnderRaid,
address indexed raidCreator,
uint256 bidPrice,
uint256 ethLocked,
uint256 tokensLocked,
uint256 blockExpiry
);
event RaidPaid(
address indexed walletUnderRaid,
uint256 ethAmount,
uint256 tokensUnlocked,
uint256 blockCooldown,
uint256 minimumRaid
);
event RaidSettled(
address indexed walletUnderRaid,
address indexed raidCreator,
uint256 ethSentToRaidWallet,
uint256 tokensClaimed,
uint256 ethClaimed
);
event EthClaimAdded(address indexed claimer, uint256 amount);
event EthClaimed(address indexed claimer, uint256 amount);
event RaidBidPayout(address indexed walletAddress, uint256 ethAmount);
event RaidBidPayoutFailed(address indexed walletAddress, uint256 ethAmount);
event FailedBidsPayout(address indexed walletAddress, uint256 ethAmount);
uint256 public _feeBps = 100;
uint256 public _burnBps = 100;
constructor() ERC20("PVP", "PVP") Ownable(msg.sender) {
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24
);
uniswapV2Router = _uniswapV2Router;
uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
.createPair(address(this), _uniswapV2Router.WETH());
emit PairCreated(uniswapV2Pair);
walletsExcludedFromRaids[address(this)] = true;
walletsExcludedFromRaids[msg.sender] = true;
walletsExcludedFromRaids[address(uniswapV2Pair)] = true;
walletsExcludedFromRaids[burnAddress] = true;
emit WalletExclusionUpdated(address(this), true);
emit WalletExclusionUpdated(msg.sender, true);
emit WalletExclusionUpdated(burnAddress, true);
emit WalletExclusionUpdated(address(uniswapV2Pair), true);
minimumRaidAmount = 0.001 ether;
raidBlockReset = 25;
raidCooldown = 300;
buybackMinimum = 0.01 ether;
_mint(address(this), MAX_SUPPLY);
}
function loadLiquidity() external payable onlyOwner {
if (liquidityLoadedBlock != 0) revert LiquidityAlreadyLoaded();
uint256 tokenAmount = balanceOf(address(this));
if (tokenAmount == 0) revert InsufficientTokenBalanceForLiquidity();
if (msg.value == 0) revert MustSendETHToAddLiquidity();
_approve(address(this), address(uniswapV2Router), tokenAmount);
uniswapV2Router.addLiquidityETH{value: msg.value}(
address(this),
tokenAmount,
0,
0,
owner(),
block.timestamp
);
liquidityLoadedBlock = block.number;
emit InitialLiquidityLoaded(msg.value, tokenAmount);
}
function toggleExclusionForWallet(
address walletAddress,
bool excluded
) external onlyOwner {
walletsExcludedFromRaids[walletAddress] = excluded;
emit WalletExclusionUpdated(walletAddress, excluded);
}
function getRaidLength() public view returns (uint256) {
uint256 blocksPassed = block.number - liquidityLoadedBlock;
uint256 roundedBlocks = ((blocksPassed + 1799) / 1800) * 1800;
if (roundedBlocks > 43200) {
roundedBlocks = 43200;
}
return roundedBlocks;
}
function createRaid(address walletAddress) external payable nonReentrant {
if (msg.value < minimumRaidAmount)
revert RaidMustBeGreaterThanMinimumRaidAmount();
if (msg.value < minimumRaidAmountByWallet[walletAddress])
revert RaidMustBeGreaterThanWalletMinimumRaidAmount();
if (walletAddress == msg.sender) revert CannotPlaceRaidOnSelf();
if (walletsExcludedFromRaids[walletAddress])
revert ThisWalletIsExcludedFromRaids();
if (blockCooldownByAddress[walletAddress] >= block.number)
revert ThisWalletIsOnCooldown();
if (balanceOf(walletAddress) == 0) revert TheWalletMustBeATokenHolder();
uint256 amount_for_burn = (msg.value * _burnBps) / 10000;
uint256 amount_for_contract = (msg.value * _feeBps) / 10000;
uint256 amount_locked = msg.value -
amount_for_burn -
amount_for_contract;
if (currentRaidByAddress[walletAddress].creator_address == address(0)) {
ethEarnedByContract += amount_for_contract;
ethForBuyback += amount_for_burn;
if (ethForBuyback >= buybackMinimum) {
_buyAndBurn(ethForBuyback);
ethForBuyback = 0;
}
uint256 raidLength = getRaidLength();
uint256 blockExpiry = block.number + raidLength;
Raid memory newRaid = Raid({
creator_address: msg.sender,
raid_price: msg.value,
eth_locked: amount_locked,
block_expiry: blockExpiry
});
currentRaidByAddress[walletAddress] = newRaid;
emit NewRaidCreated(
walletAddress,
msg.sender,
msg.value,
amount_locked,
balanceOf(walletAddress),
blockExpiry
);
} else {
Raid storage currentRaid = currentRaidByAddress[walletAddress];
if (block.number > currentRaid.block_expiry)
revert RaidHasAlreadyBeenSuccessful();
if (
msg.value <
currentRaid.raid_price + (currentRaid.raid_price / 10)
) revert NewRaidMustBeGreaterThanCurrentRaidByAtLeast10Percent();
if (currentRaid.creator_address == msg.sender)
revert CannotOutbidYourOwnRaid();
uint256 block_expiry = (currentRaid.block_expiry - block.number) <
raidBlockReset
? (block.number + raidBlockReset)
: currentRaid.block_expiry;
ethEarnedByContract += amount_for_contract;
ethForBuyback += amount_for_burn;
if (ethForBuyback >= buybackMinimum) {
_buyAndBurn(ethForBuyback);
ethForBuyback = 0;
}
lostRaidsByPotAddress[walletAddress].push(currentRaid);
Raid memory newRaid = Raid({
creator_address: msg.sender,
raid_price: msg.value,
eth_locked: amount_locked,
block_expiry: block_expiry
});
currentRaidByAddress[walletAddress] = newRaid;
emit NewRaidCreated(
walletAddress,
msg.sender,
msg.value,
amount_locked,
balanceOf(walletAddress),
block_expiry
);
}
}
function payRaid() external payable nonReentrant {
if (currentRaidByAddress[msg.sender].creator_address == address(0))
revert ThereIsNoRaidOnYourWallet();
Raid storage currentRaid = currentRaidByAddress[msg.sender];
if (msg.value != currentRaid.raid_price)
revert YouMustMatchTheRaidBid();
if (block.number > currentRaid.block_expiry)
revert RaidHasAlreadyBeenSuccessful();
uint256 newMinimumRaidAmount = msg.value * 2;
uint256 newBlockCooldown = block.number + raidCooldown;
minimumRaidAmountByWallet[msg.sender] = newMinimumRaidAmount;
blockCooldownByAddress[msg.sender] = newBlockCooldown;
address creator_address = currentRaid.creator_address;
uint256 eth_locked = currentRaid.eth_locked;
delete currentRaidByAddress[msg.sender];
ethClaimableByWallet[creator_address] += eth_locked;
emit EthClaimAdded(creator_address, eth_locked);
Raid[] storage failedRaids = lostRaidsByPotAddress[msg.sender];
for (uint256 i = 0; i < failedRaids.length; i++) {
Raid storage failedRaid = failedRaids[i];
uint256 failed_eth_locked = failedRaid.eth_locked;
failedRaid.eth_locked = 0;
ethClaimableByWallet[
failedRaid.creator_address
] += failed_eth_locked;
emit EthClaimAdded(failedRaid.creator_address, failed_eth_locked);
}
delete lostRaidsByPotAddress[msg.sender];
_buyAndBurn(msg.value);
emit RaidPaid(
msg.sender,
msg.value,
balanceOf(msg.sender),
newBlockCooldown,
newMinimumRaidAmount
);
}
function settleRaid(address walletAddress) external nonReentrant {
if (currentRaidByAddress[walletAddress].creator_address == address(0))
revert ThereIsNoRaidOnThisWallet();
Raid storage currentRaid = currentRaidByAddress[walletAddress];
if (block.number <= currentRaid.block_expiry)
revert RaidCannotBeClaimedYet();
address creator_address = currentRaid.creator_address;
uint256 eth_locked = currentRaid.eth_locked;
delete currentRaidByAddress[walletAddress];
delete blockCooldownByAddress[walletAddress];
delete minimumRaidAmountByWallet[walletAddress];
uint256 tokensToTransfer = balanceOf(walletAddress);
_updateUnchecked(walletAddress, creator_address, tokensToTransfer);
ethClaimableByWallet[walletAddress] += eth_locked;
emit EthClaimAdded(walletAddress, eth_locked);
uint256 ethToClaim = 0;
Raid[] storage failedRaids = lostRaidsByPotAddress[walletAddress];
for (uint256 i = 0; i < failedRaids.length; i++) {
Raid storage failedRaid = failedRaids[i];
ethToClaim += failedRaid.eth_locked;
}
delete lostRaidsByPotAddress[walletAddress];
ethClaimableByWallet[creator_address] += ethToClaim;
emit EthClaimAdded(creator_address, eth_locked);
emit RaidSettled(
walletAddress,
creator_address,
eth_locked,
tokensToTransfer,
ethToClaim
);
}
function claimEthByWallet(address walletAddress) public nonReentrant {
_claimEthByWallet(walletAddress);
}
function claimEthByWallets(
address[] calldata walletAddresses
) external nonReentrant {
for (uint256 i = 0; i < walletAddresses.length; i++) {
_claimEthByWallet(walletAddresses[i]);
}
}
function _claimEthByWallet(address walletAddress) internal {
uint256 trappedAmount = ethClaimableByWallet[walletAddress];
if (trappedAmount == 0) revert NoTrappedETHToClaim();
ethClaimableByWallet[walletAddress] = 0;
(bool success, ) = walletAddress.call{value: trappedAmount}("");
if (!success) revert FailedToSendTrappedETH();
emit EthClaimed(walletAddress, trappedAmount);
}
function changeFeeStructure(
uint256 newFeeBps,
uint256 newBurnBps
) external onlyOwner {
_feeBps = newFeeBps;
_burnBps = newBurnBps;
}
function claimContractEarnings(address to) external onlyOwner {
payable(to).transfer(ethEarnedByContract);
ethEarnedByContract = 0;
}
function _updateUnchecked(
address from,
address to,
uint256 amount
) internal {
super._update(from, to, amount);
emit TokensTransferred(from, to, amount);
}
function _update(
address from,
address to,
uint256 amount
) internal override {
if (from == burnAddress || to == burnAddress) {
super._update(from, to, amount);
emit TokensTransferred(from, to, amount);
return;
}
if (
liquidityLoadedBlock != 0 &&
block.number < (liquidityLoadedBlock + 150) &&
to != address(uniswapV2Pair) &&
(balanceOf(to) + amount) > MAX_BUY
) {
revert TooManyTokensPurchased();
}
if (currentRaidByAddress[from].creator_address != address(0))
revert TransferNotAllowedSendingWalletIsUnderRaid();
if (currentRaidByAddress[to].creator_address != address(0))
revert TransferNotAllowedReceivingWalletIsUnderRaid();
super._update(from, to, amount);
emit TokensTransferred(from, to, amount);
}
function _swapEthForTokens(uint256 ethAmount) private returns (uint256) {
address[] memory path = new address[](2);
path[0] = uniswapV2Router.WETH();
path[1] = address(this);
uint256 balanceBefore = balanceOf(owner());
uniswapV2Router.swapExactETHForTokens{value: ethAmount}(
0,
path,
owner(),
block.timestamp
);
uint256 balanceAfter = balanceOf(owner());
return balanceAfter - balanceBefore;
}
function _buyAndBurn(uint256 ethAmount) private {
uint256 tokenAmount = _swapEthForTokens(ethAmount);
_updateUnchecked(owner(), burnAddress, tokenAmount);
emit TokensBoughtAndBurned(ethAmount, tokenAmount);
}
receive() external payable {}
function rescueERC20(
address tokenAddress,
uint256 amount
) external onlyOwner {
IERC20(tokenAddress).transfer(owner(), amount);
}
}
文件 8 的 9:ReentrancyGuard.sol
pragma solidity ^0.8.20;
abstract contract ReentrancyGuard {
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
_status = ENTERED;
}
function _nonReentrantAfter() private {
_status = NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
文件 9 的 9:draft-IERC6093.sol
pragma solidity ^0.8.20;
interface IERC20Errors {
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
}
interface IERC721Errors {
error ERC721InvalidOwner(address owner);
error ERC721NonexistentToken(uint256 tokenId);
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
error ERC721InvalidSender(address sender);
error ERC721InvalidReceiver(address receiver);
error ERC721InsufficientApproval(address operator, uint256 tokenId);
error ERC721InvalidApprover(address approver);
error ERC721InvalidOperator(address operator);
}
interface IERC1155Errors {
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
error ERC1155InvalidSender(address sender);
error ERC1155InvalidReceiver(address receiver);
error ERC1155MissingApprovalForAll(address operator, address owner);
error ERC1155InvalidApprover(address approver);
error ERC1155InvalidOperator(address operator);
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
{
"compilationTarget": {
"contracts/PVP.sol": "PVP"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotOutbidYourOwnRaid","type":"error"},{"inputs":[],"name":"CannotPlaceRaidOnSelf","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FailedToSendTrappedETH","type":"error"},{"inputs":[],"name":"InsufficientETHSent","type":"error"},{"inputs":[],"name":"InsufficientTokenBalanceForLiquidity","type":"error"},{"inputs":[],"name":"LiquidityAlreadyLoaded","type":"error"},{"inputs":[],"name":"MustSendETHToAddLiquidity","type":"error"},{"inputs":[],"name":"NewRaidMustBeGreaterThanCurrentRaidByAtLeast10Percent","type":"error"},{"inputs":[],"name":"NoTrappedETHToClaim","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"RaidCannotBeClaimedYet","type":"error"},{"inputs":[],"name":"RaidHasAlreadyBeenSuccessful","type":"error"},{"inputs":[],"name":"RaidMustBeGreaterThanMinimumRaidAmount","type":"error"},{"inputs":[],"name":"RaidMustBeGreaterThanWalletMinimumRaidAmount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"TheWalletMustBeATokenHolder","type":"error"},{"inputs":[],"name":"ThereIsNoRaidOnThisWallet","type":"error"},{"inputs":[],"name":"ThereIsNoRaidOnYourWallet","type":"error"},{"inputs":[],"name":"ThisWalletIsExcludedFromRaids","type":"error"},{"inputs":[],"name":"ThisWalletIsOnCooldown","type":"error"},{"inputs":[],"name":"TooManyTokensPurchased","type":"error"},{"inputs":[],"name":"TransferNotAllowedReceivingWalletIsUnderRaid","type":"error"},{"inputs":[],"name":"TransferNotAllowedSendingWalletIsUnderRaid","type":"error"},{"inputs":[],"name":"YouMustMatchTheRaidBid","type":"error"},{"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":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthClaimAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"walletAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"FailedBidsPayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"InitialLiquidityLoaded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"walletUnderRaid","type":"address"},{"indexed":true,"internalType":"address","name":"raidCreator","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethLocked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensLocked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockExpiry","type":"uint256"}],"name":"NewRaidCreated","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"}],"name":"PairCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"walletAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"RaidBidPayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"walletAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"RaidBidPayoutFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"walletUnderRaid","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensUnlocked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockCooldown","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minimumRaid","type":"uint256"}],"name":"RaidPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"walletUnderRaid","type":"address"},{"indexed":true,"internalType":"address","name":"raidCreator","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethSentToRaidWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensClaimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethClaimed","type":"uint256"}],"name":"RaidSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"TokensBoughtAndBurned","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":"amount","type":"uint256"}],"name":"TokensTransferred","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":"walletAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"exclusionStatus","type":"bool"}],"name":"WalletExclusionUpdated","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_feeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"value","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":"","type":"address"}],"name":"blockCooldownByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeeBps","type":"uint256"},{"internalType":"uint256","name":"newBurnBps","type":"uint256"}],"name":"changeFeeStructure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"claimContractEarnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"}],"name":"claimEthByWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"walletAddresses","type":"address[]"}],"name":"claimEthByWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"}],"name":"createRaid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"currentRaidByAddress","outputs":[{"internalType":"address","name":"creator_address","type":"address"},{"internalType":"uint256","name":"raid_price","type":"uint256"},{"internalType":"uint256","name":"eth_locked","type":"uint256"},{"internalType":"uint256","name":"block_expiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ethClaimableByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRaidLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityLoadedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loadLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"lostRaidsByPotAddress","outputs":[{"internalType":"address","name":"creator_address","type":"address"},{"internalType":"uint256","name":"raid_price","type":"uint256"},{"internalType":"uint256","name":"eth_locked","type":"uint256"},{"internalType":"uint256","name":"block_expiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumRaidAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minimumRaidAmountByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payRaid","outputs":[],"stateMutability":"payable","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":"address","name":"walletAddress","type":"address"}],"name":"settleRaid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"toggleExclusionForWallet","outputs":[],"stateMutability":"nonpayable","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":"value","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":"value","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":"address","name":"","type":"address"}],"name":"walletsExcludedFromRaids","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]