Skip to content

Commit 6b9eea6

Browse files
committed
fix: payment request
Fixes #19518
1 parent 0ded36a commit 6b9eea6

File tree

37 files changed

+786
-170
lines changed

37 files changed

+786
-170
lines changed

src/app/modules/main/chat_section/chat_content/input_area/view.nim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ QtObject:
127127
proc removeLinkPreviewData*(self: View, index: int) {.slot.} =
128128
self.linkPreviewModel.removePreviewData(index)
129129

130-
proc addPaymentRequest*(self: View, receiver: string, amount: string, tokenKey: string, symbol: string) {.slot.} =
131-
self.paymentRequestModel.addPaymentRequest(receiver, amount, tokenKey, symbol)
130+
proc addPaymentRequest*(self: View, receiver: string, amount: string, tokenKey: string, symbol: string, logoUri: string) {.slot.} =
131+
self.paymentRequestModel.addPaymentRequest(receiver, amount, tokenKey, symbol, logoUri)
132132

133133
proc removePaymentRequestPreviewData*(self: View, index: int) {.slot.} =
134134
self.paymentRequestModel.removeItemWithIndex(index)

src/app/modules/main/wallet_section/all_tokens/controller.nim

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ proc getAllTokenLists*(self: Controller): var seq[TokenListItem] =
7373
proc buildGroupsForChain*(self: Controller, chainId: int): bool =
7474
return self.tokenService.buildGroupsForChain(chainId)
7575

76+
proc getTokenByKeyOrGroupKeyFromAllTokens*(self: Controller, key: string): TokenItem =
77+
return self.tokenService.getTokenByKeyOrGroupKeyFromAllTokens(key)
78+
7679
proc getGroupsForChain*(self: Controller): var seq[TokenGroupItem] =
7780
return self.tokenService.getGroupsForChain()
7881

@@ -145,4 +148,7 @@ proc toggleAutoRefreshTokensLists*(self: Controller): bool =
145148
return self.settingsService.toggleAutoRefreshTokens()
146149

147150
proc tokenAvailableForBridgingViaHop*(self: Controller, tokenChainId: int, tokenAddress: string): bool =
148-
return self.tokenService.tokenAvailableForBridgingViaHop(tokenChainId, tokenAddress)
151+
return self.tokenService.tokenAvailableForBridgingViaHop(tokenChainId, tokenAddress)
152+
153+
proc getMandatoryTokenGroupKeys*(self: Controller): seq[string] =
154+
return self.tokenService.getMandatoryTokenGroupKeys()

src/app/modules/main/wallet_section/all_tokens/io_interface.nim

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ method viewDidLoad*(self: AccessInterface) {.base.} =
8181
method buildGroupsForChain*(self: AccessInterface, chainId: int): bool {.base.} =
8282
raise newException(ValueError, "No implementation available")
8383

84+
method getTokenByKeyOrGroupKeyFromAllTokens*(self: AccessInterface, key: string): TokenItem {.base.} =
85+
raise newException(ValueError, "No implementation available")
86+
8487
method filterChanged*(self: AccessInterface, addresses: seq[string]) {.base.} =
8588
raise newException(ValueError, "No implementation available")
8689

