package common import ( "encoding/binary" "fmt" "math/big" ethCommon "github.com/ethereum/go-ethereum/common" "github.com/hermeznetwork/tracerr" ) const batchNumBytesLen = 8 // Batch is a struct that represents Hermez network batch type Batch struct { BatchNum BatchNum `meddler:"batch_num"` // Ethereum block in which the batch is forged EthBlockNum int64 `meddler:"eth_block_num"` ForgerAddr ethCommon.Address `meddler:"forger_addr"` CollectedFees map[TokenID]*big.Int `meddler:"fees_collected,json"` FeeIdxsCoordinator []Idx `meddler:"fee_idxs_coordinator,json"` StateRoot *big.Int `meddler:"state_root,bigint"` NumAccounts int `meddler:"num_accounts"` LastIdx int64 `meddler:"last_idx"` ExitRoot *big.Int `meddler:"exit_root,bigint"` // ForgeL1TxsNum is optional, Only when the batch forges L1 txs. Identifier that corresponds // to the group of L1 txs forged in the current batch. ForgeL1TxsNum *int64 `meddler:"forge_l1_txs_num"` SlotNum int64 `meddler:"slot_num"` // Slot in which the batch is forged TotalFeesUSD *float64 `meddler:"total_fees_usd"` } // NewEmptyBatch creates a new empty batch func NewEmptyBatch() *Batch { return &Batch{ BatchNum: 0, EthBlockNum: 0, ForgerAddr: ethCommon.Address{}, CollectedFees: make(map[TokenID]*big.Int), FeeIdxsCoordinator: make([]Idx, 0), StateRoot: big.NewInt(0), NumAccounts: 0, LastIdx: 0, ExitRoot: big.NewInt(0), ForgeL1TxsNum: nil, SlotNum: 0, TotalFeesUSD: nil, } } // BatchNum identifies a batch type BatchNum int64 // Bytes returns a byte array of length 4 representing the BatchNum func (bn BatchNum) Bytes() []byte { var batchNumBytes [batchNumBytesLen]byte binary.BigEndian.PutUint64(batchNumBytes[:], uint64(bn)) return batchNumBytes[:] } // BigInt returns a *big.Int representing the BatchNum func (bn BatchNum) BigInt() *big.Int { return big.NewInt(int64(bn)) } // BatchNumFromBytes returns BatchNum from a []byte func BatchNumFromBytes(b []byte) (BatchNum, error) { if len(b) != batchNumBytesLen { return 0, tracerr.Wrap(fmt.Errorf("can not parse BatchNumFromBytes, bytes len %d, expected %d", len(b), batchNumBytesLen)) } batchNum := binary.BigEndian.Uint64(b[:batchNumBytesLen]) return BatchNum(batchNum), nil } // BatchData contains the information of a Batch type BatchData struct { L1Batch bool // TODO: Remove once Batch.ForgeL1TxsNum is a pointer // L1UserTxs that were forged in the batch L1UserTxs []L1Tx L1CoordinatorTxs []L1Tx L2Txs []L2Tx CreatedAccounts []Account UpdatedAccounts []AccountUpdate ExitTree []ExitInfo Batch Batch } // NewBatchData creates an empty BatchData with the slices initialized. func NewBatchData() *BatchData { return &BatchData{ L1Batch: false, // L1UserTxs: make([]common.L1Tx, 0), L1CoordinatorTxs: make([]L1Tx, 0), L2Txs: make([]L2Tx, 0), CreatedAccounts: make([]Account, 0), ExitTree: make([]ExitInfo, 0), Batch: Batch{}, } }