<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def unpack(self, ciphertext: bytes) -> (str, str, str):
 """ 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 """


        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