code: async def unpack(self, ciphertext: bytes) -> (str, str, str):
          
  
          LOGGER.debug('Wallet.unpack >>> ciphertext: %s', ciphertext)
  
          if not ciphertext:
              LOGGER.debug('Wallet.pack <!< No ciphertext to unpack')
              raise AbsentMessage('No ciphertext to unpack')
  
          try:
              unpacked = json.loads(await crypto.unpack_message(self.handle, ciphertext))
          except IndyError as x_indy:
              if x_indy.error_code == ErrorCode.WalletItemNotFound:
                  LOGGER.debug('Wallet.unpack <!< Wallet %s has no local key to unpack ciphertext', self.name)
                  raise AbsentRecord('Wallet {} has no local key to unpack ciphertext'.format(self.name))
              LOGGER.debug('Wallet.unpack <!< Wallet %s unpack() raised indy error code {}', x_indy.error_code)
              raise
  
          rv = (unpacked['message'], unpacked.get('sender_verkey', None), unpacked.get('recipient_verkey', None))
          LOGGER.debug('Wallet.unpack <<< %s', rv)
          return rv
docs: Unpack a message. Return triple with cleartext, sender verification key, and recipient verification key.
          Raise AbsentMessage for missing ciphertext, or WalletState if wallet is closed. Raise AbsentRecord
          if wallet has no key to unpack ciphertext.
  
          :param ciphertext: JWE-like formatted message as pack() produces
          :return: cleartext, sender verification key, recipient verification key