@@ -127,4 +130,7 @@ method showCommunityAssetWhenSendingTokensChanged*(self: AccessInterface) {.base
127130
raise newException(ValueError, "No implementation available")
128131

129132
method tokenAvailableForBridgingViaHop*(self: AccessInterface, tokenChainId: int, tokenAddress: string): bool {.base.} =
133+
raise newException(ValueError, "No implementation available")
134+
135+
method getMandatoryTokenGroupKeys*(self: AccessInterface): seq[string] {.base.} =
130136
raise newException(ValueError, "No implementation available")

src/app/modules/main/wallet_section/all_tokens/module.nim

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ method getTokenMarketValuesDataSource*(self: Module): TokenMarketValuesDataSourc
126126
method buildGroupsForChain*(self: Module, chainId: int): bool =
127127
return self.controller.buildGroupsForChain(chainId)
128128

129+
method getTokenByKeyOrGroupKeyFromAllTokens*(self: Module, key: string): TokenItem =
130+
return self.controller.getTokenByKeyOrGroupKeyFromAllTokens(key)
131+
129132
method filterChanged*(self: Module, addresses: seq[string]) =
130133
if addresses == self.addresses:
131134
return
@@ -183,4 +186,7 @@ method showCommunityAssetWhenSendingTokensChanged*(self: Module) =
183186
self.view.showCommunityAssetWhenSendingTokensChanged()
184187

185188
method tokenAvailableForBridgingViaHop*(self: Module, tokenChainId: int, tokenAddress: string): bool =
186-
return self.controller.tokenAvailableForBridgingViaHop(tokenChainId, tokenAddress)
189+
return self.controller.tokenAvailableForBridgingViaHop(tokenChainId, tokenAddress)
190+
191+
method getMandatoryTokenGroupKeys*(self: Module): seq[string] =
192+
return self.controller.getMandatoryTokenGroupKeys()

src/app/modules/main/wallet_section/all_tokens/view.nim

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import nimqml, sequtils, strutils, chronicles
1+
import nimqml, sequtils, strutils, json, chronicles
22

33
import io_interface, token_lists_model, token_groups_model
44

@@ -107,13 +107,24 @@ QtObject:
107107
read = getTokenGroupsModel
108108
notify = tokenGroupsModelChanged
109109

110-
proc buildGroupsForChain*(self: View, chainId: int, mandatoryKeysString: string) {.slot.} =
111-
let mandatoryKeys = mandatoryKeysString.split("$$")
110+
proc buildGroupsForChain*(self: View, chainId: int, mandatoryGroupKeysString: string) {.slot.} =
112111
if not self.delegate.buildGroupsForChain(chainId):
113112
return
114-
self.tokenGroupsForChainModel.modelsUpdated(resetModelSize = true, mandatoryKeys)
113+
var mandatoryGroupKeys: seq[string] = @[]
114+
if mandatoryGroupKeysString.len > 0:
115+
mandatoryGroupKeys = mandatoryGroupKeysString.split("$$")
116+
else:
117+
mandatoryGroupKeys = self.delegate.getMandatoryTokenGroupKeys()
118+
119+
self.tokenGroupsForChainModel.modelsUpdated(resetModelSize = true, mandatoryGroupKeys)
115120
self.tokenGroupsForChainModelChanged()
116121

122+
proc getTokenByKeyOrGroupKeyFromAllTokens*(self: View, key: string): string {.slot.} =
123+
let token = self.delegate.getTokenByKeyOrGroupKeyFromAllTokens(key)
124+
if token.isNil:
125+
return ""
126+
return $(%* token)
127+
117128
proc modelsUpdated*(self: View) =
118129
self.tokenListsModel.modelsUpdated()
119130
self.tokenGroupsModel.modelsUpdated()

src/app/modules/shared_models/payment_request_model.nim

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ type
77
Symbol
88
Amount
99
ReceiverAddress
10+
LogoUri
1011

1112
QtObject:
1213
type
@@ -42,6 +43,7 @@ QtObject:
4243
ModelRole.Symbol.int: "symbol",
4344
ModelRole.Amount.int: "amount",
4445
ModelRole.ReceiverAddress.int: "receiver",
46+
ModelRole.LogoUri.int:"logoUri",
4547
}.toTable
4648

4749
method data(self: Model, index: QModelIndex, role: int): QVariant =
@@ -63,6 +65,8 @@ QtObject:
6365
result = newQVariant(item.amount)
6466
of ModelRole.ReceiverAddress:
6567
result = newQVariant(item.receiver)
68+
of ModelRole.LogoUri:
69+
result = newQVariant(item.logoUri)
6670
else:
6771
result = newQVariant()
6872

@@ -85,8 +89,8 @@ QtObject:
8589
self.items.add(paymentRequest)
8690
self.endInsertRows()
8791

88-
proc addPaymentRequest*(self: Model, receiver: string, amount: string, tokenKey: string, symbol: string) {.slot.}=
89-
let paymentRequest = newPaymentRequest(receiver, amount, tokenKey, symbol)
92+
proc addPaymentRequest*(self: Model, receiver: string, amount: string, tokenKey: string, symbol: string, logoUri: string) {.slot.}=
93+
let paymentRequest = newPaymentRequest(receiver, amount, tokenKey, symbol, logoUri)
9094
self.insertItem(paymentRequest)
9195

9296
proc clearItems*(self: Model) =

