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 }