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
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