// 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";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
/// @title QuiverToken
/// @notice Fixed-supply launchpad token with an on-chain, gas-safe holder
/// dividend tracker. A share of every trade's tax (routed in by the
/// hook) is distributed to holders in proportion to how much they
/// hold, using a MasterChef-style accumulator so distribution is O(1)
/// regardless of holder count. Locked liquidity (held by the V4
/// PoolManager) and other system addresses are excluded so rewards
/// only flow to real holders.
///
/// Rewards are paid in `rewardToken` — any ERC-20 the creator picks at
/// launch (e.g. a tokenized stock), or native currency when set to the
/// zero address. Holders accrue continuously and pull with claim().
contract QuiverToken is ERC20 {
using SafeERC20 for IERC20;
uint256 private constant ACC_PRECISION = 1e24;
/// @notice Wallet credited as the token's creator (immutable attribution).
address public immutable creator;
/// @notice The hook allowed to credit dividends; set once by the factory.
address public hook;
/// @notice Immutable per-token trade tax in basis points (0..1000 = 0-10%).
uint16 public immutable taxBps;
/// @notice Currency dividends are paid in. address(0) == native.
address public immutable rewardToken;
/// @dev Accumulated reward per eligible share, scaled by ACC_PRECISION.
uint256 private accRewardPerShare;
/// @dev Supply eligible for dividends (excludes system/excluded holders).
uint256 public eligibleSupply;
/// @dev Reward already accounted to a holder: balance * acc / PRECISION.
mapping(address => uint256) private rewardDebt;
/// @dev Settled-but-unclaimed rewards per holder.
mapping(address => uint256) public claimable;
/// @dev Addresses that do not participate in dividends (pool, system).
mapping(address => bool) public excluded;
/// @notice Lifetime rewards distributed to holders, in reward units.
uint256 public totalRewardsDistributed;
string private _metadataURI;
event HookSet(address indexed hook);
event ExcludedSet(address indexed account, bool excluded);
event RewardsDistributed(uint256 amount);
event RewardsClaimed(address indexed holder, uint256 amount);
error OnlyFactory();
error OnlyHook();
error HookAlreadySet();
error WrongRewardCurrency();
address private immutable _factory;
constructor(
string memory name_,
string memory symbol_,
string memory metadataURI_,
uint256 supply_,
address creator_,
address supplyRecipient_,
uint16 taxBps_,
address rewardToken_
) ERC20(name_, symbol_) {
require(taxBps_ <= 1000, "tax>10%");
_factory = msg.sender;
creator = creator_;
taxBps = taxBps_;
rewardToken = rewardToken_;
_metadataURI = metadataURI_;
// Exclude system endpoints (zero, self, and the supply recipient) from
// dividends up front, so rewards only ever flow to real holders.
excluded[address(0)] = true;
excluded[address(this)] = true;
excluded[supplyRecipient_] = true;
_mint(supplyRecipient_, supply_);
}
/// @notice Off-chain metadata JSON (description, logo, website, socials).
function metadataURI() external view returns (string memory) {
return _metadataURI;
}
/// @notice Burn tokens held by the caller (used by the hook for buyback&burn).
function burn(uint256 amount) external {
_burn(msg.sender, amount);
}
// ---------------------------------------------------------------------
// Factory wiring (one-time)
// ---------------------------------------------------------------------
/// @notice Wire the hook and exclude the pool/system addresses. The factory
/// calls this exactly once, right after it knows the pool endpoints.
function initHook(address hook_, address[] calldata excludedAddrs) external {
if (msg.sender != _factory) revert OnlyFactory();
if (hook != address(0)) revert HookAlreadySet();
hook = hook_;
emit HookSet(hook_);
_setExcluded(hook_, true);
for (uint256 i; i < excludedAddrs.length; ++i) {
_setExcluded(excludedAddrs[i], true);
}
}
// ---------------------------------------------------------------------
// Dividend distribution
// ---------------------------------------------------------------------
/// @notice Credit an ERC-20 reward distribution to all eligible holders.
/// The hook must have transferred `amount` of `rewardToken` to this
/// contract before calling. No-op-safe when there is no eligible
/// supply (caller keeps the funds).
function distributeRewards(uint256 amount) external {
if (msg.sender != hook) revert OnlyHook();
if (rewardToken == address(0)) revert WrongRewardCurrency();
_distribute(amount);
}
/// @notice Credit a native reward distribution to all eligible holders.
function distributeRewardsNative() external payable {
if (msg.sender != hook) revert OnlyHook();
if (rewardToken != address(0)) revert WrongRewardCurrency();
_distribute(msg.value);
}
function _distribute(uint256 amount) private {
uint256 supply = eligibleSupply;
if (amount == 0 || supply == 0) return;
accRewardPerShare += (amount * ACC_PRECISION) / supply;
totalRewardsDistributed += amount;
emit RewardsDistributed(amount);
}
/// @notice Pending, not-yet-settled rewards for a holder.
function pendingRewards(address holder) public view returns (uint256) {
if (excluded[holder]) return claimable[holder];
uint256 accrued = (balanceOf(holder) * accRewardPerShare) / ACC_PRECISION;
uint256 debt = rewardDebt[holder];
uint256 extra = accrued > debt ? accrued - debt : 0;
return claimable[holder] + extra;
}
/// @notice Claim all settled + pending rewards to the caller.
function claim() external returns (uint256 amount) {
return _claimTo(msg.sender);
}
/// @notice Push a holder's accrued rewards to THEIR wallet. Callable by
/// anyone (the protocol keeper calls it after every distribution so
/// rewards land in wallets with no user action), but the funds can
/// only ever go to the holder — non-custodial by construction.
function claimFor(address holder) external returns (uint256 amount) {
return _claimTo(holder);
}
/// @notice Batch delivery for the keeper: push rewards to many holders in
/// one transaction. A single failing receiver (native rewards only)
/// is skipped rather than blocking the whole batch.
function claimForMany(address[] calldata holders) external {
for (uint256 i; i < holders.length; ++i) {
try this.claimFor(holders[i]) {} catch {}
}
}
function _claimTo(address holder) private returns (uint256 amount) {
_settle(holder);
amount = claimable[holder];
if (amount == 0) return 0;
claimable[holder] = 0;
emit RewardsClaimed(holder, amount);
if (rewardToken == address(0)) {
(bool ok, ) = payable(holder).call{value: amount}("");
require(ok, "native xfer");
} else {
IERC20(rewardToken).safeTransfer(holder, amount);
}
}
// ---------------------------------------------------------------------
// Accounting hooks
// ---------------------------------------------------------------------
/// @dev Move a holder's freshly-accrued rewards into `claimable` and reset
/// their debt to the current balance basis.
function _settle(address account) private {
if (account == address(0) || excluded[account]) return;
uint256 accrued = (balanceOf(account) * accRewardPerShare) / ACC_PRECISION;
uint256 debt = rewardDebt[account];
if (accrued > debt) claimable[account] += accrued - debt;
rewardDebt[account] = accrued;
}
function _resetDebt(address account) private {
rewardDebt[account] = (balanceOf(account) * accRewardPerShare) / ACC_PRECISION;
}
function _setExcluded(address account, bool value) private {
if (excluded[account] == value) return;
// Settle then flip participation, adjusting eligibleSupply by balance.
uint256 bal = balanceOf(account);
if (value) {
_settle(account);
if (bal != 0) eligibleSupply -= bal;
} else {
if (bal != 0) eligibleSupply += bal;
_resetDebt(account);
}
excluded[account] = value;
emit ExcludedSet(account, value);
}
/// @dev Core transfer/mint/burn accounting. Settles both sides, moves the
/// balance, keeps `eligibleSupply` in sync with participation, and
/// rebases each side's reward debt to its new balance.
function _update(address from, address to, uint256 value) internal override {
bool fromEligible = from != address(0) && !excluded[from];
bool toEligible = to != address(0) && !excluded[to];
if (fromEligible) _settle(from);
if (toEligible) _settle(to);
super._update(from, to, value);
// Keep the eligible-supply denominator correct across the flow.
if (fromEligible && !toEligible) {
eligibleSupply -= value; // eligible -> excluded (or burn)
} else if (!fromEligible && toEligible) {
eligibleSupply += value; // mint or excluded -> eligible
}
if (fromEligible) _resetDebt(from);
if (toEligible) _resetDebt(to);
}
/// @notice Accept native only as reward funding.
receive() external payable {}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "metadataURI_",
"type": "string",
"internalType": "string"
},
{
"name": "supply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creator_",
"type": "address",
"internalType": "address"
},
{
"name": "supplyRecipient_",
"type": "address",
"internalType": "address"
},
{
"name": "taxBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "rewardToken_",
"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": "HookAlreadySet",
"type": "error",
"inputs": []
},
{
"name": "OnlyFactory",
"type": "error",
"inputs": []
},
{
"name": "OnlyHook",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "WrongRewardCurrency",
"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": "ExcludedSet",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "excluded",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "HookSet",
"type": "event",
"inputs": [
{
"name": "hook",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RewardsClaimed",
"type": "event",
"inputs": [
{
"name": "holder",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RewardsDistributed",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "burn",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claim",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "claimFor",
"type": "function",
"inputs": [
{
"name": "holder",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "claimForMany",
"type": "function",
"inputs": [
{
"name": "holders",
"type": "address[]",
"internalType": "address[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimable",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"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": "distributeRewards",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "distributeRewardsNative",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "eligibleSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "excluded",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "hook",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "initHook",
"type": "function",
"inputs": [
{
"name": "hook_",
"type": "address",
"internalType": "address"
},
{
"name": "excludedAddrs",
"type": "address[]",
"internalType": "address[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "metadataURI",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "pendingRewards",
"type": "function",
"inputs": [
{
"name": "holder",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "rewardToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "taxBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "totalRewardsDistributed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c90816302d05d3f14610bea5750806303ee438c14610b2b57806306fdde0314610a6c578063095ea7b3146109e657806318160ddd146109c857806323b872dd146108d2578063313ce567146108b657806331d7a262146108935780633eacd2f814610854578063402914f51461081a57806342966c68146106e9578063429cead1146106aa5780634e71d92d1461068e57806359974e38146106315780636ade07b01461061357806370a08231146105d95780637f5a7c7b146105b257806395d89b41146104aa578063a9059cbb14610479578063b115406a14610402578063bbf0558d146102f0578063dd62ed3e14610298578063ddeae0331461026d578063ea131971146101af578063ee172546146101915763f7c618c114610148573861000f565b3461018c57600036600319011261018c5760206040516001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73168152f35b600080fd5b3461018c57600036600319011261018c576020600b54604051908152f35b3461018c57602036600319011261018c5760043567ffffffffffffffff811161018c576101e0903690600401610ca1565b9060005b8281106101ed57005b6102006101fb828585610dec565b610e12565b6001600160a01b036040519163ddeae03360e01b83521660048201526020816024816000305af1600090610239575b50506001016101e4565b6020823d8211610265575b8161025160209383610cd2565b81010312610262575051819061022f565b80fd5b3d9150610244565b3461018c57602036600319011261018c57602061029061028b610c75565b610f9b565b604051908152f35b3461018c57604036600319011261018c576102b1610c75565b6001600160a01b036102c1610c8b565b911660005260016020526001600160a01b03604060002091166000526020526020604060002054604051908152f35b3461018c57604036600319011261018c57610309610c75565b60243567ffffffffffffffff811161018c57610329903690600401610ca1565b90916001600160a01b037f0000000000000000000000002a992c57ad63e4cc856c5dc2f89f5bc34ec009651633036103f157600554906001600160a01b0382166103e0576103b5916001600160a01b03821680916001600160a01b031916176005557f4eab7b127c764308788622363ad3e9532de3dfba7845bd4f84c125a22544255a600080a26111d6565b60005b8181106103c157005b806103da6103d56101fb6001948688610dec565b6111d6565b016103b8565b635f7c8ab560e11b60005260046000fd5b630636a15760e11b60005260046000fd5b600036600319011261018c576001600160a01b03600554163303610468576001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73166104575761001b3461112c565b63f7e3cf0d60e01b60005260046000fd5b635a91834f60e01b60005260046000fd5b3461018c57604036600319011261018c5761049f610495610c75565b6024359033610e26565b602060405160018152f35b3461018c57600036600319011261018c5760405160006004548060011c906001811680156105a8575b602083108114610594578285529081156105705750600114610510575b61050c8361050081850382610cd2565b60405191829182610c2c565b0390f35b91905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000905b808210610556575090915081016020016105006104f0565b91926001816020925483858801015201910190929161053e565b60ff191660208086019190915291151560051b8401909101915061050090506104f0565b634e487b7160e01b84526022600452602484fd5b91607f16916104d3565b3461018c57600036600319011261018c5760206001600160a01b0360055416604051908152f35b3461018c57602036600319011261018c576001600160a01b036105fa610c75565b1660005260006020526020604060002054604051908152f35b3461018c57600036600319011261018c576020600754604051908152f35b3461018c57602036600319011261018c576001600160a01b03600554163303610468576001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316156104575761001b60043561112c565b3461018c57600036600319011261018c57602061029033610f9b565b3461018c57602036600319011261018c576001600160a01b036106cb610c75565b16600052600a602052602060ff604060002054166040519015158152f35b3461018c57602036600319011261018c5760043533156108045733600052600a60205260ff6040600020541615806107f6575b6000913383528260205260408320548181106107dc578190338552846020520360408420558060025403600255826040518281527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203392a381806107d4575b156107a55761078e90600754610d33565b6007555b6107995780f35b6107a233611326565b80f35b8115806107cd575b6107b8575b50610792565b6107c490600754610d40565b600755826107b2565b50826107ad565b50600161077d565b63391434e360e21b84523360045260245260445250606490fd5b6107ff3361127a565b61071c565b634b637e8f60e11b600052600060045260246000fd5b3461018c57602036600319011261018c576001600160a01b0361083b610c75565b1660005260096020526020604060002054604051908152f35b3461018c57600036600319011261018c57602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000064168152f35b3461018c57602036600319011261018c5760206102906108b1610c75565b610d4d565b3461018c57600036600319011261018c57602060405160128152f35b3461018c57606036600319011261018c576108eb610c75565b6108f3610c8b565b604435906001600160a01b0383169283600052600160205260406000206001600160a01b033316600052602052604060002054600019811061093b575b5061049f9350610e26565b8381106109ab57841561099557331561097f5761049f94600052600160205260406000206001600160a01b0333166000526020528360406000209103905584610930565b634a1406b160e11b600052600060045260246000fd5b63e602df0560e01b600052600060045260246000fd5b8390637dc7a0d960e11b6000523360045260245260445260646000fd5b3461018c57600036600319011261018c576020600254604051908152f35b3461018c57604036600319011261018c576109ff610c75565b602435903315610995576001600160a01b031690811561097f57336000526001602052604060002082600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b3461018c57600036600319011261018c5760405160006003548060011c90600181168015610b21575b602083108114610594578285529081156105705750600114610ac15761050c8361050081850382610cd2565b91905060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000905b808210610b07575090915081016020016105006104f0565b919260018160209254838588010152019101909291610aef565b91607f1691610a95565b3461018c57600036600319011261018c576040516000600c548060011c90600181168015610be0575b602083108114610594578285529081156105705750600114610b805761050c8361050081850382610cd2565b919050600c6000527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7916000905b808210610bc6575090915081016020016105006104f0565b919260018160209254838588010152019101909291610bae565b91607f1691610b54565b3461018c57600036600319011261018c576020906001600160a01b037f000000000000000000000000e760bcca4162b59cb9ca16df2fdcbc7e18960230168152f35b91909160208152825180602083015260005b818110610c5f575060409293506000838284010152601f8019910116010190565b8060208092870101516040828601015201610c3e565b600435906001600160a01b038216820361018c57565b602435906001600160a01b038216820361018c57565b9181601f8401121561018c5782359167ffffffffffffffff831161018c576020808501948460051b01011161018c57565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b600052604160045260246000fd5b81810292918115918404141715610d1d57565b634e487b7160e01b600052601160045260246000fd5b91908203918211610d1d57565b91908201809211610d1d57565b6001600160a01b031680600052600a60205260ff60406000205416610ddb5780610dce91600052600060205269d3c21bcecceda1000000610d9660406000205460065490610d0a565b04816000526008602052604060002054808211600014610dd157610db991610d33565b905b6000526009602052604060002054610d40565b90565b5050600090610dbb565b600052600960205260406000205490565b9190811015610dfc5760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b038116810361018c5790565b9190916001600160a01b0381168015610804576001600160a01b038416928315610f85576000828152600a60205260408082205486835291205460ff9081161595911615928584610f77575b610f69575b6000818152806020526040812054848110610f4f57908460409284835282602052038282205583815280602052208381540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051858152a38180610f47575b15610f1857610eed90600754610d33565b6007555b610f09575b50610efe5750565b610f0790611326565b565b610f1290611326565b38610ef6565b811580610f40575b610f2b575b50610ef1565b610f3790600754610d40565b60075538610f25565b5083610f20565b508315610edc565b849060649363391434e360e21b8452600452602452604452fd5b610f728761127a565b610e77565b610f808661127a565b610e72565b63ec442f0560e01b600052600060045260246000fd5b6001600160a01b0390610fad8161127a565b169081600052600960205260406000205491821561112557808391600052600960205260006040812055807ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe6020604051858152a27f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0316806110b35750600080809381935af13d156110ae573d67ffffffffffffffff8111610cf45760405190611069601f8201601f191660200183610cd2565b8152600060203d92013e5b1561107b57565b60405162461bcd60e51b815260206004820152600b60248201526a3730ba34bb32903c3332b960a91b6044820152606490fd5b611074565b9150602060006040519263a9059cbb60e01b82526004528560245260448180865af190600160005114821615611103575b604052156110ef5750565b635274afe760e01b60005260045260246000fd5b90600181151661111b57823b15153d151616906110e4565b503d6000823e3d90fd5b5060009150565b6007548115918280156111ce575b6111c95769d3c21bcecceda100000081029281840469d3c21bcecceda1000000141715610d1d5781156111b3576111986020927f6d1c76d614228b523baa4dcd9539e2c713b54ff4ab3ff2d1627e7f6cd32be4429404600654610d40565b6006556111a781600b54610d40565b600b55604051908152a1565b634e487b7160e01b600052601260045260246000fd5b505050565b50811561113a565b6001600160a01b0381169081600052600a602052600160ff60406000205416151514611276578160005260006020526112146040600020549161127a565b80611261575b5080600052600a6020526040600020600160ff198254161790557f560b2151ddf0e7b2f796767595928a1d684c83f7c6d2cc4afd092cd73df473d6602060405160018152a2565b61126d90600754610d33565b6007553861121a565b5050565b6001600160a01b03168015801561130e575b61130b5780600052600060205269d3c21bcecceda10000006112b660406000205460065490610d0a565b04908060005260086020526040600020548083116112e0575b506000526008602052604060002055565b6112ea9083610d33565b8160005260096020526113036040600020918254610d40565b9055386112cf565b50565b5080600052600a60205260ff6040600020541661128c565b6001600160a01b031680600052600060205269d3c21bcecceda100000061135560406000205460065490610d0a565b0490600052600860205260406000205556fea2646970667358221220757d985ea768990eff75326a95e0cd371ce0df9d881755496032b99fa37dda7c64736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x80fa1a…01d759 | 3 hrs agoTue, 18 Aug 2026 01:24:06 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…d8d755a3 data: 0x000000000000000000…dfc3739f |
| 0x5f230e…bf682b | 1 day agoSun, 16 Aug 2026 16:43:27 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…a12e15ee data: 0x000000000000000000…37f15464 |
| 0x9f48c2…7562db | 3 days agoSat, 15 Aug 2026 00:05:16 UTC | Transfer | [0] 0x000000000000…eda46767 [1] 0x000000000000…43e40951 data: 0x000000000000000000…cbc2b4b2 |
| 0x32bf10…3fd092 | 3 days agoSat, 15 Aug 2026 00:04:30 UTC | Transfer | [0] 0x000000000000…eda46767 [1] 0x000000000000…43e40951 data: 0x000000000000000000…cbc2b4b2 |
| 0xd42a8e…3d9ecc | 3 days agoSat, 15 Aug 2026 00:04:13 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…eda46767 data: 0x000000000000000000…97a9819b |
| 0x9ebbab…d41b08 | 3 days agoSat, 15 Aug 2026 00:03:48 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…eda46767 data: 0x000000000000000000…89dddf80 |
| 0xbabe5e…d71ef2 | 3 days agoSat, 15 Aug 2026 00:02:26 UTC | Transfer | [0] 0x000000000000…eda46767 [1] 0x000000000000…43e40951 data: 0x000000000000000000…94060a6d |
| 0x7a12fb…e1d0dd | 3 days agoSat, 15 Aug 2026 00:02:16 UTC | Approval | [0] 0x000000000000…eda46767 [1] 0x000000000000…3ac78ba3 data: 0xffffffffffffffffff…ffffffff |
| 0x7a7853…ab130c | 3 days agoSat, 15 Aug 2026 00:01:54 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…eda46767 data: 0x000000000000000000…8dd96e58 |
| 0xd5b8b3…929e1d | 3 days agoFri, 14 Aug 2026 11:40:07 UTC | Transfer | [0] 0x000000000000…2b4e0679 [1] 0x000000000000…43e40951 data: 0x000000000000000000…a86698bf |
| 0x5692c3…0311d6 | 3 days agoFri, 14 Aug 2026 11:40:07 UTC | Approval | [0] 0x000000000000…2b4e0679 [1] 0x000000000000…262c40dc data: 0x000000000000000000…a86698bf |
| 0x57f5b8…41fc58 | 4 days agoFri, 14 Aug 2026 02:19:58 UTC | Transfer | [0] 0x000000000000…a12e15ee [1] 0x000000000000…43e40951 data: 0x000000000000000000…5517ecbb |
| 0x8b37aa…9b0123 | 4 days agoFri, 14 Aug 2026 02:19:41 UTC | Approval | [0] 0x000000000000…a12e15ee [1] 0x000000000000…3ac78ba3 data: 0x000000000000000000…5c96e244 |
| 0x469585…011c6a | 4 days agoFri, 14 Aug 2026 02:19:24 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…a12e15ee data: 0x000000000000000000…5c010d11 |
| 0xc343c2…f93632 | 4 days agoFri, 14 Aug 2026 02:12:20 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f7acd277 data: 0x000000000000000000…5a2cc565 |
| 0x23e38d…d8d5d8 | 4 days agoFri, 14 Aug 2026 02:11:48 UTC | Transfer | [0] 0x000000000000…1bae0639 [1] 0x000000000000…43e40951 data: 0x000000000000000000…f92335af |
| 0x9502b7…dfa623 | 4 days agoFri, 14 Aug 2026 02:11:41 UTC | Approval | [0] 0x000000000000…1bae0639 [1] 0x000000000000…6cd7ce2b data: 0xffffffffffffffffff…ffffffff |
| 0xda7536…45bfea | 4 days agoFri, 14 Aug 2026 02:11:41 UTC | Transfer | [0] 0x000000000000…6cd7ce2b [1] 0x000000000000…1bae0639 data: 0x000000000000000000…f92335af |
| 0xda7536…45bfea | 4 days agoFri, 14 Aug 2026 02:11:41 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…6cd7ce2b data: 0x000000000000000000…f92335af |
| 0x979e1e…4252a7 | 5 days agoThu, 13 Aug 2026 04:21:56 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…022923ad data: 0x000000000000000000…a9540b41 |
| 0xd56362…f9728d | 5 days agoThu, 13 Aug 2026 04:21:34 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f7acd277 data: 0x000000000000000000…b887b330 |
| 0x41f65b…54ab5d | 5 days agoThu, 13 Aug 2026 04:21:27 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f7acd277 data: 0x000000000000000000…123c5dba |
| 0xbb7a2e…21d64e | 5 days agoThu, 13 Aug 2026 04:17:59 UTC | Transfer | [0] 0x000000000000…b1df536e [1] 0x000000000000…43e40951 data: 0x000000000000000000…345b0b4e |
| 0x078d8f…c3d00e | 5 days agoThu, 13 Aug 2026 04:17:59 UTC | Approval | [0] 0x000000000000…b1df536e [1] 0x000000000000…262c40dc data: 0x000000000000000000…345b0b4e |
| 0x1c6283…8efedf | 5 days agoThu, 13 Aug 2026 03:59:30 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…a12e15ee data: 0x000000000000000000…059fb0f6 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x7a12fb…e1d0dd | Approve | 36,668,343 | 3 days agoSat, 15 Aug 2026 00:02:16 UTC | 0x673e…6767 | IN | Uhood | $0.000 ETH | 0.00000182 | |
| 0x5692c3…0311d6 | Approve | 36,223,801 | 3 days agoFri, 14 Aug 2026 11:40:07 UTC | 0xe5ec…0679 | IN | Uhood | $0.000 ETH | 0.00000187 | |
| 0x8b37aa…9b0123 | Approve | 35,888,264 | 4 days agoFri, 14 Aug 2026 02:19:41 UTC | 0x143e…15ee | IN | Uhood | $0.000 ETH | 0.00000123 | |
| 0x9502b7…dfa623 | Approve | 35,883,469 | 4 days agoFri, 14 Aug 2026 02:11:41 UTC | 0x71d8…0639 | IN | Uhood | $0.000 ETH | 0.00000199 | |
| 0x078d8f…c3d00e | Approve | 35,097,291 | 5 days agoThu, 13 Aug 2026 04:17:59 UTC | 0x6ad5…536e | IN | Uhood | $0.000 ETH | 0.00000243 | |
| 0x59c9b5…95bb3a | Approve | 34,950,847 | 5 days agoThu, 13 Aug 2026 00:13:22 UTC | 0xb1ef…f740 | IN | Uhood | $0.000 ETH | 0.00000248 | |
| 0x674327…76d850 | Approve | 34,950,720 | 5 days agoThu, 13 Aug 2026 00:13:09 UTC | 0x1aac…d342 | IN | Uhood | $0.000 ETH | 0.00000248 | |
| 0x1e6632…d5584b | Approve | 34,905,238 | 5 days agoWed, 12 Aug 2026 22:57:18 UTC | 0xff35…23ad | IN | Uhood | $0.000 ETH | 0.00000244 | |
| 0xc8a041…763542 | Approve | 34,904,922 | 5 days agoWed, 12 Aug 2026 22:56:46 UTC | 0x50c0…d277 | IN | Uhood | $0.000 ETH | 0.00000246 | |
| 0x5252b2…33c1ef | Approve | 34,759,566 | 5 days agoWed, 12 Aug 2026 18:54:07 UTC | 0xad01…fce5 | IN | Uhood | $0.000 ETH | 0.00000236 | |
| 0xcae5ce…9b9d44 | Approve | 34,739,725 | 5 days agoWed, 12 Aug 2026 18:20:59 UTC | 0x9949…e117 | IN | Uhood | $0.000 ETH | 0.00000233 | |
| 0x95ab2c…30895e | Approve | 34,365,674 | 5 days agoWed, 12 Aug 2026 07:58:27 UTC | 0xf5c4…6157 | IN | Uhood | $0.000 ETH | 0.00000204 | |
| 0xcc6dc8…974063 | Approve | 34,235,764 | 6 days agoWed, 12 Aug 2026 04:22:17 UTC | 0xdb26…1dbc | IN | Uhood | $0.000 ETH | 0.00000193 | |
| 0xe8f0a3…61146e | Approve | 34,235,319 | 6 days agoWed, 12 Aug 2026 04:21:32 UTC | 0xbc1b…f69b | IN | Uhood | $0.000 ETH | 0.00000194 | |
| 0x6329d1…64dccf | Approve | 34,233,468 | 6 days agoWed, 12 Aug 2026 04:18:28 UTC | 0x8420…0c1d | IN | Uhood | $0.000 ETH | 0.00000100 | |
| 0xfbf55b…15f064 | Approve | 34,233,272 | 6 days agoWed, 12 Aug 2026 04:18:08 UTC | 0x8420…0c1d | IN | Uhood | $0.000 ETH | 0.00000195 | |
| 0x986cbe…5bf943 | Approve | 34,231,757 | 6 days agoWed, 12 Aug 2026 04:15:36 UTC | 0x208e…f8fd | IN | Uhood | $0.000 ETH | 0.00000100 | |
| 0xf2674d…f2235f | Approve | 34,231,131 | 6 days agoWed, 12 Aug 2026 04:14:33 UTC | 0x143e…15ee | IN | Uhood | $0.000 ETH | 0.00000120 | |
| 0xc1b70d…f4be2a | Approve | 34,229,484 | 6 days agoWed, 12 Aug 2026 04:11:49 UTC | 0x143e…15ee | IN | Uhood | $0.000 ETH | 0.00000192 | |
| 0x32f7d4…f65a68 | Approve | 34,228,767 | 6 days agoWed, 12 Aug 2026 04:10:37 UTC | 0xeb63…e272 | IN | Uhood | $0.000 ETH | 0.00000193 | |
| 0x446827…47264a | Approve | 34,228,071 | 6 days agoWed, 12 Aug 2026 04:09:27 UTC | 0x7777…752c | IN | Uhood | $0.000 ETH | 0.00000193 | |
| 0x991e4f…dda96b | Approve | 34,227,586 | 6 days agoWed, 12 Aug 2026 04:08:38 UTC | 0x5049…bd80 | IN | Uhood | $0.000 ETH | 0.00000194 | |
| 0x7e6d8c…bd69c7 | Approve | 34,227,460 | 6 days agoWed, 12 Aug 2026 04:08:25 UTC | 0xc874…4ed3 | IN | Uhood | $0.000 ETH | 0.00000195 | |
| 0xf0e4f7…3b7bd6 | Approve | 34,227,262 | 6 days agoWed, 12 Aug 2026 04:08:05 UTC | 0x6828…8f94 | IN | Uhood | $0.000 ETH | 0.00000194 | |
| 0xfd725c…7c2590 | Approve | 34,226,990 | 6 days agoWed, 12 Aug 2026 04:07:38 UTC | 0x8f63…b53c | IN | Uhood | $0.000 ETH | 0.00000194 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 34,182,252 | 6 days agoWed, 12 Aug 2026 02:53:25 UTC | 0xf88c4a…57b325 | CREATE2 | 0x95f0159d | 0x2a99…0965 | IN | 0x4abc…a932 | 0 ETH |