// SPDX-License-Identifier: BSD-3-Clause // SPDX-FileCopyrightText: 2020-2023 The Monero Project #include "utils/Utils.h" #include "WalletWizard.h" #include "PageMenu.h" #include "PageOpenWallet.h" #include "PageWalletFile.h" #include "PageNetwork.h" #include "PageWalletSeed.h" #include "PageWalletRestoreSeed.h" #include "PageWalletRestoreKeys.h" #include "PageSetPassword.h" #include "PageSetRestoreHeight.h" #include "PageSetSeedPassphrase.h" #include "PageSetSubaddressLookahead.h" #include "PageHardwareDevice.h" #include "PageNetworkProxy.h" #include "PageNetworkWebsocket.h" #include "constants.h" #include #include #include WalletWizard::WalletWizard(QWidget *parent) : QWizard(parent) { this->setWindowTitle("Welcome to Feather Wallet"); this->setWindowIcon(QIcon(":/assets/images/appicons/64x64.png")); m_walletKeysFilesModel = new WalletKeysFilesModel(this); m_walletKeysFilesModel->refresh(); auto networkPage = new PageNetwork(this); auto networkProxyPage = new PageNetworkProxy(this); auto networkWebsocketPage = new PageNetworkWebsocket(this); auto menuPage = new PageMenu(&m_wizardFields, m_walletKeysFilesModel, this); auto openWalletPage = new PageOpenWallet(m_walletKeysFilesModel, this); auto createWallet = new PageWalletFile(&m_wizardFields , this); auto createWalletSeed = new PageWalletSeed(&m_wizardFields, this); auto walletSetPasswordPage = new PageSetPassword(&m_wizardFields, this); auto walletSetSeedPassphrasePage = new PageSetSeedPassphrase(&m_wizardFields, this); auto walletSetSubaddressLookaheadPage = new PageSetSubaddressLookahead(&m_wizardFields, this); setPage(Page_Menu, menuPage); setPage(Page_WalletFile, createWallet); setPage(Page_OpenWallet, openWalletPage); setPage(Page_CreateWalletSeed, createWalletSeed); setPage(Page_SetPasswordPage, walletSetPasswordPage); setPage(Page_Network, networkPage); setPage(Page_NetworkProxy, networkProxyPage); setPage(Page_NetworkWebsocket, networkWebsocketPage); setPage(Page_WalletRestoreSeed, new PageWalletRestoreSeed(&m_wizardFields, this)); setPage(Page_WalletRestoreKeys, new PageWalletRestoreKeys(&m_wizardFields, this)); setPage(Page_SetRestoreHeight, new PageSetRestoreHeight(&m_wizardFields, this)); setPage(Page_HardwareDevice, new PageHardwareDevice(&m_wizardFields, this)); setPage(Page_SetSeedPassphrase, walletSetSeedPassphrasePage); setPage(Page_SetSubaddressLookahead, walletSetSubaddressLookaheadPage); setStartId(Page_Menu); setButtonText(QWizard::CancelButton, "Close"); setPixmap(QWizard::WatermarkPixmap, QPixmap(":/assets/images/banners/3.png")); setWizardStyle(WizardStyle::ModernStyle); setOption(QWizard::NoBackButtonOnStartPage); connect(networkWebsocketPage, &PageNetworkWebsocket::initialNetworkConfigured, [this](){ emit initialNetworkConfigured(); }); connect(menuPage, &PageMenu::showSettings, this, &WalletWizard::showSettings); connect(walletSetPasswordPage, &PageSetPassword::createWallet, this, &WalletWizard::onCreateWallet); connect(createWallet, &PageWalletFile::defaultWalletDirChanged, [this](const QString &walletDir){ emit defaultWalletDirChanged(walletDir); }); connect(openWalletPage, &PageOpenWallet::openWallet, [=](const QString &path){ emit openWallet(path, ""); }); } void WalletWizard::resetFields() { m_wizardFields = {}; } void WalletWizard::onCreateWallet() { auto walletPath = QString("%1/%2").arg(m_wizardFields.walletDir, m_wizardFields.walletName); int currentBlockHeight = 0; if (appData()->heights.contains(constants::networkType)) { currentBlockHeight = appData()->heights[constants::networkType]; } if (m_wizardFields.mode == WizardMode::CreateWalletFromDevice) { int restoreHeight = currentBlockHeight; if (m_wizardFields.restoreHeight > 0) { restoreHeight = m_wizardFields.restoreHeight; } QString deviceName; switch (m_wizardFields.deviceType) { case DeviceType::LEDGER: deviceName = "Ledger"; break; case DeviceType::TREZOR: deviceName = "Trezor"; } emit createWalletFromDevice(walletPath, m_wizardFields.password, deviceName, restoreHeight, m_wizardFields.subaddressLookahead); return; } if (m_wizardFields.mode == WizardMode::RestoreFromKeys) { emit createWalletFromKeys(walletPath, m_wizardFields.password, m_wizardFields.address, m_wizardFields.secretViewKey, m_wizardFields.secretSpendKey, m_wizardFields.restoreHeight, m_wizardFields.subaddressLookahead); return; } // If we're connected to the websocket, use the reported height for new wallets to skip initial synchronization. if (m_wizardFields.mode == WizardMode::CreateWallet && currentBlockHeight > 0) { qInfo() << "New wallet, setting restore height to latest blockheight: " << currentBlockHeight; m_wizardFields.seed.restoreHeight = currentBlockHeight; } if (m_wizardFields.mode == WizardMode::RestoreFromSeed && (m_wizardFields.seedType == Seed::Type::MONERO || m_wizardFields.showSetRestoreHeightPage)) { m_wizardFields.seed.setRestoreHeight(m_wizardFields.restoreHeight); } emit createWallet(m_wizardFields.seed, walletPath, m_wizardFields.password, m_wizardFields.seedLanguage, m_wizardFields.seedOffsetPassphrase, m_wizardFields.subaddressLookahead); }