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}