code: func parseChainTxNtfnParams(params []json.RawMessage) (*btcutil.Tx,
  	*btcjson.BlockDetails, error) {
  
  	if len(params) == 0 || len(params) > 2 {
  		return nil, nil, wrongNumParams(len(params))
  	}
  
  	// Unmarshal first parameter as a string.
  	var txHex string
  	err := json.Unmarshal(params[0], &txHex)
  	if err != nil {
  		return nil, nil, err
  	}
  
  	// If present, unmarshal second optional parameter as the block details
  	// JSON object.
  	var block *btcjson.BlockDetails
  	if len(params) > 1 {
  		err = json.Unmarshal(params[1], &block)
  		if err != nil {
  			return nil, nil, err
  		}
  	}
  
  	// Hex decode and deserialize the transaction.
  	serializedTx, err := hex.DecodeString(txHex)
  	if err != nil {
  		return nil, nil, err
  	}
  	var msgTx wire.MsgTx
  	err = msgTx.Deserialize(bytes.NewReader(serializedTx))
  	if err != nil {
  		return nil, nil, err
  	}
  
  	// TODO: Change recvtx and redeemingtx callback signatures to use
  	// nicer types for details about the block (block hash as a
  	// chainhash.Hash, block time as a time.Time, etc.).
  	return btcutil.NewTx(&msgTx), block, nil
  }
docs: // parseChainTxNtfnParams parses out the transaction and optional details about
  // the block it's mined in from the parameters of recvtx and redeemingtx
  // notifications.