After initializing Portal for your user, it’s crucial to determine their wallet’s lifecycle state to ensure a healthy wallet state. We provide several helper methods to easily derive the state of your users’ wallets:
// Checks if the user has created a wallet on any device.
portal.doesWalletExistOrThrow()
// Checks if the user's wallet share is on their current device.
portal.isWalletOnDeviceOrThrow()
// Checks if the user has backed up their wallet.
portal.isWalletBackedUpOrThrow()
// Checks if the user can recover their wallet.
portal.isWalletRecoverableOrThrow()
// Returns a list of available recovery methods based on the user's backups.
portal.availableRecoveryMethods()
The previous methods doesWalletExist(), isWalletOnDevice(), isWalletBackedUp(), and isWalletRecoverable() are deprecated. These methods silently return false when an error occurs, which can mask underlying issues. Use the OrThrow variants above instead — they propagate errors so you can handle them explicitly.
These methods can be used together to understand the user’s wallet state and determine the next steps. For example:
suspend fun manageWalletState(portal: Portal) {
try {
// Determine the wallet's state.
val walletExists = portal.doesWalletExistOrThrow()
val walletExistsOnDevice = portal.isWalletOnDeviceOrThrow()
val walletIsRecoverable = portal.isWalletRecoverableOrThrow()
if (!walletExists) {
// Create and back up the wallet using portal.createWallet() and portal.backup().
} else if (!walletExistsOnDevice) {
if (walletIsRecoverable) {
// Recover the wallet using portal.recover().
} else {
// Inform the user to back up the wallet on the original device.
}
} else {
// The wallet is ready to use.
}
} catch(e: Exception) {
// Handle any errors that occur.
}
}
Each method also accepts an optional chainId parameter (e.g., "eip155:1") or a PortalNamespace to check the state for a specific chain instead of globally.
And that’s it! You’re now helping your users maintain a safe and secure experience with their wallets while using your apps.