code: func (s *Store) ListInstalledChaincodes() ([]chaincode.InstalledChaincode, error) {
  	files, err := s.ReadWriter.ReadDir(s.Path)
  	if err != nil {
  		return nil, errors.Wrapf(err, "error reading chaincode directory at %s", s.Path)
  	}
  
  	installedChaincodes := []chaincode.InstalledChaincode{}
  	for _, file := range files {
  		if strings.HasSuffix(file.Name(), ".json") {
  			metadataPath := filepath.Join(s.Path, file.Name())
  			ccName, ccVersion, err := s.LoadMetadata(metadataPath)
  			if err != nil {
  				logger.Warning(err.Error())
  				continue
  			}
  
  			// split the file name and get just the hash
  			hashString := strings.Split(file.Name(), ".")[0]
  			hash, err := hex.DecodeString(hashString)
  			if err != nil {
  				return nil, errors.Wrapf(err, "error decoding hash from hex string: %s", hashString)
  			}
  			installedChaincode := chaincode.InstalledChaincode{
  				Name:    ccName,
  				Version: ccVersion,
  				Id:      hash,
  			}
  			installedChaincodes = append(installedChaincodes, installedChaincode)
  		}
  	}
  	return installedChaincodes, nil
  }
docs: // ListInstalledChaincodes returns an array with information about the
  // chaincodes installed in the persistence store