@ -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 )
}