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