// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/// @title FactoryToken
/// @notice Fixed-supply ERC20 deployed by the TokenFactory. The entire supply
/// is minted to the deployer (the factory) so it can be placed into a
/// Uniswap V3 pool as single-sided liquidity.
/// @dev Metadata lives on-chain except the image, which is an IPFS pointer. For
/// the first `restrictionBlocks` blocks after deployment, no non-exempt
/// wallet may hold more than `maxWalletAmount` tokens (anti-sniping). The
/// factory manages exemptions (itself, the pool, and the deployer during
/// the launch initial buy).
///
/// When deployed with `holderRewards`, the creator's share of LP trading
/// fees is distributed pro-rata to token holders instead of the creator,
/// using a magnified-dividends-per-share accumulator (in both WETH and the
/// token itself). The pool, the factory and this contract are excluded from
/// rewards; holders claim with `claim()`.
contract FactoryToken is ERC20 {
/// @notice Token metadata. Only `image` points off-chain (ipfs://<cid>);
/// description and socials are stored on-chain. All fields optional.
struct Metadata {
string image;
string description;
string twitter;
string telegram;
string discord;
string website;
}
uint256 private constant MAGNITUDE = 1 << 128;
/// @notice The TokenFactory that deployed this token.
address public immutable factory;
/// @notice The account that launched this token through the factory.
address public immutable deployer;
/// @notice Max tokens a non-exempt wallet can hold during the restriction
/// period. 0 means no limit.
uint256 public immutable maxWalletAmount;
/// @notice Last block (inclusive) where the max-wallet restriction applies.
uint256 public immutable restrictionEndBlock;
/// @notice When true, the creator's LP fee share is distributed to holders.
bool public immutable holderRewards;
/// @notice WETH, in which the WETH side of holder rewards is paid.
address public immutable weth;
Metadata internal _metadata;
/// @notice Addresses exempt from the max-wallet restriction (factory, pool).
mapping(address => bool) public isExempt;
// --- holder rewards state (only used when holderRewards is true) ---
/// @notice Sum of all reward-eligible balances (total supply minus excluded).
uint256 public rewardShares;
/// @notice Addresses whose balance earns no rewards (pool, factory, this).
mapping(address => bool) public excludedFromRewards;
mapping(address => uint256) private _shares;
uint256 private _magTokenPerShare;
uint256 private _magWethPerShare;
mapping(address => int256) private _tokenCorrections;
mapping(address => int256) private _wethCorrections;
mapping(address => uint256) private _withdrawnToken;
mapping(address => uint256) private _withdrawnWeth;
event RewardsDistributed(uint256 tokenAmount, uint256 wethAmount);
event RewardsClaimed(address indexed account, uint256 tokenAmount, uint256 wethAmount);
error MaxWalletExceeded();
error NotFactory();
constructor(
string memory name_,
string memory symbol_,
Metadata memory metadata_,
address deployer_,
uint256 supply_,
uint256 maxWalletAmount_,
uint256 restrictionBlocks_,
bool holderRewards_,
address weth_
) ERC20(name_, symbol_) {
factory = msg.sender;
deployer = deployer_;
_metadata = metadata_;
maxWalletAmount = maxWalletAmount_;
restrictionEndBlock = block.number + restrictionBlocks_;
holderRewards = holderRewards_;
weth = weth_;
isExempt[msg.sender] = true;
if (holderRewards_) {
excludedFromRewards[msg.sender] = true;
excludedFromRewards[address(this)] = true;
}
_mint(msg.sender, supply_);
}
/// @notice Everything about this token in one call: who launched it, the
/// IPFS image, and the on-chain description and socials.
function tokenInfo() external view returns (address, Metadata memory) {
return (deployer, _metadata);
}
/// @notice Factory-only exemption management: the pool must hold the full
/// supply, and the deployer is exempted just for the initial buy.
function setExempt(address account, bool exempt) external {
if (msg.sender != factory) revert NotFactory();
isExempt[account] = exempt;
}
// --- holder rewards ---
/// @notice Factory-only: excludes an address (the pool) from holder rewards.
function setRewardExclusion(address account, bool excluded) external {
if (msg.sender != factory) revert NotFactory();
excludedFromRewards[account] = excluded;
_setShares(account, excluded ? 0 : balanceOf(account));
}
/// @notice Factory-only: accounts for reward funds that were just transferred
/// into this contract, crediting all current holders pro-rata.
function notifyRewards(uint256 tokenAmount, uint256 wethAmount) external {
if (msg.sender != factory) revert NotFactory();
uint256 shares = rewardShares;
if (shares == 0) return;
if (tokenAmount > 0) _magTokenPerShare += (tokenAmount * MAGNITUDE) / shares;
if (wethAmount > 0) _magWethPerShare += (wethAmount * MAGNITUDE) / shares;
emit RewardsDistributed(tokenAmount, wethAmount);
}
/// @notice Rewards `account` can claim right now (token side, WETH side).
function withdrawableRewards(
address account
) public view returns (uint256 tokenAmount, uint256 wethAmount) {
uint256 shares = _shares[account];
tokenAmount =
uint256(int256(_magTokenPerShare * shares) + _tokenCorrections[account]) /
MAGNITUDE -
_withdrawnToken[account];
wethAmount =
uint256(int256(_magWethPerShare * shares) + _wethCorrections[account]) /
MAGNITUDE -
_withdrawnWeth[account];
}
/// @notice Claims the caller's accumulated holder rewards.
function claim() external returns (uint256 tokenAmount, uint256 wethAmount) {
(tokenAmount, wethAmount) = withdrawableRewards(msg.sender);
if (tokenAmount > 0) {
_withdrawnToken[msg.sender] += tokenAmount;
_transfer(address(this), msg.sender, tokenAmount);
}
if (wethAmount > 0) {
_withdrawnWeth[msg.sender] += wethAmount;
IERC20(weth).transfer(msg.sender, wethAmount);
}
if (tokenAmount > 0 || wethAmount > 0) {
emit RewardsClaimed(msg.sender, tokenAmount, wethAmount);
}
}
/// @dev Keeps an account's reward shares in sync with its balance, adjusting
/// corrections so already-distributed rewards are unaffected by the change.
function _setShares(address account, uint256 newShares) private {
uint256 oldShares = _shares[account];
if (newShares == oldShares) return;
_shares[account] = newShares;
if (newShares > oldShares) {
uint256 added = newShares - oldShares;
_tokenCorrections[account] -= int256(_magTokenPerShare * added);
_wethCorrections[account] -= int256(_magWethPerShare * added);
rewardShares += added;
} else {
uint256 removed = oldShares - newShares;
_tokenCorrections[account] += int256(_magTokenPerShare * removed);
_wethCorrections[account] += int256(_magWethPerShare * removed);
rewardShares -= removed;
}
}
function _update(address from, address to, uint256 value) internal override {
super._update(from, to, value);
if (
to != address(0) &&
maxWalletAmount != 0 &&
block.number <= restrictionEndBlock &&
!isExempt[to] &&
balanceOf(to) > maxWalletAmount
) {
revert MaxWalletExceeded();
}
if (holderRewards) {
if (from != address(0) && !excludedFromRewards[from]) {
_setShares(from, balanceOf(from));
}
if (to != address(0) && !excludedFromRewards[to]) {
_setShares(to, balanceOf(to));
}
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "metadata_",
"type": "tuple",
"components": [
{
"name": "image",
"type": "string",
"internalType": "string"
},
{
"name": "description",
"type": "string",
"internalType": "string"
},
{
"name": "twitter",
"type": "string",
"internalType": "string"
},
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "discord",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
}
],
"internalType": "struct FactoryToken.Metadata"
},
{
"name": "deployer_",
"type": "address",
"internalType": "address"
},
{
"name": "supply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxWalletAmount_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "restrictionBlocks_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "holderRewards_",
"type": "bool",
"internalType": "bool"
},
{
"name": "weth_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "MaxWalletExceeded",
"type": "error",
"inputs": []
},
{
"name": "NotFactory",
"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": "RewardsClaimed",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "wethAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RewardsDistributed",
"type": "event",
"inputs": [
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "wethAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "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": "claim",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "wethAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "deployer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "excludedFromRewards",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "holderRewards",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isExempt",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "maxWalletAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "notifyRewards",
"type": "function",
"inputs": [
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "wethAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "restrictionEndBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "rewardShares",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "setExempt",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "exempt",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRewardExclusion",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "excluded",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "tokenInfo",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "tuple",
"components": [
{
"name": "image",
"type": "string",
"internalType": "string"
},
{
"name": "description",
"type": "string",
"internalType": "string"
},
{
"name": "twitter",
"type": "string",
"internalType": "string"
},
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "discord",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
}
],
"internalType": "struct FactoryToken.Metadata"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "withdrawableRewards",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "wethAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
}
]0x6080604052600436101561001257600080fd5b60003560e01c806306fdde0314610f915780630861ac6114610f56578063095ea7b314610ed05780630f14b4d614610ead57806318160ddd14610e8f57806323b872dd14610da2578063313ce56714610d865780633fc8cef314610d415780634e71d92d14610bd05780636addb663146105b957806370a082311461057f57806372478428146104f257806395d89b41146103e35780639fde54f51461036a578063a9059cbb14610339578063aa4bde28146102fe578063ad5dff73146102bf578063b9fdb71f1461029e578063c45a015514610259578063d5f3948814610214578063dd62ed3e146101c3578063e5259546146101a5578063e74a7903146101685763f82f235f1461012457600080fd5b34610163576020366003190112610163576001600160a01b03610145611090565b16600052600d602052602060ff604060002054166040519015158152f35b600080fd5b346101635760003660031901126101635760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b34610163576000366003190112610163576020600c54604051908152f35b34610163576040366003190112610163576101dc611090565b6101e46110a6565b6001600160a01b039182166000908152600160209081526040808320949093168252928352819020549051908152f35b34610163576000366003190112610163576040517f0000000000000000000000001112b8c161119d4f866e4c21bacf0eeb3a1c91d96001600160a01b03168152602090f35b34610163576000366003190112610163576040517f0000000000000000000000008fc21471906362eda5029a3838c1d4a49d4776b56001600160a01b03168152602090f35b34610163576040366003190112610163576102bd602435600435611258565b005b34610163576020366003190112610163576001600160a01b036102e0611090565b16600052600b602052602060ff604060002054166040519015158152f35b346101635760003660031901126101635760206040517f00000000000000000000000000000000000000000001a784379d99db420000008152f35b346101635760403660031901126101635761035f610355611090565b602435903361136c565b602060405160018152f35b3461016357610378366110bc565b7f0000000000000000000000008fc21471906362eda5029a3838c1d4a49d4776b56001600160a01b031633036103d2576102bd9160018060a01b0316600052600b60205260406000209060ff801983541691151516179055565b631966391b60e11b60005260046000fd5b346101635760003660031901126101635760405160006004548060011c906001811680156104e8575b6020831081146104d4578285529081156104b05750600114610451575b61044d836104398185038261111d565b60405191829160208352602083019061104f565b0390f35b600460009081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061049657509091508101602001610439610429565b91926001816020925483858801015201910190929161047e565b60ff191660208086019190915291151560051b840190910191506104399050610429565b634e487b7160e01b84526022600452602484fd5b91607f169161040c565b3461016357610500366110bc565b907f0000000000000000000000008fc21471906362eda5029a3838c1d4a49d4776b56001600160a01b031633036103d2576001600160a01b0381166000818152600d60205260409020805460ff191660ff851515161790556102bd926000901561056e57505060009061158c565b60409181528060205220549061158c565b34610163576020366003190112610163576001600160a01b036105a0611090565b1660005260006020526020604060002054604051908152f35b3461016357600036600319011261016357606060a06040516105da816110eb565b82815282602082015282604082015282808201528260808201520152604051610602816110eb565b6040516000600554908160011c91600181168015610bc6575b60208410811461098e578385528492918115610ba75750600114610b47575b6106469250038261111d565b81526040516000600654908160011c91600181168015610b3d575b60208410811461098e578385528492918115610b1e5750600114610abe575b61068c9250038261111d565b602082019081526040516000600754908160011c91600181168015610ab4575b60208410811461098e578385528492918115610a955750600114610a35575b6106d79250038261111d565b60408301908152604051906000600854908160011c91600181168015610a2b575b60208410811461098e578386528592918115610a0c57506001146109ac575b6107239250038361111d565b60608401918252604051926000600954908160011c916001811680156109a2575b60208410811461098e57838852879291811561096f575060011461090f575b61076f9250038561111d565b60808501938452604051946000600a548060011c90600181168015610905575b6020831081146104d457828a529081156108e15750600114610886575b5061044d9461084d889561083a6108739661082760409b976107d560c09e61086099038c61111d565b60a081019a8b528c517f0000000000000000000000001112b8c161119d4f866e4c21bacf0eeb3a1c91d96001600160a01b03168152602081018e905290519c81019d909d528c9b6101008d019061104f565b90518b8203603f190160608d015261104f565b9051898203603f190160808b015261104f565b9051878203603f190160a089015261104f565b9051858203603f190160c087015261104f565b9051838203603f190160e085015261104f565b600a600090815291507fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b8183106108c7575050860160200161044d6107ac565b6001816020929493945483858d01015201910191906108b1565b60ff19166020808b019190915291151560051b8901909101915061044d90506107ac565b91607f169161078f565b506009600090815290917f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af5b81831061095357505090602061076f92820101610763565b6020919350806001915483858b0101520191019091869261093b565b6020925061076f94915060ff191682840152151560051b820101610763565b634e487b7160e01b83526022600452602483fd5b92607f1692610744565b506008600090815290917ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee35b8183106109f057505090602061072392820101610717565b60209193508060019154838589010152019101909184926109d8565b6020925061072394915060ff191682840152151560051b820101610717565b92607f16926106f8565b506007600090815290917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6885b818310610a795750509060206106d7928201016106cb565b6020919350806001915483858801015201910190918392610a61565b602092506106d794915060ff191682840152151560051b8201016106cb565b92607f16926106ac565b506006600090815290917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b818310610b0257505090602061068c92820101610680565b6020919350806001915483858801015201910190918392610aea565b6020925061068c94915060ff191682840152151560051b820101610680565b92607f1692610661565b506005600090815290917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b818310610b8b5750509060206106469282010161063a565b6020919350806001915483858801015201910190918392610b73565b6020925061064694915060ff191682840152151560051b82010161063a565b92607f169261061b565b3461016357600036600319011261016357610bea336111b1565b9080159182159283610d16575b81151580610c58575b60409491610c50575b50610c1b575b82519182526020820152f35b82518281528160208201527fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325843392a2610c0f565b905084610c09565b3360005260146020526040600020610c7184825461124b565b905560405163a9059cbb60e01b81523360048201526024810184905260208160448160007f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165af18015610d0a57610cd2575b50610c00565b6020813d602011610d02575b81610ceb6020938361111d565b810103126101635751801515036101635785610ccc565b3d9150610cde565b6040513d6000823e3d90fd5b3360005260136020526040600020610d2f84825461124b565b9055610d3c83333061136c565b610bf7565b34610163576000366003190112610163576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b3461016357600036600319011261016357602060405160128152f35b3461016357606036600319011261016357610dbb611090565b610dc36110a6565b6001600160a01b0382166000818152600160209081526040808320338452909152902054909260443592916000198110610e03575b5061035f935061136c565b838110610e72578415610e5c573315610e465761035f946000526001602052604060002060018060a01b0333166000526020528360406000209103905584610df8565b634a1406b160e11b600052600060045260246000fd5b63e602df0560e01b600052600060045260246000fd5b8390637dc7a0d960e11b6000523360045260245260445260646000fd5b34610163576000366003190112610163576020600254604051908152f35b34610163576020366003190112610163576040610c0f610ecb611090565b6111b1565b3461016357604036600319011261016357610ee9611090565b602435903315610e5c576001600160a01b0316908115610e4657336000526001602052604060002082600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346101635760003660031901126101635760206040517f000000000000000000000000000000000000000000000000000000000185f2388152f35b346101635760003660031901126101635760405160006003548060011c90600181168015611045575b6020831081146104d4578285529081156104b05750600114610fe65761044d836104398185038261111d565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b80821061102b57509091508101602001610439610429565b919260018160209254838588010152019101909291611013565b91607f1691610fba565b919082519283825260005b84811061107b575050826000602080949584010152601f8019910116010190565b8060208092840101518282860101520161105a565b600435906001600160a01b038216820361016357565b602435906001600160a01b038216820361016357565b6040906003190112610163576004356001600160a01b0381168103610163579060243580151581036101635790565b60c0810190811067ffffffffffffffff82111761110757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761110757604052565b8181029291811591840414171561115257565b634e487b7160e01b600052601160045260246000fd5b9190916000838201938412911290801582169115161761115257565b811561118e570490565b634e487b7160e01b600052601260045260246000fd5b9190820391821161115257565b60018060a01b03169081600052600e6020526112486040600020549261123061121b6112126111fa6111e588600f5461113f565b85600052601160205260406000205490611168565b60801c846000526013602052604060002054906111a4565b9560105461113f565b82600052601260205260406000205490611168565b60801c906000526014602052604060002054906111a4565b90565b9190820180921161115257565b7f0000000000000000000000008fc21471906362eda5029a3838c1d4a49d4776b56001600160a01b031633036103d257600c5480156113675781158015611334575b50821580156112d8575b50506040907f29e98ba00d07f171959c4ddcd2f3020debc7c52cf537a034d7e664340d098c6c9282519182526020820152a1565b9092608081901b9291600160801b828504141715611152576113286113207f29e98ba00d07f171959c4ddcd2f3020debc7c52cf537a034d7e664340d098c6c95604095611184565b60105461124b565b601055928192506112a4565b608083901b90600160801b848304141715611152576113568261135e92611184565b600f5461124b565b600f553861129a565b505050565b6001600160a01b038116801561155d576001600160a01b0383169182156115475760009482865285602052604086205481811061152c577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208387948794858c528b84520360408b2055848a5289825260408a20818154019055604051908152a37f00000000000000000000000000000000000000000001a784379d99db420000008015159081611501575b816114e9575b816114d4575b506114c5577f0000000000000000000000000000000000000000000000000000000000000000611457575b5050505050565b818552600d60205260ff604086205416156114a9575b5050808352600d60205260ff6040842054161561148c575b8080611450565b826040916114a194528060205220549061158c565b388080611485565b6114be9185528460205260408520549061158c565b388061146d565b632ce93b5960e01b8552600485fd5b90508386528560205260408620541138611425565b848752600b602052604087205460ff1615915061141f565b7f000000000000000000000000000000000000000000000000000000000185f2384311159150611419565b86925060649363391434e360e21b8452600452602452604452fd5b63ec442f0560e01b600052600060045260246000fd5b634b637e8f60e11b600052600060045260246000fd5b8181039291600013801582851316918412161761115257565b6001600160a01b03166000818152600e6020526040902054918083146113675781600052600e6020528060406000205582811160001461162f5761162a926115d3916111a4565b906115e082600f5461113f565b8160005260116020526115f96040600020918254611573565b90556116078260105461113f565b9060005260126020526116206040600020918254611573565b9055600c5461124b565b600c55565b61163c9061162a936111a4565b9061164982600f5461113f565b8160005260116020526116626040600020918254611168565b90556116708260105461113f565b9060005260126020526116896040600020918254611168565b9055600c546111a456fea2646970667358221220c446780eb13bb659eed7434617ca97ceaaef4424f831d5a08114f1161a06d00c64736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000106 | $0 |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x57fb84…68e943 | 28 days agoSat, 18 Jul 2026 08:12:23 UTC | Transfer | [0] 0x000000000000…9fa64de4 [1] 0x000000000000…4d2cc10e data: 0x000000000000000000…1cce7f00 |
| 0x30a8c8…a958c3 | 28 days agoSat, 18 Jul 2026 08:12:16 UTC | Approval | [0] 0x000000000000…9fa64de4 [1] 0x000000000000…72c22734 data: 0x000000000000000000…1cce7f00 |
| 0xd3d34b…760b2c | 28 days agoSat, 18 Jul 2026 04:09:27 UTC | Transfer | [0] 0x000000000000…9d4776b5 [1] 0x000000000000…61235665 data: 0x000000000000000000…865c9686 |
| 0xd3d34b…760b2c | 28 days agoSat, 18 Jul 2026 04:09:27 UTC | Transfer | [0] 0x000000000000…9d4776b5 [1] 0x000000000000…3a1c91d9 data: 0x000000000000000000…865c9686 |
| 0xd3d34b…760b2c | 28 days agoSat, 18 Jul 2026 04:09:27 UTC | Transfer | [0] 0x000000000000…4d2cc10e [1] 0x000000000000…9d4776b5 data: 0x000000000000000000…0cb92d0c |
| 0xb74c22…048e9c | 28 days agoSat, 18 Jul 2026 02:58:18 UTC | Transfer | [0] 0x000000000000…73ab8a37 [1] 0x000000000000…4d2cc10e data: 0x000000000000000000…d4c60574 |
| 0xb74c22…048e9c | 28 days agoSat, 18 Jul 2026 02:58:18 UTC | Approval | [0] 0x000000000000…73ab8a37 [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…d4c60574 |
| 0xb74c22…048e9c | 28 days agoSat, 18 Jul 2026 02:58:18 UTC | Transfer | [0] 0x000000000000…79c6e6fb [1] 0x000000000000…73ab8a37 data: 0x000000000000000000…d4c60574 |
| 0x879532…3bc438 | 29 days agoFri, 17 Jul 2026 22:35:37 UTC | Transfer | [0] 0x000000000000…9bd61bdf [1] 0x000000000000…4d2cc10e data: 0x000000000000000000…686e8431 |
| 0x336342…6e435e | 29 days agoFri, 17 Jul 2026 22:25:46 UTC | Transfer | [0] 0x000000000000…3a1c91d9 [1] 0x000000000000…4d2cc10e data: 0x000000000000000000…ce5d71dc |
| 0x660f8c…9dca77 | 29 days agoFri, 17 Jul 2026 22:25:39 UTC | Approval | [0] 0x000000000000…3a1c91d9 [1] 0x000000000000…3ac78ba3 data: 0x000000000000000000…ce5d71dc |
| 0xfa77b4…91ddfc | 29 days agoFri, 17 Jul 2026 22:22:33 UTC | Transfer | [0] 0x000000000000…fc6a9afd [1] 0x000000000000…4d2cc10e data: 0x000000000000000000…ecc29dbc |
| 0xd6aeac…a879a5 | 29 days agoFri, 17 Jul 2026 22:21:58 UTC | Transfer | [0] 0x000000000000…94624eff [1] 0x000000000000…9fa64de4 data: 0x000000000000000000…21f03f25 |
| 0xd6aeac…a879a5 | 29 days agoFri, 17 Jul 2026 22:21:58 UTC | Transfer | [0] 0x000000000000…4d2cc10e [1] 0x000000000000…94624eff data: 0x000000000000000000…21f03f25 |
| 0x4f269c…702f87 | 29 days agoFri, 17 Jul 2026 22:20:46 UTC | Approval | [0] 0x000000000000…79c6e6fb [1] 0x000000000000…73ab8a37 data: 0xffffffffffffffffff…ffffffff |
| 0x756b7a…2a77f2 | 29 days agoFri, 17 Jul 2026 22:20:46 UTC | Transfer | [0] 0x000000000000…4d2cc10e [1] 0x000000000000…79c6e6fb data: 0x000000000000000000…d4c60574 |
| 0x1dbb8a…7750f3 | 29 days agoFri, 17 Jul 2026 22:20:33 UTC | Approval | [0] 0x000000000000…9bd61bdf [1] 0x000000000000…959e5cb2 data: 0xffffffffffffffffff…ffffffff |
| 0x03f585…d5f1df | 29 days agoFri, 17 Jul 2026 22:20:32 UTC | Approval | [0] 0x000000000000…fc6a9afd [1] 0x000000000000…3ac78ba3 data: 0xffffffffffffffffff…ffffffff |
| 0x3a90da…82fc6a | 29 days agoFri, 17 Jul 2026 22:20:32 UTC | Transfer | [0] 0x000000000000…4d2cc10e [1] 0x000000000000…9bd61bdf data: 0x000000000000000000…686e8431 |
| 0xddd411…11c8f4 | 29 days agoFri, 17 Jul 2026 22:20:32 UTC | Transfer | [0] 0x000000000000…4d2cc10e [1] 0x000000000000…fc6a9afd data: 0x000000000000000000…ecc29dbc |
| 0x5c4f87…6f9da9 | 29 days agoFri, 17 Jul 2026 22:20:30 UTC | Transfer | [0] 0x000000000000…4d2cc10e [1] 0x000000000000…3a1c91d9 data: 0x000000000000000000…ce5d71dc |
| 0x5c4f87…6f9da9 | 29 days agoFri, 17 Jul 2026 22:20:30 UTC | Transfer | [0] 0x000000000000…9d4776b5 [1] 0x000000000000…4d2cc10e data: 0x000000000000000000…e7ffa7d0 |
| 0x5c4f87…6f9da9 | 29 days agoFri, 17 Jul 2026 22:20:30 UTC | Approval | [0] 0x000000000000…9d4776b5 [1] 0x000000000000…638de0d3 data: 0x000000000000000000…e8000000 |
| 0x5c4f87…6f9da9 | 29 days agoFri, 17 Jul 2026 22:20:30 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…9d4776b5 data: 0x000000000000000000…e8000000 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x2e572bce…1bcd01 | Transfer | 18,952,577 | 21 days agoSat, 25 Jul 2026 10:52:46 UTC | 0xcaf7…5d11 | IN | 0x070e…fade | $0.001 DIH |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x30a8c8…a958c3 | Approve | 12,827,413 | 28 days agoSat, 18 Jul 2026 08:12:16 UTC | 0xb218…4de4 | IN | CATNOTE | $0.000 ETH | 0.00000331 | |
| 0x660f8c…9dca77 | Approve | 12,476,640 | 29 days agoFri, 17 Jul 2026 22:25:39 UTC | 0x1112…91d9 | IN | CATNOTE | $0.000 ETH | 0.00000347 | |
| !0x4db4b1…3d6114 | Approve | 12,476,109 | 29 days agoFri, 17 Jul 2026 22:24:46 UTC | 0x1112…91d9 | IN | CATNOTE | $0.000 ETH | 0.00000256 | |
| !0x126238…c7877b | Approve | 12,475,852 | 29 days agoFri, 17 Jul 2026 22:24:20 UTC | 0x1112…91d9 | IN | CATNOTE | $0.000 ETH | 0.00000266 | |
| 0x4f269c…702f87 | Approve | 12,473,719 | 29 days agoFri, 17 Jul 2026 22:20:46 UTC | 0xf6e5…e6fb | IN | CATNOTE | $0.000 ETH | 0.00000350 | |
| 0x1dbb8a…7750f3 | Approve | 12,473,586 | 29 days agoFri, 17 Jul 2026 22:20:33 UTC | 0x4ae0…1bdf | IN | CATNOTE | $0.000 ETH | 0.00000346 | |
| 0x03f585…d5f1df | Approve | 12,473,581 | 29 days agoFri, 17 Jul 2026 22:20:32 UTC | 0x7c21…9afd | IN | CATNOTE | $0.000 ETH | 0.00000349 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 12,473,559 | 29 days agoFri, 17 Jul 2026 22:20:30 UTC | 0x5c4f87…6f9da9 | CREATE2 | deployToken | 0x8fc2…76b5 | IN | 0x070e…fade | 0 ETH |