code: func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]interface{}) (chan types.Log, event.Subscription, error) {
  	// Don't crash on a lazy user
  	if opts == nil {
  		opts = new(WatchOpts)
  	}
  	// Append the event selector to the query parameters and construct the topic set
  	query = append([][]interface{}{{c.abi.Events[name].Id()}}, query...)
  
  	topics, err := makeTopics(query...)
  	if err != nil {
  		return nil, nil, err
  	}
  	// Start the background filtering
  	logs := make(chan types.Log, 128)
  
  	config := ethereum.FilterQuery{
  		Addresses: []common.Address{c.address},
  		Topics:    topics,
  	}
  	if opts.Start != nil {
  		config.FromBlock = new(big.Int).SetUint64(*opts.Start)
  	}
  	sub, err := c.filterer.SubscribeFilterLogs(ensureContext(opts.Context), config, logs)
  	if err != nil {
  		return nil, nil, err
  	}
  	return logs, sub, nil
  }
docs: // WatchLogs filters subscribes to contract logs for future blocks, returning a
  // subscription object that can be used to tear down the watcher.