Skip to main content

React Example

import { useWallet } from '@hermis/solana-headless-react';

function ConnectButton() {
  const { connect, disconnect, connected, connecting, wallet, publicKey } = useWallet();

  if (connected) {
    return (
      <div>
        <p>Connected to {wallet?.adapter.name}</p>
        <p>{publicKey?.toBase58()}</p>
        <button onClick={disconnect}>Disconnect</button>
      </div>
    );
  }

  return (
    <button onClick={connect} disabled={connecting}>
      {connecting ? 'Connecting...' : 'Connect Wallet'}
    </button>
  );
}

With Wallet Selection

import { useWallet, useWalletAdapters } from '@hermis/solana-headless-react';

function WalletSelector() {
  const { select, connect } = useWallet();
  const { installed } = useWalletAdapters();

  return (
    <div>
      {installed.map(adapter => (
        <button
          key={adapter.name}
          onClick={async () => {
            select(adapter.name);
            await connect();
          }}
        >
          {adapter.icon && <img src={adapter.icon} width={20} />}
          {adapter.name}
        </button>
      ))}
    </div>
  );
}

Vanilla JavaScript

import { WalletAdapterManager, getStandardWalletAdapters } from '@hermis/solana-headless-adapter-base';

// Auto-detect wallet-standard compatible wallets
const wallets = []; // Add custom wallet adapters here if needed
const adapters = getStandardWalletAdapters(wallets);
const manager = new WalletAdapterManager(adapters);

manager.on('connect', (publicKey) => {
  console.log('Connected:', publicKey.toBase58());
});

// Connect
manager.selectAdapter('Phantom');
await manager.connect();

Error Handling

const handleConnect = async () => {
  try {
    await connect();
  } catch (error) {
    if (error.code === 4001) {
      console.log('User rejected connection');
    } else if (error.message.includes('not installed')) {
      alert('Please install the wallet extension');
    } else {
      console.error('Connection failed:', error);
    }
  }
};

Auto-Connect

<HermisProvider autoConnect={true}>
  {children}
</HermisProvider>

Accessing Kit Signers

After connecting a wallet, you can access Kit-compatible signers for @solana/kit operations:
import { useWallet, useConnection } from '@hermis/solana-headless-react';
import { createKitSignersFromAdapter } from '@hermis/solana-headless-adapter-base';
import { useEffect, useState } from 'react';

function KitSignerInfo() {
  const { wallet, connected, addressString } = useWallet();
  const { connection } = useConnection();
  const [signerInfo, setSignerInfo] = useState<string>('');

  useEffect(() => {
    if (connected && wallet) {
      // Create Kit signers from connected wallet adapter
      const { address, messageSigner, transactionSigner } = createKitSignersFromAdapter(
        wallet.adapter,
        connection
      );

      const info = `
        Kit Address: ${address}
        Message Signer: ${messageSigner ? 'Available' : 'Not supported'}
        Transaction Signer: ${transactionSigner ? 'Available' : 'Not supported'}
      `;
      setSignerInfo(info);
    } else {
      setSignerInfo('Not connected');
    }
  }, [connected, wallet, connection]);

  return (
    <div>
      <h3>Kit Signer Status</h3>
      <pre>{signerInfo}</pre>
    </div>
  );
}
What are Kit Signers?
  • messageSigner - Sign messages using Kit’s MessageModifyingSigner interface
  • transactionSigner - Sign and send transactions using Kit’s TransactionSendingSigner interface
  • address - Kit Address type (base58 string compatible with Kit functions)
  • addressString - Plain string representation of the address
When to use Kit Signers:
  • Building with @solana/kit architecture
  • Using Kit-native programs and instructions
  • Need type-safe signer interfaces
  • Want to integrate with Kit ecosystem libraries