code: func (b *batchSpendReporter) ProcessBlock(blk *wire.MsgBlock,
  	newReqs []*GetUtxoRequest, height uint32) {
  
  	// If any requests want the UTXOs at this height, scan the block to find
  	// the original outputs that might be spent from.
  	if len(newReqs) > 0 {
  		b.addNewRequests(newReqs)
  		b.findInitialTransactions(blk, newReqs, height)
  	}
  
  	// Next, filter the block for any spends using the current set of
  	// watched outpoints. This will include any new requests added above.
  	spends := b.notifySpends(blk, height)
  
  	// Finally, rebuild filter entries from cached entries remaining in
  	// outpoints map. This will provide an updated watchlist used to scan
  	// the subsequent filters.
  	rebuildWatchlist := len(newReqs) > 0 || len(spends) > 0
  	if rebuildWatchlist {
  		b.filterEntries = b.filterEntries[:0]
  		for _, entry := range b.outpoints {
  			b.filterEntries = append(b.filterEntries, entry)
  		}
  	}
  }
docs: // ProcessBlock accepts a block, block height, and any new requests whose start
  // height matches the provided height. If a non-zero number of new requests are
  // presented, the block will first be checked for the initial outputs from which
  // spends may occur. Afterwards, any spends detected in the block are
  // immediately dispatched, and the watchlist updated in preparation of filtering
  // the next block.