Skip to main content

Class: BrowserSDK

Defined in: BrowserSDK.ts:48

High-level browser SDK for KEA Wallet integration.

Wraps EmbeddedProvider with a ThruClient for direct blockchain RPC queries and automatic dApp metadata resolution (appName, appUrl, appId are derived from window.location when not explicitly provided).

Remarks

The typical lifecycle is:

  1. Create an instance with optional BrowserSDKConfig
  2. Call initialize (or let connect do it automatically)
  3. Call connect to open the wallet consent modal
  4. Use getAccounts, getSelectedAccount, and the thru signer
  5. Listen for events via on
  6. Call destroy when the SDK is no longer needed

Example

import { BrowserSDK } from '@kea-wallet/browser-sdk';

const sdk = new BrowserSDK({ rpcUrl: 'https://grpc-web.alphanet.thruput.org' });
await sdk.initialize();

const { accounts } = await sdk.connect();
console.log('Connected:', accounts[0].address);

sdk.on('accountChanged', (account) => {
console.log('Switched to:', account.address);
});

// When done:
sdk.destroy();

See

Constructors

Constructor

new BrowserSDK(config?: BrowserSDKConfig): BrowserSDK;

Defined in: BrowserSDK.ts:68

Create a new BrowserSDK instance.

Parameters

ParameterTypeDescription
configBrowserSDKConfigSDK configuration including iframe URL, RPC URL, and address types

Returns

BrowserSDK

Lifecycle

destroy()

destroy(): void;

Defined in: BrowserSDK.ts:522

Tear down the SDK — destroys the iframe, clears all event listeners, and resets internal state.

Returns

void

Remarks

After calling destroy(), the instance cannot be reused. Create a new BrowserSDK instance if you need to reconnect.

Example

// Cleanup on component unmount or page unload
sdk.destroy();

See

initialize to set up a new instance


initialize()

initialize(): Promise<void>;

Defined in: BrowserSDK.ts:105

Initialize the SDK by creating the wallet iframe. Automatically called by connect if not already initialized. Calling it explicitly allows pre-loading the iframe for faster first connection.

Returns

Promise<void>

Remarks

This method is idempotent — calling it multiple times has no effect after the first successful initialization.

Example

// Pre-load for faster UX
const sdk = new BrowserSDK();
await sdk.initialize(); // iframe created, ready for connect()

// Later, when user clicks "Connect":
const result = await sdk.connect(); // instant, no iframe delay

mountInline()

mountInline(container: HTMLElement): Promise<void>;

Defined in: BrowserSDK.ts:209

Mount the wallet iframe inline inside a DOM container instead of as a modal.

Parameters

ParameterTypeDescription
containerHTMLElementThe DOM element to embed the wallet into

Returns

Promise<void>

Remarks

Use this for embedded wallet experiences where the wallet UI is always visible within your app layout rather than appearing as a popup.

Example

const container = document.getElementById('wallet-container')!;
await sdk.mountInline(container);

Connection

connect()

connect(options?: ConnectOptions): Promise<ConnectResult>;

Defined in: BrowserSDK.ts:146

Connect to the KEA Wallet. Opens the wallet modal for user authorization.

Parameters

ParameterTypeDescription
options?ConnectOptionsOptional connection settings including dApp metadata

Returns

Promise<ConnectResult>

The connection result containing authorized wallet accounts

Remarks

  • Auto-initializes the SDK if initialize was not called.
  • Concurrent calls are deduplicated — only the first in-flight request runs.
  • If already connected, returns the cached result immediately.
  • dApp metadata (appName, appUrl) is automatically resolved from window.location unless explicitly provided in options.metadata.

Throws

Error with ErrorCode.USER_REJECTED if the user declines

Example

// Basic connection
const { accounts } = await sdk.connect();

// With custom metadata for the consent screen
const { accounts } = await sdk.connect({
metadata: { appName: 'My dApp', imageUrl: 'https://mydapp.com/logo.png' },
});

See


disconnect()

disconnect(): Promise<void>;

Defined in: BrowserSDK.ts:232

Disconnect from the wallet and clear session state.

Returns

Promise<void>

Remarks

Emits a 'disconnect' event on success and an 'error' event if the underlying message fails. The error is also re-thrown.

Throws

Error if the disconnect message fails

Example

await sdk.disconnect();
console.log(sdk.isConnected()); // false

See

connect to re-establish the session


isConnected()

isConnected(): boolean;

Defined in: BrowserSDK.ts:261

Check whether the wallet is currently connected.

Returns

boolean

true if a wallet session is active

Example

if (sdk.isConnected()) {
const accounts = sdk.getAccounts();
}

See


isReconnecting()

isReconnecting(): boolean;

