Skip to main content
A connector knows how to find, connect and restore wallets of one family (EVM, NEAR, Solana, …). The kit takes a list of connector factories: (kit) => Promise<OmniConnector>.

Default connectors

defaultConnectors has EVM, NEAR, Solana, TON, Stellar, TRON, Sui, Aptos, Starknet, XRP and UTXO. Each one is a lazyConnector: its module and chain SDK are imported only
  • at startup, when the storage has a session for it (so the wallet is restored after a reload), or inside the HOT app;
  • otherwise when something needs the list of wallets: kit.connect(), kit.openProfile(), kit.openBridge() or kit.requestConnectors().
So an app that never opens the connect popup does not download any chain SDK.

Picking chains

Build your own list from the per-chain entry points. Every entry point’s default export is a factory creator:
load must be a literal () => import("...") so your bundler emits a separate chunk. Pass { eager: true } as the fourth argument to load a connector at startup. Eager (not lazy) registration also works, at the cost of a bigger first bundle:
Wallets of Sui, Aptos, Starknet, XRP and UTXO chains have no intents account (omniAddress is ""): they can send on-chain transfers and deposits but cannot sign intents.

Google login (Privy)

One Google account gives an embedded wallet per chain: EVM and Solana are Privy wallets, NEAR, Stellar and TON are signed by Privy’s TEE wallets. Login opens a popup; redirectUrl (default: the page origin) must be an allowed redirect URL of your Privy app.

WalletConnect

EVM and TRON can connect mobile wallets over WalletConnect. Set walletConnect.projectId (from dashboard.reown.com) and walletConnect.metadata in HotKitOptions; without a project id these options are not shown.

Inside the HOT Wallet

When the app runs inside the HOT Wallet (Telegram mini app or in-app browser) the wallet is injected and every lazy connector loads at startup, so the user is connected without a picker.