arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/db/statedb/txprocessors_test.go
db/statedb/txprocessors_test.goRaw
  1package statedb
  2
  3import (
  4	"encoding/hex"
  5	"encoding/json"
  6	"fmt"
  7	"io/ioutil"
  8	"math/big"
  9	"os"
 10	"testing"
 11
 12	ethCommon "github.com/ethereum/go-ethereum/common"
 13	"github.com/hermeznetwork/hermez-node/common"
 14	"github.com/hermeznetwork/hermez-node/log"
 15	"github.com/hermeznetwork/hermez-node/test/til"
 16	"github.com/iden3/go-iden3-crypto/babyjub"
 17	"github.com/stretchr/testify/assert"
 18	"github.com/stretchr/testify/require"
 19)
 20
 21func checkBalance(t *testing.T, tc *til.Context, sdb *StateDB, username string, tokenid int, expected string) {
 22	idx := tc.Users[username].Accounts[common.TokenID(tokenid)].Idx
 23	acc, err := sdb.GetAccount(idx)
 24	require.Nil(t, err)
 25	assert.Equal(t, expected, acc.Balance.String())
 26}
 27
 28func TestCheckL1TxInvalidData(t *testing.T) {
 29	dir, err := ioutil.TempDir("", "tmpdb")
 30	require.Nil(t, err)
 31	defer assert.Nil(t, os.RemoveAll(dir))
 32
 33	sdb, err := NewStateDB(dir, TypeSynchronizer, 32)
 34	assert.Nil(t, err)
 35
 36	set := `
 37		Type: Blockchain
 38		AddToken(1)
 39	
 40		CreateAccountDeposit(0) A: 10
 41		CreateAccountDeposit(0) B: 10
 42		CreateAccountDeposit(1) C: 10
 43		> batchL1
 44		> batchL1
 45		> block
 46	`
 47	tc := til.NewContext(common.RollupConstMaxL1UserTx)
 48	blocks, err := tc.GenerateBlocks(set)
 49	require.Nil(t, err)
 50
 51	ptc := ProcessTxsConfig{
 52		NLevels:  32,
 53		MaxFeeTx: 64,
 54		MaxTx:    512,
 55		MaxL1Tx:  16,
 56	}
 57	_, err = sdb.ProcessTxs(ptc, nil, blocks[0].Rollup.L1UserTxs, nil, nil)
 58	require.Nil(t, err)
 59
 60	tx := common.L1Tx{
 61		FromIdx:       256,
 62		ToIdx:         257,
 63		Amount:        big.NewInt(10),
 64		DepositAmount: big.NewInt(0),
 65		FromEthAddr:   tc.Users["A"].Addr,
 66		UserOrigin:    true,
 67	}
 68	sdb.computeEffectiveAmounts(&tx)
 69	assert.Equal(t, big.NewInt(0), tx.EffectiveDepositAmount)
 70	assert.Equal(t, big.NewInt(10), tx.EffectiveAmount)
 71
 72	// expect error due not enough funds
 73	tx = common.L1Tx{
 74		FromIdx:       256,
 75		ToIdx:         257,
 76		Amount:        big.NewInt(11),
 77		DepositAmount: big.NewInt(0),
 78		FromEthAddr:   tc.Users["A"].Addr,
 79		UserOrigin:    true,
 80	}
 81	sdb.computeEffectiveAmounts(&tx)
 82	assert.Equal(t, big.NewInt(0), tx.EffectiveDepositAmount)
 83	assert.Equal(t, big.NewInt(0), tx.EffectiveAmount)
 84
 85	// expect no-error due not enough funds in a
 86	// CreateAccountDepositTransfer transction
 87	tx = common.L1Tx{
 88		FromIdx:       0,
 89		ToIdx:         257,
 90		Amount:        big.NewInt(10),
 91		DepositAmount: big.NewInt(10),
 92		UserOrigin:    true,
 93	}
 94	sdb.computeEffectiveAmounts(&tx)
 95	assert.Equal(t, big.NewInt(10), tx.EffectiveDepositAmount)
 96	assert.Equal(t, big.NewInt(10), tx.EffectiveAmount)
 97
 98	// expect error due not enough funds in a CreateAccountDepositTransfer
 99	// transction
100	tx = common.L1Tx{
101		FromIdx:       0,
102		ToIdx:         257,
103		Amount:        big.NewInt(11),
104		DepositAmount: big.NewInt(10),
105		UserOrigin:    true,
106	}
107	sdb.computeEffectiveAmounts(&tx)
108	assert.Equal(t, big.NewInt(10), tx.EffectiveDepositAmount)
109	assert.Equal(t, big.NewInt(0), tx.EffectiveAmount)
110
111	// expect error due not same TokenID
112	tx = common.L1Tx{
113		FromIdx:       256,
114		ToIdx:         258,
115		Amount:        big.NewInt(5),
116		DepositAmount: big.NewInt(0),
117		FromEthAddr:   tc.Users["A"].Addr,
118		UserOrigin:    true,
119	}
120	sdb.computeEffectiveAmounts(&tx)
121	assert.Equal(t, big.NewInt(0), tx.EffectiveDepositAmount)
122	assert.Equal(t, big.NewInt(0), tx.EffectiveAmount)
123
124	// expect error due not same EthAddr
125	tx = common.L1Tx{
126		FromIdx:       256,
127		ToIdx:         257,
128		Amount:        big.NewInt(8),
129		DepositAmount: big.NewInt(0),
130		FromEthAddr:   tc.Users["B"].Addr,
131		UserOrigin:    true,
132	}
133	sdb.computeEffectiveAmounts(&tx)
134	assert.Equal(t, big.NewInt(0), tx.EffectiveDepositAmount)
135	assert.Equal(t, big.NewInt(0), tx.EffectiveAmount)
136}
137
138func TestProcessTxsBalances(t *testing.T) {
139	dir, err := ioutil.TempDir("", "tmpdb")
140	require.Nil(t, err)
141	defer assert.Nil(t, os.RemoveAll(dir))
142
143	sdb, err := NewStateDB(dir, TypeSynchronizer, 32)
144	assert.Nil(t, err)
145
146	// generate test transactions from test.SetBlockchain0 code
147	tc := til.NewContext(common.RollupConstMaxL1UserTx)
148	blocks, err := tc.GenerateBlocks(til.SetBlockchainMinimumFlow0)
149	require.Nil(t, err)
150
151	// Coordinator Idx where to send the fees
152	coordIdxs := []common.Idx{256, 257}
153	ptc := ProcessTxsConfig{
154		NLevels:  32,
155		MaxFeeTx: 64,
156		MaxTx:    512,
157		MaxL1Tx:  16,
158	}
159
160	log.Debug("block:0 batch:0, only L1CoordinatorTxs")
161	_, err = sdb.ProcessTxs(ptc, nil, nil, blocks[0].Rollup.Batches[0].L1CoordinatorTxs, nil)
162	require.Nil(t, err)
163
164	log.Debug("block:0 batch:1")
165	l1UserTxs := []common.L1Tx{}
166	l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[1].L2Txs)
167	_, err = sdb.ProcessTxs(ptc, coordIdxs, l1UserTxs, blocks[0].Rollup.Batches[1].L1CoordinatorTxs, l2Txs)
168	require.Nil(t, err)
169
170	log.Debug("block:0 batch:2")
171	l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[0].Rollup.Batches[2].Batch.ForgeL1TxsNum])
172	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[2].L2Txs)
173	_, err = sdb.ProcessTxs(ptc, coordIdxs, l1UserTxs, blocks[0].Rollup.Batches[2].L1CoordinatorTxs, l2Txs)
174	require.Nil(t, err)
175	checkBalance(t, tc, sdb, "A", 0, "500")
176
177	log.Debug("block:0 batch:3")
178	l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[0].Rollup.Batches[3].Batch.ForgeL1TxsNum])
179	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[3].L2Txs)
180	_, err = sdb.ProcessTxs(ptc, coordIdxs, l1UserTxs, blocks[0].Rollup.Batches[3].L1CoordinatorTxs, l2Txs)
181	require.Nil(t, err)
182	checkBalance(t, tc, sdb, "A", 0, "500")
183	checkBalance(t, tc, sdb, "A", 1, "500")
184
185	log.Debug("block:0 batch:4")
186	l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[0].Rollup.Batches[4].Batch.ForgeL1TxsNum])
187	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[4].L2Txs)
188	_, err = sdb.ProcessTxs(ptc, coordIdxs, l1UserTxs, blocks[0].Rollup.Batches[4].L1CoordinatorTxs, l2Txs)
189	require.Nil(t, err)
190	checkBalance(t, tc, sdb, "A", 0, "500")
191	checkBalance(t, tc, sdb, "A", 1, "500")
192
193	log.Debug("block:0 batch:5")
194	l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[0].Rollup.Batches[5].Batch.ForgeL1TxsNum])
195	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[5].L2Txs)
196	_, err = sdb.ProcessTxs(ptc, coordIdxs, l1UserTxs, blocks[0].Rollup.Batches[5].L1CoordinatorTxs, l2Txs)
197	require.Nil(t, err)
198	checkBalance(t, tc, sdb, "A", 0, "600")
199	checkBalance(t, tc, sdb, "A", 1, "500")
200	checkBalance(t, tc, sdb, "B", 0, "400")
201
202	log.Debug("block:0 batch:6")
203	l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[0].Rollup.Batches[6].Batch.ForgeL1TxsNum])
204	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[6].L2Txs)
205	_, err = sdb.ProcessTxs(ptc, coordIdxs, l1UserTxs, blocks[0].Rollup.Batches[6].L1CoordinatorTxs, l2Txs)
206	require.Nil(t, err)
207	checkBalance(t, tc, sdb, "Coord", 0, "10")
208	checkBalance(t, tc, sdb, "Coord", 1, "20")
209	checkBalance(t, tc, sdb, "A", 0, "600")
210	checkBalance(t, tc, sdb, "A", 1, "280")
211	checkBalance(t, tc, sdb, "B", 0, "290")
212	checkBalance(t, tc, sdb, "B", 1, "200")
213	checkBalance(t, tc, sdb, "C", 0, "100")
214	checkBalance(t, tc, sdb, "D", 0, "800")
215
216	log.Debug("block:0 batch:7")
217	l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[0].Rollup.Batches[7].Batch.ForgeL1TxsNum])
218	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[7].L2Txs)
219	_, err = sdb.ProcessTxs(ptc, coordIdxs, l1UserTxs, blocks[0].Rollup.Batches[7].L1CoordinatorTxs, l2Txs)
220	require.Nil(t, err)
221	checkBalance(t, tc, sdb, "Coord", 0, "35")
222	checkBalance(t, tc, sdb, "Coord", 1, "30")
223	checkBalance(t, tc, sdb, "A", 0, "430")
224	checkBalance(t, tc, sdb, "A", 1, "280")
225	checkBalance(t, tc, sdb, "B", 0, "390")
226	checkBalance(t, tc, sdb, "B", 1, "90")
227	checkBalance(t, tc, sdb, "C", 0, "45")
228	checkBalance(t, tc, sdb, "C", 1, "100")
229	checkBalance(t, tc, sdb, "D", 0, "800")
230
231	log.Debug("block:1 batch:0")
232	l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[1].Rollup.Batches[0].Batch.ForgeL1TxsNum])
233	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Rollup.Batches[0].L2Txs)
234	_, err = sdb.ProcessTxs(ptc, coordIdxs, l1UserTxs, blocks[1].Rollup.Batches[0].L1CoordinatorTxs, l2Txs)
235	require.Nil(t, err)
236	checkBalance(t, tc, sdb, "Coord", 0, "75")
237	checkBalance(t, tc, sdb, "Coord", 1, "30")
238	checkBalance(t, tc, sdb, "A", 0, "730")
239	checkBalance(t, tc, sdb, "A", 1, "280")
240	checkBalance(t, tc, sdb, "B", 0, "380")
241	checkBalance(t, tc, sdb, "B", 1, "90")
242	checkBalance(t, tc, sdb, "C", 0, "845")
243	checkBalance(t, tc, sdb, "C", 1, "100")
244	checkBalance(t, tc, sdb, "D", 0, "470")
245
246	log.Debug("block:1 batch:1")
247	l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[1].Rollup.Batches[1].Batch.ForgeL1TxsNum])
248	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Rollup.Batches[1].L2Txs)
249	_, err = sdb.ProcessTxs(ptc, coordIdxs, l1UserTxs, blocks[1].Rollup.Batches[1].L1CoordinatorTxs, l2Txs)
250	require.Nil(t, err)
251
252	// use Set of PoolL2 txs
253	poolL2Txs, err := tc.GeneratePoolL2Txs(til.SetPoolL2MinimumFlow1)
254	assert.Nil(t, err)
255
256	_, err = sdb.ProcessTxs(ptc, coordIdxs, []common.L1Tx{}, []common.L1Tx{}, poolL2Txs)
257	require.Nil(t, err)
258	checkBalance(t, tc, sdb, "Coord", 0, "105")
259	checkBalance(t, tc, sdb, "Coord", 1, "40")
260	checkBalance(t, tc, sdb, "A", 0, "510")
261	checkBalance(t, tc, sdb, "A", 1, "170")
262	checkBalance(t, tc, sdb, "B", 0, "480")
263	checkBalance(t, tc, sdb, "B", 1, "190")
264	checkBalance(t, tc, sdb, "C", 0, "845")
265	checkBalance(t, tc, sdb, "C", 1, "100")
266	checkBalance(t, tc, sdb, "D", 0, "360")
267	checkBalance(t, tc, sdb, "F", 0, "100")
268}
269
270func TestProcessTxsSynchronizer(t *testing.T) {
271	dir, err := ioutil.TempDir("", "tmpdb")
272	require.Nil(t, err)
273	defer assert.Nil(t, os.RemoveAll(dir))
274
275	sdb, err := NewStateDB(dir, TypeSynchronizer, 32)
276	assert.Nil(t, err)
277
278	// generate test transactions from test.SetBlockchain0 code
279	tc := til.NewContext(common.RollupConstMaxL1UserTx)
280	blocks, err := tc.GenerateBlocks(til.SetBlockchain0)
281	require.Nil(t, err)
282
283	assert.Equal(t, 31, len(blocks[0].Rollup.L1UserTxs))
284	assert.Equal(t, 4, len(blocks[0].Rollup.Batches[0].L1CoordinatorTxs))
285	assert.Equal(t, 0, len(blocks[0].Rollup.Batches[1].L1CoordinatorTxs))
286	assert.Equal(t, 22, len(blocks[0].Rollup.Batches[2].L2Txs))
287	assert.Equal(t, 1, len(blocks[1].Rollup.Batches[0].L1CoordinatorTxs))
288	assert.Equal(t, 62, len(blocks[1].Rollup.Batches[0].L2Txs))
289	assert.Equal(t, 1, len(blocks[1].Rollup.Batches[1].L1CoordinatorTxs))
290	assert.Equal(t, 8, len(blocks[1].Rollup.Batches[1].L2Txs))
291
292	// Coordinator Idx where to send the fees
293	coordIdxs := []common.Idx{256, 257, 258, 259}
294
295	// Idx of user 'A'
296	idxA1 := tc.Users["A"].Accounts[common.TokenID(1)].Idx
297
298	ptc := ProcessTxsConfig{
299		NLevels:  32,
300		MaxFeeTx: 64,
301		MaxTx:    512,
302		MaxL1Tx:  32,
303	}
304
305	// Process the 1st batch, which contains the L1CoordinatorTxs necessary
306	// to create the Coordinator accounts to receive the fees
307	log.Debug("block:0 batch:0, only L1CoordinatorTxs")
308	ptOut, err := sdb.ProcessTxs(ptc, nil, nil, blocks[0].Rollup.Batches[0].L1CoordinatorTxs, nil)
309	require.Nil(t, err)
310	assert.Equal(t, 4, len(ptOut.CreatedAccounts))
311	assert.Equal(t, 0, len(ptOut.CollectedFees))
312
313	log.Debug("block:0 batch:1")
314	l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[1].L2Txs)
315	ptOut, err = sdb.ProcessTxs(ptc, coordIdxs, blocks[0].Rollup.L1UserTxs,
316		blocks[0].Rollup.Batches[1].L1CoordinatorTxs, l2Txs)
317	require.Nil(t, err)
318	assert.Equal(t, 0, len(ptOut.ExitInfos))
319	assert.Equal(t, 31, len(ptOut.CreatedAccounts))
320	assert.Equal(t, 4, len(ptOut.CollectedFees))
321	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(0)].String())
322	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(1)].String())
323	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(2)].String())
324	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(3)].String())
325	acc, err := sdb.GetAccount(idxA1)
326	require.Nil(t, err)
327	assert.Equal(t, "50", acc.Balance.String())
328
329	log.Debug("block:0 batch:2")
330	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[2].L2Txs)
331	ptOut, err = sdb.ProcessTxs(ptc, coordIdxs, nil, blocks[0].Rollup.Batches[2].L1CoordinatorTxs, l2Txs)
332	require.Nil(t, err)
333	assert.Equal(t, 0, len(ptOut.ExitInfos))
334	assert.Equal(t, 0, len(ptOut.CreatedAccounts))
335	assert.Equal(t, 4, len(ptOut.CollectedFees))
336	assert.Equal(t, "2", ptOut.CollectedFees[common.TokenID(0)].String())
337	assert.Equal(t, "1", ptOut.CollectedFees[common.TokenID(1)].String())
338	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(2)].String())
339	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(3)].String())
340	acc, err = sdb.GetAccount(idxA1)
341	require.Nil(t, err)
342	assert.Equal(t, "35", acc.Balance.String())
343
344	log.Debug("block:1 batch:0")
345	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Rollup.Batches[0].L2Txs)
346	// before processing expect l2Txs[0:2].Nonce==0
347	assert.Equal(t, common.Nonce(0), l2Txs[0].Nonce)
348	assert.Equal(t, common.Nonce(0), l2Txs[1].Nonce)
349	assert.Equal(t, common.Nonce(0), l2Txs[2].Nonce)
350
351	ptOut, err = sdb.ProcessTxs(ptc, coordIdxs, nil, blocks[1].Rollup.Batches[0].L1CoordinatorTxs, l2Txs)
352	require.Nil(t, err)
353
354	// after processing expect l2Txs[0:2].Nonce!=0 and has expected value
355	assert.Equal(t, common.Nonce(6), l2Txs[0].Nonce)
356	assert.Equal(t, common.Nonce(7), l2Txs[1].Nonce)
357	assert.Equal(t, common.Nonce(8), l2Txs[2].Nonce)
358
359	assert.Equal(t, 4, len(ptOut.ExitInfos)) // the 'ForceExit(1)' is not computed yet, as the batch is without L1UserTxs
360	assert.Equal(t, 1, len(ptOut.CreatedAccounts))
361	assert.Equal(t, 4, len(ptOut.CollectedFees))
362	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(0)].String())
363	assert.Equal(t, "1", ptOut.CollectedFees[common.TokenID(1)].String())
364	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(2)].String())
365	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(3)].String())
366	acc, err = sdb.GetAccount(idxA1)
367	require.Nil(t, err)
368	assert.Equal(t, "57", acc.Balance.String())
369
370	log.Debug("block:1 batch:1")
371	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Rollup.Batches[1].L2Txs)
372	ptOut, err = sdb.ProcessTxs(ptc, coordIdxs, blocks[1].Rollup.L1UserTxs,
373		blocks[1].Rollup.Batches[1].L1CoordinatorTxs, l2Txs)
374	require.Nil(t, err)
375
376	assert.Equal(t, 2, len(ptOut.ExitInfos)) // 2, as previous batch was without L1UserTxs, and has pending the 'ForceExit(1) A: 5'
377	assert.Equal(t, 1, len(ptOut.CreatedAccounts))
378	assert.Equal(t, 4, len(ptOut.CollectedFees))
379	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(0)].String())
380	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(1)].String())
381	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(2)].String())
382	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(3)].String())
383	acc, err = sdb.GetAccount(idxA1)
384	assert.Nil(t, err)
385	assert.Equal(t, "77", acc.Balance.String())
386
387	idxB0 := tc.Users["C"].Accounts[common.TokenID(0)].Idx
388	acc, err = sdb.GetAccount(idxB0)
389	require.Nil(t, err)
390	assert.Equal(t, "51", acc.Balance.String())
391
392	// get balance of Coordinator account for TokenID==0
393	acc, err = sdb.GetAccount(common.Idx(256))
394	require.Nil(t, err)
395	assert.Equal(t, "2", acc.Balance.String())
396}
397
398func TestProcessTxsBatchBuilder(t *testing.T) {
399	dir, err := ioutil.TempDir("", "tmpdb")
400	require.Nil(t, err)
401	defer assert.Nil(t, os.RemoveAll(dir))
402
403	sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
404	assert.Nil(t, err)
405
406	// generate test transactions from test.SetBlockchain0 code
407	tc := til.NewContext(common.RollupConstMaxL1UserTx)
408	blocks, err := tc.GenerateBlocks(til.SetBlockchain0)
409	require.Nil(t, err)
410
411	// Coordinator Idx where to send the fees
412	coordIdxs := []common.Idx{256, 257, 258, 259}
413
414	// Idx of user 'A'
415	idxA1 := tc.Users["A"].Accounts[common.TokenID(1)].Idx
416
417	ptc := ProcessTxsConfig{
418		NLevels:  32,
419		MaxFeeTx: 64,
420		MaxTx:    512,
421		MaxL1Tx:  32,
422	}
423
424	// Process the 1st batch, which contains the L1CoordinatorTxs necessary
425	// to create the Coordinator accounts to receive the fees
426	log.Debug("block:0 batch:0, only L1CoordinatorTxs")
427	ptOut, err := sdb.ProcessTxs(ptc, nil, nil, blocks[0].Rollup.Batches[0].L1CoordinatorTxs, nil)
428	require.Nil(t, err)
429	// expect 0 at CreatedAccount, as is only computed when StateDB.Type==TypeSynchronizer
430	assert.Equal(t, 0, len(ptOut.CreatedAccounts))
431
432	log.Debug("block:0 batch:1")
433	l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[1].L2Txs)
434	ptOut, err = sdb.ProcessTxs(ptc, coordIdxs, blocks[0].Rollup.L1UserTxs, blocks[0].Rollup.Batches[1].L1CoordinatorTxs, l2Txs)
435	require.Nil(t, err)
436	assert.Equal(t, 0, len(ptOut.ExitInfos))
437	assert.Equal(t, 0, len(ptOut.CreatedAccounts))
438	acc, err := sdb.GetAccount(idxA1)
439	require.Nil(t, err)
440	assert.Equal(t, "50", acc.Balance.String())
441
442	log.Debug("block:0 batch:2")
443	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[2].L2Txs)
444	ptOut, err = sdb.ProcessTxs(ptc, coordIdxs, nil, blocks[0].Rollup.Batches[2].L1CoordinatorTxs, l2Txs)
445	require.Nil(t, err)
446	assert.Equal(t, 0, len(ptOut.ExitInfos))
447	assert.Equal(t, 0, len(ptOut.CreatedAccounts))
448	acc, err = sdb.GetAccount(idxA1)
449	require.Nil(t, err)
450	assert.Equal(t, "35", acc.Balance.String())
451
452	log.Debug("block:1 batch:0")
453	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Rollup.Batches[0].L2Txs)
454	_, err = sdb.ProcessTxs(ptc, coordIdxs, nil, blocks[1].Rollup.Batches[0].L1CoordinatorTxs, l2Txs)
455	require.Nil(t, err)
456	acc, err = sdb.GetAccount(idxA1)
457	require.Nil(t, err)
458	assert.Equal(t, "57", acc.Balance.String())
459
460	log.Debug("block:1 batch:1")
461	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Rollup.Batches[1].L2Txs)
462	_, err = sdb.ProcessTxs(ptc, coordIdxs, blocks[1].Rollup.L1UserTxs, blocks[1].Rollup.Batches[1].L1CoordinatorTxs, l2Txs)
463	require.Nil(t, err)
464	acc, err = sdb.GetAccount(idxA1)
465	assert.Nil(t, err)
466	assert.Equal(t, "77", acc.Balance.String())
467
468	idxB0 := tc.Users["C"].Accounts[common.TokenID(0)].Idx
469	acc, err = sdb.GetAccount(idxB0)
470	require.Nil(t, err)
471	assert.Equal(t, "51", acc.Balance.String())
472
473	// get balance of Coordinator account for TokenID==0
474	acc, err = sdb.GetAccount(common.Idx(256))
475	require.Nil(t, err)
476	assert.Equal(t, common.TokenID(0), acc.TokenID)
477	assert.Equal(t, "2", acc.Balance.String())
478	acc, err = sdb.GetAccount(common.Idx(257))
479	require.Nil(t, err)
480	assert.Equal(t, common.TokenID(1), acc.TokenID)
481	assert.Equal(t, "2", acc.Balance.String())
482}
483
484func TestZKInputsGeneration(t *testing.T) {
485	dir, err := ioutil.TempDir("", "tmpdb")
486	require.Nil(t, err)
487	defer assert.Nil(t, os.RemoveAll(dir))
488
489	sdb, err := NewStateDB(dir, TypeBatchBuilder, 4)
490	assert.Nil(t, err)
491
492	set := `
493		Type: Blockchain
494		AddToken(1)
495		CreateAccountDeposit(1) A: 10
496		> batchL1
497		CreateAccountCoordinator(1) B
498		CreateAccountCoordinator(1) C
499		> batchL1
500		// idxs: A:258, B:256, C:257
501
502		Transfer(1) A-B: 6 (1)
503		Transfer(1) A-C: 2 (1)
504		> batch
505		> block
506	`
507	// generate test transactions from test.SetBlockchain0 code
508	tc := til.NewContext(common.RollupConstMaxL1UserTx)
509	blocks, err := tc.GenerateBlocks(set)
510	require.Nil(t, err)
511
512	// Coordinator Idx where to send the fees
513	coordIdxs := []common.Idx{256}
514
515	ptc := ProcessTxsConfig{
516		NLevels:  32,
517		MaxFeeTx: 8,
518		MaxTx:    32,
519		MaxL1Tx:  16,
520	}
521
522	log.Debug("block:0 batch:0, only L1UserTx")
523	_, err = sdb.ProcessTxs(ptc, nil, blocks[0].Rollup.L1UserTxs, nil, nil)
524	require.Nil(t, err)
525
526	log.Debug("block:0 batch:1, only L1CoordinatorTxs")
527	_, err = sdb.ProcessTxs(ptc, nil, nil, blocks[0].Rollup.Batches[1].L1CoordinatorTxs, nil)
528	require.Nil(t, err)
529
530	log.Debug("block:0 batch:2, only L2Txs")
531	l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Rollup.Batches[2].L2Txs)
532	ptOut, err := sdb.ProcessTxs(ptc, coordIdxs, nil, nil, l2Txs)
533	require.Nil(t, err)
534	checkBalance(t, tc, sdb, "A", 1, "2")
535
536	s, err := json.Marshal(ptOut.ZKInputs)
537	require.Nil(t, err)
538	debug := false
539	// debug = true
540	if debug {
541		fmt.Println(string(s))
542	}
543}
544
545func TestProcessTxsRootTestVectors(t *testing.T) {
546	dir, err := ioutil.TempDir("", "tmpdb")
547	require.Nil(t, err)
548	defer assert.Nil(t, os.RemoveAll(dir))
549
550	sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
551	assert.Nil(t, err)
552
553	// same values than in the js test
554	bjj0, err := common.BJJFromStringWithChecksum("21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d7")
555	assert.Nil(t, err)
556	l1Txs := []common.L1Tx{
557		{
558			FromIdx:       0,
559			DepositAmount: big.NewInt(16000000),
560			Amount:        big.NewInt(0),
561			TokenID:       1,
562			FromBJJ:       bjj0,
563			FromEthAddr:   ethCommon.HexToAddress("0x7e5f4552091a69125d5dfcb7b8c2659029395bdf"),
564			ToIdx:         0,
565			Type:          common.TxTypeCreateAccountDeposit,
566			UserOrigin:    true,
567		},
568	}
569	l2Txs := []common.PoolL2Tx{
570		{
571			FromIdx: 256,
572			ToIdx:   256,
573			TokenID: 1,
574			Amount:  big.NewInt(1000),
575			Nonce:   0,
576			Fee:     126,
577			Type:    common.TxTypeTransfer,
578		},
579	}
580
581	ptc := ProcessTxsConfig{
582		NLevels:  32,
583		MaxFeeTx: 8,
584		MaxTx:    32,
585		MaxL1Tx:  16,
586	}
587	_, err = sdb.ProcessTxs(ptc, nil, l1Txs, nil, l2Txs)
588	require.Nil(t, err)
589	assert.Equal(t, "9827704113668630072730115158977131501210702363656902211840117643154933433410", sdb.mt.Root().BigInt().String())
590}
591
592func TestCircomTest(t *testing.T) {
593	dir, err := ioutil.TempDir("", "tmpdb")
594	require.Nil(t, err)
595	defer assert.Nil(t, os.RemoveAll(dir))
596
597	nLevels := 16
598
599	sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels)
600	assert.Nil(t, err)
601
602	// same values than in the js test
603	// skJsHex is equivalent to the 0000...0001 js private key in commonjs
604	skJsHex := "7eb258e61862aae75c6c1d1f7efae5006ffc9e4d5596a6ff95f3df4ea209ea7f"
605	skJs, err := hex.DecodeString(skJsHex)
606	require.Nil(t, err)
607	var sk0 babyjub.PrivateKey
608	copy(sk0[:], skJs)
609	bjj0 := sk0.Public()
610	assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", bjj0.String())
611
612	l1Txs := []common.L1Tx{
613		{
614			FromIdx:       0,
615			DepositAmount: big.NewInt(16000000),
616			Amount:        big.NewInt(0),
617			TokenID:       1,
618			FromBJJ:       bjj0,
619			FromEthAddr:   ethCommon.HexToAddress("0x7e5f4552091a69125d5dfcb7b8c2659029395bdf"),
620			ToIdx:         0,
621			Type:          common.TxTypeCreateAccountDeposit,
622			UserOrigin:    true,
623		},
624	}
625	l2Txs := []common.PoolL2Tx{
626		{
627			FromIdx: 256,
628			ToIdx:   256,
629			TokenID: 1,
630			Amount:  big.NewInt(1000),
631			Nonce:   0,
632			Fee:     0,
633			Type:    common.TxTypeTransfer,
634		},
635	}
636
637	toSign, err := l2Txs[0].HashToSign()
638	require.Nil(t, err)
639	sig := sk0.SignPoseidon(toSign)
640	l2Txs[0].Signature = sig.Compress()
641
642	ptc := ProcessTxsConfig{
643		NLevels:  uint32(nLevels),
644		MaxTx:    3,
645		MaxL1Tx:  2,
646		MaxFeeTx: 2,
647	}
648	// skip first batch to do the test with BatchNum=1
649	_, err = sdb.ProcessTxs(ptc, nil, nil, nil, nil)
650	require.Nil(t, err)
651
652	ptOut, err := sdb.ProcessTxs(ptc, nil, l1Txs, nil, l2Txs)
653	require.Nil(t, err)
654
655	// check expected account keys values from tx inputs
656	acc, err := sdb.GetAccount(common.Idx(256))
657	require.Nil(t, err)
658	assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", acc.PublicKey.Compress().String())
659	assert.Equal(t, "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", acc.EthAddr.Hex())
660
661	// check that there no exist more accounts
662	_, err = sdb.GetAccount(common.Idx(257))
663	require.NotNil(t, err)
664
665	s, err := json.Marshal(ptOut.ZKInputs)
666	require.Nil(t, err)
667
668	debug := false
669	// debug = true
670	if debug {
671		fmt.Println("\nCopy&Paste into js circom test:\n	let zkInput = JSON.parse(`" + string(s) + "`);")
672		// fmt.Println("\nZKInputs json:\n	echo '" + string(s) + "' | jq")
673
674		h, err := ptOut.ZKInputs.HashGlobalData()
675		require.Nil(t, err)
676		fmt.Printf(`
677		const output={
678			hashGlobalInputs: "%s",
679		};
680		await circuit.assertOut(w, output);
681		`, h.String())
682		fmt.Println("")
683	}
684
685	// the 'expected' data has been checked with the circom circuits
686	expected := `{"auxFromIdx":["256","0","0"],"auxToIdx":["0","0","0"],"ay1":["15238403086306505038849621710779816852318505119327426213168494964113886299863","15238403086306505038849621710779816852318505119327426213168494964113886299863","0"],"ay2":["0","15238403086306505038849621710779816852318505119327426213168494964113886299863","0"],"ay3":["0","0"],"balance1":["16000000","16000000","0"],"balance2":["0","15999000","0"],"balance3":["0","0"],"currentNumBatch":"1","ethAddr1":["721457446580647751014191829380889690493307935711","721457446580647751014191829380889690493307935711","0"],"ethAddr2":["0","721457446580647751014191829380889690493307935711","0"],"ethAddr3":["0","0"],"feeIdxs":["0","0"],"feePlanTokens":["0","0"],"fromBjjCompressed":[["1","1","1","0","1","0","1","1","0","1","1","0","0","0","1","0","0","1","0","0","0","0","0","1","1","1","1","1","0","0","1","0","1","0","1","1","1","1","1","0","0","1","0","1","0","0","0","0","1","0","1","0","0","0","1","1","0","0","1","0","0","0","0","0","0","1","0","1","0","0","1","0","1","1","1","0","1","0","1","0","1","1","1","1","1","1","0","0","1","0","0","0","1","0","1","0","0","1","0","0","1","1","0","1","0","0","0","1","1","1","1","0","0","0","1","1","0","1","0","1","1","0","1","0","1","1","0","1","1","0","1","1","0","1","1","0","0","1","0","0","0","0","0","1","1","1","0","1","1","1","0","0","0","0","1","1","0","1","1","1","1","0","0","1","1","1","0","0","1","0","1","0","1","0","1","0","1","0","1","1","1","0","0","0","1","0","1","1","1","0","0","0","1","1","0","1","1","1","1","0","1","1","1","0","1","1","1","1","1","1","1","0","1","1","0","0","1","1","0","1","0","0","0","1","0","0","0","1","0","1","1","0","1","0","0","0","0","1","0","1","0","0","0","0","1","1","0","1","1","0","0","0","0","1","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"fromEthAddr":["721457446580647751014191829380889690493307935711","0","0"],"fromIdx":["0","256","0"],"globalChainID":"0","imAccFeeOut":[["0","0"],["0","0"]],"imExitRoot":["0","0"],"imFinalAccFee":["0","0"],"imInitStateRootFee":"3212803832159212591526550848126062808026208063555125878245901046146545013161","imOnChain":["1","0"],"imOutIdx":["256","256"],"imStateRoot":["2999178063326948609414231200730958862089790119006655219527433501846141543551","3212803832159212591526550848126062808026208063555125878245901046146545013161"],"imStateRootFee":["3212803832159212591526550848126062808026208063555125878245901046146545013161"],"isOld0_1":["1","0","0"],"isOld0_2":["0","0","0"],"loadAmountF":["10400","0","0"],"maxNumBatch":["0","0","0"],"newAccount":["1","0","0"],"newExit":["0","0","0"],"nonce1":["0","0","0"],"nonce2":["0","1","0"],"nonce3":["0","0"],"oldKey1":["0","0","0"],"oldKey2":["0","0","0"],"oldLastIdx":"255","oldStateRoot":"0","oldValue1":["0","0","0"],"oldValue2":["0","0","0"],"onChain":["1","0","0"],"r8x":["0","13339118088097183560380359255316479838355724395928453439485234854234470298884","0"],"r8y":["0","12062876403986777372637801733000285846673058725183957648593976028822138986587","0"],"rqOffset":["0","0","0"],"rqToBjjAy":["0","0","0"],"rqToEthAddr":["0","0","0"],"rqTxCompressedDataV2":["0","0","0"],"s":["0","1429292460142966038093363510339656828866419125109324886747095533117015974779","0"],"siblings1":[["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"siblings2":[["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"siblings3":[["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"sign1":["0","0","0"],"sign2":["0","0","0"],"sign3":["0","0"],"toBjjAy":["0","0","0"],"toEthAddr":["0","0","0"],"toIdx":["0","256","0"],"tokenID1":["1","1","0"],"tokenID2":["0","1","0"],"tokenID3":["0","0"],"txCompressedData":["1461501637330902918203684832716283019659255211535","1483802382529433561627630154640673862706524841487","3322668559"],"txCompressedDataV2":["0","5271525021049092038181634317484288","0"]}`
687	assert.Equal(t, expected, string(s))
688}
689
690func TestZKInputsHashTestVector0(t *testing.T) {
691	dir, err := ioutil.TempDir("", "tmpdb")
692	require.Nil(t, err)
693	defer assert.Nil(t, os.RemoveAll(dir))
694
695	sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
696	assert.Nil(t, err)
697
698	// same values than in the js test
699	bjj0, err := common.BJJFromStringWithChecksum("21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d7")
700	assert.Nil(t, err)
701	l1Txs := []common.L1Tx{
702		{
703			FromIdx:       0,
704			DepositAmount: big.NewInt(16000000),
705			Amount:        big.NewInt(0),
706			TokenID:       1,
707			FromBJJ:       bjj0,
708			FromEthAddr:   ethCommon.HexToAddress("0x7e5f4552091a69125d5dfcb7b8c2659029395bdf"),
709			ToIdx:         0,
710			Type:          common.TxTypeCreateAccountDeposit,
711			UserOrigin:    true,
712		},
713	}
714	l2Txs := []common.PoolL2Tx{
715		{
716			FromIdx: 256,
717			ToIdx:   256,
718			TokenID: 1,
719			Amount:  big.NewInt(1000),
720			Nonce:   0,
721			Fee:     126,
722			Type:    common.TxTypeTransfer,
723		},
724	}
725
726	ptc := ProcessTxsConfig{
727		NLevels:  32,
728		MaxFeeTx: 8,
729		MaxTx:    32,
730		MaxL1Tx:  16,
731	}
732	// skip first batch to do the test with BatchNum=1
733	_, err = sdb.ProcessTxs(ptc, nil, nil, nil, nil)
734	require.Nil(t, err)
735
736	ptOut, err := sdb.ProcessTxs(ptc, nil, l1Txs, nil, l2Txs)
737	require.Nil(t, err)
738
739	// check expected account keys values from tx inputs
740	acc, err := sdb.GetAccount(common.Idx(256))
741	require.Nil(t, err)
742	assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", acc.PublicKey.Compress().String())
743	assert.Equal(t, "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", acc.EthAddr.Hex())
744
745	// check that there no exist more accounts
746	_, err = sdb.GetAccount(common.Idx(257))
747	require.NotNil(t, err)
748	ptOut.ZKInputs.FeeIdxs[0] = common.Idx(256).BigInt()
749
750	toHash, err := ptOut.ZKInputs.ToHashGlobalData()
751	assert.Nil(t, err)
752	// value from js test vector
753	expectedToHash := "0000000000ff000000000100000000000000000000000000000000000000000000000000000000000000000015ba488d749f6b891d29d0bf3a72481ec812e4d4ecef2bf7a3fc64f3c010444200000000000000000000000000000000000000000000000000000000000000007e5f4552091a69125d5dfcb7b8c2659029395bdf21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d700000000000028a00000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000010003e87e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000001"
754	// checks are splitted to find the difference easier
755	assert.Equal(t, expectedToHash[:1000], hex.EncodeToString(toHash)[:1000])
756	assert.Equal(t, expectedToHash[1000:2000], hex.EncodeToString(toHash)[1000:2000])
757	assert.Equal(t, expectedToHash[2000:], hex.EncodeToString(toHash)[2000:])
758
759	h, err := ptOut.ZKInputs.HashGlobalData()
760	require.Nil(t, err)
761	// value from js test vector
762	assert.Equal(t, "4356692423721763303547321618014315464040324829724049399065961225345730555597", h.String())
763}
764
765func TestZKInputsHashTestVector1(t *testing.T) {
766	dir, err := ioutil.TempDir("", "tmpdb")
767	require.Nil(t, err)
768	defer assert.Nil(t, os.RemoveAll(dir))
769
770	sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
771	assert.Nil(t, err)
772
773	// same values than in the js test
774	bjj0, err := common.BJJFromStringWithChecksum("21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d7")
775	assert.Nil(t, err)
776	bjj1, err := common.BJJFromStringWithChecksum("093985b1993d9f743f9d7d943ed56f38601cb8b196db025f79650c4007c3054d")
777	assert.Nil(t, err)
778	l1Txs := []common.L1Tx{
779		{
780			FromIdx: 0,
781			// DepositAmount:  big.NewInt(10400),
782			DepositAmount: big.NewInt(16000000),
783			Amount:        big.NewInt(0),
784			TokenID:       1,
785			FromBJJ:       bjj0,
786			FromEthAddr:   ethCommon.HexToAddress("0x7e5f4552091a69125d5dfcb7b8c2659029395bdf"),
787			ToIdx:         0,
788			Type:          common.TxTypeCreateAccountDeposit,
789			UserOrigin:    true,
790		},
791		{
792			FromIdx:       0,
793			DepositAmount: big.NewInt(16000000),
794			Amount:        big.NewInt(0),
795			TokenID:       1,
796			FromBJJ:       bjj1,
797			FromEthAddr:   ethCommon.HexToAddress("0x2b5ad5c4795c026514f8317c7a215e218dccd6cf"),
798			ToIdx:         0,
799			Type:          common.TxTypeCreateAccountDeposit,
800			UserOrigin:    true,
801		},
802	}
803	l2Txs := []common.PoolL2Tx{
804		{
805			FromIdx: 257,
806			ToIdx:   256,
807			TokenID: 1,
808			Amount:  big.NewInt(1000),
809			Nonce:   0,
810			Fee:     137,
811			Type:    common.TxTypeTransfer,
812		},
813	}
814
815	ptc := ProcessTxsConfig{
816		NLevels:  32,
817		MaxFeeTx: 8,
818		MaxTx:    32,
819		MaxL1Tx:  16,
820	}
821	// skip first batch to do the test with BatchNum=1
822	_, err = sdb.ProcessTxs(ptc, nil, nil, nil, nil)
823	require.Nil(t, err)
824
825	ptOut, err := sdb.ProcessTxs(ptc, nil, l1Txs, nil, l2Txs)
826	require.Nil(t, err)
827
828	// check expected account keys values from tx inputs
829	acc, err := sdb.GetAccount(common.Idx(256))
830	require.Nil(t, err)
831	assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", acc.PublicKey.Compress().String())
832	assert.Equal(t, "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", acc.EthAddr.Hex())
833	acc, err = sdb.GetAccount(common.Idx(257))
834	require.Nil(t, err)
835	assert.Equal(t, "4d05c307400c65795f02db96b1b81c60386fd53e947d9d3f749f3d99b1853909", acc.PublicKey.Compress().String())
836	assert.Equal(t, "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF", acc.EthAddr.Hex())
837
838	// check that there no exist more accounts
839	_, err = sdb.GetAccount(common.Idx(258))
840	require.NotNil(t, err)
841	ptOut.ZKInputs.FeeIdxs[0] = common.Idx(257).BigInt()
842
843	toHash, err := ptOut.ZKInputs.ToHashGlobalData()
844	assert.Nil(t, err)
845	// value from js test vector
846	expectedToHash := "0000000000ff0000000001010000000000000000000000000000000000000000000000000000000000000000304a3f3aef4f416cca887aab7265227449077627138345c2eb25bf8ff946b09500000000000000000000000000000000000000000000000000000000000000007e5f4552091a69125d5dfcb7b8c2659029395bdf21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d700000000000028a00000000000010000000000002b5ad5c4795c026514f8317c7a215e218dccd6cf093985b1993d9f743f9d7d943ed56f38601cb8b196db025f79650c4007c3054d00000000000028a000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010000010003e889000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000000001"
847	// checks are splitted to find the difference easier
848	assert.Equal(t, expectedToHash[:1000], hex.EncodeToString(toHash)[:1000])
849	assert.Equal(t, expectedToHash[1000:2000], hex.EncodeToString(toHash)[1000:2000])
850	assert.Equal(t, expectedToHash[2000:], hex.EncodeToString(toHash)[2000:])
851
852	h, err := ptOut.ZKInputs.HashGlobalData()
853	require.Nil(t, err)
854	// value from js test vector
855	assert.Equal(t, "20293112365009290386650039345314592436395562810005523677125576447132206192598", h.String())
856}