code: func (gpo *Oracle) getBlockPrices(ctx context.Context, signer types.Signer, blockNum uint64, ch chan getBlockPricesResult) {
  	block, err := gpo.backend.BlockByNumber(ctx, rpc.BlockNumber(blockNum))
  	if block == nil {
  		ch <- getBlockPricesResult{nil, err}
  		return
  	}
  
  	blockTxs := block.Transactions()
  	txs := make([]*types.Transaction, len(blockTxs))
  	copy(txs, blockTxs)
  	sort.Sort(transactionsByGasPrice(txs))
  
  	for _, tx := range txs {
  		sender, err := types.Sender(signer, tx)
  		if err == nil && sender != block.Coinbase() {
  			ch <- getBlockPricesResult{tx.GasPrice(), nil}
  			return
  		}
  	}
  	ch <- getBlockPricesResult{nil, nil}
  }
docs: // getBlockPrices calculates the lowest transaction gas price in a given block
  // and sends it to the result channel. If the block is empty, price is nil.