feat(@wallet): move fetch prices

also make only one call rather than one call per couple token/currency
This commit is contained in:
Anthony Laibe 2022-03-18 11:34:09 +01:00 committed by Anthony Laibe
parent c5c92fcfd1
commit 4b91888433
3 changed files with 33 additions and 33 deletions

View File

@ -28,7 +28,6 @@ const SIGNAL_WALLET_ACCOUNT_UPDATED* = "walletAccount/walletAccountUpdated"
const SIGNAL_WALLET_ACCOUNT_NETWORK_ENABLED_UPDATED* = "walletAccount/networkEnabledUpdated"
var
priceCache {.threadvar.}: Table[string, float64]
balanceCache {.threadvar.}: Table[string, float64]
proc hex2Balance*(input: string, decimals: int): string =
@ -45,31 +44,6 @@ proc hex2Balance*(input: string, decimals: int): string =
result = $i
if(r > 0): result = fmt"{result}.{d}"
proc fetchPrice(crypto: string, fiat: string): float64 =
let key = crypto & fiat
if priceCache.hasKey(key):
return priceCache[key]
let secureSSLContext = newContext()
let client = newHttpClient(sslContext = secureSSLContext)
try:
let url: string = fmt"https://min-api.cryptocompare.com/data/price?fsym={crypto}&tsyms={fiat}"
client.headers = newHttpHeaders({ "Content-Type": "application/json" })
let response = client.request(url)
let parsedResponse = parseJson(response.body)
if (parsedResponse{"Response"} != nil and parsedResponse{"Response"}.getStr == "Error"):
error "Error while getting price", message = parsedResponse["Message"].getStr
return 0.0
result = parsefloat($parseJson(response.body)[fiat.toUpper])
priceCache[key] = result
except Exception as e:
error "Error getting price", message = e.msg
result = 0.0
finally:
client.close()
proc fetchAccounts(): seq[WalletAccountDto] =
let response = status_go_accounts.getAccounts()
return response.result.getElems().map(
@ -134,7 +108,7 @@ proc newService*(
proc buildTokens(
self: Service,
account: WalletAccountDto,
prices: Table[string, float64],
prices: Table[string, float],
balances: JsonNode
): seq[WalletTokenDto] =
for network in self.networkService.getEnabledNetworks():
@ -169,16 +143,38 @@ proc buildTokens(
)
proc getPrice*(self: Service, crypto: string, fiat: string): float64 =
return fetchPrice(crypto, fiat)
var prices = initTable[string, float]()
proc fetchPrices(self: Service): Table[string, float64] =
try:
let response = status_go_wallet.fetchPrices(@[crypto], fiat)
for (symbol, value) in response.result.pairs:
prices[symbol] = value.getFloat
except Exception as e:
let errDesription = e.msg
error "error: ", errDesription
return prices[crypto]
proc fetchPrices(self: Service): Table[string, float] =
let currency = self.settingsService.getCurrency()
var prices = initTable[string, float64]()
var symbols: seq[string] = @[]
for network in self.networkService.getEnabledNetworks():
prices[network.nativeCurrencySymbol] = fetchPrice(network.nativeCurrencySymbol, currency)
symbols.add(network.nativeCurrencySymbol)
for token in self.tokenService.getVisibleTokens():
prices[token.symbol] = fetchPrice(token.symbol, currency)
symbols.add(token.symbol)
var prices = initTable[string, float]()
try:
let response = status_go_wallet.fetchPrices(symbols, currency)
for (symbol, value) in response.result.pairs:
prices[symbol] = value.getFloat
except Exception as e:
let errDesription = e.msg
error "error: ", errDesription
return prices

View File

@ -26,3 +26,7 @@ proc addAccountWithPrivateKey*(privateKey, password, name, color, emoji: string)
proc addAccountWatch*(address, name, color, emoji: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [address, name, color, emoji]
return core.callPrivateRPC("accounts_addAccountWatch", payload)
proc fetchPrices*(symbols: seq[string], currency: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [symbols, currency]
return core.callPrivateRPC("wallet_fetchPrices", payload)

2
vendor/status-go vendored

@ -1 +1 @@
Subproject commit d0f4a94f7502ce37adf1f08065b07262b682c4bf
Subproject commit b629d6fa74cf4f1e43a021f95a9a7736dd2fa973