src/app_service/service/activity_center/service.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ QtObject:
334334
if response.result.kind != JNull:
335335
if response.result.contains("chats"):
336336
for jsonChat in response.result["chats"]:
337-
let chat = toChatDto(jsonChat)
337+
var chat = toChatDto(jsonChat)
338338
self.chatService.updateOrAddChat(chat)
339339
self.events.emit(SIGNAL_CHAT_UPDATE, ChatUpdateArgs(chats: @[chat]))
340340

src/app_service/service/message/dto/payment_request.nim

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,37 @@ type PaymentRequest* = object
77
amount*: string
88
tokenKey*: string
99
symbol*: string
10+
logoUri*: string
11+
chainId*: int # kept for backward compatibility with the old payment requests
1012

11-
proc newPaymentRequest*(receiver: string, amount: string, tokenKey: string, symbol: string): PaymentRequest =
12-
result = PaymentRequest(receiver: receiver, amount: amount, tokenKey: tokenKey, symbol: symbol)
13+
14+
proc newPaymentRequest*(receiver: string, amount: string, tokenKey: string, symbol: string, logoUri: string): PaymentRequest =
15+
result = PaymentRequest(receiver: receiver, amount: amount, tokenKey: tokenKey, symbol: symbol, logoUri: logoUri)
1316

1417
proc toPaymentRequest*(jsonObj: JsonNode): PaymentRequest =
1518
result = PaymentRequest()
1619
discard jsonObj.getProp("receiver", result.receiver)
1720
discard jsonObj.getProp("amount", result.amount)
1821
discard jsonObj.getProp("tokenKey", result.tokenKey)
1922
discard jsonObj.getProp("symbol", result.symbol)
23+
discard jsonObj.getProp("logoUri", result.logoUri)
24+
discard jsonObj.getProp("chainId", result.chainId)
2025

2126
proc `%`*(self: PaymentRequest): JsonNode =
2227
return %*{
2328
"receiver": self.receiver,
2429
"amount": self.amount,
2530
"tokenKey": self.tokenKey,
26-
"symbol": self.symbol
31+
"symbol": self.symbol,
32+
"logoUri": self.logoUri
2733
}
2834

2935
proc `$`*(self: PaymentRequest): string =
3036
result = fmt"""PaymentRequest(
3137
receiver: {self.receiver},
3238
amount: {self.amount},
3339
tokenKey: {self.tokenKey},
34-
symbol: {self.symbol}
40+
symbol: {self.symbol},
41+
logoUri: {self.logoUri},
42+
chainId: {self.chainId}
3543
)"""

src/app_service/service/message/service.nim

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,10 @@ import ./dto/urls_unfurling_plan
2121
import ./dto/link_preview
2222
import ./message_cursor
2323

24-
import ../../common/activity_center
25-
import ../../common/message as message_common
26-
import ../../common/conversion as service_conversion
27-
28-
from ../../common/account_constants import ZERO_ADDRESS
24+
import app_service/common/activity_center
25+
import app_service/common/message as message_common
26+
import app_service/common/conversion as service_conversion
27+
from app_service/common/account_constants import ZERO_ADDRESS
2928

3029
import web3/conversions
3130

@@ -225,6 +224,27 @@ QtObject:
225224

226225
return self.pinnedMsgCursor[chatId]
227226

227+
proc checkPaymentRequestsInMessage*(self: Service, message: var MessageDto) =
228+
for paymentRequest in message.paymentRequests.mitems:
229+
if paymentRequest.tokenKey.len == 0 or paymentRequest.logoUri.len == 0:
230+
if paymentRequest.symbol.len > 0:
231+
# due to backward compatibility, in case the tokenKey is empty, we should try to find it by symbol on the received chain.
232+
let token = self.tokenService.getTokenBySymbolOnChain(paymentRequest.symbol, paymentRequest.chainId)
233+
if token.isNil:
234+
error "token is nil", tokenKey=paymentRequest.tokenKey, procName="checkPaymentRequestsInMessage"
235+
continue
236+
paymentRequest.tokenKey = token.key
237+
paymentRequest.symbol = token.symbol
238+
paymentRequest.logoUri = token.logoUri
239+
240+
proc checkPaymentRequestsInMessages*(self: Service, messages: var seq[MessageDto]) =
241+
for message in messages.mitems:
242+
self.checkPaymentRequestsInMessage(message)
243+
244+
proc checkPaymentRequestsInPinnedMessages*(self: Service, pinnedMessages: var seq[PinnedMessageDto]) =
245+
for pinnedMessage in pinnedMessages.mitems:
246+
self.checkPaymentRequestsInMessage(pinnedMessage.message)
247+
228248
proc asyncLoadMoreMessagesForChat*(self: Service, chatId: string, limit = MESSAGES_PER_PAGE): bool =
229249
if (chatId.len == 0):
230250
error "empty chat id", procName="asyncLoadMoreMessagesForChat"
@@ -357,6 +377,7 @@ QtObject:
357377
return
358378

