code: async def create_signing_key(self, seed: str = None, metadata: dict = None) -> KeyInfo:
          
  
          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
docs: 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