Skip to main content

useGlam

Accesses the GLAM provider context.
import { useGlam } from '@glam/sdk/react';

function MyComponent() {
  const { glamClient, vault, activeGlamState } = useGlam();
  
  // Use glamClient to interact with vault
  // Access vault balances and token accounts
  // Get active vault state
}
See GlamProvider context value for all available properties.

useCluster

Accesses the cluster provider context.
import { useCluster } from '@glam/sdk/react';

function NetworkSwitcher() {
  const { cluster, clusters, setCluster } = useCluster();
  
  return (
    <select 
      value={cluster.name} 
      onChange={(e) => {
        const selected = clusters.find(c => c.name === e.target.value);
        if (selected) setCluster(selected);
      }}
    >
      {clusters.map(c => (
        <option key={c.name} value={c.name}>
          {c.name}
        </option>
      ))}
    </select>
  );
}
See ClusterProvider context value for all available properties.

useVaultBalanceSubscription

Internal hook that subscribes to vault balance changes via WebSocket.
import { useVaultBalanceSubscription } from '@glam/sdk/react';

function useCustomVaultSubscription(vaultPda: PublicKey | undefined) {
  const { connection } = useConnection();
  const queryClient = useQueryClient();
  const [wsConnected, setWsConnected] = useState(false);

  useVaultBalanceSubscription({
    connection,
    queryClient,
    vaultPda,
    pk: vaultPda?.toBase58() ?? '',
    cluster: 'mainnet-beta',
    tokenAccounts: [],
    enabled: !!vaultPda,
    onWsStatusChange: setWsConnected,
  });

  return { wsConnected };
}

Options

connection
Connection
required
Solana connection instance
queryClient
QueryClient
required
TanStack Query client instance
vaultPda
PublicKey | undefined
required
Vault PDA to subscribe to
pk
string
required
Vault state pubkey as base58 string (for query key scoping)
cluster
string
required
Cluster network string (for query key scoping)
tokenAccounts
TokenAccount[]
required
Token accounts to subscribe to (in addition to vault PDA)
enabled
boolean
required
Whether subscription is enabled
onWsStatusChange
(connected: boolean) => void
required
Callback when WebSocket connection status changes

Behavior

  • Subscribes to vault PDA + up to 19 token accounts (max 20 total subscriptions)
  • Automatically invalidates balance and holdings queries on account changes
  • Uses debounced invalidation (2 second window) to avoid excessive refetches
  • Falls back to polling when WebSocket is disabled or unavailable
  • Can be disabled via NEXT_PUBLIC_WEBSOCKET_DISABLED or WEBSOCKET_DISABLED environment variable

Query keys

Query key factory for TanStack Query. Import from @glam/sdk/react.
import { queryKeys } from '@glam/sdk/react';

// Vault-scoped keys
queryKeys.vault.all(pk, cluster)           // All vault queries
queryKeys.vault.balances(pk, cluster)      // Vault balances
queryKeys.vault.holdings(pk, cluster)      // Vault holdings
queryKeys.vault.acls(pk, cluster)          // Vault ACLs
queryKeys.vault.driftUsers(pk, cluster)    // Drift users
queryKeys.vault.stakes(pk, cluster)        // Stake accounts
queryKeys.vault.holders(mint, cluster)     // Token holders

// Global keys
queryKeys.global.allStates(cluster)        // All vault states
queryKeys.global.jupTokens(cluster)        // Jupiter token list
queryKeys.global.driftMarkets(cluster)     // Drift markets

// Wallet keys
queryKeys.wallet.balances(pk, cluster)     // Wallet balances

// Transaction keys
queryKeys.tx.status(signature)             // Transaction status

Invalidation scopes

Helper function for invalidating related queries:
import { getInvalidationKeys, type InvalidationScope } from '@glam/sdk/react';

const scopes: InvalidationScope[] = ['balance', 'acls'];
const keys = getInvalidationKeys(scopes, {
  vaultPk: vault.pubkey.toBase58(),
  walletPk: wallet.publicKey.toBase58(),
  cluster: 'mainnet-beta',
});

// Invalidate all keys
for (const key of keys) {
  queryClient.invalidateQueries({ queryKey: key });
}
Available scopes: 'balance', 'drift', 'acls', 'wallet', 'graph', 'stakes', 'all'

Build docs developers (and LLMs) love