// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { ERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import { IBondingCurve } from "./interfaces/IBondingCurve.sol";
import { IFactory } from "./interfaces/IFactory.sol";
import { IToken } from "./interfaces/IToken.sol";
/// @dev Single function used on the canonical ENS Reverse Registrar
/// (`addr.reverse` namespace owner). `setName` claims `<msg.sender>.addr.reverse`,
/// attaches a default reverse resolver, and writes the name record in one call.
interface IReverseRegistrar {
function setName(string calldata name) external returns (bytes32);
}
/// @title Token
/// @notice Fixed-supply ERC20 with EIP-2612 permit, ERC-7572 metadata URI, and a
/// pre-graduation transfer lock. The bonding-curve address comes from a factory
/// handshake — read at construction via `IFactory(msg.sender).pendingCurve()` —
/// keeping the token's CREATE2 init-code hash independent of the curve and so
/// vanity-mineable.
contract Token is ERC20, ERC20Permit, IToken {
error ZeroAddress();
error InvalidMetadataLength();
error InvalidMetadataChar();
error TransfersLocked();
error OnlyBondingCurve();
error OnlyCreator();
error AlreadyGraduated();
error MissingCurveHandshake();
error EnsReverseAlreadySet();
error EmptyName();
uint256 public constant TOTAL_SUPPLY = 1_000_000_000 * 1e18;
uint256 public constant MAX_METADATA_URI_LEN = 512;
uint256 public constant MAX_ENS_NAME_LEN = 255;
/// @notice Canonical mainnet ENS Reverse Registrar
/// (owner of `namehash("addr.reverse")` on the ENS Registry). Hard-coded
/// because the address is part of the protocol's external surface; deploying
/// on a different chain would require a different fork/redeploy of this
/// contract.
address public constant ENS_REVERSE_REGISTRAR = 0xa58E81fe9b61B5c3fE2AFD33CF304c454AbFc7Cb;
/// @notice Single-shot guard for {setEnsReverseName}.
/// @inheritdoc IToken
bool public override ensReverseSet;
/// @notice Emitted exactly once when the token's reverse ENS name is claimed — by
/// the current creator directly or by the factory's authorized deployer
/// proxy during an atomic deploy.
event EnsReverseNameSet(string name);
/// @inheritdoc IToken
address public immutable override bondingCurve;
/// @inheritdoc IToken
address public immutable override factory;
/// @inheritdoc IToken
bool public override graduated;
/// @inheritdoc IToken
/// @dev ERC-7572. Set once via the factory handshake; no setter exists.
string public override contractURI;
/// @param name_ Length ∈ [1, 32]; rejects ASCII control characters to defend block
/// explorers that render the name verbatim.
/// @param symbol_ Length ∈ [1, 10]; same charset rule.
/// @param factory_ Must equal `msg.sender`. Provides the bonding-curve and metadata-URI
/// values via storage handshake.
constructor(string memory name_, string memory symbol_, address factory_) ERC20(name_, symbol_) ERC20Permit(name_) {
if (factory_ == address(0)) revert ZeroAddress();
if (factory_ != msg.sender) revert MissingCurveHandshake();
_validateMetadata(bytes(name_), 32);
_validateMetadata(bytes(symbol_), 10);
address curve = IFactory(factory_).pendingCurve();
if (curve == address(0)) revert MissingCurveHandshake();
bondingCurve = curve;
factory = factory_;
// Empty URI is allowed (opt-out); length is bounded to limit deploy gas + storage.
string memory uri = IFactory(factory_).pendingURI();
if (bytes(uri).length > MAX_METADATA_URI_LEN) revert InvalidMetadataLength();
contractURI = uri;
_mint(curve, TOTAL_SUPPLY);
}
/// @inheritdoc IToken
function creator() external view override returns (address) {
return IBondingCurve(bondingCurve).CREATOR();
}
/// @inheritdoc IToken
function finalizeGraduation() external override {
if (msg.sender != bondingCurve) revert OnlyBondingCurve();
if (graduated) revert AlreadyGraduated();
graduated = true;
}
/// @dev Pre-graduation, only transfers involving the bonding curve are allowed.
/// Mints (`from == 0`) and burns (`to == 0`) always pass.
function _update(address from, address to, uint256 value) internal override {
if (!graduated && from != address(0) && to != address(0)) {
if (from != bondingCurve && to != bondingCurve) revert TransfersLocked();
}
super._update(from, to, value);
}
function _validateMetadata(bytes memory s, uint256 maxLen) private pure {
uint256 len = s.length;
if (len == 0 || len > maxLen) revert InvalidMetadataLength();
for (uint256 i = 0; i < len; ++i) {
uint8 c = uint8(s[i]);
if (c < 0x20 || c == 0x7F) revert InvalidMetadataChar();
}
}
/// @inheritdoc IToken
/// @dev Security model:
/// - Single-shot (`ensReverseSet` flag), so a rotated creator cannot churn
/// the displayed name. Once set, frozen forever.
/// - Two authorized principals: the *current* creator per
/// {IBondingCurve.CREATOR}, OR the factory's currently-registered
/// `deployerProxy` (`IFactory.deployerProxy()`). The proxy path enables
/// atomic forward-and-reverse registration inside a single deploy tx; the
/// creator path remains for direct claims outside the proxy flow.
/// - The reverse record is, by ENS protocol, `<this token's address>.addr.reverse`.
/// Setting it does NOT make `name` automatically resolve to this token —
/// ENS-aware wallets validate that the FORWARD `addr(node)` lookup of `name`
/// points back to this address before displaying it. So a creator (or proxy)
/// setting a misleading name (e.g. "vitalik.eth") cannot impersonate;
/// reverse-without-forward-validation is filtered out at the wallet layer.
/// - Bounded length so the call cannot grief downstream `name()` readers
/// with an unbounded string.
function setEnsReverseName(string calldata name) external override {
address proxy = IFactory(factory).deployerProxy();
bool isCreator = msg.sender == IBondingCurve(bondingCurve).CREATOR();
bool isProxy = proxy != address(0) && msg.sender == proxy;
if (!isCreator && !isProxy) revert OnlyCreator();
if (ensReverseSet) revert EnsReverseAlreadySet();
uint256 len = bytes(name).length;
if (len == 0) revert EmptyName();
if (len > MAX_ENS_NAME_LEN) revert InvalidMetadataLength();
ensReverseSet = true;
IReverseRegistrar(ENS_REVERSE_REGISTRAR).setName(name);
emit EnsReverseNameSet(name);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "factory_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyGraduated",
"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": "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": "EmptyName",
"type": "error",
"inputs": []
},
{
"name": "EnsReverseAlreadySet",
"type": "error",
"inputs": []
},
{
"name": "InvalidAccountNonce",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "currentNonce",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InvalidMetadataChar",
"type": "error",
"inputs": []
},
{
"name": "InvalidMetadataLength",
"type": "error",
"inputs": []
},
{
"name": "InvalidShortString",
"type": "error",
"inputs": []
},
{
"name": "MissingCurveHandshake",
"type": "error",
"inputs": []
},
{
"name": "OnlyBondingCurve",
"type": "error",
"inputs": []
},
{
"name": "OnlyCreator",
"type": "error",
"inputs": []
},
{
"name": "StringTooLong",
"type": "error",
"inputs": [
{
"name": "str",
"type": "string",
"internalType": "string"
}
]
},
{
"name": "TransfersLocked",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"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": "EIP712DomainChanged",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "EnsReverseNameSet",
"type": "event",
"inputs": [
{
"name": "name",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"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": "DOMAIN_SEPARATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "ENS_REVERSE_REGISTRAR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "MAX_ENS_NAME_LEN",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_METADATA_URI_LEN",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TOTAL_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "bondingCurve",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "contractURI",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "creator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"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": "ensReverseSet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "finalizeGraduation",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "graduated",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"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": "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": "setEnsReverseName",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
}
],
"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"
}
]0x6080806040526004361015610012575f80fd5b5f3560e01c90816302d05d3f14610c765750806306fdde0314610bd1578063095ea7b314610bab57806318160ddd14610b8e57806323b872dd14610aaf578063313ce56714610a945780633644e51514610a7257806370a0823114610a3b5780637486016014610a0d578063760adc08146109eb5780637ecebe00146109b357806384b0196e146108bb57806385011ead1461060457806387add967146105e9578063902d55a5146105c357806395d89b411461051e578063a849c0c314610502578063a9059cbb146104d1578063c45a01551461048d578063d505accf14610348578063dd62ed3e146102f8578063e4f392351461027e578063e7c2b77214610259578063e8a3d485146101775763eff1d50e1461012f575f80fd5b34610173575f366003190112610173576040517f000000000000000000000000f6fe24a9dda08392e218ba08b214d9684545a4136001600160a01b03168152602090f35b5f80fd5b34610173575f366003190112610173576040515f60095461019781610d52565b808452906001811690811561023557506001146101d7575b6101d3836101bf81850382610e0b565b604051918291602083526020830190610d02565b0390f35b60095f9081527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af939250905b80821061021b575090915081016020016101bf6101af565b919260018160209254838588010152019101909291610203565b60ff191660208086019190915291151560051b840190910191506101bf90506101af565b34610173575f36600319011261017357602060ff60085460081c166040519015158152f35b34610173575f366003190112610173577f000000000000000000000000f6fe24a9dda08392e218ba08b214d9684545a4136001600160a01b031633036102e95760085460ff8160081c166102da5761ff00191661010017600855005b63e6a0d45f60e01b5f5260045ffd5b630fb54f0760e21b5f5260045ffd5b3461017357604036600319011261017357610311610d26565b610319610d3c565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346101735760e036600319011261017357610361610d26565b610369610d3c565b604435906064359260843560ff811681036101735784421161047a5761043d6104469160018060a01b03841696875f52600760205260405f20908154916001830190556040519060208201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528a604084015260018060a01b038916606084015289608084015260a083015260c082015260c0815261040b60e082610e0b565b519020610416610fc4565b906040519161190160f01b83526002830152602282015260c43591604260a43592206111dd565b9092919261125f565b6001600160a01b0316848103610463575061046193506110e0565b005b84906325c0072360e11b5f5260045260245260445ffd5b8463313c898160e11b5f5260045260245ffd5b34610173575f366003190112610173576040517f00000000000000000000000082e927237ff6aaff00d0d9b60e77e495ac7227996001600160a01b03168152602090f35b34610173576040366003190112610173576104f76104ed610d26565b6024359033610e87565b602060405160018152f35b34610173575f3660031901126101735760206040516102008152f35b34610173575f366003190112610173576040515f60045461053e81610d52565b80845290600181169081156102355750600114610565576101d3836101bf81850382610e0b565b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b8082106105a9575090915081016020016101bf6101af565b919260018160209254838588010152019101909291610591565b34610173575f3660031901126101735760206040516b033b2e3c9fd0803ce80000008152f35b34610173575f36600319011261017357602060405160ff8152f35b346101735760203660031901126101735760043567ffffffffffffffff8111610173573660238201121561017357806004013567ffffffffffffffff8111610173576024820191602482369201011161017357604051636e0aa36960e11b81526020816004817f00000000000000000000000082e927237ff6aaff00d0d9b60e77e495ac7227996001600160a01b03165afa908115610811575f9161089c575b5060405163e4fbb60960e01b8152906020826004817f000000000000000000000000f6fe24a9dda08392e218ba08b214d9684545a4136001600160a01b03165afa918215610811575f9261086b575b506001600160a01b0316801515919082610861575b506001600160a01b03163314159081610858575b506108495760085460ff811661083a57811561082b5760ff821161081c5760ff191660011760085560405163c47f002760e01b81529160208380610764858560048401610e60565b03815f73a58e81fe9b61b5c3fe2afd33cf304c454abfc7cb5af18015610811576107c0575b7fcd7a3a16d243f081d4ac5956b1fa0b42bf0ba500bab2e1632f37008adf66425392506107bb60405192839283610e60565b0390a1005b6020833d602011610809575b816107d960209383610e0b565b81010312610173577fcd7a3a16d243f081d4ac5956b1fa0b42bf0ba500bab2e1632f37008adf6642539250610789565b3d91506107cc565b6040513d5f823e3d90fd5b63b423cfa160e01b5f5260045ffd5b632ef1310560e01b5f5260045ffd5b63a7148b3f60e01b5f5260045ffd5b6308f78f9960e31b5f5260045ffd5b9050158361071c565b3314915084610708565b61088e91925060203d602011610895575b6108868183610e0b565b810190610e41565b90846106f3565b503d61087c565b6108b5915060203d602011610895576108868183610e0b565b836106a4565b34610173575f366003190112610173576109576108f77f576527726520536f204261636b0000000000000000000000000000000000000d611143565b6109207f31000000000000000000000000000000000000000000000000000000000000016111a6565b6020610965604051926109338385610e0b565b5f84525f368137604051958695600f60f81b875260e08588015260e0870190610d02565b908582036040870152610d02565b4660608501523060808501525f60a085015283810360c08501528180845192838152019301915f5b82811061099c57505050500390f35b83518552869550938101939281019260010161098d565b34610173576020366003190112610173576001600160a01b036109d4610d26565b165f526007602052602060405f2054604051908152f35b34610173575f36600319011261017357602060ff600854166040519015158152f35b34610173575f36600319011261017357602060405173a58e81fe9b61b5c3fe2afd33cf304c454abfc7cb8152f35b34610173576020366003190112610173576001600160a01b03610a5c610d26565b165f525f602052602060405f2054604051908152f35b34610173575f366003190112610173576020610a8c610fc4565b604051908152f35b34610173575f36600319011261017357602060405160128152f35b3461017357606036600319011261017357610ac8610d26565b610ad0610d3c565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610b0e575b506104f79350610e87565b838110610b73578415610b60573315610b4d576104f7945f52600160205260405f2060018060a01b0333165f526020528360405f209103905584610b03565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b34610173575f366003190112610173576020600254604051908152f35b34610173576040366003190112610173576104f7610bc7610d26565b60243590336110e0565b34610173575f366003190112610173576040515f600354610bf181610d52565b80845290600181169081156102355750600114610c18576101d3836101bf81850382610e0b565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210610c5c575090915081016020016101bf6101af565b919260018160209254838588010152019101909291610c44565b34610173575f3660031901126101735763e4fbb60960e01b81526020816004817f000000000000000000000000f6fe24a9dda08392e218ba08b214d9684545a4136001600160a01b03165afa8015610811576020915f91610ce5575b506040516001600160a01b039091168152f35b610cfc9150823d8411610895576108868183610e0b565b82610cd2565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361017357565b602435906001600160a01b038216820361017357565b90600182811c92168015610d80575b6020831014610d6c57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610d61565b5f9291815491610d9983610d52565b8083529260018116908115610dee5750600114610db557505050565b5f9081526020812093945091925b838310610dd4575060209250010190565b600181602092949394548385870101520191019190610dc3565b915050602093945060ff929192191683830152151560051b010190565b90601f8019910116810190811067ffffffffffffffff821117610e2d57604052565b634e487b7160e01b5f52604160045260245ffd5b9081602091031261017357516001600160a01b03811681036101735790565b90918060409360208452816020850152848401375f828201840152601f01601f1916010190565b6001600160a01b0316908115610fb1576001600160a01b0316918215610f9e5760ff60085460081c161580610f96575b80610f8e575b610f39575b815f525f60205260405f2054818110610f2057817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b7f000000000000000000000000f6fe24a9dda08392e218ba08b214d9684545a4136001600160a01b0316828114159081610f83575b5015610ec2576336e278fd60e21b5f5260045ffd5b90508314155f610f6e565b506001610ebd565b506001610eb7565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b307f0000000000000000000000007ecec279fc62e91d0e49422929ae704a94cedef16001600160a01b031614806110b7575b1561101f577f4741cd7653909a0e07e2907cb0f760722862982210667d85affdebb121a7fd7590565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527fb282bfd3f89f2dfb19056216ed0a78e0112ee8ea1bcebe2fb56b4a577643eaf260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a081526110b160c082610e0b565b51902090565b507f00000000000000000000000000000000000000000000000000000000000012374614610ff6565b6001600160a01b0316908115610b60576001600160a01b0316918215610b4d5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60ff81146111895760ff811690601f821161117a5760405191611167604084610e0b565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b506040516111a38161119c816005610d8a565b0382610e0b565b90565b60ff81146111ca5760ff811690601f821161117a5760405191611167604084610e0b565b506040516111a38161119c816006610d8a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411611254579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610811575f516001600160a01b0381161561124a57905f905f90565b505f906001905f90565b5050505f9160039190565b60048110156112bf5780611271575050565b600181036112885763f645eedf60e01b5f5260045ffd5b600281036112a3575063fce698f760e01b5f5260045260245ffd5b6003146112ad5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffd
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x18874ea4…08468f | Transfer | 18,447,188 | 23 days agoFri, 24 Jul 2026 20:46:41 UTC | 0xcaf7…5d11 | IN | 0x7ece…def1 | $0.001 DIH |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x7c54ac…e28803 | 4 days agoWed, 12 Aug 2026 16:18:02 UTC | Transfer | [0] 0x000000000000…5a5beeb3 [1] 0x000000000000…67a06043 data: 0x000000000000000000…643fd6cc |
| 0xec454c…f8b24a | 4 days agoWed, 12 Aug 2026 16:18:02 UTC | Approval | [0] 0x000000000000…5a5beeb3 [1] 0x000000000000…e1a4f53d data: 0xffffffffffffffffff…ffffffff |
| 0x72281a…293b7d | 4 days agoWed, 12 Aug 2026 15:50:48 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…5a5beeb3 data: 0x000000000000000000…8086b1cb |
| 0xbbc064…8a2da7 | 7 days agoSun, 09 Aug 2026 09:08:00 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…69bf7722 data: 0x000000000000000000…dda444a0 |
| 0xa9e219…1bf767 | 15 days agoSat, 01 Aug 2026 00:49:35 UTC | Transfer | [0] 0x000000000000…db8c0904 [1] 0x000000000000…43e40951 data: 0x000000000000000000…e49c1e03 |
| 0xa9e219…1bf767 | 15 days agoSat, 01 Aug 2026 00:49:35 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…fa63d0cc data: 0x000000000000000000…e0129c86 |
| 0xa9e219…1bf767 | 15 days agoSat, 01 Aug 2026 00:49:35 UTC | Transfer | [0] 0x000000000000…2274dfe6 [1] 0x000000000000…db8c0904 data: 0x000000000000000000…e49c1e03 |
| 0xd7da32…f5ce08 | 15 days agoSat, 01 Aug 2026 00:49:34 UTC | Approval | [0] 0x000000000000…2274dfe6 [1] 0x000000000000…2e5fb996 data: 0xffffffffffffffffff…ffffffff |
| 0x49766c…5d5f36 | 16 days agoFri, 31 Jul 2026 12:13:12 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…67a06043 data: 0x000000000000000000…92f37162 |
| 0x302e02…cbe56a | 20 days agoMon, 27 Jul 2026 14:50:59 UTC | Approval | [0] 0x000000000000…a0dcb678 [1] 0x000000000000…6cd7ce2b data: 0x000000000000000000…00000000 |
| 0xe96f1f…f33d71 | 20 days agoMon, 27 Jul 2026 10:00:05 UTC | Transfer | [0] 0x000000000000…8376dd7b [1] 0x000000000000…43e40951 data: 0x000000000000000000…fcbbf542 |
| 0xe96f1f…f33d71 | 20 days agoMon, 27 Jul 2026 10:00:05 UTC | Transfer | [0] 0x000000000000…67a06043 [1] 0x000000000000…8376dd7b data: 0x000000000000000000…fcbbf542 |
| 0x58eb4e…36d450 | 20 days agoMon, 27 Jul 2026 10:00:05 UTC | Transfer | [0] 0x000000000000…8376dd7b [1] 0x000000000000…43e40951 data: 0x000000000000000000…3771d0c5 |
| 0x58eb4e…36d450 | 20 days agoMon, 27 Jul 2026 10:00:05 UTC | Transfer | [0] 0x000000000000…67a06043 [1] 0x000000000000…8376dd7b data: 0x000000000000000000…3771d0c5 |
| 0x99f2a8…8efe17 | 20 days agoMon, 27 Jul 2026 10:00:05 UTC | Transfer | [0] 0x000000000000…8376dd7b [1] 0x000000000000…43e40951 data: 0x000000000000000000…192568ed |
| 0x99f2a8…8efe17 | 20 days agoMon, 27 Jul 2026 10:00:05 UTC | Transfer | [0] 0x000000000000…67a06043 [1] 0x000000000000…8376dd7b data: 0x000000000000000000…192568ed |
| 0x92f670…08bb67 | 20 days agoMon, 27 Jul 2026 10:00:05 UTC | Transfer | [0] 0x000000000000…e687ad0d [1] 0x000000000000…67a06043 data: 0x000000000000000000…15e3d130 |
| 0x92f670…08bb67 | 20 days agoMon, 27 Jul 2026 10:00:05 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…e687ad0d data: 0x000000000000000000…15e3d130 |
| 0x6ac573…93b8f0 | 20 days agoMon, 27 Jul 2026 10:00:05 UTC | Transfer | [0] 0x000000000000…1d058e95 [1] 0x000000000000…43e40951 data: 0x000000000000000000…44262e9c |
| 0x6ac573…93b8f0 | 20 days agoMon, 27 Jul 2026 10:00:05 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…fa63d0cc data: 0x000000000000000000…169fb39e |
| 0xb7d893…2363c4 | 20 days agoMon, 27 Jul 2026 09:59:40 UTC | Approval | [0] 0x000000000000…1d058e95 [1] 0x000000000000…3ac78ba3 data: 0x000000000000000000…ffffffff |
| 0x893e52…09b45e | 20 days agoMon, 27 Jul 2026 09:59:10 UTC | Transfer | [0] 0x000000000000…429be704 [1] 0x000000000000…1d058e95 data: 0x000000000000000000…a4a7511b |
| 0x9b3024…3cc61a | 23 days agoFri, 24 Jul 2026 12:52:52 UTC | Transfer | [0] 0x000000000000…e9b05d31 [1] 0x000000000000…43e40951 data: 0x000000000000000000…e549a699 |
| 0x9b3024…3cc61a | 23 days agoFri, 24 Jul 2026 12:52:52 UTC | Transfer | [0] 0x000000000000…ae41ad95 [1] 0x000000000000…e9b05d31 data: 0x000000000000000000…e549a699 |
| 0xe573d7…20f964 | 23 days agoFri, 24 Jul 2026 12:52:52 UTC | Approval | [0] 0x000000000000…ae41ad95 [1] 0x000000000000…f6797d6d data: 0xffffffffffffffffff…ffffffff |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xec454c…f8b24a | Approve | 34,666,031 | 4 days agoWed, 12 Aug 2026 16:18:02 UTC | 0x1d36…eeb3 | IN | We're So Back | $0.000 ETH | 0.00000233 | |
| 0xd7da32…f5ce08 | Approve | 24,621,239 | 15 days agoSat, 01 Aug 2026 00:49:34 UTC | 0xa07e…dfe6 | IN | We're So Back | $0.000 ETH | 0.00000093 | |
| 0x302e02…cbe56a | Approve | 20,817,410 | 20 days agoMon, 27 Jul 2026 14:50:59 UTC | 0x6783…b678 | IN | We're So Back | $0.000 ETH | 0.00000085 | |
| 0xb7d893…2363c4 | Approve | 20,643,110 | 20 days agoMon, 27 Jul 2026 09:59:40 UTC | 0x9126…8e95 | IN | We're So Back | $0.000 ETH | 0.00000174 | |
| 0xe573d7…20f964 | Approve | 18,163,305 | 23 days agoFri, 24 Jul 2026 12:52:52 UTC | 0xbf72…ad95 | IN | We're So Back | $0.000 ETH | 0.00000497 | |
| 0x5f85af…7097c3 | Approve | 18,163,298 | 23 days agoFri, 24 Jul 2026 12:52:51 UTC | 0xbf72…ad95 | IN | We're So Back | $0.000 ETH | 0.00000498 | |
| 0x865833…69dcfc | Approve | 18,163,249 | 23 days agoFri, 24 Jul 2026 12:52:46 UTC | 0xbf72…ad95 | IN | We're So Back | $0.000 ETH | 0.00000503 | |
| 0x643513…0b304a | Approve | 18,078,291 | 23 days agoFri, 24 Jul 2026 10:30:29 UTC | 0x9985…ffc9 | IN | We're So Back | $0.000 ETH | 0.00000517 | |
| 0x53a38e…b3678b | Approve | 18,076,740 | 23 days agoFri, 24 Jul 2026 10:27:53 UTC | 0xd5fa…f9cc | IN | We're So Back | $0.000 ETH | 0.00000516 | |
| 0x1584eb…863969 | Approve | 17,389,428 | 24 days agoThu, 23 Jul 2026 15:18:49 UTC | 0x8692…0317 | IN | We're So Back | $0.000 ETH | 0.00000519 | |
| 0xe977ed…4cbff8 | Approve | 16,850,922 | 24 days agoThu, 23 Jul 2026 00:18:58 UTC | 0xf9a8…5e80 | IN | We're So Back | $0.000 ETH | 0.00000433 | |
| 0x21a722…0c2d1a | Approve | 16,095,139 | 25 days agoWed, 22 Jul 2026 03:16:33 UTC | 0x7777…752c | IN | We're So Back | $0.000 ETH | 0.00000353 | |
| 0xd8b845…697e22 | Approve | 13,940,162 | 28 days agoSun, 19 Jul 2026 15:14:59 UTC | 0x8ae2…63c7 | IN | We're So Back | $0.000 ETH | 0.00000134 | |
| 0x8c0688…28d08a | Approve | 13,472,596 | 28 days agoSun, 19 Jul 2026 02:11:54 UTC | 0x83fc…3cc4 | IN | We're So Back | $0.000 ETH | 0.00000153 | |
| 0xd34078…3566e6 | Approve | 13,427,526 | 28 days agoSun, 19 Jul 2026 00:56:28 UTC | 0x8c1f…543a | IN | We're So Back | $0.000 ETH | 0.00000154 | |
| 0x2a4f0e…7cc105 | Approve | 13,071,688 | 29 days agoSat, 18 Jul 2026 15:01:25 UTC | 0xd429…8c90 | IN | We're So Back | $0.000 ETH | 0.00000304 | |
| 0x56d0eb…b9ad7b | Approve | 12,899,870 | 29 days agoSat, 18 Jul 2026 10:13:48 UTC | 0x2710…15cc | IN | We're So Back | $0.000 ETH | 0.00000321 | |
| 0x595439…190108 | Approve | 12,300,939 | 30 days agoFri, 17 Jul 2026 17:32:06 UTC | 0x34f7…d432 | IN | We're So Back | $0.000 ETH | 0.00000343 | |
| 0xf150e7…255303 | Approve | 12,127,111 | 30 days agoFri, 17 Jul 2026 12:41:38 UTC | 0xc28a…fadf | IN | We're So Back | $0.000 ETH | 0.00000343 | |
| 0x6c03e0…511064 | Approve | 11,995,312 | 30 days agoFri, 17 Jul 2026 09:00:50 UTC | 0x4021…c90b | IN | We're So Back | $0.000 ETH | 0.00000363 | |
| 0xbf2621…f7e47a | Approve | 11,704,037 | 30 days agoFri, 17 Jul 2026 00:53:49 UTC | 0xd32b…bfb6 | IN | We're So Back | $0.000 ETH | 0.00000385 | |
| 0x12eeca…a4af3d | Approve | 11,496,491 | 31 days agoThu, 16 Jul 2026 19:07:34 UTC | 0x1d36…eeb3 | IN | We're So Back | $0.000 ETH | 0.00000208 | |
| 0x31ea09…3faa8e | Approve | 11,380,989 | 31 days agoThu, 16 Jul 2026 15:54:54 UTC | 0x29ea…e770 | IN | We're So Back | $0.000 ETH | 0.00000305 | |
| 0x29f780…e8ba6d | Approve | 11,338,599 | 31 days agoThu, 16 Jul 2026 14:44:08 UTC | 0xa1a0…da9c | IN | We're So Back | $0.000 ETH | 0.00000297 | |
| 0xe5593e…fdd8e4 | Approve | 11,311,611 | 31 days agoThu, 16 Jul 2026 13:59:12 UTC | 0x99e5…6083 | IN | We're So Back | $0.000 ETH | 0.00000291 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 10,380,386 | 32 days agoWed, 15 Jul 2026 12:07:31 UTC | 0xc67588…b9645d | CREATE2 | createToken | 0x82e9…2799 | IN | 0x7ece…def1 | 0 ETH |