add/remove & update configured tokens on the fly

add/remove & update configured tokens on the fly

add wallet methods

generate configured assets

correct show selected tokens

toggle assets

add/remove configured tokens on the fly

cleanup

fix shown wallet
This commit is contained in:
Iuri Matias 2020-06-05 13:32:29 -04:00
parent c609a00784
commit 5371f22e70
7 changed files with 87 additions and 18 deletions

View File

@ -37,16 +37,15 @@ proc init*(self: WalletController) =
self.view.setTotalFiatBalance(self.status.wallet.getTotalFiatBalance()) self.view.setTotalFiatBalance(self.status.wallet.getTotalFiatBalance())
self.status.events.on("accountsUpdated") do(e: Args): self.status.events.on("accountsUpdated") do(e: Args):
self.view.totalFiatBalanceChanged() self.view.updateView()
self.view.currentAccountChanged()
self.view.accountListChanged()
self.view.accounts.forceUpdate()
self.view.currentAssetList.forceUpdate()
self.status.events.on("newAccountAdded") do(e: Args): self.status.events.on("newAccountAdded") do(e: Args):
var account = AccountArgs(e) var account = AccountArgs(e)
self.view.accounts.addAccountToList(account.account) self.view.accounts.addAccountToList(account.account)
self.status.events.on("assetChanged") do(e: Args):
self.view.updateView()
method onSignal(self: WalletController, data: Signal) = method onSignal(self: WalletController, data: Signal) =
debug "New signal received" debug "New signal received"
discard discard

View File

@ -124,3 +124,13 @@ QtObject:
proc hasAsset*(self: WalletView, account: string, symbol: string): bool {.slot.} = proc hasAsset*(self: WalletView, account: string, symbol: string): bool {.slot.} =
self.status.wallet.hasAsset(account, symbol) self.status.wallet.hasAsset(account, symbol)
proc toggleAsset*(self: WalletView, symbol: string, checked: bool, address: string, name: string, decimals: int, color: string) {.slot.} =
self.status.wallet.toggleAsset(symbol, checked, address, name, decimals, color)
proc updateView*(self: WalletView) =
self.totalFiatBalanceChanged()
self.currentAccountChanged()
self.accountListChanged()
self.accounts.forceUpdate()
self.setCurrentAssetList(self.currentAccount.account.assetList)

View File

@ -25,8 +25,8 @@ proc callPrivateRPC*(methodName: string, payload = %* []): string =
result = $response result = $response
if parseJSON(result).hasKey("error"): if parseJSON(result).hasKey("error"):
error "rpc response error", result = result error "rpc response error", result = result
except: except Exception as e:
error "error doing rpc request", methodName = methodName error "error doing rpc request", methodName = methodName, exception=e.msg
proc sendTransaction*(inputJSON: string, password: string): string = proc sendTransaction*(inputJSON: string, password: string): string =
var hashed_password = "0x" & $keccak_256.digest(password) var hashed_password = "0x" & $keccak_256.digest(password)

View File

@ -0,0 +1,28 @@
import core as status
import json
import chronicles
logScope:
topics = "wallet"
proc getCustomTokens*(): JsonNode =
let payload = %* []
let response = status.callPrivateRPC("wallet_getCustomTokens", payload).parseJson
if response["result"].kind == JNull:
return %* []
return response["result"]
proc addCustomToken*(address: string, name: string, symbol: string, decimals: int, color: string): string =
let payload = %* [{"address": address, "name": name, "symbol": symbol, "decimals": decimals, "color": color}]
status.callPrivateRPC("wallet_addCustomToken", payload)
proc removeCustomToken*(address: string): string =
let payload = %* [address]
status.callPrivateRPC("wallet_deleteCustomToken", payload)
proc getTokensBalances*(accounts: openArray[string], tokens: openArray[string]): JsonNode =
let payload = %* [accounts, tokens]
let response = status.callPrivateRPC("wallet_getTokensBalances", payload).parseJson
if response["result"].kind == JNull:
return %* {}
response["result"]

View File

