// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* ZOOMER STOCKHOLDER CLUB
* ----------------------------------------------------------------------------
* Makes "mint proceeds locked in the treasury, permanently" verifiable rather
* than a promise, mirroring how BOOMER's Stockholder contract works.
*
* 1. Mint is priced in $ZOOMER. Every payment goes straight into the
* treasury below. The NFT contract never holds mint proceeds.
* 2. The treasury has NO withdraw function, NO owner, NO arbitrary call and
* NO approval path for ZOOMER. Once ZOOMER is in, it can never leave.
* It simply exists as a permanent ZOOMER holder.
* 3. Because it holds ZOOMER, the Indices distributor pays it stock tokens
* like any other holder. Anyone can then call allocate() to split that
* balance equally across every minted certificate.
* 4. Rewards accrue per token id. Unclaimed rewards follow the NFT when it
* sells. The current owner claims.
*
* Reward accounting uses the standard accumulator + debt pattern, so tokens
* minted in a later wave cannot claim allocations that happened before they
* existed.
*
* DEPLOY ORDER
* 1. deploy ZoomerClubTreasury(ZOOMER_ADDRESS)
* 2. deploy ZoomerStockholderClub(ZOOMER, treasury, priceWei, baseURI)
* 3. treasury.setClub(club) <- one time, then permanently frozen
* 4. after the final wave: club.renounceOwnership()
*
* NOT AUDITED. Test on a fork with small amounts before real money.
*/
interface IERC721Receiver {
function onERC721Received(address operator, address from, uint256 id, bytes calldata data)
external returns (bytes4);
}
interface IERC20 {
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
}
/* -------------------------------------------------------------------------- */
/* TREASURY */
/* -------------------------------------------------------------------------- */
contract ZoomerClubTreasury {
IERC20 public immutable ZOOMER;
address public club;
bool public clubFrozen;
// deployer may only wire the club once, then loses that power forever
address private _deployer;
/* ------------------------- ESCAPE HATCH -------------------------------
* The guardian can move the locked ZOOMER to a new treasury, but only
* after announcing it on-chain and waiting MIGRATION_DELAY. That is the
* recovery path if a bug is ever found - without it, a mistake would
* strand the principal forever.
*
* It cannot be used as a silent rug: proposeMigration emits a public
* event and starts a 30-day clock that anyone can watch. Holders always
* get a month of warning and can exit first.
*
* Once the system is proven, call renounceGuardian() to delete the hatch
* permanently and make the lock absolute.
* --------------------------------------------------------------------- */
uint256 public constant MIGRATION_DELAY = 30 days;
address public guardian;
address public migrationTarget;
uint256 public migrationReadyAt;
event ClubSet(address club);
event StockPushed(address indexed token, uint256 amount);
event MigrationProposed(address indexed target, uint256 readyAt);
event MigrationCancelled(address indexed target);
event MigrationExecuted(address indexed target, uint256 amount);
event GuardianRenounced();
modifier onlyGuardian() {
require(msg.sender == guardian, "not guardian");
_;
}
constructor(address zoomer) {
ZOOMER = IERC20(zoomer);
_deployer = msg.sender;
guardian = msg.sender;
}
/// Announce an intent to move the locked ZOOMER. Starts the 30-day clock.
function proposeMigration(address newTreasury) external onlyGuardian {
require(newTreasury != address(0), "zero");
migrationTarget = newTreasury;
migrationReadyAt = block.timestamp + MIGRATION_DELAY;
emit MigrationProposed(newTreasury, migrationReadyAt);
}
function cancelMigration() external onlyGuardian {
emit MigrationCancelled(migrationTarget);
migrationTarget = address(0);
migrationReadyAt = 0;
}
/// Execute only after the announced delay has fully elapsed.
function executeMigration() external onlyGuardian {
require(migrationReadyAt != 0, "none proposed");
require(block.timestamp >= migrationReadyAt, "timelocked");
uint256 bal = ZOOMER.balanceOf(address(this));
require(bal > 0, "empty");
address target = migrationTarget;
migrationTarget = address(0);
migrationReadyAt = 0;
require(ZOOMER.transfer(target, bal), "transfer failed");
emit MigrationExecuted(target, bal);
}
/// Delete the escape hatch forever. Do this once the system is proven.
function renounceGuardian() external onlyGuardian {
guardian = address(0);
migrationTarget = address(0);
migrationReadyAt = 0;
emit GuardianRenounced();
}
function setClub(address c) external {
require(msg.sender == _deployer && !clubFrozen, "frozen");
require(c != address(0), "zero");
club = c;
clubFrozen = true;
_deployer = address(0); // no owner from this point on
emit ClubSet(c);
}
/**
* Push a stock token's balance to the club for distribution.
* Permissionless: anyone can pay the gas, the destination is hard-coded.
* ZOOMER itself can never be pushed - that is what makes the lock real.
*/
function pushStock(address token) external returns (uint256 amount) {
require(clubFrozen, "club unset");
require(token != address(ZOOMER), "ZOOMER is locked");
amount = IERC20(token).balanceOf(address(this));
require(amount > 0, "nothing to push");
require(IERC20(token).transfer(club, amount), "transfer failed");
emit StockPushed(token, amount);
}
// deliberately absent: withdraw, rescue, approve, delegatecall, selfdestruct
}
/* -------------------------------------------------------------------------- */
/* STOCKHOLDER NFT */
/* -------------------------------------------------------------------------- */
contract ZoomerStockholderClub {
// ------------------------------------------------------------- ERC-721
string public name = "Zoomer Stockholder Club";
string public symbol = "ZSC";
string public baseURI;
uint256 public totalSupply; // how many actually exist
uint256 public nextId; // highest id issued; may jump past unsold ids
uint256 public constant MAX_SUPPLY = 1000;
/* ----------------------------- TIERS ----------------------------------
* Token ids are assigned sequentially, so the tier is a pure function of
* the id. One tier per wave - a wave-2 minter can never receive a
* Paperhand.
*
* #1 - #500 PAPERHAND weight 1.0x 100k ZOOMER
* #501 - #750 SWEATY weight 2.0x 250k
* #751 - #900 DIAMOND weight 3.0x 500k
* #901 - #1000 CHAD weight 5.0x 1M
*
* Cost per weight point runs 1,000 / 1,250 / 1,667 / 2,000 - a smooth
* ramp, so each wave is slightly worse yield and meaningfully scarcer.
* No tier is dominated by another, and each tier holds roughly a quarter
* of the club: 25.6% / 25.6% / 23.1% / 25.6%.
*
* Rewards are split by WEIGHT, not per-NFT. Without this a CHAD would
* cost 10x a Paperhand and earn exactly the same.
* --------------------------------------------------------------------- */
uint256 public constant PAPERHAND_END = 500;
uint256 public constant SWEATY_END = 750;
uint256 public constant DIAMOND_END = 900;
/// weight in hundredths: 100 = 1.0x
function weightOf(uint256 id) public pure returns (uint256) {
if (id == 0 || id > MAX_SUPPLY) return 0;
if (id <= PAPERHAND_END) return 100;
if (id <= SWEATY_END) return 200;
if (id <= DIAMOND_END) return 300;
return 500;
}
function tierOf(uint256 id) external pure returns (string memory) {
if (id == 0 || id > MAX_SUPPLY) return "";
if (id <= PAPERHAND_END) return "PAPERHAND";
if (id <= SWEATY_END) return "SWEATY";
if (id <= DIAMOND_END) return "DIAMOND";
return "CHAD";
}
/// sum of weightOf() across every minted certificate
uint256 public totalWeight;
mapping(uint256 => address) public ownerOf;
mapping(address => uint256) public balanceOf;
mapping(uint256 => address) public getApproved;
mapping(address => mapping(address => bool)) public isApprovedForAll;
event Transfer(address indexed from, address indexed to, uint256 indexed id);
event Approval(address indexed owner, address indexed spender, uint256 indexed id);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
// ------------------------------------------------------------- club
IERC20 public immutable ZOOMER;
ZoomerClubTreasury public immutable treasury;
address public owner;
uint256 public price; // ZOOMER per mint, in wei
uint256 public waveCap; // highest id mintable right now
bool public mintOpen;
/// Hard ceiling on certificates per transaction.
uint256 public maxPerTx = 10;
/**
* Ceiling on ZOOMER spent per transaction. This is the real limiter, and
* it is enforced from the price so it can never be forgotten when a wave
* opens:
*
* PAPERHAND 100k x 10 = 1M
* SWEATY 250k x 4 = 1M
* DIAMOND 500k x 2 = 1M
* CHAD 1M x 1 = 1M
*
* Every wave costs the same maximum per transaction, so a buyer sweeping a
* tier has to do it in visible, deliberate steps rather than one click.
*/
uint256 public maxSpendPerTx = 1_000_000 ether;
uint256 private constant ACC = 1e18;
// reward accounting
//
// rewardTokens is looped by mint() and _settle(), so it MUST stay small.
// Without an allowlist anyone could donate a junk ERC-20 to the treasury,
// allocate() it, and grow this array forever until minting and transferring
// cost more gas than a block allows - bricking the collection permanently.
uint256 public constant MAX_REWARD_TOKENS = 8;
address[] public rewardTokens;
mapping(address => bool) public isRewardToken;
mapping(address => bool) public allowedReward;
mapping(address => uint256) public accPerWeight; // scaled by ACC, per weight point
mapping(address => mapping(uint256 => uint256)) public debt; // token => id => debt
mapping(address => mapping(uint256 => uint256)) public owed; // token => id => pending
mapping(address => uint256) public lastAllocate; // hourly cap
event Minted(address indexed to, uint256 indexed id);
event WaveOpened(uint256 cap, uint256 price, uint256 weight);
event MintClosed();
event RewardTokenSet(address indexed token, bool allowed);
event Rescued(address indexed token, address indexed to, uint256 amount);
event RoyaltySet(address indexed receiver, uint96 bps);
event OwnershipRenounced();
event BaseURISet(string uri);
event TierSkipped(uint256 newStartId, uint256 retired);
event MaxPerTxSet(uint256 n);
event MaxSpendPerTxSet(uint256 amount);
event Allocated(address indexed token, uint256 amount, uint256 perNft);
event Claimed(address indexed to, address indexed token, uint256 amount);
modifier onlyOwner() {
require(msg.sender == owner, "not owner");
_;
}
constructor(address zoomer, address treasury_, uint256 price_, string memory uri) {
ZOOMER = IERC20(zoomer);
treasury = ZoomerClubTreasury(treasury_);
price = price_;
baseURI = uri;
owner = msg.sender;
}
/* ------------------------------- minting ------------------------------ */
function mint(uint256 qty) external {
require(mintOpen, "closed");
require(qty > 0 && qty <= maxPerTx, "qty over per-tx cap");
require(price * qty <= maxSpendPerTx, "over ZOOMER spend cap per tx");
require(nextId + qty <= waveCap, "wave sold out");
require(nextId + qty <= MAX_SUPPLY, "sold out");
// proceeds go straight to the treasury; this contract never holds them
require(ZOOMER.transferFrom(msg.sender, address(treasury), price * qty),
"ZOOMER transfer failed");
for (uint256 i = 0; i < qty; i++) {
uint256 id = ++nextId;
totalSupply++;
ownerOf[id] = msg.sender;
balanceOf[msg.sender]++;
totalWeight += weightOf(id);
// start this id at the current accumulator so it cannot claim
// allocations that happened before it existed
for (uint256 t = 0; t < rewardTokens.length; t++) {
debt[rewardTokens[t]][id] = accPerWeight[rewardTokens[t]];
}
emit Transfer(address(0), msg.sender, id);
emit Minted(msg.sender, id);
}
}
/* ------------------------------ rewards ------------------------------- */
/**
* Pull whatever the treasury holds of `token` and split it equally across
* every certificate minted so far. Permissionless. At most once per hour
* per token, matching the cadence BOOMER uses.
*/
function allocate(address token) external {
require(totalWeight > 0, "no supply");
require(token != address(ZOOMER), "not a reward token");
require(allowedReward[token], "token not allowed");
require(block.timestamp >= lastAllocate[token] + 1 hours, "too soon");
uint256 before = IERC20(token).balanceOf(address(this));
treasury.pushStock(token);
uint256 amount = IERC20(token).balanceOf(address(this)) - before;
require(amount > 0, "nothing to allocate");
if (!isRewardToken[token]) {
require(rewardTokens.length < MAX_REWARD_TOKENS, "reward list full");
isRewardToken[token] = true;
rewardTokens.push(token);
}
accPerWeight[token] += (amount * ACC) / totalWeight;
lastAllocate[token] = block.timestamp;
emit Allocated(token, amount, amount / totalWeight);
}
function pending(address token, uint256 id) public view returns (uint256) {
if (ownerOf[id] == address(0)) return 0;
return owed[token][id]
+ (weightOf(id) * (accPerWeight[token] - debt[token][id])) / ACC;
}
/**
* Claim every listed reward token across every listed id.
* Always pays the CURRENT owner - a third party may pay the gas but cannot
* redirect the payment.
*/
function claim(uint256[] calldata ids, address[] calldata tokens) external {
for (uint256 t = 0; t < tokens.length; t++) {
address token = tokens[t];
uint256 total;
address recipient;
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
address o = ownerOf[id];
require(o != address(0), "bad id");
if (recipient == address(0)) recipient = o;
require(o == recipient, "mixed owners");
total += pending(token, id);
owed[token][id] = 0;
debt[token][id] = accPerWeight[token];
}
if (total > 0) {
require(IERC20(token).transfer(recipient, total), "reward transfer failed");
emit Claimed(recipient, token, total);
}
}
}
/* ------------------------------ transfers ----------------------------- */
function _settle(uint256 id) private {
// freeze what this id has earned so far; it travels with the NFT
for (uint256 t = 0; t < rewardTokens.length; t++) {
address tk = rewardTokens[t];
owed[tk][id] += (weightOf(id) * (accPerWeight[tk] - debt[tk][id])) / ACC;
debt[tk][id] = accPerWeight[tk];
}
}
function transferFrom(address from, address to, uint256 id) public {
require(ownerOf[id] == from, "wrong from");
require(to != address(0), "zero to");
require(msg.sender == from || getApproved[id] == msg.sender
|| isApprovedForAll[from][msg.sender], "not authorised");
_settle(id);
balanceOf[from]--;
balanceOf[to]++;
ownerOf[id] = to;
delete getApproved[id];
emit Transfer(from, to, id);
}
function safeTransferFrom(address from, address to, uint256 id) external {
safeTransferFrom(from, to, id, "");
}
/// Checks that a contract recipient can actually handle ERC-721s. Without
/// this, sending a certificate to a contract that does not implement the
/// receiver hook destroys it permanently.
function safeTransferFrom(address from, address to, uint256 id, bytes memory data) public {
transferFrom(from, to, id);
if (to.code.length != 0) {
require(
IERC721Receiver(to).onERC721Received(msg.sender, from, id, data)
== IERC721Receiver.onERC721Received.selector,
"unsafe recipient"
);
}
}
function approve(address spender, uint256 id) external {
address o = ownerOf[id];
require(msg.sender == o || isApprovedForAll[o][msg.sender], "not authorised");
getApproved[id] = spender;
emit Approval(o, spender, id);
}
function setApprovalForAll(address operator, bool approved) external {
isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function tokenURI(uint256 id) external view returns (string memory) {
require(ownerOf[id] != address(0), "bad id");
return string(abi.encodePacked(baseURI, _str(id), ".json"));
}
function supportsInterface(bytes4 i) external pure returns (bool) {
return i == 0x01ffc9a7 // ERC-165
|| i == 0x80ac58cd // ERC-721
|| i == 0x5b5e139f // ERC-721Metadata
|| i == 0x2a55205a; // ERC-2981 royalties
}
/* ------------------------------ royalties ----------------------------- */
address public royaltyReceiver;
uint96 public royaltyBps; // 500 = 5%
/// ERC-2981. Marketplaces read this to pay you on every secondary sale.
function royaltyInfo(uint256, uint256 salePrice)
external view returns (address, uint256)
{
return (royaltyReceiver, (salePrice * royaltyBps) / 10000);
}
function setRoyalty(address receiver, uint96 bps) external onlyOwner {
require(bps <= 1000, "max 10%");
require(receiver != address(0) || bps == 0, "receiver is zero");
royaltyReceiver = receiver;
royaltyBps = bps;
emit RoyaltySet(receiver, bps);
}
/* -------------------------------- admin ------------------------------- */
function openWave(uint256 cap, uint256 newPrice) external onlyOwner {
require(cap > nextId && cap <= MAX_SUPPLY, "cap");
// Every id in this wave must be the same tier. Otherwise a cap of 600
// at the Paperhand price would sell 100 SWEATYs for 100k instead of
// 250k - a quarter of the intended proceeds, unrecoverable.
require(weightOf(nextId + 1) == weightOf(cap), "wave crosses a tier");
// otherwise even qty=1 would exceed the spend cap and the wave would
// be permanently unmintable
require(newPrice <= maxSpendPerTx, "price exceeds the per-tx spend cap");
waveCap = cap;
price = newPrice;
mintOpen = true;
emit WaveOpened(cap, newPrice, weightOf(cap));
}
/// Register a basket stock as claimable. Do this for the five stock tokens
/// BEFORE renouncing ownership - afterwards the set is frozen forever.
function setRewardToken(address token, bool ok) external onlyOwner {
require(token != address(ZOOMER), "ZOOMER is locked");
require(token != address(0), "zero");
allowedReward[token] = ok;
emit RewardTokenSet(token, ok);
}
/// Recover a token that is stuck here and is NOT a holder reward - e.g. an
/// airdrop, or a basket stock that was pushed before being registered.
/// Registered reward tokens are refused, so holder balances can never be
/// swept by the owner.
function rescueToken(address token, address to) external onlyOwner {
// Check BOTH flags. isRewardToken only flips on the first allocate(),
// so checking it alone would let the owner sweep a registered basket
// stock that had been pushed but not yet allocated.
require(!isRewardToken[token] && !allowedReward[token],
"reward token - belongs to holders");
require(to != address(0), "zero");
uint256 bal = IERC20(token).balanceOf(address(this));
require(bal > 0, "empty");
require(IERC20(token).transfer(to, bal), "transfer failed");
emit Rescued(token, to, bal);
}
/**
* Retire the unsold remainder of the current tier and jump the id counter
* to the start of a later tier.
*
* Without this, a wave that stalls half-sold would block every later wave
* forever: openWave() requires a single-tier range, so with 300 of 500
* Paperhands sold you could never open SWEATY. The skipped ids are burned
* from supply - they can never be minted, so nobody is diluted.
*
* Valid targets are tier starts only: 501 SWEATY, 751 DIAMOND, 901 CHAD.
*/
function skipToTier(uint256 newStart) external onlyOwner {
require(newStart == PAPERHAND_END + 1
|| newStart == SWEATY_END + 1
|| newStart == DIAMOND_END + 1, "not a tier start");
require(newStart > nextId + 1, "already there or behind");
uint256 retired = newStart - 1 - nextId;
nextId = newStart - 1;
mintOpen = false;
emit TierSkipped(newStart, retired);
emit MintClosed();
}
function setMaxPerTx(uint256 n) external onlyOwner {
require(n > 0 && n <= 50, "1-50");
maxPerTx = n;
emit MaxPerTxSet(n);
}
function setMaxSpendPerTx(uint256 amount) external onlyOwner {
require(amount >= price, "below current price");
maxSpendPerTx = amount;
emit MaxSpendPerTxSet(amount);
}
function closeMint() external onlyOwner { mintOpen = false; emit MintClosed(); }
function setBaseURI(string calldata u) external onlyOwner { baseURI = u; emit BaseURISet(u); }
/// After the final wave, call this to make the collection ownerless forever.
function renounceOwnership() external onlyOwner { owner = address(0); emit OwnershipRenounced(); }
function rewardTokenCount() external view returns (uint256) {
return rewardTokens.length;
}
/// Every reward token in one call, so the site can build the claim list.
function allRewardTokens() external view returns (address[] memory) {
return rewardTokens;
}
/* ------------------------- views for the website ---------------------- */
/// Every certificate a wallet owns. View only - never called on-chain.
function tokensOfOwner(address who) external view returns (uint256[] memory ids) {
uint256 n = balanceOf[who];
ids = new uint256[](n);
if (n == 0) return ids;
uint256 k;
for (uint256 id = 1; id <= nextId; id++) {
if (ownerOf[id] == who) {
ids[k++] = id;
if (k == n) break;
}
}
}
/// Total claimable of `token` across a list of ids - one RPC call for the
/// whole "you can claim X" banner.
function pendingBatch(address token, uint256[] calldata ids)
external view returns (uint256 total)
{
for (uint256 i = 0; i < ids.length; i++) total += pending(token, ids[i]);
}
/// The real per-transaction limit right now: the tightest of the count
/// cap, the ZOOMER spend cap, and what is left in the wave.
function maxMintableNow() public view returns (uint256) {
if (!mintOpen || price == 0) return 0;
uint256 byCount = maxPerTx;
uint256 bySpend = maxSpendPerTx / price;
uint256 left = waveCap > nextId ? waveCap - nextId : 0;
uint256 m = byCount < bySpend ? byCount : bySpend;
return m < left ? m : left;
}
/// Everything the club page needs, in a single call.
function stats() external view returns (
uint256 minted, uint256 weightTotal, uint256 currentPrice,
uint256 cap, bool open, uint256 rewardTokens_, uint256 mintableNow
) {
return (totalSupply, totalWeight, price, waveCap, mintOpen,
rewardTokens.length, maxMintableNow());
}
function _str(uint256 v) private pure returns (string memory) {
if (v == 0) return "0";
uint256 j = v;
uint256 len;
while (j != 0) { len++; j /= 10; }
bytes memory b = new bytes(len);
while (v != 0) { b[--len] = bytes1(uint8(48 + v % 10)); v /= 10; }
return string(b);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "zoomer",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ClubSet",
"type": "event",
"inputs": [
{
"name": "club",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "GuardianRenounced",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "MigrationCancelled",
"type": "event",
"inputs": [
{
"name": "target",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "MigrationExecuted",
"type": "event",
"inputs": [
{
"name": "target",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "MigrationProposed",
"type": "event",
"inputs": [
{
"name": "target",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "readyAt",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "StockPushed",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "MIGRATION_DELAY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "ZOOMER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
},
{
"name": "cancelMigration",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "club",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "clubFrozen",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "executeMigration",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "guardian",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "migrationReadyAt",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "migrationTarget",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "proposeMigration",
"type": "function",
"inputs": [
{
"name": "newTreasury",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "pushStock",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "renounceGuardian",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setClub",
"type": "function",
"inputs": [
{
"name": "c",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
}
]0x60a0604052348015600f57600080fd5b50604051610b6b380380610b6b833981016040819052602c91605e565b6001600160a01b031660805260018054336001600160a01b03199182168117909255600280549091169091179055608c565b600060208284031215606f57600080fd5b81516001600160a01b0381168114608557600080fd5b9392505050565b608051610aaf6100bc600039600081816101260152818161048c0152818161076a01526108590152610aaf6000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063754147821161008c578063b4b0609b11610066578063b4b0609b146101bc578063bf27ef22146101c6578063c9d4693a146101d9578063e9946f6c146101e157600080fd5b8063754147821461016e57806386215a3d146101925780639b77267b146101a557600080fd5b80630efd0973146100d457806310639ea01461010457806333dd3a2e1461010e57806342fecb0614610121578063452a9320146101485780635b51acff1461015b575b600080fd5b6000546100e7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61010c6101e9565b005b61010c61011c3660046109c1565b61026b565b6100e77f000000000000000000000000000000000000000000000000000000000000000081565b6002546100e7906001600160a01b031681565b6003546100e7906001600160a01b031681565b60005461018290600160a01b900460ff1681565b60405190151581526020016100fb565b61010c6101a03660046109c1565b61036c565b6101ae60045481565b6040519081526020016100fb565b6101ae62278d0081565b6101ae6101d43660046109c1565b610443565b61010c6106a7565b61010c61094b565b6002546001600160a01b0316331461021c5760405162461bcd60e51b8152600401610213906109f1565b60405180910390fd5b6003546040516001600160a01b03909116907f7c7cf105c6d2d5b006d910653c90e1ddef1597f52e08f86f4a8aad4e5bdf255e90600090a2600380546001600160a01b03191690556000600455565b6001546001600160a01b03163314801561028f5750600054600160a01b900460ff16155b6102c45760405162461bcd60e51b8152602060048201526006602482015265333937bd32b760d11b6044820152606401610213565b6001600160a01b0381166103035760405162461bcd60e51b8152600401610213906020808252600490820152637a65726f60e01b604082015260600190565b600080546001600160a81b0319166001600160a01b038316908117600160a01b17909155600180546001600160a01b03191690556040519081527ed260c182c2b366c8fa4db0a524eb728203a219b59970ba388b0cbbba0da2699060200160405180910390a150565b6002546001600160a01b031633146103965760405162461bcd60e51b8152600401610213906109f1565b6001600160a01b0381166103d55760405162461bcd60e51b8152600401610213906020808252600490820152637a65726f60e01b604082015260600190565b600380546001600160a01b0319166001600160a01b0383161790556103fd62278d0042610a17565b60048190556040519081526001600160a01b038216907f5bba324c6b20af8aba17306e6adaebaeca43b9d110bbf1fdee4ecfdc53974d539060200160405180910390a250565b60008054600160a01b900460ff1661048a5760405162461bcd60e51b815260206004820152600a60248201526918db1d58881d5b9cd95d60b21b6044820152606401610213565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036104fe5760405162461bcd60e51b815260206004820152601060248201526f1693d3d35154881a5cc81b1bd8dad95960821b6044820152606401610213565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610542573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105669190610a3e565b9050600081116105aa5760405162461bcd60e51b815260206004820152600f60248201526e0dcdee8d0d2dcce40e8de40e0eae6d608b1b6044820152606401610213565b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af11580156105fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106219190610a57565b61065f5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610213565b816001600160a01b03167f5c10d3dee32181ea75d431e1f494ca491bf89425885f4071df01fc28c93debeb8260405161069a91815260200190565b60405180910390a2919050565b6002546001600160a01b031633146106d15760405162461bcd60e51b8152600401610213906109f1565b6004546000036107135760405162461bcd60e51b815260206004820152600d60248201526c1b9bdb99481c1c9bdc1bdcd959609a1b6044820152606401610213565b6004544210156107525760405162461bcd60e51b815260206004820152600a6024820152691d1a5b595b1bd8dad95960b21b6044820152606401610213565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156107b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dd9190610a3e565b9050600081116108175760405162461bcd60e51b8152602060048201526005602482015264656d70747960d81b6044820152606401610213565b600380546001600160a01b031981169091556000600490815560405163a9059cbb60e01b81526001600160a01b039283169181018290526024810184905290917f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c69190610a57565b6109045760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610213565b806001600160a01b03167f5ec793c1d9038470061a234f83d2877df44544e5fbce4e1e040b06d4970752c38360405161093f91815260200190565b60405180910390a25050565b6002546001600160a01b031633146109755760405162461bcd60e51b8152600401610213906109f1565b600280546001600160a01b0319908116909155600380549091169055600060048190556040517fe2ace56761b4bc26e9bbfa3e9c571220d4796d4fb51debe5fff39dd71ac5dda89190a1565b6000602082840312156109d357600080fd5b81356001600160a01b03811681146109ea57600080fd5b9392505050565b6020808252600c908201526b3737ba1033bab0b93234b0b760a11b604082015260600190565b80820180821115610a3857634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215610a5057600080fd5b5051919050565b600060208284031215610a6957600080fd5b815180151581146109ea57600080fdfea2646970667358221220b81cb999390dc3e5f1d59eb47476daff6043adde092c881a9b74006481acabc164736f6c634300081a00330000000000000000000000007ea85bd98ce15a8eb3de41933bdffdb8859aadb4
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063754147821161008c578063b4b0609b11610066578063b4b0609b146101bc578063bf27ef22146101c6578063c9d4693a146101d9578063e9946f6c146101e157600080fd5b8063754147821461016e57806386215a3d146101925780639b77267b146101a557600080fd5b80630efd0973146100d457806310639ea01461010457806333dd3a2e1461010e57806342fecb0614610121578063452a9320146101485780635b51acff1461015b575b600080fd5b6000546100e7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61010c6101e9565b005b61010c61011c3660046109c1565b61026b565b6100e77f0000000000000000000000007ea85bd98ce15a8eb3de41933bdffdb8859aadb481565b6002546100e7906001600160a01b031681565b6003546100e7906001600160a01b031681565b60005461018290600160a01b900460ff1681565b60405190151581526020016100fb565b61010c6101a03660046109c1565b61036c565b6101ae60045481565b6040519081526020016100fb565b6101ae62278d0081565b6101ae6101d43660046109c1565b610443565b61010c6106a7565b61010c61094b565b6002546001600160a01b0316331461021c5760405162461bcd60e51b8152600401610213906109f1565b60405180910390fd5b6003546040516001600160a01b03909116907f7c7cf105c6d2d5b006d910653c90e1ddef1597f52e08f86f4a8aad4e5bdf255e90600090a2600380546001600160a01b03191690556000600455565b6001546001600160a01b03163314801561028f5750600054600160a01b900460ff16155b6102c45760405162461bcd60e51b8152602060048201526006602482015265333937bd32b760d11b6044820152606401610213565b6001600160a01b0381166103035760405162461bcd60e51b8152600401610213906020808252600490820152637a65726f60e01b604082015260600190565b600080546001600160a81b0319166001600160a01b038316908117600160a01b17909155600180546001600160a01b03191690556040519081527ed260c182c2b366c8fa4db0a524eb728203a219b59970ba388b0cbbba0da2699060200160405180910390a150565b6002546001600160a01b031633146103965760405162461bcd60e51b8152600401610213906109f1565b6001600160a01b0381166103d55760405162461bcd60e51b8152600401610213906020808252600490820152637a65726f60e01b604082015260600190565b600380546001600160a01b0319166001600160a01b0383161790556103fd62278d0042610a17565b60048190556040519081526001600160a01b038216907f5bba324c6b20af8aba17306e6adaebaeca43b9d110bbf1fdee4ecfdc53974d539060200160405180910390a250565b60008054600160a01b900460ff1661048a5760405162461bcd60e51b815260206004820152600a60248201526918db1d58881d5b9cd95d60b21b6044820152606401610213565b7f0000000000000000000000007ea85bd98ce15a8eb3de41933bdffdb8859aadb46001600160a01b0316826001600160a01b0316036104fe5760405162461bcd60e51b815260206004820152601060248201526f1693d3d35154881a5cc81b1bd8dad95960821b6044820152606401610213565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610542573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105669190610a3e565b9050600081116105aa5760405162461bcd60e51b815260206004820152600f60248201526e0dcdee8d0d2dcce40e8de40e0eae6d608b1b6044820152606401610213565b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af11580156105fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106219190610a57565b61065f5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610213565b816001600160a01b03167f5c10d3dee32181ea75d431e1f494ca491bf89425885f4071df01fc28c93debeb8260405161069a91815260200190565b60405180910390a2919050565b6002546001600160a01b031633146106d15760405162461bcd60e51b8152600401610213906109f1565b6004546000036107135760405162461bcd60e51b815260206004820152600d60248201526c1b9bdb99481c1c9bdc1bdcd959609a1b6044820152606401610213565b6004544210156107525760405162461bcd60e51b815260206004820152600a6024820152691d1a5b595b1bd8dad95960b21b6044820152606401610213565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000007ea85bd98ce15a8eb3de41933bdffdb8859aadb46001600160a01b0316906370a0823190602401602060405180830381865afa1580156107b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dd9190610a3e565b9050600081116108175760405162461bcd60e51b8152602060048201526005602482015264656d70747960d81b6044820152606401610213565b600380546001600160a01b031981169091556000600490815560405163a9059cbb60e01b81526001600160a01b039283169181018290526024810184905290917f0000000000000000000000007ea85bd98ce15a8eb3de41933bdffdb8859aadb4169063a9059cbb906044016020604051808303816000875af11580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c69190610a57565b6109045760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610213565b806001600160a01b03167f5ec793c1d9038470061a234f83d2877df44544e5fbce4e1e040b06d4970752c38360405161093f91815260200190565b60405180910390a25050565b6002546001600160a01b031633146109755760405162461bcd60e51b8152600401610213906109f1565b600280546001600160a01b0319908116909155600380549091169055600060048190556040517fe2ace56761b4bc26e9bbfa3e9c571220d4796d4fb51debe5fff39dd71ac5dda89190a1565b6000602082840312156109d357600080fd5b81356001600160a01b03811681146109ea57600080fd5b9392505050565b6020808252600c908201526b3737ba1033bab0b93234b0b760a11b604082015260600190565b80820180821115610a3857634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215610a5057600080fd5b5051919050565b600060208284031215610a6957600080fd5b815180151581146109ea57600080fdfea2646970667358221220b81cb999390dc3e5f1d59eb47476daff6043adde092c881a9b74006481acabc164736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| ZOOMER (ZOOMER) | ZOOMER | 33,800,000 | — | — |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x107dfd…04aca9 | 10 hrs agoMon, 17 Aug 2026 20:53:48 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…911c153e data: 0x000000000000000000…4284f6fe |
| 0xe307df…dc7782 | 10 hrs agoMon, 17 Aug 2026 20:53:04 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…9d42da09 data: 0x000000000000000000…e3babb56 |
| 0x97c20f…b89e00 | 10 hrs agoMon, 17 Aug 2026 20:52:59 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…1c003b2d data: 0x000000000000000000…bfc629eb |
| 0x7fc2f9…be546e | 10 hrs agoMon, 17 Aug 2026 20:52:54 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…8f8a93f9 data: 0x000000000000000000…5e86d49a |
| 0xe777ec…c8b1ea | 10 hrs agoMon, 17 Aug 2026 20:52:48 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…5888de68 data: 0x000000000000000000…1c014c0f |
| 0xdda0ff…e3c009 | 12 hrs agoMon, 17 Aug 2026 18:52:02 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…911c153e data: 0x000000000000000000…e52f909c |
| 0x76ceca…a02632 | 12 hrs agoMon, 17 Aug 2026 18:51:57 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…9d42da09 data: 0x000000000000000000…ec123300 |
| 0xef8e26…c26f4e | 12 hrs agoMon, 17 Aug 2026 18:51:52 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…1c003b2d data: 0x000000000000000000…bb11c367 |
| 0x200f22…b31c20 | 12 hrs agoMon, 17 Aug 2026 18:51:48 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…8f8a93f9 data: 0x000000000000000000…4625fe86 |
| 0xc958cd…32ec50 | 12 hrs agoMon, 17 Aug 2026 18:50:48 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…5888de68 data: 0x000000000000000000…a995ece5 |
| 0x98ad6a…84bb25 | 18 hrs agoMon, 17 Aug 2026 12:52:59 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…911c153e data: 0x000000000000000000…c3146e56 |
| 0x91fd3c…1a340e | 18 hrs agoMon, 17 Aug 2026 12:52:53 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…9d42da09 data: 0x000000000000000000…a75c247e |
| 0xcde382…d954c7 | 18 hrs agoMon, 17 Aug 2026 12:52:51 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…1c003b2d data: 0x000000000000000000…5e7b1f2b |
| 0x10fe63…6e9c85 | 18 hrs agoMon, 17 Aug 2026 12:52:50 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…8f8a93f9 data: 0x000000000000000000…154dd7d6 |
| 0xa8c13c…3e705d | 18 hrs agoMon, 17 Aug 2026 12:52:48 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…5888de68 data: 0x000000000000000000…1dd1c76c |
| 0xc94103…596f29 | 22 hrs agoMon, 17 Aug 2026 08:06:08 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…911c153e data: 0x000000000000000000…b7760bcd |
| 0x12b8a6…b3d9c3 | 22 hrs agoMon, 17 Aug 2026 08:06:03 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…9d42da09 data: 0x000000000000000000…010120c4 |
| 0xd97e2d…286604 | 22 hrs agoMon, 17 Aug 2026 08:05:58 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…1c003b2d data: 0x000000000000000000…347a417b |
| 0xd56f26…3eb5a4 | 22 hrs agoMon, 17 Aug 2026 08:05:53 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…8f8a93f9 data: 0x000000000000000000…71bae822 |
| 0x77241f…19ef51 | 22 hrs agoMon, 17 Aug 2026 08:05:46 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…5888de68 data: 0x000000000000000000…6c130e49 |
| 0xe50595…86c3c9 | 1 day agoMon, 17 Aug 2026 06:34:10 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…911c153e data: 0x000000000000000000…9a989ea2 |
| 0xa9b85f…4966cd | 1 day agoMon, 17 Aug 2026 06:34:05 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…9d42da09 data: 0x000000000000000000…208944e7 |
| 0x5968d6…e45623 | 1 day agoMon, 17 Aug 2026 06:34:01 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…1c003b2d data: 0x000000000000000000…f3285359 |
| 0x599170…d84a57 | 1 day agoMon, 17 Aug 2026 06:33:56 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…8f8a93f9 data: 0x000000000000000000…c1d81adf |
| 0x4e25a0…853ea1 | 1 day agoMon, 17 Aug 2026 06:33:51 UTC | 0x5c10d3…ebeb | [0] 0x000000000000…5888de68 data: 0x000000000000000000…194de5ce |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| 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 | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x049fff…802f21 | setClub | 38,482,978 | 1 day agoMon, 17 Aug 2026 02:36:45 UTC | 0xd634…befa | IN | ZoomerClubTreasury | $0.000 ETH | 0.00000091 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x2019bd33…ad6819 | Transfer | 39,418,604 | 2 hrs agoTue, 18 Aug 2026 04:40:41 UTC | 0x9136…c2d1 | IN | 0xc16b…e07d | 99,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0x2b231920…317d2c | Transfer | 39,341,415 | 4 hrs agoTue, 18 Aug 2026 02:31:40 UTC | 0x007d…0246 | IN | 0xc16b…e07d | 99,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0x948f9f26…d28110 | Transfer | 39,340,962 | 4 hrs agoTue, 18 Aug 2026 02:30:55 UTC | 0x007d…0246 | IN | 0xc16b…e07d | 99,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0x0aa9b7b1…e203ee | Transfer | 39,338,743 | 4 hrs agoTue, 18 Aug 2026 02:27:12 UTC | 0x59cc…4d9b | IN | 0xc16b…e07d | 199,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0x4bfd7b5b…cada54 | Transfer | 39,337,702 | 4 hrs agoTue, 18 Aug 2026 02:25:28 UTC | 0x59cc…4d9b | IN | 0xc16b…e07d | 399,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0xf0930663…c15363 | Transfer | 39,337,058 | 4 hrs agoTue, 18 Aug 2026 02:24:24 UTC | 0x59cc…4d9b | IN | 0xc16b…e07d | 99,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0xe0f9a41f…f04ab7 | Transfer | 39,329,250 | 4 hrs agoTue, 18 Aug 2026 02:11:22 UTC | 0x5134…a035 | IN | 0xc16b…e07d | 999,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0xd26d2ddf…436e04 | Transfer | 39,287,457 | 6 hrs agoTue, 18 Aug 2026 01:01:29 UTC | 0x7dfe…bc39 | IN | 0xc16b…e07d | 499,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0x92546bb3…d5ecbe | Transfer | 39,287,028 | 6 hrs agoTue, 18 Aug 2026 01:00:48 UTC | 0x7dfe…bc39 | IN | 0xc16b…e07d | 99,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0x107dfd9d…04aca9 | Transfer | 39,139,180 | 10 hrs agoMon, 17 Aug 2026 20:53:48 UTC | 0xc16b…e07d | OUT | 0xc8b8…be80 | $0.190.010089 GME | GameStop • Robinhood Token (GME) | |
| 0xe307df1a…dc7782 | Transfer | 39,138,738 | 10 hrs agoMon, 17 Aug 2026 20:53:04 UTC | 0xc16b…e07d | OUT | 0xc8b8…be80 | $0.180.001887 MSTR | Strategy Inc. • Robinhood Token (MSTR) | |
| 0x97c20fdd…b89e00 | Transfer | 39,138,690 | 10 hrs agoMon, 17 Aug 2026 20:52:59 UTC | 0xc16b…e07d | OUT | 0xc8b8…be80 | $0.190.000547 TSLA | Tesla • Robinhood Token (TSLA) | |
| 0x7fc2f910…be546e | Transfer | 39,138,642 | 10 hrs agoMon, 17 Aug 2026 20:52:54 UTC | 0xc16b…e07d | OUT | 0xc8b8…be80 | $0.190.000608 AAPL | Apple • Robinhood Token (AAPL) | |
| 0xe777eca8…c8b1ea | Transfer | 39,138,582 | 10 hrs agoMon, 17 Aug 2026 20:52:48 UTC | 0xc16b…e07d | OUT | 0xc8b8…be80 | $0.190.000254 QQQ | Invesco QQQ • Robinhood Token (QQQ) | |
| 0x964bcba9…c733d7 | Transfer | 39,138,199 | 10 hrs agoMon, 17 Aug 2026 20:52:09 UTC | 0x2098…ee98 | IN | 0xc16b…e07d | $0.190.010089 GME | GameStop • Robinhood Token (GME) | |
| 0x7f9a7287…15a371 | Transfer | 39,138,190 | 10 hrs agoMon, 17 Aug 2026 20:52:09 UTC | 0x2098…ee98 | IN | 0xc16b…e07d | $0.180.001887 MSTR | Strategy Inc. • Robinhood Token (MSTR) | |
| 0x5d1b6811…5a1ebc | Transfer | 39,138,179 | 10 hrs agoMon, 17 Aug 2026 20:52:07 UTC | 0x2098…ee98 | IN | 0xc16b…e07d | $0.190.000547 TSLA | Tesla • Robinhood Token (TSLA) | |
| 0x765b32af…ff6498 | Transfer | 39,138,170 | 10 hrs agoMon, 17 Aug 2026 20:52:07 UTC | 0x2098…ee98 | IN | 0xc16b…e07d | $0.190.000608 AAPL | Apple • Robinhood Token (AAPL) | |
| 0x83a57910…8535a5 | Transfer | 39,138,162 | 10 hrs agoMon, 17 Aug 2026 20:52:06 UTC | 0x2098…ee98 | IN | 0xc16b…e07d | $0.190.000254 QQQ | Invesco QQQ • Robinhood Token (QQQ) | |
| 0xf1a2e571…db75ab | Transfer | 39,128,477 | 10 hrs agoMon, 17 Aug 2026 20:35:56 UTC | 0x74e0…460d | IN | 0xc16b…e07d | 999,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0xb2b8cad3…24f036 | Transfer | 39,126,987 | 10 hrs agoMon, 17 Aug 2026 20:33:26 UTC | 0x74e0…460d | IN | 0xc16b…e07d | 499,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0x0d6dab35…7a893f | Transfer | 39,092,593 | 11 hrs agoMon, 17 Aug 2026 19:35:53 UTC | 0xebe2…83da | IN | 0xc16b…e07d | 99,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0x882e3d6a…61110c | Transfer | 39,077,294 | 11 hrs agoMon, 17 Aug 2026 19:10:19 UTC | 0x007d…0246 | IN | 0xc16b…e07d | 199,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0xbba7fd76…410ec5 | Transfer | 39,072,236 | 12 hrs agoMon, 17 Aug 2026 19:01:53 UTC | 0xc4c9…fd29 | IN | 0xc16b…e07d | 999,999.999999 ZOOMER | ZOOMER (ZOOMER) | |
| 0x78f731a5…5f4247 | Transfer | 39,070,864 | 12 hrs agoMon, 17 Aug 2026 18:59:35 UTC | 0xc4c9…fd29 | IN | 0xc16b…e07d | 999,999.999999 ZOOMER | ZOOMER (ZOOMER) |