diff --git a/txprocessor/txprocessor.go b/txprocessor/txprocessor.go index 7e5fcee..69e5c4c 100644 --- a/txprocessor/txprocessor.go +++ b/txprocessor/txprocessor.go @@ -328,7 +328,8 @@ func (tp *TxProcessor) ProcessTxs(coordIdxs []common.Idx, l1usertxs, l1coordinat if i < int(tp.config.MaxTx)-1 { tp.zki.ISOutIdx[i] = tp.s.CurrentIdx().BigInt() tp.zki.ISStateRoot[i] = tp.s.MT.Root().BigInt() - tp.zki.ISAccFeeOut[i] = formatAccumulatedFees(collectedFees, tp.zki.FeePlanTokens, coordIdxs) + tp.zki.ISAccFeeOut[i] = formatAccumulatedFees(collectedFees, + tp.zki.FeePlanTokens, coordIdxs) tp.zki.ISExitRoot[i] = exitTree.Root().BigInt() } if i >= tp.i { @@ -396,6 +397,7 @@ func (tp *TxProcessor) ProcessTxs(coordIdxs []common.Idx, l1usertxs, l1coordinat // once all txs processed (exitTree root frozen), for each Exit, // generate common.ExitInfo data var exitInfos []common.ExitInfo + exitInfosByIdx := make(map[common.Idx]*common.ExitInfo) for i := 0; i < nTx; i++ { if !exits[i].exit { continue @@ -415,7 +417,12 @@ func (tp *TxProcessor) ProcessTxs(coordIdxs []common.Idx, l1usertxs, l1coordinat MerkleProof: p, Balance: exitAccount.Balance, } - exitInfos = append(exitInfos, ei) + if prevExit, ok := exitInfosByIdx[exitIdx]; !ok { + exitInfos = append(exitInfos, ei) + exitInfosByIdx[exitIdx] = &exitInfos[len(exitInfos)-1] + } else { + *prevExit = ei + } } if tp.s.Typ == statedb.TypeSynchronizer { diff --git a/txprocessor/txprocessor_test.go b/txprocessor/txprocessor_test.go index 931a4e9..4ca07e9 100644 --- a/txprocessor/txprocessor_test.go +++ b/txprocessor/txprocessor_test.go @@ -3,7 +3,6 @@ package txprocessor import ( "encoding/binary" "encoding/hex" - "fmt" "io/ioutil" "math/big" "os" @@ -463,7 +462,7 @@ func TestProcessTxsSynchronizer(t *testing.T) { blocks[1].Rollup.Batches[1].L1CoordinatorTxs, l2Txs) require.NoError(t, err) - assert.Equal(t, 2, len(ptOut.ExitInfos)) // 2, as previous batch was without L1UserTxs, and has pending the 'ForceExit(1) A: 5' + assert.Equal(t, 1, len(ptOut.ExitInfos)) // 1, as previous batch was without L1UserTxs, and has pending the 'ForceExit(1) A: 5', and the 2 exit transactions get grouped under 1 ExitInfo assert.Equal(t, 1, len(ptOut.CreatedAccounts)) assert.Equal(t, 4, len(ptOut.CollectedFees)) assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(0)].String()) @@ -842,10 +841,8 @@ func TestTwoExits(t *testing.T) { ptOuts := []*ProcessTxOutput{} for _, block := range blocks { for _, batch := range block.Rollup.Batches { - // fmt.Printf("Batch %v\n%#v\n", batch.Batch.BatchNum, batch.L1UserTxs) ptOut, err := tp.ProcessTxs(nil, batch.L1UserTxs, nil, nil) require.NoError(t, err) - fmt.Printf("Exits (batch %v)\n%#v\n", batch.Batch.BatchNum, ptOut.ExitInfos) ptOuts = append(ptOuts, ptOut) } }