StealthToken
0x2f6021243c78c2ef14f0e4418001a2be02b00127
Verification
Verified
v0.8.26+commit.8a97fa7a
Type
Contract
3,350 bytes
ABI entries
33
11 read · 7 write
License
none
Contract information
- Address
- 0x2f6021243c78c2ef14f0e4418001a2be02b00127
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.26+commit.8a97fa7a
- Optimization
- Enabled
- Creator
- 0x305f3DaAbF…4452b04816
- Creation tx
- 0x9b6b28c7c2…8749b766a8
Token
- Name
- VirlX402
- Symbol
- VirlX402
- Decimals
- 18
- Holders
- 262
- Market
- View token page →
Read contract (11)
SELL_COOLDOWN() → uint256
allowance(address, address) → uint256
balanceOf(address) → uint256
decimals() → uint8
isWhitelisted(address) → bool
lastSellTime(address) → uint256
name() → string
owner() → address
pair() → address
symbol() → string
totalSupply() → uint256
Events (5)
ApprovalOwnershipTransferredPairUpdatedTransferWhitelistUpdated
ABI
[
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "uint256",
"name": "initialSupply_",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"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": "InvalidAddress",
"type": "error"
},
{
"inputs": [],
"name": "NotOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "nextAvailable",
"type": "uint256"
}
],
"name": "SellCooldownActive",
"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": "previous",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "updated",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previous",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "updated",
"type": "address"
}
],
"name": "PairUpdated",
"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": "account",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "enabled",
"type": "bool"
}
],
"name": "WhitelistUpdated",
"type": "event"
},
{
"inputs": [],
"name": "SELL_COOLDOWN",
"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": "accounts",
"type": "address[]"
},
{
"internalType": "bool",
"name": "enabled",
"type": "bool"
}
],
"name": "batchSetWhitelist",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isWhitelisted",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "lastSellTime",
"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": "pair",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newPair",
"type": "address"
}
],
"name": "setPair",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bool",
"name": "enabled",
"type": "bool"
}
],
"name": "setWhitelist",
"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": "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"
}
]Source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract StealthToken is ERC20 {
address public owner;
address public pair;
uint256 public constant SELL_COOLDOWN = 5 hours;
mapping(address => uint256) public lastSellTime;
mapping(address => bool) public isWhitelisted;
event PairUpdated(address indexed previous, address indexed updated);
event WhitelistUpdated(address indexed account, bool enabled);
event OwnershipTransferred(address indexed previous, address indexed updated);
error NotOwner();
error SellCooldownActive(uint256 nextAvailable);
error InvalidAddress();
modifier onlyOwner() {
if (msg.sender != owner) revert NotOwner();
_;
}
/**
* @param name_ 代币名
* @param symbol_ 代币符号
* @param initialSupply_ 初始供应量(整枚,内部乘以 10^decimals)
* @param recipient_ 接收初始供应量的地址(自动加入白名单)
*/
constructor(
string memory name_,
string memory symbol_,
uint256 initialSupply_,
address recipient_
) ERC20(name_, symbol_) {
owner = msg.sender;
emit OwnershipTransferred(address(0), owner);
isWhitelisted[recipient_] = true;
emit WhitelistUpdated(recipient_, true);
_mint(recipient_, initialSupply_ * (10 ** decimals()));
}
function _update(address from, address to, uint256 value) internal override {
address _pair = pair;
if (_pair != address(0) && to == _pair && !isWhitelisted[from]) {
uint256 nextAvailable = lastSellTime[from] + SELL_COOLDOWN;
if (block.timestamp < nextAvailable) revert SellCooldownActive(nextAvailable);
lastSellTime[from] = block.timestamp;
}
if (from != address(0) && to != address(0) && to != _pair && !isWhitelisted[to]) {
if (lastSellTime[to] == 0) {
lastSellTime[to] = block.timestamp;
}
}
super._update(from, to, value);
}
// ─── 一次性配置(弃权后永久冻结) ─────────────────────────────
function setWhitelist(address account, bool enabled) external onlyOwner {
isWhitelisted[account] = enabled;
emit WhitelistUpdated(account, enabled);
}
function batchSetWhitelist(address[] calldata accounts, bool enabled) external onlyOwner {
for (uint256 i = 0; i < accounts.length; i++) {
isWhitelisted[accounts[i]] = enabled;
emit WhitelistUpdated(accounts[i], enabled);
}
}
function setPair(address newPair) external onlyOwner {
if (newPair == address(0)) revert InvalidAddress();
emit PairUpdated(pair, newPair);
pair = newPair;
}
function renounceOwnership() external onlyOwner {
emit OwnershipTransferred(owner, address(0));
owner = address(0);
}
}Chain explorer1617msChain node82ms