// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import {ERC20Votes} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import {Nonces} from "@openzeppelin/contracts/utils/Nonces.sol";
/// @title GenesisTokenV3
/// @notice The one consistent ERC20 template for every direct-Uniswap-V3 GenesisPad launch.
///
/// Named `GenesisTokenV3` (not `GenesisToken`) to avoid any collision with the legacy
/// bonding-curve token template at contracts/src/GenesisToken.sol, which remains
/// untouched and continues to serve existing live tokens - see docs/MIGRATION_PLAN.md.
/// This is an intentional, documented naming deviation from the spec's literal
/// "GenesisToken" name, per Requirement 3's own allowance: "Equivalent names are
/// acceptable when justified."
///
/// By design this contract has NO privileged role whatsoever after construction:
/// no owner, no Ownable, no AccessControl, no mint function, no pause, no blacklist,
/// no whitelist, no tax, no adjustable fee, no trading switch, no proxy/upgradeability/
/// delegatecall, and no external calls from `_update`. The entire fixed supply is minted
/// exactly once, to `recipient`, inside the constructor.
///
/// The one exception is an OPTIONAL max-wallet cap, added per explicit product request:
/// creators may choose one at deploy time. It is set once and permanently locked - see
/// `setPoolExemption` below for why the pool-exemption address specifically is set via a
/// dedicated function instead of the constructor, and why that doesn't weaken the
/// "no ongoing admin control" guarantee.
///
/// Deliberately excludes any on-chain metadata URI/social-link storage - per
/// Requirement 3's "Token metadata" guidance, that information belongs in
/// GenesisPad backend metadata (which is attached off-chain per launch),
/// not duplicated into every token's storage.
contract GenesisTokenV3 is ERC20, ERC20Permit, ERC20Votes {
error MaxWalletBpsTooHigh(uint16 requested);
error MaxWalletExceeded(address account, uint256 balance, uint256 cap);
error NotFactory();
error PoolExemptionAlreadySet();
error ZeroPoolAddress();
address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
/// @notice Max wallet cap, in basis points of total supply. 0 disables the check entirely.
/// Immutable - set once at deployment, never adjustable by anyone afterward.
uint16 public immutable MAX_WALLET_BPS;
/// @notice The address the full supply was minted to (GenesisLaunchFactory in the standard
/// flow), exempt from the cap - it transiently holds the whole supply before supplying it
/// to the V3 position. Immutable, set in the constructor.
address public immutable EXEMPT_INITIAL_HOLDER;
/// @notice The Uniswap V3 pool address, exempt from the cap once set (a V3 pool contract
/// holds its own reserves as a real ERC20 balance - for a single-sided launch that's
/// effectively the entire supply, which must never be blocked by a wallet cap meant for
/// individual holders).
///
/// This is NOT a constructor parameter, deliberately: the pool's address depends on
/// comparing this token's own address against the paired asset's address (Uniswap V3 sorts
/// pool assets by address) - but this token's address would itself change if the pool
/// address were baked into its constructor's init code, since CREATE2 addresses depend on
/// the full constructor argument encoding. Including the pool address as a constructor arg
/// would make the token's own address depend on the pool address, which depends on the
/// token's address - an unresolvable circular dependency. Instead, `setPoolExemption` is
/// called by the launch factory exactly once, atomically within the same launch
/// transaction, immediately after the factory creates the pool (which only needs to know
/// this token's already-fixed address, not the other way around) and before minting any
/// liquidity into it. Restricted to `EXEMPT_INITIAL_HOLDER` (the factory) and settable only
/// once - functionally equivalent to a constructor-time immutable, without the circularity.
address public exemptPool;
/// @param name_ Token name.
/// @param symbol_ Token symbol.
/// @param totalSupply_ Fixed total supply, minted entirely to `recipient` in this constructor.
/// @param recipient Address receiving the entire minted supply. In the standard GenesisPad
/// launch flow this is GenesisLaunchFactory, which immediately supplies it to the Uniswap V3
/// position in the same transaction (see GenesisLaunchFactory.sol) - the factory is never
/// meant to retain a meaningful balance afterward.
/// @param maxWalletBps_ Optional max-wallet cap in basis points of total supply (0-10000).
/// 0 disables the check entirely. Immutable once set - see contract-level documentation.
constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_,
address recipient,
uint16 maxWalletBps_
) ERC20(name_, symbol_) ERC20Permit(name_) {
if (maxWalletBps_ > 10_000) revert MaxWalletBpsTooHigh(maxWalletBps_);
MAX_WALLET_BPS = maxWalletBps_;
EXEMPT_INITIAL_HOLDER = recipient;
_mint(recipient, totalSupply_);
}
/// @notice Sets the pool-exemption address exactly once. Callable only by
/// `EXEMPT_INITIAL_HOLDER` (the launch factory), which calls this atomically within the
/// same launch transaction that deploys this token - there is no window in which any other
/// party could call it first, and it can never be called again afterward by anyone,
/// including the factory itself.
function setPoolExemption(address pool) external {
if (msg.sender != EXEMPT_INITIAL_HOLDER) revert NotFactory();
if (exemptPool != address(0)) revert PoolExemptionAlreadySet();
if (pool == address(0)) revert ZeroPoolAddress();
exemptPool = pool;
}
function _isExemptFromMaxWallet(address account) internal view returns (bool) {
return account == exemptPool || account == EXEMPT_INITIAL_HOLDER || account == BURN_ADDRESS;
}
// --- Required overrides: ERC20Votes and ERC20Permit both touch _update/nonces in OZ v5 ---
function _update(address from, address to, uint256 value) internal override(ERC20, ERC20Votes) {
super._update(from, to, value);
if (MAX_WALLET_BPS > 0 && to != address(0) && !_isExemptFromMaxWallet(to)) {
uint256 cap = (totalSupply() * MAX_WALLET_BPS) / 10_000;
uint256 balance = balanceOf(to);
if (balance > cap) revert MaxWalletExceeded(to, balance, cap);
}
}
function nonces(address owner) public view override(ERC20Permit, Nonces) returns (uint256) {
return super.nonces(owner);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "totalSupply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
},
{
"name": "maxWalletBps_",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "nonpayable"
},
{
"name": "CheckpointUnorderedInsertion",
"type": "error",
"inputs": []
},
{
"name": "ECDSAInvalidSignature",
"type": "error",
"inputs": []
},
{
"name": "ECDSAInvalidSignatureLength",
"type": "error",
"inputs": [
{
"name": "length",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ECDSAInvalidSignatureS",
"type": "error",
"inputs": [
{
"name": "s",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "ERC20ExceededSafeSupply",
"type": "error",
"inputs": [
{
"name": "increasedSupply",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "cap",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"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": "ERC2612ExpiredSignature",
"type": "error",
"inputs": [
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC2612InvalidSigner",
"type": "error",
"inputs": [
{
"name": "signer",
"type": "address",
"internalType": "address"
},
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC5805FutureLookup",
"type": "error",
"inputs": [
{
"name": "timepoint",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "clock",
"type": "uint48",
"internalType": "uint48"
}
]
},
{
"name": "ERC6372InconsistentClock",
"type": "error",
"inputs": []
},
{
"name": "InvalidAccountNonce",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "currentNonce",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InvalidShortString",
"type": "error",
"inputs": []
},
{
"name": "MaxWalletBpsTooHigh",
"type": "error",
"inputs": [
{
"name": "requested",
"type": "uint16",
"internalType": "uint16"
}
]
},
{
"name": "MaxWalletExceeded",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "cap",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "NotFactory",
"type": "error",
"inputs": []
},
{
"name": "PoolExemptionAlreadySet",
"type": "error",
"inputs": []
},
{
"name": "SafeCastOverflowedUintDowncast",
"type": "error",
"inputs": [
{
"name": "bits",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "StringTooLong",
"type": "error",
"inputs": [
{
"name": "str",
"type": "string",
"internalType": "string"
}
]
},
{
"name": "VotesExpiredSignature",
"type": "error",
"inputs": [
{
"name": "expiry",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ZeroPoolAddress",
"type": "error",
"inputs": []
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "DelegateChanged",
"type": "event",
"inputs": [
{
"name": "delegator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "fromDelegate",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "toDelegate",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "DelegateVotesChanged",
"type": "event",
"inputs": [
{
"name": "delegate",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "previousVotes",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newVotes",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EIP712DomainChanged",
"type": "event",
"inputs": [],
"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": "BURN_ADDRESS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "CLOCK_MODE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "DOMAIN_SEPARATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "EXEMPT_INITIAL_HOLDER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "MAX_WALLET_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"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": "checkpoints",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "pos",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [
{
"name": "",
"type": "tuple",
"components": [
{
"name": "_key",
"type": "uint48",
"internalType": "uint48"
},
{
"name": "_value",
"type": "uint208",
"internalType": "uint208"
}
],
"internalType": "struct Checkpoints.Checkpoint208"
}
],
"stateMutability": "view"
},
{
"name": "clock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint48",
"internalType": "uint48"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "delegate",
"type": "function",
"inputs": [
{
"name": "delegatee",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "delegateBySig",
"type": "function",
"inputs": [
{
"name": "delegatee",
"type": "address",
"internalType": "address"
},
{
"name": "nonce",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "expiry",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "v",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "r",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "s",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "delegates",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "eip712Domain",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "fields",
"type": "bytes1",
"internalType": "bytes1"
},
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "version",
"type": "string",
"internalType": "string"
},
{
"name": "chainId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "verifyingContract",
"type": "address",
"internalType": "address"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "extensions",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"stateMutability": "view"
},
{
"name": "exemptPool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "getPastTotalSupply",
"type": "function",
"inputs": [
{
"name": "timepoint",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getPastVotes",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "timepoint",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getVotes",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "nonces",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "numCheckpoints",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "permit",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "v",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "r",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "s",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPoolExemption",
"type": "function",
"inputs": [
{
"name": "pool",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "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"
}
]0x60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146101d4578063095ea7b3146101cf57806318160ddd146101ca57806323b872dd146101c5578063313ce567146101c05780633644e515146101bb5780633a46b1a8146101b65780634bf5d7e9146101b1578063587cde1e146101ac5780635c19a95c146101a75780636fcfff45146101a257806370a082311461019d5780637ecebe001461019857806384b0196e146101935780638e539e8c1461018e57806391ddadf41461018957806395d89b41146101845780639ab24eb01461017f578063a9059cbb1461017a578063b5a1780914610175578063b6efaa7514610170578063c3cda5201461016b578063d505accf14610166578063dd62ed3e14610161578063f1127ed81461015c578063f2dc257b14610157578063f600acc7146101525763fccc28131461014d575f80fd5b610e96565b610ddc565b610db4565b610d02565b610cab565b610b78565b610aaf565b610a51565b610a0d565b6109e7565b6109a0565b6108fb565b6108d0565b610809565b610713565b6106db565b6106a3565b61063d565b610619565b6105e0565b61054f565b610471565b61044f565b610434565b610389565b61036c565b61033b565b61022b565b91908251928382525f5b848110610203575050825f602080949584010152601f8019910116010190565b6020818301810151848301820152016101e3565b9060206102289281815201906101d9565b90565b3461030b575f36600319011261030b576040515f60035461024b81610ec6565b808452906020906001908181169081156102e15750600114610288575b6102848561027881870382610f87565b60405191829182610217565b0390f35b60035f90815293507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8385106102ce5750505050810160200161027882610284610268565b80548686018401529382019381016102b2565b8695506102849693506020925061027894915060ff191682840152151560051b8201019293610268565b5f80fd5b600435906001600160a01b038216820361030b57565b602435906001600160a01b038216820361030b57565b3461030b57604036600319011261030b5761036161035761030f565b60243590336114a2565b602060405160018152f35b3461030b575f36600319011261030b576020600254604051908152f35b3461030b57606036600319011261030b576103a261030f565b6103aa610325565b6001600160a01b0382165f9081526001602090815260408083203384529091529020604435919054925f1984106103f2575b6103e69350610fd0565b60405160018152602090f35b82841061040e57610409836103e695033383611550565b6103dc565b604051637dc7a0d960e11b81523360048201526024810185905260448101849052606490fd5b3461030b575f36600319011261030b57602060405160128152f35b3461030b575f36600319011261030b5760206104696111ab565b604051908152f35b3461030b57604036600319011261030b576001600160a01b0361049261030f565b165f52600960205260405f206104a96024356112c5565b8154905f8291600584116104fc575b6104c3935084611770565b90816104e157505060205f5b6040516001600160d01b039091168152f35b6104ec602092611306565b905f52815f20015460301c6104cf565b9192610507816115eb565b810390811161054a576104c393855f5265ffffffffffff808360205f20015416908516105f146105385750916104b8565b92915061054490611314565b906104b8565b610eb2565b3461030b575f36600319011261030b57610568436115b9565b65ffffffffffff80610579436115b9565b169116036105ce5761028460405161059081610f12565b601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c7400000060208201526040519182916020835260208301906101d9565b6040516301bfc1c560e61b8152600490fd5b3461030b57602036600319011261030b5760206001600160a01b038061060461030f565b165f526008825260405f205416604051908152f35b3461030b57602036600319011261030b5761063b61063561030f565b33611322565b005b3461030b57602036600319011261030b576001600160a01b0361065e61030f565b165f52600960205260405f205463ffffffff908181116106845760209160405191168152f35b604490604051906306dfcc6560e41b8252602060048301526024820152fd5b3461030b57602036600319011261030b5760206104696106c161030f565b6001600160a01b03165f9081526020819052604090205490565b3461030b57602036600319011261030b576001600160a01b036106fc61030f565b165f526007602052602060405f2054604051908152f35b3461030b575f36600319011261030b576107ac61074f7f47656e65736973205465737420546f6b656e0000000000000000000000000012611914565b6107787f3100000000000000000000000000000000000000000000000000000000000001611a12565b6040519061078582610f33565b5f82526107ba602091604051958695600f60f81b875260e0602088015260e08701906101d9565b9085820360408701526101d9565b4660608501523060808501525f60a085015283810360c0850152602080845192838152019301915f5b8281106107f257505050500390f35b8351855286955093810193928101926001016107e3565b3461030b57602036600319011261030b576108256004356112c5565b600a54905f829160058411610877575b61083f9350611716565b8061085057506040515f8152602090f35b61085b602091611306565b600a5f525f80516020612014833981519152015460301c6104cf565b9192610882816115eb565b810390811161054a5761083f93600a5f5265ffffffffffff80835f80516020612014833981519152015416908516105f146108be575091610835565b9291506108ca90611314565b90610835565b3461030b575f36600319011261030b5760206108eb436115b9565b65ffffffffffff60405191168152f35b3461030b575f36600319011261030b576040515f60045461091b81610ec6565b808452906020906001908181169081156102e15750600114610947576102848561027881870382610f87565b60045f90815293507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b83851061098d5750505050810160200161027882610284610268565b8054868601840152938201938101610971565b3461030b57602036600319011261030b576001600160a01b036109c161030f565b165f526009602052602060018060d01b036109de60405f206113e7565b16604051908152f35b3461030b57604036600319011261030b57610361610a0361030f565b6024359033610fd0565b3461030b575f36600319011261030b576040517f000000000000000000000000928f453a34641fc9613f124c763aee32530776186001600160a01b03168152602090f35b3461030b575f36600319011261030b57602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6064359060ff8216820361030b57565b6084359060ff8216820361030b57565b3461030b5760c036600319011261030b57610ac861030f565b60443590602435610ad7610a8f565b834211610b5f57610b5361063b94610b5a926040519060208201927fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf845260018060a01b0388166040840152866060840152608083015260808252610b3b82610f4f565b610b4e60a435936084359351902061140f565b611435565b918261144d565b611322565b604051632341d78760e11b815260048101859052602490fd5b3461030b5760e036600319011261030b57610b9161030f565b610b99610325565b60443590606435610ba8610a9f565b814211610c92576001600160a01b038581165f8181526007602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c99281019283529283019390935292861660608201526080810187905260a081019190915260c080820194909452928352610c4b929091610c3860e083610f87565b610b4e60c4359360a4359351902061140f565b6001600160a01b0384811690821603610c68575061063b926114a2565b6040516325c0072360e11b81526001600160a01b0391821660048201529084166024820152604490fd5b60405163313c898160e11b815260048101839052602490fd5b3461030b57604036600319011261030b576020610cf9610cc961030f565b610cd1610325565b6001600160a01b039182165f9081526001855260408082209290931681526020919091522090565b54604051908152f35b3461030b57604036600319011261030b57610d1b61030f565b6024359063ffffffff8216820361030b5761028491610d6a91610d3c610fb8565b50610d45610fb8565b506001600160a01b03165f908152600960205260409020610d64610fb8565b50611c07565b5060405190610d7882610f12565b5465ffffffffffff811680835260309190911c60209283019081526040805192835290516001600160d01b031692820192909252918291820190565b3461030b575f36600319011261030b57600b546040516001600160a01b039091168152602090f35b3461030b57602036600319011261030b57610df561030f565b6001600160a01b037f000000000000000000000000928f453a34641fc9613f124c763aee325307761881163303610e8457600b5481166001600160a01b0316610e7257811615610e6057600b80546001600160a01b0319166001600160a01b03909216919091179055005b60405163037064f160e01b8152600490fd5b60405163c1bf2c1960e01b8152600490fd5b604051631966391b60e11b8152600490fd5b3461030b575f36600319011261030b57602060405161dead8152f35b634e487b7160e01b5f52601160045260245ffd5b90600182811c92168015610ef4575b6020831014610ee057565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610ed5565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff821117610f2e57604052565b610efe565b6020810190811067ffffffffffffffff821117610f2e57604052565b60a0810190811067ffffffffffffffff821117610f2e57604052565b60c0810190811067ffffffffffffffff821117610f2e57604052565b90601f8019910116810190811067ffffffffffffffff821117610f2e57604052565b60405190610fb682610f12565b565b60405190610fc582610f12565b5f6020838281520152565b9091906001600160a01b0380821690811561119357841690811561117b576001600160a01b0383165f9081526020819052604090205484811061114b579184939161107f958794036110318460018060a01b03165f525f60205260405f2090565b556001600160a01b0384165f908152602081815260409182902080548801905590518681527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a3611cf4565b61ffff7f00000000000000000000000000000000000000000000000000000000000000001680151580611143575b8061112d575b6110bb575050565b6110ca6110d291600254611588565b612710900490565b906110ec8160018060a01b03165f525f60205260405f2090565b54918083116110fa57505050565b6040516304a43e8b60e51b81526001600160a01b0392909216600483015260248201929092526044810191909152606490fd5b5061113e61113a83611c30565b1590565b6110b3565b5060016110ad565b60405163391434e360e21b81526001600160a01b0385166004820152602481019190915260448101859052606490fd5b60405163ec442f0560e01b81525f6004820152602490fd5b604051634b637e8f60e11b81525f6004820152602490fd5b307f0000000000000000000000006dbc3cc4b9f4b7caeeff00fa6d3d5fdda74fd80b6001600160a01b0316148061129c575b15611206577f350bd3958d54b84164f5c237f359b9516e75c62ce3d8ef89ad889dc7e512704090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f188e2f54fd00f2d6bbf66425e18d3b9408f34e5218135aa4de9f58c7f43a000760408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815261129681610f6b565b51902090565b507f000000000000000000000000000000000000000000000000000000000000123746146111dd565b65ffffffffffff6112d5436115b9565b16808210156112e85750610228906115b9565b6044925060405191637669fc0f60e11b835260048301526024820152fd5b5f1981019190821161054a57565b906001820180921161054a57565b6001600160a01b038181165f81815260086020526040812080548685166001600160a01b031982168117909255610fb69694169461139d9390928691907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9080a46001600160a01b03165f9081526020819052604090205490565b916117c4565b600a54806113b057505f90565b805f1981011161054a57600a5f527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a7015460301c90565b8054806113f45750505f90565b5f1991818381011161054a575f5260205f2001015460301c90565b60429061141a6111ab565b906040519161190160f01b8352600283015260228201522090565b91610228939161144493611acf565b90929192611b7a565b6001600160a01b0381165f908152600760205260409020805460018101909155909181900361147a575050565b6040516301d4b62360e61b81526001600160a01b039092166004830152602482015260449150fd5b6001600160a01b03808216929190831561153857821693841561152057806115167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259461150160209560018060a01b03165f52600160205260405f2090565b9060018060a01b03165f5260205260405f2090565b55604051908152a3565b604051634a1406b160e11b81525f6004820152602490fd5b60405163e602df0560e01b81525f6004820152602490fd5b906001600160a01b038083161561153857811615611520576115016115859260018060a01b03165f52600160205260405f2090565b55565b8181029291811591840414171561054a57565b81156115a5570490565b634e487b7160e01b5f52601260045260245ffd5b65ffffffffffff908181116115cc571690565b604490604051906306dfcc6560e41b8252603060048301526024820152fd5b600181111561022857600181600160801b811015611704575b6116ac6116a261169861168e61168461167a6116b897600488600160401b6116b39a10156116f7575b6401000000008110156116ea575b620100008110156116dd575b6101008110156116d1575b60108110156116c5575b10156116bd575b60030260011c611673818b61159b565b0160011c90565b611673818a61159b565b611673818961159b565b611673818861159b565b611673818761159b565b611673818661159b565b809361159b565b821190565b900390565b60011b611663565b811c9160021b9161165c565b60081c91811b91611652565b60101c9160081b91611647565b60201c9160101b9161163b565b60401c9160201b9161162d565b50600160401b9050608082901c611604565b82821061172257505090565b909180831860011c8184160190600a5f5265ffffffffffff80835f80516020612014833981519152015416908416105f146117605750915b90611716565b925061176b90611314565b61175a565b905b83831061177f5750505090565b90919280841860011c8185160190835f5265ffffffffffff808360205f20015416908416105f146117b45750925b9190611772565b93506117bf90611314565b6117ad565b6001600160a01b0380831693929190811690818514158061190b575b6117ec575b5050505050565b81611870575b505082611801575b80806117e5565b6001600160a01b03165f9081526009602052604090207fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7249161184d916118479091611c8b565b90611cbe565b604080516001600160d01b039384168152919092166020820152a25f80806117fa565b6001600160a01b03165f90815260096020526040902061188f84611c8b565b611898436115b9565b6001600160d01b039182806118ac866113e7565b16911690039282841161054a577fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72493611901926118e892611f59565b6040805192851683529316602082015291829190820190565b0390a25f806117f2565b508315156117e0565b60ff81146119525760ff811690601f8211611940576040519161193683610f12565b8252602082015290565b604051632cd44ac360e21b8152600490fd5b50604051600554815f61196483610ec6565b808352926020906001908181169081156119ee575060011461198f575b505061022892500382610f87565b91509260055f527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0935f925b8284106119d657506102289450505081016020015f80611981565b855487850183015294850194869450928101926119bb565b9150506020925061022894915060ff191682840152151560051b8201015f80611981565b60ff8114611a345760ff811690601f8211611940576040519161193683610f12565b50604051600654815f611a4683610ec6565b808352926020906001908181169081156119ee5750600114611a7057505061022892500382610f87565b91509260065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f935f925b828410611ab757506102289450505081016020015f80611981565b85548785018301529485019486945092810192611a9c565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411611b51579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15611b46575f516001600160a01b03811615611b3c57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f9160039190565b60041115611b6657565b634e487b7160e01b5f52602160045260245ffd5b611b8381611b5c565b80611b8c575050565b611b9581611b5c565b60018103611baf5760405163f645eedf60e01b8152600490fd5b611bb881611b5c565b60028103611bd95760405163fce698f760e01b815260048101839052602490fd5b80611be5600392611b5c565b14611bed5750565b6040516335e2f38360e21b81526004810191909152602490fd5b8054821015611c1c575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b600b546001600160a01b039182169082168114918215611c5f575b508115611c56575090565b61dead91501490565b7f000000000000000000000000928f453a34641fc9613f124c763aee325307761816811491505f611c4b565b6001600160d01b0390818111611c9f571690565b604490604051906306dfcc6560e41b825260d060048301526024820152fd5b90611cc8436115b9565b6001600160d01b03918280611cdc866113e7565b1691160191821161054a57611cf092611f59565b9091565b6001600160a01b03908116929181908415611d7c575b16908115611d34575b610fb6935f5260086020528060405f205416915f5260405f205416906117c4565b611d3d83611c8b565b93611d47436115b9565b6001600160d01b03958680611d5a6113a3565b169116900395861161054a57610fb695611d7391611e73565b50509350611d13565b9050611d8783611c8b565b90611d91436115b9565b6001600160d01b03928380611da46113a3565b1691160192831161054a578392611dba91611e73565b5050611d0a565b600a5490600160401b821015610f2e576001820180600a55821015611c1c57600a5f52805160209091015160301b65ffffffffffff191665ffffffffffff91909116175f8051602061201483398151915290910155565b8054600160401b811015610f2e57611e3591600182018155611c07565b611e6057815160209092015160301b65ffffffffffff191665ffffffffffff92909216919091179055565b634e487b7160e01b5f525f60045260245ffd5b600a549192918015611f3057611e8b611ea191611306565b600a5f525f805160206120148339815191520190565b9081549165ffffffffffff90818416918316808311611f1e57869203611ee657611edf92509065ffffffffffff82549181199060301b169116179055565b60301c9190565b5050611f1990611f05611ef7610fa9565b65ffffffffffff9092168252565b6001600160d01b0385166020820152611dc1565b611edf565b604051632520601d60e01b8152600490fd5b50611f5490611f40611ef7610fa9565b6001600160d01b0384166020820152611dc1565b5f9190565b80549293928015611fee57611f70611f7b91611306565b825f5260205f200190565b9182549265ffffffffffff91828516928116808411611f1e57879303611fba5750611edf92509065ffffffffffff82549181199060301b169116179055565b915050611f1991611fda611fcc610fa9565b65ffffffffffff9093168352565b6001600160d01b0386166020830152611e18565b5090611f5491611fff611fcc610fa9565b6001600160d01b0385166020830152611e1856fec65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8a164736f6c6343000818000a
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000123 | $0 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x7d416f6c…0c6768 | Transfer | 18,534,916 | 22 days agoFri, 24 Jul 2026 23:13:14 UTC | 0xcaf7…5d11 | IN | 0x6dbc…d80b | $0.001 DIH |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x004c5f…4758d2 | 30 days agoThu, 16 Jul 2026 09:37:44 UTC | Transfer | [0] 0x000000000000…532b237c [1] 0x000000000000…b63e45ff data: 0x000000000000000000…28000000 |
| 0x994871…5b35f0 | 30 days agoThu, 16 Jul 2026 09:37:36 UTC | Approval | [0] 0x000000000000…532b237c [1] 0x000000000000…3ac78ba3 data: 0xffffffffffffffffff…ffffffff |
| 0xba0b09…4b89c5 | 30 days agoThu, 16 Jul 2026 09:35:01 UTC | Transfer | [0] 0x000000000000…9e8aac18 [1] 0x000000000000…532b237c data: 0x000000000000000000…28000000 |
| 0xa2b069…d1a083 | 30 days agoThu, 16 Jul 2026 07:47:04 UTC | Transfer | [0] 0x000000000000…b63e45ff [1] 0x000000000000…9e8aac18 data: 0x000000000000000000…28000000 |
| 0xd08fd9…3d5502 | 31 days agoTue, 14 Jul 2026 23:22:54 UTC | Approval | [0] 0x000000000000…c02de408 [1] 0x000000000000…c12c4dba data: 0x000000000000000000…00000000 |
| 0xd08fd9…3d5502 | 31 days agoTue, 14 Jul 2026 23:22:54 UTC | Transfer | [0] 0x000000000000…c02de408 [1] 0x000000000000…c12c4dba data: 0x000000000000000000…50806000 |
| 0xd08fd9…3d5502 | 31 days agoTue, 14 Jul 2026 23:22:54 UTC | Approval | [0] 0x000000000000…c02de408 [1] 0x000000000000…c12c4dba data: 0x000000000000000000…50806000 |
| 0xd08fd9…3d5502 | 31 days agoTue, 14 Jul 2026 23:22:54 UTC | Transfer | [0] 0x000000000000…c02de408 [1] 0x000000000000…0000dead data: 0x000000000000000000…d4835fff |
| 0xd08fd9…3d5502 | 31 days agoTue, 14 Jul 2026 23:22:54 UTC | Transfer | [0] 0x000000000000…b63e45ff [1] 0x000000000000…c02de408 data: 0x000000000000000000…2503bfff |
| 0xdb91e1…7e19fc | 31 days agoTue, 14 Jul 2026 23:22:13 UTC | Transfer | [0] 0x000000000000…293015e7 [1] 0x000000000000…b63e45ff data: 0x000000000000000000…75770000 |
| 0x761158…8216e4 | 31 days agoTue, 14 Jul 2026 23:22:05 UTC | Approval | [0] 0x000000000000…293015e7 [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…75770000 |
| 0xdd526f…8ab97d | 32 days agoTue, 14 Jul 2026 14:06:45 UTC | Approval | [0] 0x000000000000…c02de408 [1] 0x000000000000…c12c4dba data: 0x000000000000000000…00000000 |
| 0xdd526f…8ab97d | 32 days agoTue, 14 Jul 2026 14:06:45 UTC | Transfer | [0] 0x000000000000…c02de408 [1] 0x000000000000…c12c4dba data: 0x000000000000000000…dea9a2f0 |
| 0xdd526f…8ab97d | 32 days agoTue, 14 Jul 2026 14:06:45 UTC | Approval | [0] 0x000000000000…c02de408 [1] 0x000000000000…c12c4dba data: 0x000000000000000000…dea9a2f0 |
| 0xdd526f…8ab97d | 32 days agoTue, 14 Jul 2026 14:06:45 UTC | Transfer | [0] 0x000000000000…c02de408 [1] 0x000000000000…0000dead data: 0x000000000000000000…d3f6ba6b |
| 0xdd526f…8ab97d | 32 days agoTue, 14 Jul 2026 14:06:45 UTC | Transfer | [0] 0x000000000000…b63e45ff [1] 0x000000000000…c02de408 data: 0x000000000000000000…b2a05d5b |
| 0xb7d245…2401eb | 32 days agoTue, 14 Jul 2026 13:51:06 UTC | Transfer | [0] 0x000000000000…b63e45ff [1] 0x000000000000…293015e7 data: 0x000000000000000000…75c74900 |
| 0x5613f3…d75de8 | 32 days agoTue, 14 Jul 2026 04:01:06 UTC | Transfer | [0] 0x000000000000…293015e7 [1] 0x000000000000…b63e45ff data: 0x000000000000000000…4c838e6a |
| 0x858872…2bcf95 | 32 days agoTue, 14 Jul 2026 04:00:54 UTC | Approval | [0] 0x000000000000…293015e7 [1] 0x000000000000…3ac78ba3 data: 0xffffffffffffffffff…ffffffff |
| 0x5c1f91…120e93 | 32 days agoTue, 14 Jul 2026 04:00:09 UTC | Transfer | [0] 0x000000000000…fe8bb561 [1] 0x000000000000…b63e45ff data: 0x000000000000000000…7a20e905 |
| 0x0e671c…d7c7b4 | 32 days agoTue, 14 Jul 2026 03:59:57 UTC | Approval | [0] 0x000000000000…fe8bb561 [1] 0x000000000000…3ac78ba3 data: 0xffffffffffffffffff…ffffffff |
| 0xc79ef6…02ed77 | 32 days agoTue, 14 Jul 2026 03:39:23 UTC | Transfer | [0] 0x000000000000…b63e45ff [1] 0x000000000000…fe8bb561 data: 0x000000000000000000…7a20e905 |
| 0xd87815…8b9e90 | 32 days agoTue, 14 Jul 2026 03:35:14 UTC | Transfer | [0] 0x000000000000…53077618 [1] 0x000000000000…0000dead data: 0x000000000000000000…000048de |
| 0xd87815…8b9e90 | 32 days agoTue, 14 Jul 2026 03:35:14 UTC | Transfer | [0] 0x000000000000…b63e45ff [1] 0x000000000000…293015e7 data: 0x000000000000000000…4c838e6a |
| 0xd87815…8b9e90 | 32 days agoTue, 14 Jul 2026 03:35:14 UTC | Approval | [0] 0x000000000000…53077618 [1] 0x000000000000…638de0d3 data: 0x000000000000000000…00000000 |
| 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 | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x994871…5b35f0 | Approve | 11,154,653 | 30 days agoThu, 16 Jul 2026 09:37:36 UTC | 0xc6e5…237c | IN | Genesis Test Token | $0.000 ETH | 0.00000291 | |
| 0xba0b09…4b89c5 | Transfer | 11,153,114 | 30 days agoThu, 16 Jul 2026 09:35:01 UTC | 0xad64…ac18 | IN | Genesis Test Token | $0.000 ETH | 0.00000326 | |
| 0x761158…8216e4 | Approve | 9,921,267 | 31 days agoTue, 14 Jul 2026 23:22:05 UTC | 0x8b64…15e7 | IN | Genesis Test Token | $0.000 ETH | 0.00000245 | |
| 0x858872…2bcf95 | Approve | 9,225,528 | 32 days agoTue, 14 Jul 2026 04:00:54 UTC | 0x8b64…15e7 | IN | Genesis Test Token | $0.000 ETH | 0.00000223 | |
| 0x0e671c…d7c7b4 | Approve | 9,224,948 | 32 days agoTue, 14 Jul 2026 03:59:57 UTC | 0x8cfa…b561 | IN | Genesis Test Token | $0.000 ETH | 0.00000222 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 9,210,178 | 32 days agoTue, 14 Jul 2026 03:35:14 UTC | 0xd87815…8b9e90 | CREATE2 | 0x4c0f8a19 | 0x2106…2dbe | IN | 0x6dbc…d80b | 0 ETH |