wormhole/node/pkg/common/chainlock_test.go

146 lines
4.8 KiB
Go
Raw Normal View History

Chain governor (#1277) * Rebase * Reload from db on start up Change-Id: I1deac9db28ad1157ea7e0c84af41c35b38497f4e * Console commands Change-Id: Ic242038312b7c837443a2df8823f100b3cdffd77 * Query prices from CoinGecko Change-Id: I9a8c282ba374d32ef7045d11979a27ede3c52827 * Move chain config to separate file Change-Id: I6a790eca765bce1f2caf48134e225df5c4daff15 * More code cleanup Change-Id: Id12affa78cdc2d394d6dab0c53bb7ad06df8007e * Few minor tweaks Change-Id: I6cb511599d669e0b3d716d9f314ac0f26935ee92 * Create separate tests for different packages Change-Id: Idb4da6817c9daad2a7420abc11bdaa702ae056dc * Fix lint errors Change-Id: I137c9e7e4574aee9c9fec22e91e19eee0e86a349 * Simplify chainlock message tests * Add more governor db test coverage * Next batch of review rework Change-Id: Ife54852fca6c6990d1ffb3d60a8dd7f49d526f0a * Still more rework Change-Id: I43a8aa7fa4e1a7cea4d7fde68c963123c1ca8d53 * More rework Change-Id: I9382412af4ffeda74967a834a6b0195a9d28b720 * Fix lint errors Change-Id: Idaafce9b0314192557b7207911375d000bac5ae2 * Add rest and prometheus support Change-Id: Ib870ed7eb305ef1ebbf6a7cedabc665c37c19171 * Add separate configs for testnet and devnet Change-Id: I76b11d8940a8dc9935b3f276a008ed20ef60b850 * Update mainnet tokens to fix decimals Change-Id: Iab018827766bc7748038b7be2f51342afb79b87c * Let small enqueued VAAs go out when big ones can't Change-Id: I7d3ef88d4579702d0c6ff4eaf5a8524799610ff6 * Tweak testnet config parameters Change-Id: Id2c54151a7183ab3fb4af8060929198f6021ba4e * Rework / enhancements from testnet testing Change-Id: I1387b1d22667fa6ffe0bb1832dbc0b31196505d3 * Use known emitter maps Change-Id: If330ee9d30ac3c2d1c6dca674f7777dc759de230 * Fix typo and out of date comments Change-Id: I54a19792104ccc6ca023020303a710ef3ba18f74 Co-authored-by: claudijd <jclaudius@jumptrading.com>
2022-07-19 11:08:06 -07:00
package common
import (
"encoding/binary"
"math/big"
"testing"
"time"
"github.com/certusone/wormhole/node/pkg/vaa"
eth_common "github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func encodePayloadBytes(payload *vaa.TransferPayloadHdr) []byte {
bytes := make([]byte, 101)
bytes[0] = payload.Type
amtBytes := payload.Amount.Bytes()
if len(amtBytes) > 32 {
panic("amount will not fit in 32 bytes!")
}
copy(bytes[33-len(amtBytes):33], amtBytes)
copy(bytes[33:65], payload.OriginAddress.Bytes())
binary.BigEndian.PutUint16(bytes[65:67], uint16(payload.OriginChain))
copy(bytes[67:99], payload.TargetAddress.Bytes())
binary.BigEndian.PutUint16(bytes[99:101], uint16(payload.TargetChain))
return bytes
}
func TestSerializeAndDeserializeOfMessagePublication(t *testing.T) {
originAddress, err := vaa.StringToAddress("0xDDb64fE46a91D46ee29420539FC25FD07c5FEa3E") //nolint:gosec
require.NoError(t, err)
targetAddress, err := vaa.StringToAddress("0x707f9118e33a9b8998bea41dd0d46f38bb963fc8")
require.NoError(t, err)
tokenBridgeAddress, err := vaa.StringToAddress("0x707f9118e33a9b8998bea41dd0d46f38bb963fc8")
require.NoError(t, err)
payload1 := &vaa.TransferPayloadHdr{
Type: 0x01,
Amount: big.NewInt(27000000000),
OriginAddress: originAddress,
OriginChain: vaa.ChainIDEthereum,
TargetAddress: targetAddress,
TargetChain: vaa.ChainIDPolygon,
}
payloadBytes1 := encodePayloadBytes(payload1)
msg1 := &MessagePublication{
TxHash: eth_common.HexToHash("0x06f541f5ecfc43407c31587aa6ac3a689e8960f36dc23c332db5510dfc6a4063"),
Timestamp: time.Unix(int64(1654516425), 0),
Nonce: 123456,
Sequence: 789101112131415,
EmitterChain: vaa.ChainIDEthereum,
EmitterAddress: tokenBridgeAddress,
Payload: payloadBytes1,
ConsistencyLevel: 32,
}
bytes, err := msg1.Marshal()
require.NoError(t, err)
msg2, err := UnmarshalMessagePublication(bytes)
require.NoError(t, err)
assert.Equal(t, msg1, msg2)
payload2, err := vaa.DecodeTransferPayloadHdr(msg2.Payload)
require.NoError(t, err)
assert.Equal(t, payload1, payload2)
}
func TestMessageIDString(t *testing.T) {
addr, err := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16")
require.NoError(t, err)
type test struct {
label string
input MessagePublication
output string
}
tests := []test{
{label: "simple",
input: MessagePublication{Sequence: 1, EmitterChain: vaa.ChainIDEthereum, EmitterAddress: addr},
output: "2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/1"},
{label: "missing sequence",
input: MessagePublication{EmitterChain: vaa.ChainIDEthereum, EmitterAddress: addr},
output: "2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/0"},
{label: "missing chain id",
input: MessagePublication{Sequence: 1, EmitterAddress: addr},
output: "0/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/1"},
{label: "missing emitter address",
input: MessagePublication{Sequence: 1, EmitterChain: vaa.ChainIDEthereum},
output: "2/0000000000000000000000000000000000000000000000000000000000000000/1"},
{label: "empty message",
input: MessagePublication{},
output: "0/0000000000000000000000000000000000000000000000000000000000000000/0"},
}
for _, tc := range tests {
t.Run(tc.label, func(t *testing.T) {
assert.Equal(t, tc.output, tc.input.MessageIDString())
})
}
}
func TestMessageID(t *testing.T) {
addr, err := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16")
require.NoError(t, err)
type test struct {
label string
input MessagePublication
output []byte
}
tests := []test{
{label: "simple",
input: MessagePublication{Sequence: 1, EmitterChain: vaa.ChainIDEthereum, EmitterAddress: addr},
output: []byte("2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/1")},
{label: "missing sequence",
input: MessagePublication{EmitterChain: vaa.ChainIDEthereum, EmitterAddress: addr},
output: []byte("2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/0")},
{label: "missing chain id",
input: MessagePublication{Sequence: 1, EmitterAddress: addr},
output: []byte("0/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/1")},
{label: "missing emitter address",
input: MessagePublication{Sequence: 1, EmitterChain: vaa.ChainIDEthereum},
output: []byte("2/0000000000000000000000000000000000000000000000000000000000000000/1")},
{label: "empty message",
input: MessagePublication{},
output: []byte("0/0000000000000000000000000000000000000000000000000000000000000000/0")},
}
for _, tc := range tests {
t.Run(tc.label, func(t *testing.T) {
assert.Equal(t, tc.output, tc.input.MessageID())
})
}
}