120 lines
3.9 KiB
Go
120 lines
3.9 KiB
Go
package protocol
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
|
|
gethcommon "github.com/ethereum/go-ethereum/common"
|
|
"github.com/status-im/status-go/protocol/common"
|
|
"github.com/status-im/status-go/protocol/protobuf"
|
|
"github.com/status-im/status-go/services/wallet"
|
|
)
|
|
|
|
func (m *Messenger) UpsertSavedAddress(ctx context.Context, sa wallet.SavedAddress) error {
|
|
updatedClock, err := m.savedAddressesManager.UpdateMetadataAndUpsertSavedAddress(sa)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return m.syncNewSavedAddress(ctx, &sa, updatedClock, m.dispatchMessage)
|
|
}
|
|
|
|
func (m *Messenger) DeleteSavedAddress(ctx context.Context, chainID uint64, address gethcommon.Address) error {
|
|
updatedClock, err := m.savedAddressesManager.DeleteSavedAddress(chainID, address)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return m.syncDeletedSavedAddress(ctx, chainID, address, updatedClock, m.dispatchMessage)
|
|
}
|
|
|
|
func (m *Messenger) garbageCollectRemovedSavedAddresses() error {
|
|
return m.savedAddressesManager.DeleteSoftRemovedSavedAddresses(uint64(time.Now().AddDate(0, 0, -30).Unix()))
|
|
}
|
|
|
|
func (m *Messenger) dispatchSyncSavedAddress(ctx context.Context, syncMessage protobuf.SyncSavedAddress, rawMessageHandler RawMessageHandler) error {
|
|
if !m.hasPairedDevices() {
|
|
return nil
|
|
}
|
|
|
|
clock, chat := m.getLastClockWithRelatedChat()
|
|
|
|
encodedMessage, err := proto.Marshal(&syncMessage)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
rawMessage := common.RawMessage{
|
|
LocalChatID: chat.ID,
|
|
Payload: encodedMessage,
|
|
MessageType: protobuf.ApplicationMetadataMessage_SYNC_SAVED_ADDRESS,
|
|
ResendAutomatically: true,
|
|
}
|
|
|
|
_, err = rawMessageHandler(ctx, rawMessage)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
chat.LastClockValue = clock
|
|
return m.saveChat(chat)
|
|
}
|
|
|
|
func (m *Messenger) syncNewSavedAddress(ctx context.Context, savedAddress *wallet.SavedAddress, updateClock uint64, rawMessageHandler RawMessageHandler) error {
|
|
return m.dispatchSyncSavedAddress(ctx, protobuf.SyncSavedAddress{
|
|
Address: savedAddress.Address.Bytes(),
|
|
Name: savedAddress.Name,
|
|
Favourite: savedAddress.Favourite,
|
|
ChainId: savedAddress.ChainID,
|
|
UpdateClock: updateClock,
|
|
}, rawMessageHandler)
|
|
}
|
|
|
|
func (m *Messenger) syncDeletedSavedAddress(ctx context.Context, chainID uint64, address gethcommon.Address, updateClock uint64, rawMessageHandler RawMessageHandler) error {
|
|
return m.dispatchSyncSavedAddress(ctx, protobuf.SyncSavedAddress{
|
|
Address: address.Bytes(),
|
|
ChainId: chainID,
|
|
UpdateClock: updateClock,
|
|
Removed: true,
|
|
}, rawMessageHandler)
|
|
}
|
|
|
|
func (m *Messenger) syncSavedAddress(ctx context.Context, savedAddress wallet.SavedAddress, rawMessageHandler RawMessageHandler) (err error) {
|
|
if savedAddress.Removed {
|
|
if err = m.syncDeletedSavedAddress(ctx, savedAddress.ChainID, savedAddress.Address, savedAddress.UpdateClock, rawMessageHandler); err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
if err = m.syncNewSavedAddress(ctx, &savedAddress, savedAddress.UpdateClock, rawMessageHandler); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (m *Messenger) handleSyncSavedAddress(state *ReceivedMessageState, syncMessage protobuf.SyncSavedAddress) (err error) {
|
|
address := gethcommon.BytesToAddress(syncMessage.Address)
|
|
if syncMessage.Removed {
|
|
_, err = m.savedAddressesManager.DeleteSavedAddressIfNewerUpdate(syncMessage.ChainId,
|
|
address, syncMessage.UpdateClock)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
state.Response.SavedAddresses = append(state.Response.SavedAddresses, &wallet.SavedAddress{ChainID: syncMessage.ChainId, Address: address})
|
|
} else {
|
|
sa := wallet.SavedAddress{
|
|
Address: address,
|
|
Name: syncMessage.Name,
|
|
Favourite: syncMessage.Favourite,
|
|
ChainID: syncMessage.ChainId,
|
|
}
|
|
|
|
_, err = m.savedAddressesManager.AddSavedAddressIfNewerUpdate(sa, syncMessage.UpdateClock)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
state.Response.SavedAddresses = append(state.Response.SavedAddresses, &sa)
|
|
}
|
|
return
|
|
}
|