code: func (api *PublicFilterAPI) GetFilterLogs(ctx context.Context, id rpc.ID) ([]*types.Log, error) {
  	api.filtersMu.Lock()
  	f, found := api.filters[id]
  	api.filtersMu.Unlock()
  
  	if !found || f.typ != LogsSubscription {
  		return nil, fmt.Errorf("filter not found")
  	}
  
  	var filter *Filter
  	if f.crit.BlockHash != nil {
  		// Block filter requested, construct a single-shot filter
  		filter = NewBlockFilter(api.backend, *f.crit.BlockHash, f.crit.Addresses, f.crit.Topics)
  	} else {
  		// Convert the RPC block numbers into internal representations
  		begin := rpc.LatestBlockNumber.Int64()
  		if f.crit.FromBlock != nil {
  			begin = f.crit.FromBlock.Int64()
  		}
  		end := rpc.LatestBlockNumber.Int64()
  		if f.crit.ToBlock != nil {
  			end = f.crit.ToBlock.Int64()
  		}
  		// Construct the range filter
  		filter = NewRangeFilter(api.backend, begin, end, f.crit.Addresses, f.crit.Topics)
  	}
  	// Run the filter and return all the logs
  	logs, err := filter.Logs(ctx)
  	if err != nil {
  		return nil, err
  	}
  	return returnLogs(logs), nil
  }
docs: // GetFilterLogs returns the logs for the filter with the given id.
  // If the filter could not be found an empty array of logs is returned.
  //
  // https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getfilterlogs