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
}