Identity
Profiles & Accounts

Profiles & Accounts

Every æternity address has a profile page on Superhero, whether or not anyone has set it up. The page merges on-chain links, the API's account aggregate and trading statistics.

The two profile surfaces

RouteWhat it is
/users/:addressThe social profile: header, feed, owned and created tokens, transactions
/user/:addressLegacy path; redirects to /users/:address
/trends/accountsThe trader index: every account with token activity
/trends/accounts/:addressThe Trendminer view of an account, focused on trading
/trends/leaderboardRanked accounts by portfolio performance

The social profile is live at https://superhero.com/users/ followed by an ak_ address.

The header

ElementSource
Display nameThe linked preferred AENS name, else public_name, else the AENS name resolved for the address, else a shortened ak_…
Verified badgeRendered when an X link exists for the account
Biolinks.bio, falling back to profile.bio and then the account's own bio
Websitelinks.site
AvatarThe profile's avatarurl, with a deterministic generated fallback
Balances and countsThe account aggregate: holdings count and total created tokens

The account aggregate from GET /api/accounts/{address} carries address, bio, chain_name, chain_name_updated_at, an embedded profile, public_name, holdings_count, and a links object keyed by the AddressLink provider ids: x, nostr, bio, site and prefaens. The links object is authoritative; the flat fields are fallbacks for older records.

If chain_name_updated_at is older than the staleness window, or has never been set, the endpoint re-reads the name from the middleware, returns the fresh value, and writes it back asynchronously. An hourly sweep covers accounts nobody is viewing, so a lapsed or transferred .chain name disappears from a profile within about an hour.

The tabs

/users/:address has four tabs, selected by a tab query parameter (feed is the default and omits the parameter):

TabValueContents
FeedfeedThe account's posts and on-chain activity items
OwnedownedTokens the account holds, ordered by balance
CreatedcreatedTokens the account created
TransactionstransactionsThe account's trades, with the token expanded

All four datasets are prefetched when the page loads. The feed tab merges posts from GET /api/posts?account_address=… with trade and token-creation activity items.

On chain versus API

FieldWhere it lives
Preferred AENS name, bio, website, X handle, Nostr keyAddressLink contract state, as provider links, signed by you and submitted by the backend
AENS name ownership and pointersæternity AENS
Chain name shown on a profileResolved from the middleware and cached on the account; not a contract link
Fullname, avatar URL, legacy username, chain_expires_atLegacy profile fields, read-only
Follower and following countsThe social-graph tables, when that feature is enabled
Posts and commentsTipping v3 contract, indexed by the API
Balances, portfolio history, leaderboard statsComputed by the API from chain data

Every field a user controls is written behind their wallet signature; the transaction is submitted by Superhero's provider wallet. See AddressLink.

Editing your own profile

Open Edit SuperheroID on your own profile. It is one modal over several independent operations:

FieldHow it is written
BioClaim at /api/address-links/bio/claim, sign the returned message, submit at /bio/submit
WebsiteThe same pair under /api/address-links/site/, with the scheme stripped from the stored value
Preferred .chain nameThe same pair under /api/address-links/prefered-aens-name/, which uses link_principal and verifies AENS ownership on chain
X handleThe OAuth flow; see Verifying Your X Account
Nostr keyThe same pair under /api/address-links/nostr/, with a signed kind-22242 event as the extra proof

Each link has a matching unlink: /unclaim returns a message and nonce, you sign it, and /unclaim/submit relays the removal. The editor reloads its state after each operation.

Every claim reads the contract's own get_nonce(address), and the nonce advances on each link or unlink. If two devices claim at once, the second submit fails with a nonce mismatch and restarts from claim.

Fullname, avatar and the legacy username are read-only.

Leaderboards

/trends/leaderboard ranks accounts by portfolio performance from GET /api/accounts/leaderboard.

Query parameterValues
window7d, 30d or all
sortBypnl, roi, aum or mdd
sortDirASC or DESC
pointsSparkline resolution: 7 for a week, 30 otherwise
page, limitPagination; the client asks for 18 per page

Each row carries address, chain_name, aum_usd, pnl_usd, roi_pct, mdd_pct, buy_count, sell_count, volume_usd, created_tokens_count, owned_trends_count and a portfolio_value_usd_sparkline of timestamp-value pairs.

The default sort direction is descending for every metric except maximum drawdown (mdd), which sorts ascending because a smaller drawdown is better.

The account index

/trends/accounts reads GET /api/accounts, which pages at 1 to 100 rows and accepts a search term matched against the address, chain_name, public_name, username and fullname. order_by takes exactly nine values, and anything else is a 400:

order_byRanks by
total_volumeTrade volume (the default)
total_tx_countAll trades
total_buy_tx_countBuys only
total_sell_tx_countSells only
total_created_tokensTokens the account created
total_invitation_countInvitations created
total_claimed_invitation_countInvitations redeemed
total_revoked_invitation_countInvitations revoked
created_atWhen the account row first appeared

order_direction is ASC or DESC, defaulting to DESC. has_nostr=true returns only accounts that have linked a Nostr key, which is useful for a chat-contact suggester.

Both the account index and the leaderboard rank trading activity only; nothing ranks by posting, commenting, tipping or governance.

How public_name is computed

Server-side, by a fixed four-step ladder with no per-account preference:

prefered_aens_name   (links.prefaens — the AENS name the user explicitly linked)
chain_name           (resolved from the middleware)
username             (the legacy profile field)
address              (the ak_… itself)

See Names.

Related