code: func (p *DeployedCCInfoProvider) UpdatedChaincodes(stateUpdates map[string][]*kvrwset.KVWrite) ([]*ledger.ChaincodeLifecycleInfo, error) {
  	lsccUpdates := stateUpdates[lsccNamespace]
  	lifecycleInfo := []*ledger.ChaincodeLifecycleInfo{}
  	updatedCCNames := map[string]bool{}
  
  	for _, kvWrite := range lsccUpdates {
  		if kvWrite.IsDelete {
  			// lscc namespace is not expected to have deletes
  			continue
  		}
  		// There are LSCC entries for the chaincode and for the chaincode collections.
  		// We can detect collections based on the presence of a CollectionSeparator,
  		// which never exists in chaincode names.
  		if privdata.IsCollectionConfigKey(kvWrite.Key) {
  			ccname := privdata.GetCCNameFromCollectionConfigKey(kvWrite.Key)
  			updatedCCNames[ccname] = true
  			continue
  		}
  		updatedCCNames[kvWrite.Key] = true
  	}
  
  	for updatedCCNames := range updatedCCNames {
  		lifecycleInfo = append(lifecycleInfo, &ledger.ChaincodeLifecycleInfo{Name: updatedCCNames})
  	}
  	return lifecycleInfo, nil
  }
docs: // UpdatedChaincodes implements function in interface ledger.DeployedChaincodeInfoProvider