From d0b82bc8dca4a2a1db475220b043d057c3134de2 Mon Sep 17 00:00:00 2001 From: Michal Iskierko Date: Tue, 28 May 2024 11:50:33 +0200 Subject: [PATCH] fix(@desktop/communities): Update UI when receiving information about token actions made by other owner/tokenmaster Fix #13371 --- .../core/signals/remote_signals/community.nim | 28 +++++++++++++++++-- .../signals/remote_signals/signal_type.nim | 1 + src/app/core/signals/signals_manager.nim | 1 + src/app/modules/main/controller.nim | 8 ++++++ src/app_service/common/conversion.nim | 2 ++ .../service/community_tokens/service.nim | 20 +++++++++++++ 6 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/app/core/signals/remote_signals/community.nim b/src/app/core/signals/remote_signals/community.nim index 7a96ba036b..2b4ee29318 100644 --- a/src/app/core/signals/remote_signals/community.nim +++ b/src/app/core/signals/remote_signals/community.nim @@ -1,9 +1,11 @@ -import json, tables +import json, tables, chronicles import base import ../../../../app_service/service/community/dto/[community] import ../../../../app_service/service/community_tokens/dto/community_token import ../../../../app_service/service/chat/dto/[chat] +from ../../../../app_service/common/conversion import intToEnum + import signal_type include app_service/common/json_utils @@ -85,6 +87,17 @@ type CommunityTokenTransactionStatusChangedSignal* = ref object of Signal masterToken*: CommunityTokenDto errorString*: string +type + CommunityTokenActionType* {.pure.} = enum + Unknown = 0, + Airdrop, + Burn, + RemoteDestruct, + +type CommunityTokenActionSignal* = ref object of Signal + communityToken*: CommunityTokenDto + actionType*: CommunityTokenActionType + proc fromEvent*(T: type CommunitySignal, event: JsonNode): CommunitySignal = result = CommunitySignal() result.signalType = SignalType.CommunityFound @@ -272,4 +285,15 @@ proc fromEvent*(T: type CommunityTokenTransactionStatusChangedSignal, event: Jso if event["event"].hasKey("masterToken"): result.masterToken = toCommunityTokenDto(event["event"]{"masterToken"}) result.errorString = event["event"]{"errorString"}.getStr() - result.signalType = SignalType.CommunityTokenTransactionStatusChanged \ No newline at end of file + result.signalType = SignalType.CommunityTokenTransactionStatusChanged + +proc fromEvent*(T: type CommunityTokenActionSignal, event: JsonNode): CommunityTokenActionSignal = + result = CommunityTokenActionSignal() + result.actionType = CommunityTokenActionType.Unknown + if event["event"].hasKey("communityToken"): + result.communityToken = toCommunityTokenDto(event["event"]{"communityToken"}) + try: + result.actionType = intToEnum[CommunityTokenActionType](event["event"]{"actionType"}.getInt()) + except Exception as e: + error "CommunityTokenActionSignal: can't read actionType:", error=e.msg + result.signalType = SignalType.CommunityTokenAction diff --git a/src/app/core/signals/remote_signals/signal_type.nim b/src/app/core/signals/remote_signals/signal_type.nim index 982ce5083a..4a1d6bb7ba 100644 --- a/src/app/core/signals/remote_signals/signal_type.nim +++ b/src/app/core/signals/remote_signals/signal_type.nim @@ -62,6 +62,7 @@ type SignalType* {.pure.} = enum DBReEncryptionStarted = "db.reEncryption.started" DBReEncryptionFinished = "db.reEncryption.finished" CommunityTokenTransactionStatusChanged = "communityToken.communityTokenTransactionStatusChanged" + CommunityTokenAction = "communityToken.communityTokenAction" Unknown proc event*(self:SignalType):string = diff --git a/src/app/core/signals/signals_manager.nim b/src/app/core/signals/signals_manager.nim index f0b0d0b5c8..933b86aa6d 100644 --- a/src/app/core/signals/signals_manager.nim +++ b/src/app/core/signals/signals_manager.nim @@ -131,6 +131,7 @@ QtObject: # pairing of SignalType.LocalPairing: LocalPairingSignal.fromEvent(jsonSignal) of SignalType.CommunityTokenTransactionStatusChanged: CommunityTokenTransactionStatusChangedSignal.fromEvent(jsonSignal) + of SignalType.CommunityTokenAction: CommunityTokenActionSignal.fromEvent(jsonSignal) else: Signal() result.signalType = signalType diff --git a/src/app/modules/main/controller.nim b/src/app/modules/main/controller.nim index 1fa28fbc25..70e812e567 100644 --- a/src/app/modules/main/controller.nim +++ b/src/app/modules/main/controller.nim @@ -355,6 +355,14 @@ proc init*(self: Controller) = self.getRemoteDestructedAmount(communityToken.chainId, communityToken.address)) self.delegate.onBurnStateChanged(communityToken.communityId, communityToken.chainId, communityToken.address, args.status) + self.events.on(SIGNAL_BURN_ACTION_RECEIVED) do(e: Args): + let args = RemoteDestructArgs(e) + let communityToken = args.communityToken + self.delegate.onCommunityTokenSupplyChanged(communityToken.communityId, communityToken.chainId, + communityToken.address, communityToken.supply, + self.getRemainingSupply(communityToken.chainId, communityToken.address), + self.getRemoteDestructedAmount(communityToken.chainId, communityToken.address)) + self.events.on(SIGNAL_FINALISE_OWNERSHIP_STATUS) do(e: Args): let args = FinaliseOwnershipStatusArgs(e) self.delegate.onFinaliseOwnershipStatusChanged(args.isPending, args.communityId) diff --git a/src/app_service/common/conversion.nim b/src/app_service/common/conversion.nim index 36bb162bf4..7d0974be04 100644 --- a/src/app_service/common/conversion.nim +++ b/src/app_service/common/conversion.nim @@ -87,3 +87,5 @@ proc wei2Gwei*(input: string): string = proc intToEnum*[T](intVal: int, defaultVal: T): T = result = if (intVal >= ord(low(T)) and intVal <= ord(high(T))): T(intVal) else: defaultVal +proc intToEnum*[T](intVal: int): T = + result = if (intVal >= ord(low(T)) and intVal <= ord(high(T))): T(intVal) else: raise newException(ValueError, "Can't convert int to enum") \ No newline at end of file diff --git a/src/app_service/service/community_tokens/service.nim b/src/app_service/service/community_tokens/service.nim index 0bfaeeb894..e86fb8ffda 100644 --- a/src/app_service/service/community_tokens/service.nim +++ b/src/app_service/service/community_tokens/service.nim @@ -261,6 +261,7 @@ const SIGNAL_COMPUTE_AIRDROP_FEE* = "communityTokens-computeAirdropFee" const SIGNAL_COMMUNITY_TOKEN_OWNERS_FETCHED* = "communityTokens-communityTokenOwnersFetched" const SIGNAL_REMOTE_DESTRUCT_STATUS* = "communityTokens-communityTokenRemoteDestructStatus" const SIGNAL_BURN_STATUS* = "communityTokens-communityTokenBurnStatus" +const SIGNAL_BURN_ACTION_RECEIVED* = "communityTokens-communityTokenBurnActionReceived" const SIGNAL_AIRDROP_STATUS* = "communityTokens-airdropStatus" const SIGNAL_REMOVE_COMMUNITY_TOKEN_FAILED* = "communityTokens-removeCommunityTokenFailed" const SIGNAL_COMMUNITY_TOKEN_REMOVED* = "communityTokens-communityTokenRemoved" @@ -570,6 +571,21 @@ QtObject: except Exception as e: error "Error processing owner token deployment pending transaction event", msg=e.msg + proc processCommunityTokenAction(self: Service, signalArgs: CommunityTokenActionSignal) = + case signalArgs.actionType + of CommunityTokenActionType.Airdrop: + self.tempTokenOwnersToFetch = signalArgs.communityToken + self.tokenOwners1SecTimer.start() + of CommunityTokenActionType.Burn: + self.updateCommunityTokenCache(signalArgs.communityToken.chainId, signalArgs.communityToken.address, signalArgs.communityToken) + let data = RemoteDestructArgs(communityToken: signalArgs.communityToken) + self.events.emit(SIGNAL_BURN_ACTION_RECEIVED, data) + of CommunityTokenActionType.RemoteDestruct: + self.tempTokenOwnersToFetch = signalArgs.communityToken + self.tokenOwners1SecTimer.start() + else: + warn "Unknown token action", actionType=signalArgs.actionType + proc tryFetchOwners(self: Service) = # both communities and tokens should be loaded if self.allCommunityTokensLoaded and self.communityDataLoaded: @@ -590,6 +606,10 @@ QtObject: self.communityDataLoaded = true self.tryFetchOwners() + self.events.on(SignalType.CommunityTokenAction.event) do(e:Args): + let receivedData = CommunityTokenActionSignal(e) + self.processCommunityTokenAction(receivedData) + self.events.on(SignalType.CommunityTokenTransactionStatusChanged.event) do(e: Args): let receivedData = CommunityTokenTransactionStatusChangedSignal(e) if receivedData.errorString != "":