code: func ReadReceipts(db ethdb.Reader, hash common.Hash, number uint64, config *params.ChainConfig) types.Receipts {
  	// We're deriving many fields from the block body, retrieve beside the receipt
  	receipts := ReadRawReceipts(db, hash, number)
  	if receipts == nil {
  		return nil
  	}
  	body := ReadBody(db, hash, number)
  	if body == nil {
  		log.Error("Missing body but have receipt", "hash", hash, "number", number)
  		return nil
  	}
  	if err := receipts.DeriveFields(config, hash, number, body.Transactions); err != nil {
  		log.Error("Failed to derive block receipts fields", "hash", hash, "number", number, "err", err)
  		return nil
  	}
  	return receipts
  }
docs: // ReadReceipts retrieves all the transaction receipts belonging to a block, including
  // its correspoinding metadata fields. If it is unable to populate these metadata
  // fields then nil is returned.
  //
  // The current implementation populates these metadata fields by reading the receipts'
  // corresponding block body, so if the block body is not found it will return nil even
  // if the receipt itself is stored.