Skip to content

useWalletAuth

Authenticate users by connecting their external wallets using Sign-In with Ethereum (SIWE).

Request

type Request = {
  hook: 'useWalletAuth',
  params: [options?: WalletHookOptions]
}
 
type WalletHookOptions = {
  logoutOnError?: boolean
  recoverWalletAutomatically?: boolean
  onSuccess?: (data: WalletHookResult | GenerateSiweMessageResult) => void
  onError?: (error: OpenfortError) => void
  onSettled?: (data: WalletHookResult | GenerateSiweMessageResult | undefined | null, error: OpenfortError | null) => void
  throwOnError?: boolean
}
 
type OpenfortError = {
  message: string
  type: OpenfortErrorType
  data: { [key: string]: any }
  name: string
}
 
enum OpenfortErrorType {
  AUTHENTICATION_ERROR = "AUTHENTICATION_ERROR",
  WALLET_ERROR = "WALLET_ERROR",
  CONFIGURATION_ERROR = "CONFIGURATION_ERROR",
  VALIDATION_ERROR = "VALIDATION_ERROR",
}

Response

type Response = UseWalletAuthReturn
 
type UseWalletAuthReturn = WalletAuthStatusFlags & {
  generateSiweMessage(options: GenerateSiweMessageOptions): Promise<GenerateSiweMessageResult>
  signInWithSiwe(options: SiweOptions): Promise<WalletHookResult>
  linkSiwe(options: LinkSiweOptions): Promise<WalletHookResult>
}
 
type WalletAuthStatusFlags = {
  isLoading: boolean
  isError: boolean
  isSuccess: boolean
  error?: OpenfortError | null
  isAwaitingSignature: boolean
  isGeneratingMessage: boolean
  isSubmittingSignature: boolean
}
 
type WalletHookResult = {
  error?: OpenfortError
  user?: AuthPlayerResponse
}
 
type GenerateSiweMessageResult = {
  error?: OpenfortError
  message?: string
}
 
type GenerateSiweMessageOptions = {
  wallet: string
  from: {
    domain: string
    uri: string
  }
  onSuccess?: (data: GenerateSiweMessageResult) => void
  onError?: (error: OpenfortError) => void
  onSettled?: (data: GenerateSiweMessageResult | undefined | null, error: OpenfortError | null) => void
  throwOnError?: boolean
}
 
type SiweOptions = {
  walletAddress: string
  signature: string
  messageOverride?: string
  onSuccess?: (data: WalletHookResult) => void
  onError?: (error: OpenfortError) => void
  onSettled?: (data: WalletHookResult | undefined | null, error: OpenfortError | null) => void
  throwOnError?: boolean
  logoutOnError?: boolean
  recoverWalletAutomatically?: boolean
}
 
type LinkSiweOptions = SiweOptions
 
type AuthPlayerResponse = {
  player?: {
    id: string
    object: 'player'
    name: string
    description?: string
    createdAt: number
    metadata?: { [key: string]: any }
    transactionIntents?: any[]
    accounts?: any[]
  }
  id: string
  object: 'player'
  createdAt: number
  linkedAccounts: LinkedAccount[]
}
 
type LinkedAccount = {
  provider: string
  email?: string
  address?: string
  externalUserId?: string
  verified?: boolean
  disabled: boolean
  walletClientType?: string
  connectorType?: string
  updatedAt?: number
  metadata?: { [key: string]: any }
}

Example

import { useWalletAuth } from "@openfort/react-native"
 
function SiweFlow({ walletAddress }: { walletAddress: string }) {
  const {
    generateSiweMessage,
    signInWithSiwe,
    linkSiwe,
    isGeneratingMessage,
    isAwaitingSignature,
    isSubmittingSignature,
    isLoading,
    isError,
    isSuccess,
    error,
  } = useWalletAuth({
    throwOnError: true,
    onSuccess: () => {},
    onError: () => {},
    onSettled: () => {}
  })
 
  const startLogin = async () => {
    const { message } = await generateSiweMessage({
      wallet: walletAddress,
      from: {
        domain: 'example.com',
        uri: 'https://example.com',
      },
    })
    if (!message) return
    const signature = await signMessageWithWallet(message) // custom helper
    await signInWithSiwe({ walletAddress, signature, messageOverride: message })
  }
 
  return null
}