feat: add watch only accounts to wallet
This commit is contained in:
parent
c3f9d57e5d
commit
7295fde809
|
@ -101,6 +101,9 @@ QtObject:
|
||||||
proc addAccountsFromPrivateKey*(self: WalletView, privateKey: string, password: string, accountName: string, color: string) {.slot.} =
|
proc addAccountsFromPrivateKey*(self: WalletView, privateKey: string, password: string, accountName: string, color: string) {.slot.} =
|
||||||
self.status.wallet.addAccountsFromPrivateKey(privateKey, password, accountName, color)
|
self.status.wallet.addAccountsFromPrivateKey(privateKey, password, accountName, color)
|
||||||
|
|
||||||
|
proc addWatchOnlyAccount*(self: WalletView, address: string, accountName: string, color: string) {.slot.} =
|
||||||
|
self.status.wallet.addWatchOnlyAccount(address, accountName, color)
|
||||||
|
|
||||||
proc getAccountList(self: WalletView): QVariant {.slot.} =
|
proc getAccountList(self: WalletView): QVariant {.slot.} =
|
||||||
return newQVariant(self.accounts)
|
return newQVariant(self.accounts)
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ import json
|
||||||
const GENERATED* = "generated"
|
const GENERATED* = "generated"
|
||||||
const SEED* = "seed"
|
const SEED* = "seed"
|
||||||
const KEY* = "key"
|
const KEY* = "key"
|
||||||
|
const WATCH* = "watch"
|
||||||
|
|
||||||
const PATH_WALLET_ROOT* = "m/44'/60'/0'/0"
|
const PATH_WALLET_ROOT* = "m/44'/60'/0'/0"
|
||||||
# EIP1581 Root Key, the extended key from which any whisper key/encryption key can be derived
|
# EIP1581 Root Key, the extended key from which any whisper key/encryption key can be derived
|
||||||
|
|
|
@ -22,7 +22,8 @@ proc getWalletAccounts*(): seq[WalletAccount] =
|
||||||
walletAccounts.add(WalletAccount(
|
walletAccounts.add(WalletAccount(
|
||||||
address: $account["address"].getStr,
|
address: $account["address"].getStr,
|
||||||
path: $account["path"].getStr,
|
path: $account["path"].getStr,
|
||||||
publicKey: $account["public-key"].getStr,
|
# Watch accoutns don't have a public key
|
||||||
|
publicKey: if (account.hasKey("public-key")): $account["public-key"].getStr else: "",
|
||||||
name: $account["name"].getStr,
|
name: $account["name"].getStr,
|
||||||
color: $account["color"].getStr,
|
color: $account["color"].getStr,
|
||||||
wallet: $account["wallet"].getStr == "true",
|
wallet: $account["wallet"].getStr == "true",
|
||||||
|
@ -30,7 +31,8 @@ proc getWalletAccounts*(): seq[WalletAccount] =
|
||||||
))
|
))
|
||||||
result = walletAccounts
|
result = walletAccounts
|
||||||
except:
|
except:
|
||||||
error "Failed getting wallet accounts"
|
let msg = getCurrentExceptionMsg()
|
||||||
|
error "Failed getting wallet accounts", msg
|
||||||
|
|
||||||
|
|
||||||
proc sendTransaction*(from_address: string, to: string, value: string, password: string): string =
|
proc sendTransaction*(from_address: string, to: string, value: string, password: string): string =
|
||||||
|
|
|
@ -143,6 +143,7 @@ proc addNewGeneratedAccount(self: WalletModel, generatedAccount: GeneratedAccoun
|
||||||
error "Error storing the new account. Bad password?"
|
error "Error storing the new account. Bad password?"
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# TODO actually fetch the balance for accounts that are not generated
|
||||||
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")
|
||||||
|
|
||||||
|
@ -164,7 +165,11 @@ proc addAccountsFromSeed*(self: WalletModel, seed: string, password: string, acc
|
||||||
|
|
||||||
proc addAccountsFromPrivateKey*(self: WalletModel, privateKey: string, password: string, accountName: string, color: string) =
|
proc addAccountsFromPrivateKey*(self: WalletModel, privateKey: string, password: string, accountName: string, color: string) =
|
||||||
let generatedAccount = status_accounts.MultiAccountImportPrivateKey(privateKey)
|
let generatedAccount = status_accounts.MultiAccountImportPrivateKey(privateKey)
|
||||||
self.addNewGeneratedAccount(generatedAccount, password, accountName, color, constants.SEED, false)
|
self.addNewGeneratedAccount(generatedAccount, password, accountName, color, constants.KEY, false)
|
||||||
|
|
||||||
|
proc addWatchOnlyAccount*(self: WalletModel, address: string, accountName: string, color: string) =
|
||||||
|
let account = GeneratedAccount(address: address)
|
||||||
|
self.addNewGeneratedAccount(account, "", accountName, color, constants.WATCH, false)
|
||||||
|
|
||||||
proc toggleAsset*(self: WalletModel, symbol: string, enable: bool, address: string, name: string, decimals: int, color: string) =
|
proc toggleAsset*(self: WalletModel, symbol: string, enable: bool, address: string, name: string, decimals: int, color: string) =
|
||||||
if enable:
|
if enable:
|
||||||
|
|
|
@ -86,6 +86,9 @@ Rectangle {
|
||||||
AddAccountWithPrivateKey {
|
AddAccountWithPrivateKey {
|
||||||
id: addAccountWithPrivateKeydModal
|
id: addAccountWithPrivateKeydModal
|
||||||
}
|
}
|
||||||
|
AddWatchOnlyAccount {
|
||||||
|
id: addWatchOnlyAccountModal
|
||||||
|
}
|
||||||
|
|
||||||
PopupMenu {
|
PopupMenu {
|
||||||
id: newAccountMenu
|
id: newAccountMenu
|
||||||
|
@ -101,7 +104,7 @@ Rectangle {
|
||||||
text: qsTr("Add a watch-only address")
|
text: qsTr("Add a watch-only address")
|
||||||
icon.source: "../../../img/add_watch_only.svg"
|
icon.source: "../../../img/add_watch_only.svg"
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
console.log("TODO: Add a watch-only address")
|
addWatchOnlyAccountModal.open()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
QQC2.Action {
|
QQC2.Action {
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
import QtQuick 2.12
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
import "../../../../imports"
|
||||||
|
import "../../../../shared"
|
||||||
|
|
||||||
|
ModalPopup {
|
||||||
|
id: popup
|
||||||
|
title: qsTr("Add a watch-only account")
|
||||||
|
|
||||||
|
property int marginBetweenInputs: 38
|
||||||
|
property string selectedColor: Constants.accountColors[0]
|
||||||
|
|
||||||
|
onOpened: {
|
||||||
|
addressInput.text = "";
|
||||||
|
addressInput.forceActiveFocus(Qt.MouseFocusReason)
|
||||||
|
}
|
||||||
|
|
||||||
|
Input {
|
||||||
|
id: addressInput
|
||||||
|
// TODO add QR code reader for the address
|
||||||
|
placeholderText: qsTr("Enter address...")
|
||||||
|
label: qsTr("Account address")
|
||||||
|
}
|
||||||
|
|
||||||
|
Input {
|
||||||
|
id: accountNameInput
|
||||||
|
anchors.top: addressInput.bottom
|
||||||
|
anchors.topMargin: marginBetweenInputs
|
||||||
|
placeholderText: qsTr("Enter an account name...")
|
||||||
|
label: qsTr("Account name")
|
||||||
|
}
|
||||||
|
|
||||||
|
Input {
|
||||||
|
id: accountColorInput
|
||||||
|
anchors.top: accountNameInput.bottom
|
||||||
|
anchors.topMargin: marginBetweenInputs
|
||||||
|
bgColor: selectedColor
|
||||||
|
label: qsTr("Account color")
|
||||||
|
selectOptions: Constants.accountColors.map(color => {
|
||||||
|
return {
|
||||||
|
text: "",
|
||||||
|
bgColor: color,
|
||||||
|
height: 52,
|
||||||
|
onClicked: function () {
|
||||||
|
selectedColor = color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
footer: StyledButton {
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: Theme.padding
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: Theme.padding
|
||||||
|
label: "Add account >"
|
||||||
|
|
||||||
|
disabled: addressInput.text === "" || accountNameInput.text === ""
|
||||||
|
|
||||||
|
onClicked : {
|
||||||
|
// TODO add message to show validation errors
|
||||||
|
if (addressInput.text === "" || accountNameInput.text === "") return;
|
||||||
|
walletModel.addWatchOnlyAccount(addressInput.text, accountNameInput.text, selectedColor);
|
||||||
|
// TODO manage errors adding account
|
||||||
|
popup.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*##^##
|
||||||
|
Designer {
|
||||||
|
D{i:0;formeditorColor:"#ffffff";height:500;width:400}
|
||||||
|
}
|
||||||
|
##^##*/
|
|
@ -5,3 +5,4 @@ AddAccount 1.0 AddAccount.qml
|
||||||
GenerateAccountModal 1.0 GenerateAccountModal.qml
|
GenerateAccountModal 1.0 GenerateAccountModal.qml
|
||||||
AddAccountWithSeed 1.0 AddAccountWithSeed.qml
|
AddAccountWithSeed 1.0 AddAccountWithSeed.qml
|
||||||
AddAccountWithPrivateKey 1.0 AddAccountWithPrivateKey.qml
|
AddAccountWithPrivateKey 1.0 AddAccountWithPrivateKey.qml
|
||||||
|
AddWatchOnlyAccount 1.0 AddWatchOnlyAccount.qml
|
||||||
|
|
|
@ -82,6 +82,8 @@ DISTFILES += \
|
||||||
app/AppLayouts/Wallet/Components/AddAccount.qml \
|
app/AppLayouts/Wallet/Components/AddAccount.qml \
|
||||||
app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml \
|
app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml \
|
||||||
app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml \
|
app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml \
|
||||||
|
app/AppLayouts/Wallet/Components/AddWatchOnlyAccount \
|
||||||
|
app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml \
|
||||||
app/AppLayouts/Wallet/Components/GenerateAccountModal.qml \
|
app/AppLayouts/Wallet/Components/GenerateAccountModal.qml \
|
||||||
app/AppLayouts/Wallet/Components/SendModalContent.qml \
|
app/AppLayouts/Wallet/Components/SendModalContent.qml \
|
||||||
app/AppLayouts/Wallet/Components/SetCurrencyModalContent.qml \
|
app/AppLayouts/Wallet/Components/SetCurrencyModalContent.qml \
|
||||||
|
|
Loading…
Reference in New Issue