| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000123 | $0 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x89600812…6ff76c | Transfer | 17,315,781 | 23 days agoThu, 23 Jul 2026 13:15:49 UTC | 0xcaf7…5d11 | IN | 0x01ac…4663 | $0.001 DIH |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x62b849…1371df | 20 days agoSun, 26 Jul 2026 12:44:43 UTC | Transfer | [0] 0x000000000000…e9b05d31 [1] 0x000000000000…43e40951 data: 0x000000000000000000…3064f244 |
| 0x62b849…1371df | 20 days agoSun, 26 Jul 2026 12:44:43 UTC | Transfer | [0] 0x000000000000…3294b726 [1] 0x000000000000…e9b05d31 data: 0x000000000000000000…3064f244 |
| 0xe8a52a…2cea41 | 20 days agoSun, 26 Jul 2026 12:44:38 UTC | Approval | [0] 0x000000000000…3294b726 [1] 0x000000000000…f6797d6d data: 0xffffffffffffffffff…ffffffff |
| 0xc35175…fb9375 | 20 days agoSun, 26 Jul 2026 12:44:33 UTC | Approval | [0] 0x000000000000…3294b726 [1] 0x000000000000…db8c0904 data: 0xffffffffffffffffff…ffffffff |
| 0x8d801b…2946d2 | 20 days agoSun, 26 Jul 2026 12:44:28 UTC | Approval | [0] 0x000000000000…3294b726 [1] 0x000000000000…e1a4f53d data: 0xffffffffffffffffff…ffffffff |
| 0x177c7e…e2b99a | 20 days agoSun, 26 Jul 2026 12:44:23 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…3294b726 data: 0x000000000000000000…3064b604 |
| 0xeb5b82…676e67 | 23 days agoThu, 23 Jul 2026 08:21:27 UTC | Approval | [0] 0x000000000000…d733cca7 [1] 0x000000000000…1fcf6f60 data: 0xffffffffffffffffff…ffffffff |
| 0x641a90…7710e0 | 24 days agoWed, 22 Jul 2026 05:41:40 UTC | Transfer | [0] 0x000000000000…3294b726 [1] 0x000000000000…43e40951 data: 0x000000000000000000…3064b605 |
| 0xeb3d48…af5bd5 | 24 days agoWed, 22 Jul 2026 05:41:39 UTC | Approval | [0] 0x000000000000…3294b726 [1] 0x000000000000…3ac78ba3 data: 0xffffffffffffffffff…ffffffff |
| 0x819fb7…039388 | 24 days agoWed, 22 Jul 2026 05:41:36 UTC | Transfer | [0] 0x000000000000…94624eff [1] 0x000000000000…3294b726 data: 0x000000000000000000…3064f245 |
| 0x819fb7…039388 | 24 days agoWed, 22 Jul 2026 05:41:36 UTC | Transfer | [0] 0x000000000000…94624eff [1] 0x000000000000…24c8fce5 data: 0x000000000000000000…12a91bec |
| 0x819fb7…039388 | 24 days agoWed, 22 Jul 2026 05:41:36 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…94624eff data: 0x000000000000000000…430e0e31 |
| 0x819fb7…039388 | 24 days agoWed, 22 Jul 2026 05:41:36 UTC | 0x494517…76af | [0] 0x000000000000…94624eff data: 0x000000000000000000…00000001 |
| 0x62b131…bb2d19 | 24 days agoWed, 22 Jul 2026 05:41:19 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…d733cca7 data: 0x000000000000000000…bd651343 |
| 0xb45891…53d526 | 24 days agoWed, 22 Jul 2026 05:40:54 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…d733cca7 data: 0x000000000000000000…cc98e031 |
| 0x6b742d…c8835d | 26 days agoMon, 20 Jul 2026 23:34:38 UTC | Transfer | [0] 0x000000000000…c7349999 [1] 0x000000000000…43e40951 data: 0x000000000000000000…728f53f3 |
| 0xfd7bc7…7f8d6e | 26 days agoMon, 20 Jul 2026 23:34:38 UTC | Approval | [0] 0x000000000000…c7349999 [1] 0x000000000000…e534ecb1 data: 0xffffffffffffffffff…ffffffff |
| 0x8414f6…1f077d | 32 days agoTue, 14 Jul 2026 22:03:21 UTC | Transfer | [0] 0x000000000000…db8c0904 [1] 0x000000000000…43e40951 data: 0x000000000000000000…83debb2e |
| 0x8414f6…1f077d | 32 days agoTue, 14 Jul 2026 22:03:21 UTC | Transfer | [0] 0x000000000000…10cf0836 [1] 0x000000000000…db8c0904 data: 0x000000000000000000…83debb2e |
| 0x4ccc3a…4072b2 | 32 days agoTue, 14 Jul 2026 21:40:20 UTC | Approval | [0] 0x000000000000…10cf0836 [1] 0x000000000000…34442049 data: 0xffffffffffffffffff…ffffffff |
| 0x37da06…52e72b | 32 days agoTue, 14 Jul 2026 21:40:19 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…10cf0836 data: 0x000000000000000000…83debb2e |
| 0xca0500…e3829a | 32 days agoTue, 14 Jul 2026 11:06:06 UTC | Transfer | [0] 0x000000000000…db8c0904 [1] 0x000000000000…43e40951 data: 0x000000000000000000…2c546c52 |
| 0xca0500…e3829a | 32 days agoTue, 14 Jul 2026 11:06:06 UTC | Transfer | [0] 0x000000000000…d28d9bb7 [1] 0x000000000000…db8c0904 data: 0x000000000000000000…2c546c52 |
| 0x3230bd…3e248c | 32 days agoTue, 14 Jul 2026 08:05:39 UTC | Transfer | [0] 0x000000000000…34442049 [1] 0x000000000000…d28d9bb7 data: 0x000000000000000000…2c546c52 |
| 0x3230bd…3e248c | 32 days agoTue, 14 Jul 2026 08:05:39 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…34442049 data: 0x000000000000000000…2c546c52 |
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.26;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
import {FullMath} from "v4-core/libraries/FullMath.sol";
interface ILimitExemptRegistry {
function isLimitExempt(address account) external view returns (bool);
}
/// @notice Purpose-built, fixed-supply, ownerless launch token with two flywheel reward mechanics that
/// need per-holder accounting: (a) auto-rebasing native-token REFLECTIONS and (b) WETH DIVIDENDS — both
/// paid ONLY to EOA (non-contract) holders. It is NOT an OZ ERC-20 subclass: it implements IERC20 +
/// IERC20Metadata from scratch over a dual ledger.
///
/// Dual ledger (no set is ever enumerated):
/// - ELIGIBLE holders (EOAs, not registry-exempt) are stored as SHARES of an elastic token pool. Their
/// `balanceOf` = shares * totalEligibleTokens / totalShares, so a reflection (which grows
/// totalEligibleTokens) rebases every eligible balance up pro-rata with no per-holder writes.
/// - EXCLUDED holders (contracts, registry-exempt infra, address(0), 0xdead) are stored as RAW token
/// amounts that never rebase. This is what keeps the Uniswap pool's reserves sound: the PoolManager,
/// hook, launcher, and routers are all excluded, so a reflection never inflates the pool's balance.
///
/// Eligibility is evaluated LAZILY: every transfer (and mint) reclassifies both parties, converting a
/// holder's whole balance between the two ledgers at the current rate if its class changed. A
/// permissionless `sync(a)` forces a reclassification (handles a contract that received tokens during
/// its own constructor, when its code size still read as 0).
///
/// During the launch window it enforces max-tx / max-wallet limits on inbound transfers to non-exempt
/// wallets; the launchpad hook flips `limitsLifted` ONE-WAY the first time price crosses the target
/// market cap (or after an optional time backstop), after which limits never bind again.
contract LaunchToken is IERC20, IERC20Metadata, IERC20Errors {
using SafeERC20 for IERC20;
using SafeCast for uint256;
error MaxTxExceeded();
error MaxWalletExceeded();
error OnlyLifter();
error ReflectionUnbacked();
error NoEligibleHolders();
/// A WETH distribution was attempted while the eligible base is below MIN_DIVIDEND_SHARES.
error InsufficientShares();
event LimitsLifted();
/// Native-token reflection: `amount` tokens moved from the hook into the elastic pool (rebases all
/// eligible balances up), or burned if there were no eligible holders yet.
event ReflectionDistributed(uint256 amount);
/// WETH dividend of `amount` distributed pro-rata to eligible (EOA) holders' shares.
event WethDistributed(uint256 amount);
event WethClaimed(address indexed holder, address indexed to, uint256 amount);
/// A holder crossed the EOA/contract boundary and had its whole balance moved between ledgers.
event Reclassified(address indexed account, bool excluded);
/// @dev Magnitude scaler for the WETH-dividend accumulator (classic magnified-dividend pattern).
uint256 private constant MAG = 2 ** 128;
address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
/// @notice Minimum eligible share base required to accept a WETH distribution. Distributing while
/// `_totalShares` is tiny would blow `_magWethPerShare` up astronomically (dividing a large WETH
/// amount by a sub-token share base); flooring the denominator at 1 token of shares keeps the
/// accumulator bounded so it can never lose precision or overflow on a later distribution. The hook
/// reads this to ROLL a reward FORWARD instead of distributing below the floor (public so callers can
/// reference it as a compile-time constant, no external call needed). See distributeWeth / harvest.
uint256 public constant MIN_DIVIDEND_SHARES = 1e18;
// ---------------------------------------------------------------- immutables / config
/// The launcher that deployed this token; the entire supply is minted to it for seeding.
address public immutable launcher;
/// The hook allowed to permanently lift limits AND to distribute reflections / WETH dividends.
address public immutable lifter;
/// Source of the shared infra exempt-set (PoolManager, routers, hook…).
ILimitExemptRegistry public immutable registry;
/// The reward / quote currency (WETH). The token custodies dividend WETH until holders claim it.
address public immutable weth;
uint128 public immutable maxTxBaseAmount;
uint128 public immutable maxWalletBaseAmount;
/// Optional time backstop; 0 = limits only lift on the price latch.
uint40 public immutable limitsExpiry;
bool public limitsLifted;
/// Set true only during a privileged transfer (hook fee payout or launcher dev-vesting release) so
/// those bypass the launch-window limits — never true during a swap. See setPrivilegedTransfer.
bool private _privileged;
string private _name;
string private _symbol;
string private _tokenURI;
// ---------------------------------------------------------------- dual ledger
uint256 private _supply; // totalSupply(); INVARIANT: _supply == _totalEligibleTokens + _totalRaw
uint256 private _totalEligibleTokens; // token backing behind the shares ledger
uint256 private _totalRaw; // sum of excluded holders' raw balances
uint256 private _totalShares; // aggregate shares
mapping(address => uint256) private _shares; // eligible holders' shares
mapping(address => uint256) private _raw; // excluded holders' raw token balance
mapping(address => bool) private _excluded; // current STORED class of each account
mapping(address => mapping(address => uint256)) private _allowances;
// ---------------------------------------------------------------- WETH magnified dividends
uint256 private _magWethPerShare; // scaled by MAG
mapping(address => int256) private _corr; // per-holder correction, kept exact on every share change
mapping(address => uint256) private _withdrawn; // WETH already claimed by a holder
constructor(
string memory name_,
string memory symbol_,
string memory tokenURI_,
uint256 supply,
address lifter_,
address registry_,
uint128 maxTx_,
uint128 maxWallet_,
uint40 startTime_,
uint32 limitsDuration_,
address weth_
) {
launcher = msg.sender;
lifter = lifter_;
registry = ILimitExemptRegistry(registry_);
weth = weth_;
maxTxBaseAmount = maxTx_;
maxWalletBaseAmount = maxWallet_;
// Derive the limits backstop from deterministic args only. `block.timestamp` is read here (not a
// constructor arg), so it does NOT affect the CREATE2 address — the token address stays mineable
// off-chain for the vanity suffix.
uint40 activation = startTime_ == 0 ? uint40(block.timestamp) : startTime_;
limitsExpiry = limitsDuration_ == 0 ? 0 : uint40(uint256(activation) + limitsDuration_);
_name = name_;
_symbol = symbol_;
_tokenURI = tokenURI_;
if (maxTx_ == 0 && maxWallet_ == 0) limitsLifted = true; // nothing to enforce
_mint(msg.sender, supply); // launcher is a contract => excluded/raw
}
// ---------------------------------------------------------------- ERC20 metadata
function name() external view returns (string memory) {
return _name;
}
function symbol() external view returns (string memory) {
return _symbol;
}
function decimals() external pure returns (uint8) {
return 18;
}
function tokenURI() external view returns (string memory) {
return _tokenURI;
}
// ---------------------------------------------------------------- ERC20 views
function totalSupply() external view returns (uint256) {
return _supply;
}
/// @notice Elastic for eligible holders (shares * rate), raw for excluded holders.
function balanceOf(address account) public view returns (uint256) {
if (_excluded[account]) return _raw[account];
return _sharesToTokens(_shares[account]);
}
function allowance(address owner, address spender) external view returns (uint256) {
return _allowances[owner][spender];
}
// ---------------------------------------------------------------- ERC20 mutators
function approve(address spender, uint256 value) external returns (bool) {
if (spender == address(0)) revert ERC20InvalidSpender(address(0));
_allowances[msg.sender][spender] = value;
emit Approval(msg.sender, spender, value);
return true;
}
function transfer(address to, uint256 value) external returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint256 value) external returns (bool) {
_spendAllowance(from, msg.sender, value);
_transfer(from, to, value);
return true;
}
/// @notice Burn caller's tokens (launcher burns seeding dust; anyone may burn their own).
function burn(uint256 amount) external {
_burn(msg.sender, amount);
}
// ---------------------------------------------------------------- launch-window limits
/// @notice Permanently disable launch-window limits. Callable once by the hook.
function liftLimits() external {
if (msg.sender != lifter) revert OnlyLifter();
if (!limitsLifted) {
limitsLifted = true;
emit LimitsLifted();
}
}
/// @notice Launcher/hook-only: temporarily exempt a privileged transfer (a fee-withdrawal by the
/// hook, or a dev-vesting release by the launcher) from the launch limits. The caller toggles this
/// true→transfer→false within a single call, so it is never observable during a swap and cannot be
/// used to bypass trader buy limits.
function setPrivilegedTransfer(bool value) external {
if (msg.sender != lifter && msg.sender != launcher) revert OnlyLifter();
_privileged = value;
}
/// @notice True while limits still bind (the time backstop is honored live, not just on lift).
function limitsActive() public view returns (bool) {
if (limitsLifted) return false;
if (limitsExpiry != 0 && block.timestamp >= limitsExpiry) return false;
return true;
}
// ---------------------------------------------------------------- reclassification
/// @notice Force `a` into its correct ledger. Permissionless; supply-conserving. Needed when a
/// contract received tokens during its own constructor (code size read 0, so it was mis-stored as
/// eligible) — this, or its next transfer, moves it to the excluded/raw ledger where it can't rebase.
function sync(address a) external {
_reclassify(a);
}
/// @notice Whether `a` is CURRENTLY stored in the excluded (raw) ledger.
function isExcluded(address a) external view returns (bool) {
return _excluded[a];
}
// ---------------------------------------------------------------- flywheel distribution (lifter-only)
/// @notice Auto-rebasing native-token reflection. The hook must have first sent this token `r` tokens
/// (held as raw against the lifter). If there are eligible holders, `r` is moved from raw into the
/// elastic pool, growing every eligible balance pro-rata with no claim. If there are none yet, `r` is
/// burned so nothing is stranded. Total supply is unchanged by the rebase (only by the empty burn).
function distributeReflection(uint256 r) external {
if (msg.sender != lifter) revert OnlyLifter();
if (r == 0) return;
if (_raw[lifter] < r) revert ReflectionUnbacked();
_raw[lifter] -= r;
_totalRaw -= r;
if (_totalShares != 0) {
_totalEligibleTokens += r; // rebase up; _supply stays == _totalEligibleTokens + _totalRaw
emit ReflectionDistributed(r);
} else {
_supply -= r; // no eligible holders: burn instead of stranding
emit Transfer(lifter, address(0), r);
}
}
/// @notice Distribute `w` WETH pro-rata to eligible holders' shares. The hook must have already sent
/// this token `w` WETH (the token custodies it until holders claim). Reverts if there are no eligible
/// holders, or if the eligible base is below MIN_DIVIDEND_SHARES (the hook checks `totalShares()`
/// first and rolls the WETH forward in either case). Flooring the share base keeps `_magWethPerShare`
/// bounded: it only ever grows by `mulDiv(w, MAG, _totalShares)` with `_totalShares >= 1e18`, so for
/// uint128-bounded `w` the accumulator (and every product it feeds) stays well within uint256.
/// Uses FullMath.mulDiv (512-bit intermediate) so the store itself can never overflow.
function distributeWeth(uint256 w) external {
if (msg.sender != lifter) revert OnlyLifter();
if (w == 0) return;
if (_totalShares == 0) revert NoEligibleHolders();
if (_totalShares < MIN_DIVIDEND_SHARES) revert InsufficientShares();
_magWethPerShare += FullMath.mulDiv(w, MAG, _totalShares);
emit WethDistributed(w);
}
// ---------------------------------------------------------------- WETH dividend claims
/// @notice WETH earned by `a` that has not yet been withdrawn (0 for excluded holders).
function withdrawableWeth(address a) public view returns (uint256) {
uint256 acc = _accumulativeWeth(a);
uint256 w = _withdrawn[a];
return acc > w ? acc - w : 0;
}
/// @notice Cumulative WETH ever allocated to `a` (before withdrawals).
function accumulativeWeth(address a) external view returns (uint256) {
return _accumulativeWeth(a);
}
function claimWeth() external returns (uint256) {
return _claimWeth(msg.sender);
}
function claimWeth(address to) external returns (uint256) {
return _claimWethTo(msg.sender, to);
}
function _claimWeth(address holder) private returns (uint256) {
return _claimWethTo(holder, holder);
}
function _claimWethTo(address holder, address to) private returns (uint256 amount) {
_reclassify(holder); // a mis-stored contract flips to excluded here and can no longer claim
amount = withdrawableWeth(holder);
if (amount == 0) return 0;
_withdrawn[holder] += amount;
IERC20(weth).safeTransfer(to, amount);
emit WethClaimed(holder, to, amount);
}
// ---------------------------------------------------------------- ledger introspection
function totalShares() external view returns (uint256) {
return _totalShares;
}
function totalEligibleTokens() external view returns (uint256) {
return _totalEligibleTokens;
}
function totalRaw() external view returns (uint256) {
return _totalRaw;
}
function sharesOf(address a) external view returns (uint256) {
return _shares[a];
}
function magWethPerShare() external view returns (uint256) {
return _magWethPerShare;
}
// ================================================================ internals
function _sharesToTokens(uint256 s) private view returns (uint256) {
if (_totalShares == 0) return 0;
return Math.mulDiv(s, _totalEligibleTokens, _totalShares);
}
function _tokensToShares(uint256 t) private view returns (uint256) {
// Bootstrap 1:1 when the elastic pool is empty (first eligible holder sets the rate).
if (_totalEligibleTokens == 0) return t;
return Math.mulDiv(t, _totalShares, _totalEligibleTokens);
}
/// @dev Add `dv` shares to `a`, keeping its WETH-dividend correction consistent. The correction is
/// stored in WETH units (`mulDiv(_magWethPerShare, dv, MAG)`, a 512-bit intermediate) so it can never
/// overflow no matter how large `_magWethPerShare` is. Increasing shares SUBTRACTS (the new shares
/// must not retroactively earn past distributions). Because the base term
/// (`_accumulativeWeth`) floors independently, we round this subtraction UP so every holder's
/// accumulative stays <= its true entitlement — this makes `sum(accumulative) <= distributed` hold
/// EXACTLY (no dust over-credit), which keeps the token provably solvent for dividend claims.
function _incShares(address a, uint256 dv) private {
_shares[a] += dv;
_totalShares += dv;
_corr[a] -= FullMath.mulDivRoundingUp(_magWethPerShare, dv, MAG).toInt256();
}
/// @dev Remove `dv` shares from `a`, keeping its WETH-dividend correction consistent (WETH units,
/// 512-bit intermediate — cannot overflow). Decreasing shares ADDS back the already-earned slice;
/// rounded DOWN (floor) so the credit can never exceed what was truly earned (conservative, solvent).
function _decShares(address a, uint256 dv) private {
_shares[a] -= dv;
_totalShares -= dv;
_corr[a] += FullMath.mulDiv(_magWethPerShare, dv, MAG).toInt256();
}
/// @dev Cumulative WETH allocated to `a`, in WETH units. `mulDiv(_magWethPerShare, _shares[a], MAG)`
/// uses a 512-bit intermediate, so however large `_magWethPerShare` has grown the WETH-unit result
/// (bounded by total WETH distributed) fits uint256 — it can never overflow or trip `toInt256`.
function _accumulativeWeth(address a) private view returns (uint256) {
if (_excluded[a]) return 0;
int256 v = int256(FullMath.mulDiv(_magWethPerShare, _shares[a], MAG)) + _corr[a];
return v <= 0 ? 0 : uint256(v);
}
function _isExcludedNow(address a) private view returns (bool) {
return a == address(0) || a == DEAD || a.code.length > 0 || registry.isLimitExempt(a);
}
/// @dev Exempt from the launch-window limits (distinct from the ledger-exclusion set).
function _isExempt(address account) private view returns (bool) {
return account == launcher || account == lifter || registry.isLimitExempt(account);
}
/// @dev If `a`'s live class differs from its stored class, move its whole balance between ledgers at
/// the current rate. Supply-conserving; leaves the WETH-dividend correction exact.
function _reclassify(address a) private {
bool shouldExclude = _isExcludedNow(a);
if (shouldExclude == _excluded[a]) return;
if (shouldExclude) {
// eligible -> excluded: freeze the current elastic balance into raw
uint256 sh = _shares[a];
uint256 bal = _sharesToTokens(sh);
if (sh != 0) _decShares(a, sh);
_totalEligibleTokens -= bal;
_raw[a] += bal;
_totalRaw += bal;
_excluded[a] = true;
} else {
// excluded -> eligible: mint shares for the raw balance at the current rate
uint256 bal = _raw[a];
_totalRaw -= bal;
_raw[a] = 0;
_excluded[a] = false;
uint256 dv = _tokensToShares(bal); // rate BEFORE adding bal to the pool
_incShares(a, dv);
_totalEligibleTokens += bal;
}
emit Reclassified(a, shouldExclude);
}
/// @dev Mint by class of `to`; updates `_supply`. Emits Transfer(0, to).
function _mint(address to, uint256 value) private {
_reclassify(to);
if (_excluded[to]) {
_raw[to] += value;
_totalRaw += value;
} else {
_incShares(to, _tokensToShares(value));
_totalEligibleTokens += value;
}
_supply += value;
emit Transfer(address(0), to, value);
}
/// @dev Burn by class of `from`; updates `_supply`. Emits Transfer(from, 0).
function _burn(address from, uint256 value) private {
_reclassify(from);
if (_excluded[from]) {
uint256 r = _raw[from];
if (value > r) revert ERC20InsufficientBalance(from, r, value);
_raw[from] = r - value;
_totalRaw -= value;
} else {
uint256 bal = _sharesToTokens(_shares[from]);
if (value > bal) revert ERC20InsufficientBalance(from, bal, value);
uint256 dv = _tokensToShares(value);
uint256 fromShares = _shares[from];
if (dv > fromShares) dv = fromShares; // clamp rounding
_decShares(from, dv);
_totalEligibleTokens -= value;
}
_supply -= value;
emit Transfer(from, address(0), value);
}
/// @dev Class-pair transfer with exact share conservation. Reclassifies both parties, enforces the
/// launch-window limits, then routes by (fromClass, toClass) — never a generic burn+mint.
function _transfer(address from, address to, uint256 value) private {
if (from == address(0)) revert ERC20InvalidSender(address(0));
if (to == address(0)) revert ERC20InvalidReceiver(address(0));
_reclassify(from);
_reclassify(to);
// Enforce only on transfers into a non-exempt wallet while limits are active. The hook, launcher,
// and registry-listed infra (PoolManager, routers) are all exempt.
if (!_privileged && limitsActive() && !_isExempt(to)) {
if (maxTxBaseAmount != 0 && value > maxTxBaseAmount) revert MaxTxExceeded();
if (maxWalletBaseAmount != 0 && balanceOf(to) + value > maxWalletBaseAmount) revert MaxWalletExceeded();
}
bool fromEx = _excluded[from];
bool toEx = _excluded[to];
if (!fromEx && !toEx) {
// eligible -> eligible: move shares only; totals unchanged (invariant under reflection)
uint256 bal = _sharesToTokens(_shares[from]);
if (value > bal) revert ERC20InsufficientBalance(from, bal, value);
uint256 dv = _tokensToShares(value);
uint256 fromShares = _shares[from];
if (dv > fromShares) dv = fromShares; // clamp rounding
// WETH-unit corrections via 512-bit mulDiv: never overflow regardless of _magWethPerShare.
// `from` keeps its already-earned slice (+, floored — never credit more than earned); `to`
// must not inherit it (-, rounded up — never under-subtract). Both round conservatively so
// neither party's accumulative can exceed its true entitlement (keeps sum <= distributed).
int256 dFrom = FullMath.mulDiv(_magWethPerShare, dv, MAG).toInt256();
int256 dTo = FullMath.mulDivRoundingUp(_magWethPerShare, dv, MAG).toInt256();
_shares[from] = fromShares - dv;
_shares[to] += dv;
_corr[from] += dFrom;
_corr[to] -= dTo;
} else if (!fromEx && toEx) {
// eligible -> excluded
uint256 bal = _sharesToTokens(_shares[from]);
if (value > bal) revert ERC20InsufficientBalance(from, bal, value);
uint256 dv = _tokensToShares(value);
uint256 fromShares = _shares[from];
if (dv > fromShares) dv = fromShares;
_decShares(from, dv);
_totalEligibleTokens -= value;
_raw[to] += value;
_totalRaw += value;
} else if (fromEx && !toEx) {
// excluded -> eligible
uint256 r = _raw[from];
if (value > r) revert ERC20InsufficientBalance(from, r, value);
_raw[from] = r - value;
_totalRaw -= value;
_incShares(to, _tokensToShares(value)); // rate BEFORE the add below
_totalEligibleTokens += value;
} else {
// excluded -> excluded
uint256 r = _raw[from];
if (value > r) revert ERC20InsufficientBalance(from, r, value);
_raw[from] = r - value;
_raw[to] += value;
}
emit Transfer(from, to, value);
}
function _spendAllowance(address owner, address spender, uint256 value) private {
uint256 current = _allowances[owner][spender];
if (current != type(uint256).max) {
if (current < value) revert ERC20InsufficientAllowance(spender, current, value);
unchecked {
_allowances[owner][spender] = current - value;
}
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "tokenURI_",
"type": "string",
"internalType": "string"
},
{
"name": "supply",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "lifter_",
"type": "address",
"internalType": "address"
},
{
"name": "registry_",
"type": "address",
"internalType": "address"
},
{
"name": "maxTx_",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "maxWallet_",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "startTime_",
"type": "uint40",
"internalType": "uint40"
},
{
"name": "limitsDuration_",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "weth_",
"type": "address",
"internalType": "address"
}
],
"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": "InsufficientShares",
"type": "error",
"inputs": []
},
{
"name": "MaxTxExceeded",
"type": "error",
"inputs": []
},
{
"name": "MaxWalletExceeded",
"type": "error",
"inputs": []
},
{
"name": "NoEligibleHolders",
"type": "error",
"inputs": []
},
{
"name": "OnlyLifter",
"type": "error",
"inputs": []
},
{
"name": "ReflectionUnbacked",
"type": "error",
"inputs": []
},
{
"name": "SafeCastOverflowedUintToInt",
"type": "error",
"inputs": [
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"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": "LimitsLifted",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "Reclassified",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "excluded",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "ReflectionDistributed",
"type": "event",
"inputs": [
{
"name": "amount",
"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": "WethClaimed",
"type": "event",
"inputs": [
{
"name": "holder",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "WethDistributed",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "MIN_DIVIDEND_SHARES",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "accumulativeWeth",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"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": "burn",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimWeth",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "claimWeth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "pure"
},
{
"name": "distributeReflection",
"type": "function",
"inputs": [
{
"name": "r",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "distributeWeth",
"type": "function",
"inputs": [
{
"name": "w",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "isExcluded",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "launcher",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "liftLimits",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "lifter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "limitsActive",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "limitsExpiry",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint40",
"internalType": "uint40"
}
],
"stateMutability": "view"
},
{
"name": "limitsLifted",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "magWethPerShare",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxTxBaseAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "maxWalletBaseAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "registry",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ILimitExemptRegistry"
}
],
"stateMutability": "view"
},
{
"name": "setPrivilegedTransfer",
"type": "function",
"inputs": [
{
"name": "value",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sharesOf",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "sync",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "tokenURI",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalEligibleTokens",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalRaw",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalShares",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"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": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "withdrawableWeth",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
}
]0x6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde0314610c8057508063095ea7b314610bda57806316eebd1e14610b9757806318160ddd14610b7a5780631c07065d14610b395780631cce34ee14610b155780632056797114610af857806323b872dd14610a2a578063313ce56714610a0f5780633a98ef39146109f25780633c130d90146109375780633fc8cef3146108f457806342966c68146107b25780635c632e151461079657806367514d5a1461077557806370a082311461075257806373e13bff146107065780637b103999146106c35780638bd9901d1461069f57806392dd8b96146106835780639442ca72146105c757806395d89b41146104c3578063988353b9146104a7578063a584119414610484578063a9059cbb14610453578063b8d0098d14610407578063b951335d146103ea578063c63ea8a1146103c8578063cba0e9961461038b578063d89c032a14610348578063dac8ae8314610325578063dd62ed3e146102d1578063eb73f404146102b4578063eed3daa614610289578063f5eb42dc146102515763f60b3d6d146101a8575f80fd5b3461024d575f60031936011261024d576001600160a01b037f0000000000000000000000002ab65cb22064f84cb832be2effd00d218be6e0cc163303610225575f5460ff8116156101f557005b60ff1960019116175f557f6b5411070eae529868e92b0141a4919fd4a8616f9893959e34ae2ad653a75da75f80a1005b7feb4d64b5000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f80fd5b3461024d57602060031936011261024d576001600160a01b03610272610d62565b165f526008602052602060405f2054604051908152f35b3461024d57602060031936011261024d5760206102ac6102a7610d62565b611bef565b604051908152f35b3461024d575f60031936011261024d576020600554604051908152f35b3461024d57604060031936011261024d576102ea610d62565b6001600160a01b036102fa610d78565b91165f52600b6020526001600160a01b0360405f2091165f52602052602060405f2054604051908152f35b3461024d57602060031936011261024d5760206102ac610343610d62565b611090565b3461024d575f60031936011261024d5760206040516001600160a01b037f0000000000000000000000002ab65cb22064f84cb832be2effd00d218be6e0cc168152f35b3461024d57602060031936011261024d576001600160a01b036103ac610d62565b165f52600a602052602060ff60405f2054166040519015158152f35b3461024d575f60031936011261024d576020604051670de0b6b3a76400008152f35b3461024d575f60031936011261024d576020600c54604051908152f35b3461024d575f60031936011261024d5760206040516fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461024d57604060031936011261024d5761047961046f610d62565b60243590336110fa565b602060405160018152f35b3461024d57602060031936011261024d576104a56104a0610d62565b6119f9565b005b3461024d57602060031936011261024d576104a5600435610f70565b3461024d575f60031936011261024d576040515f6002548060011c906001811680156105bd575b6020831081146105a9578285529081156105855750600114610527575b6105238361051781850382610d8e565b60405191829182610d38565b0390f35b91905060025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace915f905b80821061056b57509091508101602001610517610507565b919260018160209254838588010152019101909291610553565b60ff191660208086019190915291151560051b840190910191506105179050610507565b634e487b7160e01b5f52602260045260245ffd5b91607f16916104ea565b3461024d57602060031936011261024d5760043580151580910361024d576001600160a01b037f0000000000000000000000002ab65cb22064f84cb832be2effd00d218be6e0cc1633141580610650575b610225577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff005f549260081b169116175f555f80f35b506001600160a01b037f0000000000000000000000008072e8416149eb837866e1f07b689685f3f2239b16331415610618565b3461024d575f60031936011261024d5760206102ac33336118bc565b3461024d57602060031936011261024d5760206102ac6106bd610d62565b336118bc565b3461024d575f60031936011261024d5760206040516001600160a01b037f000000000000000000000000a72e8630368ca61b759d16b64387665df2d802d3168152f35b3461024d575f60031936011261024d5760206040516fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461024d57602060031936011261024d5760206102ac610770610d62565b610f20565b3461024d575f60031936011261024d57602060ff5f54166040519015158152f35b3461024d57602060031936011261024d576104a5600435610e3a565b3461024d57602060031936011261024d576004356107cf336119f9565b335f52600a60205260ff60405f2054165f1461089157335f52600960205260405f205480821161085f5790610805815f93610f63565b3383526009602052604083205561081e81600654610f63565b6006555b61082e81600454610f63565b6004556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203392a3005b7fe450d38c000000000000000000000000000000000000000000000000000000005f523360045260245260445260645ffd5b335f5260086020526108a660405f20546118a7565b80821161085f5750806108d86108bc5f93611c65565b338452600860205260408420548082116108ec575b5033611cda565b6108e481600554610f63565b600555610822565b9050846108d1565b3461024d575f60031936011261024d5760206040516001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73168152f35b3461024d575f60031936011261024d576040515f6003548060011c906001811680156109e8575b6020831081146105a957828552908115610585575060011461098a576105238361051781850382610d8e565b91905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915f905b8082106109ce57509091508101602001610517610507565b9192600181602092548385880101520191019092916109b6565b91607f169161095e565b3461024d575f60031936011261024d576020600754604051908152f35b3461024d575f60031936011261024d57602060405160128152f35b3461024d57606060031936011261024d57610a43610d62565b610a4b610d78565b604435906001600160a01b03831692835f52600b60205260405f206001600160a01b0333165f5260205260405f2054935f198503610a8f575b5061047993506110fa565b838510610ac45793610479945f52600b60205260405f206001600160a01b0333165f526020528360405f209103905584610a84565b83857ffb8f41b2000000000000000000000000000000000000000000000000000000005f523360045260245260445260645ffd5b3461024d575f60031936011261024d576020600654604051908152f35b3461024d575f60031936011261024d576020610b2f610dc5565b6040519015158152f35b3461024d575f60031936011261024d57602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461024d575f60031936011261024d576020600454604051908152f35b3461024d575f60031936011261024d5760206040516001600160a01b037f0000000000000000000000008072e8416149eb837866e1f07b689685f3f2239b168152f35b3461024d57604060031936011261024d57610bf3610d62565b6001600160a01b03166024358115610c5457335f52600b60205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b7f94280d62000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b3461024d575f60031936011261024d575f6001548060011c90600181168015610d2e575b6020831081146105a9578285529081156105855750600114610cd0576105238361051781850382610d8e565b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b808210610d1457509091508101602001610517610507565b919260018160209254838588010152019101909291610cfc565b91607f1691610ca4565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b600435906001600160a01b038216820361024d57565b602435906001600160a01b038216820361024d57565b90601f601f19910116810190811067ffffffffffffffff821117610db157604052565b634e487b7160e01b5f52604160045260245ffd5b60ff5f5416610e0a5764ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081610e0e575b50610e0a57600190565b5f90565b90504210155f610e00565b91908201809211610e2657565b634e487b7160e01b5f52601160045260245ffd5b6001600160a01b037f0000000000000000000000002ab65cb22064f84cb832be2effd00d218be6e0cc163303610225578015610f1d576007548015610ef557670de0b6b3a76400008110610ecd5781610ec1610eb96020937fff6b15d2b880a47cb8b268f33cc09a203868e4edd24f311975947d0356bab2bc95611722565b600c54610e19565b600c55604051908152a1565b7f39996567000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f9ca772d3000000000000000000000000000000000000000000000000000000005f5260045ffd5b50565b6001600160a01b0316805f52600a60205260ff60405f205416610f54575f526008602052610f5160405f20546118a7565b90565b5f52600960205260405f205490565b91908203918211610e2657565b6001600160a01b037f0000000000000000000000002ab65cb22064f84cb832be2effd00d218be6e0cc1680330361022557811561108c57805f5260096020528160405f20541061106457805f52600960205260405f20610fd1838254610f63565b9055610fdf82600654610f63565b60065560075415611027575060208161101b7f26221fceafd78c0e5cc8c06eae46dda5be9b778e6723222df87a3c25c785d27e93600554610e19565b600555604051908152a1565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020836110585f95600454610f63565b600455604051908152a3565b7fb1b18913000000000000000000000000000000000000000000000000000000005f5260045ffd5b5050565b6001600160a01b036110a182611bef565b91165f52600e60205260405f20548082115f146110c157610f5191610f63565b50505f90565b9190915f8382019384129112908015821691151617610e2657565b81810392915f138015828513169184121617610e2657565b90916001600160a01b0382169182156116f6576001600160a01b0384169384156116ca57611127826119f9565b611130816119f9565b60ff5f5460081c1615806116bc575b8061159c575b6114a2575b5f848152600a60205260408082205487835291205460ff91821691168115808061149a575b1561129c575050505050815f52600860205261118e60405f20546118a7565b80821161126a57506020816111c37fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93611c65565b845f526008835260405f205490818111611263575b600c5490611205816111ff6111f4826111f96111f482896117c4565b611d32565b96611d87565b94610f63565b875f526008865260405f2055875f526008855261122760405f20918254610e19565b9055855f52600d845261123f60405f209182546110c7565b9055855f52600d835261125760405f209182546110e2565b90555b604051908152a3565b50806111d8565b827fe450d38c000000000000000000000000000000000000000000000000000000005f5260045260245260445260645ffd5b80611493575b1561138a57505050825f5260086020526112bf60405f20546118a7565b8083116113565750816113136020926112f87fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef95611c65565b90865f526008855260405f205480831161134e575b50611cda565b61131f81600554610f63565b600555845f526009825260405f20611338828254610e19565b905561134681600654610e19565b60065561125a565b91505f61130d565b9050827fe450d38c000000000000000000000000000000000000000000000000000000005f5260045260245260445260645ffd5b919250908161148a575b501561141e57825f52600960205260405f2054808311611356579161140a6020926113e0837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef96610f63565b865f526009855260405f20556113f883600654610f63565b60065561140483611c65565b90611c7e565b61141681600554610e19565b60055561125a565b50815f52600960205260405f205480821161126a57816114617fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93602093610f63565b845f526009835260405f2055845f526009825260405f20611483828254610e19565b905561125a565b9050155f611394565b50806112a2565b50811561116f565b6fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081611592575b5061156a576fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801515908161154f575b501561114a577f2ce93b59000000000000000000000000000000000000000000000000000000005f5260045ffd5b90506115638461155e84610f20565b610e19565b115f611521565b7f4db0008c000000000000000000000000000000000000000000000000000000005f5260045ffd5b905083115f6114df565b506001600160a01b037f0000000000000000000000008072e8416149eb837866e1f07b689685f3f2239b168514801561168a575b80156115dd575b15611145565b506040517fb0c150af0000000000000000000000000000000000000000000000000000000081528560048201526020816024816001600160a01b037f000000000000000000000000a72e8630368ca61b759d16b64387665df2d802d3165afa90811561167f575f91611650575b506115d7565b611672915060203d602011611678575b61166a8183610d8e565b810190611c4d565b5f61164a565b503d611660565b6040513d5f823e3d90fd5b506001600160a01b037f0000000000000000000000002ab65cb22064f84cb832be2effd00d218be6e0cc1685146115d0565b506116c5610dc5565b61113f565b7fec442f05000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b7f96c6fd1e000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b908160801b905f1970010000000000000000000000000000000084099282808510940393808503948584111561024d57146117bd5770010000000000000000000000000000000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b90808202915f1982820991838084109303928084039384700100000000000000000000000000000000111561024d571461181e57700100000000000000000000000000000000910990828211900360801b910360801c1790565b50505060801c90565b91818302915f198185099383808610950394808603958685111561024d571461189f579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b60075480156110c157600554610f5192611dbc565b91906118c7836119f9565b6118d083611090565b9283156119f2576001600160a01b0316805f52600e60205260405f206118f7858254610e19565b90556001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316916001600160a01b03604051917fa9059cbb000000000000000000000000000000000000000000000000000000005f521692836004528560245260205f60448180855af160015f51148116156119d3575b82604052156119a85750602081867fc8520eac2083d5707943065cd53fcb6137138bf5ae18d17ae26628c97846b2009352a3565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60018115166119e957813b15153d151616611974565b823d5f823e3d90fd5b505f925050565b6001600160a01b0381169081158015611be4575b8015611bda575b8015611b48575b825f52600a60205260ff60405f2054161515811515908114611b42577f4945170e34345dc66fa94389cde838452c0aa4c70a748af6a2850692b57a76af9260209215611ae657611ab390855f526008845260405f205490611a7b826118a7565b9180611ad6575b5050611a9081600554610f63565b600555855f526009845260405f20611aa9828254610e19565b9055600654610e19565b600655835f52600a825260405f20600160ff198254161790555b604051908152a2565b611adf91611cda565b5f80611a82565b611b3a90855f5260098452611b3260405f205491611b0683600654610f63565b600655875f52600986525f6040812055875f52600a865260405f2060ff19815416905561140483611c65565b600554610e19565b600555611acd565b50505050565b506040517fb0c150af0000000000000000000000000000000000000000000000000000000081528260048201526020816024816001600160a01b037f000000000000000000000000a72e8630368ca61b759d16b64387665df2d802d3165afa90811561167f575f91611bbb575b50611a1b565b611bd4915060203d6020116116785761166a8183610d8e565b5f611bb5565b50803b1515611a14565b5061dead8214611a0d565b6001600160a01b0316805f52600a60205260ff60405f205416611c4857611c3c90611c29600c54825f52600860205260405f2054906117c4565b905f52600d60205260405f2054906110c7565b5f8113610f5157505f90565b505f90565b9081602091031261024d5751801515810361024d5790565b6005548015611c7a57600754610f5192611dbc565b5090565b6111f46001600160a01b03611cbf921692835f52600860205260405f20611ca6828254610e19565b9055611cb481600754610e19565b600755600c54611d87565b905f52600d602052611cd660405f209182546110e2565b9055565b6111f46001600160a01b03611d1b921692835f52600860205260405f20611d02828254610f63565b9055611d1081600754610f63565b600755600c546117c4565b905f52600d602052611cd660405f209182546110c7565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111611d5c5790565b7f24775e06000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b919070010000000000000000000000000000000090611da7828286611827565b9309611daf57565b9060010190811561024d57565b90915f198383099280830292838086109503948086039514611e4d5784831115611e355790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505080925015611e5b570490565b634e487b7160e01b5f52601260045260245ffdfea164736f6c634300081a000a
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 9,368,120 | 32 days agoTue, 14 Jul 2026 07:59:19 UTC | 0x48e64c…09b555 | CREATE2 | launch | 0x8072…239b | IN | 0x01ac…4663 | 0 ETH |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xe8a52a…2cea41 | Approve | 19,880,337 | 20 days agoSun, 26 Jul 2026 12:44:38 UTC | 0xe390…b726 | IN | Squeez Cat | $0.000 ETH | 0.00000249 | |
| 0xc35175…fb9375 | Approve | 19,880,289 | 20 days agoSun, 26 Jul 2026 12:44:33 UTC | 0xe390…b726 | IN | Squeez Cat | $0.000 ETH | 0.00000245 | |
| 0x8d801b…2946d2 | Approve | 19,880,241 | 20 days agoSun, 26 Jul 2026 12:44:28 UTC | 0xe390…b726 | IN | Squeez Cat | $0.000 ETH | 0.00000248 | |
| 0xeb5b82…676e67 | Approve | 17,139,713 | 23 days agoThu, 23 Jul 2026 08:21:27 UTC | 0x152b…cca7 | IN | Squeez Cat | $0.000 ETH | 0.00000481 | |
| 0xeb3d48…af5bd5 | Approve | 16,181,865 | 24 days agoWed, 22 Jul 2026 05:41:39 UTC | 0xe390…b726 | IN | Squeez Cat | $0.000 ETH | 0.00000349 | |
| 0xfd7bc7…7f8d6e | Approve | 15,100,095 | 26 days agoMon, 20 Jul 2026 23:34:38 UTC | 0x99bd…9999 | IN | Squeez Cat | $0.000 ETH | 0.00000267 | |
| 0x4ccc3a…4072b2 | Approve | 9,860,331 | 32 days agoTue, 14 Jul 2026 21:40:20 UTC | 0x0885…0836 | IN | Squeez Cat | $0.000 ETH | 0.00000246 | |
| 0x47e358…be29af | Approve | 9,371,627 | 32 days agoTue, 14 Jul 2026 08:05:10 UTC | 0x3823…8c0d | IN | Squeez Cat | $0.000 ETH | 0.00000215 | |
| 0x41e29f…94e545 | Approve | 9,371,097 | 32 days agoTue, 14 Jul 2026 08:04:17 UTC | 0xc7fc…9bb7 | IN | Squeez Cat | $0.000 ETH | 0.00000215 | |
| 0x602bdc…30b13d | Approve | 9,370,476 | 32 days agoTue, 14 Jul 2026 08:03:15 UTC | 0xea57…4f8f | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x8a36db…401268 | Approve | 9,370,476 | 32 days agoTue, 14 Jul 2026 08:03:15 UTC | 0x4e08…b44b | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x58f5f1…4af9f7 | Approve | 9,370,476 | 32 days agoTue, 14 Jul 2026 08:03:15 UTC | 0xcad2…288d | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x7f450d…9d72d1 | Approve | 9,370,475 | 32 days agoTue, 14 Jul 2026 08:03:15 UTC | 0x0bc6…e2f6 | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x6af0d0…813c5e | Approve | 9,370,409 | 32 days agoTue, 14 Jul 2026 08:03:09 UTC | 0x26d4…ec8c | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x303107…82f7b1 | Approve | 9,370,243 | 32 days agoTue, 14 Jul 2026 08:02:52 UTC | 0x152b…cca7 | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x2fba48…3b882a | Approve | 9,370,147 | 32 days agoTue, 14 Jul 2026 08:02:42 UTC | 0x309f…1968 | IN | Squeez Cat | $0.000 ETH | 0.00000215 | |
| 0x3e6db9…136b71 | Approve | 9,369,975 | 32 days agoTue, 14 Jul 2026 08:02:25 UTC | 0x5800…dc16 | IN | Squeez Cat | $0.000 ETH | 0.00000213 | |
| 0xa7a8fc…cdac95 | Approve | 9,369,695 | 32 days agoTue, 14 Jul 2026 08:01:57 UTC | 0xff1c…ac32 | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x41575f…14a8e5 | Approve | 9,369,684 | 32 days agoTue, 14 Jul 2026 08:01:56 UTC | 0x7dcf…aeef | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0xad6a57…6ffe63 | Approve | 9,369,684 | 32 days agoTue, 14 Jul 2026 08:01:56 UTC | 0x3811…cfe7 | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x0664ba…b76e68 | Approve | 9,369,684 | 32 days agoTue, 14 Jul 2026 08:01:56 UTC | 0xec6f…2458 | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x2a97ae…5fc8e9 | Approve | 9,369,684 | 32 days agoTue, 14 Jul 2026 08:01:56 UTC | 0xa730…c393 | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0xf13b31…9e4821 | Approve | 9,369,684 | 32 days agoTue, 14 Jul 2026 08:01:56 UTC | 0x64f3…efd3 | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x903388…dea23a | Approve | 9,369,653 | 32 days agoTue, 14 Jul 2026 08:01:53 UTC | 0x2bc8…170e | IN | Squeez Cat | $0.000 ETH | 0.00000214 | |
| 0x1c1d43…ea1c53 | Approve | 9,369,590 | 32 days agoTue, 14 Jul 2026 08:01:46 UTC | 0x887b…54ce | IN | Squeez Cat | $0.000 ETH | 0.00000216 |