wormhole/bridge/pkg/vaa/types_test.go

135 lines
2.6 KiB
Go
Raw Normal View History

2020-08-04 14:40:00 -07:00
package vaa
import (
2020-08-14 13:45:45 -07:00
"crypto/ecdsa"
"crypto/rand"
"encoding/hex"
2020-08-04 14:40:00 -07:00
"github.com/ethereum/go-ethereum/common"
2020-08-14 13:45:45 -07:00
"github.com/ethereum/go-ethereum/crypto"
2020-08-04 14:40:00 -07:00
"github.com/stretchr/testify/require"
"math/big"
"testing"
"time"
)
func TestSerializeDeserialize(t *testing.T) {
tests := []struct {
name string
vaa *VAA
}{
{
name: "BodyTransfer",
vaa: &VAA{
Version: 1,
2020-08-04 14:40:00 -07:00
GuardianSetIndex: 9,
2020-08-14 13:45:45 -07:00
Signatures: []*Signature{
{
Index: 1,
Signature: [65]byte{},
},
2020-08-04 14:40:00 -07:00
},
Timestamp: time.Unix(2837, 0),
Payload: &BodyTransfer{
Nonce: 38,
2020-08-04 14:40:00 -07:00
SourceChain: 2,
TargetChain: 1,
SourceAddress: Address{2, 1, 4},
2020-08-04 14:40:00 -07:00
TargetAddress: Address{2, 1, 3},
Asset: &AssetMeta{
Chain: 9,
Address: Address{9, 2, 4},
},
Amount: big.NewInt(29),
},
},
},
{
name: "GuardianSetUpdate",
vaa: &VAA{
Version: 1,
2020-08-04 14:40:00 -07:00
GuardianSetIndex: 9,
2020-08-14 13:45:45 -07:00
Signatures: []*Signature{
{
Index: 1,
Signature: [65]byte{},
},
2020-08-04 14:40:00 -07:00
},
Timestamp: time.Unix(2837, 0),
Payload: &BodyGuardianSetUpdate{
Keys: []common.Address{{}, {}},
2020-08-04 14:40:00 -07:00
NewIndex: 2,
},
},
},
{
name: "ContractUpgrade",
vaa: &VAA{
Version: 1,
GuardianSetIndex: 9,
Signatures: []*Signature{
{
Index: 1,
Signature: [65]byte{},
},
},
Timestamp: time.Unix(2837, 0),
Payload: &BodyContractUpgrade{
ChainID: ChainIDEthereum,
NewContract: Address{1, 3, 4, 5, 2, 3},
},
},
},
2020-08-04 14:40:00 -07:00
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
2020-08-19 07:41:25 -07:00
vaaData, err := test.vaa.Marshal()
2020-08-04 14:40:00 -07:00
require.NoError(t, err)
println(hex.EncodeToString(vaaData))
2020-08-19 07:41:25 -07:00
vaaParsed, err := Unmarshal(vaaData)
2020-08-04 14:40:00 -07:00
require.NoError(t, err)
require.EqualValues(t, test.vaa, vaaParsed)
})
}
}
func TestVerifySignature(t *testing.T) {
v := &VAA{
Version: 8,
GuardianSetIndex: 9,
Timestamp: time.Unix(2837, 0),
Payload: &BodyTransfer{
SourceChain: 2,
TargetChain: 1,
TargetAddress: Address{2, 1, 3},
Asset: &AssetMeta{
Chain: 9,
Address: Address{9, 2, 4},
},
Amount: big.NewInt(29),
},
}
2020-08-14 13:45:45 -07:00
data, err := v.SigningMsg()
require.NoError(t, err)
key, err := ecdsa.GenerateKey(crypto.S256(), rand.Reader)
require.NoError(t, err)
sig, err := crypto.Sign(data.Bytes(), key)
require.NoError(t, err)
sigData := [65]byte{}
copy(sigData[:], sig)
v.Signatures = append(v.Signatures, &Signature{
Index: 0,
Signature: sigData,
})
addr := crypto.PubkeyToAddress(key.PublicKey)
require.True(t, v.VerifySignatures([]common.Address{
addr,
}))
}