wormhole/node/pkg/accountant/ntt_test.go

237 lines
11 KiB
Go

package accountant
import (
"bytes"
"encoding/hex"
"testing"
"time"
"github.com/certusone/wormhole/node/pkg/common"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/wormhole-foundation/wormhole/sdk/vaa"
)
const goodPayload = "9945ff10042942fafabe0000000000000000000000000000000000000000000000000000042942fababe00000000000000000000000000000000000000000000000000000091128434bafe23430000000000000000000000000000000000ce00aa00000000004667921341234300000000000000000000000000000000000000000000000000004f994e545407000000000012d687beefface00000000000000000000000000000000000000000000000000000000feebcafe0000000000000000000000000000000000000000000000000000000000110000"
func TestNttParsePayloadSuccess(t *testing.T) {
payload, err := hex.DecodeString(goodPayload)
require.NoError(t, err)
assert.True(t, nttIsPayloadNTT(payload))
}
func TestNttParsePayloadTooShort(t *testing.T) {
payload, err := hex.DecodeString("9945ff10042942fafabe00000000000000000000000000000000000000000000000000000079000000367999a1014667921341234300000000000000000000000000000000000000000000000000004f994e54")
require.NoError(t, err)
assert.False(t, nttIsPayloadNTT(payload))
}
func TestNttParsePayloadNoWhPrefix(t *testing.T) {
payload, err := hex.DecodeString("9845ff10042942fafabe00000000000000000000000000000000000000000000000000000079000000367999a1014667921341234300000000000000000000000000000000000000000000000000004f994e545407000000000012d687beefface00000000000000000000000000000000000000000000000000000000feebcafe0000000000000000000000000000000000000000000000000000000000110000")
require.NoError(t, err)
assert.False(t, nttIsPayloadNTT(payload))
}
func TestNttParsePayloadNoTransferPrefix(t *testing.T) {
payload, err := hex.DecodeString("9945ff10042942fafabe00000000000000000000000000000000000000000000000000000079000000367999a1014667921341234300000000000000000000000000000000000000000000000000004f994e545307000000000012d687beefface00000000000000000000000000000000000000000000000000000000feebcafe0000000000000000000000000000000000000000000000000000000000110000")
require.NoError(t, err)
assert.False(t, nttIsPayloadNTT(payload))
}
func TestNttParseMsgSuccess(t *testing.T) {
emitterAddr, err := vaa.StringToAddress("000000000000000000000000000000000000000000000000656e64706f696e74")
require.NoError(t, err)
payload, err := hex.DecodeString(goodPayload)
require.NoError(t, err)
emitters := map[emitterKey]bool{
{emitterChainId: vaa.ChainIDEthereum, emitterAddr: emitterAddr}: true,
}
msg := &common.MessagePublication{
TxHash: hashFromString("0x06f541f5ecfc43407c31587aa6ac3a689e8960f36dc23c332db5510dfc6a4063"),
Timestamp: time.Unix(int64(1654543099), 0),
Nonce: uint32(42),
Sequence: uint64(123456),
EmitterChain: vaa.ChainIDEthereum,
EmitterAddress: emitterAddr,
ConsistencyLevel: uint8(0),
Payload: payload,
}
isNTT, enforceFlag := nttIsMsgDirectNTT(msg, emitters)
assert.True(t, isNTT)
assert.True(t, enforceFlag)
}
func TestNttParseMsgWrongEmitterChain(t *testing.T) {
emitterAddr, err := vaa.StringToAddress("000000000000000000000000000000000000000000000000656e64706f696e74")
require.NoError(t, err)
payload, err := hex.DecodeString(goodPayload)
require.NoError(t, err)
emitters := map[emitterKey]bool{
{emitterChainId: vaa.ChainIDEthereum, emitterAddr: emitterAddr}: true,
}
msg := &common.MessagePublication{
TxHash: hashFromString("0x06f541f5ecfc43407c31587aa6ac3a689e8960f36dc23c332db5510dfc6a4063"),
Timestamp: time.Unix(int64(1654543099), 0),
Nonce: uint32(42),
Sequence: uint64(123456),
EmitterChain: vaa.ChainIDSolana,
EmitterAddress: emitterAddr,
ConsistencyLevel: uint8(0),
Payload: payload,
}
isNTT, _ := nttIsMsgDirectNTT(msg, emitters)
assert.False(t, isNTT)
}
func TestNttParseMsgWrongEmitterAddress(t *testing.T) {
goodEmitterAddr, err := vaa.StringToAddress("000000000000000000000000000000000000000000000000656e64706f696e74")
require.NoError(t, err)
badEmitterAddr, err := vaa.StringToAddress("000000000000000000000000000000000000000000000000656e64706f696e75")
require.NoError(t, err)
payload, err := hex.DecodeString(goodPayload)
require.NoError(t, err)
emitters := map[emitterKey]bool{
{emitterChainId: vaa.ChainIDEthereum, emitterAddr: goodEmitterAddr}: true,
}
msg := &common.MessagePublication{
TxHash: hashFromString("0x06f541f5ecfc43407c31587aa6ac3a689e8960f36dc23c332db5510dfc6a4063"),
Timestamp: time.Unix(int64(1654543099), 0),
Nonce: uint32(42),
Sequence: uint64(123456),
EmitterChain: vaa.ChainIDEthereum,
EmitterAddress: badEmitterAddr,
ConsistencyLevel: uint8(0),
Payload: payload,
}
isNTT, _ := nttIsMsgDirectNTT(msg, emitters)
assert.False(t, isNTT)
}
const goodArPayload = "0127150000000000000000000000005a76440b725909000697e0f72646adf1a492df8b000000d99945ff1000000000000000000000000024c7e23e3a97cd2f04c9eb9f354bb7f3b31d2d1a000000000000000000000000605de5e0880cfd6ffc61af9585cbab3946594a3d009100000000000000000000000000000000000000000000000000000000000000040000000000000000000000008f26a0025dccc6cfc07a7d38756280a10e295ad7004f994e5454080000000077359400000000000000000000000000169d91c797edf56100f1b765268145660503a4230000000000000000000000008f26a0025dccc6cfc07a7d38756280a10e295ad7271500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000983146f271500000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a0a53847776f7e94cc35742971acb2217b0db810000000000000000000000007a0a53847776f7e94cc35742971acb2217b0db81000000000000000000000000c5bf11ab6ae525ffca02e2af7f6704cdcecec2ea00"
const nttPayloadInAr = "9945ff1000000000000000000000000024c7e23e3a97cd2f04c9eb9f354bb7f3b31d2d1a000000000000000000000000605de5e0880cfd6ffc61af9585cbab3946594a3d009100000000000000000000000000000000000000000000000000000000000000040000000000000000000000008f26a0025dccc6cfc07a7d38756280a10e295ad7004f994e5454080000000077359400000000000000000000000000169d91c797edf56100f1b765268145660503a4230000000000000000000000008f26a0025dccc6cfc07a7d38756280a10e295ad727150000"
func TestNttParseArPayloadSuccess(t *testing.T) {
nttEmitterAddr, err := vaa.StringToAddress("000000000000000000000000c5bf11ab6ae525ffca02e2af7f6704cdcecec2ea")
require.NoError(t, err)
payload, err := hex.DecodeString(goodArPayload)
require.NoError(t, err)
success, senderAddress, payload := nttParseArPayload(payload)
require.True(t, success)
assert.True(t, bytes.Equal(nttEmitterAddr[:], senderAddress[:]))
require.NoError(t, err)
assert.Equal(t, nttPayloadInAr, hex.EncodeToString(payload[:]))
}
func TestNttParseArPayloadWrongDeliveryInstruction(t *testing.T) {
badArPayload := "02271200000000000000000000000079689ce600d3fd3524ec2b4bedcc70131eda67b60000009f9945ff10000000000000000000000000e493cc4f069821404d272b994bb80b1ba1631914007900000000000000070000000000000000000000008f26a0025dccc6cfc07a7d38756280a10e295ad7004f994e54540800000000000003e8000000000000000000000000a88085e6370a551cc046fb6b1e3fb9be23ac3a210000000000000000000000008f26a0025dccc6cfc07a7d38756280a10e295ad7271200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a120000000000000000000000000000000000000000000000000000000046f5399e7271200000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a0a53847776f7e94cc35742971acb2217b0db810000000000000000000000007a0a53847776f7e94cc35742971acb2217b0db81000000000000000000000000e493cc4f069821404d272b994bb80b1ba163191400"
payload, err := hex.DecodeString(badArPayload)
require.NoError(t, err)
success, _, _ := nttParseArPayload(payload)
require.False(t, success)
}
func TestNttParseArPayloadTooShort(t *testing.T) {
badArPayload := "01271200000000000000000000000079689ce600d3fd3524ec2b4bedcc70131eda67b60000009f9945ff10000000000000000000000000e4"
payload, err := hex.DecodeString(badArPayload)
require.NoError(t, err)
success, _, _ := nttParseArPayload(payload)
require.False(t, success)
}
func TestNttParseArPayloadReallyTooShort(t *testing.T) {
badArPayload := "01"
payload, err := hex.DecodeString(badArPayload)
require.NoError(t, err)
success, _, _ := nttParseArPayload(payload)
require.False(t, success)
}
func TestNttParseArMsgSuccess(t *testing.T) {
arEmitterAddr, err := vaa.StringToAddress("0000000000000000000000007b1bd7a6b4e61c2a123ac6bc2cbfc614437d0470")
require.NoError(t, err)
arEmitters := map[emitterKey]bool{
{emitterChainId: vaa.ChainIDArbitrumSepolia, emitterAddr: arEmitterAddr}: true,
}
nttEmitterAddr, err := vaa.StringToAddress("000000000000000000000000c5bf11ab6ae525ffca02e2af7f6704cdcecec2ea")
require.NoError(t, err)
nttEmitters := map[emitterKey]bool{
{emitterChainId: vaa.ChainIDArbitrumSepolia, emitterAddr: nttEmitterAddr}: true,
}
payload, err := hex.DecodeString(goodArPayload)
require.NoError(t, err)
msg := &common.MessagePublication{
TxHash: hashFromString("0x06f541f5ecfc43407c31587aa6ac3a689e8960f36dc23c332db5510dfc6a4063"),
Timestamp: time.Unix(int64(1708575745), 0),
Nonce: uint32(0),
Sequence: uint64(259),
EmitterChain: vaa.ChainIDArbitrumSepolia,
EmitterAddress: arEmitterAddr,
ConsistencyLevel: uint8(15),
Payload: payload,
}
isNTT, enforceFlag := nttIsMsgArNTT(msg, arEmitters, nttEmitters)
assert.True(t, isNTT)
assert.True(t, enforceFlag)
}
func TestNttParseArMsgUnknownArEmitter(t *testing.T) {
arEmitterAddr, err := vaa.StringToAddress("0000000000000000000000007b1bd7a6b4e61c2a123ac6bc2cbfc614437d0470")
require.NoError(t, err)
arEmitters := map[emitterKey]bool{
{emitterChainId: vaa.ChainIDArbitrumSepolia, emitterAddr: arEmitterAddr}: true,
}
nttEmitterAddr, err := vaa.StringToAddress("000000000000000000000000c5bf11ab6ae525ffca02e2af7f6704cdcecec2ea")
require.NoError(t, err)
nttEmitters := map[emitterKey]bool{
{emitterChainId: vaa.ChainIDArbitrumSepolia, emitterAddr: nttEmitterAddr}: true,
}
differentEmitterAddr, err := vaa.StringToAddress("0000000000000000000000007b1bd7a6b4e61c2a123ac6bc2cbfc614437d0471") // This is different.
require.NoError(t, err)
payload, err := hex.DecodeString(goodArPayload)
require.NoError(t, err)
msg := &common.MessagePublication{
TxHash: hashFromString("0x06f541f5ecfc43407c31587aa6ac3a689e8960f36dc23c332db5510dfc6a4063"),
Timestamp: time.Unix(int64(1708575745), 0),
Nonce: uint32(0),
Sequence: uint64(259),
EmitterChain: vaa.ChainIDArbitrumSepolia,
EmitterAddress: differentEmitterAddr,
ConsistencyLevel: uint8(15),
Payload: payload,
}
isNTT, _ := nttIsMsgArNTT(msg, arEmitters, nttEmitters)
assert.False(t, isNTT)
}