// Package txsets contains Til sets of transactions & Transactions generation // that are used at tests of other packages of hermez-node //nolint:gomnd package txsets import ( "encoding/hex" "math/big" "strconv" "testing" ethCommon "github.com/ethereum/go-ethereum/common" "github.com/hermeznetwork/hermez-node/common" "github.com/hermeznetwork/hermez-node/test/til" "github.com/iden3/go-iden3-crypto/babyjub" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // The methods from this file are used at txprocessor package to test the // ZKInputs generation & at tests of the test/zkproof to test the integration // of the ZKInputs generation with the proof server // GenerateJsUsers generates the same values than in the js test func GenerateJsUsers(t *testing.T) []til.User { // same values than in the js test // skJsHex is equivalent to the 0000...000i js private key in commonjs skJsHex := []string{"7eb258e61862aae75c6c1d1f7efae5006ffc9e4d5596a6ff95f3df4ea209ea7f", "c005700f76f4b4cec710805c21595688648524df0a9d467afae537b7a7118819", "b373d14c67fb2a517bf4ac831c93341eec8e1b38dbc14e7d725b292a7cf84707", "2064b68d04a7aaae0ac3b36bf6f1850b380f1423be94a506c531940bd4a48b76"} addrHex := []string{"0x7e5f4552091a69125d5dfcb7b8c2659029395bdf", "0x2b5ad5c4795c026514f8317c7a215e218dccd6cf", "0x6813eb9362372eef6200f3b1dbc3f819671cba69", "0x1eff47bc3a10a45d4b230b5d10e37751fe6aa718"} var users []til.User for i := 0; i < len(skJsHex); i++ { skJs, err := hex.DecodeString(skJsHex[i]) require.NoError(t, err) var sk babyjub.PrivateKey copy(sk[:], skJs) // bjj := sk.Public() user := til.User{ Name: strconv.Itoa(i), BJJ: &sk, Addr: ethCommon.HexToAddress(addrHex[i]), } users = append(users, user) } assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", users[0].BJJ.Public().String()) assert.Equal(t, "4d05c307400c65795f02db96b1b81c60386fd53e947d9d3f749f3d99b1853909", users[1].BJJ.Public().String()) assert.Equal(t, "38ffa002724562eb2a952a2503e206248962406cf16392ff32759b6f2a41fe11", users[2].BJJ.Public().String()) assert.Equal(t, "c719e6401190be7fa7fbfcd3448fe2755233c01575341a3b09edadf5454f760b", users[3].BJJ.Public().String()) return users } func signL2Tx(t *testing.T, chainID uint16, user til.User, l2Tx common.PoolL2Tx) common.PoolL2Tx { toSign, err := l2Tx.HashToSign(chainID) require.NoError(t, err) sig := user.BJJ.SignPoseidon(toSign) l2Tx.Signature = sig.Compress() return l2Tx } // GenerateTxsZKInputsHash0 generates the transactions for the TestZKInputsHash0 func GenerateTxsZKInputsHash0(t *testing.T, chainID uint16) (users []til.User, coordIdxs []common.Idx, l1UserTxs []common.L1Tx, l1CoordTxs []common.L1Tx, l2Txs []common.PoolL2Tx) { // same values than in the js test users = GenerateJsUsers(t) l1UserTxs = []common.L1Tx{ { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[0].BJJ.Public().Compress(), FromEthAddr: users[0].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, } l2Txs = []common.PoolL2Tx{ { FromIdx: 256, ToIdx: 256, TokenID: 1, Amount: big.NewInt(1000), Nonce: 0, Fee: 126, Type: common.TxTypeTransfer, }, } l2Txs[0] = signL2Tx(t, chainID, users[0], l2Txs[0]) return users, []common.Idx{}, l1UserTxs, []common.L1Tx{}, l2Txs } // GenerateTxsZKInputsHash1 generates the transactions for the TestZKInputsHash1 func GenerateTxsZKInputsHash1(t *testing.T, chainID uint16) (users []til.User, coordIdxs []common.Idx, l1UserTxs []common.L1Tx, l1CoordTxs []common.L1Tx, l2Txs []common.PoolL2Tx) { // same values than in the js test users = GenerateJsUsers(t) l1UserTxs = []common.L1Tx{ { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[0].BJJ.Public().Compress(), FromEthAddr: users[0].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[1].BJJ.Public().Compress(), FromEthAddr: users[1].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, } l2Txs = []common.PoolL2Tx{ { FromIdx: 257, ToIdx: 256, TokenID: 1, Amount: big.NewInt(1000), Nonce: 0, Fee: 137, Type: common.TxTypeTransfer, }, } l2Txs[0] = signL2Tx(t, chainID, users[0], l2Txs[0]) return users, []common.Idx{}, l1UserTxs, []common.L1Tx{}, l2Txs } // GenerateTxsZKInputs0 generates the transactions for the TestZKInputs0 func GenerateTxsZKInputs0(t *testing.T, chainID uint16) (users []til.User, coordIdxs []common.Idx, l1UserTxs []common.L1Tx, l1CoordTxs []common.L1Tx, l2Txs []common.PoolL2Tx) { // same values than in the js test users = GenerateJsUsers(t) depositAmount, err := common.Float40(10400).BigInt() require.Nil(t, err) l1UserTxs = []common.L1Tx{ { FromIdx: 0, DepositAmount: depositAmount, Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[0].BJJ.Public().Compress(), FromEthAddr: users[0].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, } l2Txs = []common.PoolL2Tx{ { FromIdx: 256, ToIdx: 256, TokenID: 1, Amount: big.NewInt(1000), Nonce: 0, Fee: 0, Type: common.TxTypeTransfer, }, } l2Txs[0] = signL2Tx(t, chainID, users[0], l2Txs[0]) return users, []common.Idx{}, l1UserTxs, []common.L1Tx{}, l2Txs } // GenerateTxsZKInputs1 generates the transactions for the TestZKInputs1 func GenerateTxsZKInputs1(t *testing.T, chainID uint16) (users []til.User, coordIdxs []common.Idx, l1UserTxs []common.L1Tx, l1CoordTxs []common.L1Tx, l2Txs []common.PoolL2Tx) { // same values than in the js test users = GenerateJsUsers(t) l1UserTxs = []common.L1Tx{ { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[0].BJJ.Public().Compress(), FromEthAddr: users[0].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[1].BJJ.Public().Compress(), FromEthAddr: users[1].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, } l2Txs = []common.PoolL2Tx{ { FromIdx: 256, ToIdx: 256, TokenID: 1, Amount: big.NewInt(1000), Nonce: 0, Fee: 126, Type: common.TxTypeTransfer, }, } l2Txs[0] = signL2Tx(t, chainID, users[0], l2Txs[0]) coordIdxs = []common.Idx{257} return users, coordIdxs, l1UserTxs, []common.L1Tx{}, l2Txs } // GenerateTxsZKInputs2 generates the transactions for the TestZKInputs2 func GenerateTxsZKInputs2(t *testing.T, chainID uint16) (users []til.User, coordIdxs []common.Idx, l1UserTxs []common.L1Tx, l1CoordTxs []common.L1Tx, l2Txs []common.PoolL2Tx) { // same values than in the js test users = GenerateJsUsers(t) l1UserTxs = []common.L1Tx{ { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[0].BJJ.Public().Compress(), FromEthAddr: users[0].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[1].BJJ.Public().Compress(), FromEthAddr: users[1].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[2].BJJ.Public().Compress(), FromEthAddr: users[2].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[3].BJJ.Public().Compress(), FromEthAddr: users[3].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, } l2Txs = []common.PoolL2Tx{ { FromIdx: 256, ToIdx: 258, TokenID: 1, Amount: big.NewInt(1000), Nonce: 0, Fee: 126, Type: common.TxTypeTransfer, }, { FromIdx: 256, ToIdx: 259, TokenID: 1, Amount: big.NewInt(1000), Nonce: 1, Fee: 126, Type: common.TxTypeTransfer, }, } l2Txs[0] = signL2Tx(t, chainID, users[0], l2Txs[0]) l2Txs[1] = signL2Tx(t, chainID, users[0], l2Txs[1]) coordIdxs = []common.Idx{257} return users, coordIdxs, l1UserTxs, []common.L1Tx{}, l2Txs } // GenerateTxsZKInputs3 generates the transactions for the TestZKInputs3 func GenerateTxsZKInputs3(t *testing.T, chainID uint16) (users []til.User, coordIdxs []common.Idx, l1UserTxs []common.L1Tx, l1CoordTxs []common.L1Tx, l2Txs []common.PoolL2Tx) { // same values than in the js test users = GenerateJsUsers(t) l1UserTxs = []common.L1Tx{ { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[0].BJJ.Public().Compress(), FromEthAddr: users[0].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[1].BJJ.Public().Compress(), FromEthAddr: users[1].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[2].BJJ.Public().Compress(), FromEthAddr: users[2].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(1000), TokenID: 1, FromBJJ: users[3].BJJ.Public().Compress(), FromEthAddr: users[3].Addr, ToIdx: 258, Type: common.TxTypeCreateAccountDepositTransfer, UserOrigin: true, }, } l2Txs = []common.PoolL2Tx{ { FromIdx: 256, ToIdx: 258, TokenID: 1, Amount: big.NewInt(1000), Nonce: 0, Fee: 126, Type: common.TxTypeTransfer, }, { FromIdx: 256, ToIdx: 259, TokenID: 1, Amount: big.NewInt(1000), Nonce: 1, Fee: 126, Type: common.TxTypeTransfer, }, } l2Txs[0] = signL2Tx(t, chainID, users[0], l2Txs[0]) l2Txs[1] = signL2Tx(t, chainID, users[0], l2Txs[1]) coordIdxs = []common.Idx{257} return users, coordIdxs, l1UserTxs, []common.L1Tx{}, l2Txs } // GenerateTxsZKInputs4 generates the transactions for the TestZKInputs4 func GenerateTxsZKInputs4(t *testing.T, chainID uint16) (users []til.User, coordIdxs []common.Idx, l1UserTxs []common.L1Tx, l1CoordTxs []common.L1Tx, l2Txs []common.PoolL2Tx) { // same values than in the js test users = GenerateJsUsers(t) l1UserTxs = []common.L1Tx{ { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[0].BJJ.Public().Compress(), FromEthAddr: users[0].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[1].BJJ.Public().Compress(), FromEthAddr: users[1].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[2].BJJ.Public().Compress(), FromEthAddr: users[2].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(1000), TokenID: 1, FromBJJ: users[3].BJJ.Public().Compress(), FromEthAddr: users[3].Addr, ToIdx: 258, Type: common.TxTypeCreateAccountDepositTransfer, UserOrigin: true, }, { FromIdx: 258, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(1000), TokenID: 1, FromEthAddr: users[2].Addr, ToIdx: 259, Type: common.TxTypeDepositTransfer, UserOrigin: true, }, } l2Txs = []common.PoolL2Tx{ { FromIdx: 256, ToIdx: 258, TokenID: 1, Amount: big.NewInt(1000), Nonce: 0, Fee: 126, Type: common.TxTypeTransfer, }, { FromIdx: 256, ToIdx: 259, TokenID: 1, Amount: big.NewInt(1000), Nonce: 1, Fee: 126, Type: common.TxTypeTransfer, }, } l2Txs[0] = signL2Tx(t, chainID, users[0], l2Txs[0]) l2Txs[1] = signL2Tx(t, chainID, users[0], l2Txs[1]) coordIdxs = []common.Idx{257} return users, coordIdxs, l1UserTxs, []common.L1Tx{}, l2Txs } // GenerateTxsZKInputs5 generates the transactions for the TestZKInputs5 func GenerateTxsZKInputs5(t *testing.T, chainID uint16) (users []til.User, coordIdxs []common.Idx, l1UserTxs []common.L1Tx, l1CoordTxs []common.L1Tx, l2Txs []common.PoolL2Tx) { // same values than in the js test users = GenerateJsUsers(t) l1UserTxs = []common.L1Tx{ { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[0].BJJ.Public().Compress(), FromEthAddr: users[0].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 0, DepositAmount: big.NewInt(16000000), Amount: big.NewInt(0), TokenID: 1, FromBJJ: users[1].BJJ.Public().Compress(), FromEthAddr: users[1].Addr, ToIdx: 0, Type: common.TxTypeCreateAccountDeposit, UserOrigin: true, }, { FromIdx: 257, DepositAmount: big.NewInt(0), Amount: big.NewInt(1000), TokenID: 1, FromBJJ: users[1].BJJ.Public().Compress(), FromEthAddr: users[1].Addr, ToIdx: 1, Type: common.TxTypeForceExit, UserOrigin: true, }, } l2Txs = []common.PoolL2Tx{ { FromIdx: 256, ToIdx: 257, TokenID: 1, Amount: big.NewInt(1000), Nonce: 0, Fee: 126, Type: common.TxTypeTransfer, }, { FromIdx: 256, ToIdx: 1, TokenID: 1, Amount: big.NewInt(1000), Nonce: 1, Fee: 126, Type: common.TxTypeExit, }, } l2Txs[0] = signL2Tx(t, chainID, users[0], l2Txs[0]) l2Txs[1] = signL2Tx(t, chainID, users[0], l2Txs[1]) coordIdxs = []common.Idx{257} return users, coordIdxs, l1UserTxs, []common.L1Tx{}, l2Txs }