LaunchToken
0x5caa591c9a696bbea357a899fe4822f5dc312bb7
Verification
Verified
0.8.34+commit.80d5c536
Type
Contract
5,329 bytes
ABI entries
30
12 read · 5 write
License
none
Contract information
- Address
- 0x5caa591c9a696bbea357a899fe4822f5dc312bb7
- Chain
- Robinhood Chain (4663)
- Compiler
- 0.8.34+commit.80d5c536
- Optimization
- Disabled
- Creator
- 0x6665418e44…FA4D26cdDE
- Creation tx
- 0x9c4051c60d…fa18ca8e06
Token
- Name
- Covea
- Symbol
- COVEA
- Decimals
- 18
- Holders
- 61
- Market
- View token page →
Read contract (12)
allowance(address, address) → uint256
balanceOf(address) → uint256
decimals() → uint8
factory() → address
maxTxAmount() → uint256
maxWalletAmount() → uint256
name() → string
restrictionExempt(address) → bool
restrictionsActive() → bool
restrictionsEndBlock() → uint256
symbol() → string
totalSupply() → uint256
Events (2)
ApprovalTransfer
ABI
[
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "uint256",
"name": "supply_",
"type": "uint256"
},
{
"internalType": "uint16",
"name": "maxWalletBps_",
"type": "uint16"
},
{
"internalType": "uint16",
"name": "maxTxBps_",
"type": "uint16"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "AlreadyInitialized",
"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": "MaxTxExceeded",
"type": "error"
},
{
"inputs": [],
"name": "MaxWalletExceeded",
"type": "error"
},
{
"inputs": [],
"name": "NotFactory",
"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": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"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": "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": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "factory",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "endBlock_",
"type": "uint256"
}
],
"name": "initRestrictionsEndBlock",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "maxTxAmount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "maxWalletAmount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "restrictionExempt",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "restrictionsActive",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "restrictionsEndBlock",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bool",
"name": "value",
"type": "bool"
}
],
"name": "setRestrictionExempt",
"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";
/// @notice ERC20 launched by the LaunchFactory. Enforces anti-snipe max-wallet /
/// max-tx limits until `restrictionsEndBlock`, after which it behaves as a plain ERC20.
contract LaunchToken is ERC20 {
error NotFactory();
error AlreadyInitialized();
error MaxWalletExceeded();
error MaxTxExceeded();
address public immutable factory;
/// @notice Set once by the factory in the launch transaction. Kept out of
/// the constructor so the CREATE2 init code is block-independent, letting
/// launchers mine vanity token addresses off-chain.
uint256 public restrictionsEndBlock;
uint256 public immutable maxWalletAmount; // 0 = no limit
uint256 public immutable maxTxAmount; // 0 = no limit
/// @notice Addresses exempt from restrictions (pool, locker, position manager, router, factory).
mapping(address => bool) public restrictionExempt;
constructor(
string memory name_,
string memory symbol_,
uint256 supply_,
uint16 maxWalletBps_,
uint16 maxTxBps_
) ERC20(name_, symbol_) {
factory = msg.sender;
maxWalletAmount = maxWalletBps_ > 10_000 ? 0 : (supply_ * maxWalletBps_) / 10_000;
maxTxAmount = maxTxBps_ > 10_000 ? 0 : (supply_ * maxTxBps_) / 10_000;
_mint(msg.sender, supply_);
}
/// @notice One-time wiring by the factory, same transaction as the deploy.
function initRestrictionsEndBlock(uint256 endBlock_) external {
if (msg.sender != factory) revert NotFactory();
if (restrictionsEndBlock != 0) revert AlreadyInitialized();
restrictionsEndBlock = endBlock_;
}
/// @notice Factory marks protocol addresses as exempt during launch (one-way).
function setRestrictionExempt(address account, bool value) external {
if (msg.sender != factory) revert NotFactory();
restrictionExempt[account] = value;
}
function restrictionsActive() public view returns (bool) {
return block.number < restrictionsEndBlock;
}
function _update(address from, address to, uint256 value) internal override {
if (from != address(0) && to != address(0) && restrictionsActive()) {
if (maxTxAmount != 0 && value > maxTxAmount && !restrictionExempt[from] && !restrictionExempt[to]) {
revert MaxTxExceeded();
}
if (maxWalletAmount != 0 && restrictionExempt[from] && balanceOf(to) + value < maxWalletAmount) {
revert MaxWalletExceeded();
}
}
super._update(from, to, value);
}
}
Chain explorer2073msChain node72ms