// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.26;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
/// @dev Minimal read of Uniswap V3 pool state used by the token to sample the
/// current spot price for the (display-only) mcap view.
interface IV3PoolMinimalSlot0 {
function slot0()
external
view
returns (uint160 sqrtPriceX96, int24 tick, uint16, uint16, uint16, uint8, bool);
}
/// @title PopiFastToken
/// @notice ERC-20 for FAST-V3-T0 launches — a Uniswap-V3-native memecoin that
/// trades from t=0. All anti-snipe / anti-whale logic lives in the token's
/// `_update` override because Robinhood-Chain V3 (Pons fork) exposes NO swap
/// hooks; the LP-recipient side has no leverage over swap flow.
///
/// ## Fee model (NOT a token transfer tax — reversed on owner review)
/// The 1% fee is the Uniswap V3 pool fee tier. It accrues to the SEED POSITION,
/// which is minted to the `PopiFastLpFeeVault` — a contract structurally
/// incapable of `decreaseLiquidity` / `burn` / any NFT transfer, so LP is
/// "burned" from a withdrawability standpoint but CAN `collect` the fee stream
/// and split it 50/50 creator/platform. Fully symmetric across buys and sells:
/// V3 charges the pool fee on every swap regardless of direction, so a taxable
/// path at the token layer is not required.
///
/// ## Restriction phases
/// - `restricted = true` at deploy: buys inside the 3-block anti-snipe window
/// revert; a buy larger than 3% supply reverts; a buy that pushes the
/// buyer's balance past 3% supply reverts.
/// - `restricted = false` after `checkGraduation` sees the pool's WETH balance
/// >= threshold: every path bypasses caps and anti-snipe. Irreversible even
/// if the pool's WETH later drops (graduation is permanent; trading
/// continues in the same pool).
///
/// The 3-block anti-snipe uses `block.number - deployBlock`; the dev-bundle
/// swap in the create tx bypasses it via `_devBundleActive`.
///
/// ## Graduation (Pons-parity, raise-based)
/// `checkGraduation` reads `IERC20(wethAddr).balanceOf(pool)` — the WETH the
/// pool holds (the cumulative WETH raised as buyers swap in) — and flips
/// `restricted = false` on the first time it is >= `graduationWethWei`. Anybody
/// can call it — cranking it is unforced. Graduation only lifts restrictions;
/// no payout. `currentMcapWei` (spot mcap) is kept as a display view only and
/// is no longer the gate.
///
/// ## Griefing
/// Someone can donate WETH straight to the pool to force early graduation, but
/// the cost is ~`graduationWethWei` of real WETH and graduation carries no
/// payout (it only lifts caps/anti-snipe), so the incentive is low. Pons has
/// the same exposure; accepted. Using the raw pool WETH balance (not
/// active-liquidity-only math) is the intended Pons-parity metric.
contract PopiFastToken is ERC20 {
// --------------------------------------------------------------------- //
// Constants //
// --------------------------------------------------------------------- //
/// @dev 1B * 1e18 — clean round supply for aggregator display (was 1.073B,
/// pump.fun's virtual token reserve; FAST no longer mirrors CurveMath).
uint256 public constant TOTAL_SUPPLY = 1_000_000_000e18;
/// @dev 3% per-tx cap on pool buys.
uint256 public constant MAX_PER_TX = (TOTAL_SUPPLY * 3) / 100;
/// @dev 3% per-wallet cap on pool buys.
uint256 public constant MAX_PER_WALLET = (TOTAL_SUPPLY * 3) / 100;
/// @dev Buys inside `[deployBlock, deployBlock + 3)` revert.
uint64 public constant ANTI_SNIPE_BLOCKS = 3;
uint256 internal constant Q96 = 1 << 96;
// --------------------------------------------------------------------- //
// Immutable config //
// --------------------------------------------------------------------- //
/// @notice The PopiFastFactory proxy that CREATE2-deployed this token. Only
/// this address may call `setPool` and `setDevBundleActive`.
address public immutable factory;
/// @notice The launch creator (informational; the LP-vault split binds off
/// the position record, not off the token).
address public immutable creator;
/// @notice Graduation WETH-raise threshold in WEI: graduation fires once the
/// pool's WETH balance reaches this. Snapshot from the factory's
/// `graduationMcapWei` config at deploy so a mid-flight admin change never
/// mutates an in-progress launch.
uint256 public immutable graduationWethWei;
/// @notice `block.number` at deploy — floor of the anti-snipe window.
uint64 public immutable deployBlock;
/// @notice WETH9 address — read for `balanceOf(pool)` (the raise-based
/// graduation gate) and for token0/token1 ordering in the mcap view.
address public immutable wethAddr;
// --------------------------------------------------------------------- //
// Mutable state //
// --------------------------------------------------------------------- //
/// @notice The Uniswap V3 pool paired against WETH at `factory.poolFee`.
/// Written once by the factory in the create tx after pool
/// createAndInitialize. Zero until then.
address public pool;
/// @notice True while restrictions apply (post-deploy). Flipped irreversibly
/// to false the first time the pool's WETH balance reaches the threshold.
bool public restricted;
/// @notice Set by the factory around the create-tx dev-bundle router swap.
/// Suppresses anti-snipe / caps for that ONE swap only.
bool internal _devBundleActive;
string private _uri;
// --------------------------------------------------------------------- //
// Errors //
// --------------------------------------------------------------------- //
error AntiSnipeActive();
error ExceedsMaxPerWallet();
error ExceedsMaxPerTx();
error NotFactory();
error PoolAlreadySet();
// --------------------------------------------------------------------- //
// Events //
// --------------------------------------------------------------------- //
event PoolSet(address pool);
event DevBundleActive(bool active);
/// @dev Payload is the pool's WETH balance (WETH raised) at graduation, not
/// spot mcap — the indexer keys on this signature.
event Graduated(uint256 wethInPool);
// --------------------------------------------------------------------- //
// Constructor //
// --------------------------------------------------------------------- //
constructor(
string memory name_,
string memory symbol_,
string memory uri_,
address creator_,
uint256 graduationWethWei_,
address wethAddr_
) ERC20(name_, symbol_) {
factory = msg.sender;
creator = creator_;
graduationWethWei = graduationWethWei_;
deployBlock = uint64(block.number);
wethAddr = wethAddr_;
_uri = uri_;
restricted = true;
// Full supply minted to the factory; the factory approves the NPM and
// seeds the pool from this bag in the same tx.
_mint(msg.sender, TOTAL_SUPPLY);
}
// --------------------------------------------------------------------- //
// Factory hooks //
// --------------------------------------------------------------------- //
/// @notice Write the V3 pool address once, from the factory. Reverts on
/// re-call — the pool is the anchor for `isBuy`/`isSell` detection so it
/// must be immutable in effect.
function setPool(address pool_) external {
if (msg.sender != factory) revert NotFactory();
if (pool != address(0)) revert PoolAlreadySet();
pool = pool_;
emit PoolSet(pool_);
}
/// @notice Toggle the dev-bundle bypass. Factory-only. Emitted so an
/// off-chain guard can alarm on any lingering `true`.
function setDevBundleActive(bool active) external {
if (msg.sender != factory) revert NotFactory();
_devBundleActive = active;
emit DevBundleActive(active);
}
// --------------------------------------------------------------------- //
// Graduation //
// --------------------------------------------------------------------- //
/// @notice Permissionless crank: reads the pool's WETH balance (WETH raised)
/// and flips `restricted = false` the first time it is >= `graduationWethWei`.
/// Idempotent — no-op once already unrestricted. This crank is the reliable
/// graduation path; the in-`_update` best-effort check lags by one swap (see
/// `_maybeGraduate`).
function checkGraduation() external {
_maybeGraduate();
}
/// @notice Spot market cap in wei — DISPLAY ONLY. No longer the graduation
/// gate (graduation is raise-based; see `checkGraduation`).
function currentMcapWei() external view returns (uint256) {
return _currentMcapWei();
}
/// @dev Reads slot0 and reprices TOTAL_SUPPLY in WETH. Handles both
/// token0/token1 orderings. Returns 0 if the pool has not been wired yet.
function _currentMcapWei() internal view returns (uint256) {
address p = pool;
if (p == address(0)) return 0;
(uint160 sqrtPriceX96,,,,,,) = IV3PoolMinimalSlot0(p).slot0();
if (sqrtPriceX96 == 0) return 0;
// priceX96 = sqrtPriceX96^2 / 2^96 = price(token1/token0) * 2^96.
// mulDiv handles the 320-bit intermediate.
uint256 priceX96 = Math.mulDiv(uint256(sqrtPriceX96), uint256(sqrtPriceX96), Q96);
if (address(this) < wethAddr) {
// token is token0, WETH is token1 -> price = WETH per token.
// mcap = TOTAL_SUPPLY * price = TOTAL_SUPPLY * priceX96 / 2^96.
return Math.mulDiv(TOTAL_SUPPLY, priceX96, Q96);
} else {
// token is token1, WETH is token0 -> price = token per WETH.
// WETH per token = 1/price; mcap = TOTAL_SUPPLY / price
// = TOTAL_SUPPLY * 2^96 / priceX96.
if (priceX96 == 0) return 0;
return Math.mulDiv(TOTAL_SUPPLY, Q96, priceX96);
}
}
/// @dev Raise-based gate: pool WETH balance >= threshold flips `restricted`.
/// NOTE: on a V3 BUY the pool sends the output token (firing this via
/// `_update` pool->buyer) BEFORE `uniswapV3SwapCallback` pulls the WETH in,
/// so `balanceOf(pool)` here does NOT yet include the incoming WETH — the
/// in-`_update` check lags by one interaction; `checkGraduation` is reliable.
function _maybeGraduate() internal {
if (!restricted) return;
address p = pool;
if (p == address(0)) return;
uint256 wethInPool = IERC20(wethAddr).balanceOf(p);
if (wethInPool >= graduationWethWei) {
restricted = false;
emit Graduated(wethInPool);
}
}
// --------------------------------------------------------------------- //
// Metadata //
// --------------------------------------------------------------------- //
/// @notice ERC-1046 token URI — the `ipfs://…` metadata blob pinned at
/// createFastLaunch.
function tokenURI() external view returns (string memory) {
return _uri;
}
/// @notice ERC-7572 contract URI — GMGN + friends read this to render the
/// coin image for free.
function contractURI() external view returns (string memory) {
return _uri;
}
// --------------------------------------------------------------------- //
// Core transfer hook //
// --------------------------------------------------------------------- //
/// @dev OZ v5 hook: fires on every mint, burn, and transfer. Restrictions
/// only apply after `pool` is set and while `restricted == true`. NO TAX —
/// see the fee-model note in the contract header.
///
/// Short-circuit branches pass straight through:
/// * mint / burn (from or to == address(0))
/// * factory as source / destination (create-tx seeding, dev bundle)
/// * `_devBundleActive` (the one router swap the factory routes on behalf
/// of the creator inside the create tx)
///
/// On pool BUYS (from == pool): enforce anti-snipe + 3% caps.
/// On pool SELLS (to == pool) OR wallet-to-wallet: pass through.
function _update(address from, address to, uint256 amount) internal override {
if (
!restricted
|| from == address(0)
|| to == address(0)
|| from == factory
|| to == factory
|| _devBundleActive
) {
super._update(from, to, amount);
_maybeGraduate();
return;
}
address _pool = pool;
// If the pool has not been wired yet, treat everything as
// wallet-to-wallet (which the factory-source short-circuit above should
// already have caught, but this keeps the state machine tight).
if (_pool == address(0)) {
super._update(from, to, amount);
return;
}
if (from == _pool) {
// ------- POOL BUY ------- //
if (block.number - uint256(deployBlock) < ANTI_SNIPE_BLOCKS) revert AntiSnipeActive();
if (amount > MAX_PER_TX) revert ExceedsMaxPerTx();
super._update(from, to, amount);
if (balanceOf(to) > MAX_PER_WALLET) revert ExceedsMaxPerWallet();
} else {
// Pool sell OR wallet-to-wallet: unrestricted.
super._update(from, to, amount);
}
_maybeGraduate();
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "uri_",
"type": "string",
"internalType": "string"
},
{
"name": "creator_",
"type": "address",
"internalType": "address"
},
{
"name": "graduationWethWei_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "wethAddr_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AntiSnipeActive",
"type": "error",
"inputs": []
},
{
"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": "ExceedsMaxPerTx",
"type": "error",
"inputs": []
},
{
"name": "ExceedsMaxPerWallet",
"type": "error",
"inputs": []
},
{
"name": "NotFactory",
"type": "error",
"inputs": []
},
{
"name": "PoolAlreadySet",
"type": "error",
"inputs": []
},
{
"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": "DevBundleActive",
"type": "event",
"inputs": [
{
"name": "active",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "Graduated",
"type": "event",
"inputs": [
{
"name": "wethInPool",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "PoolSet",
"type": "event",
"inputs": [
{
"name": "pool",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"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": "ANTI_SNIPE_BLOCKS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "MAX_PER_TX",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_PER_WALLET",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TOTAL_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"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": "checkGraduation",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "contractURI",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "creator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "currentMcapWei",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "deployBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "graduationWethWei",
"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": "pool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "restricted",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "setDevBundleActive",
"type": "function",
"inputs": [
{
"name": "active",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPool",
"type": "function",
"inputs": [
{
"name": "pool_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "tokenURI",
"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": "wethAddr",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
}
]0x6080806040526004361015610012575f80fd5b5f3560e01c90816302d05d3f1461087f5750806306fdde03146107c4578063095ea7b3146107425780630f2cdd6c1461013a57806316f0115b1461071a57806317be72031461068557806318160ddd1461066857806322a5b2a51461062e57806323b872dd1461054f578063313ce567146105345780633c130d901461013f5780634437152a146104725780636a2d447b146104585780637072c6b11461043357806370a08231146103fc5780637d5aa5f4146103b8578063902d55a51461039257806391af40961461037057806395d89b411461026c578063a3ec191a14610228578063a9059cbb146101f7578063c45a0155146101b3578063dd62ed3e14610163578063e6aaca4414610144578063e8a3d4851461013f5763f43a22dc1461013a575f80fd5b610916565b61093c565b3461015f575f36600319011261015f57602060405160038152f35b5f80fd5b3461015f57604036600319011261015f5761017c6108ea565b610184610900565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461015f575f36600319011261015f576040517f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd6001600160a01b03168152602090f35b3461015f57604036600319011261015f5761021d6102136108ea565b6024359033610a2e565b602060405160018152f35b3461015f575f36600319011261015f576040517f00000000000000000000000000000000000000000000000000000000018805946001600160401b03168152602090f35b3461015f575f36600319011261015f576040515f6004548060011c90600181168015610366575b6020831081146103525782855290811561032e57506001146102d0575b6102cc836102c0818503826109f7565b604051918291826108c0565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b808210610314575090915081016020016102c06102b0565b9192600181602092548385880101520191019092916102fc565b60ff191660208086019190915291151560051b840190910191506102c090506102b0565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610293565b3461015f575f36600319011261015f57602061038a610bae565b604051908152f35b3461015f575f36600319011261015f57604051676765c793fa10079d601b1b8152602090f35b3461015f575f36600319011261015f576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b3461015f57602036600319011261015f576001600160a01b0361041d6108ea565b165f525f602052602060405f2054604051908152f35b3461015f575f36600319011261015f57602060ff60055460a01c166040519015158152f35b3461015f575f36600319011261015f57610470610a7f565b005b3461015f57602036600319011261015f5761048b6108ea565b7f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd6001600160a01b0316330361052557600554906001600160a01b038216610516576001600160a01b03166001600160a01b03199190911681176005556040519081527f025f89b99c8ce32af8da7624f4575b920a86ebf07870d85a9fb545fee349ddce90602090a1005b632fc00d1f60e11b5f5260045ffd5b631966391b60e11b5f5260045ffd5b3461015f575f36600319011261015f57602060405160128152f35b3461015f57606036600319011261015f576105686108ea565b610570610900565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f1981106105ae575b5061021d9350610a2e565b8381106106135784156106005733156105ed5761021d945f52600160205260405f2060018060a01b0333165f526020528360405f2091039055846105a3565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b3461015f575f36600319011261015f5760206040517f0000000000000000000000000000000000000000000000003a4965bf58a400008152f35b3461015f575f36600319011261015f576020600254604051908152f35b3461015f57602036600319011261015f5760043580151580910361015f577f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd6001600160a01b03163303610525576005805460ff60a81b191660a883901b60ff60a81b161790556040519081527f28533f8e92c53e717c2e0d937a7c50a0a84e566dfd421f61b9fb97f07f0c287790602090a1005b3461015f575f36600319011261015f576005546040516001600160a01b039091168152602090f35b3461015f57604036600319011261015f5761075b6108ea565b602435903315610600576001600160a01b03169081156105ed57335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b3461015f575f36600319011261015f576040515f6003548060011c90600181168015610875575b6020831081146103525782855290811561032e5750600114610817576102cc836102c0818503826109f7565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b80821061085b575090915081016020016102c06102b0565b919260018160209254838588010152019101909291610843565b91607f16916107eb565b3461015f575f36600319011261015f577f00000000000000000000000072af3d9069e223089d7dedb7a685cec6083ed9236001600160a01b03168152602090f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361015f57565b602435906001600160a01b038216820361015f57565b3461015f575f36600319011261015f5760206a18d0bf423c03d8de000000604051908152f35b3461015f575f36600319011261015f576040515f6006548060011c906001811680156109ed575b6020831081146103525782855290811561032e575060011461098f576102cc836102c0818503826109f7565b60065f9081527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939250905b8082106109d3575090915081016020016102c06102b0565b9192600181602092548385880101520191019092916109bb565b91607f1691610963565b601f909101601f19168101906001600160401b03821190821017610a1a57604052565b634e487b7160e01b5f52604160045260245ffd5b91906001600160a01b03831615610a6c576001600160a01b03811615610a5957610a5792610ce3565b565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b60055460ff8160a01c1615610b9c576001600160a01b038116908115610b98576040516370a0823160e01b815260048101929092526020826024817f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165afa918215610b8d575f92610b59575b507f0000000000000000000000000000000000000000000000003a4965bf58a40000821015610b21575050565b60ff60a01b19166005556040519081527f04d39283851d5dc1961a5296a48d487854db2aae45afe51e83aae1db8d04d42f90602090a1565b9091506020813d602011610b85575b81610b75602093836109f7565b8101031261015f5751905f610af4565b3d9150610b68565b6040513d5f823e3d90fd5b5050565b50565b519061ffff8216820361015f57565b6005546001600160a01b03168015610c4b5760e060049160405192838092633850c7bd851b82525afa908115610b8d575f91610c50575b506001600160a01b03168015610c4b5780610bff91610ebf565b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0316301015610c3c57610c3990610f48565b90565b8015610c4b57610c3990610f1e565b505f90565b905060e0813d60e011610cdb575b81610c6b60e093836109f7565b8101031261015f578051906001600160a01b038216820361015f5760208101518060020b0361015f57610ca060408201610b9f565b50610cad60608201610b9f565b50610cba60808201610b9f565b5060a081015160ff81160361015f5760c001518015150361015f575f610be5565b3d9150610c5e565b60055460ff8160a01c1615908115610ead575b8115610e9b575b8115610e64575b8115610e2d575b8115610e1f575b50610e14576005546001600160a01b03168015610e08576001600160a01b03821603610df8577f00000000000000000000000000000000000000000000000000000000018805946001600160401b031643908103908111610de457600311610dd5576a18d0bf423c03d8de00000092838111610dc65782610d9292610fb5565b6001600160a01b03165f9081526020819052604090205411610db7575b610a57610a7f565b63c0e54d7360e01b5f5260045ffd5b638cc2fc5560e01b5f5260045ffd5b63070514dd60e31b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b90610e039291610fb5565b610daf565b5090610a579291610fb5565b90610daf9291610fb5565b60ff915060a81c165f610d12565b6001600160a01b038481167f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd909116149150610d0b565b6001600160a01b038381167f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd909116149150610d04565b6001600160a01b038416159150610cfd565b6001600160a01b038316159150610cf6565b5f91905f198282099180820293848085109403938085039414610f1457600160601b841015610f025750600160601b910990828211900360a01b910360601c1790565b634e487b71905260116020526024601cfd5b5050505060601c90565b8015610f3457676765c793fa10079d607b1b0490565b634e487b7160e01b5f52601260045260245ffd5b5f905f1981676765c793fa10079d601b1b09676765c793fa10079d601b1b82029283821091849003828103939214610fac57600160601b831015610f025750600160601b90676765c793fa10079d601b1b0990828211900360a01b910360601c1790565b50505060601c90565b6001600160a01b0316908161101d57600254838101809111610de4575f80516020611070833981519152916020916002555b6001600160a01b031693846110085780600254036002555b604051908152a3565b845f525f825260405f20818154019055610fff565b815f525f60205260405f2054838110611054575f805160206110708339815191529184602092855f525f84520360405f2055610fe7565b91905063391434e360e21b5f5260045260245260445260645ffdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa164736f6c634300081a000a
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x8c6a91…6ce41d | 8 days agoSun, 09 Aug 2026 19:36:18 UTC | 0x28533f…2877 | data: 0x000000000000000000…00000000 |
| 0x8c6a91…6ce41d | 8 days agoSun, 09 Aug 2026 19:36:18 UTC | 0x28533f…2877 | data: 0x000000000000000000…00000001 |
| 0x6f4c20…69ccef | 8 days agoSun, 09 Aug 2026 19:36:17 UTC | 0x28533f…2877 | data: 0x000000000000000000…00000000 |
| 0x6f4c20…69ccef | 8 days agoSun, 09 Aug 2026 19:36:17 UTC | 0x28533f…2877 | data: 0x000000000000000000…00000001 |
| 0x2b2226…fa0d94 | 9 days agoSat, 08 Aug 2026 20:48:28 UTC | 0x28533f…2877 | data: 0x000000000000000000…00000000 |
| 0x2b2226…fa0d94 | 9 days agoSat, 08 Aug 2026 20:48:28 UTC | 0x28533f…2877 | data: 0x000000000000000000…00000001 |
| 0x6670ea…a0831b | 9 days agoSat, 08 Aug 2026 20:35:32 UTC | 0x28533f…2877 | data: 0x000000000000000000…00000000 |
| 0x6670ea…a0831b | 9 days agoSat, 08 Aug 2026 20:35:32 UTC | Transfer | [0] 0x000000000000…56d37007 [1] 0x000000000000…b8c45eca data: 0x000000000000000000…f6cc2d97 |
| 0x6670ea…a0831b | 9 days agoSat, 08 Aug 2026 20:35:32 UTC | Transfer | [0] 0x000000000000…a215f774 [1] 0x000000000000…56d37007 data: 0x000000000000000000…f6cc2d97 |
| 0x6670ea…a0831b | 9 days agoSat, 08 Aug 2026 20:35:32 UTC | 0x28533f…2877 | data: 0x000000000000000000…00000001 |
| 0x320515…c8242b | 9 days agoSat, 08 Aug 2026 20:23:30 UTC | Transfer | [0] 0x000000000000…b8c45eca [1] 0x000000000000…a215f774 data: 0x000000000000000000…afb55ee2 |
| 0x4fdb60…010b38 | 9 days agoSat, 08 Aug 2026 20:23:29 UTC | Approval | [0] 0x000000000000…b8c45eca [1] 0x000000000000…959e5cb2 data: 0xffffffffffffffffff…ffffffff |
| 0x7210b7…f84634 | 10 days agoFri, 07 Aug 2026 08:39:37 UTC | Transfer | [0] 0x000000000000…56d37007 [1] 0x000000000000…b8c45eca data: 0x000000000000000000…afb55ee2 |
| 0x7210b7…f84634 | 10 days agoFri, 07 Aug 2026 08:39:37 UTC | Transfer | [0] 0x000000000000…a215f774 [1] 0x000000000000…56d37007 data: 0x000000000000000000…afb55ee2 |
| 0x100c8e…a476ef | 10 days agoFri, 07 Aug 2026 07:44:05 UTC | Transfer | [0] 0x000000000000…b8c45eca [1] 0x000000000000…a215f774 data: 0x000000000000000000…5d0479ea |
| 0xefcd6f…5e56e2 | 10 days agoFri, 07 Aug 2026 07:44:04 UTC | Approval | [0] 0x000000000000…b8c45eca [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…5d0479ea |
| 0x4c67b4…584ebe | 12 days agoWed, 05 Aug 2026 22:54:15 UTC | Transfer | [0] 0x000000000000…56d37007 [1] 0x000000000000…b8c45eca data: 0x000000000000000000…5d0479ea |
| 0x4c67b4…584ebe | 12 days agoWed, 05 Aug 2026 22:54:15 UTC | Transfer | [0] 0x000000000000…a215f774 [1] 0x000000000000…56d37007 data: 0x000000000000000000…5d0479ea |
| 0x719b8a…f9ec6d | 12 days agoWed, 05 Aug 2026 22:05:29 UTC | Transfer | [0] 0x000000000000…93a6be0e [1] 0x000000000000…a215f774 data: 0x000000000000000000…71866b79 |
| 0x610e59…99d1e5 | 12 days agoWed, 05 Aug 2026 22:05:29 UTC | Transfer | [0] 0x000000000000…941dcb20 [1] 0x000000000000…a215f774 data: 0x000000000000000000…9457f9f0 |
| 0x316116…9e436a | 12 days agoWed, 05 Aug 2026 22:05:29 UTC | Transfer | [0] 0x000000000000…b7398a72 [1] 0x000000000000…a215f774 data: 0x000000000000000000…b414f91a |
| 0x7e72c5…85f9db | 12 days agoWed, 05 Aug 2026 22:05:29 UTC | Transfer | [0] 0x000000000000…24fc7899 [1] 0x000000000000…a215f774 data: 0x000000000000000000…27a62ddb |
| 0x5ea4b2…743f15 | 12 days agoWed, 05 Aug 2026 22:05:25 UTC | Transfer | [0] 0x000000000000…4bcf24a4 [1] 0x000000000000…a215f774 data: 0x000000000000000000…6718be9a |
| 0xe5c2fb…bdf1ea | 12 days agoWed, 05 Aug 2026 22:05:22 UTC | Transfer | [0] 0x000000000000…4bcf24a4 [1] 0x000000000000…a215f774 data: 0x000000000000000000…6718be9a |
| 0xf0443e…bbfd24 | 12 days agoWed, 05 Aug 2026 22:05:20 UTC | Transfer | [0] 0x000000000000…a215f774 [1] 0x000000000000…4bcf24a4 data: 0x000000000000000000…ce317d34 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x4fdb60…010b38 | Approve | 31,358,114 | 9 days agoSat, 08 Aug 2026 20:23:29 UTC | 0xc032…5eca | IN | DRONG | $0.000 ETH | 0.00000138 | |
| 0xefcd6f…5e56e2 | Approve | 30,040,999 | 10 days agoFri, 07 Aug 2026 07:44:04 UTC | 0xc032…5eca | IN | DRONG | $0.000 ETH | 0.00000146 | |
| 0x966ab8…aa9f62 | Approve | 28,831,184 | 12 days agoWed, 05 Aug 2026 22:04:16 UTC | 0x7133…8a83 | IN | DRONG | $0.000 ETH | 0.00000114 | |
| 0xb47750…81caa4 | Approve | 28,825,623 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0xcfae…d8d0 | IN | DRONG | $0.000 ETH | 0.00000114 | |
| 0x6fe993…0dd30d | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x8ebb…5c9f | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0x763b85…7b5c5d | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x11b4…3970 | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0xa8b3e5…11b690 | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x5a49…f92c | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0x2b97b3…403d10 | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x9e43…fcdc | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0x6d2d25…66a8ab | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0xe95d…8a72 | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0x87e41c…591c9b | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x40e2…ff35 | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0x4310af…386b77 | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x6500…7899 | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0xcb614b…c10f4a | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x3c4e…cb20 | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0xffb94a…cc6fd5 | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x6c94…7c72 | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0x8b660f…3a89bc | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x3117…24a4 | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0x2b3715…86790d | Approve | 28,825,622 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x1caa…be0e | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0x27bab4…455bc2 | Approve | 28,825,620 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x3d39…c6bb | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0xe8e552…a04470 | Approve | 28,825,620 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x8761…4b99 | IN | DRONG | $0.000 ETH | 0.00000113 | |
| 0x28aa34…a040e8 | Approve | 28,825,620 | 12 days agoWed, 05 Aug 2026 21:55:01 UTC | 0x8bbf…91cc | IN | DRONG | $0.000 ETH | 0.00000113 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 28,824,580 | 12 days agoWed, 05 Aug 2026 21:53:16 UTC | 0x11e3c4…3fc50b | CREATE2 | createFastLaunch | 0x6b45…65dd | IN | 0x8420…0755 | 0 ETH |