// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Constants} from "./Constants.sol";
import {ISlingToken, ISlingEvents} from "./interfaces/ISling.sol";
import {TwapLib} from "./TwapLib.sol";
/// @notice Fixed-supply ERC20. No owner, no mint, no pause. Enforces a 2% wallet cap
/// until a permissionless graduate() flips it off forever. Computes its own
/// Uniswap V3 pool address so the exempt set needs no post-deploy setter.
contract SlingToken is ERC20, ISlingToken, ISlingEvents {
address public immutable WETH;
address public immutable V3_FACTORY;
address public immutable POSITION_MANAGER;
address public immutable LOCKER;
address public immutable FACTORY;
address public immutable poolAddr;
bool public immutable isToken0;
address public immutable CREATOR; // create()'s msg.sender — exempt from the ramp, never from the 2% cap
uint64 public immutable DEPLOY_TIME; // constructor timestamp — the ramp's t=0
string public metadataURI;
bool public capActive;
/// @notice Last block in which each tx.origin bought from the pool (throttle, capped phase only).
mapping(address => uint256) public lastBuyBlock;
// Canonical Uniswap v3-core pool init code hash on RH Chain (see docs/ADDRESSES.md, Task 1).
bytes32 internal constant POOL_INIT_CODE_HASH =
0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54;
constructor(
string memory _name,
string memory _symbol,
string memory _metadataURI,
address _weth,
address _v3Factory,
address _positionManager,
address _locker,
address _creator
) ERC20(_name, _symbol) {
WETH = _weth;
V3_FACTORY = _v3Factory;
POSITION_MANAGER = _positionManager;
LOCKER = _locker;
FACTORY = msg.sender;
CREATOR = _creator;
DEPLOY_TIME = uint64(block.timestamp);
metadataURI = _metadataURI;
capActive = true;
bool t0 = address(this) < _weth;
isToken0 = t0;
(address token0, address token1) = t0 ? (address(this), _weth) : (_weth, address(this));
poolAddr = address(uint160(uint256(keccak256(abi.encodePacked(
hex"ff", _v3Factory,
keccak256(abi.encode(token0, token1, Constants.FEE_TIER)),
POOL_INIT_CODE_HASH
)))));
_mint(msg.sender, Constants.SUPPLY);
}
function tokenIsToken0() external view returns (bool) { return isToken0; }
function pool() external view returns (address) { return poolAddr; }
error NotReady(int24 twapTick);
/// @notice Permissionless: anyone can flip the wallet cap off forever once price has
/// reached the graduation threshold — measured as the pool's 60s TWAP mean tick,
/// NOT the instantaneous spot. A single-block spot push therefore cannot strip
/// the cap: the price has to hold at target across the whole window, in public,
/// with the pusher's capital exposed to everyone selling into it. While the pool
/// is younger than the window the oracle reverts "OLD" and graduation stays
/// closed. capActive only ever moves true→false — graduation is irreversible.
function graduate() external {
require(capActive, "already-graduated");
int24 twapTick = TwapLib.meanTick(poolAddr, Constants.TWAP_WINDOW);
if (!Constants.graduated(isToken0, twapTick)) revert NotReady(twapTick);
capActive = false;
emit Graduated(address(this), twapTick, block.timestamp);
}
error WalletCapExceeded(address to, uint256 balanceAfter);
error OneBuyPerBlock(address origin);
/// @notice Addresses that never trip the wallet cap: the pool (receives full LP-side
/// liquidity), the locker (holds the locked LP position), the factory (transiently
/// holds the full supply mid-deploy before distribution), the position manager
/// (Uniswap NFT custodian during mint), and the dead address (burns route here).
function isExempt(address a) public view returns (bool) {
return a == poolAddr || a == LOCKER || a == FACTORY
|| a == POSITION_MANAGER || a == Constants.DEAD;
}
/// @dev OZ 5.x's single choke point for mint/burn/transfer. Balance moves first, then the
/// recipient's resulting balance is checked against the cap — the limit is on what a
/// wallet *holds*. v2: the cap RAMPS from CAP_START to MAX_WALLET over CAP_RAMP_SECONDS
/// (launch protection — early buyers buy together, not instead of everyone). The creator's
/// cap is flat MAX_WALLET: the atomic dev-buy is their legitimate first buy and CREATOR is
/// one known address, so this concedes nothing to bots.
function _update(address from, address to, uint256 value) internal override {
super._update(from, to, value);
if (capActive && to != address(0) && !isExempt(to)) {
// One pool-buy per tx.origin per block: a fan-out contract's sub-buys all share an
// origin, so buying N wallets full in one tx is structurally impossible. Exempt
// recipients (DEAD = recycle's burn) never reach this, so keepers can't collide.
if (from == poolAddr) {
if (lastBuyBlock[tx.origin] == block.number) revert OneBuyPerBlock(tx.origin);
lastBuyBlock[tx.origin] = block.number;
}
uint256 cap = to == CREATOR ? Constants.MAX_WALLET : Constants.capAt(block.timestamp - DEPLOY_TIME);
uint256 bal = balanceOf(to);
if (bal > cap) revert WalletCapExceeded(to, bal);
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_name",
"type": "string",
"internalType": "string"
},
{
"name": "_symbol",
"type": "string",
"internalType": "string"
},
{
"name": "_metadataURI",
"type": "string",
"internalType": "string"
},
{
"name": "_weth",
"type": "address",
"internalType": "address"
},
{
"name": "_v3Factory",
"type": "address",
"internalType": "address"
},
{
"name": "_positionManager",
"type": "address",
"internalType": "address"
},
{
"name": "_locker",
"type": "address",
"internalType": "address"
},
{
"name": "_creator",
"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": "NotReady",
"type": "error",
"inputs": [
{
"name": "twapTick",
"type": "int24",
"internalType": "int24"
}
]
},
{
"name": "OneBuyPerBlock",
"type": "error",
"inputs": [
{
"name": "origin",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "WalletCapExceeded",
"type": "error",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "balanceAfter",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Collected",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "wethCollected",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenCollected",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenBurned",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "CreatorRightsProposed",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "CreatorRightsTransferred",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Graduated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tick",
"type": "int24",
"indexed": false,
"internalType": "int24"
},
{
"name": "timestamp",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ProtocolRecipientProposed",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ProtocolRecipientRotated",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Recycled",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "wethSpent",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenBurned",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "keeperTip",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "keeper",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TokenCreated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "pool",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "positionId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "name",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "metadataURI",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "imageHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "startTick",
"type": "int24",
"indexed": false,
"internalType": "int24"
},
{
"name": "graduationTick",
"type": "int24",
"indexed": false,
"internalType": "int24"
},
{
"name": "burnBoostBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"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": "Withdrawn",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "currency",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "CREATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "DEPLOY_TIME",
"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": "LOCKER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "POSITION_MANAGER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "V3_FACTORY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "WETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"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": "capActive",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "graduate",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "isExempt",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isToken0",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "lastBuyBlock",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "metadataURI",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"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": "poolAddr",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "tokenIsToken0",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"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"
}
]0x60806040526004361015610011575f80fd5b5f3560e01c806303ee438c14610f5f57806306fdde0314610e8657806308bd1a8514610e1857806308ecd9a614610daa578063095ea7b314610cfd57806316f0115b146109b157806318160ddd14610cc25780631bea83fe14610c5457806323b872dd14610ac05780632dd3100014610a52578063313ce56714610a1957806337b28bfd146109b65780636046cd99146109b157806370a082311461094f578063856bfdb81461022a57806390d92e76146108ed57806395d89b4114610794578063a9059cbb14610745578063ad5c4648146106d7578063ad5dff731461068c578063ad8d8dd21461064c578063d3618cca1461022f578063dcf93f321461022a578063dd62ed3e1461019e5763e4fbb6091461012c575f80fd5b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001cb16ab423856fe5e323f90a5f3b8ae75e6ed4fd168152f35b5f80fd5b3461019a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a576101d56110ee565b73ffffffffffffffffffffffffffffffffffffffff6101f2611111565b91165f52600160205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060405f2054604051908152f35b6111a2565b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a5760065460ff8116156105ee57604051610277606082611038565b6002815260208101906040368337603c61029082611607565b525f61029b82611641565b526040519182917f883bdbfd000000000000000000000000000000000000000000000000000000008352602483019060206004850152518091526044830191905f5b8181106105cf5750505090805f92038173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000628ebc673db3317f37b05ab18b8ca542eb2f272a165afa9081156105c4575f9161049d575b5061034b61034182611641565b5160060b91611607565b5160060b9003667fffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000082121761047057603c9060060b0560020b907f00000000000000000000000000000000000000000000000000000000000000005f14610464577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd4bd08212155b15610438577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166006556040519081524260208201527f20ef88a87408b686ce5a99f0e694e9a2bdd51e7333ff4edc603ca0f3fe3ac26460403092a2005b507f54b40e4a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6202b4308213156103da565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b90503d805f833e6104ae8183611038565b810160408282031261019a57815167ffffffffffffffff811161019a5782019181601f8401121561019a5782516104e4816115ef565b936104f26040519586611038565b81855260208086019260051b8201019084821161019a57602001915b8183106105aa5750505060208101519067ffffffffffffffff821161019a57019080601f8301121561019a57815191602080610549856115ef565b6105566040519182611038565b858152019360051b82010191821161019a57602001915b81831061057d5750505082610334565b825173ffffffffffffffffffffffffffffffffffffffff8116810361019a5781526020928301920161056d565b82518060060b810361019a5781526020928301920161050e565b6040513d5f823e3d90fd5b825163ffffffff168452859450602093840193909201916001016102dd565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c72656164792d6772616475617465640000000000000000000000000000006044820152fd5b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57602060ff600654166040519015158152f35b3461019a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a5760206106cd6106c86110ee565b6111fc565b6040519015158152f35b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73168152f35b3461019a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a5761078961077f6110ee565b6024359033611334565b602060405160018152f35b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a576040515f6004548060011c906001811680156108e3575b6020831081146108b6578285529081156108745750600114610816575b6108128361080681850382611038565b604051918291826110a6565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061085a575090915081016020016108066107f6565b919260018160209254838588010152019101909291610842565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b8401909101915061080690506107f6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f16916107d9565b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57602060405167ffffffffffffffff7f000000000000000000000000000000000000000000000000000000006a595944168152f35b3461019a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a5773ffffffffffffffffffffffffffffffffffffffff61099b6110ee565b165f525f602052602060405f2054604051908152f35b611134565b3461019a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a5773ffffffffffffffffffffffffffffffffffffffff610a026110ee565b165f526007602052602060405f2054604051908152f35b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57602060405160128152f35b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57602060405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000033398231807f539e693614367f8acc40125c142a168152f35b3461019a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57610af76110ee565b610aff611111565b6044359073ffffffffffffffffffffffffffffffffffffffff831692835f52600160205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260405f20547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8103610b7b575b506107899350611334565b838110610c20578415610bf4573315610bc857610789945f52600160205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f526020528360405f209103905584610b70565b7f94280d62000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b7fe602df05000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b83907ffb8f41b2000000000000000000000000000000000000000000000000000000005f523360045260245260445260645ffd5b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57602060405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d3168152f35b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a576020600254604051908152f35b3461019a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57610d346110ee565b602435903315610bf45773ffffffffffffffffffffffffffffffffffffffff16908115610bc857335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a5dd20cf8b42c8c2924f38b15d49b3c78608c893168152f35b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa168152f35b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a576040515f6003548060011c90600181168015610f55575b6020831081146108b6578285529081156108745750600114610ef7576108128361080681850382611038565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210610f3b575090915081016020016108066107f6565b919260018160209254838588010152019101909291610f23565b91607f1691610ecb565b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a576040515f6005548060011c9060018116801561102e575b6020831081146108b6578285529081156108745750600114610fd0576108128361080681850382611038565b60055f9081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0939250905b808210611014575090915081016020016108066107f6565b919260018160209254838588010152019101909291610ffc565b91607f1691610fa4565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761107957604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361019a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361019a57565b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a57602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000628ebc673db3317f37b05ab18b8ca542eb2f272a168152f35b3461019a575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019a5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000628ebc673db3317f37b05ab18b8ca542eb2f272a1681149081156112f4575b81156112b4575b8115611274575b811561126b575090565b61dead91501490565b7f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d373ffffffffffffffffffffffffffffffffffffffff1681149150611261565b7f00000000000000000000000033398231807f539e693614367f8acc40125c142a73ffffffffffffffffffffffffffffffffffffffff168114915061125a565b7f000000000000000000000000a5dd20cf8b42c8c2924f38b15d49b3c78608c89373ffffffffffffffffffffffffffffffffffffffff1681149150611253565b73ffffffffffffffffffffffffffffffffffffffff169081156115c35773ffffffffffffffffffffffffffffffffffffffff811692831561159757825f525f60205260405f2054818110611565577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208387948794855f525f84520360405f2055845f525f825260405f20818154019055604051908152a360ff60065416908161155c575b8161154b575b506113e9575050565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000628ebc673db3317f37b05ab18b8ca542eb2f272a16146114f9575b7f0000000000000000000000001cb16ab423856fe5e323f90a5f3b8ae75e6ed4fd73ffffffffffffffffffffffffffffffffffffffff1681036114b6576a108b2a2c28029094000000905b805f525f60205260405f2054918211611488575050565b7ffb304754000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000006a595944164203428111610470576114f390611651565b90611471565b325f52600760205260405f2054431461151f57325f5260076020524360405f2055611426565b7fff8cabf2000000000000000000000000000000000000000000000000000000005f523260045260245ffd5b61155591506111fc565b155f6113e0565b600191506113da565b837fe450d38c000000000000000000000000000000000000000000000000000000005f5260045260245260445260645ffd5b7fec442f05000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b7f96c6fd1e000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b67ffffffffffffffff81116110795760051b60200190565b8051156116145760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8051600110156116145760400190565b6103848110156116a457806a0ee3a5f48a68b55200000002906a0ee3a5f48a68b5520000008204036104705761038490046a01a784379d99db4200000001806a01a784379d99db42000000116104705790565b506a108b2a2c280290940000009056fea2646970667358221220091815b9d1a18863a683b792940114c5c90fa9ade262c0ef2b55d59bbada0a1764736f6c634300081a0033
| 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 | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xa28ba1…663533 | 27 days agoTue, 21 Jul 2026 22:40:30 UTC | Transfer | [0] 0x000000000000…8608c893 [1] 0x000000000000…0000dead data: 0x000000000000000000…a9323b04 |
| 0xa28ba1…663533 | 27 days agoTue, 21 Jul 2026 22:40:30 UTC | Transfer | [0] 0x000000000000…eb2f272a [1] 0x000000000000…8608c893 data: 0x000000000000000000…937ec9c5 |
| 0xd28291…1bd81c | 27 days agoTue, 21 Jul 2026 21:42:10 UTC | Transfer | [0] 0x000000000000…f3fe9cb6 [1] 0x000000000000…eb2f272a data: 0x000000000000000000…9d86d119 |
| 0x3062ef…9915fb | 27 days agoTue, 21 Jul 2026 21:42:08 UTC | Approval | [0] 0x000000000000…f3fe9cb6 [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…9d86d119 |
| 0xa99192…139506 | 27 days agoTue, 21 Jul 2026 21:42:06 UTC | Transfer | [0] 0x000000000000…8608c893 [1] 0x000000000000…f3fe9cb6 data: 0x000000000000000000…9d86d119 |
| 0xbc9b98…28b963 | 27 days agoTue, 21 Jul 2026 21:40:12 UTC | Transfer | [0] 0x000000000000…8608c893 [1] 0x000000000000…0000dead data: 0x000000000000000000…0e5f9bdd |
| 0xbc9b98…28b963 | 27 days agoTue, 21 Jul 2026 21:40:12 UTC | Transfer | [0] 0x000000000000…eb2f272a [1] 0x000000000000…8608c893 data: 0x000000000000000000…d1f782d5 |
| 0x8cbffc…77c510 | 27 days agoTue, 21 Jul 2026 20:52:10 UTC | Transfer | [0] 0x000000000000…2dcdf711 [1] 0x000000000000…eb2f272a data: 0x000000000000000000…c43c8c3a |
| 0x5854a2…2ab9bf | 27 days agoTue, 21 Jul 2026 20:52:10 UTC | Transfer | [0] 0x000000000000…6d535598 [1] 0x000000000000…eb2f272a data: 0x000000000000000000…4ef9ee9a |
| 0x958b20…82e5ad | 27 days agoTue, 21 Jul 2026 20:41:57 UTC | Transfer | [0] 0x000000000000…eb2f272a [1] 0x000000000000…0000dead data: 0x000000000000000000…1676033e |
| 0xd84312…70930e | 27 days agoTue, 21 Jul 2026 20:41:30 UTC | Transfer | [0] 0x000000000000…d7885879 [1] 0x000000000000…eb2f272a data: 0x000000000000000000…8098f7ce |
| 0x33d36a…630d69 | 27 days agoTue, 21 Jul 2026 20:41:30 UTC | Approval | [0] 0x000000000000…d7885879 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x9fd206…2cd752 | 27 days agoTue, 21 Jul 2026 20:41:05 UTC | Transfer | [0] 0x000000000000…6fa7df9f [1] 0x000000000000…eb2f272a data: 0x000000000000000000…3e225da4 |
| 0x45b7c9…eb4f45 | 27 days agoTue, 21 Jul 2026 20:41:05 UTC | Approval | [0] 0x000000000000…6fa7df9f [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x6478b4…8fb69c | 27 days agoTue, 21 Jul 2026 20:40:41 UTC | Transfer | [0] 0x000000000000…172bb7fe [1] 0x000000000000…eb2f272a data: 0x000000000000000000…cc850925 |
| 0x6478b4…8fb69c | 27 days agoTue, 21 Jul 2026 20:40:41 UTC | Approval | [0] 0x000000000000…172bb7fe [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…cc850925 |
| 0x6478b4…8fb69c | 27 days agoTue, 21 Jul 2026 20:40:41 UTC | Transfer | [0] 0x000000000000…d82c8745 [1] 0x000000000000…172bb7fe data: 0x000000000000000000…cc850925 |
| 0x23457d…d450a6 | 27 days agoTue, 21 Jul 2026 20:40:41 UTC | Transfer | [0] 0x000000000000…310b3c45 [1] 0x000000000000…eb2f272a data: 0x000000000000000000…8d5e6899 |
| 0xca6ffa…e7a3d9 | 27 days agoTue, 21 Jul 2026 20:40:41 UTC | Transfer | [0] 0x000000000000…dfea25da [1] 0x000000000000…eb2f272a data: 0x000000000000000000…3eb9454a |
| 0x9eea83…7a0df1 | 27 days agoTue, 21 Jul 2026 20:40:41 UTC | Transfer | [0] 0x000000000000…b23a745d [1] 0x000000000000…eb2f272a data: 0x000000000000000000…08b04136 |
| 0xe23d33…280d72 | 27 days agoTue, 21 Jul 2026 20:40:41 UTC | Transfer | [0] 0x000000000000…dc06eb99 [1] 0x000000000000…eb2f272a data: 0x000000000000000000…edccef35 |
| 0x2becec…9b5a4b | 27 days agoTue, 21 Jul 2026 20:40:23 UTC | Transfer | [0] 0x000000000000…172bb7fe [1] 0x000000000000…eb2f272a data: 0x000000000000000000…8aeaa5ac |
| 0x2becec…9b5a4b | 27 days agoTue, 21 Jul 2026 20:40:23 UTC | Approval | [0] 0x000000000000…172bb7fe [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…8aeaa5ac |
| 0x2becec…9b5a4b | 27 days agoTue, 21 Jul 2026 20:40:23 UTC | Transfer | [0] 0x000000000000…d6b9183d [1] 0x000000000000…172bb7fe data: 0x000000000000000000…8aeaa5ac |
| 0x40e239…1c5d2a | 27 days agoTue, 21 Jul 2026 20:40:21 UTC | Transfer | [0] 0x000000000000…2048d94d [1] 0x000000000000…eb2f272a data: 0x000000000000000000…aa21c7f1 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x3062ef…9915fb | Approve | 15,894,777 | 27 days agoTue, 21 Jul 2026 21:42:08 UTC | 0x6bdd…9cb6 | IN | aristotle | $0.000 ETH | 0.00000328 | |
| 0x33d36a…630d69 | Approve | 15,858,435 | 27 days agoTue, 21 Jul 2026 20:41:30 UTC | 0xd38f…5879 | IN | aristotle | $0.000 ETH | 0.00000318 | |
| 0x45b7c9…eb4f45 | Approve | 15,858,186 | 27 days agoTue, 21 Jul 2026 20:41:05 UTC | 0xeecb…df9f | IN | aristotle | $0.000 ETH | 0.00000318 | |
| 0xae07c9…905845 | Approve | 15,857,749 | 27 days agoTue, 21 Jul 2026 20:40:21 UTC | 0xe47f…d94d | IN | aristotle | $0.000 ETH | 0.00000319 | |
| 0xbcc746…e0c856 | Approve | 15,857,488 | 27 days agoTue, 21 Jul 2026 20:39:55 UTC | 0xa799…8c59 | IN | aristotle | $0.000 ETH | 0.00000317 | |
| 0xef4750…7981dc | Approve | 15,857,395 | 27 days agoTue, 21 Jul 2026 20:39:45 UTC | 0x3a97…eb99 | IN | aristotle | $0.000 ETH | 0.00000323 | |
| 0x5ccbf9…aae65d | Approve | 15,857,395 | 27 days agoTue, 21 Jul 2026 20:39:45 UTC | 0x3719…25da | IN | aristotle | $0.000 ETH | 0.00000323 | |
| 0xee04f2…863f27 | Approve | 15,857,395 | 27 days agoTue, 21 Jul 2026 20:39:45 UTC | 0x1fb0…745d | IN | aristotle | $0.000 ETH | 0.00000323 | |
| 0xab0e83…58eb8c | Approve | 15,857,395 | 27 days agoTue, 21 Jul 2026 20:39:45 UTC | 0x7f77…3c45 | IN | aristotle | $0.000 ETH | 0.00000323 | |
| 0xae38d5…509c99 | Approve | 15,857,202 | 27 days agoTue, 21 Jul 2026 20:39:26 UTC | 0xa673…838f | IN | aristotle | $0.000 ETH | 0.00000317 | |
| 0xd09be3…52b6af | Approve | 15,857,195 | 27 days agoTue, 21 Jul 2026 20:39:25 UTC | 0xb878…183d | IN | aristotle | $0.000 ETH | 0.00000327 | |
| 0x0bc740…1198ef | Approve | 15,857,137 | 27 days agoTue, 21 Jul 2026 20:39:19 UTC | 0x111d…f711 | IN | aristotle | $0.000 ETH | 0.00000323 | |
| 0x6edae3…5e4fa6 | Approve | 15,857,137 | 27 days agoTue, 21 Jul 2026 20:39:19 UTC | 0xfde1…5598 | IN | aristotle | $0.000 ETH | 0.00000323 | |
| 0xd612fd…e5cdfc | Approve | 15,857,136 | 27 days agoTue, 21 Jul 2026 20:39:19 UTC | 0x63b8…14f7 | IN | aristotle | $0.000 ETH | 0.00000322 | |
| 0x7ae25b…3f5261 | Approve | 15,857,103 | 27 days agoTue, 21 Jul 2026 20:39:16 UTC | 0xb143…b38f | IN | aristotle | $0.000 ETH | 0.00000318 | |
| 0xd24cbd…f8c4c3 | Approve | 15,857,039 | 27 days agoTue, 21 Jul 2026 20:39:09 UTC | 0xb143…b38f | IN | aristotle | $0.000 ETH | 0.00000184 | |
| 0x3538ab…80a535 | Approve | 15,857,038 | 27 days agoTue, 21 Jul 2026 20:39:09 UTC | 0xde2c…8745 | IN | aristotle | $0.000 ETH | 0.00000321 | |
| 0x563ef1…93a0fb | Approve | 15,857,033 | 27 days agoTue, 21 Jul 2026 20:39:09 UTC | 0xb143…b38f | IN | aristotle | $0.000 ETH | 0.00000317 | |
| 0x911665…c5c166 | Approve | 15,857,033 | 27 days agoTue, 21 Jul 2026 20:39:09 UTC | 0x1fb0…745d | IN | aristotle | $0.000 ETH | 0.00000317 | |
| 0x3e4cd4…54bbb1 | Approve | 15,857,033 | 27 days agoTue, 21 Jul 2026 20:39:09 UTC | 0x3719…25da | IN | aristotle | $0.000 ETH | 0.00000317 | |
| 0xd6f75d…449d77 | Approve | 15,857,032 | 27 days agoTue, 21 Jul 2026 20:39:09 UTC | 0x3a97…eb99 | IN | aristotle | $0.000 ETH | 0.00000317 | |
| 0x4b481f…0eddf1 | Approve | 15,857,031 | 27 days agoTue, 21 Jul 2026 20:39:09 UTC | 0x7f77…3c45 | IN | aristotle | $0.000 ETH | 0.00000324 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 11,612,385 | 32 days agoThu, 16 Jul 2026 22:20:52 UTC | 0x478636…e633af | CREATE2 | create | 0x3339…142a | IN | 0x871e…9b21 | 0 ETH |