MachineToken
0xcc7667311d0663466562e8b02dc1206903cfe6d2
Verification
Verified
v0.8.26+commit.8a97fa7a
Type
Contract
2,872 bytes
ABI entries
30
12 read · 5 write
License
none
Contract information
- Address
- 0xcc7667311d0663466562e8b02dc1206903cfe6d2
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.26+commit.8a97fa7a
- Optimization
- Enabled
- Creator
- 0xb9C0d81f23…54d584E038
- Creation tx
- 0x305c2d5895…09a536f10e
Token
- Name
- machine.fun
- Symbol
- MACHINE
- Decimals
- 18
- Holders
- 73
- Market
- View token page →
Read contract (12)
allowance(address, address) → uint256
balanceOf(address) → uint256
decimals() → uint8
isExempt(address) → bool
launcher() → address
limitsEnabled() → bool
maxBuyAmount() → uint256
metadataURI() → string
name() → string
poolManager() → address
symbol() → string
totalSupply() → uint256
Events (4)
ApprovalExemptSetLimitsEnabledSetTransfer
ABI
[
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "string",
"name": "metadataURI_",
"type": "string"
},
{
"internalType": "uint256",
"name": "supply_",
"type": "uint256"
},
{
"internalType": "address",
"name": "poolManager_",
"type": "address"
},
{
"internalType": "uint256",
"name": "maxBuyBps_",
"type": "uint256"
}
],
"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": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxBuy",
"type": "uint256"
}
],
"name": "MaxBuyExceeded",
"type": "error"
},
{
"inputs": [],
"name": "NotLauncher",
"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": "ExemptSet",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bool",
"name": "enabled",
"type": "bool"
}
],
"name": "LimitsEnabledSet",
"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": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isExempt",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "launcher",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "limitsEnabled",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "maxBuyAmount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "metadataURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "poolManager",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bool",
"name": "exempt",
"type": "bool"
}
],
"name": "setExempt",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "enabled",
"type": "bool"
}
],
"name": "setLimitsEnabled",
"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";
/// @title MachineToken (v2)
/// @notice Fixed-supply ERC-20 launched via machine.fun. The entire supply is
/// minted once to the launcher, which places it into the Uniswap v4
/// pool.
///
/// v2 adds a max-buy limit: while limits are enabled, any single
/// transfer OUT of the Uniswap v4 PoolManager (i.e. a buy, or a claim
/// withdrawal) above `maxBuyAmount` reverts, unless the recipient is
/// exempt. Sells and wallet-to-wallet transfers are never limited.
/// Only the launcher can lift limits or manage exemptions.
contract MachineToken is ERC20 {
error MaxBuyExceeded(uint256 amount, uint256 maxBuy);
error NotLauncher();
event LimitsEnabledSet(bool enabled);
event ExemptSet(address indexed account, bool exempt);
/// @notice The machine.fun launcher that deployed this token.
address public immutable launcher;
/// @notice The Uniswap v4 PoolManager whose outbound transfers are capped.
address public immutable poolManager;
/// @notice Max tokens per single buy (transfer out of the PoolManager).
uint256 public immutable maxBuyAmount;
/// @notice Whether the max-buy limit is active.
bool public limitsEnabled = true;
/// @notice Recipients exempt from the max-buy limit (fee recipients etc).
mapping(address => bool) public isExempt;
/// @notice Off-chain metadata (image/description), e.g. an IPFS URI.
string public metadataURI;
modifier onlyLauncher() {
if (msg.sender != launcher) revert NotLauncher();
_;
}
constructor(
string memory name_,
string memory symbol_,
string memory metadataURI_,
uint256 supply_,
address poolManager_,
uint256 maxBuyBps_
) ERC20(name_, symbol_) {
launcher = msg.sender;
poolManager = poolManager_;
maxBuyAmount = (supply_ * maxBuyBps_) / 10_000;
metadataURI = metadataURI_;
isExempt[msg.sender] = true;
_mint(msg.sender, supply_);
}
/// @notice Enable/disable the max-buy limit. Launcher only.
function setLimitsEnabled(bool enabled) external onlyLauncher {
limitsEnabled = enabled;
emit LimitsEnabledSet(enabled);
}
/// @notice Exempt an address (as recipient) from the max-buy limit.
function setExempt(address account, bool exempt) external onlyLauncher {
isExempt[account] = exempt;
emit ExemptSet(account, exempt);
}
function _update(address from, address to, uint256 value) internal override {
if (
limitsEnabled && from == poolManager && !isExempt[to]
&& value > maxBuyAmount
) revert MaxBuyExceeded(value, maxBuyAmount);
super._update(from, to, value);
}
}
Chain explorer5748msChain node79ms