@ -6,6 +6,7 @@ import libstatus/wallet as status_wallet
import libstatus/settings as status_settings import libstatus/settings as status_settings
import libstatus/accounts as status_accounts import libstatus/accounts as status_accounts
import chronicles import chronicles
import libstatus/tokens as status_tokens
type CurrencyArgs* = ref object of Args type CurrencyArgs* = ref object of Args
currency*: string currency*: string
@ -25,6 +26,7 @@ type WalletModel* = ref object
events*: EventEmitter events*: EventEmitter
accounts*: seq[Account] accounts*: seq[Account]
defaultCurrency*: string defaultCurrency*: string
tokens*: JsonNode
proc updateBalance*(self: Account) proc updateBalance*(self: Account)
proc getDefaultCurrency*(self: WalletModel): string proc getDefaultCurrency*(self: WalletModel): string
@ -32,11 +34,12 @@ proc getDefaultCurrency*(self: WalletModel): string
proc newWalletModel*(events: EventEmitter): WalletModel = proc newWalletModel*(events: EventEmitter): WalletModel =
result = WalletModel() result = WalletModel()
result.accounts = @[] result.accounts = @[]
result.tokens = %* []
result.events = events result.events = events
result.defaultCurrency = "" result.defaultCurrency = ""
proc initEvents*(self: WalletModel) = proc initEvents*(self: WalletModel) =
self.events.on("currencyChanged") do(e: Args): self.events.on("currencyChanged") do(e: Args):
self.defaultCurrency = self.getDefaultCurrency() self.defaultCurrency = self.getDefaultCurrency()
for account in self.accounts: for account in self.accounts:
account.updateBalance() account.updateBalance()
@ -79,7 +82,10 @@ proc getFiatValue*(eth_balance: string, symbol: string, fiat_symbol: string): fl
fiat_balance fiat_balance
proc hasAsset*(self: WalletModel, account: string, symbol: string): bool = proc hasAsset*(self: WalletModel, account: string, symbol: string): bool =
(symbol == "DAI") or (symbol == "OMG") for token in self.tokens:
if symbol == token["symbol"].getStr:
return true
return false
proc updateBalance*(self: Account) = proc updateBalance*(self: Account) =
let defaultCurrency = getDefaultCurrency() let defaultCurrency = getDefaultCurrency()
@ -89,7 +95,19 @@ proc updateBalance*(self: Account) =
var totalAccountBalance = usd_balance var totalAccountBalance = usd_balance
self.balance = fmt"{totalAccountBalance:.2f} {defaultCurrency}" self.balance = fmt"{totalAccountBalance:.2f} {defaultCurrency}"
proc generateAccountConfiguredAssets*(self: WalletModel): seq[Asset] =
var assets: seq[Asset] = @[]
var symbol = "ETH"
var asset = Asset(name:"Ethereum", symbol: symbol, value: fmt"0.0", fiatValue: "$" & fmt"0.0", image: fmt"../../img/token-icons/{toLowerAscii(symbol)}.svg")
assets.add(asset)
for token in self.tokens:
var symbol = token["symbol"].getStr
var existingToken = Asset(name: token["name"].getStr, symbol: symbol, value: fmt"0.0", fiatValue: "$0.0", image: fmt"../../img/token-icons/{toLowerAscii(symbol)}.svg")
assets.add(existingToken)
assets
proc initAccounts*(self: WalletModel) = proc initAccounts*(self: WalletModel) =
self.tokens = status_tokens.getCustomTokens()
let accounts = status_wallet.getWalletAccounts() let accounts = status_wallet.getWalletAccounts()
var totalAccountBalance: float = 0 var totalAccountBalance: float = 0
@ -103,9 +121,7 @@ proc initAccounts*(self: WalletModel) =
totalAccountBalance = totalAccountBalance + usd_balance totalAccountBalance = totalAccountBalance + usd_balance
var asset = Asset(name:"Ethereum", symbol: symbol, value: fmt"{eth_balance:.6}", fiatValue: "$" & fmt"{usd_balance:.2f}", image: fmt"../../img/token-icons/{toLowerAscii(symbol)}.svg") var assets: seq[Asset] = self.generateAccountConfiguredAssets()
var assets: seq[Asset] = @[]
assets.add(asset)
var account = Account(name: account.name, address: address, iconColor: account.color, balance: "", assetList: assets, realFiatBalance: totalAccountBalance) var account = Account(name: account.name, address: address, iconColor: account.color, balance: "", assetList: assets, realFiatBalance: totalAccountBalance)
account.updateBalance() account.updateBalance()
@ -115,8 +131,8 @@ proc getTotalFiatBalance*(self: WalletModel): string =
var newBalance = 0.0 var newBalance = 0.0
fmt"{newBalance:.2f} {self.defaultCurrency}" fmt"{newBalance:.2f} {self.defaultCurrency}"
# TODO get a real address that we unlock with the password
proc generateNewAccount*(self: WalletModel, password: string, accountName: string, color: string) = proc generateNewAccount*(self: WalletModel, password: string, accountName: string, color: string) =
let accounts = status_accounts.generateAddresses(1) let accounts = status_accounts.generateAddresses(1)
var generatedAccount = accounts[0] var generatedAccount = accounts[0]
generatedAccount.name = accountName generatedAccount.name = accountName
@ -129,10 +145,20 @@ proc generateNewAccount*(self: WalletModel, password: string, accountName: strin
var symbol = "SNT" var symbol = "SNT"
var asset = Asset(name:"Status", symbol: symbol, value: fmt"0.0", fiatValue: "$" & fmt"0.0", image: fmt"../../img/token-icons/{toLowerAscii(symbol)}.svg") var asset = Asset(name:"Status", symbol: symbol, value: fmt"0.0", fiatValue: "$" & fmt"0.0", image: fmt"../../img/token-icons/{toLowerAscii(symbol)}.svg")
var assets: seq[Asset] = @[]
assets.add(asset)
var assets: seq[Asset] = self.generateAccountConfiguredAssets()
var account = Account(name: accountName, address: generatedAccount.derived.defaultWallet.address, iconColor: color, balance: fmt"0.00 {self.defaultCurrency}", assetList: assets, realFiatBalance: 0.0) var account = Account(name: accountName, address: generatedAccount.derived.defaultWallet.address, iconColor: color, balance: fmt"0.00 {self.defaultCurrency}", assetList: assets, realFiatBalance: 0.0)
self.accounts.add(account) self.accounts.add(account)
self.events.emit("newAccountAdded", AccountArgs(account: account)) self.events.emit("newAccountAdded", AccountArgs(account: account))
proc toggleAsset*(self: WalletModel, symbol: string, enable: bool, address: string, name: string, decimals: int, color: string) =
if enable:
discard status_tokens.addCustomToken(address, name, symbol, decimals, color)
else:
discard status_tokens.removeCustomToken(address)
self.tokens = status_tokens.getCustomTokens()
for account in self.accounts:
var assets: seq[Asset] = self.generateAccountConfiguredAssets()
account.assetList = assets
self.events.emit("assetChanged", Args())

View File

@ -79,14 +79,14 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 10 anchors.leftMargin: 10
width: parent.width width: parent.width
height: 40
property bool isVisible: searchBox.searchStr == "" || name.toLowerCase().includes(searchBox.searchStr.toLowerCase()) || symbol.toLowerCase().includes(searchBox.searchStr.toLowerCase()) property bool isVisible: searchBox.searchStr == "" || name.toLowerCase().includes(searchBox.searchStr.toLowerCase()) || symbol.toLowerCase().includes(searchBox.searchStr.toLowerCase())
visible: isVisible ? true : false visible: isVisible && symbol !== "" ? true : false
height: isVisible && symbol !== "" ? 40 : 0
Image { Image {
id: assetInfoImage id: assetInfoImage
width: 36 width: 36
height: 36 height: isVisible && symbol !== "" ? 36 : 0
source: hasIcon ? "../../../img/tokens/" + symbol + ".png" : "../../../img/tokens/0-native.png" source: hasIcon ? "../../../img/tokens/" + symbol + ".png" : "../../../img/tokens/0-native.png"
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 0 anchors.leftMargin: 0
@ -117,6 +117,7 @@ Item {
checked: walletModel.hasAsset("0x123", symbol) checked: walletModel.hasAsset("0x123", symbol)
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: 10 anchors.rightMargin: 10
onClicked: walletModel.toggleAsset(symbol, assetCheck.checked, address, name, decimals, "eeeeee")
} }
} }
} }

View File

@ -5,6 +5,11 @@ import Qt.labs.platform 1.1
ListModel { ListModel {
// due to weird bug in which the first checkbox doesn't check
ListElement {
symbol: ""
}
ListElement { ListElement {
symbol: "DAI" symbol: "DAI"
name: "Dai Stablecoin" name: "Dai Stablecoin"