Skip to main content

Wallet Adapters

The SDK uses a WalletAdapter interface to abstract wallet interactions across platforms.

Interface

interface WalletAdapter {
platform: 'web' | 'native';
isConnected(): boolean;
getAddress(): Promise<Address | null>;
connect(): Promise<Address>;
disconnect(): Promise<void>;
sendTransaction(tx: TransactionRequest): Promise<string>;
}

Built-in adapters

WebWalletAdapter

For browser-based apps using injected providers (MetaMask, etc).

import { WebWalletAdapter } from '@arkonix.xyz/arkonix-vault-sdk';

RNWalletAdapter

For React Native apps. Bridges to your mobile wallet library (WalletConnect, Privy, etc).

import { RNWalletAdapter } from '@arkonix.xyz/arkonix-vault-sdk';

Custom adapter

Implement WalletAdapter to integrate with any wallet provider:

import { WalletAdapter, TransactionRequest } from '@arkonix.xyz/arkonix-vault-sdk';

class MyWalletAdapter implements WalletAdapter {
platform = 'web' as const;

isConnected() {
return myWallet.connected;
}

async getAddress() {
return myWallet.address;
}

async connect() {
return myWallet.connect();
}

async disconnect() {
return myWallet.disconnect();
}

async sendTransaction(tx: TransactionRequest) {
return myWallet.sendTransaction({
to: tx.to,
data: tx.data,
value: tx.value,
});
}
}

Usage with wagmi

If you're already using wagmi or RainbowKit, create an adapter that delegates to your existing wallet connection:

import { useWalletClient } from 'wagmi';

function useWagmiAdapter(): WalletAdapter {
const { data: walletClient } = useWalletClient();

return {
platform: 'web',
isConnected: () => !!walletClient,
getAddress: async () => walletClient?.account.address ?? null,
connect: async () => { /* handled by RainbowKit */ },
disconnect: async () => { /* handled by RainbowKit */ },
sendTransaction: async (tx) => {
const hash = await walletClient!.sendTransaction({
to: tx.to,
data: tx.data,
value: tx.value,
});
return hash;
},
};
}