Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 27 additions & 7 deletions src/app/modules/main/wallet_section/activity/entry.nim
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ type
ExtraData* = object
inAmount*: float64
outAmount*: float64
symbolIn*: string
symbolOut*: string

# Used to display an activity history header entry in the QML UI
QtObject:
Expand All @@ -50,10 +52,16 @@ QtObject:

proc extractCurrencyAmount(self: ActivityEntry, currencyService: Service): CurrencyAmount =
let amount = if self.isInTransactionType(): self.metadata.amountIn else: self.metadata.amountOut
let symbol = if self.isInTransactionType(): self.metadata.symbolIn.get("") else: self.metadata.symbolOut.get("")
let token = if self.isInTransactionType(): self.metadata.tokenIn else: self.metadata.tokenOut
let cachedSymbol = if self.isInTransactionType(): self.metadata.symbolIn.get("") else: self.metadata.symbolOut.get("")

let (formattedAmount, tokenSymbol) = currencyService.parseCurrencyValueAndSymbolByToken(token, amount)

let finalSymbol = if tokenSymbol != "": tokenSymbol else: cachedSymbol

return currencyAmountToItem(
currencyService.parseCurrencyValue(symbol, amount),
currencyService.getCurrencyFormat(symbol),
formattedAmount,
currencyService.getCurrencyFormat(finalSymbol),
)

proc newTransactionActivityEntry*(metadata: backend_activity.ActivityEntry, fromAddresses: seq[string], extradata: ExtraData, currencyService: Service): ActivityEntry =
Expand All @@ -77,15 +85,23 @@ QtObject:

proc buildMultiTransactionExtraData(metadata: backend_activity.ActivityEntry, currencyService: Service): ExtraData =
if metadata.symbolIn.isSome():
result.inAmount = currencyService.parseCurrencyValue(metadata.symbolIn.get(), metadata.amountIn)
let (amount, symbol) = currencyService.parseCurrencyValueAndSymbolByToken(metadata.tokenIn, metadata.amountIn)
result.inAmount = amount
result.symbolIn = symbol
if metadata.symbolOut.isSome():
result.outAmount = currencyService.parseCurrencyValue(metadata.symbolOut.get(), metadata.amountOut)
let (amount, symbol) = currencyService.parseCurrencyValueAndSymbolByToken(metadata.tokenOut, metadata.amountOut)
result.outAmount = amount
result.symbolOut = symbol

proc buildTransactionExtraData(metadata: backend_activity.ActivityEntry, currencyService: Service): ExtraData =
if metadata.symbolIn.isSome() or metadata.amountIn > 0:
result.inAmount = currencyService.parseCurrencyValue(metadata.symbolIn.get(""), metadata.amountIn)
let (amount, symbol) = currencyService.parseCurrencyValueAndSymbolByToken(metadata.tokenIn, metadata.amountIn)
result.inAmount = amount
result.symbolIn = symbol
if metadata.symbolOut.isSome() or metadata.amountOut > 0:
result.outAmount = currencyService.parseCurrencyValue(metadata.symbolOut.get(""), metadata.amountOut)
let (amount, symbol) = currencyService.parseCurrencyValueAndSymbolByToken(metadata.tokenOut, metadata.amountOut)
result.outAmount = amount
result.symbolOut = symbol

proc buildExtraData(backendEntry: backend_activity.ActivityEntry, currencyService: Service): ExtraData =
var extraData: ExtraData
Expand Down Expand Up @@ -157,12 +173,16 @@ QtObject:
read = getRecipient

proc getInSymbol*(self: ActivityEntry): string {.slot.} =
if self.extraData.symbolIn != "":
return self.extraData.symbolIn
return self.metadata.symbolIn.get("")

QtProperty[string] inSymbol:
read = getInSymbol

proc getOutSymbol*(self: ActivityEntry): string {.slot.} =
if self.extraData.symbolOut != "":
return self.extraData.symbolOut
return self.metadata.symbolOut.get("")

QtProperty[string] outSymbol:
Expand Down
3 changes: 3 additions & 0 deletions src/app/modules/main/wallet_section/activity/model.nim
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,9 @@ QtObject:
proc refreshAmountCurrency*(self: Model, currencyService: Service) =
for i in 0..self.entries.high:
self.entries[i].resetAmountCurrency(currencyService)
let index = self.createIndex(i, 0, nil)
defer: index.delete
self.dataChanged(index, index, @[ModelRole.ActivityEntryRole.int])

proc delete(self: Model) =
self.QAbstractListModel.delete
Expand Down
27 changes: 17 additions & 10 deletions src/app_service/service/currency/service.nim
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import nimqml, chronicles, strutils, tables, json, stint

import ../../../backend/backend as backend
import ../../../backend/activity as backend_activity

import ../../../app/core/eventemitter
import ../../../app/core/tasks/[qt, threadpool]
Expand Down Expand Up @@ -121,23 +122,29 @@ QtObject:
return i.toFloat() + r.toFloat() / p.toFloat()

# TODO: left this for activity controller as it uses token symbol
# which may not be unique needs to be refactored. Also needed for
# hasGas api which also needs to be rethought
# https://github.com/status-im/status-desktop/issues/13505
proc parseCurrencyValue*(self: Service, symbol: string, amountInt: UInt256): float64 =
let token = self.tokenService.findTokenBySymbol(symbol)
var decimals: int = 0
if token != nil:
decimals = token.decimals
return u256ToFloat(decimals, amountInt)

proc parseCurrencyValueByTokensKey*(self: Service, tokensKey: string, amountInt: UInt256): float64 =
let token = self.tokenService.getTokenBySymbolByTokensKey(tokensKey)
var decimals: int = 0
if token != nil:
decimals = token.decimals
return u256ToFloat(decimals, amountInt)

proc parseCurrencyValueAndSymbolByToken*(self: Service, activityToken: Option[backend_activity.Token], amountInt: UInt256): (float64, string) =
if activityToken.isNone():
return (u256ToFloat(0, amountInt), "")

let t = activityToken.get()
if t.address.isNone():
return (u256ToFloat(0, amountInt), "")

let fullTokenData = self.tokenService.findTokenByAddress(int(t.chainId), $t.address.get())
var decimals: int = 0
var symbol: string = ""
if fullTokenData != nil:
decimals = fullTokenData.decimals
symbol = fullTokenData.symbol
return (u256ToFloat(decimals, amountInt), symbol)

proc delete*(self: Service) =
self.QObject.delete

Loading