// Code generated by github.com/fjl/gencodec. DO NOT EDIT.

package types

import (
	"encoding/json"
	"errors"

	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/common/hexutil"
)

var _ = (*logMarshaling)(nil)

// MarshalJSON marshals as JSON.
func (l Log) MarshalJSON() ([]byte, error) {
	type Log struct {
		Address        common.Address `json:"address" gencodec:"required"`
		Topics         []common.Hash  `json:"topics" gencodec:"required"`
		Data           hexutil.Bytes  `json:"data" gencodec:"required"`
		BlockNumber    hexutil.Uint64 `json:"blockNumber" rlp:"-"`
		TxHash         common.Hash    `json:"transactionHash" gencodec:"required" rlp:"-"`
		TxIndex        hexutil.Uint   `json:"transactionIndex" rlp:"-"`
		BlockHash      common.Hash    `json:"blockHash" rlp:"-"`
		BlockTimestamp hexutil.Uint64 `json:"blockTimestamp" rlp:"-"`
		Index          hexutil.Uint   `json:"logIndex" rlp:"-"`
		Removed        bool           `json:"removed" rlp:"-"`
	}
	var enc Log
	enc.Address = l.Address
	enc.Topics = l.Topics
	enc.Data = l.Data
	enc.BlockNumber = hexutil.Uint64(l.BlockNumber)
	enc.TxHash = l.TxHash
	enc.TxIndex = hexutil.Uint(l.TxIndex)
	enc.BlockHash = l.BlockHash
	enc.BlockTimestamp = hexutil.Uint64(l.BlockTimestamp)
	enc.Index = hexutil.Uint(l.Index)
	enc.Removed = l.Removed
	return json.Marshal(&enc)
}

// UnmarshalJSON unmarshals from JSON.
func (l *Log) UnmarshalJSON(input []byte) error {
	type Log struct {
		Address        *common.Address `json:"address" gencodec:"required"`
		Topics         []common.Hash   `json:"topics" gencodec:"required"`
		Data           *hexutil.Bytes  `json:"data" gencodec:"required"`
		BlockNumber    *hexutil.Uint64 `json:"blockNumber" rlp:"-"`
		TxHash         *common.Hash    `json:"transactionHash" gencodec:"required" rlp:"-"`
		TxIndex        *hexutil.Uint   `json:"transactionIndex" rlp:"-"`
		BlockHash      *common.Hash    `json:"blockHash" rlp:"-"`
		BlockTimestamp *hexutil.Uint64 `json:"blockTimestamp" rlp:"-"`
		Index          *hexutil.Uint   `json:"logIndex" rlp:"-"`
		Removed        *bool           `json:"removed" rlp:"-"`
	}
	var dec Log
	if err := json.Unmarshal(input, &dec); err != nil {
		return err
	}
	if dec.Address == nil {
		return errors.New("missing required field 'address' for Log")
	}
	l.Address = *dec.Address
	if dec.Topics == nil {
		return errors.New("missing required field 'topics' for Log")
	}
	l.Topics = dec.Topics
	if dec.Data == nil {
		return errors.New("missing required field 'data' for Log")
	}
	l.Data = *dec.Data
	if dec.BlockNumber != nil {
		l.BlockNumber = uint64(*dec.BlockNumber)
	}
	if dec.TxHash == nil {
		return errors.New("missing required field 'transactionHash' for Log")
	}
	l.TxHash = *dec.TxHash
	if dec.TxIndex != nil {
		l.TxIndex = uint(*dec.TxIndex)
	}
	if dec.BlockHash != nil {
		l.BlockHash = *dec.BlockHash
	}
	if dec.BlockTimestamp != nil {
		l.BlockTimestamp = uint64(*dec.BlockTimestamp)
	}
	if dec.Index != nil {
		l.Index = uint(*dec.Index)
	}
	if dec.Removed != nil {
		l.Removed = *dec.Removed
	}
	return nil
}
