Arkena Docs

Handle events

The provider emits five events. Subscribe to react to account, network, and status changes.

The Arkena provider emits events when the wallet's state changes. Subscribe to them so your dApp reacts without polling.

The five events

EventWhen it firesPayload
accountsChangedUser switched accounts in the extensionstring[] (new accounts)
networkChangedUser switched between DevNet, TestNet, MainNetstring (new network)
statusChangedWallet locked or unlocked"locked" | "unlocked"
disconnectUser revoked your origin's accessvoid
txChangedA transaction your dApp is awaiting changed status{ commandId, status }

Subscription pattern

The provider follows the standard EIP-1193 subscription shape: on to subscribe, removeListener to clean up.

Code
"use client";
import { useEffect } from "react";
import { getArkenaProvider } from "@/lib/arkena";

export function useArkenaEvents(handlers: {
  onAccountsChanged?: (accounts: string[]) => void;
  onNetworkChanged?: (network: string) => void;
  onDisconnect?: () => void;
}) {
  useEffect(() => {
    let provider: Awaited<ReturnType<typeof getArkenaProvider>>;
    const onAccounts = (accounts: string[]) => handlers.onAccountsChanged?.(accounts);
    const onNetwork = (network: string) => handlers.onNetworkChanged?.(network);
    const onDisconnect = () => handlers.onDisconnect?.();

    void getArkenaProvider().then((p) => {
      provider = p;
      if (!provider) return;
      provider.on("accountsChanged", onAccounts);
      provider.on("networkChanged", onNetwork);
      provider.on("disconnect", onDisconnect);
    });

    return () => {
      if (!provider) return;
      provider.removeListener("accountsChanged", onAccounts);
      provider.removeListener("networkChanged", onNetwork);
      provider.removeListener("disconnect", onDisconnect);
    };
  }, [handlers.onAccountsChanged, handlers.onNetworkChanged, handlers.onDisconnect]);
}

accountsChanged — refetch every user-scoped piece of state your dApp holds: balances, activity, NFT gallery. Invalidate any cached SIWC token (it was scoped to the previous account).

networkChanged — almost always remount the dApp. Different network means different backend endpoint, different ledger state. Show a switching indicator while you reload.

statusChanged — when the wallet locks, hide any signing-related UI and show a "wallet locked" indicator. When it unlocks, restore.

disconnect — treat as logged-out. Clear the SIWC token, redirect to your landing screen, show a Connect prompt.

txChanged — for any transaction whose commandId you're tracking, update the UI. Optional but cheaper than polling.

What's next