Getting Started

Connecting a Wallet

HyperDex connects through Stellar Wallets Kit — eight wallets, one interface. Freighter is no longer required.

Supported wallets

WalletTypeNotes
FreighterBrowser extensionChrome / Brave / Firefox
xBullExtension · webAlso usable without installing
LOBSTRMobileConnects by QR from the phone app
RabetBrowser extensionChrome / Firefox
AlbedoWebNo install — multi-account
HanaBrowser extensionMulti-chain
HOT WalletWeb · TelegramNo install
LedgerHardwareVia WebUSB/WebHID

Click Connect Wallet in the navbar to open the picker. Detection runs fresh every time the sheet opens, so a wallet you installed a moment ago appears without a reload. Installed wallets are listed first; the rest show an Install pill that opens the vendor's site in a new tab.

Custom picker, kit data: HyperDex renders its own wallet sheet rather than the kit's authModal(), so the picker carries the HyperDex theme. The wallet list, availability detection and every connect/sign action still come from the kit.

What happens on connect

  • The kit is initialised lazily and browser-only — its modules touch window and injected extension globals at construction, so importing during SSR throws
  • Your wallet is asked for its address; HyperDex only ever reads the public key
  • The wallet's network is compared against the selected network — a mismatch raises the wrong-network banner instead of connecting
  • The wallet id and display name are stored in localStorage so a reload reconnects without prompting again
Nothing is probed unasked: Session restore only runs for a wallet you previously picked. Without a stored id there is nothing to reconnect to — probing every module on load would fire permission prompts you never asked for.

Signing

Every transaction is signed with the connected wallet, pinned to two things:

  • The network passphrase of the selected network — a signature made against the wrong one is rejected on-chain as txBadAuth
  • The signing address — multi-account wallets such as Albedo use this to choose which key signs. Without it a user can approve with an account the quote was not bound to, and settlement fails after they have already clicked approve
const { signedTxXdr } = await kit.signTransaction(xdr, {
  networkPassphrase: ACTIVE_NETWORK.passphrase,
  address,   // pins WHICH account signs
});

Robustness details

Cancellation vs. failure

The kit rejects with a plain { code, message } object rather than an Error. Those rejections are normalised before they reach the UI, so a user declining in their wallet closes the sheet quietly instead of surfacing a generic "Failed to connect", while real errors keep their reason.

Timeouts

Connect requests time out after 90 seconds and session restores after 20, so the UI can never hang on "Connecting…" when a wallet never answers.

Fetch vs. read

Connecting calls fetchAddress(), which asks the wallet. getAddress() only reads the kit's in-memory value — always empty on a fresh connect — so it is used as the cheap path within a page-load and falls through to fetchAddress() after a reload.

Wallets and networks

The kit is initialised against whichever network the navbar switcher has selected, so it follows the rest of the app automatically. Switching networks reloads the page and drops the wallet session — set your wallet to the matching network before reconnecting. See Mainnet & Testnet for the full picture.

Hardware and bridge wallets: Wallets that do not expose their network return null and are let through the connect-time check. The guard runs again at signing time, where a wrong-network transaction is refused before the wallet opens.

Disconnecting

Disconnect clears the stored wallet id and name and calls the module's own disconnect(). Modules that do not implement it are fine — clearing HyperDex's own state is enough to end the session.

HyperDex | Trade Without Limits