github.com/status-im/status-go@v1.1.0/protocol/messenger_saved_address.go (about)

     1  package protocol
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/golang/protobuf/proto"
     8  
     9  	gethcommon "github.com/ethereum/go-ethereum/common"
    10  	multiAccCommon "github.com/status-im/status-go/multiaccounts/common"
    11  	"github.com/status-im/status-go/protocol/common"
    12  	"github.com/status-im/status-go/protocol/protobuf"
    13  	v1protocol "github.com/status-im/status-go/protocol/v1"
    14  	"github.com/status-im/status-go/services/wallet"
    15  )
    16  
    17  func (m *Messenger) UpsertSavedAddress(ctx context.Context, sa wallet.SavedAddress) error {
    18  	sa.UpdateClock, _ = m.getLastClockWithRelatedChat()
    19  	err := m.savedAddressesManager.UpdateMetadataAndUpsertSavedAddress(sa)
    20  	if err != nil {
    21  		return err
    22  	}
    23  	return m.syncNewSavedAddress(ctx, &sa, sa.UpdateClock, m.dispatchMessage)
    24  }
    25  
    26  func (m *Messenger) DeleteSavedAddress(ctx context.Context, address gethcommon.Address, isTest bool) error {
    27  	updateClock, _ := m.getLastClockWithRelatedChat()
    28  	_, err := m.savedAddressesManager.DeleteSavedAddress(address, isTest, updateClock)
    29  	if err != nil {
    30  		return err
    31  	}
    32  	return m.syncDeletedSavedAddress(ctx, address, isTest, updateClock, m.dispatchMessage)
    33  }
    34  
    35  func (m *Messenger) GetSavedAddresses(ctx context.Context) ([]*wallet.SavedAddress, error) {
    36  	return m.savedAddressesManager.GetSavedAddresses()
    37  }
    38  
    39  func (m *Messenger) GetSavedAddressesPerMode(isTest bool) ([]*wallet.SavedAddress, error) {
    40  	return m.savedAddressesManager.GetSavedAddressesPerMode(isTest)
    41  }
    42  
    43  func (m *Messenger) RemainingCapacityForSavedAddresses(testnetMode bool) (int, error) {
    44  	return m.savedAddressesManager.RemainingCapacityForSavedAddresses(testnetMode)
    45  }
    46  
    47  func (m *Messenger) garbageCollectRemovedSavedAddresses() error {
    48  	return m.savedAddressesManager.DeleteSoftRemovedSavedAddresses(uint64(time.Now().AddDate(0, 0, -30).Unix()))
    49  }
    50  
    51  func (m *Messenger) dispatchSyncSavedAddress(ctx context.Context, syncMessage *protobuf.SyncSavedAddress, rawMessageHandler RawMessageHandler) error {
    52  	if !m.hasPairedDevices() {
    53  		return nil
    54  	}
    55  
    56  	clock, chat := m.getLastClockWithRelatedChat()
    57  
    58  	encodedMessage, err := proto.Marshal(syncMessage)
    59  	if err != nil {
    60  		return err
    61  	}
    62  
    63  	rawMessage := common.RawMessage{
    64  		LocalChatID: chat.ID,
    65  		Payload:     encodedMessage,
    66  		MessageType: protobuf.ApplicationMetadataMessage_SYNC_SAVED_ADDRESS,
    67  		ResendType:  common.ResendTypeDataSync,
    68  	}
    69  
    70  	_, err = rawMessageHandler(ctx, rawMessage)
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	chat.LastClockValue = clock
    76  	return m.saveChat(chat)
    77  }
    78  
    79  func (m *Messenger) syncNewSavedAddress(ctx context.Context, savedAddress *wallet.SavedAddress, updateClock uint64, rawMessageHandler RawMessageHandler) error {
    80  	return m.dispatchSyncSavedAddress(ctx, &protobuf.SyncSavedAddress{
    81  		Address:         savedAddress.Address.Bytes(),
    82  		Name:            savedAddress.Name,
    83  		Removed:         savedAddress.Removed,
    84  		UpdateClock:     updateClock,
    85  		ChainShortNames: savedAddress.ChainShortNames,
    86  		Ens:             savedAddress.ENSName,
    87  		IsTest:          savedAddress.IsTest,
    88  		Color:           string(savedAddress.ColorID),
    89  	}, rawMessageHandler)
    90  }
    91  
    92  func (m *Messenger) syncDeletedSavedAddress(ctx context.Context, address gethcommon.Address, isTest bool, updateClock uint64, rawMessageHandler RawMessageHandler) error {
    93  	return m.dispatchSyncSavedAddress(ctx, &protobuf.SyncSavedAddress{
    94  		Address:     address.Bytes(),
    95  		UpdateClock: updateClock,
    96  		Removed:     true,
    97  		IsTest:      isTest,
    98  	}, rawMessageHandler)
    99  }
   100  
   101  func (m *Messenger) syncSavedAddress(ctx context.Context, savedAddress *wallet.SavedAddress, rawMessageHandler RawMessageHandler) (err error) {
   102  	if savedAddress.Removed {
   103  		if err = m.syncDeletedSavedAddress(ctx, savedAddress.Address, savedAddress.IsTest, savedAddress.UpdateClock, rawMessageHandler); err != nil {
   104  			return err
   105  		}
   106  	} else {
   107  		if err = m.syncNewSavedAddress(ctx, savedAddress, savedAddress.UpdateClock, rawMessageHandler); err != nil {
   108  			return err
   109  		}
   110  	}
   111  	return
   112  }
   113  
   114  func (m *Messenger) HandleSyncSavedAddress(state *ReceivedMessageState, syncMessage *protobuf.SyncSavedAddress, statusMessage *v1protocol.StatusMessage) (err error) {
   115  	address := gethcommon.BytesToAddress(syncMessage.Address)
   116  	if syncMessage.Removed {
   117  		deleted, err := m.savedAddressesManager.DeleteSavedAddress(
   118  			address, syncMessage.IsTest, syncMessage.UpdateClock)
   119  		if err != nil {
   120  			return err
   121  		}
   122  		if deleted {
   123  			state.Response.AddSavedAddress(&wallet.SavedAddress{Address: address, ENSName: syncMessage.Ens, IsTest: syncMessage.IsTest, Removed: true})
   124  		}
   125  	} else {
   126  		sa := wallet.SavedAddress{
   127  			Address:         address,
   128  			Name:            syncMessage.Name,
   129  			ChainShortNames: syncMessage.ChainShortNames,
   130  			ENSName:         syncMessage.Ens,
   131  			IsTest:          syncMessage.IsTest,
   132  			ColorID:         multiAccCommon.CustomizationColor(syncMessage.Color),
   133  		}
   134  		sa.UpdateClock = syncMessage.UpdateClock
   135  
   136  		added, err := m.savedAddressesManager.AddSavedAddressIfNewerUpdate(sa)
   137  		if err != nil {
   138  			return err
   139  		}
   140  		if added {
   141  			state.Response.AddSavedAddress(&sa)
   142  		}
   143  	}
   144  	return
   145  }