|
|
@ -378,3 +378,107 @@ func TestGetL2TxSelectionMinimumFlow0(t *testing.T) { |
|
|
|
err = txsel.l2db.StartForging(common.TxIDsFromPoolL2Txs(poolL2Txs), txsel.localAccountsDB.CurrentBatch()) |
|
|
|
require.NoError(t, err) |
|
|
|
} |
|
|
|
|
|
|
|
func TestPoolL2TxsWithoutEnoughBalance(t *testing.T) { |
|
|
|
set := ` |
|
|
|
Type: Blockchain |
|
|
|
|
|
|
|
CreateAccountDeposit(0) Coord: 0 |
|
|
|
CreateAccountDeposit(0) A: 100 |
|
|
|
CreateAccountDeposit(0) B: 100 |
|
|
|
|
|
|
|
> batchL1 // freeze L1User{1}
|
|
|
|
> batchL1 // forge L1User{1}
|
|
|
|
> block |
|
|
|
` |
|
|
|
|
|
|
|
chainID := uint16(0) |
|
|
|
tc := til.NewContext(chainID, common.RollupConstMaxL1UserTx) |
|
|
|
// generate test transactions, the L1CoordinatorTxs generated by Til
|
|
|
|
// will be ignored at this test, as will be the TxSelector who
|
|
|
|
// generates them when needed
|
|
|
|
blocks, err := tc.GenerateBlocks(set) |
|
|
|
assert.NoError(t, err) |
|
|
|
|
|
|
|
hermezContractAddr := ethCommon.HexToAddress("0xc344E203a046Da13b0B4467EB7B3629D0C99F6E6") |
|
|
|
txsel := initTest(t, chainID, hermezContractAddr, tc.Users["Coord"]) |
|
|
|
|
|
|
|
// restart nonces of TilContext, as will be set by generating directly
|
|
|
|
// the PoolL2Txs for each specific batch with tc.GeneratePoolL2Txs
|
|
|
|
tc.RestartNonces() |
|
|
|
|
|
|
|
tpc := txprocessor.Config{ |
|
|
|
NLevels: 16, |
|
|
|
MaxFeeTx: 10, |
|
|
|
MaxTx: 20, |
|
|
|
MaxL1Tx: 10, |
|
|
|
ChainID: chainID, |
|
|
|
} |
|
|
|
selectionConfig := &SelectionConfig{ |
|
|
|
MaxL1UserTxs: 5, |
|
|
|
TxProcessorConfig: tpc, |
|
|
|
} |
|
|
|
// batch1
|
|
|
|
l1UserTxs := []common.L1Tx{} |
|
|
|
_, _, _, _, _, err = txsel.GetL1L2TxSelection(selectionConfig, l1UserTxs) |
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
// batch2
|
|
|
|
// prepare the PoolL2Txs
|
|
|
|
batchPoolL2 := ` |
|
|
|
Type: PoolL2 |
|
|
|
PoolTransferToEthAddr(0) A-B: 100 (126) |
|
|
|
PoolExit(0) B: 100 (126)` |
|
|
|
poolL2Txs, err := tc.GeneratePoolL2Txs(batchPoolL2) |
|
|
|
require.NoError(t, err) |
|
|
|
// add the PoolL2Txs to the l2DB
|
|
|
|
addL2Txs(t, txsel, poolL2Txs) |
|
|
|
|
|
|
|
l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[0].Rollup.Batches[1].Batch.ForgeL1TxsNum]) |
|
|
|
_, _, oL1UserTxs, oL1CoordTxs, oL2Txs, err := txsel.GetL1L2TxSelection(selectionConfig, l1UserTxs) |
|
|
|
require.NoError(t, err) |
|
|
|
assert.Equal(t, 3, len(oL1UserTxs)) |
|
|
|
assert.Equal(t, 0, len(oL1CoordTxs)) |
|
|
|
assert.Equal(t, 0, len(oL2Txs)) // should be 0 as the 2 PoolL2Txs does not have enough funds
|
|
|
|
err = txsel.l2db.StartForging(common.TxIDsFromPoolL2Txs(oL2Txs), txsel.localAccountsDB.CurrentBatch()) |
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
// as the PoolL2Txs have not been really processed, restart nonces
|
|
|
|
tc.RestartNonces() |
|
|
|
|
|
|
|
// batch3
|
|
|
|
// NOTE: this batch will result with 1 L2Tx, as the PoolExit tx is not
|
|
|
|
// possible, as the PoolTransferToEthAddr is not processed yet when
|
|
|
|
// checking availability of PoolExit. This, in a near-future iteration
|
|
|
|
// of the TxSelector will return the 2 transactions as valid and
|
|
|
|
// selected, as the TxSelector will handle this kind of combinations.
|
|
|
|
batchPoolL2 = ` |
|
|
|
Type: PoolL2 |
|
|
|
PoolTransferToEthAddr(0) A-B: 50 (126)` |
|
|
|
poolL2Txs, err = tc.GeneratePoolL2Txs(batchPoolL2) |
|
|
|
require.NoError(t, err) |
|
|
|
addL2Txs(t, txsel, poolL2Txs) |
|
|
|
|
|
|
|
l1UserTxs = []common.L1Tx{} |
|
|
|
_, _, oL1UserTxs, oL1CoordTxs, oL2Txs, err = txsel.GetL1L2TxSelection(selectionConfig, l1UserTxs) |
|
|
|
require.NoError(t, err) |
|
|
|
assert.Equal(t, 0, len(oL1UserTxs)) |
|
|
|
assert.Equal(t, 0, len(oL1CoordTxs)) |
|
|
|
assert.Equal(t, 1, len(oL2Txs)) // see 'NOTE' at the beginning of 'batch3' of this test
|
|
|
|
assert.Equal(t, common.TxTypeTransferToEthAddr, oL2Txs[0].Type) |
|
|
|
err = txsel.l2db.StartForging(common.TxIDsFromPoolL2Txs(oL2Txs), txsel.localAccountsDB.CurrentBatch()) |
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
// batch4
|
|
|
|
// make the selection of another batch, which should include the
|
|
|
|
// initial PoolExit, which now is valid as B has enough Balance
|
|
|
|
l1UserTxs = []common.L1Tx{} |
|
|
|
_, _, oL1UserTxs, oL1CoordTxs, oL2Txs, err = txsel.GetL1L2TxSelection(selectionConfig, l1UserTxs) |
|
|
|
require.NoError(t, err) |
|
|
|
assert.Equal(t, 0, len(oL1UserTxs)) |
|
|
|
assert.Equal(t, 0, len(oL1CoordTxs)) |
|
|
|
assert.Equal(t, 1, len(oL2Txs)) |
|
|
|
assert.Equal(t, common.TxTypeExit, oL2Txs[0].Type) |
|
|
|
err = txsel.l2db.StartForging(common.TxIDsFromPoolL2Txs(oL2Txs), txsel.localAccountsDB.CurrentBatch()) |
|
|
|
require.NoError(t, err) |
|
|
|
} |