编译器
0.8.26+commit.8a97fa7a
文件 1 的 6: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 的 6:IERC165.sol
pragma solidity ^0.8.20;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 3 的 6:IERC721.sol
pragma solidity ^0.8.20;
import {IERC165} from "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
文件 4 的 6: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);
}
}
文件 5 的 6: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;
}
}
文件 6 的 6:VhilsBurn.sol
pragma solidity 0.8.26;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
struct TierTear {
uint8 level;
uint256 startTime;
}
struct TierMedal {
uint8 rank;
uint256 startTime;
}
struct StakingInfo {
address owner;
TierTear tierTear;
TierMedal tierMedal;
}
interface IStaking {
function stakingInfo(uint16 _tokenId) external view returns (StakingInfo memory);
}
contract VhilsBurn is Ownable, ReentrancyGuard {
bool public isOnceTime = true;
uint8 public tierRank = 5;
uint16 public tokensPerBurn = 3;
address public nft = 0xa9248a0935EB476cFE2f286Df813a48D06ffd2e2;
address public staking = 0x50D8aae81035A2253CE36433Fa5C6F1d2314c90B;
address public burnRecipient = 0x91660CD98409C6E5e37c911321B346Eb726449fE;
address public saleRecipient = 0x58F58f15A0D080932218D65beb8bBd83978677d7;
uint256 public burnAmount = 0.1 ether;
uint256 public start = 1719248400;
uint256 public end = 1719853200;
mapping(uint16 => bool) public isBurned;
event PurchaseETH(address indexed sender, uint16 tokenId, uint256 amount, uint256 timestamp);
event PurchaseToken(address indexed sender, uint16[] tokenIds, uint256 timestamp);
constructor() Ownable(msg.sender) {}
function purchaseByEth(uint16 _tokenId) external payable {
require(start <= block.timestamp && block.timestamp <= end, "Invalid time");
require(msg.value == burnAmount, "Invalid ETH");
require(IERC721(nft).ownerOf(_tokenId) == msg.sender, "Invalid owner");
StakingInfo memory info = IStaking(staking).stakingInfo(_tokenId);
require(info.tierMedal.rank == tierRank, "Invalid tierRank");
if (isOnceTime) {
require(!isBurned[_tokenId], "Already burned");
}
isBurned[_tokenId] = true;
emit PurchaseETH(msg.sender, _tokenId, msg.value, block.timestamp);
}
function purchaseByToken(uint16[] calldata _tokenIds) external nonReentrant {
require(start <= block.timestamp && block.timestamp <= end, "Invalid time");
require(_tokenIds.length == tokensPerBurn, "Invalid tokenIds");
address sender = msg.sender;
StakingInfo memory info = IStaking(staking).stakingInfo(_tokenIds[0]);
require(info.tierMedal.rank == tierRank, "Invalid tierRank");
for (uint256 i = 0; i < _tokenIds.length; i++) {
if (isOnceTime) {
require(!isBurned[_tokenIds[i]], "Already burned");
}
isBurned[_tokenIds[i]] = true;
IERC721(nft).safeTransferFrom(sender, burnRecipient, _tokenIds[i]);
}
emit PurchaseToken(sender, _tokenIds, block.timestamp);
}
function setTierRank(uint8 _tierRank) external onlyOwner {
tierRank = _tierRank;
}
function setTime(uint256 _start, uint256 _end) external onlyOwner {
start = _start;
end = _end;
}
function setOnceTime(bool _isOnceTime) external onlyOwner {
isOnceTime = _isOnceTime;
}
function setNft(address _nft) external onlyOwner {
nft = _nft;
}
function setStaking(address _staking) external onlyOwner {
staking = _staking;
}
function setSaleRecipient(address _saleRecipient) external onlyOwner {
saleRecipient = _saleRecipient;
}
function setBurnAmount(uint256 _burnAmount) external onlyOwner {
burnAmount = _burnAmount;
}
function setBurnRecipient(address _burnRecipient) external onlyOwner {
burnRecipient = _burnRecipient;
}
function withdraw() external onlyOwner nonReentrant {
(bool success, ) = saleRecipient.call{ value: address(this).balance }("");
require(success, "Transfer failed");
}
}
{
"compilationTarget": {
"contracts/VhilsBurn.sol": "VhilsBurn"
},
"evmVersion": "cancun",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"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":"sender","type":"address"},{"indexed":false,"internalType":"uint16","name":"tokenId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PurchaseETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PurchaseToken","type":"event"},{"inputs":[],"name":"burnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"end","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"isBurned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOnceTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_tokenId","type":"uint16"}],"name":"purchaseByEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"}],"name":"purchaseByToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnAmount","type":"uint256"}],"name":"setBurnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burnRecipient","type":"address"}],"name":"setBurnRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"}],"name":"setNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOnceTime","type":"bool"}],"name":"setOnceTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_saleRecipient","type":"address"}],"name":"setSaleRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_tierRank","type":"uint8"}],"name":"setTierRank","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"setTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierRank","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerBurn","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]