359379
self.bulkReplacePubKeysWithDisplayNames(messages)
380+
self.checkPaymentRequestsInMessages(messages)
360381

361382
for i in 0 ..< chats.len:
362383
let chatId = chats[i].id
@@ -405,7 +426,7 @@ QtObject:
405426
return self.numOfPinnedMessagesPerChat[chatId]
406427
return 0
407428

408-
proc handlePinnedMessagesUpdate(self: Service, pinnedMessages: seq[PinnedMessageUpdateDto]) =
429+
proc handlePinnedMessagesUpdate(self: Service, pinnedMessages: var seq[PinnedMessageUpdateDto]) =
409430
for pm in pinnedMessages:
410431
var chatId: string = ""
411432
if (self.numOfPinnedMessagesPerChat.contains(pm.localChatId)):
@@ -480,6 +501,7 @@ QtObject:
480501
messages = map(args.messages.getElems(), proc(x: JsonNode): MessageDto = x.toMessageDto())
481502

482503
self.bulkReplacePubKeysWithDisplayNames(messages)
504+
self.checkPaymentRequestsInMessages(messages)
483505

484506
self.events.emit(SIGNAL_MESSAGES_LOADED, MessagesLoadedArgs(
485507
chatId: args.chatId,
@@ -581,6 +603,8 @@ QtObject:
581603
result = x.toReactionDto()
582604
)
583605

606+
self.checkPaymentRequestsInPinnedMessages(pinnedMessages)
607+
584608
let data = PinnedMessagesLoadedArgs(chatId: chatId, pinnedMessages: pinnedMessages, reactions: reactions)
585609

586610
self.events.emit(SIGNAL_PINNED_MESSAGES_LOADED, data)
@@ -619,6 +643,7 @@ QtObject:
619643
messages = map(messagesArr.getElems(), proc(x: JsonNode): MessageDto = x.toMessageDto())
620644

621645
self.bulkReplacePubKeysWithDisplayNames(messages)
646+
self.checkPaymentRequestsInMessages(messages)
622647

623648
# handling reactions
624649
var reactionsArr: JsonNode
@@ -660,6 +685,7 @@ QtObject:
660685
var messages = map(rpcResponseObj{"messages"}.getElems(), proc(x: JsonNode): MessageDto = x.toMessageDto())
661686
if messages.len > 0:
662687
self.bulkReplacePubKeysWithDisplayNames(messages)
688+
self.checkPaymentRequestsInMessages(messages)
663689

664690
let data = CommunityMemberMessagesArgs(communityId: communityId, messages: messages)
665691
self.events.emit(SIGNAL_COMMUNITY_MEMBER_ALL_MESSAGES, data)

src/app_service/service/token/items/token.nim

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import strutils, tables
1+
import strutils, tables, json
22

33
import app_service/common/wallet_constants as common_wallet_constants
44
import app_service/common/utils as common_utils
@@ -113,4 +113,20 @@ proc createStatusTokenItem*(chainId: int): TokenItem =
113113
tokenDto.symbol = common_wallet_constants.STATUS_SYMBOL_TESTNET
114114
tokenDto.decimals = common_wallet_constants.STATUS_DECIMALS_TESTNET
115115

116-
return createTokenItem(tokenDto, common_types.TokenType.ERC20)
116+
return createTokenItem(tokenDto, common_types.TokenType.ERC20)
117+
118+
proc `%`*(self: TokenItem): JsonNode =
119+
return %*{
120+
"key": self.key,
121+
"groupKey": self.groupKey,
122+
"crossChainId": self.crossChainId,
123+
"address": self.address,
124+
"name": self.name,
125+
"symbol": self.symbol,
126+
"decimals": self.decimals,
127+
"chainId": self.chainId,
128+
"logoUri": self.logoUri,
129+
"customToken": self.customToken,
130+
"communityId": self.communityData.id,
131+
"type": self.`type`
132+
}

0 commit comments

Comments
 (0)