hermez-node/common/pooll2tx_test.go
common/pooll2tx_test.goRaw
1package common
2
3import (
4 "encoding/hex"
5 "math/big"
6 "testing"
7
8 ethCommon "github.com/ethereum/go-ethereum/common"
9 "github.com/iden3/go-iden3-crypto/babyjub"
10 "github.com/stretchr/testify/assert"
11)
12
13func TestNewPoolL2Tx(t *testing.T) {
14 poolL2Tx := &PoolL2Tx{
15 FromIdx: 87654,
16 ToIdx: 300,
17 Amount: big.NewInt(4),
18 TokenID: 5,
19 Nonce: 144,
20 }
21 poolL2Tx, err := NewPoolL2Tx(poolL2Tx)
22 assert.Nil(t, err)
23 assert.Equal(t, "0x020000000156660000000090", poolL2Tx.TxID.String())
24}
25
26func TestTxCompressedData(t *testing.T) {
27 var sk babyjub.PrivateKey
28 _, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
29 assert.Nil(t, err)
30
31 tx := PoolL2Tx{
32 FromIdx: 2,
33 ToIdx: 3,
34 Amount: big.NewInt(4),
35 TokenID: 5,
36 Nonce: 6,
37 ToBJJ: sk.Public(),
38 }
39 txCompressedData, err := tx.TxCompressedData()
40 assert.Nil(t, err)
41 // test vector value generated from javascript implementation
42 expectedStr := "1766847064778421992193717128424891165872736891548909569553540449389241871"
43 assert.Equal(t, expectedStr, txCompressedData.String())
44 expected, ok := new(big.Int).SetString(expectedStr, 10)
45 assert.True(t, ok)
46 assert.Equal(t, expected.Bytes(), txCompressedData.Bytes())
47 assert.Equal(t, "10000000000060000000500040000000000030000000000020001c60be60f", hex.EncodeToString(txCompressedData.Bytes())[1:])
48
49 tx = PoolL2Tx{
50 FromIdx: 7,
51 ToIdx: 8,
52 Amount: big.NewInt(9),
53 TokenID: 10,
54 Nonce: 11,
55 Fee: 12,
56 ToBJJ: sk.Public(),
57 }
58 txCompressedData, err = tx.TxCompressedDataV2()
59 assert.Nil(t, err)
60 // test vector value generated from javascript implementation
61 expectedStr = "6571340879233176732837827812956721483162819083004853354503"
62 assert.Equal(t, expectedStr, txCompressedData.String())
63 expected, ok = new(big.Int).SetString(expectedStr, 10)
64 assert.True(t, ok)
65 assert.Equal(t, expected.Bytes(), txCompressedData.Bytes())
66 assert.Equal(t, "10c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(txCompressedData.Bytes())[1:])
67}
68
69func TestHashToSign(t *testing.T) {
70 var sk babyjub.PrivateKey
71 _, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
72 assert.Nil(t, err)
73 ethAddr := ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370")
74
75 tx := PoolL2Tx{
76 FromIdx: 2,
77 ToIdx: 3,
78 Amount: big.NewInt(4),
79 TokenID: 5,
80 Nonce: 6,
81 ToBJJ: sk.Public(),
82 RqToEthAddr: ethAddr,
83 RqToBJJ: sk.Public(),
84 }
85 toSign, err := tx.HashToSign()
86 assert.Nil(t, err)
87 assert.Equal(t, "14526446928649310956370997581245770629723313742905751117262272426489782809503", toSign.String())
88}
89
90func TestVerifyTxSignature(t *testing.T) {
91 var sk babyjub.PrivateKey
92 _, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
93 assert.Nil(t, err)
94 ethAddr := ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370")
95
96 tx := PoolL2Tx{
97 FromIdx: 2,
98 ToIdx: 3,
99 Amount: big.NewInt(4),
100 TokenID: 5,
101 Nonce: 6,
102 ToBJJ: sk.Public(),
103 RqToEthAddr: ethAddr,
104 RqToBJJ: sk.Public(),
105 }
106 toSign, err := tx.HashToSign()
107 assert.Nil(t, err)
108 assert.Equal(t, "14526446928649310956370997581245770629723313742905751117262272426489782809503", toSign.String())
109
110 sig := sk.SignPoseidon(toSign)
111 tx.Signature = sig
112 assert.True(t, tx.VerifySignature(sk.Public()))
113}