code: func createCoinbaseTx(params *chaincfg.Params, coinbaseScript []byte, nextBlockHeight int32, addr btcutil.Address) (*btcutil.Tx, error) {
  	// Create the script to pay to the provided payment address if one was
  	// specified.  Otherwise create a script that allows the coinbase to be
  	// redeemable by anyone.
  	var pkScript []byte
  	if addr != nil {
  		var err error
  		pkScript, err = txscript.PayToAddrScript(addr)
  		if err != nil {
  			return nil, err
  		}
  	} else {
  		var err error
  		scriptBuilder := txscript.NewScriptBuilder()
  		pkScript, err = scriptBuilder.AddOp(txscript.OP_TRUE).Script()
  		if err != nil {
  			return nil, err
  		}
  	}
  
  	tx := wire.NewMsgTx(wire.TxVersion)
  	tx.AddTxIn(&wire.TxIn{
  		// Coinbase transactions have no inputs, so previous outpoint is
  		// zero hash and max index.
  		PreviousOutPoint: *wire.NewOutPoint(&chainhash.Hash{},
  			wire.MaxPrevOutIndex),
  		SignatureScript: coinbaseScript,
  		Sequence:        wire.MaxTxInSequenceNum,
  	})
  	tx.AddTxOut(&wire.TxOut{
  		Value:    blockchain.CalcBlockSubsidy(nextBlockHeight, params),
  		PkScript: pkScript,
  	})
  	return btcutil.NewTx(tx), nil
  }
docs: // createCoinbaseTx returns a coinbase transaction paying an appropriate subsidy
  // based on the passed block height to the provided address.  When the address
  // is nil, the coinbase transaction will instead be redeemable by anyone.
  //
  // See the comment for NewBlockTemplate for more information about why the nil
  // address handling is useful.