Function Signature
public func isWalletRecoverable(
    _ forChainId: String? = nil
) async throws -> Bool
Parameters
  • forChainId: Optional CAIP-2 chain identifier (e.g., “eip155:1” for Ethereum mainnet, “solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp” for Solana mainnet). If nil, checks recovery options across all chains.
Returns A boolean value indicating whether the wallet can be recovered:
  • Returns true if at least one completed backup method is available
  • Returns false if no completed backup methods are found
Throws
  • PortalClassError.clientNotAvailable if the client is not initialized
  • PortalClassError.unsupportedChainId if the chain’s namespace is not supported
  • PortalClassError.noWalletFoundForChain if no wallet exists for the specified chain
Example Usage
// Check if any wallet is recoverable
do {
    let isRecoverable = try await portal.isWalletRecoverable()
    if isRecoverable {
        print("Wallet can be recovered")
    } else {
        print("No recovery methods available")
    }
} catch {
    print("Error checking recovery status: \(error)")
}

// Check specific chain wallet recovery
do {
    // Check Ethereum wallet
    let ethRecoverable = try await portal.isWalletRecoverable("eip155:1")
    if ethRecoverable {
        print("Ethereum wallet can be recovered")
    }

    // Check Solana wallet
    let solRecoverable = try await portal.isWalletRecoverable("solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp")
    if solRecoverable {
        print("Solana wallet can be recovered")
    }
} catch {
    print("Error checking chain-specific recovery: \(error)")
}

// Complete example with recovery flow
do {
    if try await portal.isWalletRecoverable() {
        // Get available recovery methods
        let methods = try await portal.availableRecoveryMethods()

        // Try each available method
        for method in methods {
            do {
                let recovered = try await portal.recoverWallet(method) { status in
                    print("Recovery status: \(status)")
                }
                print("Successfully recovered wallet using \(method)")
                print("Ethereum address: \(recovered.ethereum)")
                if let solanaAddress = recovered.solana {
                    print("Solana address: \(solanaAddress)")
                }
                break // Exit after successful recovery
            } catch {
                print("Failed to recover using \(method): \(error)")
                continue // Try next method
            }
        }
    } else {
        print("No recovery methods available, need to create new wallet")
        let newWallet = try await portal.createWallet()
        print("Created new wallet")
    }
} catch {
    print("Error in recovery process: \(error)")
}
Implementation Notes
  • This method uses availableRecoveryMethods() internally to determine if any completed backup methods exist
  • Only considers backup methods that have been fully completed and verified
  • Useful for determining whether to show recovery options to users
  • Should be checked before attempting wallet recovery
Usage in App Flow
  1. Initial Setup Check:
    func checkWalletStatus() async {
        if try await portal.isWalletOnDevice() {
            showMainInterface()
        } else if try await portal.isWalletRecoverable() {
            showRecoveryInterface()
        } else {
            showCreateWalletInterface()
        }
    }
    
  2. Recovery Process:
    func handleRecovery() async {
        guard try await portal.isWalletRecoverable() else {
            throw WalletError.notRecoverable
        }
    
        let methods = try await portal.availableRecoveryMethods()
        showRecoveryOptions(methods)
    }
    
Related Documentation For more information about wallet recovery, see: