// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {LauncherTypes} from "./LauncherTypes.sol";
import {ILaunchToken} from "./interfaces/ILaunchToken.sol";
import {IUniswapV3Factory, IUniswapV3Pool} from "./interfaces/IUniswapV3.sol";
/// @title LaunchToken
/// @author Reconstructed from the on-chain NOXA launchpad token template
/// (reverse-engineered from deployed bytecode + verified via eth_call).
/// @notice A minimal, OWNERLESS, fixed-supply ERC20 with an on-chain metadata
/// payload (logo/description/socials) and a launch-window anti-bot cap.
///
/// This is a faithful reproduction of the original Noxa "LaunchToken"
/// template. Every economic parameter is set once in the constructor and
/// is `immutable` thereafter — there is no owner, no admin role, no
/// setters, no mint after deploy, no tax, no blacklist, and no pause.
///
/// The factory deploys one of these per launch, receives the entire
/// supply, seeds the Uniswap V3 single-sided position, and performs the
/// deployer's initial buy — all inside the deployment transaction, which
/// is exactly the transaction the anti-bot gate deliberately exempts
/// (see `_update`).
///
/// @dev Decoded behaviour reproduced here, point by point:
/// - fixed supply minted ONCE to `msg.sender` (the factory) in the ctor;
/// - ownerless & immutable — no Ownable, no roles;
/// - on-chain metadata getters: logo(), description(), socials(), getTokenInfo();
/// - liquidityPool() is DERIVED from the factory, never stored;
/// - anti-whale maxWallet cap enforced ONLY during the restriction window,
/// and ONLY strictly after the launch block (the launch tx is exempt);
/// - a per-tx-origin cumulative "throttle" that is present-but-inert under
/// the shipped preset (maxTxBps = 10000);
/// - NO transfer fee/tax — "docs claim no token taxes — reproduced
/// faithfully: none."
contract LaunchToken is ERC20, ILaunchToken {
using LauncherTypes for *;
/// @notice A pool buy was attempted in the launch block by someone other than
/// the creator. Refused outright — not capped.
error LaunchBlockBuyBlocked(address to);
/// @notice A pool buy would push `to` past the per-wallet holding cap.
error MaxWalletExceeded(address to, uint256 resulting, uint256 limit);
/// @notice A pool buy would push `to` past its cumulative buy allowance.
error MaxTxExceeded(address to, uint256 cumulative, uint256 limit);
// ---------------------------------------------------------------------
// Immutable core state (all set in the constructor, none mutable after)
// ---------------------------------------------------------------------
/// @notice The wallet credited as the launch's deployer / dev wallet.
/// @dev NOTE: the deployer is intentionally NOT part of the excluded set,
/// and is NOT exempted from the maxWallet cap after launch. The only
/// reason the deployer can exceed the cap is that its initial buy
/// happens in the launch transaction itself, which the block-number
/// gate in `_update` skips (block.number == launchBlock).
address public immutable deployer;
/// @notice The paired token of the launch pool (e.g. WETH).
address public immutable pairToken;
/// @notice The Uniswap V3 pool fee tier used for this launch.
uint24 public immutable poolFee;
/// @notice The Uniswap V3 factory used to derive `liquidityPool()`.
address public immutable uniswapV3Factory;
/// @notice The Uniswap V3 NonfungiblePositionManager (holds the LP NFT).
address public immutable positionManager;
/// @notice Optional router address (SwapRouter02). May be address(0).
/// @dev When non-zero it is added to the excluded set so router-held
/// intermediate balances never trip the maxWallet cap.
address public immutable router;
/// @notice The block at which this token was constructed (block.number).
uint256 public immutable launchBlock;
/// @notice Last block (inclusive) of the anti-bot restriction window.
/// @dev = launchBlock + restrictionBlocks.
uint256 public immutable restrictionEndBlock;
/// @notice Anti-whale cap: max tokens any (non-excluded) wallet may hold
/// during the restriction window. = supply * maxWalletBps / 10000.
uint256 public immutable maxWalletAmount;
/// @notice Per-tx cap during the window. = supply * maxTxBps / 10000.
/// @dev With the shipped preset (maxTxBps = 10000) this equals the full
/// supply, so the per-tx cap is effectively disabled.
uint256 public immutable maxTxAmount;
/// @notice Anti-whale cap in basis points (e.g. 200 = 2%).
uint16 public immutable maxWalletBps;
/// @notice Per-tx cap in basis points (e.g. 10000 = 100% = disabled).
uint16 public immutable maxTxBps;
/// @notice Length of the anti-bot restriction window, in blocks.
uint32 public immutable restrictionBlocks;
// ---------------------------------------------------------------------
// On-chain metadata (stored as plain state, exposed via getters)
// ---------------------------------------------------------------------
/// @dev Stored metadata payload. Getters below expose these with the exact
/// names the original ABI uses (logo/description/socials).
string private _logo; // ipfs:// URI to the token image
string private _description; // free-form on-chain description
LauncherTypes.Socials private _socials;
// ---------------------------------------------------------------------
// Anti-bot throttle bookkeeping
// ---------------------------------------------------------------------
/// @notice Cumulative amount each address has BOUGHT FROM A POOL during the
/// restriction window, capped at `maxTxAmount`.
/// @dev Per-address and cumulative, so splitting one buy into many does not
/// get around it. Only pool buys are counted — sells and wallet-to-wallet
/// transfers never touch this.
mapping(address => uint256) public restrictedPoolBuys;
// ---------------------------------------------------------------------
// Constructor
// ---------------------------------------------------------------------
/// @notice Deploys the token, mints the full supply to the caller (factory),
/// and locks in every parameter as immutable.
/// @param name_ ERC20 name.
/// @param symbol_ ERC20 symbol.
/// @param logo_ ipfs:// URI of the token image.
/// @param description_ Free-form on-chain description.
/// @param socials_ Social links struct (all on-chain strings).
/// @param deployer_ The launch's dev wallet / deployer address.
/// @param pairToken_ The pool's paired token (e.g. WETH).
/// @param poolFee_ Uniswap V3 fee tier for the pool.
/// @param uniswapV3Factory_ Uniswap V3 factory (used to derive the pool).
/// @param positionManager_ Uniswap V3 NonfungiblePositionManager.
/// @param router_ Optional SwapRouter02 (may be address(0)).
/// @param supply_ Fixed total supply (minted once to msg.sender).
/// @param maxWalletBps_ Anti-whale cap in bps.
/// @param maxTxBps_ Per-tx cap in bps (10000 = disabled).
/// @param restrictionBlocks_ Anti-bot window length in blocks.
constructor(
string memory name_,
string memory symbol_,
string memory logo_,
string memory description_,
LauncherTypes.Socials memory socials_,
address deployer_,
address pairToken_,
uint24 poolFee_,
address uniswapV3Factory_,
address positionManager_,
address router_,
uint256 supply_,
uint16 maxWalletBps_,
uint16 maxTxBps_,
uint32 restrictionBlocks_
) ERC20(name_, symbol_) {
// --- on-chain metadata ---
_logo = logo_;
_description = description_;
_socials = socials_;
// --- immutable addresses / config ---
deployer = deployer_;
pairToken = pairToken_;
poolFee = poolFee_;
uniswapV3Factory = uniswapV3Factory_;
positionManager = positionManager_;
router = router_;
// --- launch window ---
// The launch tx itself runs at block.number == launchBlock. The gate in
// `_update` uses a STRICT `>` on launchBlock, so LP seeding + the
// deployer's first buy in this same tx are never capped.
launchBlock = block.number;
restrictionBlocks = restrictionBlocks_;
restrictionEndBlock = block.number + restrictionBlocks_;
// --- anti-whale / anti-bot caps (bps of supply, /10000) ---
maxWalletBps = maxWalletBps_;
maxTxBps = maxTxBps_;
maxWalletAmount = (supply_ * maxWalletBps_) / 10000;
maxTxAmount = (supply_ * maxTxBps_) / 10000;
// --- fixed supply, minted ONCE to the factory (msg.sender) ---
// No mint() function exists; supply is fixed forever after this line.
_mint(msg.sender, supply_);
}
// ---------------------------------------------------------------------
// Derived / view functions
// ---------------------------------------------------------------------
/// @notice The Uniswap V3 pool for (this token, pairToken, poolFee).
/// @dev DERIVED live from the factory — never stored. Returns address(0)
/// until the pool has been created by the factory during launch.
function liquidityPool() public view returns (address) {
return IUniswapV3Factory(uniswapV3Factory).getPool(address(this), pairToken, poolFee);
}
/// @notice ipfs:// URI of the token image.
function logo() external view returns (string memory) {
return _logo;
}
/// @notice Free-form on-chain description.
function description() external view returns (string memory) {
return _description;
}
/// @notice The full on-chain socials struct.
function socials() external view returns (LauncherTypes.Socials memory) {
return _socials;
}
/// @notice Convenience bundle read by the original frontend/indexer.
/// @return name_ ERC20 name.
/// @return symbol_ ERC20 symbol.
/// @return decimals_ ERC20 decimals (18).
/// @return totalSupply_ Fixed total supply.
/// @return deployer_ The dev wallet / deployer.
/// @return description_ On-chain description.
/// @return logo_ ipfs:// image URI.
function getTokenInfo()
external
view
returns (
string memory name_,
string memory symbol_,
uint8 decimals_,
uint256 totalSupply_,
address deployer_,
string memory description_,
string memory logo_
)
{
return (name(), symbol(), decimals(), totalSupply(), deployer, _description, _logo);
}
// ---------------------------------------------------------------------
// Excluded-address predicate (anti-bot)
// ---------------------------------------------------------------------
/// @notice Whether `candidate` is a Uniswap V3 pool for (this token, pairToken).
/// @dev Recognises ANY fee tier, not just the one this token launched on. It
/// asks the candidate which tier it serves, then has the factory confirm
/// that this really is the pool for that tier — so a griefer cannot dodge
/// the window by opening a second pool on another tier, and a random
/// contract cannot impersonate one.
function _isPairPool(address candidate) internal view returns (bool) {
address canonical = liquidityPool();
if (canonical != address(0) && candidate == canonical) return true;
if (candidate.code.length == 0) return false;
(bool ok, bytes memory data) = candidate.staticcall(abi.encodeCall(IUniswapV3Pool.fee, ()));
if (!ok || data.length < 32) return false;
uint24 tier = abi.decode(data, (uint24));
return IUniswapV3Factory(uniswapV3Factory).getPool(address(this), pairToken, tier) == candidate;
}
/// @notice Live maxWallet limit during the window. Alias kept for indexers.
function maxWalletLimit() external view returns (uint256) {
return maxWalletAmount;
}
/// @notice Live cumulative-buy limit during the window. Alias kept for indexers.
function maxTxLimit() external view returns (uint256) {
return maxTxAmount;
}
// ---------------------------------------------------------------------
// OZ v5 transfer hook — anti-bot enforcement
// ---------------------------------------------------------------------
/// @notice Anti-bot enforcement in the OZ v5 balance hook.
/// @dev Runs on every mint/transfer/burn. Enforcement is scoped to the
/// restriction window and STRICTLY after the launch block:
///
/// block.number > launchBlock && block.number <= restrictionEndBlock
///
/// The strict `>` on launchBlock is the crux of the reproduction: it
/// exempts the launch transaction (LP seeding + deployer's first buy,
/// which both execute at block.number == launchBlock) so the creator
/// can legitimately exceed the maxWallet cap exactly once, at launch.
///
/// Within the window:
/// 1. maxWallet: balanceOf(to) + value <= maxWalletAmount, unless
/// `to` is excluded.
/// 2. per-origin cumulative throttle (present-but-inert under the
/// shipped preset): originVolume[tx.origin] += value must stay
/// <= supply * 11000 / 10000.
///
/// After restrictionEndBlock: no checks — transfers are free.
///
/// There is NO fee/tax skimmed here: docs claim no token taxes —
/// reproduced faithfully: none. `super._update` moves the full `value`.
function _update(address from, address to, uint256 value) internal override {
// Mints and burns are never restricted.
if (from != address(0) && to != address(0) && block.number <= restrictionEndBlock) {
// Only BUYS FROM A POOL are restricted. A sell (`to` is the pool) or a
// wallet-to-wallet transfer falls straight through — the previous design
// capped those too, which blocked ordinary users without inconveniencing
// a single bot.
if (_isPairPool(from)) {
// The creator's opening buy is the one purchase allowed in the launch
// block. It is identified by its recipient, not by the block alone.
bool isAtomicLaunchBuy = block.number == launchBlock && to == deployer;
// Everyone else is REFUSED outright in the launch block — not capped,
// refused. This is the hole the previous version left wide open: it
// exempted the whole block instead of the one transaction that needed
// it, so a bot landing in that block faced no limit at all, at the
// cheapest price the token will ever have.
if (!isAtomicLaunchBuy && block.number == launchBlock) {
revert LaunchBlockBuyBlocked(to);
}
if (!isAtomicLaunchBuy) {
uint256 resulting = balanceOf(to) + value;
if (resulting > maxWalletAmount) {
revert MaxWalletExceeded(to, resulting, maxWalletAmount);
}
// Cumulative per address, so splitting a buy into slices does not
// get around it. (The old per-tx.origin throttle was capped at 1.1x
// the whole supply and could therefore never trigger.)
uint256 cumulative = restrictedPoolBuys[to] + value;
if (cumulative > maxTxAmount) {
revert MaxTxExceeded(to, cumulative, maxTxAmount);
}
restrictedPoolBuys[to] = cumulative;
}
}
}
// No tax/fee: move the full value. Plain balances only.
super._update(from, to, value);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "logo_",
"type": "string",
"internalType": "string"
},
{
"name": "description_",
"type": "string",
"internalType": "string"
},
{
"name": "socials_",
"type": "tuple",
"components": [
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "twitter",
"type": "string",
"internalType": "string"
},
{
"name": "discord",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
},
{
"name": "farcaster",
"type": "string",
"internalType": "string"
}
],
"internalType": "struct LauncherTypes.Socials"
},
{
"name": "deployer_",
"type": "address",
"internalType": "address"
},
{
"name": "pairToken_",
"type": "address",
"internalType": "address"
},
{
"name": "poolFee_",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "uniswapV3Factory_",
"type": "address",
"internalType": "address"
},
{
"name": "positionManager_",
"type": "address",
"internalType": "address"
},
{
"name": "router_",
"type": "address",
"internalType": "address"
},
{
"name": "supply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxWalletBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "maxTxBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "restrictionBlocks_",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "LaunchBlockBuyBlocked",
"type": "error",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "MaxTxExceeded",
"type": "error",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "cumulative",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "limit",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "MaxWalletExceeded",
"type": "error",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "resulting",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "limit",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "deployer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "description",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "getTokenInfo",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "decimals_",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "totalSupply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deployer_",
"type": "address",
"internalType": "address"
},
{
"name": "description_",
"type": "string",
"internalType": "string"
},
{
"name": "logo_",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "launchBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "liquidityPool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "logo",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "maxTxAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxTxBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "maxTxLimit",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxWalletAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxWalletBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "maxWalletLimit",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "pairToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "poolFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "positionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "restrictedPoolBuys",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "restrictionBlocks",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "restrictionEndBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "router",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "socials",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "tuple",
"components": [
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "twitter",
"type": "string",
"internalType": "string"
},
{
"name": "discord",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
},
{
"name": "farcaster",
"type": "string",
"internalType": "string"
}
],
"internalType": "struct LauncherTypes.Socials"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "uniswapV3Factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
}
]0x60806040526004361015610011575f80fd5b5f3560e01c806306fdde0314610cf45780630861ac6114610cba578063089fe6aa14610c7b578063095ea7b314610bf957806312f16a0714610bbb57806318160ddd14610b9e57806323b872dd14610abf578063313ce56714610aa45780633de35b7914610a6057806353cd512a146105795780635b54918214610535578063665a11ca1461050957806366a88d961461041d57806370a08231146104d25780637284e416146104b7578063791b98bc146104735780638036d5901461046e5780638c0b5e221461046e57806395d89b4114610453578063a9059cbb14610422578063aa4bde281461041d578063abb1dc4414610362578063baed076514610322578063d00efb2f146102e8578063d5f39488146102a4578063dd62ed3e14610254578063e21410911461021c578063f887ea40146101d8578063fb7f21eb146101a55763ff8ea3e514610163575f80fd5b346101a1575f3660031901126101a157602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000226168152f35b5f80fd5b346101a1575f3660031901126101a1576101d46101c061104b565b604051918291602083526020830190610d0f565b0390f35b346101a1575f3660031901126101a1576040517f000000000000000000000000caf681a66d020601342297493863e78c959e5cb26001600160a01b03168152602090f35b346101a15760203660031901126101a1576001600160a01b0361023d610d33565b165f52600c602052602060405f2054604051908152f35b346101a15760403660031901126101a15761026d610d33565b610275610d49565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346101a1575f3660031901126101a1576040517f000000000000000000000000a668c2a76f61d7c8047a8df8423b93954d7b96e16001600160a01b03168152602090f35b346101a1575f3660031901126101a15760206040517f00000000000000000000000000000000000000000000000000000000018802d38152f35b346101a1575f3660031901126101a157602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000002168152f35b346101a1575f3660031901126101a1576103b661037d610e25565b6101d4610388610f9f565b61040f600254610396610ef3565b6103c46103a161104b565b9460405198899860e08a5260e08a0190610d0f565b9088820360208a0152610d0f565b6012604088015260608701929092527f000000000000000000000000a668c2a76f61d7c8047a8df8423b93954d7b96e16001600160a01b0316608087015285820360a0870152610d0f565b9083820360c0850152610d0f565b610d5f565b346101a15760403660031901126101a15761044861043e610d33565b6024359033611201565b602060405160018152f35b346101a1575f3660031901126101a1576101d46101c0610f9f565b610d99565b346101a1575f3660031901126101a1576040517f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03168152602090f35b346101a1575f3660031901126101a1576101d46101c0610ef3565b346101a15760203660031901126101a1576001600160a01b036104f3610d33565b165f525f602052602060405f2054604051908152f35b346101a1575f3660031901126101a1576020610523611116565b6040516001600160a01b039091168152f35b346101a1575f3660031901126101a1576040517f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03168152602090f35b346101a1575f3660031901126101a1576060608060405161059981610dd3565b828152826020820152826040820152828082015201526040516105bb81610dd3565b6040515f6007548060011c9160018216918215610a56575b602084108314610822578385528492908115610a3757506001146109d8575b6105fe92500382610e03565b8152604051905f6008548060011c91600182169182156109ce575b6020841083146108225783865285929081156109af5750600114610950575b61064492500383610e03565b602081019182526040515f6009548060011c9160018216918215610946575b60208410831461082257838552849290811561092757506001146108c8575b61068e92500382610e03565b60408201908152604051905f600a548060011c91600182169182156108be575b60208410831461082257838652859290811561089f5750600114610840575b6106d992500383610e03565b60608301918252604051935f600b548060011c90600181168015610836575b602083108114610822578289529081156107fe57506001146107a4575b509261077e869361076b610791946107356107589a6101d4990388610e03565b60808901968752604051998a9960208b525160a060208c015260c08b0190610d0f565b9051898203601f190160408b0152610d0f565b9051878203601f19016060890152610d0f565b9051858203601f19016080870152610d0f565b9051838203601f190160a0850152610d0f565b600b5f90815291507f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db95b8183106107e4575050850160200161077e610715565b6001816020929493945483858c01015201910191906107ce565b60ff19166020808a019190915291151560051b8801909101915061077e9050610715565b634e487b7160e01b5f52602260045260245ffd5b91607f16916106f8565b50600a5f90815290917fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b8183106108835750509060206106d9928201016106cd565b602091935080600191548385890101520191019091849261086b565b602092506106d994915060ff191682840152151560051b8201016106cd565b92607f16926106ae565b5060095f90815290917f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af5b81831061090b57505090602061068e92820101610682565b60209193508060019154838588010152019101909183926108f3565b6020925061068e94915060ff191682840152151560051b820101610682565b92607f1692610663565b5060085f90815290917ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee35b81831061099357505090602061064492820101610638565b602091935080600191548385890101520191019091849261097b565b6020925061064494915060ff191682840152151560051b820101610638565b92607f1692610619565b5060075f90815290917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6885b818310610a1b5750509060206105fe928201016105f2565b6020919350806001915483858801015201910190918392610a03565b602092506105fe94915060ff191682840152151560051b8201016105f2565b92607f16926105d3565b346101a1575f3660031901126101a1576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b346101a1575f3660031901126101a157602060405160128152f35b346101a15760603660031901126101a157610ad8610d33565b610ae0610d49565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610b1e575b506104489350611201565b838110610b83578415610b70573315610b5d57610448945f52600160205260405f2060018060a01b0333165f526020528360405f209103905584610b13565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b346101a1575f3660031901126101a1576020600254604051908152f35b346101a1575f3660031901126101a157602060405161ffff7f00000000000000000000000000000000000000000000000000000000000001f4168152f35b346101a15760403660031901126101a157610c12610d33565b602435903315610b70576001600160a01b0316908115610b5d57335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346101a1575f3660031901126101a157602060405162ffffff7f0000000000000000000000000000000000000000000000000000000000002710168152f35b346101a1575f3660031901126101a15760206040517f00000000000000000000000000000000000000000000000000000000018802d58152f35b346101a1575f3660031901126101a1576101d46101c0610e25565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101a157565b602435906001600160a01b03821682036101a157565b346101a1575f3660031901126101a15760206040517f000000000000000000000000000000000000000000295be96e640669720000008152f35b346101a1575f3660031901126101a15760206040517f0000000000000000000000000000000000000000002d7eb3f96e070d970000008152f35b60a0810190811067ffffffffffffffff821117610def57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff821117610def57604052565b604051905f6003548060011c9160018216918215610ee9575b602084108314610822578386528592908115610eca5750600114610e6b575b610e6992500383610e03565b565b5060035f90815290917fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b818310610eae575050906020610e6992820101610e5d565b6020919350806001915483858901015201910190918492610e96565b60209250610e6994915060ff191682840152151560051b820101610e5d565b92607f1692610e3e565b604051905f6006548060011c9160018216918215610f95575b602084108314610822578386528592908115610eca5750600114610f3657610e6992500383610e03565b5060065f90815290917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b818310610f79575050906020610e6992820101610e5d565b6020919350806001915483858901015201910190918492610f61565b92607f1692610f0c565b604051905f6004548060011c9160018216918215611041575b602084108314610822578386528592908115610eca5750600114610fe257610e6992500383610e03565b5060045f90815290917f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b818310611025575050906020610e6992820101610e5d565b602091935080600191548385890101520191019091849261100d565b92607f1692610fb8565b604051905f6005548060011c91600182169182156110ed575b602084108314610822578386528592908115610eca575060011461108e57610e6992500383610e03565b5060055f90815290917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b8183106110d1575050906020610e6992820101610e5d565b60209193508060019154838589010152019101909184926110b9565b92607f1692611064565b908160209103126101a157516001600160a01b03811681036101a15790565b604051630b4c774160e11b81523060048201526001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316602482015262ffffff7f0000000000000000000000000000000000000000000000000000000000002710166044820152602081806064810103817f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03165afa9081156111f6575f916111ca575090565b6111ec915060203d6020116111ef575b6111e48183610e03565b8101906110f7565b90565b503d6111da565b6040513d5f823e3d90fd5b916001600160a01b03831691821561143a576001600160a01b0316928315611427577f00000000000000000000000000000000000000000000000000000000018802d54311156112c4575b50815f525f60205260405f20548181106112ab57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b6112cd9061146e565b6112d8575b5f61124c565b437f00000000000000000000000000000000000000000000000000000000018802d31480806113f5575b15809181926113ed575b506113da57156112d257825f525f60205261132b8160405f205461144d565b7f000000000000000000000000000000000000000000295be96e64066972000000908181116113c1575050825f52600c60205261136c8160405f205461144d565b7f0000000000000000000000000000000000000000002d7eb3f96e070d970000008082116113a75750835f52600c60205260405f20556112d2565b90846334e5f8b760e21b5f5260045260245260445260645ffd5b846304a43e8b60e51b5f5260045260245260445260645ffd5b836385234f9760e01b5f5260045260245ffd5b90505f61130c565b507f000000000000000000000000a668c2a76f61d7c8047a8df8423b93954d7b96e16001600160a01b03168414611302565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b9190820180921161145a57565b634e487b7160e01b5f52601160045260245ffd5b6001600160a01b0361147e611116565b168015159081611609575b5061160357803b156115fe575f80604051602081019063ddca3f4360e01b8252600481526114b8602482610e03565b5190845afa3d156115f6573d9067ffffffffffffffff8211610def57604051916114ec601f8201601f191660200184610e03565b82523d5f602084013e5b1580156115eb575b6115e5576020818051810103126101a157602001519062ffffff821682036101a157604051630b4c774160e11b81523060048201526001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316602482015262ffffff9092166044830152602082806064810103817f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03165afa9182156111f6575f926115c4575b506001600160a01b0391821691161490565b6115de91925060203d6020116111ef576111e48183610e03565b905f6115b2565b50505f90565b5060208151106114fe565b6060906114f6565b505f90565b50600190565b6001600160a01b0383161490505f61148956fea264697066735822122070b0b34ff719af6c355d2c4572d0776d1d760b223bb416ee1f3ad6671530d55864736f6c634300081e0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x6f9277…6cfd53 | 12 days agoWed, 05 Aug 2026 20:46:22 UTC | Transfer | [0] 0x000000000000…192884ef [1] 0x000000000000…0000dead data: 0x000000000000000000…c02ddaed |
| 0x6f9277…6cfd53 | 12 days agoWed, 05 Aug 2026 20:46:22 UTC | Transfer | [0] 0x000000000000…192884ef [1] 0x000000000000…4d7b96e1 data: 0x000000000000000000…6aafc2fd |
| 0x6f9277…6cfd53 | 12 days agoWed, 05 Aug 2026 20:46:22 UTC | Transfer | [0] 0x000000000000…90a9cd17 [1] 0x000000000000…192884ef data: 0x000000000000000000…2add9dea |
| 0x6f9277…6cfd53 | 12 days agoWed, 05 Aug 2026 20:46:22 UTC | Transfer | [0] 0x000000000000…2c017749 [1] 0x000000000000…90a9cd17 data: 0x000000000000000000…2add9dea |
| 0x07fb89…0ec893 | 12 days agoWed, 05 Aug 2026 19:35:32 UTC | Transfer | [0] 0x000000000000…4d7b96e1 [1] 0x000000000000…2c017749 data: 0x000000000000000000…be91afbc |
| 0x6819f3…9768b6 | 12 days agoWed, 05 Aug 2026 19:35:14 UTC | Approval | [0] 0x000000000000…4d7b96e1 [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…be91afbc |
| 0x7dddca…f46fad | 12 days agoWed, 05 Aug 2026 19:31:58 UTC | Transfer | [0] 0x000000000000…2c017749 [1] 0x000000000000…4d7b96e1 data: 0x000000000000000000…be91afbc |
| 0x7dddca…f46fad | 12 days agoWed, 05 Aug 2026 19:31:58 UTC | Transfer | [0] 0x000000000000…fbe7d68b [1] 0x000000000000…2c017749 data: 0x000000000000000000…e7ffd018 |
| 0x7dddca…f46fad | 12 days agoWed, 05 Aug 2026 19:31:58 UTC | Approval | [0] 0x000000000000…fbe7d68b [1] 0x000000000000…638de0d3 data: 0x000000000000000000…e8000000 |
| 0x7dddca…f46fad | 12 days agoWed, 05 Aug 2026 19:31:58 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…fbe7d68b data: 0x000000000000000000…e8000000 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x6819f3…9768b6 | Approve | 28,741,777 | 12 days agoWed, 05 Aug 2026 19:35:14 UTC | 0xa668…96e1 | IN | GRIZETTE | $0.000 ETH | 0.00000108 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 28,739,803 | 12 days agoWed, 05 Aug 2026 19:31:58 UTC | 0x7dddca…f46fad | CREATE2 | launchToken | 0x0066…d68b | IN | 0xefbb…c0de | 0 ETH |