|
@ -791,6 +791,9 @@ func TestMultipleCoordIdxForTokenID(t *testing.T) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func TestTwoExits(t *testing.T) { |
|
|
func TestTwoExits(t *testing.T) { |
|
|
|
|
|
// In the first part we generate a batch with two force exits for the
|
|
|
|
|
|
// same account of 20 each. The txprocessor output should be a single
|
|
|
|
|
|
// exitInfo with balance of 40.
|
|
|
dir, err := ioutil.TempDir("", "tmpdb") |
|
|
dir, err := ioutil.TempDir("", "tmpdb") |
|
|
require.NoError(t, err) |
|
|
require.NoError(t, err) |
|
|
defer assert.NoError(t, os.RemoveAll(dir)) |
|
|
defer assert.NoError(t, os.RemoveAll(dir)) |
|
@ -852,4 +855,53 @@ func TestTwoExits(t *testing.T) { |
|
|
acc, err := sdb.GetAccount(256) |
|
|
acc, err := sdb.GetAccount(256) |
|
|
require.NoError(t, err) |
|
|
require.NoError(t, err) |
|
|
assert.Equal(t, big.NewInt(60), acc.Balance) |
|
|
assert.Equal(t, big.NewInt(60), acc.Balance) |
|
|
|
|
|
|
|
|
|
|
|
// In the second part we start a fresh statedb and generate a batch
|
|
|
|
|
|
// with one force exit for the same account as before. The txprocessor
|
|
|
|
|
|
// output should be a single exitInfo with balance of 40, and the exit
|
|
|
|
|
|
// merkle tree proof should be equal to the previous one.
|
|
|
|
|
|
|
|
|
|
|
|
dir2, err := ioutil.TempDir("", "tmpdb") |
|
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
defer assert.NoError(t, os.RemoveAll(dir2)) |
|
|
|
|
|
|
|
|
|
|
|
sdb2, err := statedb.NewStateDB(dir2, 128, statedb.TypeSynchronizer, 32) |
|
|
|
|
|
assert.NoError(t, err) |
|
|
|
|
|
|
|
|
|
|
|
tc = til.NewContext(chainID, common.RollupConstMaxL1UserTx) |
|
|
|
|
|
|
|
|
|
|
|
// Single exit with balance of both exits in previous set. The exit
|
|
|
|
|
|
// root should match.
|
|
|
|
|
|
set2 := ` |
|
|
|
|
|
Type: Blockchain |
|
|
|
|
|
|
|
|
|
|
|
CreateAccountDeposit(0) A: 100 |
|
|
|
|
|
|
|
|
|
|
|
> batchL1 // freeze L1User{1}
|
|
|
|
|
|
> batchL1 // forge L1User{1}
|
|
|
|
|
|
|
|
|
|
|
|
ForceExit(0) A: 40 |
|
|
|
|
|
|
|
|
|
|
|
> batchL1 // freeze L1User{2}
|
|
|
|
|
|
> batchL1 // forge L1User{2}
|
|
|
|
|
|
> block |
|
|
|
|
|
` |
|
|
|
|
|
blocks, err = tc.GenerateBlocks(set2) |
|
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
err = tc.FillBlocksExtra(blocks, &til.ConfigExtra{}) |
|
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
err = tc.FillBlocksForgedL1UserTxs(blocks) |
|
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
|
|
tp = NewTxProcessor(sdb2, config) |
|
|
|
|
|
ptOuts2 := []*ProcessTxOutput{} |
|
|
|
|
|
for _, block := range blocks { |
|
|
|
|
|
for _, batch := range block.Rollup.Batches { |
|
|
|
|
|
ptOut, err := tp.ProcessTxs(nil, batch.L1UserTxs, nil, nil) |
|
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
ptOuts2 = append(ptOuts2, ptOut) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
assert.Equal(t, ptOuts[3].ExitInfos[0].MerkleProof, ptOuts2[3].ExitInfos[0].MerkleProof) |
|
|
} |
|
|
} |