docs: async def open(self) -> 'Wallet':
          """
          Explicit entry. Open wallet as configured, for later closure via close().
          For use when keeping wallet open across multiple calls.
  
          Raise any IndyError causing failure to open wallet, WalletState if wallet already open,
          or AbsentWallet on attempt to enter wallet not yet created.
  
          :return: current object
          """
  
          LOGGER.debug('Wallet.open >>>')
  
          created = False
          while True:
              try:
                  self._handle = await wallet.open_wallet(
                      json.dumps(self.config),
                      json.dumps(self.access_creds))
                  LOGGER.info('Opened wallet %s on handle %s', self.name, self.handle)
                  break
              except IndyError as x_indy:
                  if x_indy.error_code == ErrorCode.WalletNotFoundError:
                      if created:
                          LOGGER.debug('Wallet.open() <!< Wallet %s not found after creation', self.name)
                          raise AbsentWallet('Wallet {} not found after creation'.format(self.name))
                      if self.auto_create:
                          await self.create()
                          continue
                      else:
                          LOGGER.debug('Wallet.open() <!< Wallet %s not found', self.name)
                          raise AbsentWallet('Wallet {} not found'.format(self.name))
                  elif x_indy.error_code == ErrorCode.WalletAlreadyOpenedError:
                      LOGGER.debug('Wallet.open() <!< Wallet %s is already open', self.name)
                      raise WalletState('Wallet {} is already open'.format(self.name))
                  elif x_indy.error_code == ErrorCode.WalletAccessFailed:
                      LOGGER.debug('Wallet.open() <!< Bad access credentials value for wallet %s', self.name)
                      raise BadAccess('Bad access credentials value for wallet {}'.format(self.name))
  
                  LOGGER.debug('Wallet %s open raised indy error %s', self.name, x_indy.error_code)
                  raise
  
          self.did = await self.get_anchor_did()
          self.verkey = await did.key_for_local_did(self.handle, self.did) if self.did else None
          LOGGER.info('Wallet %s got verkey %s for existing DID %s', self.name, self.verkey, self.did)
  
          LOGGER.debug('Wallet.open <<<')
          return self