package common
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"math/big"
|
|
"testing"
|
|
|
|
ethCommon "github.com/ethereum/go-ethereum/common"
|
|
"github.com/iden3/go-iden3-crypto/babyjub"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestNonceParser(t *testing.T) {
|
|
n := Nonce(1)
|
|
nBytes, err := n.Bytes()
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, 5, len(nBytes))
|
|
assert.Equal(t, "0100000000", hex.EncodeToString(nBytes[:]))
|
|
n2 := NonceFromBytes(nBytes)
|
|
assert.Equal(t, n, n2)
|
|
|
|
// value before overflow
|
|
n = Nonce(1099511627775)
|
|
nBytes, err = n.Bytes()
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, 5, len(nBytes))
|
|
assert.Equal(t, "ffffffffff", hex.EncodeToString(nBytes[:]))
|
|
n2 = NonceFromBytes(nBytes)
|
|
assert.Equal(t, n, n2)
|
|
|
|
// expect value overflow
|
|
n = Nonce(1099511627776)
|
|
nBytes, err = n.Bytes()
|
|
assert.NotNil(t, err)
|
|
assert.Equal(t, ErrNonceOverflow, err)
|
|
}
|
|
|
|
func TestTxCompressedData(t *testing.T) {
|
|
var sk babyjub.PrivateKey
|
|
_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
|
|
assert.Nil(t, err)
|
|
|
|
tx := PoolL2Tx{
|
|
FromIdx: 2,
|
|
ToIdx: 3,
|
|
Amount: big.NewInt(4),
|
|
TokenID: 5,
|
|
Nonce: 6,
|
|
ToBJJ: sk.Public(),
|
|
}
|
|
txCompressedData, err := tx.TxCompressedData()
|
|
assert.Nil(t, err)
|
|
// test vector value generated from javascript implementation
|
|
assert.Equal(t, "1766847064778421992193717128424891165872736891548909569553540449389241871", txCompressedData.String())
|
|
assert.Equal(t, "10000000000060000000500040000000000030000000000020001c60be60f", hex.EncodeToString(txCompressedData.Bytes())[1:])
|
|
|
|
tx = PoolL2Tx{
|
|
FromIdx: 7,
|
|
ToIdx: 8,
|
|
Amount: big.NewInt(9),
|
|
TokenID: 10,
|
|
Nonce: 11,
|
|
Fee: 12,
|
|
ToBJJ: sk.Public(),
|
|
}
|
|
txCompressedData, err = tx.TxCompressedDataV2()
|
|
assert.Nil(t, err)
|
|
// test vector value generated from javascript implementation
|
|
assert.Equal(t, "6571340879233176732837827812956721483162819083004853354503", txCompressedData.String())
|
|
assert.Equal(t, "10c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(txCompressedData.Bytes())[1:])
|
|
}
|
|
|
|
func TestHashToSign(t *testing.T) {
|
|
var sk babyjub.PrivateKey
|
|
_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
|
|
assert.Nil(t, err)
|
|
ethAddr := ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370")
|
|
|
|
tx := PoolL2Tx{
|
|
FromIdx: 2,
|
|
ToIdx: 3,
|
|
Amount: big.NewInt(4),
|
|
TokenID: 5,
|
|
Nonce: 6,
|
|
ToBJJ: sk.Public(),
|
|
RqToEthAddr: ethAddr,
|
|
RqToBJJ: sk.Public(),
|
|
}
|
|
toSign, err := tx.HashToSign()
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, "14526446928649310956370997581245770629723313742905751117262272426489782809503", toSign.String())
|
|
}
|
|
|
|
func TestVerifyTxSignature(t *testing.T) {
|
|
var sk babyjub.PrivateKey
|
|
_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
|
|
assert.Nil(t, err)
|
|
ethAddr := ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370")
|
|
|
|
tx := PoolL2Tx{
|
|
FromIdx: 2,
|
|
ToIdx: 3,
|
|
Amount: big.NewInt(4),
|
|
TokenID: 5,
|
|
Nonce: 6,
|
|
ToBJJ: sk.Public(),
|
|
RqToEthAddr: ethAddr,
|
|
RqToBJJ: sk.Public(),
|
|
}
|
|
toSign, err := tx.HashToSign()
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, "14526446928649310956370997581245770629723313742905751117262272426489782809503", toSign.String())
|
|
|
|
sig := sk.SignPoseidon(toSign)
|
|
tx.Signature = sig
|
|
assert.True(t, tx.VerifySignature(sk.Public()))
|
|
}
|