From 2ecf9594a12787856af166a2b12a0a8626bb4e0d Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 5 Jan 2024 11:00:25 -0800 Subject: [PATCH 1/3] integrate Teleporter message id changes fix unit tests update mock files --- go.mod | 2 +- go.sum | 8 + messages/mocks/mock_message_manager.go | 30 +++- messages/teleporter/message_manager.go | 162 +++++++++--------- messages/teleporter/message_manager_test.go | 98 ++++++++--- tests/basic_relay.go | 7 +- .../UniversalTeleporterDeployerAddress.txt | 2 +- ...UniversalTeleporterDeployerTransaction.txt | 2 +- ...rsalTeleporterMessengerContractAddress.txt | 2 +- tests/utils/utils.go | 3 +- vms/evm/mocks/mock_eth_client.go | 1 + vms/mocks/mock_destination_client.go | 5 +- 12 files changed, 208 insertions(+), 114 deletions(-) diff --git a/go.mod b/go.mod index c6ca4705..f6779d7f 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/ava-labs/avalanchego v1.10.17 github.com/ava-labs/coreth v0.12.9-rc.9 github.com/ava-labs/subnet-evm v0.5.10 - github.com/ava-labs/teleporter v0.0.0-20231221165433-826fa59bed3c + github.com/ava-labs/teleporter v0.0.0-20240108172200-f03f526e5312 github.com/ethereum/go-ethereum v1.12.0 github.com/onsi/ginkgo/v2 v2.13.2 github.com/onsi/gomega v1.30.0 diff --git a/go.sum b/go.sum index 4d65f252..97950365 100644 --- a/go.sum +++ b/go.sum @@ -71,6 +71,14 @@ github.com/ava-labs/subnet-evm v0.5.10 h1:ed9BxoiuXRnB/qKakKzYKtZzV/gVjOB2LxuDeg github.com/ava-labs/subnet-evm v0.5.10/go.mod h1:wln8B4siQ1Osch+elW9vW1XJGjj5PYxQETkzFyDEMjk= github.com/ava-labs/teleporter v0.0.0-20231221165433-826fa59bed3c h1:vnMlfP4SHFoatRufgUma/eGwvVzWdwMo17ADdrh6YYQ= github.com/ava-labs/teleporter v0.0.0-20231221165433-826fa59bed3c/go.mod h1:qeclhkPTO4R2McXNrXXca4JmiRSgQ0gJ0KtJWzQGGPE= +github.com/ava-labs/teleporter v0.0.0-20240104215757-839006a992f2 h1:gqO87g7c6Gy5ZjEzz/oQ3KgnGqvdy73hypnQ+gvmTbQ= +github.com/ava-labs/teleporter v0.0.0-20240104215757-839006a992f2/go.mod h1:qeclhkPTO4R2McXNrXXca4JmiRSgQ0gJ0KtJWzQGGPE= +github.com/ava-labs/teleporter v0.0.0-20240105220309-160c7b8bce4b h1:tBUZfmBqdAykjTcL771SZcE5iQ5kgRZ6nz9Q/VQNTK0= +github.com/ava-labs/teleporter v0.0.0-20240105220309-160c7b8bce4b/go.mod h1:qeclhkPTO4R2McXNrXXca4JmiRSgQ0gJ0KtJWzQGGPE= +github.com/ava-labs/teleporter v0.0.0-20240105221051-581342d9f521 h1:rHbDNvhen/qDQyOuFkdkQ91MjPSNOcmbrUtaTEjriH8= +github.com/ava-labs/teleporter v0.0.0-20240105221051-581342d9f521/go.mod h1:qeclhkPTO4R2McXNrXXca4JmiRSgQ0gJ0KtJWzQGGPE= +github.com/ava-labs/teleporter v0.0.0-20240108172200-f03f526e5312 h1:rG9xkvCXRU4FBi1IBIXPxnTwxRv7mM6j0PX7FQss32g= +github.com/ava-labs/teleporter v0.0.0-20240108172200-f03f526e5312/go.mod h1:qeclhkPTO4R2McXNrXXca4JmiRSgQ0gJ0KtJWzQGGPE= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= diff --git a/messages/mocks/mock_message_manager.go b/messages/mocks/mock_message_manager.go index 691461ce..64a82351 100644 --- a/messages/mocks/mock_message_manager.go +++ b/messages/mocks/mock_message_manager.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: message_manager.go +// +// Generated by this command: +// +// mockgen -source=message_manager.go -destination=./mocks/mock_message_manager.go -package=mocks +// // Package mocks is a generated GoMock package. package mocks @@ -36,18 +41,33 @@ func (m *MockMessageManager) EXPECT() *MockMessageManagerMockRecorder { return m.recorder } +// GetDestinationBlockchainID mocks base method. +func (m *MockMessageManager) GetDestinationBlockchainID(warpMessageInfo *vmtypes.WarpMessageInfo) (ids.ID, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetDestinationBlockchainID", warpMessageInfo) + ret0, _ := ret[0].(ids.ID) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDestinationBlockchainID indicates an expected call of GetDestinationBlockchainID. +func (mr *MockMessageManagerMockRecorder) GetDestinationBlockchainID(warpMessageInfo any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDestinationBlockchainID", reflect.TypeOf((*MockMessageManager)(nil).GetDestinationBlockchainID), warpMessageInfo) +} + // SendMessage mocks base method. -func (m *MockMessageManager) SendMessage(signedMessage *warp.Message, parsedVMPayload []byte, destinationBlockchainID ids.ID) error { +func (m *MockMessageManager) SendMessage(signedMessage *warp.Message, parsedVmPayload []byte, destinationBlockchainID ids.ID) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendMessage", signedMessage, parsedVMPayload, destinationBlockchainID) + ret := m.ctrl.Call(m, "SendMessage", signedMessage, parsedVmPayload, destinationBlockchainID) ret0, _ := ret[0].(error) return ret0 } // SendMessage indicates an expected call of SendMessage. -func (mr *MockMessageManagerMockRecorder) SendMessage(signedMessage, parsedVMPayload, destinationBlockchainID interface{}) *gomock.Call { +func (mr *MockMessageManagerMockRecorder) SendMessage(signedMessage, parsedVmPayload, destinationBlockchainID any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMessage", reflect.TypeOf((*MockMessageManager)(nil).SendMessage), signedMessage, parsedVMPayload, destinationBlockchainID) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMessage", reflect.TypeOf((*MockMessageManager)(nil).SendMessage), signedMessage, parsedVmPayload, destinationBlockchainID) } // ShouldSendMessage mocks base method. @@ -60,7 +80,7 @@ func (m *MockMessageManager) ShouldSendMessage(warpMessageInfo *vmtypes.WarpMess } // ShouldSendMessage indicates an expected call of ShouldSendMessage. -func (mr *MockMessageManagerMockRecorder) ShouldSendMessage(warpMessageInfo, destinationBlockchainID interface{}) *gomock.Call { +func (mr *MockMessageManagerMockRecorder) ShouldSendMessage(warpMessageInfo, destinationBlockchainID any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShouldSendMessage", reflect.TypeOf((*MockMessageManager)(nil).ShouldSendMessage), warpMessageInfo, destinationBlockchainID) } diff --git a/messages/teleporter/message_manager.go b/messages/teleporter/message_manager.go index 3b319097..e25f27bb 100644 --- a/messages/teleporter/message_manager.go +++ b/messages/teleporter/message_manager.go @@ -4,10 +4,10 @@ package teleporter import ( - "context" "encoding/json" "errors" "fmt" + "math/big" "github.com/ava-labs/avalanchego/cache" "github.com/ava-labs/avalanchego/ids" @@ -16,8 +16,8 @@ import ( "github.com/ava-labs/awm-relayer/config" "github.com/ava-labs/awm-relayer/vms" "github.com/ava-labs/awm-relayer/vms/vmtypes" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/ethclient" - "github.com/ava-labs/subnet-evm/interfaces" teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/Teleporter/TeleporterMessenger" gasUtils "github.com/ava-labs/teleporter/utils/gas-utils" "github.com/ethereum/go-ethereum/common" @@ -125,29 +125,41 @@ func (m *messageManager) ShouldSendMessage(warpMessageInfo *vmtypes.WarpMessageI return false, fmt.Errorf("relayer not configured to deliver to destination. destinationBlockchainID=%s", destinationBlockchainID.String()) } + teleporter, err := m.getTeleporterMessenger(destinationClient) + if err != nil { + m.logger.Error( + "Failed to get teleporter messenger contract.", + zap.String("destinationBlockchainID", destinationBlockchainID.String()), + zap.String("warpMessageID", warpMessageInfo.WarpUnsignedMessage.ID().String()), + zap.String("messageNonce", teleporterMessage.MessageNonce.String()), + zap.Error(err), + ) + return false, err + } + teleporterMessageID, err := m.calculateMessageID(teleporter, warpMessageInfo.WarpUnsignedMessage.SourceChainID, destinationBlockchainID, teleporterMessage.MessageNonce) + if err != nil { + return false, err + } + senderAddress := destinationClient.SenderAddress() if !isAllowedRelayer(teleporterMessage.AllowedRelayerAddresses, senderAddress) { m.logger.Info( "Relayer EOA not allowed to deliver this message.", zap.String("destinationBlockchainID", destinationBlockchainID.String()), zap.String("warpMessageID", warpMessageInfo.WarpUnsignedMessage.ID().String()), - zap.String("teleporterMessageID", teleporterMessage.MessageID.String()), + zap.String("teleporterMessageID", teleporterMessageID.String()), ) return false, nil } - delivered, err := m.messageDelivered( - destinationClient, - warpMessageInfo, - teleporterMessage, - destinationBlockchainID, - ) + // Check if the message has already been delivered to the destination chain + delivered, err := teleporter.MessageReceived(&bind.CallOpts{}, teleporterMessageID) if err != nil { m.logger.Error( "Failed to check if message has been delivered to destination chain.", zap.String("destinationBlockchainID", destinationBlockchainID.String()), zap.String("warpMessageID", warpMessageInfo.WarpUnsignedMessage.ID().String()), - zap.String("teleporterMessageID", teleporterMessage.MessageID.String()), + zap.String("teleporterMessageID", teleporterMessageID.String()), zap.Error(err), ) return false, err @@ -156,7 +168,7 @@ func (m *messageManager) ShouldSendMessage(warpMessageInfo *vmtypes.WarpMessageI m.logger.Info( "Message already delivered to destination.", zap.String("destinationBlockchainID", destinationBlockchainID.String()), - zap.String("teleporterMessageID", teleporterMessage.MessageID.String()), + zap.String("teleporterMessageID", teleporterMessageID.String()), ) return false, nil } @@ -166,74 +178,38 @@ func (m *messageManager) ShouldSendMessage(warpMessageInfo *vmtypes.WarpMessageI return true, nil } -// Helper to check if a message has been delivered to the destination chain -// Returns true if the message has been delivered, false if not -// On error, the boolean result should be ignored -func (m *messageManager) messageDelivered( - destinationClient vms.DestinationClient, - warpMessageInfo *vmtypes.WarpMessageInfo, - teleporterMessage *teleportermessenger.TeleporterMessage, - destinationBlockchainID ids.ID) (bool, error) { - // Check if the message has already been delivered to the destination chain - client, ok := destinationClient.Client().(ethclient.Client) - if !ok { - m.logger.Error( - "Destination client is not an Ethereum client.", - zap.String("destinationBlockchainID", destinationBlockchainID.String()), - ) - return false, errors.New("destination client is not an Ethereum client") - } - - data, err := teleportermessenger.PackMessageReceived( - warpMessageInfo.WarpUnsignedMessage.SourceChainID, - teleporterMessage.MessageID, - ) +// SendMessage extracts the gasLimit and packs the call data to call the receiveCrossChainMessage method of the Teleporter contract, +// and dispatches transaction construction and broadcast to the destination client +func (m *messageManager) SendMessage(signedMessage *warp.Message, parsedVmPayload []byte, destinationBlockchainID ids.ID) error { + teleporterMessage, err := m.parseTeleporterMessage(signedMessage.ID(), parsedVmPayload) if err != nil { m.logger.Error( - "Failed packing messageReceived call data.", + "Failed get teleporter message.", zap.String("destinationBlockchainID", destinationBlockchainID.String()), - zap.Error(err), + zap.String("warpMessageID", signedMessage.ID().String()), ) - return false, err - } - protocolAddress := common.BytesToAddress(m.protocolAddress[:]) - callMessage := interfaces.CallMsg{ - To: &protocolAddress, - Data: data, + return err } - result, err := client.CallContract(context.Background(), callMessage, nil) - if err != nil { - m.logger.Error( - "Failed calling messageReceived method on destination chain.", - zap.String("destinationBlockchainID", destinationBlockchainID.String()), - zap.Error(err), - ) - return false, err + + // Get the correct destination client from the global map + destinationClient, ok := m.destinationClients[destinationBlockchainID] + if !ok { + return fmt.Errorf("relayer not configured to deliver to destination. DestinationBlockchainID=%s", destinationBlockchainID) } - // check the contract call result - delivered, err := teleportermessenger.UnpackMessageReceivedResult(result) + + teleporter, err := m.getTeleporterMessenger(destinationClient) if err != nil { m.logger.Error( - "Failed unpacking messageReceived result.", + "Failed to get teleporter messenger contract.", zap.String("destinationBlockchainID", destinationBlockchainID.String()), + zap.String("warpMessageID", signedMessage.ID().String()), + zap.String("messageNonce", teleporterMessage.MessageNonce.String()), zap.Error(err), ) - return false, err + return err } - - return delivered, nil -} - -// SendMessage extracts the gasLimit and packs the call data to call the receiveCrossChainMessage method of the Teleporter contract, -// and dispatches transaction construction and broadcast to the destination client -func (m *messageManager) SendMessage(signedMessage *warp.Message, parsedVmPayload []byte, destinationBlockchainID ids.ID) error { - teleporterMessage, err := m.parseTeleporterMessage(signedMessage.ID(), parsedVmPayload) + teleporterMessageID, err := m.calculateMessageID(teleporter, signedMessage.SourceChainID, destinationBlockchainID, teleporterMessage.MessageNonce) if err != nil { - m.logger.Error( - "Failed get teleporter message.", - zap.String("destinationBlockchainID", destinationBlockchainID.String()), - zap.String("warpMessageID", signedMessage.ID().String()), - ) return err } @@ -241,7 +217,7 @@ func (m *messageManager) SendMessage(signedMessage *warp.Message, parsedVmPayloa "Sending message to destination chain", zap.String("destinationBlockchainID", destinationBlockchainID.String()), zap.String("warpMessageID", signedMessage.ID().String()), - zap.String("teleporterMessageID", teleporterMessage.MessageID.String()), + zap.String("teleporterMessageID", teleporterMessageID.String()), ) numSigners, err := signedMessage.Signature.NumSigners() if err != nil { @@ -249,7 +225,7 @@ func (m *messageManager) SendMessage(signedMessage *warp.Message, parsedVmPayloa "Failed to get number of signers", zap.String("destinationBlockchainID", destinationBlockchainID.String()), zap.String("warpMessageID", signedMessage.ID().String()), - zap.String("teleporterMessageID", teleporterMessage.MessageID.String()), + zap.String("teleporterMessageID", teleporterMessageID.String()), ) return err } @@ -259,7 +235,7 @@ func (m *messageManager) SendMessage(signedMessage *warp.Message, parsedVmPayloa "Gas limit required overflowed uint64 max. not relaying message", zap.String("destinationBlockchainID", destinationBlockchainID.String()), zap.String("warpMessageID", signedMessage.ID().String()), - zap.String("teleporterMessageID", teleporterMessage.MessageID.String()), + zap.String("teleporterMessageID", teleporterMessageID.String()), ) return err } @@ -270,23 +246,18 @@ func (m *messageManager) SendMessage(signedMessage *warp.Message, parsedVmPayloa "Failed packing receiveCrossChainMessage call data", zap.String("destinationBlockchainID", destinationBlockchainID.String()), zap.String("warpMessageID", signedMessage.ID().String()), - zap.String("teleporterMessageID", teleporterMessage.MessageID.String()), + zap.String("teleporterMessageID", teleporterMessageID.String()), ) return err } - // Get the correct destination client from the global map - destinationClient, ok := m.destinationClients[destinationBlockchainID] - if !ok { - return fmt.Errorf("relayer not configured to deliver to destination. DestinationBlockchainID=%s", destinationBlockchainID) - } err = destinationClient.SendTx(signedMessage, m.protocolAddress.Hex(), gasLimit, callData) if err != nil { m.logger.Error( "Failed to send tx.", zap.String("destinationBlockchainID", destinationBlockchainID.String()), zap.String("warpMessageID", signedMessage.ID().String()), - zap.String("teleporterMessageID", teleporterMessage.MessageID.String()), + zap.String("teleporterMessageID", teleporterMessageID.String()), zap.Error(err), ) return err @@ -295,7 +266,7 @@ func (m *messageManager) SendMessage(signedMessage *warp.Message, parsedVmPayloa "Sent message to destination chain", zap.String("destinationBlockchainID", destinationBlockchainID.String()), zap.String("warpMessageID", signedMessage.ID().String()), - zap.String("teleporterMessageID", teleporterMessage.MessageID.String()), + zap.String("teleporterMessageID", teleporterMessageID.String()), ) return nil } @@ -323,3 +294,40 @@ func (m *messageManager) parseTeleporterMessage(warpMessageID ids.ID, warpPayloa } return teleporterMessage, nil } + +func (m *messageManager) getTeleporterMessenger(destinationClient vms.DestinationClient) (*teleportermessenger.TeleporterMessenger, error) { + client, ok := destinationClient.Client().(ethclient.Client) + if !ok { + m.logger.Error( + "Destination client is not an Ethereum client.", + zap.String("destinationBlockchainID", destinationClient.DestinationBlockchainID().String()), + ) + return nil, errors.New("destination client is not an Ethereum client") + } + + // Get the teleporter messenger contract + teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger(common.BytesToAddress(m.protocolAddress[:]), client) + if err != nil { + m.logger.Error( + "Failed to get teleporter messenger contract", + zap.Error(err), + ) + return nil, err + } + return teleporterMessenger, nil +} + +func (m *messageManager) calculateMessageID(teleporter *teleportermessenger.TeleporterMessenger, sourceBlockchainID ids.ID, destinationBlockchainID ids.ID, messageNonce *big.Int) (ids.ID, error) { + messageID, err := teleporter.CalculateMessageID(&bind.CallOpts{}, sourceBlockchainID, destinationBlockchainID, messageNonce) + if err != nil { + m.logger.Error( + "Failed to calculate message ID", + zap.String("sourceBlockchainID", sourceBlockchainID.String()), + zap.String("destinationBlockchainID", destinationBlockchainID.String()), + zap.Error(err), + ) + return ids.Empty, err + } + + return messageID, nil +} diff --git a/messages/teleporter/message_manager_test.go b/messages/teleporter/message_manager_test.go index 07e5f6dc..2bac41b5 100644 --- a/messages/teleporter/message_manager_test.go +++ b/messages/teleporter/message_manager_test.go @@ -15,12 +15,20 @@ import ( mock_evm "github.com/ava-labs/awm-relayer/vms/evm/mocks" mock_vms "github.com/ava-labs/awm-relayer/vms/mocks" "github.com/ava-labs/awm-relayer/vms/vmtypes" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/interfaces" teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/Teleporter/TeleporterMessenger" "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" ) +type CallContractChecker struct { + input []byte + expectedResult []byte + times int +} + var ( messageProtocolAddress = common.HexToHash("0xd81545385803bCD83bd59f58Ba2d2c0562387F83") messageProtocolConfig = config.MessageProtocolConfig{ @@ -30,9 +38,10 @@ var ( }, } destinationBlockchainIDString = "S4mMqUXe7vHsGiRAma6bv3CKnyaLssyAxmQ2KvFpX1KEvfFCD" + messageIDstring = "2CQw6XkzbDZY87XRomuszWkCBDTUvMaZv3YE2PAf7cicxWWEMF" validRelayerAddress = common.HexToAddress("0x0123456789abcdef0123456789abcdef01234567") validTeleporterMessage = teleportermessenger.TeleporterMessage{ - MessageID: big.NewInt(1), + MessageNonce: big.NewInt(1), SenderAddress: common.HexToAddress("0x0123456789abcdef0123456789abcdef01234567"), DestinationAddress: common.HexToAddress("0x0123456789abcdef0123456789abcdef01234567"), RequiredGasLimit: big.NewInt(2), @@ -41,7 +50,7 @@ var ( }, Receipts: []teleportermessenger.TeleporterMessageReceipt{ { - ReceivedMessageID: big.NewInt(1), + ReceivedMessageNonce: big.NewInt(1), RelayerRewardAddress: common.HexToAddress("0x0123456789abcdef0123456789abcdef01234567"), }, }, @@ -71,8 +80,25 @@ func TestShouldSendMessage(t *testing.T) { validMessageBytes, err := teleportermessenger.PackTeleporterMessage(validTeleporterMessage) require.NoError(t, err) - validTeleporterMessage.MessageID = big.NewInt(2) - validMessageBytes2, err := teleportermessenger.PackTeleporterMessage(validTeleporterMessage) + sourceBlockchainID := ids.Empty + warpUnsignedMessage, err := warp.NewUnsignedMessage(0, sourceBlockchainID, validMessageBytes) + require.NoError(t, err) + + // Create all the inputs and expected outputs for Teleporter calls + calculateMessageIDInput, err := teleportermessenger.PackCalculateMessageID( + sourceBlockchainID, + destinationBlockchainID, + validTeleporterMessage.MessageNonce, + ) + require.NoError(t, err) + + messageID, err := ids.FromString(messageIDstring) + require.NoError(t, err) + + messageIDOutput, err := teleportermessenger.PackCalculateMessageIDOutput(messageID) + require.NoError(t, err) + + messageReceivedInput, err := teleportermessenger.PackMessageReceived(messageID) require.NoError(t, err) messageNotDelivered, err := teleportermessenger.PackMessageReceivedOutput(false) @@ -81,21 +107,22 @@ func TestShouldSendMessage(t *testing.T) { messageDelivered, err := teleportermessenger.PackMessageReceivedOutput(true) require.NoError(t, err) - warpUnsignedMessage, err := warp.NewUnsignedMessage(0, ids.Empty, validMessageBytes) + // Make a copy of the previous Warp message with a new Warp message ID + validTeleporterMessage.MessageNonce = big.NewInt(2) + validMessageBytes2, err := teleportermessenger.PackTeleporterMessage(validTeleporterMessage) require.NoError(t, err) - - warpUnsignedMessage2, err := warp.NewUnsignedMessage(0, ids.Empty, validMessageBytes2) + warpUnsignedMessage2, err := warp.NewUnsignedMessage(0, sourceBlockchainID, validMessageBytes2) require.NoError(t, err) + testCases := []struct { name string destinationBlockchainID ids.ID warpMessageInfo *vmtypes.WarpMessageInfo senderAddressResult common.Address senderAddressTimes int - clientResult *mock_evm.MockClient clientTimes int - callContractResult []byte - callContractTimes int + calculateMessageIDCall *CallContractChecker + messageReceivedCall *CallContractChecker expectedError bool expectedResult bool }{ @@ -108,11 +135,18 @@ func TestShouldSendMessage(t *testing.T) { }, senderAddressResult: validRelayerAddress, senderAddressTimes: 1, - clientResult: mock_evm.NewMockClient(ctrl), clientTimes: 1, - callContractResult: messageNotDelivered, - callContractTimes: 1, - expectedResult: true, + calculateMessageIDCall: &CallContractChecker{ + input: calculateMessageIDInput, + expectedResult: messageIDOutput, + times: 1, + }, + messageReceivedCall: &CallContractChecker{ + input: messageReceivedInput, + expectedResult: messageNotDelivered, + times: 1, + }, + expectedResult: true, }, { name: "invalid message", @@ -141,7 +175,13 @@ func TestShouldSendMessage(t *testing.T) { }, senderAddressResult: common.Address{}, senderAddressTimes: 1, - expectedResult: false, + clientTimes: 1, + calculateMessageIDCall: &CallContractChecker{ + input: calculateMessageIDInput, + expectedResult: messageIDOutput, + times: 1, + }, + expectedResult: false, }, { name: "message already delivered", @@ -152,19 +192,33 @@ func TestShouldSendMessage(t *testing.T) { }, senderAddressResult: validRelayerAddress, senderAddressTimes: 1, - clientResult: mock_evm.NewMockClient(ctrl), clientTimes: 1, - callContractResult: messageDelivered, - callContractTimes: 1, - expectedResult: false, + calculateMessageIDCall: &CallContractChecker{ + input: calculateMessageIDInput, + expectedResult: messageIDOutput, + times: 1, + }, + messageReceivedCall: &CallContractChecker{ + input: messageReceivedInput, + expectedResult: messageDelivered, + times: 1, + }, + expectedResult: false, }, } for _, test := range testCases { t.Run(test.name, func(t *testing.T) { + ethClient := mock_evm.NewMockClient(ctrl) + mockClient.EXPECT().Client().Return(ethClient).Times(test.clientTimes) mockClient.EXPECT().SenderAddress().Return(test.senderAddressResult).Times(test.senderAddressTimes) - mockClient.EXPECT().Client().Return(test.clientResult).Times(test.clientTimes) - if test.clientResult != nil { - test.clientResult.EXPECT().CallContract(gomock.Any(), gomock.Any(), gomock.Any()).Return(test.callContractResult, nil).Times(test.callContractTimes) + protocolAddress := common.BytesToAddress(messageProtocolAddress[:]) + if test.calculateMessageIDCall != nil { + messageIDInput := interfaces.CallMsg{From: bind.CallOpts{}.From, To: &protocolAddress, Data: test.calculateMessageIDCall.input} + ethClient.EXPECT().CallContract(gomock.Any(), gomock.Eq(messageIDInput), gomock.Any()).Return(test.calculateMessageIDCall.expectedResult, nil).Times(test.calculateMessageIDCall.times) + } + if test.messageReceivedCall != nil { + messageReceivedInput := interfaces.CallMsg{From: bind.CallOpts{}.From, To: &protocolAddress, Data: test.messageReceivedCall.input} + ethClient.EXPECT().CallContract(gomock.Any(), gomock.Eq(messageReceivedInput), gomock.Any()).Return(test.messageReceivedCall.expectedResult, nil).Times(test.messageReceivedCall.times) } result, err := messageManager.ShouldSendMessage(test.warpMessageInfo, test.destinationBlockchainID) diff --git a/tests/basic_relay.go b/tests/basic_relay.go index cd0246f3..5d9fd74c 100644 --- a/tests/basic_relay.go +++ b/tests/basic_relay.go @@ -259,7 +259,7 @@ func relayBasicMessage( ) { log.Info("Packing Teleporter message") teleporterMessage := teleportermessenger.TeleporterMessage{ - MessageID: big.NewInt(1), + MessageNonce: big.NewInt(1), SenderAddress: fundedAddress, DestinationBlockchainID: destination.BlockchainID, DestinationAddress: fundedAddress, @@ -340,7 +340,7 @@ func relayBasicMessage( receiveEvent, err := teleporterTestUtils.GetEventFromLogs(receipt.Logs, destination.TeleporterMessenger.ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) Expect(receiveEvent.OriginBlockchainID[:]).Should(Equal(source.BlockchainID[:])) - Expect(receiveEvent.Message.MessageID.Uint64()).Should(Equal(teleporterMessageID.Uint64())) + Expect(receiveEvent.MessageID[:]).Should(Equal(teleporterMessageID[:])) // // Validate Received Warp Message Values @@ -356,7 +356,8 @@ func relayBasicMessage( receivedTeleporterMessage, err := teleportermessenger.UnpackTeleporterMessage(addressedPayload.Payload) Expect(err).Should(BeNil()) - Expect(receivedTeleporterMessage.MessageID.Uint64()).Should(Equal(teleporterMessageID.Uint64())) + receivedMessageID := teleporterTestUtils.CalculateMessageID(source, destination, teleporterMessage.MessageNonce) + Expect(receivedMessageID).Should(Equal(teleporterMessageID)) Expect(receivedTeleporterMessage.SenderAddress).Should(Equal(teleporterMessage.SenderAddress)) receivedDestinationID, err := ids.ToID(receivedTeleporterMessage.DestinationBlockchainID[:]) Expect(err).Should(BeNil()) diff --git a/tests/utils/UniversalTeleporterDeployerAddress.txt b/tests/utils/UniversalTeleporterDeployerAddress.txt index 7a30b57b..eab789c2 100755 --- a/tests/utils/UniversalTeleporterDeployerAddress.txt +++ b/tests/utils/UniversalTeleporterDeployerAddress.txt @@ -1 +1 @@ -0xd6d7126D9A9d1e6df28d3Ad785E603e37Bb69180 \ No newline at end of file +0x7307D51641453D3DbB28c0c3303D5661e3Bc9507 diff --git a/tests/utils/UniversalTeleporterDeployerTransaction.txt b/tests/utils/UniversalTeleporterDeployerTransaction.txt index d26ee5cc..85a0a78a 100755 --- a/tests/utils/UniversalTeleporterDeployerTransaction.txt +++ b/tests/utils/UniversalTeleporterDeployerTransaction.txt @@ -1 +1 @@ -0xf930ce80860246139ca800833d09008080b9307a608060405234801561001057600080fd5b50600160008190558055613051806100296000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063892bf412116100b8578063ccb5f8091161007c578063ccb5f80914610366578063d127dc9b14610379578063df20e8bc14610382578063e03555df14610395578063e6e67bd5146103b8578063fc2d6197146103f457600080fd5b8063892bf412146102c1578063af402850146102e1578063b771b3bc146102f4578063c473eef814610302578063c9bb11431461033b57600080fd5b80632bc8b0bf116100ff5780632bc8b0bf146101bd57806333e890fe146101d0578063624488501461021c57806366533d121461022f57806382f2c43a1461028f57600080fd5b8063191eb6981461013c57806319570c7414610162578063220c95681461017757806322296c3a1461018a57806329ec9beb1461019d575b600080fd5b61014f61014a3660046120cc565b610407565b6040519081526020015b60405180910390f35b61017561017036600461218c565b61062a565b005b61014f6101853660046121cb565b610865565b6101756101983660046121ed565b610886565b61014f6101ab36600461220a565b60036020526000908152604090205481565b61014f6101cb36600461220a565b61097b565b6102046101de3660046121cb565b60009182526007602090815260408084209284529190529020546001600160a01b031690565b6040516001600160a01b039091168152602001610159565b61014f61022a366004612223565b610992565b61028161023d3660046121cb565b60056020908152600092835260408084208252918352918190208054825180840190935260018201546001600160a01b031683526002909101549282019290925282565b60405161015992919061225d565b6102a261029d3660046121cb565b6109f0565b604080516001600160a01b039093168352602083019190915201610159565b6102d46102cf3660046121cb565b610a39565b6040516101599190612284565b6101756102ef3660046122a4565b610a6c565b6102046005600160991b0181565b61014f6103103660046122f2565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61014f6103493660046121cb565b600660209081526000928352604080842090915290825290205481565b610175610374366004612320565b610c01565b61014f60025481565b61014f61039036600461220a565b611113565b6103a86103a33660046121cb565b61111e565b6040519015158152602001610159565b6103df6103c636600461220a565b6004602052600090815260409020805460019091015482565b60408051928352602083019190915201610159565b6101756104023660046122a4565b611148565b60006001600054146104345760405162461bcd60e51b815260040161042b90612347565b60405180910390fd5b60026000908155856001600160401b038111156104535761045361238a565b60405190808252806020026020018201604052801561049857816020015b60408051808201909152600080825260208201528152602001906001900390816104715790505b50905060005b868110156105955760008888838181106104ba576104ba6123a0565b60008d815260076020908152604080832093820295909501358083529290529290922054919250506001600160a01b0316806105475760405162461bcd60e51b815260206004820152602660248201527f54656c65706f727465724d657373656e6765723a2072656365697074206e6f7460448201526508199bdd5b9960d21b606482015260840161042b565b6040518060400160405280838152602001826001600160a01b0316815250848481518110610577576105776123a0565b602002602001018190525050508061058e906123cc565b905061049e565b506040805160c081018252898152600060208201526106199181016105bf368990038901896124bd565b815260200160008152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093855250506040805192835260208084019091529092015250826113a2565b600160005598975050505050505050565b60016000541461064c5760405162461bcd60e51b815260040161042b90612347565b6002600055806106b65760405162461bcd60e51b815260206004820152602f60248201527f54656c65706f727465724d657373656e6765723a207a65726f2061646469746960448201526e1bdb985b0819995948185b5bdd5b9d608a1b606482015260840161042b565b6001600160a01b0382166106dc5760405162461bcd60e51b815260040161042b906124d9565b60008481526005602090815260408083208684529091529020546107125760405162461bcd60e51b815260040161042b9061252d565b60008481526005602090815260408083208684529091529020600101546001600160a01b038381169116146107af5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f727465724d657373656e6765723a20696e76616c69642066656560448201527f20617373657420636f6e74726163742061646472657373000000000000000000606482015260840161042b565b60006107bb83836115d4565b60008681526005602090815260408083208884529091528120600201805492935083929091906107ec908490612573565b90915550506000858152600560209081526040808320878452825291829020825160018201546001600160a01b0316815260029091015491810191909152859187917f28fe05eedf0479c9159e5b6dd2a28c93fa1a408eba22dc801fd9bc493a7fc0c2910160405180910390a350506001600055505050565b60008281526005602090815260408083208484529091529020545b92915050565b3360009081526008602090815260408083206001600160a01b0385168452909152902054806109085760405162461bcd60e51b815260206004820152602860248201527f54656c65706f727465724d657373656e6765723a206e6f2072657761726420746044820152676f2072656465656d60c01b606482015260840161042b565b3360008181526008602090815260408083206001600160a01b03871680855290835281842093909355518481529192917f3294c84e5b0f29d9803655319087207bc94f4db29f7927846944822773780b88910160405180910390a36109776001600160a01b038316338361173c565b5050565b6000818152600460205260408120610880906117a4565b60006001600054146109b65760405162461bcd60e51b815260040161042b90612347565b60026000556109e56109c783612695565b833560009081526004602052604090206109e0906117b7565b6113a2565b600160005592915050565b6000828152600560209081526040808320848452825291829020825180840190935260018101546001600160a01b031680845260029091015492909101829052905b9250929050565b60408051808201909152600080825260208201526000838152600460205260409020610a6590836118c6565b9392505050565b600160005414610a8e5760405162461bcd60e51b815260040161042b90612347565b60026000818155838152600560209081526040808320853584528252918290208251808401845281548152835180850190945260018201546001600160a01b03168452930154828201528201528051610af95760405162461bcd60e51b815260040161042b9061252d565b600082604051602001610b0c919061298d565b60408051601f1981840301815291905282518151602083012091925014610b455760405162461bcd60e51b815260040161042b906129a0565b8260000135847f0563d357b89128d5a0c37c9b06420836e35d193eaf17f7960fc88e47d1e02f57858560200151604051610b809291906129e9565b60405180910390a360405163ee5b48eb60e01b81526005600160991b019063ee5b48eb90610bb2908490600401612a6e565b6020604051808303816000875af1158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf59190612a81565b50506001600055505050565b6001805414610c225760405162461bcd60e51b815260040161042b90612a9a565b60026001556001600160a01b038116610c965760405162461bcd60e51b815260206004820152603060248201527f54656c65706f727465724d657373656e6765723a207a65726f2072656c61796560448201526f7220726577617264206164647265737360801b606482015260840161042b565b6040516306f8253560e41b815263ffffffff8316600482015260009081906005600160991b0190636f82535090602401600060405180830381865afa158015610ce3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d0b9190810190612b3f565b9150915080610d6e5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161042b565b60208201516001600160a01b03163014610de55760405162461bcd60e51b815260206004820152603260248201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161042b565b60025480610e5e576005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e569190612a81565b600281905590505b60008360400151806020019051810190610e789190612cdc565b905081816040015114610ee75760405162461bcd60e51b815260206004820152603160248201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206465736044820152701d1a5b985d1a5bdb8818da185a5b881251607a1b606482015260840161042b565b8351815160009182526007602090815260408084209284529190529020546001600160a01b031615610f725760405162461bcd60e51b815260206004820152602e60248201527f54656c65706f727465724d657373656e6765723a206d65737361676520616c7260448201526d1958591e4819195b1a5d995c995960921b606482015260840161042b565b610f80338260a0015161198b565b610fde5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a20756e617574686f72697a6560448201526832103932b630bcb2b960b91b606482015260840161042b565b8351600090815260076020908152604080832084518452909152902080546001600160a01b0319166001600160a01b03871617905560e0810151511561102a57835161102a9082611a00565b60c08101515160005b818110156110855760008360c001518281518110611053576110536123a0565b60200260200101519050611074876000015182600001518360200151611b2f565b5061107e816123cc565b9050611033565b5084516000908152600460209081526040918290208251808401909352845183526001600160a01b03891691830191909152906110c3908290611bff565b82518651604051339291907f6b013241f9192863bc66c1f1e9a01dc592c94592bfed5e1ed380808525679575906110fd908c908990612eec565b60405180910390a4505060018055505050505050565b600061088082611c5b565b60008281526007602090815260408083208484529091528120546001600160a01b03161515610a65565b60018054146111695760405162461bcd60e51b815260040161042b90612a9a565b6002600155600082815260066020908152604080832084358452909152902054806111a65760405162461bcd60e51b815260040161042b9061252d565b80826040516020016111b8919061298d565b60405160208183030381529060405280519060200120146111eb5760405162461bcd60e51b815260040161042b906129a0565b60006111fd60808401606085016121ed565b6001600160a01b03163b116112715760405162461bcd60e51b815260206004820152603460248201527f54656c65706f727465724d657373656e6765723a2064657374696e6174696f6e604482015273206164647265737320686173206e6f20636f646560601b606482015260840161042b565b60405182359084907f5ad362d54cba0e49d358be9ce586a7136d10a2533579c4460b7e48ec273083ef90600090a3600083815260066020908152604080832085358452825280832083905585916112cc9186019086016121ed565b6112d960e0860186612f10565b6040516024016112ec9493929190612f56565b60408051601f198184030181529190526020810180516001600160e01b031663643477d560e11b1790529050600061133461132d60808601606087016121ed565b5a84611c75565b9050806113975760405162461bcd60e51b815260206004820152602b60248201527f54656c65706f727465724d657373656e6765723a20726574727920657865637560448201526a1d1a5bdb8819985a5b195960aa1b606482015260840161042b565b505060018055505050565b6000806113b28460000151611c5b565b90506000604051806101000160405280838152602001336001600160a01b031681526020018660000151815260200186602001516001600160a01b0316815260200186606001518152602001866080015181526020018581526020018660a00151815250905060008160405160200161142b9190612f81565b60408051601f198184030181529181528751600090815260036020908152828220879055918901519091015191925090156114a5576040870151516001600160a01b031661148b5760405162461bcd60e51b815260040161042b906124d9565b604087015180516020909101516114a291906115d4565b90505b60408051808201825288820151516001600160a01b03908116825260208083018590528351808501855286518783012081528082018481528c516000908152600584528681208b82528452869020915182555180516001830180546001600160a01b031916919095161790935591015160029091015588519151909186917f0563d357b89128d5a0c37c9b06420836e35d193eaf17f7960fc88e47d1e02f57906115529088908690612f94565b60405180910390a360405163ee5b48eb60e01b81526005600160991b019063ee5b48eb90611584908690600401612a6e565b6020604051808303816000875af11580156115a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c79190612a81565b5093979650505050505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561161d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116419190612a81565b90506116586001600160a01b038516333086611c8f565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa15801561169f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c39190612a81565b90508181116117295760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161042b565b6117338282612fa7565b95945050505050565b6040516001600160a01b03831660248201526044810182905261179f90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611cc7565b505050565b8054600182015460009161088091612fa7565b606060006117ce60056117c9856117a4565b611d99565b90508060000361181d576040805160008082526020820190925290611815565b60408051808201909152600080825260208201528152602001906001900390816117ee5790505b509392505050565b806001600160401b038111156118355761183561238a565b60405190808252806020026020018201604052801561187a57816020015b60408051808201909152600080825260208201528152602001906001900390816118535790505b50915060005b818110156118bf5761189184611daf565b8382815181106118a3576118a36123a0565b6020026020010181905250806118b8906123cc565b9050611880565b5050919050565b60408051808201909152600080825260208201526118e3836117a4565b821061193b5760405162461bcd60e51b815260206004820152602160248201527f5265636569707451756575653a20696e646578206f7574206f6620626f756e646044820152607360f81b606482015260840161042b565b8260020160008385600001546119519190612573565b81526020808201929092526040908101600020815180830190925280548252600101546001600160a01b0316918101919091529392505050565b6000815160000361199e57506001610880565b60005b82518110156119f657836001600160a01b03168382815181106119c6576119c66123a0565b60200260200101516001600160a01b0316036119e6576001915050610880565b6119ef816123cc565b90506119a1565b5060009392505050565b80608001515a1015611a625760405162461bcd60e51b815260206004820152602560248201527f54656c65706f727465724d657373656e6765723a20696e73756666696369656e604482015264742067617360d81b606482015260840161042b565b80606001516001600160a01b03163b600003611a82576109778282611e7a565b602081015160e0820151604051600092611aa0928692602401612fba565b60408051601f198184030181529190526020810180516001600160e01b031663643477d560e11b17905260608301516080840151919250600091611ae5919084611c75565b905080611afc57611af68484611e7a565b50505050565b825160405185907f5ad362d54cba0e49d358be9ce586a7136d10a2533579c4460b7e48ec273083ef90600090a350505050565b60008381526005602090815260408083208584528252918290208251808401845281548152835180850190945260018201546001600160a01b0316845260029091015483830152908101919091528051611b895750505050565b600084815260056020908152604080832086845282528083208381556001810180546001600160a01b031916905560020183905583820180518301516001600160a01b0387811686526008855283862092515116855292528220805491929091611bf4908490612573565b909155505050505050565b6001820180548291600285019160009182611c19836123cc565b90915550815260208082019290925260400160002082518155910151600190910180546001600160a01b0319166001600160a01b039092169190911790555050565b600081815260036020526040812054610880906001612573565b60008060008084516020860160008989f195945050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611af69085906323b872dd60e01b90608401611768565b6000611d1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ef89092919063ffffffff16565b80519091501561179f5780806020019051810190611d3a9190612fe4565b61179f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161042b565b6000818310611da85781610a65565b5090919050565b604080518082019091526000808252602082015281546001830154819003611e195760405162461bcd60e51b815260206004820152601960248201527f5265636569707451756575653a20656d70747920717565756500000000000000604482015260640161042b565b60008181526002840160208181526040808420815180830190925280548252600180820180546001600160a01b03811685870152888852959094529490556001600160a01b031990921690559250611e72908290612573565b909255919050565b80604051602001611e8b9190612f81565b60408051601f198184030181528282528051602091820120600086815260068352838120865182529092529190205581519083907fbedbbe6103cef0a6c9ecbf6aa23da414542c42d7918bea18aab8b601b2c3a44990611eec908590612f81565b60405180910390a35050565b6060611f078484600085611f0f565b949350505050565b606082471015611f705760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161042b565b600080866001600160a01b03168587604051611f8c9190612fff565b60006040518083038185875af1925050503d8060008114611fc9576040519150601f19603f3d011682016040523d82523d6000602084013e611fce565b606091505b5091509150611fdf87838387611fea565b979650505050505050565b60608315612059578251600003612052576001600160a01b0385163b6120525760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161042b565b5081611f07565b611f07838381511561206e5781518083602001fd5b8060405162461bcd60e51b815260040161042b9190612a6e565b60008083601f84011261209a57600080fd5b5081356001600160401b038111156120b157600080fd5b6020830191508360208260051b8501011115610a3257600080fd5b60008060008060008086880360a08112156120e657600080fd5b8735965060208801356001600160401b038082111561210457600080fd5b6121108b838c01612088565b90985096508691506040603f198401121561212a57600080fd5b60408a01955060808a013592508083111561214457600080fd5b505061215289828a01612088565b979a9699509497509295939492505050565b6001600160a01b038116811461217957600080fd5b50565b803561218781612164565b919050565b600080600080608085870312156121a257600080fd5b843593506020850135925060408501356121bb81612164565b9396929550929360600135925050565b600080604083850312156121de57600080fd5b50508035926020909101359150565b6000602082840312156121ff57600080fd5b8135610a6581612164565b60006020828403121561221c57600080fd5b5035919050565b60006020828403121561223557600080fd5b81356001600160401b0381111561224b57600080fd5b820160e08185031215610a6557600080fd5b82815260608101610a65602083018480516001600160a01b03168252602090810151910152565b815181526020808301516001600160a01b03169082015260408101610880565b600080604083850312156122b757600080fd5b8235915060208301356001600160401b038111156122d457600080fd5b830161010081860312156122e757600080fd5b809150509250929050565b6000806040838503121561230557600080fd5b823561231081612164565b915060208301356122e781612164565b6000806040838503121561233357600080fd5b823563ffffffff8116811461231057600080fd5b60208082526023908201527f5265656e7472616e63794775617264733a2073656e646572207265656e7472616040820152626e637960e81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016123de576123de6123b6565b5060010190565b604080519081016001600160401b03811182821017156124075761240761238a565b60405290565b60405160c081016001600160401b03811182821017156124075761240761238a565b60405161010081016001600160401b03811182821017156124075761240761238a565b604051601f8201601f191681016001600160401b038111828210171561247a5761247a61238a565b604052919050565b60006040828403121561249457600080fd5b61249c6123e5565b905081356124a981612164565b808252506020820135602082015292915050565b6000604082840312156124cf57600080fd5b610a658383612482565b60208082526034908201527f54656c65706f727465724d657373656e6765723a207a65726f2066656520617360408201527373657420636f6e7472616374206164647265737360601b606082015260800190565b60208082526026908201527f54656c65706f727465724d657373656e6765723a206d657373616765206e6f7460408201526508199bdd5b9960d21b606082015260800190565b80820180821115610880576108806123b6565b60006001600160401b0382111561259f5761259f61238a565b5060051b60200190565b600082601f8301126125ba57600080fd5b813560206125cf6125ca83612586565b612452565b82815260059290921b840181019181810190868411156125ee57600080fd5b8286015b8481101561261257803561260581612164565b83529183019183016125f2565b509695505050505050565b60006001600160401b038211156126365761263661238a565b50601f01601f191660200190565b600082601f83011261265557600080fd5b81356126636125ca8261261d565b81815284602083860101111561267857600080fd5b816020850160208301376000918101602001919091529392505050565b600060e082360312156126a757600080fd5b6126af61240d565b823581526126bf6020840161217c565b60208201526126d13660408501612482565b60408201526080830135606082015260a08301356001600160401b03808211156126fa57600080fd5b612706368387016125a9565b608084015260c085013591508082111561271f57600080fd5b5061272c36828601612644565b60a08301525092915050565b6000808335601e1984360301811261274f57600080fd5b83016020810192503590506001600160401b0381111561276e57600080fd5b8060051b3603821315610a3257600080fd5b8183526000602080850194508260005b858110156127be5781356127a381612164565b6001600160a01b031687529582019590820190600101612790565b509495945050505050565b6000808335601e198436030181126127e057600080fd5b83016020810192503590506001600160401b038111156127ff57600080fd5b8060061b3603821315610a3257600080fd5b8183526000602080850194508260005b858110156127be57813587528282013561283a81612164565b6001600160a01b0316878401526040968701969190910190600101612821565b6000808335601e1984360301811261287157600080fd5b83016020810192503590506001600160401b0381111561289057600080fd5b803603821315610a3257600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006101008235845260208301356128df81612164565b6001600160a01b03166020850152604083810135908501526129036060840161217c565b6001600160a01b031660608501526080838101359085015261292860a0840184612738565b8260a087015261293b8387018284612780565b9250505061294c60c08401846127c9565b85830360c087015261295f838284612811565b9250505061297060e084018461285a565b85830360e087015261298383828461289f565b9695505050505050565b602081526000610a6560208301846128c8565b60208082526029908201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206d65736040820152680e6c2ceca40d0c2e6d60bb1b606082015260800190565b6060815260006129fc60608301856128c8565b9050610a65602083018480516001600160a01b03168252602090810151910152565b60005b83811015612a39578181015183820152602001612a21565b50506000910152565b60008151808452612a5a816020860160208601612a1e565b601f01601f19169290920160200192915050565b602081526000610a656020830184612a42565b600060208284031215612a9357600080fd5b5051919050565b60208082526025908201527f5265656e7472616e63794775617264733a207265636569766572207265656e7460408201526472616e637960d81b606082015260800190565b805161218781612164565b600082601f830112612afb57600080fd5b8151612b096125ca8261261d565b818152846020838601011115612b1e57600080fd5b611f07826020830160208701612a1e565b8051801515811461218757600080fd5b60008060408385031215612b5257600080fd5b82516001600160401b0380821115612b6957600080fd5b9084019060608287031215612b7d57600080fd5b604051606081018181108382111715612b9857612b9861238a565b604052825181526020830151612bad81612164565b6020820152604083015182811115612bc457600080fd5b612bd088828601612aea565b6040830152509350612be791505060208401612b2f565b90509250929050565b600082601f830112612c0157600080fd5b81516020612c116125ca83612586565b82815260059290921b84018101918181019086841115612c3057600080fd5b8286015b84811015612612578051612c4781612164565b8352918301918301612c34565b600082601f830112612c6557600080fd5b81516020612c756125ca83612586565b82815260069290921b84018101918181019086841115612c9457600080fd5b8286015b848110156126125760408189031215612cb15760008081fd5b612cb96123e5565b8151815284820151612cca81612164565b81860152835291830191604001612c98565b600060208284031215612cee57600080fd5b81516001600160401b0380821115612d0557600080fd5b908301906101008286031215612d1a57600080fd5b612d2261242f565b82518152612d3260208401612adf565b602082015260408301516040820152612d4d60608401612adf565b60608201526080830151608082015260a083015182811115612d6e57600080fd5b612d7a87828601612bf0565b60a08301525060c083015182811115612d9257600080fd5b612d9e87828601612c54565b60c08301525060e083015182811115612db657600080fd5b612dc287828601612aea565b60e08301525095945050505050565b600081518084526020808501945080840160005b838110156127be5781516001600160a01b031687529582019590820190600101612de5565b600081518084526020808501945080840160005b838110156127be57612e44878351805182526020908101516001600160a01b0316910152565b6040969096019590820190600101612e1e565b60006101008251845260018060a01b036020840151166020850152604083015160408501526060830151612e9660608601826001600160a01b03169052565b506080830151608085015260a08301518160a0860152612eb882860182612dd1565b91505060c083015184820360c0860152612ed28282612e0a565b91505060e083015184820360e08601526117338282612a42565b6001600160a01b0383168152604060208201819052600090611f0790830184612e57565b6000808335601e19843603018112612f2757600080fd5b8301803591506001600160401b03821115612f4157600080fd5b602001915036819003821315610a3257600080fd5b8481526001600160a01b0384166020820152606060408201819052600090612983908301848661289f565b602081526000610a656020830184612e57565b6060815260006129fc6060830185612e57565b81810381811115610880576108806123b6565b8381526001600160a01b038316602082015260606040820181905260009061173390830184612a42565b600060208284031215612ff657600080fd5b610a6582612b2f565b60008251613011818460208701612a1e565b919091019291505056fea2646970667358221220dd55e7925adb52ee310201f60f2f40104b1f4a2d79111d6c886ee5bd10ea344364736f6c634300081200331ba03333333333333333333333333333333333333333333333333333333333333333a03333333333333333333333333333333333333333333333333333333333333333 \ No newline at end of file +0xf933ab80860246139ca800833d09008080b933576080604052600160035534801561001557600080fd5b506001600081905580556133298061002e6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063a8898181116100c3578063df20e8bc1161007c578063df20e8bc1461033b578063e69d606a1461034e578063e6e67bd5146103b6578063ebc3b1ba146103f2578063ecc7042814610415578063fc2d61971461041e57600080fd5b8063a8898181146102b2578063a9a85614146102c5578063b771b3bc146102d8578063c473eef8146102e6578063ccb5f8091461031f578063d127dc9b1461033257600080fd5b8063399b77da11610115578063399b77da1461021957806362448850146102395780638245a1b01461024c578063860a3b061461025f578063892bf4121461027f5780638ac0fd041461029f57600080fd5b80630af5b4ff1461015257806322296c3a1461016d5780632bc8b0bf146101825780632ca40f55146101955780632e27c223146101ee575b600080fd5b61015a610431565b6040519081526020015b60405180910390f35b61018061017b3660046122a5565b610503565b005b61015a6101903660046122c2565b6105f8565b6101e06101a33660046122c2565b6005602090815260009182526040918290208054835180850190945260018201546001600160a01b03168452600290910154918301919091529082565b6040516101649291906122db565b6102016101fc3660046122c2565b610615565b6040516001600160a01b039091168152602001610164565b61015a6102273660046122c2565b60009081526005602052604090205490565b61015a610247366004612302565b61069e565b61018061025a366004612355565b6106fc565b61015a61026d3660046122c2565b60066020526000908152604090205481565b61029261028d366004612389565b6108a7565b60405161016491906123ab565b6101806102ad3660046123cb565b6108da565b61015a6102c0366004612403565b610b19565b61015a6102d336600461247a565b610b5c565b6102016005600160991b0181565b61015a6102f4366004612512565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b61018061032d36600461254b565b610e03565b61015a60025481565b61015a6103493660046122c2565b61123d565b61039761035c3660046122c2565b600090815260056020908152604091829020825180840190935260018101546001600160a01b03168084526002909101549290910182905291565b604080516001600160a01b039093168352602083019190915201610164565b6103dd6103c43660046122c2565b6004602052600090815260409020805460019091015482565b60408051928352602083019190915201610164565b6104056104003660046122c2565b61126d565b6040519015158152602001610164565b61015a60035481565b61018061042c366004612572565b611283565b600254600090806104fe576005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a591906125b8565b9050806104cd5760405162461bcd60e51b81526004016104c4906125d1565b60405180910390fd5b600281905560405181907f1eac640109dc937d2a9f42735a05f794b39a5e3759d681951d671aabbce4b10490600090a25b919050565b3360009081526009602090815260408083206001600160a01b0385168452909152902054806105855760405162461bcd60e51b815260206004820152602860248201527f54656c65706f727465724d657373656e6765723a206e6f2072657761726420746044820152676f2072656465656d60c01b60648201526084016104c4565b3360008181526009602090815260408083206001600160a01b03871680855290835281842093909355518481529192917f3294c84e5b0f29d9803655319087207bc94f4db29f7927846944822773780b88910160405180910390a36105f46001600160a01b03831633836114de565b5050565b600081815260046020526040812061060f90611546565b92915050565b6000818152600760205260408120546106825760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a206d657373616765206e6f74604482015268081c9958d95a5d995960ba1b60648201526084016104c4565b506000908152600860205260409020546001600160a01b031690565b60006001600054146106c25760405162461bcd60e51b81526004016104c490612618565b60026000556106f16106d383612858565b833560009081526004602052604090206106ec90611559565b611663565b600160005592915050565b60016000541461071e5760405162461bcd60e51b81526004016104c490612618565b6002600081815590546107379060408401358435610b19565b6000818152600560209081526040918290208251808401845281548152835180850190945260018201546001600160a01b03168452600290910154838301529081019190915280519192509061079f5760405162461bcd60e51b81526004016104c4906128fb565b6000836040516020016107b29190612b96565b60408051601f19818403018152919052825181516020830120919250146107eb5760405162461bcd60e51b81526004016104c490612ba9565b8360400135837f2a211ad4a59ab9d003852404f9c57c690704ee755f3c79d2c2812ad32da99df8868560200151604051610826929190612bf2565b60405180910390a360405163ee5b48eb60e01b81526005600160991b019063ee5b48eb90610858908490600401612c77565b6020604051808303816000875af1158015610877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089b91906125b8565b50506001600055505050565b604080518082019091526000808252602082015260008381526004602052604090206108d390836118a3565b9392505050565b6001600054146108fc5760405162461bcd60e51b81526004016104c490612618565b600260005560018054146109225760405162461bcd60e51b81526004016104c490612c8a565b60026001558061098c5760405162461bcd60e51b815260206004820152602f60248201527f54656c65706f727465724d657373656e6765723a207a65726f2061646469746960448201526e1bdb985b0819995948185b5bdd5b9d608a1b60648201526084016104c4565b6001600160a01b0382166109b25760405162461bcd60e51b81526004016104c490612ccf565b6000838152600560205260409020546109dd5760405162461bcd60e51b81526004016104c4906128fb565b6000838152600560205260409020600101546001600160a01b03838116911614610a6f5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f727465724d657373656e6765723a20696e76616c69642066656560448201527f20617373657420636f6e7472616374206164647265737300000000000000000060648201526084016104c4565b6000610a7b8383611968565b600085815260056020526040812060020180549293508392909190610aa1908490612d39565b909155505060008481526005602052604090819020905185917fc1bfd1f1208927dfbd414041dcb5256e6c9ad90dd61aec3249facbd34ff7b3e191610b03916001019081546001600160a01b0316815260019190910154602082015260400190565b60405180910390a2505060018080556000555050565b60408051306020820152908101849052606081018390526080810182905260009060a0016040516020818303038152906040528051906020012090509392505050565b6000600160005414610b805760405162461bcd60e51b81526004016104c490612618565b60026000818155905490866001600160401b03811115610ba257610ba261265b565b604051908082528060200260200182016040528015610be757816020015b6040805180820190915260008082526020820152815260200190600190039081610bc05790505b5090508660005b81811015610d6c5760008a8a83818110610c0a57610c0a612d4c565b90506020020135905060006007600083815260200190815260200160002054905080600003610c8a5760405162461bcd60e51b815260206004820152602660248201527f54656c65706f727465724d657373656e6765723a2072656365697074206e6f7460448201526508199bdd5b9960d21b60648201526084016104c4565b610c958d8783610b19565b8214610d095760405162461bcd60e51b815260206004820152603a60248201527f54656c65706f727465724d657373656e6765723a206d6573736167652049442060448201527f6e6f742066726f6d206f726967696e20626c6f636b636861696e00000000000060648201526084016104c4565b6000828152600860209081526040918290205482518084019093528383526001600160a01b03169082018190528651909190879086908110610d4d57610d4d612d4c565b602002602001018190525050505080610d6590612d62565b9050610bee565b506040805160c0810182528b815260006020820152610df0918101610d96368b90038b018b612d7b565b81526020016000815260200188888080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509385525050604080519283526020808401909152909201525083611663565b60016000559a9950505050505050505050565b6001805414610e245760405162461bcd60e51b81526004016104c490612c8a565b60026001556040516306f8253560e41b815263ffffffff8316600482015260009081906005600160991b0190636f82535090602401600060405180830381865afa158015610e76573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e9e9190810190612df7565b9150915080610f015760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c4565b60208201516001600160a01b03163014610f785760405162461bcd60e51b815260206004820152603260248201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c4565b60008260400151806020019051810190610f929190612f94565b90506000610f9e610431565b90508082604001511461100d5760405162461bcd60e51b815260206004820152603160248201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206465736044820152701d1a5b985d1a5bdb8818da185a5b881251607a1b60648201526084016104c4565b8351825160009161101f918490610b19565b600081815260076020526040902054909150156110945760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f727465724d657373656e6765723a206d65737361676520616c7260448201526c1958591e481c9958d95a5d9959609a1b60648201526084016104c4565b6110a2338460a00151611ad0565b6111005760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a20756e617574686f72697a6560448201526832103932b630bcb2b960b91b60648201526084016104c4565b61110e818460000151611b48565b6001600160a01b0386161561114557600081815260086020526040902080546001600160a01b0319166001600160a01b0388161790555b60c08301515160005b81811015611192576111828488600001518760c00151848151811061117557611175612d4c565b6020026020010151611bba565b61118b81612d62565b905061114e565b50604080518082018252855181526001600160a01b038916602080830191909152885160009081526004909152919091206111cc91611ce2565b336001600160a01b03168660000151837f292ee90bbaf70b5d4936025e09d56ba08f3e421156b6a568cf3c2840d9343e348a8860405161120d9291906131a4565b60405180910390a460e0840151511561122f5761122f82876000015186611d3e565b505060018055505050505050565b600254600090806112605760405162461bcd60e51b81526004016104c4906125d1565b6108d38184600354610b19565b600081815260076020526040812054151561060f565b60018054146112a45760405162461bcd60e51b81526004016104c490612c8a565b60026001819055546000906112bc9084908435610b19565b600081815260066020526040902054909150806112eb5760405162461bcd60e51b81526004016104c4906128fb565b80836040516020016112fd9190612b96565b60405160208183030381529060405280519060200120146113305760405162461bcd60e51b81526004016104c490612ba9565b600061134260808501606086016122a5565b6001600160a01b03163b116113b65760405162461bcd60e51b815260206004820152603460248201527f54656c65706f727465724d657373656e6765723a2064657374696e6174696f6e604482015273206164647265737320686173206e6f20636f646560601b60648201526084016104c4565b604051849083907f34795cc6b122b9a0ae684946319f1e14a577b4e8f9b3dda9ac94c21a54d3188c90600090a3600082815260066020908152604080832083905586916114079187019087016122a5565b61141460e08701876131c8565b604051602401611427949392919061320e565b60408051601f198184030181529190526020810180516001600160e01b031663643477d560e11b1790529050600061146f61146860808701606088016122a5565b5a84611e71565b9050806114d25760405162461bcd60e51b815260206004820152602b60248201527f54656c65706f727465724d657373656e6765723a20726574727920657865637560448201526a1d1a5bdb8819985a5b195960aa1b60648201526084016104c4565b50506001805550505050565b6040516001600160a01b03831660248201526044810182905261154190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e8b565b505050565b8054600182015460009161060f91613239565b60606000611570600561156b85611546565b611f5d565b9050806000036115bf5760408051600080825260208201909252906115b7565b60408051808201909152600080825260208201528152602001906001900390816115905790505b509392505050565b6000816001600160401b038111156115d9576115d961265b565b60405190808252806020026020018201604052801561161e57816020015b60408051808201909152600080825260208201528152602001906001900390816115f75790505b50905060005b828110156115b75761163585611f73565b82828151811061164757611647612d4c565b60200260200101819052508061165c90612d62565b9050611624565b60008061166e610431565b905060006003549050600061168883876000015184610b19565b90506000604051806101000160405280848152602001336001600160a01b031681526020018860000151815260200188602001516001600160a01b0316815260200188606001518152602001886080015181526020018781526020018860a001518152509050600081604051602001611701919061324c565b604051602081830303815290604052905060036000815461172190612d62565b909155506040880151602001516000901561177b576040890151516001600160a01b03166117615760405162461bcd60e51b81526004016104c490612ccf565b604089015180516020909101516117789190611968565b90505b6040805180820182528a820151516001600160a01b039081168252602080830185905283518085018552865187830120815280820184815260008a815260058452869020915182555180516001830180546001600160a01b03191691909516179093559101516002909101558a51915190919086907f2a211ad4a59ab9d003852404f9c57c690704ee755f3c79d2c2812ad32da99df89061181f908890869061325f565b60405180910390a360405163ee5b48eb60e01b81526005600160991b019063ee5b48eb90611851908690600401612c77565b6020604051808303816000875af1158015611870573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189491906125b8565b50939998505050505050505050565b60408051808201909152600080825260208201526118c083611546565b82106119185760405162461bcd60e51b815260206004820152602160248201527f5265636569707451756575653a20696e646578206f7574206f6620626f756e646044820152607360f81b60648201526084016104c4565b82600201600083856000015461192e9190612d39565b81526020808201929092526040908101600020815180830190925280548252600101546001600160a01b0316918101919091529392505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156119b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d591906125b8565b90506119ec6001600160a01b03851633308661203f565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa158015611a33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5791906125b8565b9050818111611abd5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c4565b611ac78282613239565b95945050505050565b60008151600003611ae35750600161060f565b815160005b81811015611b3d57846001600160a01b0316848281518110611b0c57611b0c612d4c565b60200260200101516001600160a01b031603611b2d5760019250505061060f565b611b3681612d62565b9050611ae8565b506000949350505050565b80600003611ba85760405162461bcd60e51b815260206004820152602760248201527f54656c65706f727465724d657373656e6765723a207a65726f206d657373616760448201526665206e6f6e636560c81b60648201526084016104c4565b60009182526007602052604090912055565b6000611bcb84848460000151610b19565b6000818152600560209081526040918290208251808401845281548152835180850190945260018201546001600160a01b031684526002909101548383015290810191909152805191925090611c22575050505050565b60008281526005602090815260408083208381556001810180546001600160a01b03191690556002018390558382018051830151878401516001600160a01b0390811686526009855283862092515116855292528220805491929091611c89908490612d39565b9250508190555082602001516001600160a01b031684837fd13a7935f29af029349bed0a2097455b91fd06190a30478c575db3f31e00bf578460200151604051611cd39190613272565b60405180910390a45050505050565b6001820180548291600285019160009182611cfc83612d62565b90915550815260208082019290925260400160002082518155910151600190910180546001600160a01b0319166001600160a01b039092169190911790555050565b80608001515a1015611da05760405162461bcd60e51b815260206004820152602560248201527f54656c65706f727465724d657373656e6765723a20696e73756666696369656e604482015264742067617360d81b60648201526084016104c4565b80606001516001600160a01b03163b600003611dc15761154183838361207d565b602081015160e0820151604051600092611ddf928692602401613292565b60408051601f198184030181529190526020810180516001600160e01b031663643477d560e11b17905260608301516080840151919250600091611e24919084611e71565b905080611e3d57611e3685858561207d565b5050505050565b604051849086907f34795cc6b122b9a0ae684946319f1e14a577b4e8f9b3dda9ac94c21a54d3188c90600090a35050505050565b60008060008084516020860160008989f195945050505050565b6000611ee0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120f29092919063ffffffff16565b8051909150156115415780806020019051810190611efe91906132bc565b6115415760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104c4565b6000818310611f6c57816108d3565b5090919050565b604080518082019091526000808252602082015281546001830154819003611fdd5760405162461bcd60e51b815260206004820152601960248201527f5265636569707451756575653a20656d7074792071756575650000000000000060448201526064016104c4565b60008181526002840160208181526040808420815180830190925280548252600180820180546001600160a01b03811685870152888852959094529490556001600160a01b0319909216905590612035908390612d39565b9093555090919050565b6040516001600160a01b03808516602483015283166044820152606481018290526120779085906323b872dd60e01b9060840161150a565b50505050565b8060405160200161208e919061324c565b60408051601f1981840301815282825280516020918201206000878152600690925291902055829084907f4619adc1017b82e02eaefac01a43d50d6d8de4460774bc370c3ff0210d40c985906120e590859061324c565b60405180910390a3505050565b60606121018484600085612109565b949350505050565b60608247101561216a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104c4565b600080866001600160a01b0316858760405161218691906132d7565b60006040518083038185875af1925050503d80600081146121c3576040519150601f19603f3d011682016040523d82523d6000602084013e6121c8565b606091505b50915091506121d9878383876121e4565b979650505050505050565b6060831561225357825160000361224c576001600160a01b0385163b61224c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104c4565b5081612101565b61210183838151156122685781518083602001fd5b8060405162461bcd60e51b81526004016104c49190612c77565b6001600160a01b038116811461229757600080fd5b50565b80356104fe81612282565b6000602082840312156122b757600080fd5b81356108d381612282565b6000602082840312156122d457600080fd5b5035919050565b828152606081016108d3602083018480516001600160a01b03168252602090810151910152565b60006020828403121561231457600080fd5b81356001600160401b0381111561232a57600080fd5b820160e081850312156108d357600080fd5b6000610100828403121561234f57600080fd5b50919050565b60006020828403121561236757600080fd5b81356001600160401b0381111561237d57600080fd5b6121018482850161233c565b6000806040838503121561239c57600080fd5b50508035926020909101359150565b815181526020808301516001600160a01b0316908201526040810161060f565b6000806000606084860312156123e057600080fd5b8335925060208401356123f281612282565b929592945050506040919091013590565b60008060006060848603121561241857600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261244157600080fd5b5081356001600160401b0381111561245857600080fd5b6020830191508360208260051b850101111561247357600080fd5b9250929050565b60008060008060008086880360a081121561249457600080fd5b8735965060208801356001600160401b03808211156124b257600080fd5b6124be8b838c0161242f565b90985096508691506040603f19840112156124d857600080fd5b60408a01955060808a01359250808311156124f257600080fd5b505061250089828a0161242f565b979a9699509497509295939492505050565b6000806040838503121561252557600080fd5b823561253081612282565b9150602083013561254081612282565b809150509250929050565b6000806040838503121561255e57600080fd5b823563ffffffff8116811461253057600080fd5b6000806040838503121561258557600080fd5b8235915060208301356001600160401b038111156125a257600080fd5b6125ae8582860161233c565b9150509250929050565b6000602082840312156125ca57600080fd5b5051919050565b60208082526027908201527f54656c65706f727465724d657373656e6765723a207a65726f20626c6f636b636040820152661a185a5b88125160ca1b606082015260800190565b60208082526023908201527f5265656e7472616e63794775617264733a2073656e646572207265656e7472616040820152626e637960e81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156126935761269361265b565b60405290565b60405160c081016001600160401b03811182821017156126935761269361265b565b60405161010081016001600160401b03811182821017156126935761269361265b565b604051601f8201601f191681016001600160401b03811182821017156127065761270661265b565b604052919050565b60006040828403121561272057600080fd5b612728612671565b9050813561273581612282565b808252506020820135602082015292915050565b60006001600160401b038211156127625761276261265b565b5060051b60200190565b600082601f83011261277d57600080fd5b8135602061279261278d83612749565b6126de565b82815260059290921b840181019181810190868411156127b157600080fd5b8286015b848110156127d55780356127c881612282565b83529183019183016127b5565b509695505050505050565b60006001600160401b038211156127f9576127f961265b565b50601f01601f191660200190565b600082601f83011261281857600080fd5b813561282661278d826127e0565b81815284602083860101111561283b57600080fd5b816020850160208301376000918101602001919091529392505050565b600060e0823603121561286a57600080fd5b612872612699565b823581526128826020840161229a565b6020820152612894366040850161270e565b60408201526080830135606082015260a08301356001600160401b03808211156128bd57600080fd5b6128c93683870161276c565b608084015260c08501359150808211156128e257600080fd5b506128ef36828601612807565b60a08301525092915050565b60208082526026908201527f54656c65706f727465724d657373656e6765723a206d657373616765206e6f7460408201526508199bdd5b9960d21b606082015260800190565b6000808335601e1984360301811261295857600080fd5b83016020810192503590506001600160401b0381111561297757600080fd5b8060051b360382131561247357600080fd5b8183526000602080850194508260005b858110156129c75781356129ac81612282565b6001600160a01b031687529582019590820190600101612999565b509495945050505050565b6000808335601e198436030181126129e957600080fd5b83016020810192503590506001600160401b03811115612a0857600080fd5b8060061b360382131561247357600080fd5b8183526000602080850194508260005b858110156129c7578135875282820135612a4381612282565b6001600160a01b0316878401526040968701969190910190600101612a2a565b6000808335601e19843603018112612a7a57600080fd5b83016020810192503590506001600160401b03811115612a9957600080fd5b80360382131561247357600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000610100823584526020830135612ae881612282565b6001600160a01b0316602085015260408381013590850152612b0c6060840161229a565b6001600160a01b0316606085015260808381013590850152612b3160a0840184612941565b8260a0870152612b448387018284612989565b92505050612b5560c08401846129d2565b85830360c0870152612b68838284612a1a565b92505050612b7960e0840184612a63565b85830360e0870152612b8c838284612aa8565b9695505050505050565b6020815260006108d36020830184612ad1565b60208082526029908201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206d65736040820152680e6c2ceca40d0c2e6d60bb1b606082015260800190565b606081526000612c056060830185612ad1565b90506108d3602083018480516001600160a01b03168252602090810151910152565b60005b83811015612c42578181015183820152602001612c2a565b50506000910152565b60008151808452612c63816020860160208601612c27565b601f01601f19169290920160200192915050565b6020815260006108d36020830184612c4b565b60208082526025908201527f5265656e7472616e63794775617264733a207265636569766572207265656e7460408201526472616e637960d81b606082015260800190565b60208082526034908201527f54656c65706f727465724d657373656e6765723a207a65726f2066656520617360408201527373657420636f6e7472616374206164647265737360601b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561060f5761060f612d23565b634e487b7160e01b600052603260045260246000fd5b600060018201612d7457612d74612d23565b5060010190565b600060408284031215612d8d57600080fd5b6108d3838361270e565b80516104fe81612282565b600082601f830112612db357600080fd5b8151612dc161278d826127e0565b818152846020838601011115612dd657600080fd5b612101826020830160208701612c27565b805180151581146104fe57600080fd5b60008060408385031215612e0a57600080fd5b82516001600160401b0380821115612e2157600080fd5b9084019060608287031215612e3557600080fd5b604051606081018181108382111715612e5057612e5061265b565b604052825181526020830151612e6581612282565b6020820152604083015182811115612e7c57600080fd5b612e8888828601612da2565b6040830152509350612e9f91505060208401612de7565b90509250929050565b600082601f830112612eb957600080fd5b81516020612ec961278d83612749565b82815260059290921b84018101918181019086841115612ee857600080fd5b8286015b848110156127d5578051612eff81612282565b8352918301918301612eec565b600082601f830112612f1d57600080fd5b81516020612f2d61278d83612749565b82815260069290921b84018101918181019086841115612f4c57600080fd5b8286015b848110156127d55760408189031215612f695760008081fd5b612f71612671565b8151815284820151612f8281612282565b81860152835291830191604001612f50565b600060208284031215612fa657600080fd5b81516001600160401b0380821115612fbd57600080fd5b908301906101008286031215612fd257600080fd5b612fda6126bb565b82518152612fea60208401612d97565b60208201526040830151604082015261300560608401612d97565b60608201526080830151608082015260a08301518281111561302657600080fd5b61303287828601612ea8565b60a08301525060c08301518281111561304a57600080fd5b61305687828601612f0c565b60c08301525060e08301518281111561306e57600080fd5b61307a87828601612da2565b60e08301525095945050505050565b600081518084526020808501945080840160005b838110156129c75781516001600160a01b03168752958201959082019060010161309d565b600081518084526020808501945080840160005b838110156129c7576130fc878351805182526020908101516001600160a01b0316910152565b60409690960195908201906001016130d6565b60006101008251845260018060a01b03602084015116602085015260408301516040850152606083015161314e60608601826001600160a01b03169052565b506080830151608085015260a08301518160a086015261317082860182613089565b91505060c083015184820360c086015261318a82826130c2565b91505060e083015184820360e0860152611ac78282612c4b565b6001600160a01b03831681526040602082018190526000906121019083018461310f565b6000808335601e198436030181126131df57600080fd5b8301803591506001600160401b038211156131f957600080fd5b60200191503681900382131561247357600080fd5b8481526001600160a01b0384166020820152606060408201819052600090612b8c9083018486612aa8565b8181038181111561060f5761060f612d23565b6020815260006108d3602083018461310f565b606081526000612c05606083018561310f565b81516001600160a01b03168152602080830151908201526040810161060f565b8381526001600160a01b0383166020820152606060408201819052600090611ac790830184612c4b565b6000602082840312156132ce57600080fd5b6108d382612de7565b600082516132e9818460208701612c27565b919091019291505056fea2646970667358221220458edf9dc316caebf920004c78844aef89519625cd80787836785b81bfc220a764736f6c634300081200331ba03333333333333333333333333333333333333333333333333333333333333333a03333333333333333333333333333333333333333333333333333333333333333 diff --git a/tests/utils/UniversalTeleporterMessengerContractAddress.txt b/tests/utils/UniversalTeleporterMessengerContractAddress.txt index ce048f55..8e845046 100755 --- a/tests/utils/UniversalTeleporterMessengerContractAddress.txt +++ b/tests/utils/UniversalTeleporterMessengerContractAddress.txt @@ -1 +1 @@ -0x7E5EbAe80f55ABed9Ba320A1Cbc6E4757B55A45F \ No newline at end of file +0xDc65BB82E60F5096BDD267b20d236DbA804C8b2E diff --git a/tests/utils/utils.go b/tests/utils/utils.go index 598ba545..cec50cf7 100644 --- a/tests/utils/utils.go +++ b/tests/utils/utils.go @@ -8,6 +8,7 @@ import ( "context" "os" "os/exec" + "strings" "github.com/ethereum/go-ethereum/log" . "github.com/onsi/gomega" @@ -53,5 +54,5 @@ func RunRelayerExecutable(ctx context.Context, relayerConfigPath string) (*exec. func ReadHexTextFile(filename string) string { fileData, err := os.ReadFile(filename) Expect(err).Should(BeNil()) - return string(fileData) + return strings.TrimRight(string(fileData), "\n") } diff --git a/vms/evm/mocks/mock_eth_client.go b/vms/evm/mocks/mock_eth_client.go index cb30411f..794d8329 100644 --- a/vms/evm/mocks/mock_eth_client.go +++ b/vms/evm/mocks/mock_eth_client.go @@ -5,6 +5,7 @@ // // mockgen -source=destination_client.go -destination=./mocks/mock_eth_client.go -package=mocks // + // Package mocks is a generated GoMock package. package mocks diff --git a/vms/mocks/mock_destination_client.go b/vms/mocks/mock_destination_client.go index d7f7388f..a78aeec1 100644 --- a/vms/mocks/mock_destination_client.go +++ b/vms/mocks/mock_destination_client.go @@ -5,6 +5,7 @@ // // mockgen -source=destination_client.go -destination=./mocks/mock_destination_client.go -package=mocks // + // Package mocks is a generated GoMock package. package mocks @@ -57,7 +58,7 @@ func (mr *MockDestinationClientMockRecorder) Client() *gomock.Call { // DestinationBlockchainID mocks base method. func (m *MockDestinationClient) DestinationBlockchainID() ids.ID { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "destinationBlockchainID") + ret := m.ctrl.Call(m, "DestinationBlockchainID") ret0, _ := ret[0].(ids.ID) return ret0 } @@ -65,7 +66,7 @@ func (m *MockDestinationClient) DestinationBlockchainID() ids.ID { // DestinationBlockchainID indicates an expected call of DestinationBlockchainID. func (mr *MockDestinationClientMockRecorder) DestinationBlockchainID() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "destinationBlockchainID", reflect.TypeOf((*MockDestinationClient)(nil).DestinationBlockchainID)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DestinationBlockchainID", reflect.TypeOf((*MockDestinationClient)(nil).DestinationBlockchainID)) } // SendTx mocks base method. From e2d6eb49a6b92819bee3010abe734ed409e2c4d6 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 11 Jan 2024 12:03:51 -0800 Subject: [PATCH 2/3] panic instead of logging and swallowing error --- messages/teleporter/message_manager.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/messages/teleporter/message_manager.go b/messages/teleporter/message_manager.go index e25f27bb..217a23e7 100644 --- a/messages/teleporter/message_manager.go +++ b/messages/teleporter/message_manager.go @@ -5,7 +5,6 @@ package teleporter import ( "encoding/json" - "errors" "fmt" "math/big" @@ -298,21 +297,13 @@ func (m *messageManager) parseTeleporterMessage(warpMessageID ids.ID, warpPayloa func (m *messageManager) getTeleporterMessenger(destinationClient vms.DestinationClient) (*teleportermessenger.TeleporterMessenger, error) { client, ok := destinationClient.Client().(ethclient.Client) if !ok { - m.logger.Error( - "Destination client is not an Ethereum client.", - zap.String("destinationBlockchainID", destinationClient.DestinationBlockchainID().String()), - ) - return nil, errors.New("destination client is not an Ethereum client") + panic(fmt.Sprintf("Destination client for chain %s is not an Ethereum client", destinationClient.DestinationBlockchainID().String())) } // Get the teleporter messenger contract teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger(common.BytesToAddress(m.protocolAddress[:]), client) if err != nil { - m.logger.Error( - "Failed to get teleporter messenger contract", - zap.Error(err), - ) - return nil, err + panic("Failed to get teleporter messenger contract") } return teleporterMessenger, nil } From 0e832f9fb9f796e96cd9286aa92d2b16ac9c6c4b Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 11 Jan 2024 12:55:31 -0800 Subject: [PATCH 3/3] add comment and remove error return --- messages/teleporter/message_manager.go | 37 +++++++------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/messages/teleporter/message_manager.go b/messages/teleporter/message_manager.go index 217a23e7..f5187501 100644 --- a/messages/teleporter/message_manager.go +++ b/messages/teleporter/message_manager.go @@ -124,18 +124,8 @@ func (m *messageManager) ShouldSendMessage(warpMessageInfo *vmtypes.WarpMessageI return false, fmt.Errorf("relayer not configured to deliver to destination. destinationBlockchainID=%s", destinationBlockchainID.String()) } - teleporter, err := m.getTeleporterMessenger(destinationClient) - if err != nil { - m.logger.Error( - "Failed to get teleporter messenger contract.", - zap.String("destinationBlockchainID", destinationBlockchainID.String()), - zap.String("warpMessageID", warpMessageInfo.WarpUnsignedMessage.ID().String()), - zap.String("messageNonce", teleporterMessage.MessageNonce.String()), - zap.Error(err), - ) - return false, err - } - teleporterMessageID, err := m.calculateMessageID(teleporter, warpMessageInfo.WarpUnsignedMessage.SourceChainID, destinationBlockchainID, teleporterMessage.MessageNonce) + teleporterMessenger := m.getTeleporterMessenger(destinationClient) + teleporterMessageID, err := m.calculateMessageID(teleporterMessenger, warpMessageInfo.WarpUnsignedMessage.SourceChainID, destinationBlockchainID, teleporterMessage.MessageNonce) if err != nil { return false, err } @@ -152,7 +142,7 @@ func (m *messageManager) ShouldSendMessage(warpMessageInfo *vmtypes.WarpMessageI } // Check if the message has already been delivered to the destination chain - delivered, err := teleporter.MessageReceived(&bind.CallOpts{}, teleporterMessageID) + delivered, err := teleporterMessenger.MessageReceived(&bind.CallOpts{}, teleporterMessageID) if err != nil { m.logger.Error( "Failed to check if message has been delivered to destination chain.", @@ -196,18 +186,8 @@ func (m *messageManager) SendMessage(signedMessage *warp.Message, parsedVmPayloa return fmt.Errorf("relayer not configured to deliver to destination. DestinationBlockchainID=%s", destinationBlockchainID) } - teleporter, err := m.getTeleporterMessenger(destinationClient) - if err != nil { - m.logger.Error( - "Failed to get teleporter messenger contract.", - zap.String("destinationBlockchainID", destinationBlockchainID.String()), - zap.String("warpMessageID", signedMessage.ID().String()), - zap.String("messageNonce", teleporterMessage.MessageNonce.String()), - zap.Error(err), - ) - return err - } - teleporterMessageID, err := m.calculateMessageID(teleporter, signedMessage.SourceChainID, destinationBlockchainID, teleporterMessage.MessageNonce) + teleporterMessenger := m.getTeleporterMessenger(destinationClient) + teleporterMessageID, err := m.calculateMessageID(teleporterMessenger, signedMessage.SourceChainID, destinationBlockchainID, teleporterMessage.MessageNonce) if err != nil { return err } @@ -294,7 +274,10 @@ func (m *messageManager) parseTeleporterMessage(warpMessageID ids.ID, warpPayloa return teleporterMessage, nil } -func (m *messageManager) getTeleporterMessenger(destinationClient vms.DestinationClient) (*teleportermessenger.TeleporterMessenger, error) { +// getTeleporterMessenger returns the Teleporter messenger instance for the destination chain. +// Panic instead of returning errors because this should never happen, and if it does, we do not +// want to log and swallow the error, since operations after this will fail too. +func (m *messageManager) getTeleporterMessenger(destinationClient vms.DestinationClient) *teleportermessenger.TeleporterMessenger { client, ok := destinationClient.Client().(ethclient.Client) if !ok { panic(fmt.Sprintf("Destination client for chain %s is not an Ethereum client", destinationClient.DestinationBlockchainID().String())) @@ -305,7 +288,7 @@ func (m *messageManager) getTeleporterMessenger(destinationClient vms.Destinatio if err != nil { panic("Failed to get teleporter messenger contract") } - return teleporterMessenger, nil + return teleporterMessenger } func (m *messageManager) calculateMessageID(teleporter *teleportermessenger.TeleporterMessenger, sourceBlockchainID ids.ID, destinationBlockchainID ids.ID, messageNonce *big.Int) (ids.ID, error) {