arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/eth/rollup_test.go
eth/rollup_test.goRaw
   1package eth
   2
   3import (
   4	"context"
   5	"crypto/ecdsa"
   6	"encoding/binary"
   7	"encoding/hex"
   8	"math/big"
   9	"testing"
  10
  11	ethCommon "github.com/ethereum/go-ethereum/common"
  12	ethCrypto "github.com/ethereum/go-ethereum/crypto"
  13	"github.com/hermeznetwork/hermez-node/common"
  14	"github.com/iden3/go-iden3-crypto/babyjub"
  15	"github.com/stretchr/testify/assert"
  16	"github.com/stretchr/testify/require"
  17)
  18
  19var rollupClient *RollupClient
  20var auctionClient *AuctionClient
  21
  22var ethHashForge ethCommon.Hash
  23var argsForge *RollupForgeBatchArgs
  24
  25var absoluteMaxL1L2BatchTimeout = int64(240)
  26var maxTx = int64(512)
  27var nLevels = int64(32)
  28
  29var tokenIDERC777 uint32
  30var tokenHEZID uint32
  31
  32var L1UserTxs []common.L1Tx
  33var blockStampBucket int64
  34
  35type keys struct {
  36	BJJSecretKey *babyjub.PrivateKey
  37	BJJPublicKey *babyjub.PublicKey
  38	Addr         ethCommon.Address
  39}
  40
  41func genKeysBjj(i int64) *keys {
  42	i++ // i = 0 doesn't work for the ecdsa key generation
  43	var sk babyjub.PrivateKey
  44	binary.LittleEndian.PutUint64(sk[:], uint64(i))
  45
  46	// eth address
  47	var key ecdsa.PrivateKey
  48	key.D = big.NewInt(i) // only for testing
  49	key.PublicKey.X, key.PublicKey.Y = ethCrypto.S256().ScalarBaseMult(key.D.Bytes())
  50	key.Curve = ethCrypto.S256()
  51
  52	return &keys{
  53		BJJSecretKey: &sk,
  54		BJJPublicKey: sk.Public(),
  55	}
  56}
  57
  58func TestRollupEventInit(t *testing.T) {
  59	rollupInit, blockNum, err := rollupClient.RollupEventInit(genesisBlock)
  60	require.NoError(t, err)
  61	assert.Equal(t, int64(19), blockNum)
  62	assert.Equal(t, uint8(10), rollupInit.ForgeL1L2BatchTimeout)
  63	assert.Equal(t, big.NewInt(10), rollupInit.FeeAddToken)
  64	assert.Equal(t, uint64(60*60*24*7*2), rollupInit.WithdrawalDelay)
  65}
  66
  67func TestRollupConstants(t *testing.T) {
  68	rollupConstants, err := rollupClient.RollupConstants()
  69	require.NoError(t, err)
  70	assert.Equal(t, absoluteMaxL1L2BatchTimeout, rollupConstants.AbsoluteMaxL1L2BatchTimeout)
  71	assert.Equal(t, auctionAddressConst, rollupConstants.HermezAuctionContract)
  72	assert.Equal(t, tokenHEZAddressConst, rollupConstants.TokenHEZ)
  73	assert.Equal(t, maxTx, rollupConstants.Verifiers[0].MaxTx)
  74	assert.Equal(t, nLevels, rollupConstants.Verifiers[0].NLevels)
  75	assert.Equal(t, governanceAddressConst, rollupConstants.HermezGovernanceAddress)
  76	assert.Equal(t, wdelayerAddressConst, rollupConstants.WithdrawDelayerContract)
  77}
  78
  79func TestRollupRegisterTokensCount(t *testing.T) {
  80	registerTokensCount, err := rollupClient.RollupRegisterTokensCount()
  81	require.NoError(t, err)
  82	assert.Equal(t, big.NewInt(1), registerTokensCount)
  83}
  84
  85func TestRollupAddToken(t *testing.T) {
  86	feeAddToken := big.NewInt(10)
  87	// Addtoken ERC20Permit
  88	registerTokensCount, err := rollupClient.RollupRegisterTokensCount()
  89	require.NoError(t, err)
  90	_, err = rollupClient.RollupAddToken(tokenHEZAddressConst, feeAddToken, deadline)
  91	require.NoError(t, err)
  92	currentBlockNum, err := rollupClient.client.EthLastBlock()
  93	require.NoError(t, err)
  94	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
  95	require.NoError(t, err)
  96
  97	assert.Equal(t, tokenHEZAddressConst, rollupEvents.AddToken[0].TokenAddress)
  98	assert.Equal(t, registerTokensCount, common.TokenID(rollupEvents.AddToken[0].TokenID).BigInt())
  99	tokenHEZID = rollupEvents.AddToken[0].TokenID
 100}
 101
 102func TestRollupForgeBatch(t *testing.T) {
 103	chainid, _ := auctionClient.client.Client().ChainID(context.Background())
 104	// Register Coordinator
 105	forgerAddress := governanceAddressConst
 106	_, err := auctionClient.AuctionSetCoordinator(forgerAddress, URL)
 107	require.NoError(t, err)
 108
 109	// MultiBid
 110	currentSlot, err := auctionClient.AuctionGetCurrentSlotNumber()
 111	require.NoError(t, err)
 112	slotSet := [6]bool{true, false, true, false, true, false}
 113	maxBid := new(big.Int)
 114	maxBid.SetString("15000000000000000000", 10)
 115	minBid := new(big.Int)
 116	minBid.SetString("11000000000000000000", 10)
 117	budget := new(big.Int)
 118	budget.SetString("45200000000000000000", 10)
 119	_, err = auctionClient.AuctionMultiBid(budget, currentSlot+4, currentSlot+10, slotSet,
 120		maxBid, minBid, deadline)
 121	require.NoError(t, err)
 122
 123	// Add Blocks
 124	blockNum := int64(int(blocksPerSlot)*int(currentSlot+4) + int(genesisBlock))
 125	currentBlockNum, err := auctionClient.client.EthLastBlock()
 126	require.NoError(t, err)
 127	blocksToAdd := blockNum - currentBlockNum
 128	addBlocks(blocksToAdd, ethClientDialURL)
 129
 130	// Forge Batch 1
 131	args := new(RollupForgeBatchArgs)
 132	// When encoded, 64 times the 0 idx means that no idx to collect fees is specified.
 133	args.FeeIdxCoordinator = []common.Idx{}
 134	l1CoordinatorBytes, err := hex.DecodeString(
 135		"1c660323607bb113e586183609964a333d07ebe4bef3be82ec13af453bae9590bd7711cdb6abf" +
 136			"42f176eadfbe5506fbef5e092e5543733f91b0061d9a7747fa10694a915a6470fa230" +
 137			"de387b51e6f4db0b09787867778687b55197ad6d6a86eac000000001")
 138	require.NoError(t, err)
 139	numTxsL1 := len(l1CoordinatorBytes) / common.RollupConstL1CoordinatorTotalBytes
 140	for i := 0; i < numTxsL1; i++ {
 141		bytesL1Coordinator :=
 142			l1CoordinatorBytes[i*common.RollupConstL1CoordinatorTotalBytes : (i+1)*
 143				common.RollupConstL1CoordinatorTotalBytes]
 144		var signature []byte
 145		v := bytesL1Coordinator[0]
 146		s := bytesL1Coordinator[1:33]
 147		r := bytesL1Coordinator[33:65]
 148		signature = append(signature, r[:]...)
 149		signature = append(signature, s[:]...)
 150		signature = append(signature, v)
 151		l1Tx, err := common.L1CoordinatorTxFromBytes(bytesL1Coordinator, chainid, rollupClient.address)
 152		require.NoError(t, err)
 153		args.L1CoordinatorTxs = append(args.L1CoordinatorTxs, *l1Tx)
 154		args.L1CoordinatorTxsAuths = append(args.L1CoordinatorTxsAuths, signature)
 155	}
 156	args.L1UserTxs = []common.L1Tx{}
 157	args.L2TxsData = []common.L2Tx{}
 158	newStateRoot := new(big.Int)
 159	newStateRoot.SetString(
 160		"18317824016047294649053625209337295956588174734569560016974612130063629505228",
 161		10)
 162	newExitRoot := new(big.Int)
 163	bytesNumExitRoot, err := hex.DecodeString(
 164		"10a89d5fe8d488eda1ba371d633515739933c706c210c604f5bd209180daa43b")
 165	require.NoError(t, err)
 166	newExitRoot.SetBytes(bytesNumExitRoot)
 167	args.NewLastIdx = int64(300)
 168	args.NewStRoot = newStateRoot
 169	args.NewExitRoot = newExitRoot
 170	args.L1Batch = true
 171	args.VerifierIdx = 0
 172	args.ProofA[0] = big.NewInt(0)
 173	args.ProofA[1] = big.NewInt(0)
 174	args.ProofB[0][0] = big.NewInt(0)
 175	args.ProofB[0][1] = big.NewInt(0)
 176	args.ProofB[1][0] = big.NewInt(0)
 177	args.ProofB[1][1] = big.NewInt(0)
 178	args.ProofC[0] = big.NewInt(0)
 179	args.ProofC[1] = big.NewInt(0)
 180
 181	argsForge = args
 182	_, err = rollupClient.RollupForgeBatch(argsForge, nil)
 183	require.NoError(t, err)
 184
 185	currentBlockNum, err = rollupClient.client.EthLastBlock()
 186	require.NoError(t, err)
 187	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 188	require.NoError(t, err)
 189
 190	assert.Equal(t, int64(1), rollupEvents.ForgeBatch[0].BatchNum)
 191	assert.Equal(t, uint16(len(L1UserTxs)), rollupEvents.ForgeBatch[0].L1UserTxsLen)
 192	ethHashForge = rollupEvents.ForgeBatch[0].EthTxHash
 193}
 194
 195func TestRollupForgeBatchArgs(t *testing.T) {
 196	args, sender, err := rollupClient.RollupForgeBatchArgs(ethHashForge, uint16(len(L1UserTxs)))
 197	require.NoError(t, err)
 198	assert.Equal(t, *sender, rollupClient.client.account.Address)
 199	assert.Equal(t, argsForge.FeeIdxCoordinator, args.FeeIdxCoordinator)
 200	assert.Equal(t, argsForge.L1Batch, args.L1Batch)
 201	assert.Equal(t, argsForge.L1CoordinatorTxs, args.L1CoordinatorTxs)
 202	assert.Equal(t, argsForge.L1CoordinatorTxsAuths, args.L1CoordinatorTxsAuths)
 203	assert.Equal(t, argsForge.L2TxsData, args.L2TxsData)
 204	assert.Equal(t, argsForge.NewLastIdx, args.NewLastIdx)
 205	assert.Equal(t, argsForge.NewStRoot, args.NewStRoot)
 206	assert.Equal(t, argsForge.VerifierIdx, args.VerifierIdx)
 207}
 208
 209func TestRollupUpdateForgeL1L2BatchTimeout(t *testing.T) {
 210	newForgeL1L2BatchTimeout := int64(222)
 211	_, err := rollupClient.RollupUpdateForgeL1L2BatchTimeout(newForgeL1L2BatchTimeout)
 212	require.NoError(t, err)
 213
 214	currentBlockNum, err := rollupClient.client.EthLastBlock()
 215	require.NoError(t, err)
 216	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 217	require.NoError(t, err)
 218
 219	assert.Equal(t, newForgeL1L2BatchTimeout,
 220		rollupEvents.UpdateForgeL1L2BatchTimeout[0].NewForgeL1L2BatchTimeout)
 221}
 222
 223func TestRollupUpdateFeeAddToken(t *testing.T) {
 224	newFeeAddToken := big.NewInt(12)
 225	_, err := rollupClient.RollupUpdateFeeAddToken(newFeeAddToken)
 226	require.NoError(t, err)
 227
 228	currentBlockNum, err := rollupClient.client.EthLastBlock()
 229	require.NoError(t, err)
 230	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 231	require.NoError(t, err)
 232
 233	assert.Equal(t, newFeeAddToken, rollupEvents.UpdateFeeAddToken[0].NewFeeAddToken)
 234}
 235
 236func TestRollupUpdateBucketsParameters(t *testing.T) {
 237	var bucketsParameters [common.RollupConstNumBuckets]RollupUpdateBucketsParameters
 238	for i := range bucketsParameters {
 239		bucketsParameters[i].CeilUSD = big.NewInt(int64((i + 1) * 100))
 240		bucketsParameters[i].Withdrawals = big.NewInt(int64(i + 1))
 241		bucketsParameters[i].BlockWithdrawalRate = big.NewInt(int64(i+1) * 100)
 242		bucketsParameters[i].MaxWithdrawals = big.NewInt(int64(100000000000))
 243	}
 244	_, err := rollupClient.RollupUpdateBucketsParameters(bucketsParameters)
 245	require.NoError(t, err)
 246	currentBlockNum, err := rollupClient.client.EthLastBlock()
 247	require.NoError(t, err)
 248	blockStampBucket = currentBlockNum
 249	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 250	require.NoError(t, err)
 251	assert.Equal(t, bucketsParameters, rollupEvents.UpdateBucketsParameters[0].ArrayBuckets)
 252}
 253
 254func TestRollupUpdateWithdrawalDelay(t *testing.T) {
 255	newWithdrawalDelay := int64(100000)
 256	_, err := rollupClient.RollupUpdateWithdrawalDelay(newWithdrawalDelay)
 257	require.NoError(t, err)
 258	currentBlockNum, err := rollupClient.client.EthLastBlock()
 259	require.NoError(t, err)
 260	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 261	require.NoError(t, err)
 262	assert.Equal(t, newWithdrawalDelay,
 263		int64(rollupEvents.UpdateWithdrawalDelay[0].NewWithdrawalDelay))
 264}
 265
 266func TestRollupUpdateTokenExchange(t *testing.T) {
 267	var addressArray []ethCommon.Address
 268	var valueArray []uint64
 269	addressToken1, err := rollupClient.hermez.TokenList(nil, big.NewInt(1))
 270	addressArray = append(addressArray, addressToken1)
 271	tokenPrice := 10
 272	valueArray = append(valueArray, uint64(tokenPrice*1e14))
 273	require.NoError(t, err)
 274	_, err = rollupClient.RollupUpdateTokenExchange(addressArray, valueArray)
 275	require.NoError(t, err)
 276	currentBlockNum, err := rollupClient.client.EthLastBlock()
 277	require.NoError(t, err)
 278	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 279	require.NoError(t, err)
 280	assert.Equal(t, addressArray, rollupEvents.UpdateTokenExchange[0].AddressArray)
 281	assert.Equal(t, valueArray, rollupEvents.UpdateTokenExchange[0].ValueArray)
 282}
 283
 284func TestRollupL1UserTxETHCreateAccountDeposit(t *testing.T) {
 285	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst, tokenHEZ)
 286	require.NoError(t, err)
 287	key := genKeysBjj(2)
 288	fromIdxInt64 := int64(0)
 289	toIdxInt64 := int64(0)
 290	tokenIDUint32 := uint32(0)
 291	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 292	l1Tx := common.L1Tx{
 293		FromBJJ:       key.BJJPublicKey.Compress(),
 294		FromIdx:       common.Idx(fromIdxInt64),
 295		ToIdx:         common.Idx(toIdxInt64),
 296		DepositAmount: depositAmount,
 297		TokenID:       common.TokenID(tokenIDUint32),
 298		Amount:        big.NewInt(0),
 299	}
 300	L1UserTxs = append(L1UserTxs, l1Tx)
 301
 302	_, err = rollupClientAux.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 303		l1Tx.DepositAmount, l1Tx.Amount, tokenIDUint32, toIdxInt64)
 304	require.NoError(t, err)
 305
 306	currentBlockNum, err := rollupClient.client.EthLastBlock()
 307	require.NoError(t, err)
 308	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 309	require.NoError(t, err)
 310	assert.Equal(t, l1Tx.FromBJJ, rollupEvents.L1UserTx[0].L1UserTx.FromBJJ)
 311	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 312	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 313	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 314	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 315	assert.Equal(t, rollupClientAux.client.account.Address,
 316		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 317}
 318
 319func TestRollupL1UserTxERC20CreateAccountDeposit(t *testing.T) {
 320	rollupClientAux2, err := NewRollupClient(ethereumClientAux2, hermezRollupAddressConst,
 321		tokenHEZ)
 322	require.NoError(t, err)
 323	key := genKeysBjj(1)
 324	fromIdxInt64 := int64(0)
 325	toIdxInt64 := int64(0)
 326	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 327	l1Tx := common.L1Tx{
 328		FromBJJ:       key.BJJPublicKey.Compress(),
 329		FromIdx:       common.Idx(fromIdxInt64),
 330		ToIdx:         common.Idx(toIdxInt64),
 331		DepositAmount: depositAmount,
 332		TokenID:       common.TokenID(tokenHEZID),
 333		Amount:        big.NewInt(0),
 334	}
 335	L1UserTxs = append(L1UserTxs, l1Tx)
 336
 337	_, err = rollupClientAux2.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 338		l1Tx.DepositAmount, l1Tx.Amount, tokenHEZID, toIdxInt64)
 339	require.NoError(t, err)
 340
 341	currentBlockNum, err := rollupClient.client.EthLastBlock()
 342	require.NoError(t, err)
 343	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 344	require.NoError(t, err)
 345	assert.Equal(t, l1Tx.FromBJJ, rollupEvents.L1UserTx[0].L1UserTx.FromBJJ)
 346	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 347	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 348	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 349	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 350	assert.Equal(t, rollupClientAux2.client.account.Address,
 351		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 352}
 353
 354func TestRollupL1UserTxERC20PermitCreateAccountDeposit(t *testing.T) {
 355	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 356		tokenHEZ)
 357	require.NoError(t, err)
 358	key := genKeysBjj(3)
 359	fromIdxInt64 := int64(0)
 360	toIdxInt64 := int64(0)
 361	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 362	l1Tx := common.L1Tx{
 363		FromBJJ:       key.BJJPublicKey.Compress(),
 364		FromIdx:       common.Idx(fromIdxInt64),
 365		ToIdx:         common.Idx(toIdxInt64),
 366		DepositAmount: depositAmount,
 367		TokenID:       common.TokenID(tokenIDERC777),
 368		Amount:        big.NewInt(0),
 369	}
 370	L1UserTxs = append(L1UserTxs, l1Tx)
 371
 372	_, err = rollupClientAux.RollupL1UserTxERC20Permit(l1Tx.FromBJJ, fromIdxInt64,
 373		l1Tx.DepositAmount, l1Tx.Amount, tokenIDERC777, toIdxInt64, deadline)
 374	require.NoError(t, err)
 375
 376	currentBlockNum, err := rollupClient.client.EthLastBlock()
 377	require.NoError(t, err)
 378	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 379	require.NoError(t, err)
 380	assert.Equal(t, l1Tx.FromBJJ, rollupEvents.L1UserTx[0].L1UserTx.FromBJJ)
 381	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 382	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 383	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 384	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 385	assert.Equal(t, rollupClientAux.client.account.Address,
 386		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 387}
 388
 389func TestRollupL1UserTxETHDeposit(t *testing.T) {
 390	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 391		tokenHEZ)
 392	require.NoError(t, err)
 393	fromIdxInt64 := int64(256)
 394	toIdxInt64 := int64(0)
 395	tokenIDUint32 := uint32(0)
 396	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 397	l1Tx := common.L1Tx{
 398		FromBJJ:       common.EmptyBJJComp,
 399		FromIdx:       common.Idx(fromIdxInt64),
 400		ToIdx:         common.Idx(toIdxInt64),
 401		DepositAmount: depositAmount,
 402		TokenID:       common.TokenID(tokenIDUint32),
 403		Amount:        big.NewInt(0),
 404	}
 405	L1UserTxs = append(L1UserTxs, l1Tx)
 406
 407	_, err = rollupClientAux.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 408		l1Tx.DepositAmount, l1Tx.Amount, tokenIDUint32, toIdxInt64)
 409	require.NoError(t, err)
 410
 411	currentBlockNum, err := rollupClient.client.EthLastBlock()
 412	require.NoError(t, err)
 413	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 414	require.NoError(t, err)
 415	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 416	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 417	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 418	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 419	assert.Equal(t, rollupClientAux.client.account.Address,
 420		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 421}
 422
 423func TestRollupL1UserTxERC20Deposit(t *testing.T) {
 424	rollupClientAux2, err := NewRollupClient(ethereumClientAux2, hermezRollupAddressConst,
 425		tokenHEZ)
 426	require.NoError(t, err)
 427	fromIdxInt64 := int64(257)
 428	toIdxInt64 := int64(0)
 429	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 430	l1Tx := common.L1Tx{
 431		FromBJJ:       common.EmptyBJJComp,
 432		FromIdx:       common.Idx(fromIdxInt64),
 433		ToIdx:         common.Idx(toIdxInt64),
 434		DepositAmount: depositAmount,
 435		TokenID:       common.TokenID(tokenHEZID),
 436		Amount:        big.NewInt(0),
 437	}
 438	L1UserTxs = append(L1UserTxs, l1Tx)
 439
 440	_, err = rollupClientAux2.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 441		l1Tx.DepositAmount, l1Tx.Amount, tokenHEZID, toIdxInt64)
 442	require.NoError(t, err)
 443
 444	currentBlockNum, err := rollupClient.client.EthLastBlock()
 445	require.NoError(t, err)
 446	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 447	require.NoError(t, err)
 448	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 449	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 450	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 451	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 452	assert.Equal(t, rollupClientAux2.client.account.Address,
 453		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 454}
 455
 456func TestRollupL1UserTxERC20PermitDeposit(t *testing.T) {
 457	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 458		tokenHEZ)
 459	require.NoError(t, err)
 460	fromIdxInt64 := int64(258)
 461	toIdxInt64 := int64(0)
 462	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 463	l1Tx := common.L1Tx{
 464		FromIdx:       common.Idx(fromIdxInt64),
 465		ToIdx:         common.Idx(toIdxInt64),
 466		DepositAmount: depositAmount,
 467		TokenID:       common.TokenID(tokenIDERC777),
 468		Amount:        big.NewInt(0),
 469	}
 470	L1UserTxs = append(L1UserTxs, l1Tx)
 471
 472	_, err = rollupClientAux.RollupL1UserTxERC20Permit(l1Tx.FromBJJ, fromIdxInt64,
 473		l1Tx.DepositAmount, l1Tx.Amount, tokenIDERC777, toIdxInt64, deadline)
 474	require.NoError(t, err)
 475
 476	currentBlockNum, err := rollupClient.client.EthLastBlock()
 477	require.NoError(t, err)
 478	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 479	require.NoError(t, err)
 480	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 481	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 482	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 483	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 484	assert.Equal(t, rollupClientAux.client.account.Address,
 485		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 486}
 487
 488func TestRollupL1UserTxETHDepositTransfer(t *testing.T) {
 489	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 490		tokenHEZ)
 491	require.NoError(t, err)
 492	fromIdxInt64 := int64(256)
 493	toIdxInt64 := int64(257)
 494	tokenIDUint32 := uint32(0)
 495	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 496	amount, _ := new(big.Int).SetString("100000000000000000000", 10)
 497	l1Tx := common.L1Tx{
 498		FromIdx:       common.Idx(fromIdxInt64),
 499		ToIdx:         common.Idx(toIdxInt64),
 500		DepositAmount: depositAmount,
 501		TokenID:       common.TokenID(tokenIDUint32),
 502		Amount:        amount,
 503	}
 504	L1UserTxs = append(L1UserTxs, l1Tx)
 505
 506	_, err = rollupClientAux.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 507		l1Tx.DepositAmount, l1Tx.Amount, tokenIDUint32, toIdxInt64)
 508	require.NoError(t, err)
 509
 510	currentBlockNum, err := rollupClient.client.EthLastBlock()
 511	require.NoError(t, err)
 512	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 513	require.NoError(t, err)
 514	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 515	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 516	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 517	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 518	assert.Equal(t, rollupClientAux.client.account.Address,
 519		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 520}
 521
 522func TestRollupL1UserTxERC20DepositTransfer(t *testing.T) {
 523	rollupClientAux2, err := NewRollupClient(ethereumClientAux2, hermezRollupAddressConst,
 524		tokenHEZ)
 525	require.NoError(t, err)
 526	fromIdxInt64 := int64(257)
 527	toIdxInt64 := int64(258)
 528	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 529	amount, _ := new(big.Int).SetString("100000000000000000000", 10)
 530	l1Tx := common.L1Tx{
 531		FromIdx:       common.Idx(fromIdxInt64),
 532		ToIdx:         common.Idx(toIdxInt64),
 533		DepositAmount: depositAmount,
 534		TokenID:       common.TokenID(tokenHEZID),
 535		Amount:        amount,
 536	}
 537	L1UserTxs = append(L1UserTxs, l1Tx)
 538
 539	_, err = rollupClientAux2.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 540		l1Tx.DepositAmount, l1Tx.Amount, tokenHEZID, toIdxInt64)
 541	require.NoError(t, err)
 542
 543	currentBlockNum, err := rollupClient.client.EthLastBlock()
 544	require.NoError(t, err)
 545	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 546	require.NoError(t, err)
 547	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 548	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 549	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 550	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 551	assert.Equal(t, rollupClientAux2.client.account.Address,
 552		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 553}
 554
 555func TestRollupL1UserTxERC20PermitDepositTransfer(t *testing.T) {
 556	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 557		tokenHEZ)
 558	require.NoError(t, err)
 559	fromIdxInt64 := int64(258)
 560	toIdxInt64 := int64(259)
 561	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 562	amount, _ := new(big.Int).SetString("100000000000000000000", 10)
 563	l1Tx := common.L1Tx{
 564		FromIdx:       common.Idx(fromIdxInt64),
 565		ToIdx:         common.Idx(toIdxInt64),
 566		DepositAmount: depositAmount,
 567		TokenID:       common.TokenID(tokenIDERC777),
 568		Amount:        amount,
 569	}
 570	L1UserTxs = append(L1UserTxs, l1Tx)
 571
 572	_, err = rollupClientAux.RollupL1UserTxERC20Permit(l1Tx.FromBJJ, fromIdxInt64,
 573		l1Tx.DepositAmount, l1Tx.Amount, tokenIDERC777, toIdxInt64, deadline)
 574	require.NoError(t, err)
 575
 576	currentBlockNum, err := rollupClient.client.EthLastBlock()
 577	require.NoError(t, err)
 578	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 579	require.NoError(t, err)
 580	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 581	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 582	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 583	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 584	assert.Equal(t, rollupClientAux.client.account.Address,
 585		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 586}
 587
 588func TestRollupL1UserTxETHCreateAccountDepositTransfer(t *testing.T) {
 589	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 590		tokenHEZ)
 591	require.NoError(t, err)
 592	fromIdxInt64 := int64(256)
 593	toIdxInt64 := int64(257)
 594	tokenIDUint32 := uint32(0)
 595	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 596	amount, _ := new(big.Int).SetString("20000000000000000000", 10)
 597	l1Tx := common.L1Tx{
 598		FromIdx:       common.Idx(fromIdxInt64),
 599		ToIdx:         common.Idx(toIdxInt64),
 600		DepositAmount: depositAmount,
 601		TokenID:       common.TokenID(tokenIDUint32),
 602		Amount:        amount,
 603	}
 604	L1UserTxs = append(L1UserTxs, l1Tx)
 605
 606	_, err = rollupClientAux.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 607		l1Tx.DepositAmount, l1Tx.Amount, tokenIDUint32, toIdxInt64)
 608	require.NoError(t, err)
 609
 610	currentBlockNum, err := rollupClient.client.EthLastBlock()
 611	require.NoError(t, err)
 612	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 613	require.NoError(t, err)
 614	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 615	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 616	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 617	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 618	assert.Equal(t, rollupClientAux.client.account.Address,
 619		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 620}
 621
 622func TestRollupL1UserTxERC20CreateAccountDepositTransfer(t *testing.T) {
 623	rollupClientAux2, err := NewRollupClient(ethereumClientAux2, hermezRollupAddressConst,
 624		tokenHEZ)
 625	require.NoError(t, err)
 626	fromIdxInt64 := int64(257)
 627	toIdxInt64 := int64(258)
 628	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 629	amount, _ := new(big.Int).SetString("30000000000000000000", 10)
 630	l1Tx := common.L1Tx{
 631		FromIdx:       common.Idx(fromIdxInt64),
 632		ToIdx:         common.Idx(toIdxInt64),
 633		DepositAmount: depositAmount,
 634		TokenID:       common.TokenID(tokenHEZID),
 635		Amount:        amount,
 636	}
 637	L1UserTxs = append(L1UserTxs, l1Tx)
 638
 639	_, err = rollupClientAux2.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 640		l1Tx.DepositAmount, l1Tx.Amount, tokenHEZID, toIdxInt64)
 641	require.NoError(t, err)
 642
 643	currentBlockNum, err := rollupClient.client.EthLastBlock()
 644	require.NoError(t, err)
 645	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 646	require.NoError(t, err)
 647	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 648	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 649	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 650	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 651	assert.Equal(t, rollupClientAux2.client.account.Address,
 652		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 653}
 654
 655func TestRollupL1UserTxERC20PermitCreateAccountDepositTransfer(t *testing.T) {
 656	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 657		tokenHEZ)
 658	require.NoError(t, err)
 659	fromIdxInt64 := int64(258)
 660	toIdxInt64 := int64(259)
 661	depositAmount, _ := new(big.Int).SetString("1000000000000000000000", 10)
 662	amount, _ := new(big.Int).SetString("40000000000000000000", 10)
 663	l1Tx := common.L1Tx{
 664		FromIdx:       common.Idx(fromIdxInt64),
 665		ToIdx:         common.Idx(toIdxInt64),
 666		DepositAmount: depositAmount,
 667		TokenID:       common.TokenID(tokenIDERC777),
 668		Amount:        amount,
 669	}
 670	L1UserTxs = append(L1UserTxs, l1Tx)
 671
 672	_, err = rollupClientAux.RollupL1UserTxERC20Permit(l1Tx.FromBJJ, fromIdxInt64,
 673		l1Tx.DepositAmount, l1Tx.Amount, tokenIDERC777, toIdxInt64, deadline)
 674	require.NoError(t, err)
 675
 676	currentBlockNum, err := rollupClient.client.EthLastBlock()
 677	require.NoError(t, err)
 678	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 679	require.NoError(t, err)
 680	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 681	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 682	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 683	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 684	assert.Equal(t, rollupClientAux.client.account.Address,
 685		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 686}
 687
 688func TestRollupL1UserTxETHForceTransfer(t *testing.T) {
 689	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 690		tokenHEZ)
 691	require.NoError(t, err)
 692	fromIdxInt64 := int64(256)
 693	toIdxInt64 := int64(257)
 694	tokenIDUint32 := uint32(0)
 695	amount, _ := new(big.Int).SetString("20000000000000000000", 10)
 696	l1Tx := common.L1Tx{
 697		FromIdx:       common.Idx(fromIdxInt64),
 698		ToIdx:         common.Idx(toIdxInt64),
 699		DepositAmount: big.NewInt(0),
 700		TokenID:       common.TokenID(tokenIDUint32),
 701		Amount:        amount,
 702	}
 703	L1UserTxs = append(L1UserTxs, l1Tx)
 704
 705	_, err = rollupClientAux.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 706		l1Tx.DepositAmount, l1Tx.Amount, tokenIDUint32, toIdxInt64)
 707	require.NoError(t, err)
 708
 709	currentBlockNum, err := rollupClient.client.EthLastBlock()
 710	require.NoError(t, err)
 711	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 712	require.NoError(t, err)
 713	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 714	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 715	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 716	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 717	assert.Equal(t, rollupClientAux.client.account.Address,
 718		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 719}
 720
 721func TestRollupL1UserTxERC20ForceTransfer(t *testing.T) {
 722	rollupClientAux2, err := NewRollupClient(ethereumClientAux2, hermezRollupAddressConst,
 723		tokenHEZ)
 724	require.NoError(t, err)
 725	fromIdxInt64 := int64(257)
 726	toIdxInt64 := int64(258)
 727	amount, _ := new(big.Int).SetString("10000000000000000000", 10)
 728	l1Tx := common.L1Tx{
 729		FromIdx:       common.Idx(fromIdxInt64),
 730		ToIdx:         common.Idx(toIdxInt64),
 731		DepositAmount: big.NewInt(0),
 732		TokenID:       common.TokenID(tokenHEZID),
 733		Amount:        amount,
 734	}
 735	L1UserTxs = append(L1UserTxs, l1Tx)
 736
 737	_, err = rollupClientAux2.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 738		l1Tx.DepositAmount, l1Tx.Amount, tokenHEZID, toIdxInt64)
 739	require.NoError(t, err)
 740
 741	currentBlockNum, err := rollupClient.client.EthLastBlock()
 742	require.NoError(t, err)
 743	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 744	require.NoError(t, err)
 745	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 746	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 747	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 748	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 749	assert.Equal(t, rollupClientAux2.client.account.Address,
 750		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 751}
 752
 753func TestRollupL1UserTxERC20PermitForceTransfer(t *testing.T) {
 754	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 755		tokenHEZ)
 756	require.NoError(t, err)
 757	fromIdxInt64 := int64(259)
 758	toIdxInt64 := int64(260)
 759	amount, _ := new(big.Int).SetString("30000000000000000000", 10)
 760	l1Tx := common.L1Tx{
 761		FromIdx:       common.Idx(fromIdxInt64),
 762		ToIdx:         common.Idx(toIdxInt64),
 763		DepositAmount: big.NewInt(0),
 764		TokenID:       common.TokenID(tokenIDERC777),
 765		Amount:        amount,
 766	}
 767	L1UserTxs = append(L1UserTxs, l1Tx)
 768
 769	_, err = rollupClientAux.RollupL1UserTxERC20Permit(l1Tx.FromBJJ, fromIdxInt64,
 770		l1Tx.DepositAmount, l1Tx.Amount, tokenIDERC777, toIdxInt64, deadline)
 771	require.NoError(t, err)
 772
 773	currentBlockNum, err := rollupClient.client.EthLastBlock()
 774	require.NoError(t, err)
 775	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 776	require.NoError(t, err)
 777	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 778	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 779	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 780	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 781	assert.Equal(t, rollupClientAux.client.account.Address,
 782		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 783}
 784
 785func TestRollupL1UserTxETHForceExit(t *testing.T) {
 786	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 787		tokenHEZ)
 788	require.NoError(t, err)
 789	fromIdxInt64 := int64(256)
 790	toIdxInt64 := int64(1)
 791	tokenIDUint32 := uint32(0)
 792	amount, _ := new(big.Int).SetString("10000000000000000000", 10)
 793	l1Tx := common.L1Tx{
 794		FromIdx:       common.Idx(fromIdxInt64),
 795		ToIdx:         common.Idx(toIdxInt64),
 796		DepositAmount: big.NewInt(0),
 797		TokenID:       common.TokenID(tokenIDUint32),
 798		Amount:        amount,
 799	}
 800	L1UserTxs = append(L1UserTxs, l1Tx)
 801
 802	_, err = rollupClientAux.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 803		l1Tx.DepositAmount, l1Tx.Amount, tokenIDUint32, toIdxInt64)
 804	require.NoError(t, err)
 805
 806	currentBlockNum, err := rollupClient.client.EthLastBlock()
 807	require.NoError(t, err)
 808	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 809	require.NoError(t, err)
 810	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 811	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 812	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 813	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 814	assert.Equal(t, rollupClientAux.client.account.Address,
 815		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 816}
 817
 818func TestRollupL1UserTxERC20ForceExit(t *testing.T) {
 819	rollupClientAux2, err := NewRollupClient(ethereumClientAux2, hermezRollupAddressConst,
 820		tokenHEZ)
 821	require.NoError(t, err)
 822	fromIdxInt64 := int64(257)
 823	toIdxInt64 := int64(1)
 824	amount, _ := new(big.Int).SetString("20000000000000000000", 10)
 825	l1Tx := common.L1Tx{
 826		FromIdx:       common.Idx(fromIdxInt64),
 827		ToIdx:         common.Idx(toIdxInt64),
 828		DepositAmount: big.NewInt(0),
 829		TokenID:       common.TokenID(tokenHEZID),
 830		Amount:        amount,
 831	}
 832	L1UserTxs = append(L1UserTxs, l1Tx)
 833
 834	_, err = rollupClientAux2.RollupL1UserTxERC20ETH(l1Tx.FromBJJ, fromIdxInt64,
 835		l1Tx.DepositAmount, l1Tx.Amount, tokenHEZID, toIdxInt64)
 836	require.NoError(t, err)
 837
 838	currentBlockNum, err := rollupClient.client.EthLastBlock()
 839	require.NoError(t, err)
 840	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 841	require.NoError(t, err)
 842	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 843	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 844	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 845	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 846	assert.Equal(t, rollupClientAux2.client.account.Address,
 847		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 848}
 849
 850func TestRollupL1UserTxERC20PermitForceExit(t *testing.T) {
 851	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst,
 852		tokenHEZ)
 853	require.NoError(t, err)
 854	fromIdxInt64 := int64(258)
 855	toIdxInt64 := int64(1)
 856	fromIdx := new(common.Idx)
 857	*fromIdx = 0
 858	amount, _ := new(big.Int).SetString("30000000000000000000", 10)
 859	l1Tx := common.L1Tx{
 860		FromIdx:       common.Idx(fromIdxInt64),
 861		ToIdx:         common.Idx(toIdxInt64),
 862		DepositAmount: big.NewInt(0),
 863		TokenID:       common.TokenID(tokenIDERC777),
 864		Amount:        amount,
 865	}
 866	L1UserTxs = append(L1UserTxs, l1Tx)
 867
 868	_, err = rollupClientAux.RollupL1UserTxERC20Permit(l1Tx.FromBJJ, fromIdxInt64,
 869		l1Tx.DepositAmount, l1Tx.Amount, tokenIDERC777, toIdxInt64, deadline)
 870	require.NoError(t, err)
 871
 872	currentBlockNum, err := rollupClient.client.EthLastBlock()
 873	require.NoError(t, err)
 874	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 875	require.NoError(t, err)
 876	assert.Equal(t, l1Tx.ToIdx, rollupEvents.L1UserTx[0].L1UserTx.ToIdx)
 877	assert.Equal(t, l1Tx.DepositAmount, rollupEvents.L1UserTx[0].L1UserTx.DepositAmount)
 878	assert.Equal(t, l1Tx.TokenID, rollupEvents.L1UserTx[0].L1UserTx.TokenID)
 879	assert.Equal(t, l1Tx.Amount, rollupEvents.L1UserTx[0].L1UserTx.Amount)
 880	assert.Equal(t, rollupClientAux.client.account.Address,
 881		rollupEvents.L1UserTx[0].L1UserTx.FromEthAddr)
 882}
 883
 884func TestRollupForgeBatch2(t *testing.T) {
 885	// Forge Batch 2
 886	_, err := rollupClient.RollupForgeBatch(argsForge, nil)
 887	require.NoError(t, err)
 888	currentBlockNum, err := rollupClient.client.EthLastBlock()
 889	require.NoError(t, err)
 890	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 891	require.NoError(t, err)
 892
 893	assert.Equal(t, int64(2), rollupEvents.ForgeBatch[0].BatchNum)
 894
 895	// Forge Batch 3
 896	args := new(RollupForgeBatchArgs)
 897	// When encoded, 64 times the 0 idx means that no idx to collect fees is specified.
 898	args.FeeIdxCoordinator = []common.Idx{}
 899	args.L1CoordinatorTxs = argsForge.L1CoordinatorTxs
 900	args.L1CoordinatorTxsAuths = argsForge.L1CoordinatorTxsAuths
 901	for i := 0; i < len(L1UserTxs); i++ {
 902		l1UserTx := L1UserTxs[i]
 903		l1UserTx.EffectiveAmount = l1UserTx.Amount
 904		l1Bytes, err := l1UserTx.BytesDataAvailability(uint32(nLevels))
 905		require.NoError(t, err)
 906		l1UserTxDataAvailability, err := common.L1TxFromDataAvailability(l1Bytes,
 907			uint32(nLevels))
 908		require.NoError(t, err)
 909		args.L1UserTxs = append(args.L1UserTxs, *l1UserTxDataAvailability)
 910	}
 911	newStateRoot := new(big.Int)
 912	newStateRoot.SetString(
 913		"18317824016047294649053625209337295956588174734569560016974612130063629505228",
 914		10)
 915	newExitRoot := new(big.Int)
 916	newExitRoot.SetString(
 917		"1114281409737474688393837964161044726766678436313681099613347372031079422302",
 918		10)
 919	amount := new(big.Int)
 920	amount.SetString("79000000", 10)
 921	l2Tx := common.L2Tx{
 922		ToIdx:   256,
 923		Amount:  amount,
 924		FromIdx: 257,
 925		Fee:     201,
 926	}
 927	l2Txs := []common.L2Tx{}
 928	l2Txs = append(l2Txs, l2Tx)
 929	l2Txs = append(l2Txs, l2Tx)
 930	args.L2TxsData = l2Txs
 931	args.NewLastIdx = int64(1000)
 932	args.NewStRoot = newStateRoot
 933	args.NewExitRoot = newExitRoot
 934	args.L1Batch = true
 935	args.VerifierIdx = 0
 936	args.ProofA[0] = big.NewInt(0)
 937	args.ProofA[1] = big.NewInt(0)
 938	args.ProofB[0] = [2]*big.Int{big.NewInt(0), big.NewInt(0)}
 939	args.ProofB[1] = [2]*big.Int{big.NewInt(0), big.NewInt(0)}
 940	args.ProofC[0] = big.NewInt(0)
 941	args.ProofC[1] = big.NewInt(0)
 942
 943	argsForge = args
 944
 945	_, err = rollupClient.RollupForgeBatch(argsForge, nil)
 946	require.NoError(t, err)
 947
 948	currentBlockNum, err = rollupClient.client.EthLastBlock()
 949	require.NoError(t, err)
 950	rollupEvents, err = rollupClient.RollupEventsByBlock(currentBlockNum, nil)
 951	require.NoError(t, err)
 952
 953	assert.Equal(t, int64(3), rollupEvents.ForgeBatch[0].BatchNum)
 954	assert.Equal(t, uint16(len(L1UserTxs)), rollupEvents.ForgeBatch[0].L1UserTxsLen)
 955	ethHashForge = rollupEvents.ForgeBatch[0].EthTxHash
 956}
 957
 958func TestRollupForgeBatchArgs2(t *testing.T) {
 959	args, sender, err := rollupClient.RollupForgeBatchArgs(ethHashForge, uint16(len(L1UserTxs)))
 960	require.NoError(t, err)
 961	assert.Equal(t, *sender, rollupClient.client.account.Address)
 962	assert.Equal(t, argsForge.FeeIdxCoordinator, args.FeeIdxCoordinator)
 963	assert.Equal(t, argsForge.L1Batch, args.L1Batch)
 964	assert.Equal(t, argsForge.L1UserTxs, args.L1UserTxs)
 965	assert.Equal(t, argsForge.L1CoordinatorTxs, args.L1CoordinatorTxs)
 966	assert.Equal(t, argsForge.L1CoordinatorTxsAuths, args.L1CoordinatorTxsAuths)
 967	assert.Equal(t, argsForge.L2TxsData, args.L2TxsData)
 968	assert.Equal(t, argsForge.NewLastIdx, args.NewLastIdx)
 969	assert.Equal(t, argsForge.NewStRoot, args.NewStRoot)
 970	assert.Equal(t, argsForge.VerifierIdx, args.VerifierIdx)
 971}
 972
 973func TestRollupWithdrawMerkleProof(t *testing.T) {
 974	rollupClientAux, err := NewRollupClient(ethereumClientAux, hermezRollupAddressConst, tokenHEZ)
 975	require.NoError(t, err)
 976
 977	var pkComp babyjub.PublicKeyComp
 978	pkCompBE, err :=
 979		hex.DecodeString("adc3b754f8da621967b073a787bef8eec7052f2ba712b23af57d98f65beea8b2")
 980	require.NoError(t, err)
 981	pkCompLE := common.SwapEndianness(pkCompBE)
 982	copy(pkComp[:], pkCompLE)
 983
 984	require.NoError(t, err)
 985	tokenID := uint32(tokenHEZID)
 986	numExitRoot := int64(3)
 987	fromIdx := int64(256)
 988	amount, _ := new(big.Int).SetString("20000000000000000000", 10)
 989	// siblingBytes0, err := new(big.Int).SetString(
 990	// 		"19508838618377323910556678335932426220272947530531646682154552299216398748115",
 991	// 		10)
 992	// require.NoError(t, err)
 993	// siblingBytes1, err := new(big.Int).SetString(
 994	// 	"15198806719713909654457742294233381653226080862567104272457668857208564789571", 10)
 995	// require.NoError(t, err)
 996	var siblings []*big.Int
 997	// siblings = append(siblings, siblingBytes0)
 998	// siblings = append(siblings, siblingBytes1)
 999	instantWithdraw := true
1000
1001	_, err = rollupClientAux.RollupWithdrawMerkleProof(pkComp, tokenID, numExitRoot, fromIdx,
1002		amount, siblings, instantWithdraw)
1003	require.NoError(t, err)
1004
1005	currentBlockNum, err := rollupClient.client.EthLastBlock()
1006	require.NoError(t, err)
1007	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
1008	require.NoError(t, err)
1009
1010	assert.Equal(t, uint64(fromIdx), rollupEvents.Withdraw[0].Idx)
1011	assert.Equal(t, instantWithdraw, rollupEvents.Withdraw[0].InstantWithdraw)
1012	assert.Equal(t, uint64(numExitRoot), rollupEvents.Withdraw[0].NumExitRoot)
1013	// tokenAmount = 20
1014	// amountUSD = tokenAmount * tokenPrice = 20 * 10 = 200
1015	// Bucket[0].ceilUSD = 100, Bucket[1].ceilUSD = 200, ...
1016	// Bucket 1
1017	// Bucket[0].withdrawals = 1, Bucket[1].withdrawals = 2, ...
1018	// Bucket[1].withdrawals - 1 = 1
1019	assert.Equal(t, 1, rollupEvents.UpdateBucketWithdraw[0].NumBucket)
1020	assert.Equal(t, blockStampBucket, rollupEvents.UpdateBucketWithdraw[0].BlockStamp)
1021	assert.Equal(t, big.NewInt(1), rollupEvents.UpdateBucketWithdraw[0].Withdrawals)
1022}
1023
1024func TestRollupSafeMode(t *testing.T) {
1025	_, err := rollupClient.RollupSafeMode()
1026	require.NoError(t, err)
1027
1028	currentBlockNum, err := rollupClient.client.EthLastBlock()
1029	require.NoError(t, err)
1030	rollupEvents, err := rollupClient.RollupEventsByBlock(currentBlockNum, nil)
1031	require.NoError(t, err)
1032	auxEvent := new(RollupEventSafeMode)
1033	assert.Equal(t, auxEvent, &rollupEvents.SafeMode[0])
1034}