Defined in: BrowserSDK.ts:278

Whether the SDK is currently attempting a silent auto-reconnect.

Returns

boolean

true while a silent session check is in progress

Remarks

Use this to show a loading skeleton or "Reconnecting…" state instead of briefly flashing the "Connect Wallet" button on page reload.

See

BrowserSDKConfig.autoConnect

Accounts

getAccounts()

getAccounts(): WalletAccount[];

Defined in: BrowserSDK.ts:301

Get all accounts from the current wallet session.

Returns

WalletAccount[]

Array of connected wallet accounts (each with address, label, and accountType fields)

Example

const accounts = sdk.getAccounts();
accounts.forEach((acc) => {
console.log(`${acc.label}: ${acc.address}`);
});

See


getSelectedAccount()

getSelectedAccount(): any;

Defined in: BrowserSDK.ts:325

Get the currently selected (active) account.

Returns

any

The selected account, or null if none is selected

Example

const account = sdk.getSelectedAccount();
if (account) {
console.log('Active:', account.address);
}

See


selectAccount()

selectAccount(publicKey: string): Promise<WalletAccount>;

Defined in: BrowserSDK.ts:353

Switch the active account by public key.

Parameters

ParameterTypeDescription
publicKeystringThe public key of the account to select

Returns

Promise<WalletAccount>

The newly selected account

Remarks

Emits an 'accountChanged' event after the switch completes.

Example

const accounts = sdk.getAccounts();
const newAccount = await sdk.selectAccount(accounts[1].address);
console.log('Now active:', newAccount.label);

Throws

Error with ErrorCode.ACCOUNT_NOT_FOUND if the public key does not match any connected account

See

Chain

thru

Get Signature

get thru(): IThruChain;

Defined in: BrowserSDK.ts:382

Access the Thru chain adapter for signing transactions and messages.

Remarks

The signer delegates signing to the wallet iframe — private keys never leave the wallet. Use getThru for read-only RPC queries that do not require signing.

Example
const signingCtx = await sdk.thru.getSigningContext();
console.log('Fee payer:', signingCtx.feePayerPublicKey);

const signed = await sdk.thru.signTransaction(serializedTx);
See

getThru for the read-only RPC client

Returns

IThruChain

The iframe-backed Thru chain signer


getThru()

getThru(): Thru;

Defined in: BrowserSDK.ts:408

Get the ThruClient instance for direct blockchain RPC queries (balance lookups, transaction submission, block queries).

Returns

Thru

The configured ThruClient (uses the rpcUrl from BrowserSDKConfig)

Remarks

This client communicates with the Thru blockchain via gRPC-web. It does not require a connected wallet — you can query the blockchain before calling connect.

Example

const thru = sdk.getThru();
// Query account balance, submit transactions, etc.

See

Events

off()

off<T>(event: T, callback: EventCallback<T>): void;

Defined in: BrowserSDK.ts:469

Unsubscribe from an SDK event.

Type Parameters

Type ParameterDescription
T extends keyof SDKEventPayloadsThe event name

Parameters

ParameterTypeDescription
eventTThe event name
callbackEventCallback<T>The exact listener reference passed to on

Returns

void

Example

const handler: EventCallback<'accountChanged'> = (account) => {
console.log(account.address);
};
sdk.on('accountChanged', handler);
// Later:
sdk.off('accountChanged', handler);

See

on


on()

on<T>(event: T, callback: EventCallback<T>): void;

Defined in: BrowserSDK.ts:441

Subscribe to an SDK event.

Type Parameters

Type ParameterDescription
T extends keyof SDKEventPayloadsThe event name, used to narrow the callback payload type

Parameters

ParameterTypeDescription
eventTThe event name
callbackEventCallback<T>The listener function, called with the event payload

Returns

void

Example

// Type-safe: `account` is narrowed to WalletAccount
sdk.on('accountChanged', (account) => {
console.log('Switched to:', account.address);
});

sdk.on('error', (err) => {
console.error('SDK error:', err);
});

sdk.on('disconnect', (data) => {
console.log('Disconnected:', data.reason);
});

See


once()

once<T>(event: T, callback: EventCallback<T>): void;

Defined in: BrowserSDK.ts:496

Subscribe to an SDK event for a single invocation. The listener is automatically removed after the first call.

Type Parameters

Type ParameterDescription
T extends keyof SDKEventPayloadsThe event name

Parameters

ParameterTypeDescription
eventTThe event name
callbackEventCallback<T>The listener function

Returns

void

Example

// Wait for the first connect event, then stop listening
sdk.once('connect', (result) => {
if ('accounts' in result) {
console.log('Connected with', result.accounts.length, 'accounts');
}
});

See

  • on for persistent listeners
  • off to manually unsubscribe