<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 create_signing_key(self, seed: str = None, metadata: dict = None) -> KeyInfo: """ Create a new signing key pair. Raise WalletState if wallet is closed, ExtantRecord if verification key already exists. :param seed: optional seed allowing deterministic key creation :param metadata: optional metadata to store with key pair :return: KeyInfo for new key pair """


        LOGGER.debug('Wallet.create_signing_key >>> seed: [SEED], metadata: %s', metadata)

        if not self.handle:
            LOGGER.debug('Wallet.create_signing_key <!< Wallet %s is closed', self.name)
            raise WalletState('Wallet {} is closed'.format(self.name))

        try:
            verkey = await crypto.create_key(self.handle, json.dumps({'seed': seed} if seed else {}))
        except IndyError as x_indy:
            if x_indy.error_code == ErrorCode.WalletItemAlreadyExists:
                LOGGER.debug('Wallet.create_signing_key <!< Verification key already present in wallet %s', self.name)
                raise ExtantRecord('Verification key already present in wallet {}'.format(self.name))
            LOGGER.debug('Wallet.create_signing_key <!< indy-sdk raised error %s', x_indy.error_code)
            raise

        await crypto.set_key_metadata(self.handle, verkey, json.dumps(metadata or {}))  # coerce None to empty

        rv = KeyInfo(verkey, metadata or {})
        LOGGER.debug('Wallet.create_signing_key <<< %s', rv)
        return rv