Connecting a Wallet
HyperDex connects through Stellar Wallets Kit — eight wallets, one interface. Freighter is no longer required.
Supported wallets
| Wallet | Type | Notes |
|---|---|---|
| Freighter | Browser extension | Chrome / Brave / Firefox |
| xBull | Extension · web | Also usable without installing |
| LOBSTR | Mobile | Connects by QR from the phone app |
| Rabet | Browser extension | Chrome / Firefox |
| Albedo | Web | No install — multi-account |
| Hana | Browser extension | Multi-chain |
| HOT Wallet | Web · Telegram | No install |
| Ledger | Hardware | Via 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.
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
windowand 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
localStorageso a reload reconnects without prompting again
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.
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.