Token ownership
One registry, one owner, one handoff. Everything a creator controls resolves through TokenOwnerRegistry.ownerOf.
Most launchpads scatter creator control across contracts: metadata on the token, the fee recipient in the locker, the payout address in some module. Move wallets and you have three or four transactions to get right, and one you will forget. hood.dev keeps a single registry instead — every creator power on the platform resolves through TokenOwnerRegistry.ownerOf(token), so one call moves all of it.
#What the owner controls
| Power | Where it lives |
|---|---|
| Token metadata | setImage, setDescription, setSocials, setContractURI on the token — or the Edit form on My Tokens, which calls them for you |
| Creator fee recipient | FeeLocker.updateCreatorRecipient — where your WETH share is paid |
| Vesting recipient | VestingFeeModule.setRecipient, if you chose the vesting policy |
| Buy-and-burn trigger | The owner path on the buy-burn module — any time, any size |
| Ownership itself | transferTokenOwnership — including renouncing |
Note what is not on that list: minting, unlocking liquidity, changing the fee split, changing the fee policy, altering the sniper guard, or moving anyone’s tokens. No owner has those powers, because the contracts do not implement them.
#Transferring and renouncing
function ownerOf(address token) external view returns (address);
/// Moves every owner power over the token in one call.
/// newOwner == address(0) renounces — permanently.
function transferTokenOwnership(address token, address newOwner) external;- It is a direct transfer, not a two-step handshake. There is no “accept” call, so check the address twice — a typo sends control to a wallet nobody holds.
- Renouncing is irreversible. Passing the zero address freezes metadata and every fee recipient exactly as they stand, forever. The registry also blocks re-registration, so a renounced token cannot be re-adopted by anyone, including us.
- Fee flows keep working after a renounce. Collection is permissionless and the destinations are already recorded. What stops is your ability to change them.
ownerOf call.#Reading the owner
Either TokenOwnerRegistry.ownerOf(token) or token.tokenOwner(), which forwards to the registry. Both return the zero address after a renounce. The token’s creator immutable is not the answer — it records who launched it, historically, and never changes hands.
#The registry’s own admin
The registry contract has an owner, and its only power is setLauncher — pointing at a new factory so that future launches can register. It cannot read, write, transfer or renounce anybody’s token ownership; there is no function that lets it. That is the seam the multi-venue launcher upgrade went through, with every previously-launched token’s ownership row untouched.
