ready() or refreshSession() settles with wallet.destroyed, and account() and sessionExpiresAt() return to null. Call it on teardown of the view that owns the wallet, so a component that unmounts mid-handshake leaves no promise pending and no frame listener attached.

