diff --git a/Makefile b/Makefile index e04f41364..97fe08c0e 100644 --- a/Makefile +++ b/Makefile @@ -244,7 +244,7 @@ test-unit: UNIT_TEST_PACKAGES = $(shell go list ./... | \ grep -v /lib | \ grep -v /transactions/fake ) test-unit: ##@tests Run unit and integration tests - go test -v -failfast $(UNIT_TEST_PACKAGES) $(gotest_extraflags) + go test -v -failfast $(UNIT_TEST_PACKAGES) $(gotest_extraflags) && cd ./protocol && $(MAKE) test test-unit-race: gotest_extraflags=-race test-unit-race: test-unit ##@tests Run unit and integration tests with -race flag diff --git a/VERSION b/VERSION index adbb8d452..e5d9eb181 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.39.5 +0.39.6 diff --git a/eth-node/core/types/transaction.go b/eth-node/core/types/transaction.go index 6bd2fee2c..d6c3c5d83 100644 --- a/eth-node/core/types/transaction.go +++ b/eth-node/core/types/transaction.go @@ -6,6 +6,14 @@ import ( "github.com/status-im/status-go/eth-node/types" ) +type TransactionStatus uint64 + +const ( + TransactionStatusFailed = 0 + TransactionStatusSuccess = 1 + TransactionStatusPending = 2 +) + type Message struct { to *types.Address from types.Address diff --git a/eth-node/go.mod b/eth-node/go.mod index 2edd418de..3d0660db4 100644 --- a/eth-node/go.mod +++ b/eth-node/go.mod @@ -13,7 +13,9 @@ replace github.com/status-im/status-go/waku => ../waku require ( github.com/ethereum/go-ethereum v1.9.5 github.com/mattn/go-pointer v0.0.0-20190911064623-a0a44394634f + github.com/pborman/uuid v1.2.0 github.com/status-im/doubleratchet v3.0.0+incompatible + github.com/status-im/status-go/extkeys v1.0.0 github.com/status-im/status-go/waku v1.0.0 github.com/status-im/status-go/whisper/v6 v6.0.1 // indirect github.com/stretchr/testify v1.4.0 diff --git a/eth-node/go.sum b/eth-node/go.sum index 4d664f67c..c8360de90 100644 --- a/eth-node/go.sum +++ b/eth-node/go.sum @@ -323,6 +323,7 @@ golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf h1:fnPsqIDRbCSgumaMCRpoIo golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba h1:9bFeDpN3gTqNanMVqNcoR/pJQuP5uroC3t1D7eXozTE= golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c h1:/nJuwDLoL/zrqY6gf57vxC+Pi+pZ8bfhpPkicO5H7W4= golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= diff --git a/params/config.go b/params/config.go index cc3285b91..bcd158853 100644 --- a/params/config.go +++ b/params/config.go @@ -518,7 +518,12 @@ type ShhextConfig struct { // VerifyTransactionURL is the URL for verifying transactions. // IMPORTANT: It should always be mainnet unless used for testing - VerifyTransactionURL string + VerifyTransactionURL string + + // VerifyENSURL is the URL for verifying ens names. + // IMPORTANT: It should always be mainnet unless used for testing + VerifyENSURL string + VerifyTransactionChainID int64 } diff --git a/protocol/contact.go b/protocol/contact.go index 6f42f6be6..fdbe8158e 100644 --- a/protocol/contact.go +++ b/protocol/contact.go @@ -54,7 +54,7 @@ type Contact struct { SystemTags []string `json:"systemTags"` DeviceInfo []ContactDeviceInfo `json:"deviceInfo"` - TributeToTalk string `json:"tributeToTalk"` + TributeToTalk string `json:"tributeToTalk,omitEmpty"` } func (c Contact) PublicKey() (*ecdsa.PublicKey, error) { diff --git a/protocol/message_handler.go b/protocol/message_handler.go index 8324ea0ff..5e0e28693 100644 --- a/protocol/message_handler.go +++ b/protocol/message_handler.go @@ -419,7 +419,7 @@ func (m *MessageHandler) HandleAcceptRequestAddressForTransaction(messageState * initialMessage.CommandParameters.CommandState = CommandStateRequestAddressForTransactionAccepted // Hide previous message - previousMessage, err := m.persistence.MessageByCommandID(command.Id) + previousMessage, err := m.persistence.MessageByCommandID(messageState.CurrentMessageState.Contact.ID, command.Id) if err != nil && err != errRecordNotFound { return err } diff --git a/protocol/messenger.go b/protocol/messenger.go index 30db150dd..1a5d5871d 100644 --- a/protocol/messenger.go +++ b/protocol/messenger.go @@ -678,6 +678,11 @@ func (m *Messenger) CreateGroupChatWithMembers(ctx context.Context, name string, response.Chats = []*Chat{&chat} response.Messages = buildSystemMessages(chat.MembershipUpdates, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } + return &response, m.saveChat(&chat) } @@ -737,6 +742,11 @@ func (m *Messenger) RemoveMemberFromGroupChat(ctx context.Context, chatID string chat.updateChatFromProtocolGroup(group) response.Chats = []*Chat{chat} response.Messages = buildSystemMessages(chat.MembershipUpdates, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } + return &response, m.saveChat(chat) } @@ -796,6 +806,10 @@ func (m *Messenger) AddMembersToGroupChat(ctx context.Context, chatID string, me response.Chats = []*Chat{chat} response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } return &response, m.saveChat(chat) } @@ -857,6 +871,10 @@ func (m *Messenger) AddAdminsToGroupChat(ctx context.Context, chatID string, mem response.Chats = []*Chat{chat} response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } return &response, m.saveChat(chat) } @@ -920,6 +938,10 @@ func (m *Messenger) ConfirmJoiningGroup(ctx context.Context, chatID string) (*Me response.Chats = []*Chat{chat} response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } return &response, m.saveChat(chat) } @@ -985,6 +1007,11 @@ func (m *Messenger) LeaveGroupChat(ctx context.Context, chatID string) (*Messeng response.Chats = []*Chat{chat} response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } + return &response, m.saveChat(chat) } @@ -2042,6 +2069,7 @@ func (m *Messenger) VerifyENSNames(rpcEndpoint, contractAddress string, ensDetai contact.ENSVerifiedAt = details.VerifiedAt contact.Name = details.Name + m.allContacts[contact.ID] = contact contacts = append(contacts, contact) } else { m.logger.Warn("Failed to resolve ens name", @@ -2254,7 +2282,7 @@ func (m *Messenger) AcceptRequestAddressForTransaction(ctx context.Context, mess message.OutgoingStatus = OutgoingStatusSending // Hide previous message - previousMessage, err := m.persistence.MessageByCommandID(messageID) + previousMessage, err := m.persistence.MessageByCommandID(chatID, messageID) if err != nil { return nil, err } @@ -2513,7 +2541,7 @@ func (m *Messenger) AcceptRequestTransaction(ctx context.Context, transactionHas message.OutgoingStatus = OutgoingStatusSending // Hide previous message - previousMessage, err := m.persistence.MessageByCommandID(messageID) + previousMessage, err := m.persistence.MessageByCommandID(chatID, messageID) if err != nil && err != errRecordNotFound { return nil, err } @@ -2734,18 +2762,20 @@ func (m *Messenger) ValidateTransactions(ctx context.Context, addresses []types. return nil, err } - // Hide previous message - previousMessage, err := m.persistence.MessageByCommandID(message.CommandParameters.ID) - if err != nil && err != errRecordNotFound { - return nil, err - } - - if previousMessage != nil { - err = m.persistence.HideMessage(previousMessage.ID) - if err != nil { + if len(message.CommandParameters.ID) != 0 { + // Hide previous message + previousMessage, err := m.persistence.MessageByCommandID(chatID, message.CommandParameters.ID) + if err != nil && err != errRecordNotFound { return nil, err } - message.Replace = previousMessage.ID + + if previousMessage != nil { + err = m.persistence.HideMessage(previousMessage.ID) + if err != nil { + return nil, err + } + message.Replace = previousMessage.ID + } } response.Messages = append(response.Messages, message) diff --git a/protocol/messenger_test.go b/protocol/messenger_test.go index 7f7fc01d5..357605617 100644 --- a/protocol/messenger_test.go +++ b/protocol/messenger_test.go @@ -72,6 +72,10 @@ func (n *testNode) RemovePeer(_ string) error { panic("not implemented") } +func (n *testNode) GetWaku(_ interface{}) (types.Waku, error) { + panic("not implemented") +} + func (n *testNode) GetWhisper(_ interface{}) (types.Whisper, error) { return n.shh, nil } @@ -1631,6 +1635,7 @@ func (s *MessengerSuite) TestSendEthTransaction() { s.Require().True(ok) client.messages = make(map[string]MockTransaction) client.messages[transactionHash] = MockTransaction{ + Status: coretypes.TransactionStatusSuccess, Message: coretypes.NewMessage( senderAddress, &receiverAddress, @@ -1731,6 +1736,7 @@ func (s *MessengerSuite) TestSendTokenTransaction() { s.Require().True(ok) client.messages = make(map[string]MockTransaction) client.messages[transactionHash] = MockTransaction{ + Status: coretypes.TransactionStatusSuccess, Message: coretypes.NewMessage( senderAddress, &contractAddress, @@ -2064,6 +2070,7 @@ func (s *MessengerSuite) TestRequestTransaction() { s.Require().True(ok) client.messages = make(map[string]MockTransaction) client.messages[transactionHash] = MockTransaction{ + Status: coretypes.TransactionStatusSuccess, Message: coretypes.NewMessage( senderAddress, &contractAddress, @@ -2100,7 +2107,7 @@ func (s *MessengerSuite) TestRequestTransaction() { } type MockTransaction struct { - Pending bool + Status coretypes.TransactionStatus Message coretypes.Message } @@ -2113,12 +2120,12 @@ type mockSendMessagesRequest struct { req types.MessagesRequest } -func (m MockEthClient) TransactionByHash(ctx context.Context, hash types.Hash) (coretypes.Message, bool, error) { +func (m MockEthClient) TransactionByHash(ctx context.Context, hash types.Hash) (coretypes.Message, coretypes.TransactionStatus, error) { mockTransaction, ok := m.messages[hash.Hex()] if !ok { - return coretypes.Message{}, false, nil + return coretypes.Message{}, coretypes.TransactionStatusFailed, nil } else { - return mockTransaction.Message, mockTransaction.Pending, nil + return mockTransaction.Message, mockTransaction.Status, nil } } diff --git a/protocol/persistence_legacy.go b/protocol/persistence_legacy.go index ed4364c4a..95cb7a31c 100644 --- a/protocol/persistence_legacy.go +++ b/protocol/persistence_legacy.go @@ -237,7 +237,7 @@ func (db sqlitePersistence) messageByID(tx *sql.Tx, id string) (*Message, error) } } -func (db sqlitePersistence) MessageByCommandID(id string) (*Message, error) { +func (db sqlitePersistence) MessageByCommandID(chatID, id string) (*Message, error) { var message Message @@ -259,10 +259,13 @@ func (db sqlitePersistence) MessageByCommandID(id string) (*Message, error) { m1.source = c.id WHERE m1.command_id = ? + AND + m1.local_chat_id = ? ORDER BY m1.clock_value DESC LIMIT 1 `, allFields), id, + chatID, ) err := db.tableUserMessagesLegacyScanAllFields(row, &message) switch err { diff --git a/protocol/transaction_validator.go b/protocol/transaction_validator.go index b4160f895..e19d72caa 100644 --- a/protocol/transaction_validator.go +++ b/protocol/transaction_validator.go @@ -62,7 +62,7 @@ func NewTransactionValidator(addresses []types.Address, persistence *sqlitePersi } type EthClient interface { - TransactionByHash(context.Context, types.Hash) (coretypes.Message, bool, error) + TransactionByHash(context.Context, types.Hash) (coretypes.Message, coretypes.TransactionStatus, error) } func (t *TransactionValidator) verifyTransactionSignature(ctx context.Context, from *ecdsa.PublicKey, address types.Address, transactionHash string, signature []byte) error { @@ -243,7 +243,8 @@ func (t *TransactionValidator) ValidateTransactions(ctx context.Context) ([]*Ver var validationResult *VerifyTransactionResponse t.logger.Debug("Validating transaction", zap.Any("transaction", transaction)) if transaction.CommandID != "" { - message, err := t.persistence.MessageByCommandID(transaction.CommandID) + chatID := contactIDFromPublicKey(transaction.From) + message, err := t.persistence.MessageByCommandID(chatID, transaction.CommandID) if err != nil { t.logger.Error("error pulling message", zap.Error(err)) @@ -313,13 +314,17 @@ func (t *TransactionValidator) ValidateTransaction(ctx context.Context, paramete c, cancel := context.WithTimeout(ctx, 10*time.Second) defer cancel() - message, pending, err := t.client.TransactionByHash(c, types.HexToHash(hash)) + message, status, err := t.client.TransactionByHash(c, types.HexToHash(hash)) if err != nil { return nil, err } - if pending { + switch status { + case coretypes.TransactionStatusPending: t.logger.Debug("Transaction pending") return &VerifyTransactionResponse{Pending: true}, nil + case coretypes.TransactionStatusFailed: + + return invalidResponse, nil } return t.validateTransaction(ctx, message, parameters, from) diff --git a/protocol/transport/filters_manager_test.go b/protocol/transport/filters_manager_test.go index 881246cfe..6a901e90a 100644 --- a/protocol/transport/filters_manager_test.go +++ b/protocol/transport/filters_manager_test.go @@ -9,7 +9,6 @@ import ( "testing" gethbridge "github.com/status-im/status-go/eth-node/bridge/geth" - "github.com/status-im/status-go/protocol/sqlite" "github.com/status-im/status-go/protocol/tt" _ "github.com/mutecomm/go-sqlcipher" @@ -20,6 +19,23 @@ import ( "github.com/status-im/status-go/whisper/v6" ) +type testKeysPersistence struct { + keys map[string][]byte +} + +func newTestKeysPersistence() *testKeysPersistence { + return &testKeysPersistence{keys: make(map[string][]byte)} +} + +func (s *testKeysPersistence) Add(chatID string, key []byte) error { + s.keys[chatID] = key + return nil +} + +func (s *testKeysPersistence) All() (map[string][]byte, error) { + return s.keys, nil +} + func TestFiltersManagerSuite(t *testing.T) { suite.Run(t, new(FiltersManagerSuite)) } @@ -72,12 +88,11 @@ func (s *FiltersManagerSuite) SetupTest() { s.manager = append(s.manager, testKey) } - db, err := sqlite.Open(s.dbPath, "filter-key") - s.Require().NoError(err) + keysPersistence := newTestKeysPersistence() whisper := gethbridge.NewGethWhisperWrapper(whisper.New(nil)) - s.chats, err = NewFiltersManager(db, whisper, s.manager[0].privateKey, s.logger) + s.chats, err = NewFiltersManager(keysPersistence, whisper, s.manager[0].privateKey, s.logger) s.Require().NoError(err) } @@ -101,7 +116,7 @@ func (s *FiltersManagerSuite) TestPartitionedTopicWithDiscoveryDisabled() { func (s *FiltersManagerSuite) assertRequiredFilters() { partitionedTopic := fmt.Sprintf("contact-discovery-%d", s.manager[0].partitionedTopic) personalDiscoveryTopic := fmt.Sprintf("contact-discovery-%s", s.manager[0].publicKeyString()) - contactCodeTopic := contactCodeTopic(&s.manager[0].privateKey.PublicKey) + contactCodeTopic := ContactCodeTopic(&s.manager[0].privateKey.PublicKey) personalDiscoveryFilter := s.chats.filters[personalDiscoveryTopic] s.Require().NotNil(personalDiscoveryFilter, "It adds the discovery filter") diff --git a/protocol/transport/transport.go b/protocol/transport/transport.go index ea082f4ed..9ec4c55db 100644 --- a/protocol/transport/transport.go +++ b/protocol/transport/transport.go @@ -33,6 +33,7 @@ type Transport interface { LoadFilters(filters []*Filter) ([]*Filter, error) RemoveFilters(filters []*Filter) error ResetFilters() error + Filters() []*Filter ProcessNegotiatedSecret(secret types.NegotiatedSecret) (*Filter, error) RetrieveRawAll() (map[Filter][]*types.Message, error) } diff --git a/protocol/transport/waku/envelopes_test.go b/protocol/transport/waku/envelopes_test.go index 14807f6e7..c07eaf308 100644 --- a/protocol/transport/waku/envelopes_test.go +++ b/protocol/transport/waku/envelopes_test.go @@ -11,6 +11,7 @@ import ( "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" + "github.com/status-im/status-go/protocol/transport" ) var ( @@ -31,7 +32,7 @@ func TestEnvelopesMonitorSuite(t *testing.T) { func (s *EnvelopesMonitorSuite) SetupTest() { s.monitor = NewEnvelopesMonitor( nil, - EnvelopesMonitorConfig{ + transport.EnvelopesMonitorConfig{ EnvelopeEventsHandler: nil, MaxAttempts: 0, MailserverConfirmationsEnabled: false, diff --git a/protocol/transport/whisper/envelopes_test.go b/protocol/transport/whisper/envelopes_test.go index 4445f6464..aaae6b11e 100644 --- a/protocol/transport/whisper/envelopes_test.go +++ b/protocol/transport/whisper/envelopes_test.go @@ -11,6 +11,7 @@ import ( "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" + "github.com/status-im/status-go/protocol/transport" ) var ( @@ -31,7 +32,7 @@ func TestEnvelopesMonitorSuite(t *testing.T) { func (s *EnvelopesMonitorSuite) SetupTest() { s.monitor = NewEnvelopesMonitor( nil, - EnvelopesMonitorConfig{ + transport.EnvelopesMonitorConfig{ EnvelopeEventsHandler: nil, MaxAttempts: 0, MailserverConfirmationsEnabled: false, diff --git a/services/shhext/api.go b/services/shhext/api.go index 84fb75496..2744f68ee 100644 --- a/services/shhext/api.go +++ b/services/shhext/api.go @@ -15,7 +15,6 @@ import ( "github.com/status-im/status-go/db" "github.com/status-im/status-go/mailserver" - "github.com/status-im/status-go/params" "github.com/status-im/status-go/services/shhext/mailservers" "github.com/status-im/status-go/whisper/v6" @@ -657,7 +656,7 @@ func (api *PublicAPI) SetInstallationMetadata(installationID string, data *multi // VerifyENSNames takes a list of ensdetails and returns whether they match the public key specified func (api *PublicAPI) VerifyENSNames(details []enstypes.ENSDetails) (map[string]enstypes.ENSResponse, error) { - return api.service.messenger.VerifyENSNames(params.MainnetEthereumNetworkURL, ensContractAddress, details) + return api.service.messenger.VerifyENSNames(api.service.config.VerifyENSURL, ensContractAddress, details) } type ApplicationMessagesResponse struct { diff --git a/services/shhext/service.go b/services/shhext/service.go index f3dea0bf7..8a61cf2c0 100644 --- a/services/shhext/service.go +++ b/services/shhext/service.go @@ -25,6 +25,7 @@ import ( "github.com/status-im/status-go/multiaccounts/accounts" "github.com/status-im/status-go/params" "github.com/status-im/status-go/services/shhext/mailservers" + "github.com/status-im/status-go/services/wallet" "github.com/status-im/status-go/signal" "github.com/syndtr/goleveldb/leveldb" @@ -194,26 +195,44 @@ type verifyTransactionClient struct { url string } -func (c *verifyTransactionClient) TransactionByHash(ctx context.Context, hash types.Hash) (coretypes.Message, bool, error) { +func (c *verifyTransactionClient) TransactionByHash(ctx context.Context, hash types.Hash) (coretypes.Message, coretypes.TransactionStatus, error) { signer := gethtypes.NewEIP155Signer(c.chainID) client, err := ethclient.Dial(c.url) if err != nil { - return coretypes.Message{}, false, err + return coretypes.Message{}, coretypes.TransactionStatusPending, err } transaction, pending, err := client.TransactionByHash(ctx, commongethtypes.BytesToHash(hash.Bytes())) if err != nil { - return coretypes.Message{}, false, err + return coretypes.Message{}, coretypes.TransactionStatusPending, err } message, err := transaction.AsMessage(signer) if err != nil { - return coretypes.Message{}, false, err + return coretypes.Message{}, coretypes.TransactionStatusPending, err } from := types.BytesToAddress(message.From().Bytes()) to := types.BytesToAddress(message.To().Bytes()) - return coretypes.NewMessage( + if pending { + return coretypes.NewMessage( + from, + &to, + message.Nonce(), + message.Value(), + message.Gas(), + message.GasPrice(), + message.Data(), + message.CheckNonce(), + ), coretypes.TransactionStatusPending, nil + } + + receipt, err := client.TransactionReceipt(ctx, commongethtypes.BytesToHash(hash.Bytes())) + if err != nil { + return coretypes.Message{}, coretypes.TransactionStatusPending, err + } + + coremessage := coretypes.NewMessage( from, &to, message.Nonce(), @@ -222,7 +241,20 @@ func (c *verifyTransactionClient) TransactionByHash(ctx context.Context, hash ty message.GasPrice(), message.Data(), message.CheckNonce(), - ), pending, nil + ) + + // Token transfer, check the logs + if len(coremessage.Data()) != 0 { + if wallet.IsTokenTransfer(receipt.Logs) { + return coremessage, coretypes.TransactionStatus(receipt.Status), nil + } else { + return coremessage, coretypes.TransactionStatusFailed, nil + } + + } + + return coremessage, coretypes.TransactionStatus(receipt.Status), nil + } func (s *Service) verifyTransactionLoop(tick time.Duration, cancel <-chan struct{}) { diff --git a/services/wallet/downloader.go b/services/wallet/downloader.go index f97c3ba94..5036f05a2 100644 --- a/services/wallet/downloader.go +++ b/services/wallet/downloader.go @@ -111,7 +111,7 @@ func (d *ETHTransferDownloader) getTransfersInBlock(ctx context.Context, blk *ty if err != nil { return nil, err } - if isTokenTransfer(receipt.Logs) { + if IsTokenTransfer(receipt.Logs) { log.Debug("eth downloader found token transfer", "hash", tx.Hash()) continue } @@ -307,7 +307,7 @@ func (d *ERC20TransfersDownloader) GetTransfersInRange(parent context.Context, f return transfers, nil } -func isTokenTransfer(logs []*types.Log) bool { +func IsTokenTransfer(logs []*types.Log) bool { signature := crypto.Keccak256Hash([]byte(erc20TransferEventSignature)) for _, l := range logs { if len(l.Topics) > 0 && l.Topics[0] == signature { diff --git a/vendor/github.com/status-im/status-go/eth-node/core/types/transaction.go b/vendor/github.com/status-im/status-go/eth-node/core/types/transaction.go index 6bd2fee2c..d6c3c5d83 100644 --- a/vendor/github.com/status-im/status-go/eth-node/core/types/transaction.go +++ b/vendor/github.com/status-im/status-go/eth-node/core/types/transaction.go @@ -6,6 +6,14 @@ import ( "github.com/status-im/status-go/eth-node/types" ) +type TransactionStatus uint64 + +const ( + TransactionStatusFailed = 0 + TransactionStatusSuccess = 1 + TransactionStatusPending = 2 +) + type Message struct { to *types.Address from types.Address diff --git a/vendor/github.com/status-im/status-go/protocol/contact.go b/vendor/github.com/status-im/status-go/protocol/contact.go index 6f42f6be6..fdbe8158e 100644 --- a/vendor/github.com/status-im/status-go/protocol/contact.go +++ b/vendor/github.com/status-im/status-go/protocol/contact.go @@ -54,7 +54,7 @@ type Contact struct { SystemTags []string `json:"systemTags"` DeviceInfo []ContactDeviceInfo `json:"deviceInfo"` - TributeToTalk string `json:"tributeToTalk"` + TributeToTalk string `json:"tributeToTalk,omitEmpty"` } func (c Contact) PublicKey() (*ecdsa.PublicKey, error) { diff --git a/vendor/github.com/status-im/status-go/protocol/message_handler.go b/vendor/github.com/status-im/status-go/protocol/message_handler.go index 8324ea0ff..5e0e28693 100644 --- a/vendor/github.com/status-im/status-go/protocol/message_handler.go +++ b/vendor/github.com/status-im/status-go/protocol/message_handler.go @@ -419,7 +419,7 @@ func (m *MessageHandler) HandleAcceptRequestAddressForTransaction(messageState * initialMessage.CommandParameters.CommandState = CommandStateRequestAddressForTransactionAccepted // Hide previous message - previousMessage, err := m.persistence.MessageByCommandID(command.Id) + previousMessage, err := m.persistence.MessageByCommandID(messageState.CurrentMessageState.Contact.ID, command.Id) if err != nil && err != errRecordNotFound { return err } diff --git a/vendor/github.com/status-im/status-go/protocol/messenger.go b/vendor/github.com/status-im/status-go/protocol/messenger.go index 30db150dd..1a5d5871d 100644 --- a/vendor/github.com/status-im/status-go/protocol/messenger.go +++ b/vendor/github.com/status-im/status-go/protocol/messenger.go @@ -678,6 +678,11 @@ func (m *Messenger) CreateGroupChatWithMembers(ctx context.Context, name string, response.Chats = []*Chat{&chat} response.Messages = buildSystemMessages(chat.MembershipUpdates, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } + return &response, m.saveChat(&chat) } @@ -737,6 +742,11 @@ func (m *Messenger) RemoveMemberFromGroupChat(ctx context.Context, chatID string chat.updateChatFromProtocolGroup(group) response.Chats = []*Chat{chat} response.Messages = buildSystemMessages(chat.MembershipUpdates, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } + return &response, m.saveChat(chat) } @@ -796,6 +806,10 @@ func (m *Messenger) AddMembersToGroupChat(ctx context.Context, chatID string, me response.Chats = []*Chat{chat} response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } return &response, m.saveChat(chat) } @@ -857,6 +871,10 @@ func (m *Messenger) AddAdminsToGroupChat(ctx context.Context, chatID string, mem response.Chats = []*Chat{chat} response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } return &response, m.saveChat(chat) } @@ -920,6 +938,10 @@ func (m *Messenger) ConfirmJoiningGroup(ctx context.Context, chatID string) (*Me response.Chats = []*Chat{chat} response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } return &response, m.saveChat(chat) } @@ -985,6 +1007,11 @@ func (m *Messenger) LeaveGroupChat(ctx context.Context, chatID string) (*Messeng response.Chats = []*Chat{chat} response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations) + err = m.persistence.SaveMessagesLegacy(response.Messages) + if err != nil { + return nil, err + } + return &response, m.saveChat(chat) } @@ -2042,6 +2069,7 @@ func (m *Messenger) VerifyENSNames(rpcEndpoint, contractAddress string, ensDetai contact.ENSVerifiedAt = details.VerifiedAt contact.Name = details.Name + m.allContacts[contact.ID] = contact contacts = append(contacts, contact) } else { m.logger.Warn("Failed to resolve ens name", @@ -2254,7 +2282,7 @@ func (m *Messenger) AcceptRequestAddressForTransaction(ctx context.Context, mess message.OutgoingStatus = OutgoingStatusSending // Hide previous message - previousMessage, err := m.persistence.MessageByCommandID(messageID) + previousMessage, err := m.persistence.MessageByCommandID(chatID, messageID) if err != nil { return nil, err } @@ -2513,7 +2541,7 @@ func (m *Messenger) AcceptRequestTransaction(ctx context.Context, transactionHas message.OutgoingStatus = OutgoingStatusSending // Hide previous message - previousMessage, err := m.persistence.MessageByCommandID(messageID) + previousMessage, err := m.persistence.MessageByCommandID(chatID, messageID) if err != nil && err != errRecordNotFound { return nil, err } @@ -2734,18 +2762,20 @@ func (m *Messenger) ValidateTransactions(ctx context.Context, addresses []types. return nil, err } - // Hide previous message - previousMessage, err := m.persistence.MessageByCommandID(message.CommandParameters.ID) - if err != nil && err != errRecordNotFound { - return nil, err - } - - if previousMessage != nil { - err = m.persistence.HideMessage(previousMessage.ID) - if err != nil { + if len(message.CommandParameters.ID) != 0 { + // Hide previous message + previousMessage, err := m.persistence.MessageByCommandID(chatID, message.CommandParameters.ID) + if err != nil && err != errRecordNotFound { return nil, err } - message.Replace = previousMessage.ID + + if previousMessage != nil { + err = m.persistence.HideMessage(previousMessage.ID) + if err != nil { + return nil, err + } + message.Replace = previousMessage.ID + } } response.Messages = append(response.Messages, message) diff --git a/vendor/github.com/status-im/status-go/protocol/persistence_legacy.go b/vendor/github.com/status-im/status-go/protocol/persistence_legacy.go index ed4364c4a..95cb7a31c 100644 --- a/vendor/github.com/status-im/status-go/protocol/persistence_legacy.go +++ b/vendor/github.com/status-im/status-go/protocol/persistence_legacy.go @@ -237,7 +237,7 @@ func (db sqlitePersistence) messageByID(tx *sql.Tx, id string) (*Message, error) } } -func (db sqlitePersistence) MessageByCommandID(id string) (*Message, error) { +func (db sqlitePersistence) MessageByCommandID(chatID, id string) (*Message, error) { var message Message @@ -259,10 +259,13 @@ func (db sqlitePersistence) MessageByCommandID(id string) (*Message, error) { m1.source = c.id WHERE m1.command_id = ? + AND + m1.local_chat_id = ? ORDER BY m1.clock_value DESC LIMIT 1 `, allFields), id, + chatID, ) err := db.tableUserMessagesLegacyScanAllFields(row, &message) switch err { diff --git a/vendor/github.com/status-im/status-go/protocol/transaction_validator.go b/vendor/github.com/status-im/status-go/protocol/transaction_validator.go index b4160f895..e19d72caa 100644 --- a/vendor/github.com/status-im/status-go/protocol/transaction_validator.go +++ b/vendor/github.com/status-im/status-go/protocol/transaction_validator.go @@ -62,7 +62,7 @@ func NewTransactionValidator(addresses []types.Address, persistence *sqlitePersi } type EthClient interface { - TransactionByHash(context.Context, types.Hash) (coretypes.Message, bool, error) + TransactionByHash(context.Context, types.Hash) (coretypes.Message, coretypes.TransactionStatus, error) } func (t *TransactionValidator) verifyTransactionSignature(ctx context.Context, from *ecdsa.PublicKey, address types.Address, transactionHash string, signature []byte) error { @@ -243,7 +243,8 @@ func (t *TransactionValidator) ValidateTransactions(ctx context.Context) ([]*Ver var validationResult *VerifyTransactionResponse t.logger.Debug("Validating transaction", zap.Any("transaction", transaction)) if transaction.CommandID != "" { - message, err := t.persistence.MessageByCommandID(transaction.CommandID) + chatID := contactIDFromPublicKey(transaction.From) + message, err := t.persistence.MessageByCommandID(chatID, transaction.CommandID) if err != nil { t.logger.Error("error pulling message", zap.Error(err)) @@ -313,13 +314,17 @@ func (t *TransactionValidator) ValidateTransaction(ctx context.Context, paramete c, cancel := context.WithTimeout(ctx, 10*time.Second) defer cancel() - message, pending, err := t.client.TransactionByHash(c, types.HexToHash(hash)) + message, status, err := t.client.TransactionByHash(c, types.HexToHash(hash)) if err != nil { return nil, err } - if pending { + switch status { + case coretypes.TransactionStatusPending: t.logger.Debug("Transaction pending") return &VerifyTransactionResponse{Pending: true}, nil + case coretypes.TransactionStatusFailed: + + return invalidResponse, nil } return t.validateTransaction(ctx, message, parameters, from) diff --git a/vendor/github.com/status-im/status-go/protocol/transport/transport.go b/vendor/github.com/status-im/status-go/protocol/transport/transport.go index ea082f4ed..9ec4c55db 100644 --- a/vendor/github.com/status-im/status-go/protocol/transport/transport.go +++ b/vendor/github.com/status-im/status-go/protocol/transport/transport.go @@ -33,6 +33,7 @@ type Transport interface { LoadFilters(filters []*Filter) ([]*Filter, error) RemoveFilters(filters []*Filter) error ResetFilters() error + Filters() []*Filter ProcessNegotiatedSecret(secret types.NegotiatedSecret) (*Filter, error) RetrieveRawAll() (map[Filter][]*types.Message, error) }