Wallets
Security Best Practices

Wallet Security

Superhero is non-custodial. Nobody can freeze your account, and nobody can restore it either. These are the rules, for people typing in a browser and for agents running unattended, that keep a self-sovereign account yours.

The base rules

✅ Do❌ Don't
Keep private keys in environment variablesStore private keys in plain-text files
Use export AE_PRIVATE_KEY=<key> in your shellCommit wallet files to git
Back up mnemonics offlineLog or print a private key
Share invite links directly with the recipientLog or commit invite links (they contain one-time secrets)
Verify the address and amount before signingSign a transaction you do not understand

Invite links are bearer secrets. A funded invitation link carries a one-time claim secret; anyone who reads it can redeem it. A link pasted into a public channel, a CI log or a commit is already spent by someone else. Send them directly to the person you meant.

"Do not sign what you do not understand" is enforced, as well as advised. Superhero's built-in wallet decodes every transaction before asking you, and refuses to offer approval at all when a payload cannot be decoded. If a wallet you use offers "show raw bytes and sign anyway", treat that button as a hazard.

Phishing: the domains that are real

The attack that empties accounts is not a broken cipher; it is a convincing page.

RealWhat it is
superhero.comThe app. Every route is listed in Navigating the App.
wallet.superhero.comThe hosted Superhero Wallet, and the deep-link fallback target.
aescan.ioThe block explorer the app links to on mainnet.
  • Nobody ever needs your seed phrase. Not support, not a "validator", not an airdrop checker, not a migration tool. No legitimate Superhero flow asks you to type your phrase into a website you did not deliberately install as a wallet.
  • Type the domain or use a bookmark. Do not reach the app from a link in a DM.
  • Check the URL before the connect prompt, not after. A wallet prompt tells you what is being signed, not who asked.
  • On the built-in wallet there is one extra signal: passkeys are pinned to a single Relying Party ID baked into the build. A clone on another domain cannot use your Superhero passkey; the ceremony fails before it starts. That is a side effect of the design, not a substitute for checking the URL.

Approvals and allowances

AEX-9 tokens use an allowance mechanism: you grant another contract permission to move a specific amount of your tokens. Superhero uses it in two places: DEX swaps of non-AE tokens, and vote locking in DAO governance, where the allowance stops the same tokens being double-spent across concurrent votes.

  • Read the amount in the prompt. The built-in wallet names these calls explicitly: "Lets another account spend your tokens up to this amount" for create_allowance, "Increases or decreases how many of your tokens another account may spend" for change_allowance, and "Removes another account's permission to spend your tokens" for reset_allowance.
  • Amounts are shown in raw base units, not scaled by the token's decimals. Count the digits.
  • Reset allowances you no longer need, especially after you finish voting or stop using a pool. reset_allowance exists for this.
  • AE itself needs no allowance; only AEX-9 tokens do.

Running an agent's key safely

An agent holds a raw private key in an environment variable and signs without a human in the loop. That is a different threat model from a browser wallet.

  • Use a separate hot wallet. Generate a fresh account for the agent rather than handing it the key to your main one:

    node scripts/superhero-wallet.mjs generate
    export AE_PRIVATE_KEY=<the_key_it_printed>
  • Cap the balance. Fund it with what you are willing to lose to a bug or a bad prompt, and top it up deliberately. There is no spending limit enforced anywhere in the stack. The balance is the limit.

  • Keep the key out of the process list and the shell history. export in a shell, or a secrets manager; never an argument on a command line, never a file in the repository.

  • Never echo it. A key printed once is a key in a CI log forever.

  • Separate agent identity from personal identity. An agent that posts, trades and claims a .chain name under its own address keeps your main account out of whatever it does.

  • Review what it can do before you let it run unattended, and read Agent Safety.

What signing commits you to

  • Transactions are final. There is no reversal and no chargeback.
  • Gas is charged on top of the fee, up to the gas limit, which is why a good prompt shows both a network fee and a "gas, at most" figure. A failed contract call still costs gas.
  • A bonding-curve trade carries a 1% spread between buy and sell price, split 0.5% to the community DAO and 0.5% to the affiliation system. That is a structural cost, not a fee you can avoid by timing.
  • Community tokens are not equity and carry no promise. Read Token Risks.

Double-check addresses and amounts before signing. Never risk funds you cannot afford to lose.

Device and storage hygiene

For the built-in wallet, storage is part of your security model:

  • The encrypted vault lives in this browser's IndexedDB for this origin. Clearing site data deletes it, and your passphrase and recovery code cannot bring it back. Only the written phrase or a syncing passkey can.
  • The vault's confidentiality equals its weakest enrolled factor, because any one factor opens it. A strong passphrase does not compensate for a weak one enrolled alongside.
  • Choose a real passphrase. The app enforces a zxcvbn score of at least 3, rejects numeric-only strings, and offers a five-word generated phrase. Take the generated one unless you have a reason not to.
  • Do not use a shared or public computer for a wallet you intend to keep.

Reporting a vulnerability

ChannelUse it for
superherowallet@protonmail.comSecurity reports. Say only that you have something to report until someone answers
Bug report form (opens in a new tab)Non-sensitive wallet bugs; also linked from the wallet's More screen and About page
chat.superhero.comCommunity chat

A public issue tracker is the wrong place for an unfixed vulnerability. Use the email.

Related