PlebIndexToken
0x02cf91de4e80d3dd104e5ad6fc23eb15a9b6f8e2
Verification
Verified
v0.8.26+commit.8a97fa7a
Type
Contract
4,055 bytes
ABI entries
45
13 read · 13 write
License
none
Contract information
- Address
- 0x02cf91de4e80d3dd104e5ad6fc23eb15a9b6f8e2
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.26+commit.8a97fa7a
- Optimization
- Enabled
- Creator
- 0x773F8E15b6…7842bfBD04
- Creation tx
- 0xff3c347195…cd331ed36a
Token
- Name
- PLEB INDEX
- Symbol
- PLEB
- Decimals
- 18
- Holders
- 547
- Market
- View token page →
Read contract (13)
MAX_PROCESSING_GAS() → uint32
TOTAL_SUPPLY() → uint256
allowance(address, address) → uint256
balanceOf(address) → uint256
decimals() → uint8
distributor() → address
isExempt(address) → bool
name() → string
owner() → address
pendingOwner() → address
symbol() → string
totalSupply() → uint256
tradingEnabled() → bool
Events (6)
ApprovalExemptUpdatedOwnershipTransferStartedOwnershipTransferredTradingEnabledTransfer
ABI
[
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "address",
"name": "owner_",
"type": "address"
},
{
"internalType": "uint256",
"name": "minimumTokenBalanceForRewards_",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "claimWait_",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "AlreadyEnabled",
"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": "GasLimitTooHigh",
"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": "TradingDisabled",
"type": "error"
},
{
"inputs": [],
"name": "ZeroAddress",
"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": "account",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "exempt",
"type": "bool"
}
],
"name": "ExemptUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferStarted",
"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": [],
"name": "TradingEnabled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [],
"name": "MAX_PROCESSING_GAS",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "TOTAL_SUPPLY",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "acceptOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "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": [],
"name": "claimRewards",
"outputs": [
{
"internalType": "uint256",
"name": "paidAssets",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "distributor",
"outputs": [
{
"internalType": "contract PlebIndexDistributor",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "enableTrading",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isExempt",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"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": "pendingOwner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "gasLimit",
"type": "uint256"
}
],
"name": "processRewardClaims",
"outputs": [
{
"internalType": "uint256",
"name": "iterations",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "claims",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastProcessedIndex",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "treasury_",
"type": "address"
}
],
"name": "setDistributorTreasury",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bool",
"name": "excluded",
"type": "bool"
}
],
"name": "setExcludedFromRewards",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bool",
"name": "exempt",
"type": "bool"
}
],
"name": "setExempt",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "minimumTokenBalanceForRewards_",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "claimWait_",
"type": "uint256"
}
],
"name": "setRewardCriteria",
"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": [],
"name": "tradingEnabled",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"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"
}
]Source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {PlebIndexDistributor} from "./PlebIndexDistributor.sol";
/// @title PlebIndexToken ($PLEB — PLEB INDEX)
/// @notice Plain fixed-supply ERC-20. The trade tax lives entirely in the v4
/// hook (collected in native ETH); this contract's only extra job is keeping
/// the distributor's holder registry in sync on every balance change.
///
/// Launch posture: 1B fixed supply, no mint, no burn hooks, no blacklist, no
/// pause, no proxy. The owner wires things up (trading gate, exemptions,
/// distributor config) and then renounces, freezing the token forever. The
/// reward basket stays curated at the treasury by the multisig. Claims and
/// batch processing are permissionless and survive renounce.
contract PlebIndexToken is ERC20, Ownable2Step {
uint256 public constant TOTAL_SUPPLY = 1_000_000_000 ether;
uint32 public constant MAX_PROCESSING_GAS = 1_000_000;
PlebIndexDistributor public immutable distributor;
/// One-way launch gate: until enabled, only exempt addresses can move
/// tokens (deployer/LP seeding liquidity, sniper-check window).
bool public tradingEnabled;
mapping(address => bool) public isExempt;
event TradingEnabled();
event ExemptUpdated(address indexed account, bool exempt);
error TradingDisabled();
error AlreadyEnabled();
error GasLimitTooHigh();
error ZeroAddress();
constructor(
string memory name_,
string memory symbol_,
address owner_,
uint256 minimumTokenBalanceForRewards_,
uint256 claimWait_
) ERC20(name_, symbol_) Ownable(owner_)
{
distributor = new PlebIndexDistributor(minimumTokenBalanceForRewards_, claimWait_);
isExempt[owner_] = true;
emit ExemptUpdated(owner_, true);
_mint(owner_, TOTAL_SUPPLY);
}
function enableTrading() external onlyOwner {
if (tradingEnabled) revert AlreadyEnabled();
tradingEnabled = true;
emit TradingEnabled();
}
function setExempt(address account, bool exempt) external onlyOwner {
if (account == address(0)) revert ZeroAddress();
isExempt[account] = exempt;
emit ExemptUpdated(account, exempt);
}
function setDistributorTreasury(address treasury_) external onlyOwner {
distributor.setTreasury(treasury_);
}
function setRewardCriteria(uint256 minimumTokenBalanceForRewards_, uint256 claimWait_) external onlyOwner {
distributor.setCriteria(minimumTokenBalanceForRewards_, claimWait_);
}
function setExcludedFromRewards(address account, bool excluded) external onlyOwner {
distributor.setExcludedFromRewards(account, excluded);
}
function claimRewards() external returns (uint256 paidAssets) {
return distributor.claim(msg.sender);
}
function processRewardClaims(uint256 gasLimit)
external
returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex)
{
if (gasLimit > MAX_PROCESSING_GAS) revert GasLimitTooHigh();
return distributor.process(gasLimit);
}
function _update(address from, address to, uint256 amount) internal override {
if (from != address(0) && to != address(0) && !tradingEnabled) {
if (!isExempt[from] && !isExempt[to]) revert TradingDisabled();
}
super._update(from, to, amount);
if (from != address(0)) {
distributor.setShare(from, balanceOf(from));
}
if (to != address(0)) {
distributor.setShare(to, balanceOf(to));
}
}
}
Chain explorer2810msChain node79ms